Back to home page

OSCL-LXR

 
 

    


0001 -- Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
0002 --
0003 -- Window Functions Testing
0004 -- https://github.com/postgres/postgres/blob/REL_12_STABLE/src/test/regress/sql/window.sql#L1-L319
0005 
0006 -- Test window operator with codegen on and off.
0007 --CONFIG_DIM1 spark.sql.codegen.wholeStage=true
0008 --CONFIG_DIM1 spark.sql.codegen.wholeStage=false,spark.sql.codegen.factoryMode=CODEGEN_ONLY
0009 --CONFIG_DIM1 spark.sql.codegen.wholeStage=false,spark.sql.codegen.factoryMode=NO_CODEGEN
0010 
0011 CREATE TEMPORARY VIEW tenk2 AS SELECT * FROM tenk1;
0012 
0013 -- [SPARK-29540] Thrift in some cases can't parse string to date
0014 -- CREATE TABLE empsalary (
0015 --     depname string,
0016 --     empno integer,
0017 --     salary int,
0018 --     enroll_date date
0019 -- ) USING parquet;
0020 
0021 -- [SPARK-29540] Thrift in some cases can't parse string to date
0022 -- INSERT INTO empsalary VALUES ('develop', 10, 5200, '2007-08-01');
0023 -- INSERT INTO empsalary VALUES ('sales', 1, 5000, '2006-10-01');
0024 -- INSERT INTO empsalary VALUES ('personnel', 5, 3500, '2007-12-10');
0025 -- INSERT INTO empsalary VALUES ('sales', 4, 4800, '2007-08-08');
0026 -- INSERT INTO empsalary VALUES ('personnel', 2, 3900, '2006-12-23');
0027 -- INSERT INTO empsalary VALUES ('develop', 7, 4200, '2008-01-01');
0028 -- INSERT INTO empsalary VALUES ('develop', 9, 4500, '2008-01-01');
0029 -- INSERT INTO empsalary VALUES ('sales', 3, 4800, '2007-08-01');
0030 -- INSERT INTO empsalary VALUES ('develop', 8, 6000, '2006-10-01');
0031 -- INSERT INTO empsalary VALUES ('develop', 11, 5200, '2007-08-15');
0032 
0033 -- [SPARK-29540] Thrift in some cases can't parse string to date
0034 -- SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary ORDER BY depname, salary;
0035 
0036 -- [SPARK-29540] Thrift in some cases can't parse string to date
0037 -- SELECT depname, empno, salary, rank() OVER (PARTITION BY depname ORDER BY salary) FROM empsalary;
0038 
0039 -- with GROUP BY
0040 SELECT four, ten, SUM(SUM(four)) OVER (PARTITION BY four), AVG(ten) FROM tenk1
0041 GROUP BY four, ten ORDER BY four, ten;
0042 
0043 -- [SPARK-29540] Thrift in some cases can't parse string to date
0044 -- SELECT depname, empno, salary, sum(salary) OVER w FROM empsalary WINDOW w AS (PARTITION BY depname);
0045 
0046 -- [SPARK-28064] Order by does not accept a call to rank()
0047 -- SELECT depname, empno, salary, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary) ORDER BY rank() OVER w;
0048 
0049 -- empty window specification
0050 SELECT COUNT(*) OVER () FROM tenk1 WHERE unique2 < 10;
0051 
0052 SELECT COUNT(*) OVER w FROM tenk1 WHERE unique2 < 10 WINDOW w AS ();
0053 
0054 -- no window operation
0055 SELECT four FROM tenk1 WHERE FALSE WINDOW w AS (PARTITION BY ten);
0056 
0057 -- cumulative aggregate
0058 SELECT sum(four) OVER (PARTITION BY ten ORDER BY unique2) AS sum_1, ten, four FROM tenk1 WHERE unique2 < 10;
0059 
0060 SELECT row_number() OVER (ORDER BY unique2) FROM tenk1 WHERE unique2 < 10;
0061 
0062 SELECT rank() OVER (PARTITION BY four ORDER BY ten) AS rank_1, ten, four FROM tenk1 WHERE unique2 < 10;
0063 
0064 SELECT dense_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0065 
0066 SELECT percent_rank() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0067 
0068 SELECT cume_dist() OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0069 
0070 SELECT ntile(3) OVER (ORDER BY ten, four), ten, four FROM tenk1 WHERE unique2 < 10;
0071 
0072 -- [SPARK-28065] ntile does not accept NULL as input
0073 -- SELECT ntile(NULL) OVER (ORDER BY ten, four), ten, four FROM tenk1 LIMIT 2;
0074 
0075 SELECT lag(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0076 
0077 -- [SPARK-28068] `lag` second argument must be a literal in Spark
0078 -- SELECT lag(ten, four) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0079 
0080 -- [SPARK-28068] `lag` second argument must be a literal in Spark
0081 -- SELECT lag(ten, four, 0) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0082 
0083 SELECT lead(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0084 
0085 SELECT lead(ten * 2, 1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0086 
0087 SELECT lead(ten * 2, 1, -1) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0088 
0089 SELECT first(ten) OVER (PARTITION BY four ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0090 
0091 -- last returns the last row of the frame, which is CURRENT ROW in ORDER BY window.
0092 SELECT last(four) OVER (ORDER BY ten), ten, four FROM tenk1 WHERE unique2 < 10;
0093 
0094 SELECT last(ten) OVER (PARTITION BY four), ten, four FROM
0095 (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s
0096 ORDER BY four, ten;
0097 
0098 -- [SPARK-27951] ANSI SQL: NTH_VALUE function
0099 -- SELECT nth_value(ten, four + 1) OVER (PARTITION BY four), ten, four
0100 -- FROM (SELECT * FROM tenk1 WHERE unique2 < 10 ORDER BY four, ten)s;
0101 
0102 SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER (PARTITION BY two ORDER BY ten) AS wsum
0103 FROM tenk1 GROUP BY ten, two;
0104 
0105 SELECT count(*) OVER (PARTITION BY four), four FROM (SELECT * FROM tenk1 WHERE two = 1)s WHERE unique2 < 10;
0106 
0107 SELECT (count(*) OVER (PARTITION BY four ORDER BY ten) +
0108   sum(hundred) OVER (PARTITION BY four ORDER BY ten)) AS cntsum
0109   FROM tenk1 WHERE unique2 < 10;
0110 
0111 -- opexpr with different windows evaluation.
0112 SELECT * FROM(
0113   SELECT count(*) OVER (PARTITION BY four ORDER BY ten) +
0114     sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS total,
0115     count(*) OVER (PARTITION BY four ORDER BY ten) AS fourcount,
0116     sum(hundred) OVER (PARTITION BY two ORDER BY ten) AS twosum
0117     FROM tenk1
0118 )sub WHERE total <> fourcount + twosum;
0119 
0120 SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHERE unique2 < 10;
0121 
0122 SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum
0123 FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten);
0124 
0125 -- [SPARK-29540] Thrift in some cases can't parse string to date
0126 -- more than one window with GROUP BY
0127 -- SELECT sum(salary),
0128 --   row_number() OVER (ORDER BY depname),
0129 --   sum(sum(salary)) OVER (ORDER BY depname DESC)
0130 -- FROM empsalary GROUP BY depname;
0131 
0132 -- [SPARK-29540] Thrift in some cases can't parse string to date
0133 -- identical windows with different names
0134 -- SELECT sum(salary) OVER w1, count(*) OVER w2
0135 -- FROM empsalary WINDOW w1 AS (ORDER BY salary), w2 AS (ORDER BY salary);
0136 
0137 -- subplan
0138 -- [SPARK-28379] Correlated scalar subqueries must be aggregated
0139 -- SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten)
0140 -- FROM tenk1 s WHERE unique2 < 10;
0141 
0142 -- empty table
0143 SELECT count(*) OVER (PARTITION BY four) FROM (SELECT * FROM tenk1 WHERE FALSE)s;
0144 
0145 -- [SPARK-29540] Thrift in some cases can't parse string to date
0146 -- mixture of agg/wfunc in the same window
0147 -- SELECT sum(salary) OVER w, rank() OVER w FROM empsalary WINDOW w AS (PARTITION BY depname ORDER BY salary DESC);
0148 
0149 -- Cannot safely cast 'enroll_date': string to date;
0150 -- SELECT empno, depname, salary, bonus, depadj, MIN(bonus) OVER (ORDER BY empno), MAX(depadj) OVER () FROM(
0151 -- SELECT *,
0152 --   CASE WHEN enroll_date < '2008-01-01' THEN 2008 - extract(year FROM enroll_date) END * 500 AS bonus,
0153 --   CASE WHEN
0154 --     AVG(salary) OVER (PARTITION BY depname) < salary
0155 --     THEN 200 END AS depadj FROM empsalary
0156 --   )s;
0157 
0158 create temporary view int4_tbl as select * from values
0159   (0),
0160   (123456),
0161   (-123456),
0162   (2147483647),
0163   (-2147483647)
0164   as int4_tbl(f1);
0165 
0166 -- window function over ungrouped agg over empty row set (bug before 9.1)
0167 SELECT SUM(COUNT(f1)) OVER () FROM int4_tbl WHERE f1=42;
0168 
0169 -- window function with ORDER BY an expression involving aggregates (9.1 bug)
0170 select ten,
0171   sum(unique1) + sum(unique2) as res,
0172   rank() over (order by sum(unique1) + sum(unique2)) as rank
0173 from tenk1
0174 group by ten order by ten;
0175 
0176 -- window and aggregate with GROUP BY expression (9.2 bug)
0177 -- explain
0178 -- select first(max(x)) over (), y
0179 --   from (select unique1 as x, ten+four as y from tenk1) ss
0180 --   group by y;
0181 
0182 -- test non-default frame specifications
0183 SELECT four, ten,
0184 sum(ten) over (partition by four order by ten),
0185 last(ten) over (partition by four order by ten)
0186 FROM (select distinct ten, four from tenk1) ss;
0187 
0188 SELECT four, ten,
0189 sum(ten) over (partition by four order by ten range between unbounded preceding and current row),
0190 last(ten) over (partition by four order by ten range between unbounded preceding and current row)
0191 FROM (select distinct ten, four from tenk1) ss;
0192 
0193 SELECT four, ten,
0194 sum(ten) over (partition by four order by ten range between unbounded preceding and unbounded following),
0195 last(ten) over (partition by four order by ten range between unbounded preceding and unbounded following)
0196 FROM (select distinct ten, four from tenk1) ss;
0197 
0198 -- [SPARK-29451] Some queries with divisions in SQL windows are failling in Thrift
0199 -- SELECT four, ten/4 as two,
0200 -- sum(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row),
0201 -- last(ten/4) over (partition by four order by ten/4 range between unbounded preceding and current row)
0202 -- FROM (select distinct ten, four from tenk1) ss;
0203 
0204 -- [SPARK-29451] Some queries with divisions in SQL windows are failling in Thrift
0205 -- SELECT four, ten/4 as two,
0206 -- sum(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row),
0207 -- last(ten/4) over (partition by four order by ten/4 rows between unbounded preceding and current row)
0208 -- FROM (select distinct ten, four from tenk1) ss;
0209 
0210 SELECT sum(unique1) over (order by four range between current row and unbounded following),
0211 unique1, four
0212 FROM tenk1 WHERE unique1 < 10;
0213 
0214 SELECT sum(unique1) over (rows between current row and unbounded following),
0215 unique1, four
0216 FROM tenk1 WHERE unique1 < 10;
0217 
0218 SELECT sum(unique1) over (rows between 2 preceding and 2 following),
0219 unique1, four
0220 FROM tenk1 WHERE unique1 < 10;
0221 
0222 -- [SPARK-28428] Spark `exclude` always expecting `()`
0223 -- SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude no others),
0224 -- unique1, four
0225 -- FROM tenk1 WHERE unique1 < 10;
0226 
0227 -- [SPARK-28428] Spark `exclude` always expecting `()`
0228 -- SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude current row),
0229 -- unique1, four
0230 -- FROM tenk1 WHERE unique1 < 10;
0231 
0232 -- [SPARK-28428] Spark `exclude` always expecting `()`
0233 -- SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude group),
0234 -- unique1, four
0235 -- FROM tenk1 WHERE unique1 < 10;
0236 
0237 -- [SPARK-28428] Spark `exclude` always expecting `()`
0238 -- SELECT sum(unique1) over (rows between 2 preceding and 2 following exclude ties),
0239 -- unique1, four
0240 -- FROM tenk1 WHERE unique1 < 10;
0241 
0242 -- [SPARK-28428] Spark `exclude` always expecting `()`
0243 -- SELECT first(unique1) over (ORDER BY four rows between current row and 2 following exclude current row),
0244 -- unique1, four
0245 -- FROM tenk1 WHERE unique1 < 10;
0246 
0247 -- [SPARK-28428] Spark `exclude` always expecting `()`
0248 -- SELECT first(unique1) over (ORDER BY four rows between current row and 2 following exclude group),
0249 -- unique1, four
0250 -- FROM tenk1 WHERE unique1 < 10;
0251 
0252 -- [SPARK-28428] Spark `exclude` always expecting `()`
0253 -- SELECT first(unique1) over (ORDER BY four rows between current row and 2 following exclude ties),
0254 -- unique1, four
0255 -- FROM tenk1 WHERE unique1 < 10;
0256 
0257 -- [SPARK-28428] Spark `exclude` always expecting `()`
0258 -- SELECT last(unique1) over (ORDER BY four rows between current row and 2 following exclude current row),
0259 -- unique1, four
0260 -- FROM tenk1 WHERE unique1 < 10;
0261 
0262 -- [SPARK-28428] Spark `exclude` always expecting `()`
0263 -- SELECT last(unique1) over (ORDER BY four rows between current row and 2 following exclude group),
0264 -- unique1, four
0265 -- FROM tenk1 WHERE unique1 < 10;
0266 
0267 -- [SPARK-28428] Spark `exclude` always expecting `()`
0268 -- SELECT last(unique1) over (ORDER BY four rows between current row and 2 following exclude ties),
0269 -- unique1, four
0270 -- FROM tenk1 WHERE unique1 < 10;
0271 
0272 SELECT sum(unique1) over (rows between 2 preceding and 1 preceding),
0273 unique1, four
0274 FROM tenk1 WHERE unique1 < 10;
0275 
0276 SELECT sum(unique1) over (rows between 1 following and 3 following),
0277 unique1, four
0278 FROM tenk1 WHERE unique1 < 10;
0279 
0280 SELECT sum(unique1) over (rows between unbounded preceding and 1 following),
0281 unique1, four
0282 FROM tenk1 WHERE unique1 < 10;
0283 
0284 -- [SPARK-28428] Spark `exclude` always expecting `()`
0285 -- SELECT sum(unique1) over (w range between current row and unbounded following),
0286 --      unique1, four
0287 -- FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
0288 
0289 -- [SPARK-28428] Spark `exclude` always expecting `()`
0290 -- SELECT sum(unique1) over (w range between unbounded preceding and current row exclude current row),
0291 -- unique1, four
0292 -- FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
0293 
0294 -- [SPARK-28428] Spark `exclude` always expecting `()`
0295 -- SELECT sum(unique1) over (w range between unbounded preceding and current row exclude group),
0296 -- unique1, four
0297 -- FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
0298 
0299 -- [SPARK-28428] Spark `exclude` always expecting `()`
0300 -- SELECT sum(unique1) over (w range between unbounded preceding and current row exclude ties),
0301 -- unique1, four
0302 -- FROM tenk1 WHERE unique1 < 10 WINDOW w AS (order by four);
0303 
0304 -- [SPARK-27951] ANSI SQL: NTH_VALUE function
0305 -- SELECT first_value(unique1) over w,
0306 -- nth_value(unique1, 2) over w AS nth_2,
0307 -- last_value(unique1) over w, unique1, four
0308 -- FROM tenk1 WHERE unique1 < 10
0309 -- WINDOW w AS (order by four range between current row and unbounded following);
0310 
0311 -- [SPARK-28501] Frame bound value must be a literal.
0312 -- SELECT sum(unique1) over
0313 -- (order by unique1
0314 --   rows (SELECT unique1 FROM tenk1 ORDER BY unique1 LIMIT 1) + 1 PRECEDING),
0315 -- unique1
0316 -- FROM tenk1 WHERE unique1 < 10;
0317 
0318 CREATE TEMP VIEW v_window AS
0319 SELECT i.id, sum(i.id) over (order by i.id rows between 1 preceding and 1 following) as sum_rows
0320 FROM range(1, 11) i;
0321 
0322 SELECT * FROM v_window;
0323 
0324 -- [SPARK-28428] Spark `exclude` always expecting `()`
0325 -- CREATE OR REPLACE TEMP VIEW v_window AS
0326 -- SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following
0327 --   exclude current row) as sum_rows FROM range(1, 10) i;
0328 
0329 -- SELECT * FROM v_window;
0330 
0331 -- [SPARK-28428] Spark `exclude` always expecting `()`
0332 -- CREATE OR REPLACE TEMP VIEW v_window AS
0333 -- SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following
0334 --   exclude group) as sum_rows FROM range(1, 10) i;
0335 -- SELECT * FROM v_window;
0336 
0337 -- [SPARK-28428] Spark `exclude` always expecting `()`
0338 -- CREATE OR REPLACE TEMP VIEW v_window AS
0339 -- SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following
0340 --   exclude ties) as sum_rows FROM generate_series(1, 10) i;
0341 
0342 -- [SPARK-28428] Spark `exclude` always expecting `()`
0343 -- CREATE OR REPLACE TEMP VIEW v_window AS
0344 -- SELECT i, sum(i) over (order by i rows between 1 preceding and 1 following
0345 --   exclude no others) as sum_rows FROM generate_series(1, 10) i;
0346 -- SELECT * FROM v_window;
0347 
0348 -- [SPARK-28648] Adds support to `groups` unit type in window clauses
0349 -- CREATE OR REPLACE TEMP VIEW v_window AS
0350 -- SELECT i.id, sum(i.id) over (order by i.id groups between 1 preceding and 1 following) as sum_rows FROM range(1, 11) i;
0351 -- SELECT * FROM v_window;
0352 
0353 DROP VIEW v_window;
0354 -- [SPARK-29540] Thrift in some cases can't parse string to date
0355 -- DROP TABLE empsalary;
0356 DROP VIEW tenk2;
0357 DROP VIEW int4_tbl;