Skip to content

Commit 2cbd8f0

Browse files
authored
Merge pull request #231 from launchql/issues/217
Issues/217
2 parents 1a0bf71 + 4eefd27 commit 2cbd8f0

File tree

9 files changed

+31
-7
lines changed

9 files changed

+31
-7
lines changed

__fixtures__/generated/generated.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
"pretty/misc-14.sql": "CREATE TRIGGER decrease_job_queue_count_on_delete \n AFTER DELETE ON dashboard_jobs.jobs \n FOR EACH ROW\n WHEN ( OLD.queue_name IS NOT NULL ) \n EXECUTE PROCEDURE dashboard_jobs.tg_decrease_job_queue_count ()",
8080
"pretty/misc-15.sql": "ALTER DEFAULT PRIVILEGES IN SCHEMA dashboard_jobs \n GRANT EXECUTE ON FUNCTIONS TO administrator",
8181
"pretty/misc-16.sql": "GRANT EXECUTE ON FUNCTION dashboard_private.uuid_generate_seeded_uuid TO PUBLIC",
82+
"pretty/misc-17.sql": "SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t",
8283
"pretty/cte-1.sql": "WITH regional_sales AS (SELECT region, SUM(sales_amount) as total_sales FROM sales GROUP BY region) SELECT * FROM regional_sales",
8384
"pretty/cte-2.sql": "WITH regional_sales AS (SELECT region, SUM(sales_amount) as total_sales FROM sales GROUP BY region), top_regions AS (SELECT region FROM regional_sales WHERE total_sales > 1000000) SELECT * FROM top_regions",
8485
"pretty/cte-3.sql": "WITH RECURSIVE employee_hierarchy AS (SELECT id, name, manager_id, 1 as level FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.id, e.name, e.manager_id, eh.level + 1 FROM employees e JOIN employee_hierarchy eh ON e.manager_id = eh.id) SELECT * FROM employee_hierarchy",
@@ -21299,6 +21300,7 @@
2129921300
"misc/issues-14.sql": "SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL)",
2130021301
"misc/issues-15.sql": "select \"A\" from \"table_name\"",
2130121302
"misc/issues-16.sql": "select \"AA\" from \"table_name\"",
21303+
"misc/issues-17.sql": "SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t",
2130221304
"misc/inflection-1.sql": "CREATE SCHEMA inflection",
2130321305
"misc/inflection-2.sql": "GRANT USAGE ON SCHEMA inflection TO PUBLIC",
2130421306
"misc/inflection-3.sql": "ALTER DEFAULT PRIVILEGES IN SCHEMA inflection \n GRANT EXECUTE ON FUNCTIONS TO PUBLIC",

__fixtures__/kitchen-sink/misc/issues.sql

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,7 @@ SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL);
7171

7272
-- https://github.com/launchql/pgsql-parser/issues/101
7373
select "A" from "table_name";
74-
select "AA" from "table_name";
74+
select "AA" from "table_name";
75+
76+
-- https://github.com/launchql/pgsql-parser/issues/217
77+
SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t;

__fixtures__/kitchen-sink/pretty/misc.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,3 +229,7 @@ ALTER DEFAULT PRIVILEGES IN SCHEMA dashboard_jobs
229229
-- 16. grant execute on function
230230

231231
GRANT EXECUTE ON FUNCTION dashboard_private.uuid_generate_seeded_uuid TO PUBLIC;
232+
233+
234+
-- https://github.com/launchql/pgsql-parser/issues/217
235+
SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t;

packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ it('misc-issues', async () => {
1919
"misc/issues-13.sql",
2020
"misc/issues-14.sql",
2121
"misc/issues-15.sql",
22-
"misc/issues-16.sql"
22+
"misc/issues-16.sql",
23+
"misc/issues-17.sql"
2324
]);
2425
});

packages/deparser/__tests__/kitchen-sink/pretty-misc.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ it('pretty-misc', async () => {
1919
"pretty/misc-13.sql",
2020
"pretty/misc-14.sql",
2121
"pretty/misc-15.sql",
22-
"pretty/misc-16.sql"
22+
"pretty/misc-16.sql",
23+
"pretty/misc-17.sql"
2324
]);
2425
});

packages/deparser/__tests__/misc/__snapshots__/pg-catalog.test.ts.snap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
exports[`should format pg_catalog.char with pretty option enabled 1`] = `
44
"CREATE TABLE dashboard_jobs.jobs (
55
id bigserial PRIMARY KEY,
6-
queue_name text DEFAULT public.gen_random_uuid()::text,
6+
queue_name text DEFAULT (public.gen_random_uuid())::text,
77
task_identifier text NOT NULL,
88
payload pg_catalog.json DEFAULT '{}'::json NOT NULL,
99
priority int DEFAULT 0 NOT NULL,

packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ exports[`non-pretty: pretty/misc-15.sql 1`] = `"ALTER DEFAULT PRIVILEGES IN SCHE
3232

3333
exports[`non-pretty: pretty/misc-16.sql 1`] = `"GRANT EXECUTE ON FUNCTION dashboard_private.uuid_generate_seeded_uuid TO PUBLIC"`;
3434

35+
exports[`non-pretty: pretty/misc-17.sql 1`] = `"SELECT CAST((t.date AT TIME ZONE 'America/New_York')::text AS date) FROM tbl AS t"`;
36+
3537
exports[`pretty: pretty/misc-1.sql 1`] = `
3638
"WITH
3739
recent_orders AS (SELECT
@@ -295,3 +297,8 @@ exports[`pretty: pretty/misc-15.sql 1`] = `
295297
`;
296298

297299
exports[`pretty: pretty/misc-16.sql 1`] = `"GRANT EXECUTE ON FUNCTION dashboard_private.uuid_generate_seeded_uuid TO PUBLIC"`;
300+
301+
exports[`pretty: pretty/misc-17.sql 1`] = `
302+
"SELECT CAST((t.date AT TIME ZONE 'America/New_York')::text AS date)
303+
FROM tbl AS t"
304+
`;

packages/deparser/__tests__/pretty/misc-pretty.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const testCases = [
1616
'pretty/misc-13.sql',
1717
'pretty/misc-14.sql',
1818
'pretty/misc-15.sql',
19-
'pretty/misc-16.sql'
19+
'pretty/misc-16.sql',
20+
'pretty/misc-17.sql',
2021
];
2122

2223
const prettyTest = new PrettyTest(testCases);

packages/deparser/src/deparser.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2370,9 +2370,14 @@ export class Deparser implements DeparserVisitor {
23702370

23712371
if (isSimpleArgument || isFunctionCall) {
23722372
// For simple arguments, avoid :: syntax if they have complex structure
2373-
if (isSimpleArgument && (arg.includes('(') || arg.startsWith('-'))) {
2374-
} else {
2373+
const shouldUseCastSyntax = isSimpleArgument && (arg.includes('(') || arg.startsWith('-'));
2374+
2375+
if (!shouldUseCastSyntax) {
23752376
const cleanTypeName = typeName.replace('pg_catalog.', '');
2377+
// Wrap FuncCall arguments in parentheses to prevent operator precedence issues
2378+
if (isFunctionCall) {
2379+
return `${context.parens(arg)}::${cleanTypeName}`;
2380+
}
23762381
return `${arg}::${cleanTypeName}`;
23772382
}
23782383
}

0 commit comments

Comments
 (0)