Skip to content

Commit 20649be

Browse files
committed
fix(deparser): PG18 regress round-trip sweep fixes
Window frame bitmask decoding, publication/subscription stmts, CTE SEARCH/CYCLE, INSERT OVERRIDING, COPY options, GRANT/REVOKE role options + GRANTED BY, identity column alterations, STORAGE/COMPRESSION, PARTITION OF column options, hash MODULUS/REMAINDER 0, CTAS WITH placement, SQL/JSON constructors/aggregates, multi-column MERGE UPDATE, deferred EXCLUDE, DEFAULT b_expr parens, COMMENT ON CONSTRAINT ... ON DOMAIN.
1 parent d8a34a6 commit 20649be

22 files changed

Lines changed: 1295 additions & 327 deletions

__fixtures__/generated/generated.json

Lines changed: 215 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-- COPY direction, targets and option quoting
2+
COPY t TO STDOUT;
3+
COPY t FROM STDIN;
4+
COPY (SELECT * FROM t ORDER BY a) TO STDOUT WITH DELIMITER ',';
5+
COPY t TO STDOUT WITH (FORMAT csv, QUOTE '''', DELIMITER '|');
6+
COPY t TO STDOUT WITH (FORMAT csv, FORCE_QUOTE (a, b), ESCAPE E'\\');
7+
COPY t TO STDOUT WITH (FORMAT csv, FORCE_QUOTE *);
8+
COPY t FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL (a), FORCE_NULL (b, c));
9+
COPY t FROM STDIN WITH (FORMAT csv, FORCE_NOT_NULL *, FORCE_NULL *);
10+
COPY t FROM STDIN WITH (FORMAT text, DELIMITER ';', NULL '\N', DEFAULT '\D', ENCODING 'sql_ascii');
11+
COPY t FROM STDIN WITH (FORMAT binary);
12+
COPY t FROM STDIN WITH (HEADER match);
13+
COPY t FROM STDIN WITH (HEADER true, ON_ERROR ignore, LOG_VERBOSITY verbose);
14+
COPY t FROM STDIN WITH (FREEZE);
15+
COPY t FROM STDIN WITH (REJECT_LIMIT 5);
16+
COPY t (a, b) TO 'file.csv' WITH (FORMAT csv, HEADER);
17+
COPY t FROM PROGRAM 'gunzip < file.gz' WITH (FORMAT text);
18+
COPY t TO PROGRAM 'gzip > file.gz';
19+
COPY t FROM 'it''s.csv';
20+
COPY t FROM STDIN WHERE a > 0;
21+
COPY t FROM STDIN WITH NULL AS 'I''m null';
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
-- CTE SEARCH / CYCLE clauses
2+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) SEARCH DEPTH FIRST BY f, t SET seq SELECT * FROM graph;
3+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) SEARCH BREADTH FIRST BY f, t SET seq SELECT * FROM graph;
4+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) CYCLE f, t SET is_cycle USING path SELECT * FROM graph;
5+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) CYCLE f, t SET is_cycle TO 'Y' DEFAULT 'N' USING path SELECT * FROM graph;
6+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) CYCLE f, t SET is_cycle TO point '(1,1)' DEFAULT point '(0,0)' USING path SELECT * FROM graph;
7+
WITH RECURSIVE graph(f, t, label) AS (SELECT 1, 2, 'a' UNION ALL SELECT g.f, g.t, g.label FROM graph g) SEARCH DEPTH FIRST BY f, t SET seq CYCLE f, t SET is_cycle USING path SELECT * FROM graph;
8+
-- INSERT OVERRIDING
9+
INSERT INTO itest1 OVERRIDING USER VALUE VALUES (10, 'xyz');
10+
INSERT INTO itest1 (a, b) OVERRIDING SYSTEM VALUE VALUES (10, 'xyz');
11+
INSERT INTO itest1 OVERRIDING SYSTEM VALUE SELECT * FROM itest2;
12+
MERGE INTO tgt t USING src s ON t.a = s.a WHEN NOT MATCHED THEN INSERT (a) OVERRIDING SYSTEM VALUE VALUES (s.a);
13+
-- multi-column assignment in MERGE
14+
MERGE INTO tgt t USING src s ON t.a = s.a WHEN MATCHED THEN UPDATE SET (b, c) = (SELECT s.b, s.c);
15+
MERGE INTO tgt t USING src s ON t.a = s.a WHEN MATCHED THEN UPDATE SET (b, c) = (s.b, s.c), d = 1;
16+
UPDATE tgt SET (b, c) = (SELECT 1, 2), d = 3;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
-- GRANT/REVOKE role membership options, GRANTED BY, CASCADE
2+
GRANT regress_role1 TO regress_role2;
3+
GRANT regress_role1 TO regress_role2 WITH ADMIN OPTION;
4+
GRANT regress_role1 TO regress_role2 WITH ADMIN OPTION GRANTED BY regress_role3;
5+
GRANT regress_role1 TO regress_role2 GRANTED BY CURRENT_ROLE;
6+
GRANT regress_role1 TO regress_role2 GRANTED BY CURRENT_USER;
7+
GRANT regress_role1 TO regress_role2 WITH INHERIT FALSE, ADMIN TRUE;
8+
GRANT regress_role1 TO regress_role2 WITH INHERIT OPTION, SET FALSE;
9+
GRANT regress_role1 TO regress_role2 WITH SET TRUE GRANTED BY regress_role3;
10+
GRANT "Mixed_Case_Role" TO regress_role2;
11+
REVOKE regress_role1 FROM regress_role2;
12+
REVOKE regress_role1 FROM regress_role2 CASCADE;
13+
REVOKE ADMIN OPTION FOR regress_role1 FROM regress_role2;
14+
REVOKE ADMIN OPTION FOR regress_role1 FROM regress_role2 GRANTED BY regress_role3 CASCADE;
15+
REVOKE INHERIT OPTION FOR regress_role1 FROM regress_role2;
16+
REVOKE SET OPTION FOR regress_role1 FROM regress_role2;
17+
REVOKE regress_role1 FROM regress_role2 GRANTED BY CURRENT_ROLE;
18+
-- GRANTED BY on object privileges
19+
GRANT INSERT ON t TO regress_role2 GRANTED BY CURRENT_USER;
20+
GRANT TRUNCATE ON t TO regress_role2 GRANTED BY regress_role3;
21+
REVOKE SELECT ON t FROM regress_role2 GRANTED BY CURRENT_ROLE;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- Identity column alterations
2+
ALTER TABLE itest ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;
3+
ALTER TABLE itest ALTER COLUMN a ADD GENERATED BY DEFAULT AS IDENTITY (START WITH 10 INCREMENT BY 2);
4+
ALTER TABLE itest ALTER COLUMN a SET GENERATED ALWAYS;
5+
ALTER TABLE itest ALTER COLUMN a SET GENERATED BY DEFAULT;
6+
ALTER TABLE itest ALTER COLUMN a SET GENERATED BY DEFAULT SET INCREMENT BY 2 SET START WITH 100 RESTART;
7+
ALTER TABLE itest ALTER COLUMN a RESTART;
8+
ALTER TABLE itest ALTER COLUMN a RESTART WITH 1000;
9+
ALTER TABLE itest ALTER COLUMN a SET INCREMENT BY 5 SET MINVALUE 1 SET MAXVALUE 100 SET CACHE 10 SET CYCLE;
10+
ALTER TABLE itest ALTER COLUMN a SET NO MINVALUE SET NO MAXVALUE SET NO CYCLE;
11+
ALTER TABLE itest ALTER COLUMN a DROP IDENTITY;
12+
ALTER TABLE itest ALTER COLUMN a DROP IDENTITY IF EXISTS;
13+
ALTER SEQUENCE itest_a_seq OWNED BY NONE;
14+
ALTER SEQUENCE itest_a_seq OWNED BY itest.a;
15+
-- column STORAGE / COMPRESSION in CREATE TABLE
16+
CREATE TABLE test_storage (a text, c text STORAGE plain);
17+
CREATE TABLE test_storage (a text, b int STORAGE extended, c text STORAGE external, d text STORAGE main);
18+
CREATE TABLE test_compression (a text COMPRESSION lz4, b text COMPRESSION pglz);
19+
CREATE TABLE test_compression (a text STORAGE external COMPRESSION lz4 NOT NULL);
20+
-- ALTER COLUMN TYPE with COLLATE
21+
ALTER TABLE t ALTER b TYPE char(2) COLLATE "POSIX";
22+
ALTER TABLE t ALTER COLUMN b TYPE text COLLATE "C" USING b::text;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
-- COMMENT ON CONSTRAINT ... ON DOMAIN
2+
COMMENT ON CONSTRAINT the_constraint ON DOMAIN constraint_comments_dom IS 'yes, another comment';
3+
COMMENT ON CONSTRAINT the_constraint ON DOMAIN s.constraint_comments_dom IS NULL;
4+
COMMENT ON CONSTRAINT the_constraint ON constraint_comments_tbl IS 'table constraint';
5+
-- DEFAULT needs parens around non-b_expr expressions
6+
CREATE TABLE error_tbl (b1 bool DEFAULT (1 IN (1, 2)));
7+
CREATE TABLE error_tbl (b1 bool DEFAULT (true AND false));
8+
CREATE TABLE error_tbl (b1 bool DEFAULT ('a' LIKE 'a%'));
9+
CREATE TABLE error_tbl (b1 bool DEFAULT (1 BETWEEN 0 AND 2));
10+
CREATE TABLE error_tbl (b1 bool DEFAULT (1 = ANY (ARRAY[1, 2])));
11+
CREATE TABLE error_tbl (b1 int DEFAULT 1 + 2);
12+
CREATE TABLE error_tbl (b1 bool DEFAULT 1 IS DISTINCT FROM 2);
13+
ALTER TABLE error_tbl ALTER COLUMN b1 SET DEFAULT (1 IN (1, 2));
14+
-- EXCLUDE constraint deferrability
15+
CREATE TABLE deferred_excl (f1 int, f2 int, CONSTRAINT deferred_excl_con EXCLUDE (f1 WITH =) INITIALLY DEFERRED);
16+
CREATE TABLE deferred_excl (f1 int, CONSTRAINT deferred_excl_con EXCLUDE (f1 WITH =) DEFERRABLE INITIALLY DEFERRED);
17+
CREATE TABLE deferred_excl (f1 int, CONSTRAINT deferred_excl_con EXCLUDE USING gist (f1 WITH =) NOT DEFERRABLE);
18+
ALTER TABLE deferred_excl ADD CONSTRAINT deferred_excl_con2 EXCLUDE (f1 WITH =) DEFERRABLE INITIALLY IMMEDIATE;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-- PARTITION OF with column options and hash bounds
2+
CREATE TABLE p1 PARTITION OF parent (f3 WITH OPTIONS GENERATED ALWAYS AS IDENTITY) FOR VALUES FROM ('2016-11-01') TO ('2016-12-01');
3+
CREATE TABLE p1 PARTITION OF parent (a NOT NULL, b DEFAULT 1, CONSTRAINT p1_chk CHECK (a > 0)) FOR VALUES IN (1, 2);
4+
CREATE TABLE p1 PARTITION OF parent FOR VALUES WITH (MODULUS 2, REMAINDER 0);
5+
CREATE TABLE p1 PARTITION OF parent FOR VALUES WITH (MODULUS 4, REMAINDER 3);
6+
CREATE TABLE p1 PARTITION OF parent (a WITH OPTIONS NOT NULL) FOR VALUES WITH (MODULUS 2, REMAINDER 1);
7+
CREATE TABLE p1 PARTITION OF parent DEFAULT;
8+
CREATE TABLE p1 PARTITION OF parent (a NOT NULL) DEFAULT;
9+
CREATE TABLE p1 PARTITION OF parent FOR VALUES FROM (MINVALUE) TO (MAXVALUE) PARTITION BY HASH (b);
10+
ALTER TABLE parent ATTACH PARTITION p1 FOR VALUES WITH (MODULUS 2, REMAINDER 0);
11+
ALTER TABLE parent ATTACH PARTITION p1 DEFAULT;
12+
-- CREATE TABLE AS option placement/quoting
13+
CREATE TABLE tas_case WITH ("Fillfactor" = 10) AS SELECT 1 a;
14+
CREATE TABLE tas WITH (fillfactor = 10, autovacuum_enabled = false) AS SELECT 1 a;
15+
CREATE TEMP TABLE tas ON COMMIT DROP AS SELECT 1 a;
16+
CREATE TABLE tas (x, y) WITH (fillfactor = 50) TABLESPACE pg_default AS SELECT 1, 2 WITH NO DATA;
17+
CREATE TABLE tas USING heap WITH (fillfactor = 50) AS SELECT 1 a;
18+
CREATE MATERIALIZED VIEW mv WITH (fillfactor = 50) AS SELECT 1 a WITH NO DATA;
19+
-- reloption quoting in CREATE TABLE
20+
CREATE TABLE t (a int) WITH ("Fillfactor" = 10, toast.autovacuum_enabled = false);
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
-- CREATE/ALTER PUBLICATION and ALTER SUBSCRIPTION forms
2+
CREATE PUBLICATION p FOR ALL TABLES;
3+
CREATE PUBLICATION p FOR TABLE t1, t2 (a, b) WHERE (a > 5);
4+
CREATE PUBLICATION p FOR TABLES IN SCHEMA s1, s2;
5+
CREATE PUBLICATION p FOR TABLE t1, TABLES IN SCHEMA s1 WITH (publish = 'insert, update', publish_via_partition_root = true);
6+
CREATE PUBLICATION p WITH (publish_via_partition_root = 1);
7+
ALTER PUBLICATION p ADD TABLE t3;
8+
ALTER PUBLICATION p ADD TABLE t3 (a) WHERE (a IS NOT NULL);
9+
ALTER PUBLICATION p DROP TABLE t3;
10+
ALTER PUBLICATION p SET TABLE t1, t2;
11+
ALTER PUBLICATION p SET TABLES IN SCHEMA s1;
12+
ALTER PUBLICATION p ADD TABLES IN SCHEMA s2;
13+
ALTER PUBLICATION p DROP TABLES IN SCHEMA s2;
14+
ALTER PUBLICATION p SET (publish = 'insert');
15+
ALTER PUBLICATION p SET (publish_via_partition_root = 0);
16+
ALTER PUBLICATION p SET (publish_via_partition_root = false);
17+
ALTER PUBLICATION p OWNER TO regress_user;
18+
ALTER PUBLICATION p RENAME TO p2;
19+
CREATE SUBSCRIPTION s CONNECTION 'dbname=doesnotexist' PUBLICATION p WITH (connect = false, slot_name = NONE);
20+
ALTER SUBSCRIPTION s SET (slot_name = 'newname');
21+
ALTER SUBSCRIPTION s SET (streaming = parallel);
22+
ALTER SUBSCRIPTION s CONNECTION 'dbname=other';
23+
ALTER SUBSCRIPTION s SET PUBLICATION p1, p2 WITH (refresh = false);
24+
ALTER SUBSCRIPTION s ADD PUBLICATION p3 WITH (refresh = false);
25+
ALTER SUBSCRIPTION s DROP PUBLICATION p3 WITH (refresh = false);
26+
ALTER SUBSCRIPTION s REFRESH PUBLICATION WITH (copy_data = false);
27+
ALTER SUBSCRIPTION s ENABLE;
28+
ALTER SUBSCRIPTION s DISABLE;
29+
ALTER SUBSCRIPTION s SKIP (lsn = '0/12345');
30+
ALTER SUBSCRIPTION s SKIP (lsn = NONE);
31+
ALTER SUBSCRIPTION s OWNER TO regress_user;
32+
ALTER SUBSCRIPTION s RENAME TO s2;
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
-- SQL/JSON constructors
2+
SELECT JSON_OBJECT();
3+
SELECT JSON_OBJECT(RETURNING json);
4+
SELECT JSON_OBJECT(RETURNING jsonb);
5+
SELECT JSON_OBJECT(RETURNING text FORMAT JSON);
6+
SELECT JSON_OBJECT(RETURNING bytea FORMAT JSON ENCODING UTF8);
7+
SELECT JSON_OBJECT('foo': NULL::int FORMAT JSON);
8+
SELECT JSON_OBJECT('foo': 1, 'bar': 'baz');
9+
SELECT JSON_OBJECT('foo' VALUE 1, 'bar' VALUE 'baz');
10+
SELECT JSON_OBJECT('a': 1 ABSENT ON NULL);
11+
SELECT JSON_OBJECT('a': 1 NULL ON NULL);
12+
SELECT JSON_OBJECT('a': 1, 'a': 2 WITH UNIQUE KEYS);
13+
SELECT JSON_OBJECT('a': 1, 'a': 2 WITHOUT UNIQUE KEYS);
14+
SELECT JSON_OBJECT('a': 1, 'b': 2 ABSENT ON NULL WITH UNIQUE KEYS RETURNING jsonb);
15+
SELECT JSON_OBJECT('a': '{"b": 1}' FORMAT JSON);
16+
SELECT JSON_OBJECT('a': '{"b": 1}' FORMAT JSON RETURNING jsonb);
17+
SELECT JSON_ARRAY();
18+
SELECT JSON_ARRAY(RETURNING jsonb);
19+
SELECT JSON_ARRAY(1, 2, 'a');
20+
SELECT JSON_ARRAY(1, NULL, 2 NULL ON NULL);
21+
SELECT JSON_ARRAY(1, NULL, 2 ABSENT ON NULL);
22+
SELECT JSON_ARRAY('{"a": 1}' FORMAT JSON, 2 RETURNING jsonb);
23+
SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2), (NULL), (4)) foo(i));
24+
SELECT JSON_ARRAY(SELECT i FROM (VALUES (1), (2)) foo(i) RETURNING jsonb);
25+
SELECT JSON_ARRAY(SELECT i FROM (VALUES (3), (1)) foo(i) ORDER BY i);
26+
SELECT JSON_ARRAY(SELECT i FROM (VALUES ('[1]')) foo(i) FORMAT JSON RETURNING text);
27+
SELECT JSON('{"a": 1}');
28+
SELECT JSON('{"a": 1}' WITH UNIQUE KEYS);
29+
SELECT JSON('{"a": 1}' WITHOUT UNIQUE KEYS);
30+
SELECT JSON('{"a": 1}'::bytea FORMAT JSON ENCODING UTF8);
31+
SELECT JSON_SCALAR(1);
32+
SELECT JSON_SCALAR('text');
33+
SELECT JSON_SCALAR(NULL::int);
34+
SELECT JSON_SERIALIZE('{"a": 1}');
35+
SELECT JSON_SERIALIZE('{"a": 1}' FORMAT JSON);
36+
SELECT JSON_SERIALIZE('{"a": 1}'::jsonb RETURNING bytea);
37+
SELECT JSON_SERIALIZE('{"a": 1}' RETURNING bytea FORMAT JSON ENCODING UTF8);
38+
-- SQL/JSON aggregates
39+
SELECT JSON_OBJECTAGG(k: v) FROM t;
40+
SELECT JSON_OBJECTAGG(k VALUE v) FROM t;
41+
SELECT JSON_OBJECTAGG(k: v ABSENT ON NULL) FROM t;
42+
SELECT JSON_OBJECTAGG(k: v NULL ON NULL WITH UNIQUE KEYS RETURNING jsonb) FROM t;
43+
SELECT JSON_OBJECTAGG(k: v FORMAT JSON) FROM t;
44+
SELECT JSON_OBJECTAGG(k: v) FILTER (WHERE k IS NOT NULL) FROM t;
45+
SELECT JSON_OBJECTAGG(k: v) OVER (PARTITION BY g) FROM t;
46+
SELECT JSON_OBJECTAGG(k: v) FILTER (WHERE k IS NOT NULL) OVER (ORDER BY k ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) FROM t;
47+
SELECT JSON_ARRAYAGG(v) FROM t;
48+
SELECT JSON_ARRAYAGG(v ORDER BY v DESC) FROM t;
49+
SELECT JSON_ARRAYAGG(v NULL ON NULL) FROM t;
50+
SELECT JSON_ARRAYAGG(v ABSENT ON NULL RETURNING jsonb) FROM t;
51+
SELECT JSON_ARRAYAGG(v FORMAT JSON ORDER BY v ABSENT ON NULL RETURNING text) FROM t;
52+
SELECT JSON_ARRAYAGG(v) FILTER (WHERE v > 0) OVER w FROM t WINDOW w AS (PARTITION BY g);
53+
-- IS JSON predicates
54+
SELECT js IS JSON FROM t;
55+
SELECT js IS NOT JSON FROM t;
56+
SELECT js IS JSON VALUE FROM t;
57+
SELECT js IS JSON OBJECT FROM t;
58+
SELECT js IS JSON ARRAY FROM t;
59+
SELECT js IS JSON SCALAR FROM t;
60+
SELECT js IS JSON WITH UNIQUE KEYS FROM t;
61+
SELECT js IS JSON OBJECT WITHOUT UNIQUE KEYS FROM t;
62+
SELECT js IS NOT JSON ARRAY WITH UNIQUE FROM t;
63+
SELECT CASE WHEN js IS JSON OBJECT THEN 'o' WHEN js IS JSON ARRAY THEN 'a' END FROM t;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- WindowDef.frameOptions is a bitmask; decode every bound/exclusion combination
2+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 2 PRECEDING AND 1 FOLLOWING) FROM t;
3+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) FROM t;
4+
SELECT sum(x) OVER (ORDER BY x RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FROM t;
5+
SELECT sum(x) OVER (ORDER BY x RANGE BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) FROM t;
6+
SELECT sum(x) OVER (ORDER BY x GROUPS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t;
7+
SELECT sum(x) OVER (ORDER BY x GROUPS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE GROUP) FROM t;
8+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE TIES) FROM t;
9+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE CURRENT ROW) FROM t;
10+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING EXCLUDE NO OTHERS) FROM t;
11+
SELECT sum(x) OVER (ORDER BY x RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t;
12+
SELECT sum(x) OVER (ORDER BY x RANGE BETWEEN INTERVAL '1 day' PRECEDING AND INTERVAL '1 day' FOLLOWING) FROM t;
13+
SELECT sum(x) OVER (ORDER BY x ROWS UNBOUNDED PRECEDING) FROM t;
14+
SELECT sum(x) OVER (ORDER BY x ROWS 1 PRECEDING) FROM t;
15+
SELECT sum(x) OVER (ORDER BY x ROWS CURRENT ROW) FROM t;
16+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN 1 FOLLOWING AND 2 FOLLOWING) FROM t;
17+
SELECT sum(x) OVER (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) FROM t;
18+
SELECT sum(x) OVER w FROM t WINDOW w AS (ORDER BY x ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING);
19+
SELECT sum(x) OVER (w ORDER BY y) FROM t WINDOW w AS (PARTITION BY z);
20+
SELECT sum(x) OVER (w ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) FROM t WINDOW w AS (PARTITION BY z ORDER BY x);
21+
SELECT sum(x) OVER (PARTITION BY z) FROM t;
22+
SELECT sum(x) OVER () FROM t;

0 commit comments

Comments
 (0)