databendlabs/databend · error

binary literal is not supported

Error message

binary literal is not supported

What it means

The JSON/AST field decoder converts raw field values (from formats like NDJSON) into Databend columns. It has no implementation for decoding values into Binary columns, so it raises unimplemented!("binary literal is not supported"). Loading binary-typed columns from JSON-based sources is simply not supported.

Solutions

  1. Change the target column from BINARY to VARCHAR (store base64/hex text) for JSON ingestion
  2. Encode binary payloads as base64 in JSON and decode into a VARCHAR column, converting later with from_base64
  3. Use a binary-capable file format (Parquet/Avro) instead of NDJSON for BINARY columns
  4. Implement a Binary arm in the field decoder if you maintain the code

Example fix

// before
{"id": 1, "payload": "\u0001\u0002"}  -- loaded into BINARY column
// after
{"id": 1, "payload": "AQI="}          -- base64 into VARCHAR column
-- then: SELECT from_base64(payload) FROM t;
Defensive patterns

Strategy: validation

Validate before calling

-- sql: ensure no BINARY columns in JSON ingest targets
SELECT name FROM information_schema.columns
WHERE table_name = 't' AND data_type ILIKE 'BINARY%';
-- must return empty before COPY ... FROM NDJSON

Type guard

def json_safe_schema(columns):
    bad = [c for c in columns if 'BINARY' in c.type.upper()]
    if bad:
        raise ValueError(f'BINARY columns unsupported in JSON ingest: {bad}')

Prevention

When it happens

Trigger: COPY ... FROM NDJSON (or another AST-decoded JSON format) into a table with a BINARY/Binary-typed column, or reading a Binary column through read_field_with_data_type.

Common situations: Pipelines targeting BINARY columns from JSON feeds; schema drift where a column became BINARY after the pipeline was built; ORC/Avro binary data routed through the JSON decoder.

Related errors


AI-assisted analysis of databendlabs/databend@288d84d76e (2026-09-11). Data as JSON: /api/errors/4af710acffecbae3. Report an issue: GitHub.

Appendix: source

Thrown at src/query/formats/src/field_decoder/json_ast.rs:109

            ColumnBuilder::Boolean(c) => self.read_bool(c, value),
            ColumnBuilder::Number(c) => with_number_mapped_type!(|NUM_TYPE| match c {
                NumberColumnBuilder::NUM_TYPE(c) => {
                    if NUM_TYPE::FLOATING {
                        self.read_float(c, value)
                    } else if NUM_TYPE::NEGATIVE {
                        self.read_int(c, value)
                    } else {
                        self.read_uint(c, value)
                    }
                }
            }),
            ColumnBuilder::Decimal(c) => with_decimal_type!(|DECIMAL_TYPE| match c {
                DecimalColumnBuilder::DECIMAL_TYPE(c, size) => self.read_decimal(c, *size, value),
            }),
            ColumnBuilder::Date(c) => self.read_date(c, value),
            ColumnBuilder::Timestamp(c) => self.read_timestamp(c, value),
            ColumnBuilder::TimestampTz(c) => self.read_timestamp_tz(c, value),
            ColumnBuilder::Binary(_c) => unimplemented!("binary literal is not supported"),
            ColumnBuilder::String(c) => self.read_string(c, value),
            ColumnBuilder::Array(c) => self.read_array(c, value, array_inner(data_type)),
            ColumnBuilder::Map(c) => self.read_map(c, value, map_fields(data_type)),
            ColumnBuilder::Tuple(fields) => self.read_tuple(fields, value, tuple_fields(data_type)),
            ColumnBuilder::Bitmap(c) => self.read_bitmap(c, value),
            ColumnBuilder::Variant(c) => self.read_variant(c, value),
            ColumnBuilder::Geometry(c) => self.read_geometry(c, value),
            ColumnBuilder::Geography(c) => self.read_geography(c, value),
            ColumnBuilder::Interval(c) => self.read_interval(c, value),
            ColumnBuilder::Vector(c) => self.read_vector(c, value),
            ColumnBuilder::EmptyArray { len } => match value.as_array() {
                Some(array) if array.is_empty() => {
                    *len += 1;
                    Ok(())
                }
                _ => Err(ErrorCode::BadBytes("Incorrect empty array value")),
            },
            ColumnBuilder::EmptyMap { len } => match value.as_object() {

View on GitHub (pinned to 288d84d76e)