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() мы пытаемся привести правильное строковое значение результата к неправильно посчитанному типу колонки.