Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions __fixtures__/generated/generated.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,15 @@
"pretty/quoting-5.sql": "CREATE FUNCTION faker.boolean() RETURNS boolean AS $EOFCODE$\nBEGIN\n RETURN random() < 0.5;\nEND;\n$EOFCODE$ LANGUAGE plpgsql",
"pretty/quoting-6.sql": "CREATE FUNCTION faker.\"boolean\"() RETURNS boolean AS $EOFCODE$\nBEGIN\n RETURN random() < 0.5;\nEND;\n$EOFCODE$ LANGUAGE plpgsql",
"pretty/quoting-7.sql": "CREATE DOMAIN origin AS text CHECK (value = pg_catalog.\"substring\"(value, '^(https?://[^/]*)'))",
"pretty/quoting-8.sql": "SELECT '{\"a\":1}'::json",
"pretty/quoting-9.sql": "SELECT '{\"b\":2}'::jsonb",
"pretty/quoting-10.sql": "SELECT true::boolean",
"pretty/quoting-11.sql": "SELECT '1 day'::interval",
"pretty/quoting-12.sql": "SELECT 42::int",
"pretty/quoting-13.sql": "INSERT INTO test_table (data) VALUES ('{\"c\":3}'::json)",
"pretty/quoting-14.sql": "SELECT '{\"d\":4}'::myschema.json",
"pretty/quoting-15.sql": "SELECT 100::custom.int",
"pretty/quoting-16.sql": "SELECT true::myapp.boolean",
"pretty/procedures-1.sql": "SELECT handle_insert('TYPE_A')",
"pretty/procedures-2.sql": "SELECT \"HandleInsert\"('TYPE_A', 'Region-1')",
"pretty/procedures-3.sql": "SELECT compute_score(42, TRUE)",
Expand Down
34 changes: 34 additions & 0 deletions __fixtures__/kitchen-sink/pretty/quoting.sql
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,37 @@ $EOFCODE$ LANGUAGE plpgsql;
-- Note: SUBSTRING(value FROM 'pattern') SQL syntax gets deparsed to pg_catalog."substring"(value, 'pattern')
-- The SQL syntax form cannot be tested here due to AST round-trip differences (COERCE_SQL_SYNTAX vs COERCE_EXPLICIT_CALL)
CREATE DOMAIN origin AS text CHECK (value = pg_catalog."substring"(value, '^(https?://[^/]*)'));

-- 8-16: Type name quoting test cases
-- These demonstrate the BUG where user-defined schema-qualified types with keyword names
-- are over-quoted (e.g., myschema."json" instead of myschema.json)

-- 8. Type name quoting: json type should NOT be quoted (COL_NAME_KEYWORD in type position)
SELECT '{"a":1}'::json;

-- 9. Type name quoting: jsonb type should NOT be quoted
SELECT '{"b":2}'::jsonb;

-- 10. Type name quoting: boolean type should NOT be quoted (TYPE_FUNC_NAME_KEYWORD in type position)
SELECT true::boolean;

-- 11. Type name quoting: interval type should NOT be quoted (TYPE_FUNC_NAME_KEYWORD in type position)
SELECT '1 day'::interval;

-- 12. Type name quoting: int type should NOT be quoted (COL_NAME_KEYWORD in type position)
SELECT 42::int;

-- 13. Type cast in INSERT VALUES - json type should NOT be quoted
INSERT INTO test_table (data) VALUES ('{"c":3}'::json);

-- 14. User-defined schema-qualified type with keyword name - BUG: currently quotes the type name
-- Expected: myschema.json, Actual (buggy): myschema."json"
SELECT '{"d":4}'::myschema.json;

-- 15. User-defined schema-qualified type with keyword name 'int' - BUG: currently quotes
-- Expected: custom.int, Actual (buggy): custom."int"
SELECT 100::custom.int;

-- 16. User-defined schema-qualified type with keyword name 'boolean' - BUG: currently quotes
-- Expected: myapp.boolean, Actual (buggy): myapp."boolean"
SELECT true::myapp.boolean;
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,24 @@ $$ LANGUAGE plpgsql"

exports[`non-pretty: pretty/quoting-7.sql 1`] = `"CREATE DOMAIN origin AS text CHECK (value = pg_catalog.substring(value, '^(https?://[^/]*)'))"`;

exports[`non-pretty: pretty/quoting-8.sql 1`] = `"SELECT '{"a":1}'::json"`;

exports[`non-pretty: pretty/quoting-9.sql 1`] = `"SELECT '{"b":2}'::jsonb"`;

exports[`non-pretty: pretty/quoting-10.sql 1`] = `"SELECT CAST(true AS boolean)"`;

exports[`non-pretty: pretty/quoting-11.sql 1`] = `"SELECT '1 day'::interval"`;

exports[`non-pretty: pretty/quoting-12.sql 1`] = `"SELECT 42::int"`;

exports[`non-pretty: pretty/quoting-13.sql 1`] = `"INSERT INTO test_table (data) VALUES ('{"c":3}'::json)"`;

exports[`non-pretty: pretty/quoting-14.sql 1`] = `"SELECT CAST('{"d":4}' AS myschema."json")"`;

exports[`non-pretty: pretty/quoting-15.sql 1`] = `"SELECT CAST(100 AS custom."int")"`;

exports[`non-pretty: pretty/quoting-16.sql 1`] = `"SELECT CAST(true AS myapp."boolean")"`;

exports[`pretty: pretty/quoting-1.sql 1`] = `
"CREATE FUNCTION faker.float(min double precision DEFAULT 0, max double precision DEFAULT 100) RETURNS double precision AS $$
BEGIN
Expand Down Expand Up @@ -102,3 +120,26 @@ exports[`pretty: pretty/quoting-7.sql 1`] = `
"CREATE DOMAIN origin AS text
CHECK (value = pg_catalog.substring(value, '^(https?://[^/]*)'))"
`;

exports[`pretty: pretty/quoting-8.sql 1`] = `"SELECT '{"a":1}'::json"`;

exports[`pretty: pretty/quoting-9.sql 1`] = `"SELECT '{"b":2}'::jsonb"`;

exports[`pretty: pretty/quoting-10.sql 1`] = `"SELECT CAST(true AS boolean)"`;

exports[`pretty: pretty/quoting-11.sql 1`] = `"SELECT '1 day'::interval"`;

exports[`pretty: pretty/quoting-12.sql 1`] = `"SELECT 42::int"`;

exports[`pretty: pretty/quoting-13.sql 1`] = `
"INSERT INTO test_table (
data
) VALUES
('{"c":3}'::json)"
`;

exports[`pretty: pretty/quoting-14.sql 1`] = `"SELECT CAST('{"d":4}' AS myschema."json")"`;

exports[`pretty: pretty/quoting-15.sql 1`] = `"SELECT CAST(100 AS custom."int")"`;

exports[`pretty: pretty/quoting-16.sql 1`] = `"SELECT CAST(true AS myapp."boolean")"`;
9 changes: 9 additions & 0 deletions packages/deparser/__tests__/pretty/quoting-pretty.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ const prettyTest = new PrettyTest([
'pretty/quoting-5.sql',
'pretty/quoting-6.sql',
'pretty/quoting-7.sql',
'pretty/quoting-8.sql',
'pretty/quoting-9.sql',
'pretty/quoting-10.sql',
'pretty/quoting-11.sql',
'pretty/quoting-12.sql',
'pretty/quoting-13.sql',
'pretty/quoting-14.sql',
'pretty/quoting-15.sql',
'pretty/quoting-16.sql',
]);

prettyTest.generateTests();