Skip to content

Commit b6cb7d2

Browse files
Fix case sensitivity in trigger function arguments
- Set isStringLiteral context for trigger function arguments in CreateTrigStmt - Ensures string literals are properly quoted with single quotes via QuoteUtils.formatEString() - Prevents automatic lowercase conversion during parse/deparse cycle - Fixes triggers-9.sql test where 'TYPE_A' was being converted to 'type_a' - Updated snapshots to reflect correct string literal formatting Co-Authored-By: Dan Lynch <[email protected]>
1 parent e503a3e commit b6cb7d2

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

packages/deparser/__tests__/pretty/__snapshots__/triggers-pretty.test.ts.snap

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,18 @@ exports[`non-pretty: pretty/triggers-2.sql 1`] = `"CREATE TRIGGER "AuditTrigger"
66

77
exports[`non-pretty: pretty/triggers-3.sql 1`] = `"CREATE TRIGGER archive_if_inactive BEFORE UPDATE ON accounts FOR EACH ROW WHEN ( old.active = false ) EXECUTE FUNCTION "ArchiveFunction" ()"`;
88

9-
exports[`non-pretty: pretty/triggers-4.sql 1`] = `"CREATE TRIGGER update_stats_on_change AFTER INSERT OR UPDATE ON metrics.stats FOR EACH ROW EXECUTE FUNCTION metrics.update_stats ( "user", "true" )"`;
9+
exports[`non-pretty: pretty/triggers-4.sql 1`] = `"CREATE TRIGGER update_stats_on_change AFTER INSERT OR UPDATE ON metrics.stats FOR EACH ROW EXECUTE FUNCTION metrics.update_stats ( 'user', 'true' )"`;
1010

11-
exports[`non-pretty: pretty/triggers-5.sql 1`] = `"CREATE TRIGGER "TrickyTrigger" BEFORE DELETE ON "weirdSchema"."ComplexTable" FOR EACH ROW WHEN ( old.status = 'pending' ) EXECUTE FUNCTION "weirdSchema"."ComplexFn" ( arg1, 42 )"`;
11+
exports[`non-pretty: pretty/triggers-5.sql 1`] = `"CREATE TRIGGER "TrickyTrigger" BEFORE DELETE ON "weirdSchema"."ComplexTable" FOR EACH ROW WHEN ( old.status = 'pending' ) EXECUTE FUNCTION "weirdSchema"."ComplexFn" ( 'arg1', '42' )"`;
1212

1313
exports[`non-pretty: pretty/triggers-6.sql 1`] = `"CREATE TRIGGER user_activity_log AFTER INSERT OR DELETE OR UPDATE ON users FOR EACH ROW EXECUTE FUNCTION audit.activity_log ()"`;
1414

1515
exports[`non-pretty: pretty/triggers-7.sql 1`] = `"CREATE TRIGGER no_schema BEFORE INSERT ON log_table FOR EACH ROW EXECUTE FUNCTION update_log ()"`;
1616

1717
exports[`non-pretty: pretty/triggers-8.sql 1`] = `"CREATE TRIGGER flag_special_updates AFTER UPDATE ON profiles FOR EACH ROW WHEN ( new."accessLevel" = 'admin' ) EXECUTE FUNCTION flag_admin_change ()"`;
1818

19+
exports[`non-pretty: pretty/triggers-9.sql 1`] = `"CREATE TRIGGER "TriggerMixedCase" BEFORE INSERT ON datapoints FOR EACH ROW EXECUTE FUNCTION "HandleInsert" ( 'TYPE_A', 'Region-1' )"`;
20+
1921
exports[`non-pretty: pretty/triggers-10.sql 1`] = `"CREATE TRIGGER cascade_on_partition AFTER DELETE ON events_log_partition FOR EACH ROW EXECUTE FUNCTION propagate_deletion ()"`;
2022

2123
exports[`pretty: pretty/triggers-1.sql 1`] = `
@@ -48,7 +50,7 @@ exports[`pretty: pretty/triggers-4.sql 1`] = `
4850
AFTER INSERT OR UPDATE
4951
ON metrics.stats
5052
FOR EACH ROW
51-
EXECUTE PROCEDURE metrics.update_stats("user", "true")"
53+
EXECUTE PROCEDURE metrics.update_stats('user', 'true')"
5254
`;
5355

