[Java] DictionaryEncoder doesn't crash when decoding index outside of Dictionary

Aberta Para iniciantes
#1,158 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
2/5
Tempo estimado
1-3 horas
Facilidade para iniciantes
74/100
Tipo de issue
Bug
Clareza
Claramente especificada
Status de atividade
Pouca atividade
Stack de tecnologia
java
Domínio
data

Direção de pesquisa

Comece em DictionaryEncoder.decode e reproduza o comportamento com o teste testReferencingIndexOutOfBounds fornecido. Confirme que um índice codificado igual à quantidade de valores do dicionário lança IllegalArgumentException com a mensagem esperada, enquanto os índices válidos continuam sendo decodificados normalmente.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Type: bug
Describe the bug, including details regarding any error messages, version, and platform.
Background

When manually creating an encoded vector, with values referencing indices in a Dictionary, it is possible to have values equal to valueCount of the Dictionary vector i.e. one index out of bounds. This is interpreted as a null value in the Dictionary.


Example

Dictionary

Index Original Value
0 Foo

Encoded Vector - 1

Index Encoded Value Expected Decode Outcome Actual Outcome
0 0 Return the original value Returns the original value

Encoded Vector - 2

Index Encoded Value Expected Decode Outcome Actual Outcome
0 1 Raise IllegalArgumentException Returns null

Encoded Vector - 3

Index Encoded Value Expected Decode Outcome Actual Outcome
0 2 Raise IllegalArgumentException Raises IllegalArgumentException

Test to reproduce the error
    @Test
    public void testReferencingIndexOutOfBounds() {
        // Index at which the original value will be stored at in the dictionary
        var encodedIndex = 0;
        // The encoded value that references an index in the dictionary
        var indexReferenced = 1;

        try (final IntVector encodedVector = new IntVector("encodings", allocator);
             final VarCharVector dictionaryVector = newVarCharVector("dict", allocator); ) {
            var originalValue = "Foo";
            dictionaryVector.allocateNew(1);
            dictionaryVector.setValueCount(1);
            dictionaryVector.set(encodedIndex, originalValue.getBytes(StandardCharsets.UTF_8));

            encodedVector.allocateNew(1);
            encodedVector.setValueCount(1);
            encodedVector.set(0, indexReferenced);

            Dictionary dictionary =
                    new Dictionary(dictionaryVector, new DictionaryEncoding(1L, false, null));

            try (ValueVector decoded = DictionaryEncoder.decode(encodedVector, dictionary)) {
                fail("There should be an exception when decoding index outside dictionary's range.");
            } catch (Exception e) {
                assertEquals("Provided dictionary does not contain value for index " + indexReferenced, e.getMessage());
            }
        }
    }

Linguagem predominante
Java
Estrelas
95
Forks
154
Merge médio
2d 16h
PRs com merge (30d)
9

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de apache/arrow-java

Todas as issues de apache/arrow-java

Issues semelhantes

Mais issues de Java

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.