diff --git a/__fixtures__/generated/generated.json b/__fixtures__/generated/generated.json index 982b01a3..93845863 100644 --- a/__fixtures__/generated/generated.json +++ b/__fixtures__/generated/generated.json @@ -21285,6 +21285,7 @@ "misc/issues-14.sql": "SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL)", "misc/issues-15.sql": "select \"A\" from \"table_name\"", "misc/issues-16.sql": "select \"AA\" from \"table_name\"", + "misc/issues-17.sql": "SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t", "misc/inflection-1.sql": "CREATE SCHEMA inflection", "misc/inflection-2.sql": "GRANT USAGE ON SCHEMA inflection TO PUBLIC", "misc/inflection-3.sql": "ALTER DEFAULT PRIVILEGES IN SCHEMA inflection \n GRANT EXECUTE ON FUNCTIONS TO PUBLIC", diff --git a/__fixtures__/kitchen-sink/misc/issues.sql b/__fixtures__/kitchen-sink/misc/issues.sql index 02e39944..d3806f4c 100644 --- a/__fixtures__/kitchen-sink/misc/issues.sql +++ b/__fixtures__/kitchen-sink/misc/issues.sql @@ -71,4 +71,7 @@ SELECT (1 IS NOT NULL) IS DISTINCT FROM (2 IS NOT NULL); -- https://github.com/launchql/pgsql-parser/issues/101 select "A" from "table_name"; -select "AA" from "table_name"; \ No newline at end of file +select "AA" from "table_name"; + +-- https://github.com/launchql/pgsql-parser/issues/217 +SELECT CAST(t.date AT TIME ZONE $$America/New_York$$ AS text)::date FROM tbl t; \ No newline at end of file diff --git a/packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts b/packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts index 76c7afd4..758a6d03 100644 --- a/packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts +++ b/packages/deparser/__tests__/kitchen-sink/misc-issues.test.ts @@ -19,6 +19,7 @@ it('misc-issues', async () => { "misc/issues-13.sql", "misc/issues-14.sql", "misc/issues-15.sql", - "misc/issues-16.sql" + "misc/issues-16.sql", + "misc/issues-17.sql" ]); }); diff --git a/packages/deparser/__tests__/misc/__snapshots__/pg-catalog.test.ts.snap b/packages/deparser/__tests__/misc/__snapshots__/pg-catalog.test.ts.snap index 0916aeb6..462d9f90 100644 --- a/packages/deparser/__tests__/misc/__snapshots__/pg-catalog.test.ts.snap +++ b/packages/deparser/__tests__/misc/__snapshots__/pg-catalog.test.ts.snap @@ -3,7 +3,7 @@ exports[`should format pg_catalog.char with pretty option enabled 1`] = ` "CREATE TABLE dashboard_jobs.jobs ( id bigserial PRIMARY KEY, - queue_name text DEFAULT public.gen_random_uuid()::text, + queue_name text DEFAULT (public.gen_random_uuid())::text, task_identifier text NOT NULL, payload pg_catalog.json DEFAULT '{}'::json NOT NULL, priority int DEFAULT 0 NOT NULL, diff --git a/packages/deparser/src/deparser.ts b/packages/deparser/src/deparser.ts index 16d3e884..011c0332 100644 --- a/packages/deparser/src/deparser.ts +++ b/packages/deparser/src/deparser.ts @@ -2255,9 +2255,14 @@ export class Deparser implements DeparserVisitor { if (isSimpleArgument || isFunctionCall) { // For simple arguments, avoid :: syntax if they have complex structure - if (isSimpleArgument && (arg.includes('(') || arg.startsWith('-'))) { - } else { + const shouldUseCastSyntax = isSimpleArgument && (arg.includes('(') || arg.startsWith('-')); + + if (!shouldUseCastSyntax) { const cleanTypeName = typeName.replace('pg_catalog.', ''); + // Wrap FuncCall arguments in parentheses to prevent operator precedence issues + if (isFunctionCall) { + return `(${arg})::${cleanTypeName}`; + } return `${arg}::${cleanTypeName}`; } }