Skip to content

Conversation

@smzgl
Copy link

@smzgl smzgl commented Dec 26, 2025

当不同数据库存在相同表名和相同字段名, 并且该字段存在约束时, 例如字段类型是JSON, 会出现字段叠加. 导致访问数据库时, 出现数组越界.

smzgl and others added 2 commits August 28, 2025 03:22
当不同数据库存在相同表名和相同字段名,  并且该字段存在约束时, 例如字段类型是JSON,  会出现字段叠加. 导致访问数据库时, 出现数组越界.
@hailaz
Copy link
Contributor

hailaz commented Dec 27, 2025

希望能举个具体的例子,方便写个单元测试验证

@smzgl
Copy link
Author

smzgl commented Dec 27, 2025

希望能举个具体的例子,方便写个单元测试验证

同一个mysql 或者 mariadb 实例中, 先后创建数据库 db_a和db_b, 在db_a和db_b创建同名表 t, db_a.t 有8个字段, db_b.t有10个字段. 最后一个字段的字段名同名. 并且该字段存在约束(比如是一个JSON类型字段), 当使用从db_a.t 或者db_b.t 读取数据的时候可能会触发越界的panic. <大概是这个case, 时间有点久了>

具体原因:

  1. TableFields 是使用 tableFieldsSqlByMariadb变量的sql, 获取字段列表的. 该SQL从 information_schema 读取表结构的时候, 并没有根据schema的名称进行过滤, 导致读取到所有schema同名表的字段.
  2. 返回值result类型是map, key为字段名. 在遍历步骤1返回结果的时候, 后面的同名字段会覆盖前一个的. 该字段信息包括了一个重要字段Index. 也就是字段在表中的次序.
  3. 当进行Scan的时候, 会直接使用Index作为字段列索引进行访问. 当两个表结构不同, 字段数量不一样的时候, 会发生数组越界异常.

我看现在版本mariadb_table_fields.go 也会有此问题, 也应该按照该方法修正

@hailaz
Copy link
Contributor

hailaz commented Dec 27, 2025

希望能举个具体的例子,方便写个单元测试验证

同一个mysql 或者 mariadb 实例中, 先后创建数据库 db_a和db_b, 在db_a和db_b创建同名表 t, db_a.t 有8个字段, db_b.t有10个字段. 最后一个字段的字段名同名. 并且该字段存在约束(比如是一个JSON类型字段), 当使用从db_a.t 或者db_b.t 读取数据的时候可能会触发越界的panic. <大概是这个case, 时间有点久了>

具体原因:

  1. TableFields 是使用 tableFieldsSqlByMariadb变量的sql, 获取字段列表的. 该SQL从 information_schema 读取表结构的时候, 并没有根据schema的名称进行过滤, 导致读取到所有schema同名表的字段.
  2. 返回值result类型是map, key为字段名. 在遍历步骤1返回结果的时候, 后面的同名字段会覆盖前一个的. 该字段信息包括了一个重要字段Index. 也就是字段在表中的次序.
  3. 当进行Scan的时候, 会直接使用Index作为字段列索引进行访问. 当两个表结构不同, 字段数量不一样的时候, 会发生数组越界异常.

我看现在版本mariadb_table_fields.go 也会有此问题, 也应该按照该方法修正

好的,我后续加个单元测试验证后合并

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants