Description:
There is an assertion failure in debug builds when VECTOR parameters are unset in prepared statements.
```
sql/item.h:5149: void Item_param::set_collation_source(const CHARSET_INFO*): Assertion `is_string_type(m_data_type_source)' failed.
mysqld got signal 6 ;
...
#8 __assert_fail at ./assert/assert.c:37
#9 Item_param::set_collation_source(CHARSET_INFO const*) at sql/item.h:5149
#10 Item_param::set_collation_source(CHARSET_INFO const*) at sql/sql_prepare.cc:378
#11 set_parameter_type at sql/sql_prepare.cc:403
#12 Prepared_statement::insert_parameters_from_vars(THD*, List<MYSQL_LEX_STRING>&, String*) at sql/sql_prepare.cc:912
#13 Prepared_statement::set_parameters(THD*, String*) at sql/sql_prepare.cc:2838
#14 mysql_sql_stmt_execute(THD*) at sql/sql_prepare.cc:1955
...
```
In all builds, the binary charset is not validated for VECTOR parameters to prepared statements. Non-binary strings are typically rejected when stored in vector columns or passed to FROM_VECTOR and VECTOR_DIM. Prepared statement parameters skip this validation and allow non-binary strings to be used as VECTORs.
How to repeat:
Debug build assertion:
```
PREPARE stmt FROM 'SELECT VECTOR_DIM(?), FROM_VECTOR(?), VECTOR_TO_STRING(?)';
EXECUTE stmt USING @unset_v, @unset_v, @unset_v;
-- ^ crashes in debug builds only
```
Missing charset validation:
```
CREATE TABLE vec_tbl (id INT AUTO_INCREMENT PRIMARY KEY, v VECTOR(3));
INSERT INTO vec_tbl (v) VALUES (TO_VECTOR('[1,2,3]'));
SET @str12 = 'abcdefghijkl'; -- 12-byte utf8mb4 string (not binary)
SELECT CHARSET(@str12), LENGTH(@str12);
-- Direct (non-prepared) SQL properly rejects @str12 because charset is utf8mb4 (!= binary):
--error ER_DATA_INCOMPATIBLE_WITH_VECTOR
INSERT INTO vec_tbl (v) VALUES (@str12);
--error ER_WRONG_ARGUMENTS
SELECT VECTOR_TO_STRING(@str12);
--error ER_WRONG_ARGUMENTS
SELECT VECTOR_DIM(@str12);
-- Prepared statements fail to reject @str12:
PREPARE ins_stmt FROM 'INSERT INTO vec_tbl (v) VALUES (?)';
EXECUTE ins_stmt USING @str12;
-- ^ Succeeds instead of failing with ER_DATA_INCOMPATIBLE_WITH_VECTOR (6136),
SELECT id, VECTOR_TO_STRING(v) FROM vec_tbl;
DEALLOCATE PREPARE ins_stmt;
PREPARE sel_stmt FROM 'SELECT VECTOR_TO_STRING(?)';
EXECUTE sel_stmt USING @str12;
-- ^ Succeeds and returns [1.67780e+22,4.37102e+24,1.13840e+27] instead of ER_WRONG_ARGUMENTS
DEALLOCATE PREPARE sel_stmt;
PREPARE dim_stmt FROM 'SELECT VECTOR_DIM(?)';
EXECUTE dim_stmt USING @str12;
-- ^ Succeeds and returns 3 instead of ER_WRONG_ARGUMENTS
DEALLOCATE PREPARE dim_stmt;
```
Suggested fix:
https://github.com/mysql/mysql-server/pull/871
Description: There is an assertion failure in debug builds when VECTOR parameters are unset in prepared statements. ``` sql/item.h:5149: void Item_param::set_collation_source(const CHARSET_INFO*): Assertion `is_string_type(m_data_type_source)' failed. mysqld got signal 6 ; ... #8 __assert_fail at ./assert/assert.c:37 #9 Item_param::set_collation_source(CHARSET_INFO const*) at sql/item.h:5149 #10 Item_param::set_collation_source(CHARSET_INFO const*) at sql/sql_prepare.cc:378 #11 set_parameter_type at sql/sql_prepare.cc:403 #12 Prepared_statement::insert_parameters_from_vars(THD*, List<MYSQL_LEX_STRING>&, String*) at sql/sql_prepare.cc:912 #13 Prepared_statement::set_parameters(THD*, String*) at sql/sql_prepare.cc:2838 #14 mysql_sql_stmt_execute(THD*) at sql/sql_prepare.cc:1955 ... ``` In all builds, the binary charset is not validated for VECTOR parameters to prepared statements. Non-binary strings are typically rejected when stored in vector columns or passed to FROM_VECTOR and VECTOR_DIM. Prepared statement parameters skip this validation and allow non-binary strings to be used as VECTORs. How to repeat: Debug build assertion: ``` PREPARE stmt FROM 'SELECT VECTOR_DIM(?), FROM_VECTOR(?), VECTOR_TO_STRING(?)'; EXECUTE stmt USING @unset_v, @unset_v, @unset_v; -- ^ crashes in debug builds only ``` Missing charset validation: ``` CREATE TABLE vec_tbl (id INT AUTO_INCREMENT PRIMARY KEY, v VECTOR(3)); INSERT INTO vec_tbl (v) VALUES (TO_VECTOR('[1,2,3]')); SET @str12 = 'abcdefghijkl'; -- 12-byte utf8mb4 string (not binary) SELECT CHARSET(@str12), LENGTH(@str12); -- Direct (non-prepared) SQL properly rejects @str12 because charset is utf8mb4 (!= binary): --error ER_DATA_INCOMPATIBLE_WITH_VECTOR INSERT INTO vec_tbl (v) VALUES (@str12); --error ER_WRONG_ARGUMENTS SELECT VECTOR_TO_STRING(@str12); --error ER_WRONG_ARGUMENTS SELECT VECTOR_DIM(@str12); -- Prepared statements fail to reject @str12: PREPARE ins_stmt FROM 'INSERT INTO vec_tbl (v) VALUES (?)'; EXECUTE ins_stmt USING @str12; -- ^ Succeeds instead of failing with ER_DATA_INCOMPATIBLE_WITH_VECTOR (6136), SELECT id, VECTOR_TO_STRING(v) FROM vec_tbl; DEALLOCATE PREPARE ins_stmt; PREPARE sel_stmt FROM 'SELECT VECTOR_TO_STRING(?)'; EXECUTE sel_stmt USING @str12; -- ^ Succeeds and returns [1.67780e+22,4.37102e+24,1.13840e+27] instead of ER_WRONG_ARGUMENTS DEALLOCATE PREPARE sel_stmt; PREPARE dim_stmt FROM 'SELECT VECTOR_DIM(?)'; EXECUTE dim_stmt USING @str12; -- ^ Succeeds and returns 3 instead of ER_WRONG_ARGUMENTS DEALLOCATE PREPARE dim_stmt; ``` Suggested fix: https://github.com/mysql/mysql-server/pull/871