Back to home page

OSCL-LXR

 
 

    


0001 -- A test suite for scalar subquery in predicate context
0002 
0003 CREATE OR REPLACE TEMPORARY VIEW p AS VALUES (1, 1) AS T(pk, pv);
0004 CREATE OR REPLACE TEMPORARY VIEW c AS VALUES (1, 1) AS T(ck, cv);
0005 
0006 -- SPARK-18814.1: Simplified version of TPCDS-Q32
0007 SELECT pk, cv
0008 FROM   p, c
0009 WHERE  p.pk = c.ck
0010 AND    c.cv = (SELECT avg(c1.cv)
0011                FROM   c c1
0012                WHERE  c1.ck = p.pk);
0013 
0014 -- SPARK-18814.2: Adding stack of aggregates
0015 SELECT pk, cv
0016 FROM   p, c
0017 WHERE  p.pk = c.ck
0018 AND    c.cv = (SELECT max(avg)
0019                FROM   (SELECT   c1.cv, avg(c1.cv) avg
0020                        FROM     c c1
0021                        WHERE    c1.ck = p.pk
0022                        GROUP BY c1.cv));
0023 
0024 create temporary view t1 as select * from values
0025   ('val1a', 6S, 8, 10L, float(15.0), 20D, 20E2BD, timestamp '2014-04-04 00:00:00.000', date '2014-04-04'),
0026   ('val1b', 8S, 16, 19L, float(17.0), 25D, 26E2BD, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
0027   ('val1a', 16S, 12, 21L, float(15.0), 20D, 20E2BD, timestamp '2014-06-04 01:02:00.001', date '2014-06-04'),
0028   ('val1a', 16S, 12, 10L, float(15.0), 20D, 20E2BD, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
0029   ('val1c', 8S, 16, 19L, float(17.0), 25D, 26E2BD, timestamp '2014-05-04 01:02:00.001', date '2014-05-05'),
0030   ('val1d', null, 16, 22L, float(17.0), 25D, 26E2BD, timestamp '2014-06-04 01:01:00.000', null),
0031   ('val1d', null, 16, 19L, float(17.0), 25D, 26E2BD, timestamp '2014-07-04 01:02:00.001', null),
0032   ('val1e', 10S, null, 25L, float(17.0), 25D, 26E2BD, timestamp '2014-08-04 01:01:00.000', date '2014-08-04'),
0033   ('val1e', 10S, null, 19L, float(17.0), 25D, 26E2BD, timestamp '2014-09-04 01:02:00.001', date '2014-09-04'),
0034   ('val1d', 10S, null, 12L, float(17.0), 25D, 26E2BD, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
0035   ('val1a', 6S, 8, 10L, float(15.0), 20D, 20E2BD, timestamp '2014-04-04 01:02:00.001', date '2014-04-04'),
0036   ('val1e', 10S, null, 19L, float(17.0), 25D, 26E2BD, timestamp '2014-05-04 01:01:00.000', date '2014-05-04')
0037   as t1(t1a, t1b, t1c, t1d, t1e, t1f, t1g, t1h, t1i);
0038 
0039 create temporary view t2 as select * from values
0040   ('val2a', 6S, 12, 14L, float(15), 20D, 20E2BD, timestamp '2014-04-04 01:01:00.000', date '2014-04-04'),
0041   ('val1b', 10S, 12, 19L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
0042   ('val1b', 8S, 16, 119L, float(17), 25D, 26E2BD, timestamp '2015-05-04 01:01:00.000', date '2015-05-04'),
0043   ('val1c', 12S, 16, 219L, float(17), 25D, 26E2BD, timestamp '2016-05-04 01:01:00.000', date '2016-05-04'),
0044   ('val1b', null, 16, 319L, float(17), 25D, 26E2BD, timestamp '2017-05-04 01:01:00.000', null),
0045   ('val2e', 8S, null, 419L, float(17), 25D, 26E2BD, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
0046   ('val1f', 19S, null, 519L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:01:00.000', date '2014-05-04'),
0047   ('val1b', 10S, 12, 19L, float(17), 25D, 26E2BD, timestamp '2014-06-04 01:01:00.000', date '2014-06-04'),
0048   ('val1b', 8S, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-07-04 01:01:00.000', date '2014-07-04'),
0049   ('val1c', 12S, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-08-04 01:01:00.000', date '2014-08-05'),
0050   ('val1e', 8S, null, 19L, float(17), 25D, 26E2BD, timestamp '2014-09-04 01:01:00.000', date '2014-09-04'),
0051   ('val1f', 19S, null, 19L, float(17), 25D, 26E2BD, timestamp '2014-10-04 01:01:00.000', date '2014-10-04'),
0052   ('val1b', null, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:01:00.000', null)
0053   as t2(t2a, t2b, t2c, t2d, t2e, t2f, t2g, t2h, t2i);
0054 
0055 create temporary view t3 as select * from values
0056   ('val3a', 6S, 12, 110L, float(15), 20D, 20E2BD, timestamp '2014-04-04 01:02:00.000', date '2014-04-04'),
0057   ('val3a', 6S, 12, 10L, float(15), 20D, 20E2BD, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
0058   ('val1b', 10S, 12, 219L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
0059   ('val1b', 10S, 12, 19L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
0060   ('val1b', 8S, 16, 319L, float(17), 25D, 26E2BD, timestamp '2014-06-04 01:02:00.000', date '2014-06-04'),
0061   ('val1b', 8S, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-07-04 01:02:00.000', date '2014-07-04'),
0062   ('val3c', 17S, 16, 519L, float(17), 25D, 26E2BD, timestamp '2014-08-04 01:02:00.000', date '2014-08-04'),
0063   ('val3c', 17S, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-09-04 01:02:00.000', date '2014-09-05'),
0064   ('val1b', null, 16, 419L, float(17), 25D, 26E2BD, timestamp '2014-10-04 01:02:00.000', null),
0065   ('val1b', null, 16, 19L, float(17), 25D, 26E2BD, timestamp '2014-11-04 01:02:00.000', null),
0066   ('val3b', 8S, null, 719L, float(17), 25D, 26E2BD, timestamp '2014-05-04 01:02:00.000', date '2014-05-04'),
0067   ('val3b', 8S, null, 19L, float(17), 25D, 26E2BD, timestamp '2015-05-04 01:02:00.000', date '2015-05-04')
0068   as t3(t3a, t3b, t3c, t3d, t3e, t3f, t3g, t3h, t3i);
0069 
0070 -- Group 1: scalar subquery in predicate context
0071 --          no correlation
0072 -- TC 01.01
0073 SELECT t1a, t1b
0074 FROM   t1
0075 WHERE  t1c = (SELECT max(t2c)
0076               FROM   t2);
0077 
0078 -- TC 01.02
0079 SELECT t1a, t1d, t1f
0080 FROM   t1
0081 WHERE  t1c = (SELECT max(t2c)
0082               FROM   t2)
0083 AND    t1b > (SELECT min(t3b)
0084               FROM   t3);
0085 
0086 -- TC 01.03
0087 SELECT t1a, t1h
0088 FROM   t1
0089 WHERE  t1c = (SELECT max(t2c)
0090               FROM   t2)
0091 OR     t1b = (SELECT min(t3b)
0092               FROM   t3
0093               WHERE  t3b > 10);
0094 
0095 -- TC 01.04
0096 -- scalar subquery over outer join
0097 SELECT t1a, t1b, t2d
0098 FROM   t1 LEFT JOIN t2
0099        ON t1a = t2a
0100 WHERE  t1b = (SELECT min(t3b)
0101               FROM   t3);
0102 
0103 -- TC 01.05
0104 -- test casting
0105 SELECT t1a, t1b, t1g
0106 FROM   t1
0107 WHERE  t1c + 5 = (SELECT max(t2e)
0108                   FROM   t2);
0109 
0110 -- TC 01.06
0111 -- test casting
0112 SELECT t1a, t1h
0113 FROM   t1
0114 WHERE  date(t1h) = (SELECT min(t2i)
0115                     FROM   t2);
0116 
0117 -- TC 01.07
0118 -- same table, expressions in scalar subquery
0119 SELECT t2d, t1a
0120 FROM   t1, t2
0121 WHERE  t1b = t2b
0122 AND    t2c + 1 = (SELECT max(t2c) + 1
0123                   FROM   t2, t1
0124                   WHERE  t2b = t1b);
0125 
0126 -- TC 01.08
0127 -- same table
0128 SELECT DISTINCT t2a, max_t1g
0129 FROM   t2, (SELECT   max(t1g) max_t1g, t1a
0130             FROM     t1
0131             GROUP BY t1a) t1
0132 WHERE  t2a = t1a
0133 AND    max_t1g = (SELECT max(t1g)
0134                   FROM   t1);
0135 
0136 -- TC 01.09
0137 -- more than one scalar subquery
0138 SELECT t3b, t3c
0139 FROM   t3
0140 WHERE  (SELECT max(t3c)
0141         FROM   t3
0142         WHERE  t3b > 10) >=
0143        (SELECT min(t3b)
0144         FROM   t3
0145         WHERE  t3c > 0)
0146 AND    (t3b is null or t3c is null);
0147 
0148 -- Group 2: scalar subquery in predicate context
0149 --          with correlation
0150 -- TC 02.01
0151 SELECT t1a
0152 FROM   t1
0153 WHERE  t1a < (SELECT   max(t2a)
0154               FROM     t2
0155               WHERE    t2c = t1c
0156               GROUP BY t2c);
0157 
0158 -- TC 02.02
0159 SELECT t1a, t1c
0160 FROM   t1
0161 WHERE  (SELECT   max(t2a)
0162         FROM     t2
0163         WHERE    t2c = t1c
0164         GROUP BY t2c) IS NULL;
0165 
0166 -- TC 02.03
0167 SELECT t1a
0168 FROM   t1
0169 WHERE  t1a = (SELECT   max(t2a)
0170               FROM     t2
0171               WHERE    t2c = t1c
0172               GROUP BY t2c
0173               HAVING   count(*) >= 0)
0174 OR     t1i > '2014-12-31';
0175 
0176 -- TC 02.03.01
0177 SELECT t1a
0178 FROM   t1
0179 WHERE  t1a = (SELECT   max(t2a)
0180               FROM     t2
0181               WHERE    t2c = t1c
0182               GROUP BY t2c
0183               HAVING   count(*) >= 1)
0184 OR     t1i > '2014-12-31';
0185 
0186 -- TC 02.04
0187 -- t1 on the right of an outer join
0188 -- can be reduced to inner join
0189 SELECT count(t1a)
0190 FROM   t1 RIGHT JOIN t2
0191 ON     t1d = t2d
0192 WHERE  t1a < (SELECT   max(t2a)
0193               FROM     t2
0194               WHERE    t2c = t1c
0195               GROUP BY t2c);
0196 
0197 -- TC 02.05
0198 SELECT t1a
0199 FROM   t1
0200 WHERE  t1b <= (SELECT   max(t2b)
0201                FROM     t2
0202                WHERE    t2c = t1c
0203                GROUP BY t2c)
0204 AND    t1b >= (SELECT   min(t2b)
0205                FROM     t2
0206                WHERE    t2c = t1c
0207                GROUP BY t2c);
0208 
0209 -- TC 02.06
0210 -- set op
0211 SELECT t1a
0212 FROM   t1
0213 WHERE  t1a <= (SELECT   max(t2a)
0214                FROM     t2
0215                WHERE    t2c = t1c
0216                GROUP BY t2c)
0217 INTERSECT
0218 SELECT t1a
0219 FROM   t1
0220 WHERE  t1a >= (SELECT   min(t2a)
0221                FROM     t2
0222                WHERE    t2c = t1c
0223                GROUP BY t2c);
0224 
0225 -- TC 02.07.01
0226 -- set op
0227 SELECT t1a
0228 FROM   t1
0229 WHERE  t1a <= (SELECT   max(t2a)
0230                FROM     t2
0231                WHERE    t2c = t1c
0232                GROUP BY t2c)
0233 UNION ALL
0234 SELECT t1a
0235 FROM   t1
0236 WHERE  t1a >= (SELECT   min(t2a)
0237                FROM     t2
0238                WHERE    t2c = t1c
0239                GROUP BY t2c);
0240 
0241 -- TC 02.07.02
0242 -- set op
0243 SELECT t1a
0244 FROM   t1
0245 WHERE  t1a <= (SELECT   max(t2a)
0246                FROM     t2
0247                WHERE    t2c = t1c
0248                GROUP BY t2c)
0249 UNION DISTINCT
0250 SELECT t1a
0251 FROM   t1
0252 WHERE  t1a >= (SELECT   min(t2a)
0253                FROM     t2
0254                WHERE    t2c = t1c
0255                GROUP BY t2c);
0256 
0257 -- TC 02.08
0258 -- set op
0259 SELECT t1a
0260 FROM   t1
0261 WHERE  t1a <= (SELECT   max(t2a)
0262                FROM     t2
0263                WHERE    t2c = t1c
0264                GROUP BY t2c)
0265 MINUS
0266 SELECT t1a
0267 FROM   t1
0268 WHERE  t1a >= (SELECT   min(t2a)
0269                FROM     t2
0270                WHERE    t2c = t1c
0271                GROUP BY t2c);
0272 
0273 -- TC 02.09
0274 -- in HAVING clause
0275 SELECT   t1a
0276 FROM     t1
0277 GROUP BY t1a, t1c
0278 HAVING   max(t1b) <= (SELECT   max(t2b)
0279                       FROM     t2
0280                       WHERE    t2c = t1c
0281                       GROUP BY t2c);