Bug #121618 Prepared statements with VECTOR parameters skip binary charset validation and fail debug assertion when unset
Submitted: 26 Oct 20:50
Reporter: Julia Offerman (OCA) Email Updates:
Status: Open Impact on me:
None 
Category:MySQL Server: Optimizer Severity:S3 (Non-critical)
Version:9.x OS:Any
Assigned to: CPU Architecture:Any
Tags: prepared statement, vector, VECTOR_TO_STRING

[26 Oct 20:50] Julia Offerman
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