Skip to content

Commit ca995fc

Browse files
committed
fix: mixed cast and jsonb expr
1 parent 5369058 commit ca995fc

10 files changed

Lines changed: 34 additions & 19 deletions

File tree

pegjs/db2.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1826,11 +1826,11 @@ unary_operator
18261826
= '!' / '-' / '+' / '~'
18271827

18281828
jsonb_expr
1829-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
1829+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
18301830
if (!tail || tail.length === 0) return head
18311831
return createBinaryExprChain(head, tail)
18321832
}
1833-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
1833+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
18341834
if (!tail || tail.length === 0) return head
18351835
return createBinaryExprChain(head, tail)
18361836
}

pegjs/flinksql.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2629,11 +2629,11 @@ unary_operator
26292629
= '!' / '-' / '+' / '~'
26302630

26312631
jsonb_expr
2632-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
2632+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
26332633
if (!tail || tail.length === 0) return head
26342634
return createBinaryExprChain(head, tail)
26352635
}
2636-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
2636+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
26372637
if (!tail || tail.length === 0) return head
26382638
return createBinaryExprChain(head, tail)
26392639
}

pegjs/mysql.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3068,11 +3068,11 @@ unary_operator
30683068
= '!' / '-' / '+' / '~'
30693069

30703070
jsonb_expr
3071-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
3071+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
30723072
if (!tail || tail.length === 0) return head
30733073
return createBinaryExprChain(head, tail)
30743074
}
3075-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
3075+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
30763076
if (!tail || tail.length === 0) return head
30773077
return createBinaryExprChain(head, tail)
30783078
}

pegjs/noql.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3934,11 +3934,11 @@ unary_operator
39343934
= '!' / '-' / '+' / '~'
39353935

39363936
jsonb_expr
3937-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
3937+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
39383938
if (!tail || tail.length === 0) return head
39393939
return createBinaryExprChain(head, tail)
39403940
}
3941-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
3941+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
39423942
if (!tail || tail.length === 0) return head
39433943
return createBinaryExprChain(head, tail)
39443944
}

pegjs/postgresql.pegjs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4294,11 +4294,11 @@ unary_operator
42944294
= '!' / '-' / '+' / '~'
42954295

42964296
jsonb_expr
4297-
= head:primary __ tail: (__ ('@>' / '<@') __ column_list_item)+ {
4297+
= head:primary __ tail: (__ ('@>' / '<@') __ primary)+ {
42984298
// => binary_expr
42994299
return createBinaryExprChain(head, tail)
43004300
}
4301-
/ head:primary __ tail: (__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
4301+
/ head:primary __ tail: (__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
43024302
// => primary | binary_expr
43034303
if (!tail || tail.length === 0) return head
43044304
return createBinaryExprChain(head, tail)
@@ -4908,7 +4908,7 @@ cast_expr
49084908
/ e:(column_ref_quoted / literal / aggr_func / window_func / func_call / case_expr / interval_expr / column_ref_array_index / param) __ c:cast_double_colon? {
49094909
/* => ({
49104910
type: 'cast';
4911-
expr: literal | aggr_func | func_call | case_expr | interval_expr | column_ref | param
4911+
expr: literal | jsonb_expr | aggr_func | func_call | case_expr | interval_expr | column_ref | param
49124912
| expr;
49134913
keyword: 'cast';
49144914
} & cast_double_colon)

pegjs/redshift.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3974,11 +3974,11 @@ unary_operator
39743974
= '!' / '-' / '+' / '~'
39753975

39763976
jsonb_expr
3977-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
3977+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
39783978
if (!tail || tail.length === 0) return head
39793979
return createBinaryExprChain(head, tail)
39803980
}
3981-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
3981+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
39823982
if (!tail || tail.length === 0) return head
39833983
return createBinaryExprChain(head, tail)
39843984
}

pegjs/snowflake.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3400,11 +3400,11 @@ unary_operator
34003400
= '!' / '-' / '+' / '~'
34013401

34023402
jsonb_expr
3403-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
3403+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
34043404
if (!tail || tail.length === 0) return head
34053405
return createBinaryExprChain(head, tail)
34063406
}
3407-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
3407+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
34083408
if (!tail || tail.length === 0) return head
34093409
return createBinaryExprChain(head, tail)
34103410
}

pegjs/sqlite.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2158,11 +2158,11 @@ unary_operator
21582158
= '!' / '-' / '+' / '~'
21592159

21602160
jsonb_expr
2161-
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
2161+
= head:primary tail:(__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
21622162
if (!tail || tail.length === 0) return head
21632163
return createBinaryExprChain(head, tail)
21642164
}
2165-
/ head:primary tail:(__ ('@>' / '<@') __ column_list_item)* {
2165+
/ head:primary tail:(__ ('@>' / '<@') __ primary)* {
21662166
if (!tail || tail.length === 0) return head
21672167
return createBinaryExprChain(head, tail)
21682168
}

pegjs/trino.pegjs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,11 +3383,11 @@ unary_operator
33833383
= '!' / '-' / '+' / '~'
33843384

33853385
jsonb_expr
3386-
= head:primary __ tail: (__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ literal)* {
3386+
= head:primary __ tail: (__ ('?|' / '?&' / '?' / '#-' / '#>>' / '#>' / DOUBLE_ARROW / SINGLE_ARROW) __ primary)* {
33873387
if (!tail || tail.length === 0) return head
33883388
return createBinaryExprChain(head, tail)
33893389
}
3390-
/ head:primary __ tail: (__ ('@>' / '<@') __ column_list_item)+ {
3390+
/ head:primary __ tail: (__ ('@>' / '<@') __ primary)+ {
33913391
return createBinaryExprChain(head, tail)
33923392
}
33933393

test/postgres.spec.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,6 +1609,21 @@ describe('Postgres', () => {
16091609
'SELECT * FROM "model_a" AS "a"'
16101610
]
16111611
},
1612+
{
1613+
title: 'mixed jsonb and cast',
1614+
sql: [
1615+
"SELECT person.name FROM person WHERE person.email_addresses::json -> 'items'::text ILIKE '%sam%'",
1616+
`SELECT "person".name FROM "person" WHERE "person".email_addresses::JSON -> 'items'::TEXT ILIKE '%sam%'`
1617+
]
1618+
},
1619+
{
1620+
title: 'multiple jsonb operator expr',
1621+
sql: [
1622+
`select '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}', '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb, '{"a":1, "b":2}'::jsonb ? 'b', '{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c']
1623+
, '["a", "b"]'::jsonb ?& array['a', 'b'], '["a", "b"]'::jsonb || '["c", "d"]'::jsonb, '{"a": "b"}'::jsonb - 'a', '["a", "b"]'::jsonb - 1, '["a", {"b":1}]'::jsonb #- '{1,b}'`,
1624+
`SELECT '{"a": {"b":{"c": "foo"}}}'::JSON #> '{a,b}', '{"a":1, "b":2}'::JSONB @> '{"b":2}'::JSONB, '{"a":1, "b":2}'::JSONB ? 'b', '{"a":1, "b":2, "c":3}'::JSONB ?| ARRAY['b','c'], '["a", "b"]'::JSONB ?& ARRAY['a','b'], '["a", "b"]'::JSONB || '["c", "d"]'::JSONB, '{"a": "b"}'::JSONB - 'a', '["a", "b"]'::JSONB - 1, '["a", {"b":1}]'::JSONB #- '{1,b}'`
1625+
]
1626+
},
16121627
]
16131628
function neatlyNestTestedSQL(sqlList){
16141629
sqlList.forEach(sqlInfo => {

0 commit comments

Comments
 (0)