5456
exports[`pretty: pretty/triggers-5.sql 1`] = `
@@ -57,7 +59,7 @@ exports[`pretty: pretty/triggers-5.sql 1`] = `
5759
ON "weirdSchema"."ComplexTable"
5860
FOR EACH ROW
5961
WHEN (old.status = 'pending')
60-
EXECUTE PROCEDURE "weirdSchema"."ComplexFn"(arg1, 42)"
62+
EXECUTE PROCEDURE "weirdSchema"."ComplexFn"('arg1', '42')"
6163
`;
6264

6365
exports[`pretty: pretty/triggers-6.sql 1`] = `
@@ -85,6 +87,14 @@ exports[`pretty: pretty/triggers-8.sql 1`] = `
8587
EXECUTE PROCEDURE flag_admin_change()"
8688
`;
8789

90+
exports[`pretty: pretty/triggers-9.sql 1`] = `
91+
"CREATE TRIGGER "TriggerMixedCase"
92+
BEFORE INSERT
93+
ON datapoints
94+
FOR EACH ROW
95+
EXECUTE PROCEDURE "HandleInsert"('TYPE_A', 'Region-1')"
96+
`;
97+
8898
exports[`pretty: pretty/triggers-10.sql 1`] = `
8999
"CREATE TRIGGER cascade_on_partition
90100
AFTER DELETE

packages/deparser/src/deparser.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3881,8 +3881,8 @@ export class Deparser implements DeparserVisitor {
38813881
} else if (nodeData.sval !== undefined) {
38823882
// Handle nested sval structure: { sval: { sval: "value" } }
38833883
const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval;
3884-
const stringValue = svalValue.replace(/'/g, '').toLowerCase();
3885-
boolValue = stringValue === 'on' || stringValue === 'true';
3884+
const stringValue = svalValue.replace(/'/g, '');
3885+
boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true';
38863886
}
38873887
}
38883888
return boolValue ? 'READ ONLY' : 'READ WRITE';
@@ -3902,8 +3902,8 @@ export class Deparser implements DeparserVisitor {
39023902
} else if (nodeData.sval !== undefined) {
39033903
// Handle nested sval structure: { sval: { sval: "value" } }
39043904
const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval;
3905-
const stringValue = svalValue.replace(/'/g, '').toLowerCase();
3906-
boolValue = stringValue === 'on' || stringValue === 'true';
3905+
const stringValue = svalValue.replace(/'/g, '');
3906+
boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true';
39073907
}
39083908
}
39093909
return boolValue ? 'DEFERRABLE' : 'NOT DEFERRABLE';
@@ -3972,8 +3972,8 @@ export class Deparser implements DeparserVisitor {
39723972
} else if (nodeData.sval !== undefined) {
39733973
// Handle nested sval structure: { sval: { sval: "value" } }
39743974
const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval;
3975-
const stringValue = svalValue.replace(/'/g, '').toLowerCase();
3976-
boolValue = stringValue === 'on' || stringValue === 'true';
3975+
const stringValue = svalValue.replace(/'/g, '');
3976+
boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true';
39773977
}
39783978
}
39793979
transactionOptions.push(boolValue ? 'READ ONLY' : 'READ WRITE');
@@ -3989,8 +3989,8 @@ export class Deparser implements DeparserVisitor {
39893989
} else if (nodeData.sval !== undefined) {
39903990
// Handle nested sval structure: { sval: { sval: "value" } }
39913991
const svalValue = typeof nodeData.sval === 'object' ? nodeData.sval.sval : nodeData.sval;
3992-
const stringValue = svalValue.replace(/'/g, '').toLowerCase();
3993-
boolValue = stringValue === 'on' || stringValue === 'true';
3992+
const stringValue = svalValue.replace(/'/g, '');
3993+
boolValue = stringValue.toLowerCase() === 'on' || stringValue.toLowerCase() === 'true';
39943994
}
39953995
}
39963996
transactionOptions.push(boolValue ? 'DEFERRABLE' : 'NOT DEFERRABLE');
@@ -8705,8 +8705,9 @@ export class Deparser implements DeparserVisitor {
87058705
}
87068706

87078707
if (node.args && node.args.length > 0) {
8708+
const argContext = { ...context, isStringLiteral: true };
87088709
const args = ListUtils.unwrapList(node.args)
8709-
.map(arg => this.visit(arg, context))
8710+
.map(arg => this.visit(arg, argContext))
87108711
.join(', ');
87118712
executeStr += '(' + args + ')';
87128713
} else {
@@ -8787,8 +8788,9 @@ export class Deparser implements DeparserVisitor {
87878788

87888789
if (node.args && node.args.length > 0) {
87898790
output.push('(');
8791+
const argContext = { ...context, isStringLiteral: true };
87908792
const args = ListUtils.unwrapList(node.args)
8791-
.map(arg => this.visit(arg, context))
8793+
.map(arg => this.visit(arg, argContext))
87928794
.join(', ');
87938795
output.push(args);
87948796
output.push(')');

0 commit comments

Comments
 (0)