parSelectTest.cpp 10.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#include "parTestUtil.h"

using namespace std;

namespace ParserTest {

class ParserSelectTest : public ParserTestBase {};

TEST_F(ParserSelectTest, basic) {
  useDb("root", "test");

X
Xiaoyu Wang 已提交
27
  run("SELECT * FROM t1");
28

X
Xiaoyu Wang 已提交
29
  run("SELECT * FROM test.t1");
30

X
Xiaoyu Wang 已提交
31
  run("SELECT ts, c1 FROM t1");
32

X
Xiaoyu Wang 已提交
33
  run("SELECT ts, t.c1 FROM (SELECT * FROM t1) t");
34

X
Xiaoyu Wang 已提交
35
  run("SELECT * FROM t1 tt1, t1 tt2 WHERE tt1.c1 = tt2.c1");
36 37 38 39 40
}

TEST_F(ParserSelectTest, constant) {
  useDb("root", "test");

X
Xiaoyu Wang 已提交
41
  run("SELECT 123, 20.4, 'abc', \"wxy\", timestamp '2022-02-09 17:30:20', true, false, 10s FROM t1");
42

X
Xiaoyu Wang 已提交
43 44
  run("SELECT 1234567890123456789012345678901234567890, 20.1234567890123456789012345678901234567890, 'abc', \"wxy\", "
      "timestamp '2022-02-09 17:30:20', true, false, 15s FROM t1");
45

X
Xiaoyu Wang 已提交
46
  run("SELECT 123 + 45 FROM t1 WHERE 2 - 1");
47 48

  run("SELECT * FROM t1 WHERE -2");
49 50 51 52 53
}

TEST_F(ParserSelectTest, expression) {
  useDb("root", "test");

X
Xiaoyu Wang 已提交
54
  run("SELECT ts + 10s, c1 + 10, concat(c2, 'abc') FROM t1");
55

X
Xiaoyu Wang 已提交
56
  run("SELECT ts > 0, c1 < 20 and c2 = 'qaz' FROM t1");
57

X
Xiaoyu Wang 已提交
58
  run("SELECT ts > 0, c1 between 10 and 20 and c2 = 'qaz' FROM t1");
59 60 61 62 63
}

TEST_F(ParserSelectTest, condition) {
  useDb("root", "test");

X
Xiaoyu Wang 已提交
64
  run("SELECT c1 FROM t1 WHERE ts in (true, false)");
65

X
Xiaoyu Wang 已提交
66
  run("SELECT * FROM t1 WHERE c1 > 10 and c1 is not null");
67 68 69 70 71
}

TEST_F(ParserSelectTest, pseudoColumn) {
  useDb("root", "test");

72
  run("SELECT _WSTARTTS, _WENDTS, COUNT(*) FROM t1 INTERVAL(10s)");
73 74
}

75 76 77
TEST_F(ParserSelectTest, pseudoColumnSemanticCheck) {
  useDb("root", "test");

78
  run("SELECT TBNAME FROM (SELECT * FROM st1s1)", TSDB_CODE_PAR_INVALID_TBNAME, PARSER_STAGE_TRANSLATE);
79 80
}

81 82 83 84 85 86
TEST_F(ParserSelectTest, aggFunc) {
  useDb("root", "test");

  run("SELECT LEASTSQUARES(c1, -1, 1) FROM t1");
}

87 88 89
TEST_F(ParserSelectTest, multiResFunc) {
  useDb("root", "test");

90
  run("SELECT LAST(*), FIRST(*), LAST_ROW(*) FROM t1");
91

92
  run("SELECT LAST(c1, c2), FIRST(t1.*), LAST_ROW(c3) FROM t1");
93

94
  run("SELECT LAST(t2.*), FIRST(t1.c1, t2.*), LAST_ROW(t1.*, t2.*) FROM st1s1 t1, st1s2 t2 WHERE t1.ts = t2.ts");
95 96
}

X
Xiaoyu Wang 已提交
97 98 99
TEST_F(ParserSelectTest, timelineFunc) {
  useDb("root", "test");

100
  run("SELECT LAST(*), FIRST(*) FROM t1");
X
Xiaoyu Wang 已提交
101

102
  run("SELECT FIRST(ts), FIRST(c1), FIRST(c2), FIRST(c3) FROM t1");
X
Xiaoyu Wang 已提交
103

104 105 106
  run("SELECT LAST(*), FIRST(*) FROM t1 GROUP BY c1");

  run("SELECT LAST(*), FIRST(*) FROM t1 INTERVAL(10s)");
X
Xiaoyu Wang 已提交
107

X
Xiaoyu Wang 已提交
108
  run("SELECT diff(c1) FROM t1");
X
Xiaoyu Wang 已提交
109 110
}

111 112
TEST_F(ParserSelectTest, selectFunc) {
  useDb("root", "test");
113

114 115 116 117 118 119 120 121 122
  // select function
  run("SELECT MAX(c1), MIN(c1) FROM t1");
  // select function for GROUP BY clause
  run("SELECT MAX(c1), MIN(c1) FROM t1 GROUP BY c1");
  // select function for INTERVAL clause
  run("SELECT MAX(c1), MIN(c1) FROM t1 INTERVAL(10s)");
  // select function along with the columns of select row
  run("SELECT MAX(c1), c2 FROM t1");
  run("SELECT MAX(c1), t1.* FROM t1");
123 124 125 126 127 128 129
  // select function along with the columns of select row, and with GROUP BY clause
  run("SELECT MAX(c1), c2 FROM t1 GROUP BY c3");
  run("SELECT MAX(c1), t1.* FROM t1 GROUP BY c3");
  // select function along with the columns of select row, and with window clause
  run("SELECT MAX(c1), c2 FROM t1 INTERVAL(10s)");
  run("SELECT MAX(c1), c2 FROM t1 SESSION(ts, 10s)");
  run("SELECT MAX(c1), c2 FROM t1 STATE_WINDOW(c3)");
130 131
}

X
Xiaoyu Wang 已提交
132
TEST_F(ParserSelectTest, IndefiniteRowsFunc) {
133 134 135 136 137
  useDb("root", "test");

  run("SELECT DIFF(c1) FROM t1");
}

X
Xiaoyu Wang 已提交
138
TEST_F(ParserSelectTest, IndefiniteRowsFuncSemanticCheck) {
139 140 141 142 143 144 145 146 147
  useDb("root", "test");

  run("SELECT DIFF(c1), c2 FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);

  run("SELECT DIFF(c1), tbname FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);

  run("SELECT DIFF(c1), count(*) FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);

  run("SELECT DIFF(c1), CSUM(c1) FROM t1", TSDB_CODE_PAR_NOT_ALLOWED_FUNC, PARSER_STAGE_TRANSLATE);
148 149

  // run("SELECT DIFF(c1) FROM t1 INTERVAL(10s)");
150 151
}

152 153 154 155 156 157 158 159
TEST_F(ParserSelectTest, useDefinedFunc) {
  useDb("root", "test");

  run("SELECT udf1(c1) FROM t1");

  run("SELECT udf2(c1) FROM t1 GROUP BY c2");
}

160
TEST_F(ParserSelectTest, groupBy) {
161 162
  useDb("root", "test");

X
Xiaoyu Wang 已提交
163
  run("SELECT COUNT(*) cnt FROM t1 WHERE c1 > 0");
164

165
  run("SELECT COUNT(*), c2 cnt FROM t1 WHERE c1 > 0 GROUP BY c2");
166

167
  run("SELECT COUNT(*) cnt FROM t1 WHERE c1 > 0 GROUP BY c2 having COUNT(c1) > 10");
168

169
  run("SELECT COUNT(*), c1, c2 + 10, c1 + c2 cnt FROM t1 WHERE c1 > 0 GROUP BY c2, c1");
170

171
  run("SELECT COUNT(*), c1 + 10, c2 cnt FROM t1 WHERE c1 > 0 GROUP BY c1 + 10, c2");
172 173 174 175
}

TEST_F(ParserSelectTest, orderBy) {
  useDb("root", "test");
176

177
  run("SELECT COUNT(*) cnt FROM t1 WHERE c1 > 0 GROUP BY c2 order by cnt");
178

179
  run("SELECT COUNT(*) cnt FROM t1 WHERE c1 > 0 GROUP BY c2 order by 1");
180 181 182 183
}

TEST_F(ParserSelectTest, distinct) {
  useDb("root", "test");
184

X
Xiaoyu Wang 已提交
185
  // run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by c1");
186

X
Xiaoyu Wang 已提交
187
  // run("SELECT distinct c1 + 10, c2 FROM t1 WHERE c1 > 0 order by c1 + 10, c2");
188

X
Xiaoyu Wang 已提交
189
  // run("SELECT distinct c1 + 10 cc1, c2 cc2 FROM t1 WHERE c1 > 0 order by cc1, c2");
190

191
  // run("SELECT distinct COUNT(c2) FROM t1 WHERE c1 > 0 GROUP BY c1 order by COUNT(c2)");
192 193
}

X
Xiaoyu Wang 已提交
194 195 196 197
// INTERVAL(interval_val [, interval_offset]) [SLIDING (sliding_val)] [FILL(fill_mod_and_val)]
// fill_mod_and_val = { NONE | PREV | NULL | LINEAR | NEXT | value_mod }
// value_mod = VALUE , val ...
TEST_F(ParserSelectTest, interval) {
198
  useDb("root", "test");
X
Xiaoyu Wang 已提交
199 200 201 202 203 204 205
  // INTERVAL(interval_val)
  run("SELECT COUNT(*) FROM t1 INTERVAL(10s)");
  // INTERVAL(interval_val, interval_offset)
  run("SELECT COUNT(*) FROM t1 INTERVAL(10s, 5s)");
  // INTERVAL(interval_val, interval_offset) SLIDING (sliding_val)
  run("SELECT COUNT(*) FROM t1 INTERVAL(10s, 5s) SLIDING(7s)");
  // INTERVAL(interval_val) FILL(NONE)
X
Xiaoyu Wang 已提交
206 207
  run("SELECT COUNT(*) FROM t1 WHERE ts > TIMESTAMP '2022-04-01 00:00:00' and ts < TIMESTAMP '2022-04-30 23:59:59' "
      "INTERVAL(10s) FILL(NONE)");
208 209
}

210 211 212
TEST_F(ParserSelectTest, intervalSemanticCheck) {
  useDb("root", "test");

213
  run("SELECT c1 FROM t1 INTERVAL(10s)", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE);
214 215
  run("SELECT DISTINCT c1, c2 FROM t1 WHERE c1 > 3 INTERVAL(1d) FILL(NEXT)", TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE,
      PARSER_STAGE_TRANSLATE);
216 217
}

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
TEST_F(ParserSelectTest, subquery) {
  useDb("root", "test");

  run("SELECT SUM(a) FROM (SELECT MAX(c1) a, ts FROM st1s1 INTERVAL(1m)) INTERVAL(1n)");

  run("SELECT SUM(a) FROM (SELECT MAX(c1) a, _wstartts FROM st1s1 INTERVAL(1m)) INTERVAL(1n)");

  run("SELECT SUM(a) FROM (SELECT MAX(c1) a, ts FROM st1s1 PARTITION BY TBNAME INTERVAL(1m)) INTERVAL(1n)");

  run("SELECT SUM(a) FROM (SELECT MAX(c1) a, _wstartts FROM st1s1 PARTITION BY TBNAME INTERVAL(1m)) INTERVAL(1n)");
}

TEST_F(ParserSelectTest, subquerySemanticError) {
  useDb("root", "test");

  run("SELECT SUM(a) FROM (SELECT MAX(c1) a FROM st1s1 INTERVAL(1m)) INTERVAL(1n)", TSDB_CODE_PAR_NOT_ALLOWED_WIN_QUERY,
      PARSER_STAGE_TRANSLATE);
}

237 238 239 240
TEST_F(ParserSelectTest, semanticError) {
  useDb("root", "test");

  // TSDB_CODE_PAR_INVALID_COLUMN
X
Xiaoyu Wang 已提交
241
  run("SELECT c1, cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN, PARSER_STAGE_TRANSLATE);
242

X
Xiaoyu Wang 已提交
243
  run("SELECT t1.c1, t1.cc1 FROM t1", TSDB_CODE_PAR_INVALID_COLUMN, PARSER_STAGE_TRANSLATE);
244 245

  // TSDB_CODE_PAR_TABLE_NOT_EXIST
X
Xiaoyu Wang 已提交
246
  run("SELECT * FROM t10", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE);
247

X
Xiaoyu Wang 已提交
248
  run("SELECT * FROM test.t10", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE);
249

X
Xiaoyu Wang 已提交
250
  run("SELECT t2.c1 FROM t1", TSDB_CODE_PAR_TABLE_NOT_EXIST, PARSER_STAGE_TRANSLATE);
251 252

  // TSDB_CODE_PAR_AMBIGUOUS_COLUMN
X
Xiaoyu Wang 已提交
253
  run("SELECT c2 FROM t1 tt1, t1 tt2 WHERE tt1.c1 = tt2.c1", TSDB_CODE_PAR_AMBIGUOUS_COLUMN, PARSER_STAGE_TRANSLATE);
254

255 256
  run("SELECT c2 FROM (SELECT c1 c2, c2 FROM t1)", TSDB_CODE_PAR_AMBIGUOUS_COLUMN, PARSER_STAGE_TRANSLATE);

257
  // TSDB_CODE_PAR_WRONG_VALUE_TYPE
258
  run("SELECT timestamp '2010a' FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE);
259

260 261 262 263
  run("SELECT LAST(*) + SUM(c1) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE);

  run("SELECT CEIL(LAST(ts, c1)) FROM t1", TSDB_CODE_PAR_WRONG_VALUE_TYPE, PARSER_STAGE_TRANSLATE);

264
  // TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION
X
Xiaoyu Wang 已提交
265
  run("SELECT c2 FROM t1 tt1 join t1 tt2 on COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION,
266 267
      PARSER_STAGE_TRANSLATE);

X
Xiaoyu Wang 已提交
268
  run("SELECT c2 FROM t1 WHERE COUNT(*) > 0", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION, PARSER_STAGE_TRANSLATE);
269

270
  run("SELECT c2 FROM t1 GROUP BY COUNT(*)", TSDB_CODE_PAR_ILLEGAL_USE_AGG_FUNCTION, PARSER_STAGE_TRANSLATE);
271 272

  // TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT
X
Xiaoyu Wang 已提交
273
  run("SELECT c2 FROM t1 order by 0", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT, PARSER_STAGE_TRANSLATE);
274

X
Xiaoyu Wang 已提交
275
  run("SELECT c2 FROM t1 order by 2", TSDB_CODE_PAR_WRONG_NUMBER_OF_SELECT, PARSER_STAGE_TRANSLATE);
276 277

  // TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION
X
Xiaoyu Wang 已提交
278
  run("SELECT COUNT(*) cnt FROM t1 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION, PARSER_STAGE_TRANSLATE);
279

280
  run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c1 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION,
281 282
      PARSER_STAGE_TRANSLATE);

283
  run("SELECT COUNT(*), c1 cnt FROM t1 GROUP BY c2 having c2 > 0", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION,
284 285
      PARSER_STAGE_TRANSLATE);

286
  run("SELECT COUNT(*) cnt FROM t1 GROUP BY c2 having c2 > 0 order by c1", TSDB_CODE_PAR_GROUPBY_LACK_EXPRESSION,
287 288 289
      PARSER_STAGE_TRANSLATE);

  // TSDB_CODE_PAR_NOT_SINGLE_GROUP
X
Xiaoyu Wang 已提交
290
  run("SELECT COUNT(*), c1 FROM t1", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE);
291

X
Xiaoyu Wang 已提交
292
  run("SELECT COUNT(*) FROM t1 order by c1", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE);
293

X
Xiaoyu Wang 已提交
294
  run("SELECT c1 FROM t1 order by COUNT(*)", TSDB_CODE_PAR_NOT_SINGLE_GROUP, PARSER_STAGE_TRANSLATE);
295 296

  // TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION
X
Xiaoyu Wang 已提交
297
  run("SELECT distinct c1, c2 FROM t1 WHERE c1 > 0 order by ts", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION,
298 299
      PARSER_STAGE_TRANSLATE);

X
Xiaoyu Wang 已提交
300
  run("SELECT distinct c1 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION,
301 302
      PARSER_STAGE_TRANSLATE);

X
Xiaoyu Wang 已提交
303
  run("SELECT distinct c2 FROM t1 WHERE c1 > 0 order by COUNT(c2)", TSDB_CODE_PAR_NOT_SELECTED_EXPRESSION,
304 305 306
      PARSER_STAGE_TRANSLATE);
}

X
Xiaoyu Wang 已提交
307 308 309
TEST_F(ParserSelectTest, setOperator) {
  useDb("root", "test");

X
Xiaoyu Wang 已提交
310
  run("SELECT * FROM t1 UNION ALL SELECT * FROM t1");
X
Xiaoyu Wang 已提交
311

X
Xiaoyu Wang 已提交
312
  run("(SELECT * FROM t1) UNION ALL (SELECT * FROM t1)");
313 314

  run("SELECT c1 FROM (SELECT c1 FROM t1 UNION ALL SELECT c1 FROM t1)");
X
Xiaoyu Wang 已提交
315 316
}

X
Xiaoyu Wang 已提交
317 318 319 320 321 322
TEST_F(ParserSelectTest, informationSchema) {
  useDb("root", "test");

  run("SELECT * FROM information_schema.user_databases WHERE name = 'information_schema'");
}

323
}  // namespace ParserTest