Skip to content

Failed to derive correct type for VALUES with parameters

picodata> pico.sql([[create table t3 (a int primary key, b text);]])

picodata> pico.sql([[insert into t3 values (1, (values(?))), (2, 'hi')]], {box.NULL})
---
- null
- 'sbroad: invalid value: Failed to cast ''hi'' to integer.'
...

picodata> pico.sql([[explain insert into t3 values (1, ?), (2, ?)]], {box.NULL, 'hi'})
---
- - 'insert "t3" on conflict: fail'
  - '    motion [policy: segment([ref("COLUMN_3")])]'
  - '        values'
  - '            value row (data=ROW(1::unsigned, NULL::integer))'
  - '            value row (data=ROW(2::unsigned, ''hi''::string))'
  - 'execution options:'
  - '    vdbe_max_steps = 45000'
  - '    vtable_max_rows = 5000'
  - buckets = unknown
...

Проблема заключается в том, что мы не выводим корректный тип для values со сложными выражениями и параметризацией. Как следствие, в методе materialize_values() -> as_virtual_table() мы пытаемся привести правильное строковое значение результата к неправильно посчитанному типу колонки.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information