risingwavelabs/risingwave · error · SinkError::Remote

Remote sink only supports list<int16, int32, int64, float…

Error message

Remote sink only supports list<int16, int32, int64, float, double, varchar>, got {:?}: {:?}

What it means

Remote sinks restrict `List` columns: only Elasticsearch remote sinks accept any list, while other remote sinks accept lists whose element type is int16, int32, int64, float32, float64, or varchar. A list of any other element type (struct, timestamp, boolean, nested list, etc.) fails validation with this error naming the offending column and type.

Solutions

  1. Flatten or drop the unsupported list column in the sink query (e.g. cast elements or serialize to varchar JSON).
  2. Cast list elements to a supported type (int16/int32/int64/float32/float64/varchar).
  3. Use the Elasticsearch remote sink path if lists of arbitrary types must be passed through, or a different sink connector with native struct/array support.

Example fix

// before
CREATE SINK s FROM (SELECT tags, * FROM t) WITH (connector='remote', ...)  -- tags: list<struct>
// after
CREATE SINK s FROM (SELECT tags::varchar AS tags_json, * FROM t) WITH (connector='remote', ...)
Defensive patterns

Strategy: type-guard

Validate before calling

const ELEM_OK = ['int16','int32','int64','float32','float64','varchar'];
for (const c of columns) if (c.type.startsWith('list<') && !ELEM_OK.some(t => c.type.includes(t))) throw new Error(`unsupported list column: ${c.name}`);

Type guard

const hasSupportedListElems = (c) => !c.type.startsWith('list<') || /list<\s*(int16|int32|int64|float32|float64|varchar)/.test(c.type);

Try / catch

try { await createSink(cfg); } catch (e) { if (/only supports list</.test(String(e))) { dropOrCastColumn(cfg, parseColumnFromError(e)); await createSink(cfg); } else throw e; }

Prevention

When it happens

Trigger: Create a remote (non-ES) sink whose schema includes `list<struct>`, `list<timestamp>`, `list<boolean>`, `list<date>`, or `list<list<int>>` columns.

Common situations: Users sink nested/complex data (arrays of structs from JSON sources) to remote sinks; schema evolution introduces a timestamp array; the FIXME comment shows struct/array support in stream sink is still unimplemented.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/5f82f2568f286e90. Report an issue: GitHub.

Appendix: source

Thrown at src/connector/src/sink/remote.rs:216

                    | DataType::Int32
                    | DataType::Int64
                    | DataType::Float32
                    | DataType::Float64
                    | DataType::Boolean
                    | DataType::Decimal
                    | DataType::Timestamp
                    | DataType::Timestamptz
                    | DataType::Varchar
                    | DataType::Date
                    | DataType::Time
                    | DataType::Interval
                    | DataType::Jsonb
                    | DataType::Bytea => Ok(()),
            DataType::List(list) => {
                if is_remote_es_sink(sink_name) || matches!(list.elem(), DataType::Int16 | DataType::Int32 | DataType::Int64 | DataType::Float32 | DataType::Float64 | DataType::Varchar){
                    Ok(())
                } else{
                    Err(SinkError::Remote(anyhow!(
                        "Remote sink only supports list<int16, int32, int64, float, double, varchar>, got {:?}: {:?}",
                        col.name,
                        col.data_type,
                    )))
                }
            },
            DataType::Struct(_) => {
                if is_remote_es_sink(sink_name){
                    Ok(())
                }else{
                    Err(SinkError::Remote(anyhow!(
                        "Only Es sink supports struct, got {:?}: {:?}",
                        col.name,
                        col.data_type,
                    )))
                }
            },
            DataType::Vector(_) |

View on GitHub (pinned to 6469eb736d)