prestodb/presto · error · PrestoException

NOT_SUPPORTED

NOT_SUPPORTED

Error message

arrays are not (yet?) supported for StringRowSerializer

What it means

StringRowSerializer.getArray is an explicitly unimplemented operation: arrays cannot be represented in this serializer's plain-string value format, so it unconditionally throws NOT_SUPPORTED. Any read path that retrieves an array-typed column from a StringRowSerializer-backed table fails immediately.

Source

Thrown at presto-accumulo/src/main/java/com/facebook/presto/accumulo/serializers/StringRowSerializer.java:130

        if (family.equals(ROW_ID_COLUMN) && qualifier.equals(ROW_ID_COLUMN)) {
            return;
        }

        value.set(entry.getValue().get());
        columnValues.put(familyQualifierColumnMap.get(family.toString()).get(qualifier.toString()), value.toString());
    }

    @Override
    public boolean isNull(String name)
    {
        return columnValues.get(name) == null;
    }

    @Override
    public Block getArray(String name, Type type)
    {
        throw new PrestoException(NOT_SUPPORTED, "arrays are not (yet?) supported for StringRowSerializer");
    }

    @Override
    public void setArray(Text text, Type type, Block block)
    {
        throw new PrestoException(NOT_SUPPORTED, "arrays are not (yet?) supported for StringRowSerializer");
    }

    @Override
    public boolean getBoolean(String name)
    {
        return Boolean.parseBoolean(getFieldValue(name));
    }

    @Override
    public void setBoolean(Text text, Boolean value)
    {
        text.set(value.toString().getBytes(UTF_8));

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Re-create or re-serialize the table with LexicoderRowSerializer, which supports arrays
  2. Drop the ARRAY column from the table schema
  3. Avoid selecting array columns in queries against StringRowSerializer tables
  4. Fork and implement getArray by encoding elements into the string format

Example fix

// before
throw new PrestoException(NOT_SUPPORTED, "arrays are not (yet?) supported for StringRowSerializer");
// after
List<Object> elems = new ArrayList<>();
for (int i = 0; i < Types.getArraySize(type); i++) {
    elems.add(elementValue); // decoded from the string representation
}
return elementsBlock(elems);
Defensive patterns

Strategy: type-guard

Validate before calling

if (Types.isArrayType(columnType)) {
    throw new IllegalArgumentException("Column " + name + " is an ARRAY; StringRowSerializer cannot read it");
}
Block b = row.getArray(name, columnType);

Type guard

static boolean isStringRowReadable(Type t) {
    return !Types.isArrayType(t) && !Types.isMapType(t);
}

Try / catch

try {
    return row.getArray(name, type);
} catch (PrestoException e) {
    if (e.getErrorCode().getCode() == StandardErrorCode.NOT_SUPPORTED.toErrorCode().getCode()) {
        return null; // treat array column as absent for string serializer
    }
    throw e;
}

Prevention

When it happens

Trigger: Querying or iterating a Row whose schema contains an ARRAY column and calling getArray(name, type) — e.g. during record decode of array-typed columns in a table configured with StringRowSerializer.

Common situations: Table schema was extended with an array column after the table was configured to use StringRowSerializer; running connector smoke tests that exercise arrays against string-serialized tables (testArray caller).

Understand the failure class

Background: Presto NOT_SUPPORTED error: what "not supported" means and how to fix it — this error's family across 3 libraries.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/84908622ef5a9173. Report an issue: GitHub.