Skip to content

Commit ce46c4a

Browse files
Remove MySQL-style backticks from SQL generation
- Updated cel2sql.go to remove backticks from field names and table names - Updated cel2sql_test.go to match new PostgreSQL-compatible SQL output - All tests pass with clean PostgreSQL SQL generation
1 parent 8f3a403 commit ce46c4a

File tree

2 files changed

+39
-43
lines changed

2 files changed

+39
-43
lines changed

cel2sql.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -497,9 +497,8 @@ func (con *converter) visitCallMapIndex(expr *exprpb.Expr) error {
497497
if err != nil {
498498
return err
499499
}
500-
con.str.WriteString(".`")
500+
con.str.WriteString(".")
501501
con.str.WriteString(fieldName)
502-
con.str.WriteString("`")
503502
return nil
504503
}
505504

@@ -587,9 +586,7 @@ func (con *converter) visitConst(expr *exprpb.Expr) error {
587586
}
588587

589588
func (con *converter) visitIdent(expr *exprpb.Expr) error {
590-
con.str.WriteString("`")
591589
con.str.WriteString(expr.GetIdentExpr().GetName())
592-
con.str.WriteString("`")
593590
return nil
594591
}
595592

@@ -621,9 +618,8 @@ func (con *converter) visitSelect(expr *exprpb.Expr) error {
621618
if err != nil {
622619
return err
623620
}
624-
con.str.WriteString(".`")
621+
con.str.WriteString(".")
625622
con.str.WriteString(sel.GetField())
626-
con.str.WriteString("`")
627623
if sel.GetTestOnly() {
628624
con.str.WriteString(")")
629625
}

cel2sql_test.go

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -87,91 +87,91 @@ func TestConvert(t *testing.T) {
8787
{
8888
name: "startsWith",
8989
args: args{source: `name.startsWith("a")`},
90-
want: "STARTS_WITH(`name`, \"a\")",
90+
want: "STARTS_WITH(name, \"a\")",
9191
wantErr: false,
9292
},
9393
{
9494
name: "endsWith",
9595
args: args{source: `name.endsWith("z")`},
96-
want: "ENDS_WITH(`name`, \"z\")",
96+
want: "ENDS_WITH(name, \"z\")",
9797
wantErr: false,
9898
},
9999
{
100100
name: "matches",
101101
args: args{source: `name.matches("a+")`},
102-
want: "REGEXP_CONTAINS(`name`, \"a+\")",
102+
want: "REGEXP_CONTAINS(name, \"a+\")",
103103
wantErr: false,
104104
},
105105
{
106106
name: "contains",
107107
args: args{source: `name.contains("abc")`},
108-
want: "INSTR(`name`, \"abc\") != 0",
108+
want: "INSTR(name, \"abc\") != 0",
109109
wantErr: false,
110110
},
111111
{
112112
name: "&&",
113113
args: args{source: `name.startsWith("a") && name.endsWith("z")`},
114-
want: "STARTS_WITH(`name`, \"a\") AND ENDS_WITH(`name`, \"z\")",
114+
want: "STARTS_WITH(name, \"a\") AND ENDS_WITH(name, \"z\")",
115115
wantErr: false,
116116
},
117117
{
118118
name: "||",
119119
args: args{source: `name.startsWith("a") || name.endsWith("z")`},
120-
want: "STARTS_WITH(`name`, \"a\") OR ENDS_WITH(`name`, \"z\")",
120+
want: "STARTS_WITH(name, \"a\") OR ENDS_WITH(name, \"z\")",
121121
wantErr: false,
122122
},
123123
{
124124
name: "()",
125125
args: args{source: `age >= 10 && (name.startsWith("a") || name.endsWith("z"))`},
126-
want: "`age` >= 10 AND (STARTS_WITH(`name`, \"a\") OR ENDS_WITH(`name`, \"z\"))",
126+
want: "age >= 10 AND (STARTS_WITH(name, \"a\") OR ENDS_WITH(name, \"z\"))",
127127
wantErr: false,
128128
},
129129
{
130130
name: "IF",
131131
args: args{source: `name == "a" ? "a" : "b"`},
132-
want: "IF(`name` = \"a\", \"a\", \"b\")",
132+
want: "IF(name = \"a\", \"a\", \"b\")",
133133
wantErr: false,
134134
},
135135
{
136136
name: "==",
137137
args: args{source: `name == "a"`},
138-
want: "`name` = \"a\"",
138+
want: "name = \"a\"",
139139
wantErr: false,
140140
},
141141
{
142142
name: "!=",
143143
args: args{source: `age != 20`},
144-
want: "`age` != 20",
144+
want: "age != 20",
145145
wantErr: false,
146146
},
147147
{
148148
name: "IS NULL",
149149
args: args{source: `null_var == null`},
150-
want: "`null_var` IS NULL",
150+
want: "null_var IS NULL",
151151
wantErr: false,
152152
},
153153
{
154154
name: "IS NOT TRUE",
155155
args: args{source: `adult != true`},
156-
want: "`adult` IS NOT TRUE",
156+
want: "adult IS NOT TRUE",
157157
wantErr: false,
158158
},
159159
{
160160
name: "<",
161161
args: args{source: `age < 20`},
162-
want: "`age` < 20",
162+
want: "age < 20",
163163
wantErr: false,
164164
},
165165
{
166166
name: ">=",
167167
args: args{source: `height >= 1.6180339887`},
168-
want: "`height` >= 1.6180339887",
168+
want: "height >= 1.6180339887",
169169
wantErr: false,
170170
},
171171
{
172172
name: "NOT",
173173
args: args{source: `!adult`},
174-
want: "NOT `adult`",
174+
want: "NOT adult",
175175
wantErr: false,
176176
},
177177
{
@@ -189,19 +189,19 @@ func TestConvert(t *testing.T) {
189189
{
190190
name: "list_var",
191191
args: args{source: `string_list[0] == "a"`},
192-
want: "`string_list`[1] = \"a\"", // PostgreSQL arrays are 1-indexed
192+
want: "string_list[1] = \"a\"", // PostgreSQL arrays are 1-indexed
193193
wantErr: false,
194194
},
195195
{
196196
name: "map",
197197
args: args{source: `{"one": 1, "two": 2, "three": 3}["one"] == 1`},
198-
want: "STRUCT(1 AS one, 2 AS two, 3 AS three).`one` = 1",
198+
want: "STRUCT(1 AS one, 2 AS two, 3 AS three).one = 1",
199199
wantErr: false,
200200
},
201201
{
202202
name: "map_var",
203203
args: args{source: `string_int_map["one"] == 1`},
204-
want: "`string_int_map`.`one` = 1",
204+
want: "string_int_map.one = 1",
205205
wantErr: false,
206206
},
207207
{
@@ -243,25 +243,25 @@ func TestConvert(t *testing.T) {
243243
{
244244
name: "date",
245245
args: args{source: `birthday > date(2000, 1, 1) + 1`},
246-
want: "`birthday` > DATE(2000, 1, 1) + 1",
246+
want: "birthday > DATE(2000, 1, 1) + 1",
247247
wantErr: false,
248248
},
249249
{
250250
name: "time",
251251
args: args{source: `fixed_time == time("18:00:00")`},
252-
want: "`fixed_time` = TIME(\"18:00:00\")",
252+
want: "fixed_time = TIME(\"18:00:00\")",
253253
wantErr: false,
254254
},
255255
{
256256
name: "datetime",
257257
args: args{source: `scheduled_at != datetime(date("2021-09-01"), fixed_time)`},
258-
want: "`scheduled_at` != DATETIME(DATE(\"2021-09-01\"), `fixed_time`)",
258+
want: "scheduled_at != DATETIME(DATE(\"2021-09-01\"), fixed_time)",
259259
wantErr: false,
260260
},
261261
{
262262
name: "timestamp",
263263
args: args{source: `created_at - duration("60m") <= timestamp(datetime("2021-09-01 18:00:00"), "Asia/Tokyo")`},
264-
want: "`created_at` - INTERVAL 1 HOUR <= TIMESTAMP(DATETIME(\"2021-09-01 18:00:00\"), \"Asia/Tokyo\")",
264+
want: "created_at - INTERVAL 1 HOUR <= TIMESTAMP(DATETIME(\"2021-09-01 18:00:00\"), \"Asia/Tokyo\")",
265265
wantErr: false,
266266
},
267267
{
@@ -333,73 +333,73 @@ func TestConvert(t *testing.T) {
333333
{
334334
name: "timestamp_sub",
335335
args: args{source: `created_at - interval(1, HOUR)`},
336-
want: "`created_at` - INTERVAL 1 HOUR",
336+
want: "created_at - INTERVAL 1 HOUR",
337337
wantErr: false,
338338
},
339339
{
340340
name: "timestamp_getSeconds",
341341
args: args{source: `created_at.getSeconds()`},
342-
want: "EXTRACT(SECOND FROM `created_at`)",
342+
want: "EXTRACT(SECOND FROM created_at)",
343343
wantErr: false,
344344
},
345345
{
346346
name: "\"timestamp_getHours_withTimezone",
347347
args: args{source: `created_at.getHours("Asia/Tokyo")`},
348-
want: "EXTRACT(HOUR FROM `created_at` AT \"Asia/Tokyo\")",
348+
want: "EXTRACT(HOUR FROM created_at AT \"Asia/Tokyo\")",
349349
wantErr: false,
350350
},
351351
{
352352
name: "date_getFullYear",
353353
args: args{source: `birthday.getFullYear()`},
354-
want: "EXTRACT(YEAR FROM `birthday`)",
354+
want: "EXTRACT(YEAR FROM birthday)",
355355
wantErr: false,
356356
},
357357
{
358358
name: "datetime_getMonth",
359359
args: args{source: `scheduled_at.getMonth()`},
360-
want: "EXTRACT(MONTH FROM `scheduled_at`) - 1",
360+
want: "EXTRACT(MONTH FROM scheduled_at) - 1",
361361
wantErr: false,
362362
},
363363
{
364364
name: "datetime_getDayOfMonth",
365365
args: args{source: `scheduled_at.getDayOfMonth()`},
366-
want: "EXTRACT(DAY FROM `scheduled_at`) - 1",
366+
want: "EXTRACT(DAY FROM scheduled_at) - 1",
367367
wantErr: false,
368368
},
369369
{
370370
name: "time_getMinutes",
371371
args: args{source: `fixed_time.getMinutes()`},
372-
want: "EXTRACT(MINUTE FROM `fixed_time`)",
372+
want: "EXTRACT(MINUTE FROM fixed_time)",
373373
wantErr: false,
374374
},
375375
{
376376
name: "fieldSelect",
377377
args: args{source: `page.title == "test"`},
378-
want: "`page`.`title` = \"test\"",
378+
want: "page.title = \"test\"",
379379
wantErr: false,
380380
},
381381
{
382382
name: "fieldSelect_startsWith",
383383
args: args{source: `page.title.startsWith("test")`},
384-
want: "STARTS_WITH(`page`.`title`, \"test\")",
384+
want: "STARTS_WITH(page.title, \"test\")",
385385
wantErr: false,
386386
},
387387
{
388388
name: "fieldSelect_add",
389389
args: args{source: `trigram.cell[0].page_count + 1`},
390-
want: "`trigram`.`cell`[1].`page_count` + 1", // PostgreSQL 1-indexed arrays
390+
want: "trigram.cell[1].page_count + 1", // PostgreSQL 1-indexed arrays
391391
wantErr: false,
392392
},
393393
{
394394
name: "fieldSelect_concatString",
395395
args: args{source: `trigram.cell[0].sample[0].title + "test"`},
396-
want: "`trigram`.`cell`[1].`sample`[1].`title` || \"test\"", // PostgreSQL syntax
396+
want: "trigram.cell[1].sample[1].title || \"test\"", // PostgreSQL syntax
397397
wantErr: false,
398398
},
399399
{
400400
name: "fieldSelect_in",
401401
args: args{source: `"test" in trigram.cell[0].value`},
402-
want: "\"test\" = ANY(`trigram`.`cell`[1].`value`)", // PostgreSQL array membership
402+
want: "\"test\" = ANY(trigram.cell[1].value)", // PostgreSQL array membership
403403
wantErr: false,
404404
},
405405
{
@@ -429,13 +429,13 @@ func TestConvert(t *testing.T) {
429429
{
430430
name: "cast_string_from_timestamp",
431431
args: args{source: `string(created_at)`},
432-
want: "CAST(`created_at` AS STRING)",
432+
want: "CAST(created_at AS STRING)",
433433
wantErr: false,
434434
},
435435
{
436436
name: "cast_int_epoch",
437437
args: args{source: `int(created_at)`},
438-
want: "UNIX_SECONDS(`created_at`)",
438+
want: "UNIX_SECONDS(created_at)",
439439
wantErr: false,
440440
},
441441
{
@@ -453,7 +453,7 @@ func TestConvert(t *testing.T) {
453453
{
454454
name: "size_list",
455455
args: args{source: `size(string_list)`},
456-
want: "ARRAY_LENGTH(`string_list`)",
456+
want: "ARRAY_LENGTH(string_list)",
457457
wantErr: false,
458458
},
459459
}

0 commit comments

Comments
 (0)