Skip to content

Commit a54a433

Browse files
committed
Fix aliasing problem (?) in parser.
Now parses queries like: SELECT * FROM graphql.to_sql('user', '"f3411edc-e1d0-452a-bc19-b42c0d5a0e36"', '{ id, friendship }'); to_sql --------------------------------------------------------------------------- SELECT json_agg(id, "sub/1".friendship) + FROM """user""", + LATERAL ( + SELECT json_agg("""user""") + FROM """user""" + JOIN friendship ON (("""user""".id) = (friendship.second)) + JOIN """user""" ON ((friendship.first) = ("""user""".id)) + ) AS "sub/1" + WHERE (("""user""".id) = ('f3411edc-e1d0-452a-bc19-b42c0d5a0e36'::uuid))
1 parent 9729899 commit a54a433

File tree

1 file changed

+9
-10
lines changed

1 file changed

+9
-10
lines changed

graphql.sql

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,9 @@ BEGIN
165165
CASE
166166
WHEN FOUND AND sub.body IS NULL THEN -- A simple column reference
167167
SELECT array_agg(fk) INTO STRICT fks
168-
FROM graphql.fk(tab) WHERE cardinality(cols) = 1 AND cols[1] = col;
169-
IF FOUND THEN
168+
FROM graphql.fk(tab)
169+
WHERE cardinality(fk.cols) = 1 AND fk.cols[1] = col;
170+
IF cardinality(fks) > 0 THEN
170171
IF cardinality(fks) > 1 THEN
171172
RAISE EXCEPTION 'More than one candidate foreign keys for %(%)',
172173
tab, col;
@@ -340,23 +341,19 @@ $$ LANGUAGE plpgsql STABLE;
340341
CREATE FUNCTION parse_many(expr text)
341342
RETURNS TABLE (selector text, predicate text, body text) AS $$
342343
DECLARE
343-
whitespace text = E' \t\n';
344+
whitespace_and_commas text = E'^[ \t\n,]*';
344345
BEGIN
345346
--- To parse many expressions:
346347
--- * Parse one expression.
347348
--- * Consume whitespace.
348349
--- * Consume a comma if present.
349350
--- * Consume whitespace.
350351
--- * Repeat until the input is empty.
351-
expr := ltrim(expr, whitespace);
352+
expr := regexp_replace(expr, whitespace_and_commas, '');
352353
WHILE expr != '' LOOP
353354
SELECT * FROM graphql.parse_one(expr) INTO selector, predicate, body, expr;
354355
RETURN NEXT;
355-
expr := ltrim(expr, whitespace);
356-
IF substr(expr, 1, 1) = ',' THEN
357-
expr := substr(expr, 2);
358-
END IF;
359-
expr := ltrim(expr, whitespace);
356+
expr := regexp_replace(expr, whitespace_and_commas, '');
360357
END LOOP;
361358
END
362359
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
@@ -408,7 +405,9 @@ BEGIN
408405
EXIT WHEN NOT brackety;
409406
END CASE;
410407
END LOOP;
411-
body := substr(expr, 1, idx);
408+
IF brackety THEN
409+
body := substr(expr, 1, idx);
410+
END IF;
412411
remainder := substr(expr, idx+1);
413412
END
414413
$$ LANGUAGE plpgsql IMMUTABLE STRICT;

0 commit comments

Comments
 (0)