fix(sql): cover MySQL dynamic SQL variables

This commit is contained in:
t8y2
2026-07-08 00:21:27 +08:00
parent 016821122c
commit b3f09219ab
@@ -147,6 +147,23 @@ describe("extractSqlParameters", () => {
expect(extractSqlParameters(sql)).toEqual([]);
});
it("ignores MySQL dynamic SQL variables used by prepared statements", () => {
const sql = `
SET @sql = IF(
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'oem_user_group'
AND COLUMN_NAME = 'group') = 0,
'ALTER TABLE \`oem_user_group\` ADD COLUMN \`group\` varchar(64) DEFAULT NULL COMMENT ''users.group'' AFTER \`oem_id\`',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
`;
expect(extractSqlParameters(sql)).toEqual([]);
});
it("stops SQL Server declaration scanning when a new statement starts without a semicolon", () => {
const sql = `
declare @id int = 1
@@ -223,6 +240,21 @@ describe("substituteSqlParameters", () => {
expect(substituteSqlParameters(sql, {})).toBe(sql);
});
it("preserves MySQL dynamic SQL variables used by prepared statements", () => {
const sql = `SET @sql = IF(
(SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'oem_user_group'
AND COLUMN_NAME = 'group') = 0,
'ALTER TABLE \`oem_user_group\` ADD COLUMN \`group\` varchar(64) DEFAULT NULL COMMENT ''users.group'' AFTER \`oem_id\`',
'SELECT 1'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;`;
expect(substituteSqlParameters(sql, {})).toBe(sql);
});
it("leaves named stored procedure arguments untouched while replacing their template values", () => {
const sql = "exec dbo.search_orders @date_start = '2026-07-04', @status = @status_value, @tenant_id = @tenant_id";
expect(