{"record":{"id":"06780ff1f5af1e81","repo":"risingwavelabs/risingwave","slug":"column-order-mismatch-at-position-lancedb-colu","errorCode":null,"errorMessage":"column order mismatch at position {}: LanceDB column is '{}', RisingWave column is '{}'","messagePattern":"column order mismatch at position (.+?): LanceDB column is '(.+?)', RisingWave column is '(.+?)'","errorType":"exception","errorClass":"SinkError::LanceDb","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/lancedb.rs","lineNumber":306,"sourceCode":"    rw_arrow_schema: &arrow_schema::Schema,\n    lance_schema: &arrow_schema::Schema,\n) -> Result<()> {\n    if rw_arrow_schema.fields().len() != lance_schema.fields().len() {\n        return Err(SinkError::LanceDb(anyhow!(\n            \"Columns mismatch. RisingWave schema has {} fields, LanceDB table has {} fields\",\n            rw_arrow_schema.fields().len(),\n            lance_schema.fields().len()\n        )));\n    }\n\n    for (idx, (rw_field, lance_field)) in rw_arrow_schema\n        .fields()\n        .iter()\n        .zip_eq_fast(lance_schema.fields().iter())\n        .enumerate()\n    {\n        if rw_field.name() != lance_field.name() {\n            return Err(SinkError::LanceDb(anyhow!(\n                \"column order mismatch at position {}: LanceDB column is '{}', RisingWave column is '{}'\",\n                idx,\n                lance_field.name(),\n                rw_field.name()\n            )));\n        }\n\n        if rw_field.data_type() != lance_field.data_type() {\n            return Err(SinkError::LanceDb(anyhow!(\n                \"column '{}' type mismatch: LanceDB type is {:?}, RisingWave type is {:?}\",\n                rw_field.name(),\n                lance_field.data_type(),\n                rw_field.data_type()\n            )));\n        }\n    }\n\n    Ok(())","sourceCodeStart":288,"sourceCodeEnd":324,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/lancedb.rs#L288-L324","documentation":"After confirming equal field counts, validate_ordered_schema compares columns position-by-position and requires identical names in identical order. Any position where the LanceDB column name differs from the RisingWave column name fails validation, including pure reorderings (same set of names, wrong order).","triggerScenarios":"Sink query column order differs from the existing LanceDB table's column order, e.g., RW expects (a, b) but the table stores (b, a).","commonSituations":"Rewriting the sink query with columns in a different order; schema evolution where a column was inserted in the middle on one side; reusing a table created by another tool.","solutions":["Reorder the sink query's SELECT list to match the LanceDB table's column order exactly","Recreate the LanceDB table with columns in the RisingWave order","Point the sink at a new table so RW creates it with its own ordering"],"exampleFix":"// before\nCREATE SINK s AS SELECT b, a FROM t WITH (...); -- table is (a, b)\n// after\nCREATE SINK s AS SELECT a, b FROM t WITH (...);","handlingStrategy":"validation","validationCode":"async function checkColumnOrder(tableName, rwColumns) {\n  const schema = await (await conn.openTable(tableName)).schema();\n  schema.fields.forEach((f, i) => {\n    if (f.name !== rwColumns[i]) throw new Error(`position ${i}: table=${f.name} sink=${rwColumns[i]}`);\n  });\n}","typeGuard":null,"tryCatchPattern":"catch (SinkError::LanceDb(e)) if e.includes(\"column order mismatch\") { reorder the sink SELECT list to match the table }","preventionTips":["Write the sink SELECT in the same order the table was created","Compare schemas side-by-side after any change on either side","Prefer letting RisingWave create the table itself"],"tags":["rust","arrow","schema","column-order"],"backgroundTag":"schema-validation-failed","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}