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#L320-562
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 TABLE empsalary (
0012     depname string,
0013     empno integer,
0014     salary int,
0015     enroll_date date
0016 ) USING parquet;
0017 
0018 INSERT INTO empsalary VALUES
0019   ('develop', 10, 5200, date '2007-08-01'),
0020   ('sales', 1, 5000, date '2006-10-01'),
0021   ('personnel', 5, 3500, date '2007-12-10'),
0022   ('sales', 4, 4800, date '2007-08-08'),
0023   ('personnel', 2, 3900, date '2006-12-23'),
0024   ('develop', 7, 4200, date '2008-01-01'),
0025   ('develop', 9, 4500, date '2008-01-01'),
0026   ('sales', 3, 4800, date '2007-08-01'),
0027   ('develop', 8, 6000, date '2006-10-01'),
0028   ('develop', 11, 5200, date '2007-08-15');
0029 
0030 -- [SPARK-28429] SQL Datetime util function being casted to double instead of timestamp
0031 -- CREATE TEMP VIEW v_window AS
0032 -- SELECT i, min(i) over (order by i range between '1 day' preceding and '10 days' following) as min_i
0033 --   FROM range(now(), now()+'100 days', '1 hour') i;
0034 
0035 -- RANGE offset PRECEDING/FOLLOWING tests
0036 
0037 SELECT sum(unique1) over (order by four range between 2 preceding and 1 preceding),
0038 unique1, four
0039 FROM tenk1 WHERE unique1 < 10;
0040 
0041 SELECT sum(unique1) over (order by four desc range between 2 preceding and 1 preceding),
0042 unique1, four
0043 FROM tenk1 WHERE unique1 < 10;
0044 
0045 -- [SPARK-28428] Spark `exclude` always expecting `()`
0046 -- SELECT sum(unique1) over (order by four range between 2 preceding and 1 preceding exclude no others),
0047 -- unique1, four
0048 -- FROM tenk1 WHERE unique1 < 10;
0049 
0050 -- [SPARK-28428] Spark `exclude` always expecting `()`
0051 -- SELECT sum(unique1) over (order by four range between 2 preceding and 1 preceding exclude current row),
0052 -- unique1, four
0053 -- FROM tenk1 WHERE unique1 < 10;
0054 
0055 -- [SPARK-28428] Spark `exclude` always expecting `()`
0056 -- SELECT sum(unique1) over (order by four range between 2 preceding and 1 preceding exclude group),
0057 -- unique1, four
0058 -- FROM tenk1 WHERE unique1 < 10;
0059 
0060 -- [SPARK-28428] Spark `exclude` always expecting `()`
0061 -- SELECT sum(unique1) over (order by four range between 2 preceding and 1 preceding exclude ties),
0062 -- unique1, four
0063 -- FROM tenk1 WHERE unique1 < 10;
0064 
0065 -- [SPARK-28428] Spark `exclude` always expecting `()`
0066 -- SELECT sum(unique1) over (order by four range between 2 preceding and 6 following exclude ties),
0067 -- unique1, four
0068 -- FROM tenk1 WHERE unique1 < 10;
0069 
0070 -- [SPARK-28428] Spark `exclude` always expecting `()`
0071 -- SELECT sum(unique1) over (order by four range between 2 preceding and 6 following exclude group),
0072 -- unique1, four
0073 -- FROM tenk1 WHERE unique1 < 10;
0074 
0075 SELECT sum(unique1) over (partition by four order by unique1 range between 5 preceding and 6 following),
0076 unique1, four
0077 FROM tenk1 WHERE unique1 < 10;
0078 
0079 -- [SPARK-28428] Spark `exclude` always expecting `()`
0080 -- SELECT sum(unique1) over (partition by four order by unique1 range between 5 preceding and 6 following
0081 --   exclude current row),unique1, four
0082 -- FROM tenk1 WHERE unique1 < 10;
0083 
0084 -- [SPARK-28429] SQL Datetime util function being casted to double instead of timestamp
0085 -- select sum(salary) over (order by enroll_date range between '1 year' preceding and '1 year' following),
0086 -- salary, enroll_date from empsalary;
0087 
0088 -- [SPARK-28429] SQL Datetime util function being casted to double instead of timestamp
0089 -- select sum(salary) over (order by enroll_date desc range between '1 year' preceding and '1 year' following),
0090 -- salary, enroll_date from empsalary;
0091 
0092 -- [SPARK-28429] SQL Datetime util function being casted to double instead of timestamp
0093 -- select sum(salary) over (order by enroll_date desc range between '1 year' following and '1 year' following),
0094 -- salary, enroll_date from empsalary;
0095 
0096 -- [SPARK-28428] Spark `exclude` always expecting `()`
0097 -- select sum(salary) over (order by enroll_date range between '1 year' preceding and '1 year' following
0098 --   exclude current row), salary, enroll_date from empsalary;
0099 
0100 -- [SPARK-28428] Spark `exclude` always expecting `()`
0101 -- select sum(salary) over (order by enroll_date range between '1 year' preceding and '1 year' following
0102 --   exclude group), salary, enroll_date from empsalary;
0103 
0104 -- [SPARK-28428] Spark `exclude` always expecting `()`
0105 -- select sum(salary) over (order by enroll_date range between '1 year' preceding and '1 year' following
0106 --   exclude ties), salary, enroll_date from empsalary;
0107 
0108 -- [SPARK-27951] ANSI SQL: NTH_VALUE function
0109 -- select first_value(salary) over(order by salary range between 1000 preceding and 1000 following),
0110 -- lead(salary) over(order by salary range between 1000 preceding and 1000 following),
0111 -- nth_value(salary, 1) over(order by salary range between 1000 preceding and 1000 following),
0112 -- salary from empsalary;
0113 
0114 -- [SPARK-30734] AnalysisException that window RangeFrame not match RowFrame
0115 -- select last(salary) over(order by salary range between 1000 preceding and 1000 following),
0116 -- lag(salary) over(order by salary range between 1000 preceding and 1000 following),
0117 -- salary from empsalary;
0118 
0119 -- [SPARK-27951] ANSI SQL: NTH_VALUE function
0120 -- select first_value(salary) over(order by salary range between 1000 following and 3000 following
0121 --   exclude current row),
0122 -- lead(salary) over(order by salary range between 1000 following and 3000 following exclude ties),
0123 -- nth_value(salary, 1) over(order by salary range between 1000 following and 3000 following
0124 --   exclude ties),
0125 -- salary from empsalary;
0126 
0127 -- [SPARK-28428] Spark `exclude` always expecting `()`
0128 -- select last(salary) over(order by salary range between 1000 following and 3000 following
0129 --   exclude group),
0130 -- lag(salary) over(order by salary range between 1000 following and 3000 following exclude group),
0131 -- salary from empsalary;
0132 
0133 -- [SPARK-28428] Spark `exclude` always expecting `()`
0134 -- select first(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0135 --   exclude ties),
0136 -- last(salary) over(order by enroll_date range between unbounded preceding and '1 year' following),
0137 -- salary, enroll_date from empsalary;
0138 
0139 -- [SPARK-28428] Spark `exclude` always expecting `()`
0140 -- select first(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0141 --   exclude ties),
0142 -- last(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0143 --   exclude ties),
0144 -- salary, enroll_date from empsalary;
0145 
0146 -- [SPARK-28428] Spark `exclude` always expecting `()`
0147 -- select first(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0148 --   exclude group),
0149 -- last(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0150 --   exclude group),
0151 -- salary, enroll_date from empsalary;
0152 
0153 -- [SPARK-28428] Spark `exclude` always expecting `()`
0154 -- select first(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0155 --   exclude current row),
0156 -- last(salary) over(order by enroll_date range between unbounded preceding and '1 year' following
0157 --   exclude current row),
0158 -- salary, enroll_date from empsalary;
0159 
0160 -- RANGE offset PRECEDING/FOLLOWING with null values
0161 select ss.id, ss.y,
0162        first(ss.y) over w,
0163        last(ss.y) over w
0164 from
0165   (select x.id, x.id as y from range(1,6) as x
0166    union all select null, 42
0167    union all select null, 43) ss
0168 window w as
0169   (order by ss.id asc nulls first range between 2 preceding and 2 following);
0170 
0171 select ss.id, ss.y,
0172        first(ss.y) over w,
0173        last(ss.y) over w
0174 from
0175   (select x.id, x.id as y from range(1,6) as x
0176    union all select null, 42
0177    union all select null, 43) ss
0178 window w as
0179   (order by ss.id asc nulls last range between 2 preceding and 2 following);
0180 
0181 select ss.id, ss.y,
0182        first(ss.y) over w,
0183        last(ss.y) over w
0184 from
0185   (select x.id, x.id as y from range(1,6) as x
0186    union all select null, 42
0187    union all select null, 43) ss
0188 window w as
0189   (order by ss.id desc nulls first range between 2 preceding and 2 following);
0190 
0191 select ss.id, ss.y,
0192        first(ss.y) over w,
0193        last(ss.y) over w
0194 from
0195   (select x.id, x.id as y from range(1,6) as x
0196    union all select null, 42
0197    union all select null, 43) ss
0198 window w as
0199   (order by ss.id desc nulls last range between 2 preceding and 2 following);
0200 
0201 -- Check overflow behavior for various integer sizes
0202 
0203 select x.id, last(x.id) over (order by x.id range between current row and 2147450884 following)
0204 from range(32764, 32767) x;
0205 
0206 select x.id, last(x.id) over (order by x.id desc range between current row and 2147450885 following)
0207 from range(-32766, -32765) x;
0208 
0209 select x.id, last(x.id) over (order by x.id range between current row and 4 following)
0210 from range(2147483644, 2147483647) x;
0211 
0212 select x.id, last(x.id) over (order by x.id desc range between current row and 5 following)
0213 from range(-2147483646, -2147483645) x;
0214 
0215 select x.id, last(x.id) over (order by x.id range between current row and 4 following)
0216 from range(9223372036854775804, 9223372036854775807) x;
0217 
0218 select x.id, last(x.id) over (order by x.id desc range between current row and 5 following)
0219 from range(-9223372036854775806, -9223372036854775805) x;
0220 
0221 -- Test in_range for other numeric datatypes
0222 
0223 create table numerics (
0224     id int,
0225     f_float4 float,
0226     f_float8 float,
0227     f_numeric int
0228 ) using parquet;
0229 
0230 insert into numerics values
0231 (1, -3, -3, -3),
0232 (2, -1, -1, -1),
0233 (3, 0, 0, 0),
0234 (4, 1.1, 1.1, 1.1),
0235 (5, 1.12, 1.12, 1.12),
0236 (6, 2, 2, 2),
0237 (7, 100, 100, 100);
0238 -- (8, 'infinity', 'infinity', '1000'),
0239 -- (9, 'NaN', 'NaN', 'NaN'),
0240 -- (0, '-infinity', '-infinity', '-1000');  -- numeric type lacks infinities
0241 
0242 select id, f_float4, first(id) over w, last(id) over w
0243 from numerics
0244 window w as (order by f_float4 range between
0245              1 preceding and 1 following);
0246 
0247 select id, f_float4, first(id) over w, last(id) over w
0248 from numerics
0249 window w as (order by f_float4 range between
0250              1 preceding and 1.1 following);
0251 
0252 select id, f_float4, first(id) over w, last(id) over w
0253 from numerics
0254 window w as (order by f_float4 range between
0255              'inf' preceding and 'inf' following);
0256 
0257 select id, f_float4, first(id) over w, last(id) over w
0258 from numerics
0259 window w as (order by f_float4 range between
0260              1.1 preceding and 'NaN' following);  -- error, NaN disallowed
0261 
0262 select id, f_float8, first(id) over w, last(id) over w
0263 from numerics
0264 window w as (order by f_float8 range between
0265              1 preceding and 1 following);
0266 
0267 select id, f_float8, first(id) over w, last(id) over w
0268 from numerics
0269 window w as (order by f_float8 range between
0270              1 preceding and 1.1 following);
0271 
0272 select id, f_float8, first(id) over w, last(id) over w
0273 from numerics
0274 window w as (order by f_float8 range between
0275              'inf' preceding and 'inf' following);
0276 
0277 select id, f_float8, first(id) over w, last(id) over w
0278 from numerics
0279 window w as (order by f_float8 range between
0280              1.1 preceding and 'NaN' following);  -- error, NaN disallowed
0281 
0282 select id, f_numeric, first(id) over w, last(id) over w
0283 from numerics
0284 window w as (order by f_numeric range between
0285              1 preceding and 1 following);
0286 
0287 select id, f_numeric, first(id) over w, last(id) over w
0288 from numerics
0289 window w as (order by f_numeric range between
0290              1 preceding and 1.1 following);
0291 
0292 select id, f_numeric, first(id) over w, last(id) over w
0293 from numerics
0294 window w as (order by f_numeric range between
0295              1 preceding and 1.1 following);  -- currently unsupported
0296 
0297 select id, f_numeric, first(id) over w, last(id) over w
0298 from numerics
0299 window w as (order by f_numeric range between
0300              1.1 preceding and 'NaN' following);  -- error, NaN disallowed
0301 
0302 drop table empsalary;
0303 drop table numerics;