apache/seatunnel · error · QdrantConnectorException

COMMON-07

COMMON-07

Error message

Unexpected value: <sqlType>

What it means

QdrantSourceReader.convertToSeaTunnelRow maps each retrieved Qdrant point field into the SeaTunnel row schema. The switch over SqlType handles the supported types (including VECTOR -> float buffer); any other SQL type in the declared schema hits the default branch and throws QdrantConnectorException with CommonErrorCode.UNSUPPORTED_DATA_TYPE and message 'Unexpected value: <sqlType>'.

Solutions

  1. Restrict the declared schema columns to types supported by the Qdrant reader (numeric, string, boolean, vector types)
  2. Remove or remap unsupported columns (e.g. cast DATE to STRING, flatten MAP) before conversion
  3. Update the connector's convertToSeaTunnelRow to handle the needed SqlType if it is a legitimate requirement
  4. Compare the schema in the config against what buildPayload/the sink wrote to ensure round-trip type compatibility

Example fix

// before
// schema column: create_time : DATE  -> throws 'Unexpected value: DATE'
// after
// schema column: create_time : STRING  (store ISO-8601 string, convert downstream)
Defensive patterns

Strategy: validation

Validate before calling

// verify every declared schema column is a type the Qdrant reader supports
Set<SqlType> supported = Set.of(SqlType.INT, SqlType.BIGINT, SqlType.DOUBLE,
        SqlType.FLOAT, SqlType.STRING, SqlType.BOOLEAN);
for (SeaTunnelDataType<?> t : schema.getDataType().getFieldTypes()) {
    if (!supported.contains(t.getSqlType())) {
        throw new IllegalArgumentException(
            "Unsupported schema type for Qdrant source: " + t.getSqlType());
    }
}

Type guard

boolean isReaderSupportedType(SeaTunnelDataType<?> t) {
    switch (t.getSqlType()) {
        case INT: case BIGINT: case DOUBLE: case FLOAT:
        case STRING: case BOOLEAN:
            return true;
        default:
            return false;
    }
}

Try / catch

try {
    row = reader.seaTunnelRow(point);
} catch (QdrantConnectorException e) {
    if (e.getErrorCode() == CommonErrorCode.UNSUPPORTED_DATA_TYPE
            && e.getMessage().startsWith("Unexpected value:")) {
        LOG.error("schema column type not convertible by Qdrant reader: {}", e.getMessage());
    }
    throw e;
}

Prevention

When it happens

Trigger: The declared SeaTunnel schema for the Qdrant source contains a column whose SqlType is not handled by the switch in convertToSeaTunnelRow (e.g. MAP, ARRAY, DATE), hit while converting each fetched point.

Common situations: Schema defined in the source config includes types Qdrant reader does not support converting (complex or temporal types); payload fields stored in Qdrant with JSON types that cannot map to the declared schema; copy-pasted schema from another connector with richer type support.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/3b54d590c0eda432. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-qdrant/src/main/java/org/apache/seatunnel/connectors/seatunnel/qdrant/source/QdrantSourceReader.java:170

                case BIGINT:
                    fields[fieldIndex] = value.getIntegerValue();
                    break;
                case FLOAT:
                case DECIMAL:
                case DOUBLE:
                    fields[fieldIndex] = value.getDoubleValue();
                    break;
                case BINARY_VECTOR:
                case FLOAT_VECTOR:
                case FLOAT16_VECTOR:
                case BFLOAT16_VECTOR:
                    List<Float> list = vector.getDataList();
                    Float[] vectorArray = new Float[list.size()];
                    list.toArray(vectorArray);
                    fields[fieldIndex] = VectorUtils.toByteBuffer(vectorArray);
                    break;
                default:
                    throw new QdrantConnectorException(
                            CommonErrorCode.UNSUPPORTED_DATA_TYPE,
                            "Unexpected value: " + seaTunnelDataType.getSqlType().name());
            }
        }

        SeaTunnelRow seaTunnelRow = new SeaTunnelRow(fields);
        seaTunnelRow.setTableId(tablePath.getFullName());
        seaTunnelRow.setRowKind(RowKind.INSERT);
        return seaTunnelRow;
    }
}

View on GitHub (pinned to cf67b549a7)