diff --git a/__fixtures__/generated/generated.json b/__fixtures__/generated/generated.json index 6ebc1d5c..982b01a3 100644 --- a/__fixtures__/generated/generated.json +++ b/__fixtures__/generated/generated.json @@ -21237,6 +21237,19 @@ "misc/pg_catalog-15.sql": "SELECT array_agg(id) FROM (VALUES (1), (2), (3)) AS t(id)", "misc/pg_catalog-16.sql": "SELECT string_agg(name, ', ') FROM (VALUES ('Alice'), ('Bob'), ('Carol')) AS t(name)", "misc/pg_catalog-17.sql": "SELECT json_agg(name) FROM (VALUES ('A'), ('B')) AS t(name)", + "misc/pg_catalog-timestamp-etc-1.sql": "CREATE TABLE public.\"ACTIVITY\" (\n \"ACTIVITY_ID\" bigint NOT NULL,\n \"PUBLISHED\" timestamp(2) with time zone\n)", + "misc/pg_catalog-timestamp-etc-2.sql": "CREATE TABLE public.\"ACTIVITY\" (\n \"ACTIVITY_ID\" bigint NOT NULL,\n \"PUBLISHED\" timestamp(2)\n)", + "misc/pg_catalog-timestamp-etc-3.sql": "CREATE TABLE public.\"EXAMPLE\" (\n \"MESSAGE\" text\n)", + "misc/pg_catalog-timestamp-etc-4.sql": "CREATE TABLE public.\"EXAMPLE_TIME\" (\n \"START_TIME\" time\n)", + "misc/pg_catalog-timestamp-etc-5.sql": "CREATE TABLE public.\"EXAMPLE_TIMETZ\" (\n \"START_TIME\" time with time zone\n)", + "misc/pg_catalog-timestamp-etc-6.sql": "CREATE TABLE public.\"EXAMPLE_TIME_PRECISION\" (\n \"START_TIME\" time(3)\n)", + "misc/pg_catalog-timestamp-etc-7.sql": "CREATE TABLE public.\"EXAMPLE_TIMETZ_PRECISION\" (\n \"START_TIME\" time(3) with time zone\n)", + "misc/pg_catalog-timestamp-etc-8.sql": "CREATE TABLE public.\"EXAMPLE_TIMESTAMP\" (\n \"CREATED_AT\" timestamp\n)", + "misc/pg_catalog-timestamp-etc-9.sql": "CREATE TABLE public.\"EXAMPLE_TIMESTAMPTZ\" (\n \"CREATED_AT\" timestamp with time zone\n)", + "misc/pg_catalog-timestamp-etc-10.sql": "CREATE TABLE public.\"EXAMPLE_INTERVAL\" (\n \"DURATION\" interval\n)", + "misc/pg_catalog-timestamp-etc-11.sql": "CREATE TABLE public.\"EXAMPLE_INTERVAL_PRECISION\" (\n \"DURATION\" interval(2)\n)", + "misc/pg_catalog-timestamp-etc-12.sql": "CREATE TABLE public.\"EXAMPLE_DATE\" (\n \"BIRTHDAY\" date\n)", + "misc/pg_catalog-timestamp-etc-13.sql": "CREATE TABLE public.\"EXAMPLE_BOOL\" (\n \"IS_ACTIVE\" boolean\n)", "misc/launchql-ext-types-1.sql": "CREATE DOMAIN attachment AS jsonb CHECK ( value ?& ARRAY['url', 'mime'] AND (value->>'url') ~ '^(https?)://[^\\s/$.?#].[^\\s]*$' )", "misc/launchql-ext-types-2.sql": "COMMENT ON DOMAIN attachment IS E'@name launchqlInternalTypeAttachment'", "misc/launchql-ext-types-3.sql": "CREATE DOMAIN email AS citext CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' )", diff --git a/__fixtures__/kitchen-sink/misc/pg_catalog-timestamp-etc.sql b/__fixtures__/kitchen-sink/misc/pg_catalog-timestamp-etc.sql new file mode 100644 index 00000000..37f7abc6 --- /dev/null +++ b/__fixtures__/kitchen-sink/misc/pg_catalog-timestamp-etc.sql @@ -0,0 +1,66 @@ +-- timestamp(2) with time zone +CREATE TABLE public."ACTIVITY" ( + "ACTIVITY_ID" bigint NOT NULL, + "PUBLISHED" timestamp(2) with time zone +); + +-- timestamp(2) +CREATE TABLE public."ACTIVITY" ( + "ACTIVITY_ID" bigint NOT NULL, + "PUBLISHED" timestamp(2) +); + +-- text +CREATE TABLE public."EXAMPLE" ( + "MESSAGE" text +); + +-- TIME WITHOUT TIME ZONE +CREATE TABLE public."EXAMPLE_TIME" ( + "START_TIME" time +); + +-- TIME WITH TIME ZONE (aka timetz) +CREATE TABLE public."EXAMPLE_TIMETZ" ( + "START_TIME" time with time zone +); + +-- TIME(n) WITHOUT TIME ZONE +CREATE TABLE public."EXAMPLE_TIME_PRECISION" ( + "START_TIME" time(3) +); + +-- TIME(n) WITH TIME ZONE (aka timetz(n)) +CREATE TABLE public."EXAMPLE_TIMETZ_PRECISION" ( + "START_TIME" time(3) with time zone +); + +-- TIMESTAMP WITHOUT TIME ZONE (alias of timestamp) +CREATE TABLE public."EXAMPLE_TIMESTAMP" ( + "CREATED_AT" timestamp +); + +-- TIMESTAMP WITH TIME ZONE (alias of timestamptz) +CREATE TABLE public."EXAMPLE_TIMESTAMPTZ" ( + "CREATED_AT" timestamp with time zone +); + +-- INTERVAL +CREATE TABLE public."EXAMPLE_INTERVAL" ( + "DURATION" interval +); + +-- INTERVAL with precision +CREATE TABLE public."EXAMPLE_INTERVAL_PRECISION" ( + "DURATION" interval(2) +); + +-- DATE +CREATE TABLE public."EXAMPLE_DATE" ( + "BIRTHDAY" date +); + +-- BOOLEAN +CREATE TABLE public."EXAMPLE_BOOL" ( + "IS_ACTIVE" boolean +); diff --git a/packages/deparser/__tests__/kitchen-sink/misc-pg_catalog-timestamp-etc.test.ts b/packages/deparser/__tests__/kitchen-sink/misc-pg_catalog-timestamp-etc.test.ts new file mode 100644 index 00000000..b8828381 --- /dev/null +++ b/packages/deparser/__tests__/kitchen-sink/misc-pg_catalog-timestamp-etc.test.ts @@ -0,0 +1,21 @@ + +import { FixtureTestUtils } from '../../test-utils'; +const fixtures = new FixtureTestUtils(); + +it('misc-pg_catalog-timestamp-etc', async () => { + await fixtures.runFixtureTests([ + "misc/pg_catalog-timestamp-etc-1.sql", + "misc/pg_catalog-timestamp-etc-2.sql", + "misc/pg_catalog-timestamp-etc-3.sql", + "misc/pg_catalog-timestamp-etc-4.sql", + "misc/pg_catalog-timestamp-etc-5.sql", + "misc/pg_catalog-timestamp-etc-6.sql", + "misc/pg_catalog-timestamp-etc-7.sql", + "misc/pg_catalog-timestamp-etc-8.sql", + "misc/pg_catalog-timestamp-etc-9.sql", + "misc/pg_catalog-timestamp-etc-10.sql", + "misc/pg_catalog-timestamp-etc-11.sql", + "misc/pg_catalog-timestamp-etc-12.sql", + "misc/pg_catalog-timestamp-etc-13.sql" +]); +}); diff --git a/packages/deparser/__tests__/pretty/__snapshots__/constraints-pretty.test.ts.snap b/packages/deparser/__tests__/pretty/__snapshots__/constraints-pretty.test.ts.snap index fcb5d85d..9d28168f 100644 --- a/packages/deparser/__tests__/pretty/__snapshots__/constraints-pretty.test.ts.snap +++ b/packages/deparser/__tests__/pretty/__snapshots__/constraints-pretty.test.ts.snap @@ -20,7 +20,7 @@ exports[`non-pretty: pretty/constraints-9.sql 1`] = `"ALTER TABLE finance.transa exports[`non-pretty: pretty/constraints-10.sql 1`] = `"ALTER TABLE school.enrollments ADD CONSTRAINT fk_student_course FOREIGN KEY (student_id, course_id) REFERENCES school.courses_students (student_id, course_id)"`; -exports[`non-pretty: pretty/constraints-11.sql 1`] = `"CREATE TABLE orders (id serial PRIMARY KEY, user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', created_at pg_catalog.timestamp DEFAULT now(), CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, CONSTRAINT unique_user_date UNIQUE (user_id, created_at), CONSTRAINT check_status CHECK (status IN ('pending', 'completed', 'cancelled')))"`; +exports[`non-pretty: pretty/constraints-11.sql 1`] = `"CREATE TABLE orders (id serial PRIMARY KEY, user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', created_at timestamp DEFAULT now(), CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, CONSTRAINT unique_user_date UNIQUE (user_id, created_at), CONSTRAINT check_status CHECK (status IN ('pending', 'completed', 'cancelled')))"`; exports[`non-pretty: pretty/constraints-12.sql 1`] = `"ALTER TABLE products ADD CONSTRAINT fk_category FOREIGN KEY (category_id) REFERENCES categories (id) ON UPDATE CASCADE ON DELETE SET NULL DEFERRABLE INITIALLY DEFERRED"`; @@ -104,7 +104,7 @@ exports[`pretty: pretty/constraints-11.sql 1`] = ` user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', - created_at pg_catalog.timestamp DEFAULT now(), + created_at timestamp DEFAULT now(), CONSTRAINT fk_user FOREIGN KEY(user_id) REFERENCES users (id) diff --git a/packages/deparser/__tests__/pretty/__snapshots__/create-table-pretty.test.ts.snap b/packages/deparser/__tests__/pretty/__snapshots__/create-table-pretty.test.ts.snap index f555172e..8daad5ae 100644 --- a/packages/deparser/__tests__/pretty/__snapshots__/create-table-pretty.test.ts.snap +++ b/packages/deparser/__tests__/pretty/__snapshots__/create-table-pretty.test.ts.snap @@ -2,7 +2,7 @@ exports[`non-pretty: pretty/create_table-1.sql 1`] = `"CREATE TABLE users (id serial PRIMARY KEY, name text NOT NULL, email text UNIQUE)"`; -exports[`non-pretty: pretty/create_table-2.sql 1`] = `"CREATE TABLE products (id serial PRIMARY KEY, name varchar(255) NOT NULL, price numeric(10, 2) CHECK (price > 0), category_id int, description text, created_at pg_catalog.timestamp DEFAULT now(), updated_at pg_catalog.timestamp, UNIQUE (name, category_id), FOREIGN KEY (category_id) REFERENCES categories (id))"`; +exports[`non-pretty: pretty/create_table-2.sql 1`] = `"CREATE TABLE products (id serial PRIMARY KEY, name varchar(255) NOT NULL, price numeric(10, 2) CHECK (price > 0), category_id int, description text, created_at timestamp DEFAULT now(), updated_at timestamp, UNIQUE (name, category_id), FOREIGN KEY (category_id) REFERENCES categories (id))"`; exports[`non-pretty: pretty/create_table-3.sql 1`] = `"CREATE TABLE orders (id serial PRIMARY KEY, subtotal numeric(10, 2) NOT NULL, tax_rate numeric(5, 4) DEFAULT 0.0825, tax_amount numeric(10, 2) GENERATED ALWAYS AS (subtotal * tax_rate) STORED, total numeric(10, 2) GENERATED ALWAYS AS (subtotal + tax_amount) STORED)"`; @@ -10,7 +10,7 @@ exports[`non-pretty: pretty/create_table-4.sql 1`] = `"CREATE TABLE sales (id se exports[`non-pretty: pretty/create_table-5.sql 1`] = `"CREATE TEMPORARY TABLE temp_calculations (id int, value numeric(15, 5), result text)"`; -exports[`non-pretty: pretty/create_table-6.sql 1`] = `"CREATE TABLE orders (id serial PRIMARY KEY, user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', created_at pg_catalog.timestamp DEFAULT now(), FOREIGN KEY (user_id) REFERENCES users (id))"`; +exports[`non-pretty: pretty/create_table-6.sql 1`] = `"CREATE TABLE orders (id serial PRIMARY KEY, user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', created_at timestamp DEFAULT now(), FOREIGN KEY (user_id) REFERENCES users (id))"`; exports[`pretty: pretty/create_table-1.sql 1`] = ` "CREATE TABLE users ( @@ -27,8 +27,8 @@ exports[`pretty: pretty/create_table-2.sql 1`] = ` price numeric(10, 2) CHECK (price > 0), category_id int, description text, - created_at pg_catalog.timestamp DEFAULT now(), - updated_at pg_catalog.timestamp, + created_at timestamp DEFAULT now(), + updated_at timestamp, UNIQUE (name, category_id), FOREIGN KEY(category_id) REFERENCES categories (id) @@ -68,7 +68,7 @@ exports[`pretty: pretty/create_table-6.sql 1`] = ` user_id int NOT NULL, total numeric(10, 2) CHECK (total > 0), status varchar(20) DEFAULT 'pending', - created_at pg_catalog.timestamp DEFAULT now(), + created_at timestamp DEFAULT now(), FOREIGN KEY(user_id) REFERENCES users (id) )" diff --git a/packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap b/packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap index 8811ecb9..71ed4c55 100644 --- a/packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap +++ b/packages/deparser/__tests__/pretty/__snapshots__/misc-pretty.test.ts.snap @@ -8,7 +8,7 @@ exports[`non-pretty: pretty/misc-3.sql 1`] = `"SELECT u.id, u.name, j.key, j.val exports[`non-pretty: pretty/misc-4.sql 1`] = `"SELECT p.id, p.title, CASE WHEN EXISTS (SELECT 1 FROM reviews AS r WHERE r.product_id = p.id AND r.rating >= 4) THEN 'Popular' ELSE 'Unrated' END AS status FROM products AS p WHERE p.archived = false"`; -exports[`non-pretty: pretty/misc-5.sql 1`] = `"WITH logs AS (SELECT id, payload::json ->> 'event' AS event, CAST(payload::json ->> 'ts' AS pg_catalog.timestamp) AS ts FROM event_log WHERE ts > (now() - '7 days'::interval)) SELECT event, count(*) AS freq FROM ( SELECT DISTINCT event, ts::date AS event_day FROM logs ) AS d GROUP BY event ORDER BY freq DESC"`; +exports[`non-pretty: pretty/misc-5.sql 1`] = `"WITH logs AS (SELECT id, payload::json ->> 'event' AS event, CAST(payload::json ->> 'ts' AS timestamp) AS ts FROM event_log WHERE ts > (now() - '7 days'::interval)) SELECT event, count(*) AS freq FROM ( SELECT DISTINCT event, ts::date AS event_day FROM logs ) AS d GROUP BY event ORDER BY freq DESC"`; exports[`non-pretty: pretty/misc-6.sql 1`] = `"SELECT o.id AS order_id, u.name AS user_name, p.name AS product_name, s.status, sh.shipped_at, r.refund_amount FROM orders AS o JOIN users AS u ON o.user_id = u.id JOIN order_items AS oi ON oi.order_id = o.id JOIN products AS p ON (p.id = oi.product_id AND p.available = true) OR (p.sku = oi.product_sku AND (p.discontinued = false OR p.replacement_id IS NOT NULL)) LEFT JOIN shipping AS sh ON sh.order_id = o.id AND ((sh.carrier = 'UPS' AND sh.tracking_number IS NOT NULL) OR (sh.carrier = 'FedEx' AND sh.shipped_at > (o.created_at + '1 day'::interval))) LEFT JOIN statuses AS s ON s.id = o.status_id AND (s.name <> 'cancelled' OR (s.name = 'cancelled' AND s.updated_at > (now() - '7 days'::interval))) LEFT JOIN refunds AS r ON r.order_id = o.id AND ((r.status = 'approved' AND r.processed_at IS NOT NULL) OR (r.status = 'pending' AND r.requested_at < (now() - '14 days'::interval))) WHERE o.created_at > (now() - '90 days'::interval) AND u.active = true AND (s.status = 'shipped' OR (s.status = 'processing' AND EXISTS (SELECT 1 FROM order_notes AS n WHERE (n.order_id = o.id AND n.note ILIKE '%expedite%')))) ORDER BY o.created_at DESC"`; @@ -109,7 +109,7 @@ exports[`pretty: pretty/misc-5.sql 1`] = ` logs AS (SELECT id, payload::json ->> 'event' AS event, - CAST(payload::json ->> 'ts' AS pg_catalog.timestamp) AS ts + CAST(payload::json ->> 'ts' AS timestamp) AS ts FROM event_log WHERE ts > (now() - '7 days'::interval)) diff --git a/packages/deparser/__tests__/pretty/__snapshots__/pg-catalog.test.ts.snap b/packages/deparser/__tests__/pretty/__snapshots__/pg-catalog.test.ts.snap new file mode 100644 index 00000000..792e550c --- /dev/null +++ b/packages/deparser/__tests__/pretty/__snapshots__/pg-catalog.test.ts.snap @@ -0,0 +1,200 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`non-pretty: misc/pg_catalog-1.sql 1`] = `"SELECT pg_catalog.json_object('{}')"`; + +exports[`non-pretty: misc/pg_catalog-2.sql 1`] = `"SELECT * FROM generate_series(1, 5)"`; + +exports[`non-pretty: misc/pg_catalog-3.sql 1`] = `"SELECT get_byte('\\xDEADBEEF'::bytea, 1)"`; + +exports[`non-pretty: misc/pg_catalog-4.sql 1`] = `"SELECT now()"`; + +exports[`non-pretty: misc/pg_catalog-5.sql 1`] = `"SELECT clock_timestamp()"`; + +exports[`non-pretty: misc/pg_catalog-6.sql 1`] = `"SELECT to_char(now(), 'YYYY-MM-DD HH24:MI:SS')"`; + +exports[`non-pretty: misc/pg_catalog-7.sql 1`] = `"SELECT json_build_object('name', 'Alice', 'age', 30)"`; + +exports[`non-pretty: misc/pg_catalog-8.sql 1`] = `"SELECT pg_typeof(42), pg_typeof('hello'), pg_typeof(now())"`; + +exports[`non-pretty: misc/pg_catalog-9.sql 1`] = `"SELECT SUBSTRING('abcdefg' FROM 2 FOR 3)"`; + +exports[`non-pretty: misc/pg_catalog-10.sql 1`] = `"SELECT replace('hello world', 'l', 'L')"`; + +exports[`non-pretty: misc/pg_catalog-11.sql 1`] = `"SELECT length('yolo')"`; + +exports[`non-pretty: misc/pg_catalog-12.sql 1`] = `"SELECT POSITION('G' IN 'ChatGPT')"`; + +exports[`non-pretty: misc/pg_catalog-13.sql 1`] = `"SELECT TRIM(BOTH FROM ' padded text ')"`; + +exports[`non-pretty: misc/pg_catalog-14.sql 1`] = `"SELECT ltrim('---abc', '-')"`; + +exports[`non-pretty: misc/pg_catalog-15.sql 1`] = `"SELECT array_agg(id) FROM ( VALUES (1), (2), (3) ) AS t(id)"`; + +exports[`non-pretty: misc/pg_catalog-16.sql 1`] = `"SELECT string_agg(name, ', ') FROM ( VALUES ('Alice'), ('Bob'), ('Carol') ) AS t(name)"`; + +exports[`non-pretty: misc/pg_catalog-17.sql 1`] = `"SELECT json_agg(name) FROM ( VALUES ('A'), ('B') ) AS t(name)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-1.sql 1`] = `"CREATE TABLE public."ACTIVITY" ("ACTIVITY_ID" bigint NOT NULL, "PUBLISHED" timestamp(2) with time zone)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-2.sql 1`] = `"CREATE TABLE public."ACTIVITY" ("ACTIVITY_ID" bigint NOT NULL, "PUBLISHED" timestamp(2))"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-3.sql 1`] = `"CREATE TABLE public."EXAMPLE" ("MESSAGE" text)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-4.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIME" ("START_TIME" time)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-5.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIMETZ" ("START_TIME" time with time zone)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-6.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIME_PRECISION" ("START_TIME" time(3))"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-7.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIMETZ_PRECISION" ("START_TIME" time(3) with time zone)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-8.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIMESTAMP" ("CREATED_AT" timestamp)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-9.sql 1`] = `"CREATE TABLE public."EXAMPLE_TIMESTAMPTZ" ("CREATED_AT" timestamp with time zone)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-10.sql 1`] = `"CREATE TABLE public."EXAMPLE_INTERVAL" ("DURATION" interval)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-11.sql 1`] = `"CREATE TABLE public."EXAMPLE_INTERVAL_PRECISION" ("DURATION" interval(2))"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-12.sql 1`] = `"CREATE TABLE public."EXAMPLE_DATE" ("BIRTHDAY" date)"`; + +exports[`non-pretty: misc/pg_catalog-timestamp-etc-13.sql 1`] = `"CREATE TABLE public."EXAMPLE_BOOL" ("IS_ACTIVE" boolean)"`; + +exports[`pretty: misc/pg_catalog-1.sql 1`] = `"SELECT pg_catalog.json_object('{}')"`; + +exports[`pretty: misc/pg_catalog-2.sql 1`] = ` +"SELECT * +FROM generate_series(1, 5)" +`; + +exports[`pretty: misc/pg_catalog-3.sql 1`] = `"SELECT get_byte('\\xDEADBEEF'::bytea, 1)"`; + +exports[`pretty: misc/pg_catalog-4.sql 1`] = `"SELECT now()"`; + +exports[`pretty: misc/pg_catalog-5.sql 1`] = `"SELECT clock_timestamp()"`; + +exports[`pretty: misc/pg_catalog-6.sql 1`] = `"SELECT to_char(now(), 'YYYY-MM-DD HH24:MI:SS')"`; + +exports[`pretty: misc/pg_catalog-7.sql 1`] = `"SELECT json_build_object('name', 'Alice', 'age', 30)"`; + +exports[`pretty: misc/pg_catalog-8.sql 1`] = ` +"SELECT + pg_typeof(42), + pg_typeof('hello'), + pg_typeof(now())" +`; + +exports[`pretty: misc/pg_catalog-9.sql 1`] = `"SELECT SUBSTRING('abcdefg' FROM 2 FOR 3)"`; + +exports[`pretty: misc/pg_catalog-10.sql 1`] = `"SELECT replace('hello world', 'l', 'L')"`; + +exports[`pretty: misc/pg_catalog-11.sql 1`] = `"SELECT length('yolo')"`; + +exports[`pretty: misc/pg_catalog-12.sql 1`] = `"SELECT POSITION('G' IN 'ChatGPT')"`; + +exports[`pretty: misc/pg_catalog-13.sql 1`] = `"SELECT TRIM(BOTH FROM ' padded text ')"`; + +exports[`pretty: misc/pg_catalog-14.sql 1`] = `"SELECT ltrim('---abc', '-')"`; + +exports[`pretty: misc/pg_catalog-15.sql 1`] = ` +"SELECT array_agg(id) +FROM ( VALUES + (1), + (2), + (3) ) AS t(id)" +`; + +exports[`pretty: misc/pg_catalog-16.sql 1`] = ` +"SELECT string_agg(name, ', ') +FROM ( VALUES + ('Alice'), + ('Bob'), + ('Carol') ) AS t(name)" +`; + +exports[`pretty: misc/pg_catalog-17.sql 1`] = ` +"SELECT json_agg(name) +FROM ( VALUES + ('A'), + ('B') ) AS t(name)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-1.sql 1`] = ` +"CREATE TABLE public."ACTIVITY" ( + "ACTIVITY_ID" bigint NOT NULL, + "PUBLISHED" timestamp(2) with time zone +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-2.sql 1`] = ` +"CREATE TABLE public."ACTIVITY" ( + "ACTIVITY_ID" bigint NOT NULL, + "PUBLISHED" timestamp(2) +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-3.sql 1`] = ` +"CREATE TABLE public."EXAMPLE" ( + "MESSAGE" text +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-4.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIME" ( + "START_TIME" time +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-5.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIMETZ" ( + "START_TIME" time with time zone +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-6.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIME_PRECISION" ( + "START_TIME" time(3) +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-7.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIMETZ_PRECISION" ( + "START_TIME" time(3) with time zone +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-8.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIMESTAMP" ( + "CREATED_AT" timestamp +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-9.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_TIMESTAMPTZ" ( + "CREATED_AT" timestamp with time zone +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-10.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_INTERVAL" ( + "DURATION" interval +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-11.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_INTERVAL_PRECISION" ( + "DURATION" interval(2) +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-12.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_DATE" ( + "BIRTHDAY" date +)" +`; + +exports[`pretty: misc/pg_catalog-timestamp-etc-13.sql 1`] = ` +"CREATE TABLE public."EXAMPLE_BOOL" ( + "IS_ACTIVE" boolean +)" +`; diff --git a/packages/deparser/__tests__/pretty/pg-catalog.test.ts b/packages/deparser/__tests__/pretty/pg-catalog.test.ts new file mode 100644 index 00000000..b29c9730 --- /dev/null +++ b/packages/deparser/__tests__/pretty/pg-catalog.test.ts @@ -0,0 +1,36 @@ +import { PrettyTest } from '../../test-utils/PrettyTest'; +const prettyTest = new PrettyTest([ + "misc/pg_catalog-timestamp-etc-1.sql", + "misc/pg_catalog-timestamp-etc-2.sql", + "misc/pg_catalog-timestamp-etc-3.sql", + "misc/pg_catalog-timestamp-etc-4.sql", + "misc/pg_catalog-timestamp-etc-5.sql", + "misc/pg_catalog-timestamp-etc-6.sql", + "misc/pg_catalog-timestamp-etc-7.sql", + "misc/pg_catalog-timestamp-etc-8.sql", + "misc/pg_catalog-timestamp-etc-9.sql", + "misc/pg_catalog-timestamp-etc-10.sql", + "misc/pg_catalog-timestamp-etc-11.sql", + "misc/pg_catalog-timestamp-etc-12.sql", + "misc/pg_catalog-timestamp-etc-13.sql", + /// + "misc/pg_catalog-1.sql", + "misc/pg_catalog-2.sql", + "misc/pg_catalog-3.sql", + "misc/pg_catalog-4.sql", + "misc/pg_catalog-5.sql", + "misc/pg_catalog-6.sql", + "misc/pg_catalog-7.sql", + "misc/pg_catalog-8.sql", + "misc/pg_catalog-9.sql", + "misc/pg_catalog-10.sql", + "misc/pg_catalog-11.sql", + "misc/pg_catalog-12.sql", + "misc/pg_catalog-13.sql", + "misc/pg_catalog-14.sql", + "misc/pg_catalog-15.sql", + "misc/pg_catalog-16.sql", + "misc/pg_catalog-17.sql" +]); + +prettyTest.generateTests(); diff --git a/packages/deparser/src/deparser.ts b/packages/deparser/src/deparser.ts index 09e80619..ec63da90 100644 --- a/packages/deparser/src/deparser.ts +++ b/packages/deparser/src/deparser.ts @@ -1830,6 +1830,20 @@ export class Deparser implements DeparserVisitor { } else { typeName = 'time with time zone'; } + } else if (type === 'timestamp') { + if (args) { + typeName = `timestamp(${args})`; + args = null; // Don't apply args again in mods() + } else { + typeName = 'timestamp'; + } + } else if (type === 'time') { + if (args) { + typeName = `time(${args})`; + args = null; // Don't apply args again in mods() + } else { + typeName = 'time'; + } } let result = mods(typeName, args);