Skip to content

Commit 8b79593

Browse files
authored
Merge pull request #53 from JC1738/fix/coalesce
fix: recursively process all expressions in COALESCE arguments
2 parents a56c8ce + 423887c commit 8b79593

3 files changed

Lines changed: 15 additions & 7 deletions

File tree

src/server/query_handler_test.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ func TestHandleQuery(t *testing.T) {
195195
},
196196
"SELECT jsonb_array_length('[1, 2, 3]'::jsonb)": {
197197
"description": {"jsonb_array_length"},
198-
"types": {uint32ToString(pgtype.XID8OID)},
198+
"types": {uint32ToString(pgtype.Int4OID)},
199199
"values": {"3"},
200200
},
201201
"SELECT jsonb_pretty('{\"key\": \"value\"}'::JSONB)": {
@@ -258,6 +258,16 @@ func TestHandleQuery(t *testing.T) {
258258
"types": {uint32ToString(pgtype.TextOID)},
259259
"values": {"bemidb"},
260260
},
261+
"SELECT COALESCE(NULL, '[]'::jsonb) AS json_value": {
262+
"description": {"json_value"},
263+
"types": {uint32ToString(pgtype.JSONOID)},
264+
"values": {"[]"},
265+
},
266+
"SELECT jsonb_array_length(COALESCE('[]'::jsonb, '{}'::jsonb)) AS length": {
267+
"description": {"length"},
268+
"types": {uint32ToString(pgtype.Int4OID)},
269+
"values": {"0"},
270+
},
261271
"SELECT * FROM pg_catalog.pg_stat_gssapi": {
262272
"description": {"pid", "gss_authenticated", "principal", "encrypted", "credentials_delegated"},
263273
"types": {uint32ToString(pgtype.Int4OID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.TextOID), uint32ToString(pgtype.BoolOID), uint32ToString(pgtype.BoolOID)},

src/server/query_remapper.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -354,11 +354,9 @@ func (remapper *QueryRemapper) remappedExpressions(node *pgQuery.Node, remappedC
354354
// COALESCE(value1, value2, ...)
355355
coalesceExpr := node.GetCoalesceExpr()
356356
if coalesceExpr != nil {
357-
for _, arg := range coalesceExpr.Args {
358-
if arg.GetSubLink() != nil {
359-
// Nested SELECT
360-
subSelect := arg.GetSubLink().Subselect.GetSelectStmt()
361-
remapper.remapSelectStatement(subSelect, permissions, indentLevel+1) // recursion
357+
for i, arg := range coalesceExpr.Args {
358+
if arg != nil {
359+
coalesceExpr.Args[i] = remapper.remappedExpressions(arg, remappedColumnRefs, permissions, indentLevel+1) // self-recursion
362360
}
363361
}
364362
}

src/server/query_remapper_function.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func CreatePgCatalogMacroQueries(config *Config) []string {
4242
ELSE json_extract_path_text(from_json, path_elems)::varchar
4343
END`,
4444
`CREATE MACRO jsonb_object_agg(key, value) AS to_json(map(array_agg(key), array_agg(value)))`,
45-
`CREATE MACRO jsonb_array_length(json) AS json_array_length(json)`,
45+
`CREATE MACRO jsonb_array_length(json) AS CAST(json_array_length(json) AS INTEGER)`,
4646
`CREATE MACRO jsonb_pretty(json) AS json_pretty(json)`,
4747
`CREATE MACRO json_array_elements(json) AS unnest(json_extract(json, '$[*]'))`,
4848
`CREATE MACRO jsonb_array_elements(json) AS unnest(json_extract(json, '$[*]'))`,

0 commit comments

Comments
 (0)