@@ -165,8 +165,9 @@ BEGIN
165
165
CASE
166
166
WHEN FOUND AND sub .body IS NULL THEN -- A simple column reference
167
167
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
170
171
IF cardinality(fks) > 1 THEN
171
172
RAISE EXCEPTION ' More than one candidate foreign keys for %(%)' ,
172
173
tab, col;
@@ -340,23 +341,19 @@ $$ LANGUAGE plpgsql STABLE;
340
341
CREATE FUNCTION parse_many (expr text )
341
342
RETURNS TABLE (selector text , predicate text , body text ) AS $$
342
343
DECLARE
343
- whitespace text = E' \t\n ' ;
344
+ whitespace_and_commas text = E' ^[ \t\n ,]* ' ;
344
345
BEGIN
345
346
-- - To parse many expressions:
346
347
-- - * Parse one expression.
347
348
-- - * Consume whitespace.
348
349
-- - * Consume a comma if present.
349
350
-- - * Consume whitespace.
350
351
-- - * Repeat until the input is empty.
351
- expr := ltrim (expr, whitespace );
352
+ expr := regexp_replace (expr, whitespace_and_commas, ' ' );
352
353
WHILE expr != ' ' LOOP
353
354
SELECT * FROM graphql .parse_one (expr) INTO selector, predicate, body, expr;
354
355
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, ' ' );
360
357
END LOOP;
361
358
END
362
359
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
@@ -408,7 +405,9 @@ BEGIN
408
405
EXIT WHEN NOT brackety;
409
406
END CASE;
410
407
END LOOP;
411
- body := substr(expr, 1 , idx);
408
+ IF brackety THEN
409
+ body := substr(expr, 1 , idx);
410
+ END IF;
412
411
remainder := substr(expr, idx+ 1 );
413
412
END
414
413
$$ LANGUAGE plpgsql IMMUTABLE STRICT;
0 commit comments