TestSqlExpressionParser.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. * Copyright (c) 2021, Jan de Visser <jan@de-visser.net>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibTest/TestCase.h>
  8. #include <AK/HashMap.h>
  9. #include <AK/Result.h>
  10. #include <AK/String.h>
  11. #include <AK/StringBuilder.h>
  12. #include <AK/StringView.h>
  13. #include <AK/TypeCasts.h>
  14. #include <LibSQL/AST/Lexer.h>
  15. #include <LibSQL/AST/Parser.h>
  16. namespace {
  17. class ExpressionParser : public SQL::AST::Parser {
  18. public:
  19. explicit ExpressionParser(SQL::AST::Lexer lexer)
  20. : SQL::AST::Parser(move(lexer))
  21. {
  22. }
  23. NonnullRefPtr<SQL::AST::Expression> parse()
  24. {
  25. return SQL::AST::Parser::parse_expression();
  26. }
  27. };
  28. using ParseResult = AK::Result<NonnullRefPtr<SQL::AST::Expression>, String>;
  29. ParseResult parse(StringView sql)
  30. {
  31. auto parser = ExpressionParser(SQL::AST::Lexer(sql));
  32. auto expression = parser.parse();
  33. if (parser.has_errors()) {
  34. return parser.errors()[0].to_string();
  35. }
  36. return expression;
  37. }
  38. }
  39. TEST_CASE(numeric_literal)
  40. {
  41. // FIXME Right now the "1a" test fails (meaning the parse succeeds).
  42. // This is obviously inconsistent.
  43. // See the FIXME in lexer.cpp, method consume_exponent() about
  44. // solutions.
  45. // EXPECT(parse("1e").is_error());
  46. // EXPECT(parse("1a").is_error());
  47. // EXPECT(parse("0x").is_error());
  48. auto validate = [](StringView sql, double expected_value) {
  49. auto result = parse(sql);
  50. EXPECT(!result.is_error());
  51. auto expression = result.release_value();
  52. EXPECT(is<SQL::AST::NumericLiteral>(*expression));
  53. const auto& literal = static_cast<const SQL::AST::NumericLiteral&>(*expression);
  54. EXPECT_EQ(literal.value(), expected_value);
  55. };
  56. validate("123", 123);
  57. validate("3.14", 3.14);
  58. validate("0xA", 10);
  59. validate("0xff", 255);
  60. validate("0x100", 256);
  61. validate("1e3", 1000);
  62. }
  63. TEST_CASE(string_literal)
  64. {
  65. EXPECT(parse("'").is_error());
  66. EXPECT(parse("'unterminated").is_error());
  67. auto validate = [](StringView sql, StringView expected_value) {
  68. auto result = parse(sql);
  69. EXPECT(!result.is_error());
  70. auto expression = result.release_value();
  71. EXPECT(is<SQL::AST::StringLiteral>(*expression));
  72. const auto& literal = static_cast<const SQL::AST::StringLiteral&>(*expression);
  73. EXPECT_EQ(literal.value(), expected_value);
  74. };
  75. validate("''", "");
  76. validate("'hello friends'", "hello friends");
  77. validate("'hello ''friends'''", "hello 'friends'");
  78. }
  79. TEST_CASE(blob_literal)
  80. {
  81. EXPECT(parse("x'").is_error());
  82. EXPECT(parse("x'unterminated").is_error());
  83. EXPECT(parse("x'NOTHEX'").is_error());
  84. auto validate = [](StringView sql, StringView expected_value) {
  85. auto result = parse(sql);
  86. EXPECT(!result.is_error());
  87. auto expression = result.release_value();
  88. EXPECT(is<SQL::AST::BlobLiteral>(*expression));
  89. const auto& literal = static_cast<const SQL::AST::BlobLiteral&>(*expression);
  90. EXPECT_EQ(literal.value(), expected_value);
  91. };
  92. validate("x''", "");
  93. validate("x'DEADC0DE'", "DEADC0DE");
  94. }
  95. TEST_CASE(null_literal)
  96. {
  97. auto validate = [](StringView sql) {
  98. auto result = parse(sql);
  99. EXPECT(!result.is_error());
  100. auto expression = result.release_value();
  101. EXPECT(is<SQL::AST::NullLiteral>(*expression));
  102. };
  103. validate("NULL");
  104. }
  105. TEST_CASE(column_name)
  106. {
  107. EXPECT(parse(".column_name").is_error());
  108. EXPECT(parse("table_name.").is_error());
  109. EXPECT(parse("schema_name.table_name.").is_error());
  110. EXPECT(parse("\"unterminated").is_error());
  111. auto validate = [](StringView sql, StringView expected_schema, StringView expected_table, StringView expected_column) {
  112. auto result = parse(sql);
  113. EXPECT(!result.is_error());
  114. auto expression = result.release_value();
  115. EXPECT(is<SQL::AST::ColumnNameExpression>(*expression));
  116. const auto& column = static_cast<const SQL::AST::ColumnNameExpression&>(*expression);
  117. EXPECT_EQ(column.schema_name(), expected_schema);
  118. EXPECT_EQ(column.table_name(), expected_table);
  119. EXPECT_EQ(column.column_name(), expected_column);
  120. };
  121. validate("column_name", {}, {}, "COLUMN_NAME");
  122. validate("table_name.column_name", {}, "TABLE_NAME", "COLUMN_NAME");
  123. validate("schema_name.table_name.column_name", "SCHEMA_NAME", "TABLE_NAME", "COLUMN_NAME");
  124. validate("\"Column_Name\"", {}, {}, "Column_Name");
  125. validate("\"Column\n_Name\"", {}, {}, "Column\n_Name");
  126. }
  127. TEST_CASE(unary_operator)
  128. {
  129. EXPECT(parse("-").is_error());
  130. EXPECT(parse("--").is_error());
  131. EXPECT(parse("+").is_error());
  132. EXPECT(parse("++").is_error());
  133. EXPECT(parse("~").is_error());
  134. EXPECT(parse("~~").is_error());
  135. EXPECT(parse("NOT").is_error());
  136. auto validate = [](StringView sql, SQL::AST::UnaryOperator expected_operator) {
  137. auto result = parse(sql);
  138. EXPECT(!result.is_error());
  139. auto expression = result.release_value();
  140. EXPECT(is<SQL::AST::UnaryOperatorExpression>(*expression));
  141. const auto& unary = static_cast<const SQL::AST::UnaryOperatorExpression&>(*expression);
  142. EXPECT_EQ(unary.type(), expected_operator);
  143. const auto& secondary_expression = unary.expression();
  144. EXPECT(!is<SQL::AST::ErrorExpression>(*secondary_expression));
  145. };
  146. validate("-15", SQL::AST::UnaryOperator::Minus);
  147. validate("+15", SQL::AST::UnaryOperator::Plus);
  148. validate("~15", SQL::AST::UnaryOperator::BitwiseNot);
  149. validate("NOT 15", SQL::AST::UnaryOperator::Not);
  150. }
  151. TEST_CASE(binary_operator)
  152. {
  153. HashMap<StringView, SQL::AST::BinaryOperator> operators {
  154. { "||", SQL::AST::BinaryOperator::Concatenate },
  155. { "*", SQL::AST::BinaryOperator::Multiplication },
  156. { "/", SQL::AST::BinaryOperator::Division },
  157. { "%", SQL::AST::BinaryOperator::Modulo },
  158. { "+", SQL::AST::BinaryOperator::Plus },
  159. { "-", SQL::AST::BinaryOperator::Minus },
  160. { "<<", SQL::AST::BinaryOperator::ShiftLeft },
  161. { ">>", SQL::AST::BinaryOperator::ShiftRight },
  162. { "&", SQL::AST::BinaryOperator::BitwiseAnd },
  163. { "|", SQL::AST::BinaryOperator::BitwiseOr },
  164. { "<", SQL::AST::BinaryOperator::LessThan },
  165. { "<=", SQL::AST::BinaryOperator::LessThanEquals },
  166. { ">", SQL::AST::BinaryOperator::GreaterThan },
  167. { ">=", SQL::AST::BinaryOperator::GreaterThanEquals },
  168. { "=", SQL::AST::BinaryOperator::Equals },
  169. { "==", SQL::AST::BinaryOperator::Equals },
  170. { "!=", SQL::AST::BinaryOperator::NotEquals },
  171. { "<>", SQL::AST::BinaryOperator::NotEquals },
  172. { "AND", SQL::AST::BinaryOperator::And },
  173. { "OR", SQL::AST::BinaryOperator::Or },
  174. };
  175. for (auto op : operators) {
  176. EXPECT(parse(op.key).is_error());
  177. StringBuilder builder;
  178. builder.append("1 ");
  179. builder.append(op.key);
  180. EXPECT(parse(builder.build()).is_error());
  181. builder.clear();
  182. if (op.key != "+" && op.key != "-") { // "+1" and "-1" are fine (unary operator).
  183. builder.append(op.key);
  184. builder.append(" 1");
  185. EXPECT(parse(builder.build()).is_error());
  186. }
  187. }
  188. auto validate = [](StringView sql, SQL::AST::BinaryOperator expected_operator) {
  189. auto result = parse(sql);
  190. EXPECT(!result.is_error());
  191. auto expression = result.release_value();
  192. EXPECT(is<SQL::AST::BinaryOperatorExpression>(*expression));
  193. const auto& binary = static_cast<const SQL::AST::BinaryOperatorExpression&>(*expression);
  194. EXPECT(!is<SQL::AST::ErrorExpression>(*binary.lhs()));
  195. EXPECT(!is<SQL::AST::ErrorExpression>(*binary.rhs()));
  196. EXPECT_EQ(binary.type(), expected_operator);
  197. };
  198. for (auto op : operators) {
  199. StringBuilder builder;
  200. builder.append("1 ");
  201. builder.append(op.key);
  202. builder.append(" 1");
  203. validate(builder.build(), op.value);
  204. }
  205. }
  206. TEST_CASE(chained_expression)
  207. {
  208. EXPECT(parse("()").is_error());
  209. EXPECT(parse("(,)").is_error());
  210. EXPECT(parse("(15,)").is_error());
  211. auto validate = [](StringView sql, size_t expected_chain_size) {
  212. auto result = parse(sql);
  213. EXPECT(!result.is_error());
  214. auto expression = result.release_value();
  215. EXPECT(is<SQL::AST::ChainedExpression>(*expression));
  216. const auto& chain = static_cast<const SQL::AST::ChainedExpression&>(*expression).expressions();
  217. EXPECT_EQ(chain.size(), expected_chain_size);
  218. for (const auto& chained_expression : chain)
  219. EXPECT(!is<SQL::AST::ErrorExpression>(chained_expression));
  220. };
  221. validate("(15)", 1);
  222. validate("(15, 16)", 2);
  223. validate("(15, 16, column_name)", 3);
  224. }
  225. TEST_CASE(cast_expression)
  226. {
  227. EXPECT(parse("CAST").is_error());
  228. EXPECT(parse("CAST (").is_error());
  229. EXPECT(parse("CAST ()").is_error());
  230. EXPECT(parse("CAST (15)").is_error());
  231. EXPECT(parse("CAST (15 AS").is_error());
  232. EXPECT(parse("CAST (15 AS)").is_error());
  233. EXPECT(parse("CAST (15 AS int").is_error());
  234. auto validate = [](StringView sql, StringView expected_type_name) {
  235. auto result = parse(sql);
  236. if (result.is_error())
  237. outln("{}: {}", sql, result.error());
  238. EXPECT(!result.is_error());
  239. auto expression = result.release_value();
  240. EXPECT(is<SQL::AST::CastExpression>(*expression));
  241. const auto& cast = static_cast<const SQL::AST::CastExpression&>(*expression);
  242. EXPECT(!is<SQL::AST::ErrorExpression>(*cast.expression()));
  243. const auto& type_name = cast.type_name();
  244. EXPECT_EQ(type_name->name(), expected_type_name);
  245. };
  246. validate("CAST (15 AS int)", "INT");
  247. // FIXME The syntax in the test below fails on both sqlite3 and psql (PostgreSQL).
  248. // Also fails here because null is interpreted as the NULL keyword and not the
  249. // identifier null (which is not a type)
  250. // validate("CAST ('NULL' AS null)", "null");
  251. validate("CAST (15 AS varchar(255))", "VARCHAR");
  252. }
  253. TEST_CASE(case_expression)
  254. {
  255. EXPECT(parse("CASE").is_error());
  256. EXPECT(parse("CASE END").is_error());
  257. EXPECT(parse("CASE 15").is_error());
  258. EXPECT(parse("CASE 15 END").is_error());
  259. EXPECT(parse("CASE WHEN").is_error());
  260. EXPECT(parse("CASE WHEN THEN").is_error());
  261. EXPECT(parse("CASE WHEN 15 THEN 16").is_error());
  262. EXPECT(parse("CASE WHEN 15 THEN 16 ELSE").is_error());
  263. EXPECT(parse("CASE WHEN 15 THEN 16 ELSE END").is_error());
  264. auto validate = [](StringView sql, bool expect_case_expression, size_t expected_when_then_size, bool expect_else_expression) {
  265. auto result = parse(sql);
  266. EXPECT(!result.is_error());
  267. auto expression = result.release_value();
  268. EXPECT(is<SQL::AST::CaseExpression>(*expression));
  269. const auto& case_ = static_cast<const SQL::AST::CaseExpression&>(*expression);
  270. const auto& case_expression = case_.case_expression();
  271. EXPECT_EQ(case_expression.is_null(), !expect_case_expression);
  272. if (case_expression)
  273. EXPECT(!is<SQL::AST::ErrorExpression>(*case_expression));
  274. const auto& when_then_clauses = case_.when_then_clauses();
  275. EXPECT_EQ(when_then_clauses.size(), expected_when_then_size);
  276. for (const auto& when_then_clause : when_then_clauses) {
  277. EXPECT(!is<SQL::AST::ErrorExpression>(*when_then_clause.when));
  278. EXPECT(!is<SQL::AST::ErrorExpression>(*when_then_clause.then));
  279. }
  280. const auto& else_expression = case_.else_expression();
  281. EXPECT_EQ(else_expression.is_null(), !expect_else_expression);
  282. if (else_expression)
  283. EXPECT(!is<SQL::AST::ErrorExpression>(*else_expression));
  284. };
  285. validate("CASE WHEN 16 THEN 17 END", false, 1, false);
  286. validate("CASE WHEN 16 THEN 17 WHEN 18 THEN 19 END", false, 2, false);
  287. validate("CASE WHEN 16 THEN 17 WHEN 18 THEN 19 ELSE 20 END", false, 2, true);
  288. validate("CASE 15 WHEN 16 THEN 17 END", true, 1, false);
  289. validate("CASE 15 WHEN 16 THEN 17 WHEN 18 THEN 19 END", true, 2, false);
  290. validate("CASE 15 WHEN 16 THEN 17 WHEN 18 THEN 19 ELSE 20 END", true, 2, true);
  291. }
  292. TEST_CASE(exists_expression)
  293. {
  294. EXPECT(parse("EXISTS").is_error());
  295. EXPECT(parse("EXISTS (").is_error());
  296. EXPECT(parse("EXISTS (SELECT").is_error());
  297. EXPECT(parse("EXISTS (SELECT)").is_error());
  298. EXPECT(parse("EXISTS (SELECT * FROM table_name").is_error());
  299. EXPECT(parse("NOT EXISTS").is_error());
  300. EXPECT(parse("NOT EXISTS (").is_error());
  301. EXPECT(parse("NOT EXISTS (SELECT").is_error());
  302. EXPECT(parse("NOT EXISTS (SELECT)").is_error());
  303. EXPECT(parse("NOT EXISTS (SELECT * FROM table_name").is_error());
  304. EXPECT(parse("(").is_error());
  305. EXPECT(parse("(SELECT").is_error());
  306. EXPECT(parse("(SELECT)").is_error());
  307. EXPECT(parse("(SELECT * FROM table_name").is_error());
  308. auto validate = [](StringView sql, bool expected_invert_expression) {
  309. auto result = parse(sql);
  310. EXPECT(!result.is_error());
  311. auto expression = result.release_value();
  312. EXPECT(is<SQL::AST::ExistsExpression>(*expression));
  313. const auto& exists = static_cast<const SQL::AST::ExistsExpression&>(*expression);
  314. EXPECT_EQ(exists.invert_expression(), expected_invert_expression);
  315. };
  316. validate("EXISTS (SELECT * FROM table_name)", false);
  317. validate("NOT EXISTS (SELECT * FROM table_name)", true);
  318. validate("(SELECT * FROM table_name)", false);
  319. }
  320. TEST_CASE(collate_expression)
  321. {
  322. EXPECT(parse("COLLATE").is_error());
  323. EXPECT(parse("COLLATE name").is_error());
  324. EXPECT(parse("15 COLLATE").is_error());
  325. auto validate = [](StringView sql, StringView expected_collation_name) {
  326. auto result = parse(sql);
  327. EXPECT(!result.is_error());
  328. auto expression = result.release_value();
  329. EXPECT(is<SQL::AST::CollateExpression>(*expression));
  330. const auto& collate = static_cast<const SQL::AST::CollateExpression&>(*expression);
  331. EXPECT(!is<SQL::AST::ErrorExpression>(*collate.expression()));
  332. EXPECT_EQ(collate.collation_name(), expected_collation_name);
  333. };
  334. validate("15 COLLATE fifteen", "FIFTEEN");
  335. validate("(15, 16) COLLATE \"chain\"", "chain");
  336. }
  337. TEST_CASE(is_expression)
  338. {
  339. EXPECT(parse("IS").is_error());
  340. EXPECT(parse("IS 1").is_error());
  341. EXPECT(parse("1 IS").is_error());
  342. EXPECT(parse("IS NOT").is_error());
  343. EXPECT(parse("IS NOT 1").is_error());
  344. EXPECT(parse("1 IS NOT").is_error());
  345. auto validate = [](StringView sql, bool expected_invert_expression) {
  346. auto result = parse(sql);
  347. EXPECT(!result.is_error());
  348. auto expression = result.release_value();
  349. EXPECT(is<SQL::AST::IsExpression>(*expression));
  350. const auto& is_ = static_cast<const SQL::AST::IsExpression&>(*expression);
  351. EXPECT(!is<SQL::AST::ErrorExpression>(*is_.lhs()));
  352. EXPECT(!is<SQL::AST::ErrorExpression>(*is_.rhs()));
  353. EXPECT_EQ(is_.invert_expression(), expected_invert_expression);
  354. };
  355. validate("1 IS NULL", false);
  356. validate("1 IS NOT NULL", true);
  357. }
  358. TEST_CASE(match_expression)
  359. {
  360. HashMap<StringView, SQL::AST::MatchOperator> operators {
  361. { "LIKE", SQL::AST::MatchOperator::Like },
  362. { "GLOB", SQL::AST::MatchOperator::Glob },
  363. { "MATCH", SQL::AST::MatchOperator::Match },
  364. { "REGEXP", SQL::AST::MatchOperator::Regexp },
  365. };
  366. for (auto op : operators) {
  367. EXPECT(parse(op.key).is_error());
  368. StringBuilder builder;
  369. builder.append("1 ");
  370. builder.append(op.key);
  371. EXPECT(parse(builder.build()).is_error());
  372. builder.clear();
  373. builder.append(op.key);
  374. builder.append(" 1");
  375. EXPECT(parse(builder.build()).is_error());
  376. }
  377. auto validate = [](StringView sql, SQL::AST::MatchOperator expected_operator, bool expected_invert_expression, bool expect_escape) {
  378. auto result = parse(sql);
  379. EXPECT(!result.is_error());
  380. auto expression = result.release_value();
  381. EXPECT(is<SQL::AST::MatchExpression>(*expression));
  382. const auto& match = static_cast<const SQL::AST::MatchExpression&>(*expression);
  383. EXPECT(!is<SQL::AST::ErrorExpression>(*match.lhs()));
  384. EXPECT(!is<SQL::AST::ErrorExpression>(*match.rhs()));
  385. EXPECT_EQ(match.type(), expected_operator);
  386. EXPECT_EQ(match.invert_expression(), expected_invert_expression);
  387. EXPECT(match.escape() || !expect_escape);
  388. };
  389. for (auto op : operators) {
  390. StringBuilder builder;
  391. builder.append("1 ");
  392. builder.append(op.key);
  393. builder.append(" 1");
  394. validate(builder.build(), op.value, false, false);
  395. builder.clear();
  396. builder.append("1 NOT ");
  397. builder.append(op.key);
  398. builder.append(" 1");
  399. validate(builder.build(), op.value, true, false);
  400. builder.clear();
  401. builder.append("1 NOT ");
  402. builder.append(op.key);
  403. builder.append(" 1 ESCAPE '+'");
  404. validate(builder.build(), op.value, true, true);
  405. }
  406. }
  407. TEST_CASE(null_expression)
  408. {
  409. EXPECT(parse("ISNULL").is_error());
  410. EXPECT(parse("NOTNULL").is_error());
  411. EXPECT(parse("15 NOT").is_error());
  412. auto validate = [](StringView sql, bool expected_invert_expression) {
  413. auto result = parse(sql);
  414. EXPECT(!result.is_error());
  415. auto expression = result.release_value();
  416. EXPECT(is<SQL::AST::NullExpression>(*expression));
  417. const auto& null = static_cast<const SQL::AST::NullExpression&>(*expression);
  418. EXPECT_EQ(null.invert_expression(), expected_invert_expression);
  419. };
  420. validate("15 ISNULL", false);
  421. validate("15 NOTNULL", true);
  422. validate("15 NOT NULL", true);
  423. }
  424. TEST_CASE(between_expression)
  425. {
  426. EXPECT(parse("BETWEEN").is_error());
  427. EXPECT(parse("NOT BETWEEN").is_error());
  428. EXPECT(parse("BETWEEN 10 AND 20").is_error());
  429. EXPECT(parse("NOT BETWEEN 10 AND 20").is_error());
  430. EXPECT(parse("15 BETWEEN 10").is_error());
  431. EXPECT(parse("15 BETWEEN 10 AND").is_error());
  432. EXPECT(parse("15 BETWEEN AND 20").is_error());
  433. EXPECT(parse("15 BETWEEN 10 OR 20").is_error());
  434. auto validate = [](StringView sql, bool expected_invert_expression) {
  435. auto result = parse(sql);
  436. EXPECT(!result.is_error());
  437. auto expression = result.release_value();
  438. EXPECT(is<SQL::AST::BetweenExpression>(*expression));
  439. const auto& between = static_cast<const SQL::AST::BetweenExpression&>(*expression);
  440. EXPECT(!is<SQL::AST::ErrorExpression>(*between.expression()));
  441. EXPECT(!is<SQL::AST::ErrorExpression>(*between.lhs()));
  442. EXPECT(!is<SQL::AST::ErrorExpression>(*between.rhs()));
  443. EXPECT_EQ(between.invert_expression(), expected_invert_expression);
  444. };
  445. validate("15 BETWEEN 10 AND 20", false);
  446. validate("15 NOT BETWEEN 10 AND 20", true);
  447. }
  448. TEST_CASE(in_table_expression)
  449. {
  450. EXPECT(parse("IN").is_error());
  451. EXPECT(parse("IN table_name").is_error());
  452. EXPECT(parse("NOT IN").is_error());
  453. EXPECT(parse("NOT IN table_name").is_error());
  454. auto validate = [](StringView sql, StringView expected_schema, StringView expected_table, bool expected_invert_expression) {
  455. auto result = parse(sql);
  456. EXPECT(!result.is_error());
  457. auto expression = result.release_value();
  458. EXPECT(is<SQL::AST::InTableExpression>(*expression));
  459. const auto& in = static_cast<const SQL::AST::InTableExpression&>(*expression);
  460. EXPECT(!is<SQL::AST::ErrorExpression>(*in.expression()));
  461. EXPECT_EQ(in.schema_name(), expected_schema);
  462. EXPECT_EQ(in.table_name(), expected_table);
  463. EXPECT_EQ(in.invert_expression(), expected_invert_expression);
  464. };
  465. validate("15 IN table_name", {}, "TABLE_NAME", false);
  466. validate("15 IN schema_name.table_name", "SCHEMA_NAME", "TABLE_NAME", false);
  467. validate("15 NOT IN table_name", {}, "TABLE_NAME", true);
  468. validate("15 NOT IN schema_name.table_name", "SCHEMA_NAME", "TABLE_NAME", true);
  469. }
  470. TEST_CASE(in_chained_expression)
  471. {
  472. EXPECT(parse("IN ()").is_error());
  473. EXPECT(parse("NOT IN ()").is_error());
  474. auto validate = [](StringView sql, size_t expected_chain_size, bool expected_invert_expression) {
  475. auto result = parse(sql);
  476. EXPECT(!result.is_error());
  477. auto expression = result.release_value();
  478. EXPECT(is<SQL::AST::InChainedExpression>(*expression));
  479. const auto& in = static_cast<const SQL::AST::InChainedExpression&>(*expression);
  480. EXPECT(!is<SQL::AST::ErrorExpression>(*in.expression()));
  481. EXPECT_EQ(in.expression_chain()->expressions().size(), expected_chain_size);
  482. EXPECT_EQ(in.invert_expression(), expected_invert_expression);
  483. for (const auto& chained_expression : in.expression_chain()->expressions())
  484. EXPECT(!is<SQL::AST::ErrorExpression>(chained_expression));
  485. };
  486. validate("15 IN ()", 0, false);
  487. validate("15 IN (15)", 1, false);
  488. validate("15 IN (15, 16)", 2, false);
  489. validate("15 NOT IN ()", 0, true);
  490. validate("15 NOT IN (15)", 1, true);
  491. validate("15 NOT IN (15, 16)", 2, true);
  492. }
  493. TEST_CASE(in_selection_expression)
  494. {
  495. EXPECT(parse("IN (SELECT)").is_error());
  496. EXPECT(parse("IN (SELECT * FROM table_name, SELECT * FROM table_name);").is_error());
  497. EXPECT(parse("NOT IN (SELECT)").is_error());
  498. EXPECT(parse("NOT IN (SELECT * FROM table_name, SELECT * FROM table_name);").is_error());
  499. auto validate = [](StringView sql, bool expected_invert_expression) {
  500. auto result = parse(sql);
  501. EXPECT(!result.is_error());
  502. auto expression = result.release_value();
  503. EXPECT(is<SQL::AST::InSelectionExpression>(*expression));
  504. const auto& in = static_cast<const SQL::AST::InSelectionExpression&>(*expression);
  505. EXPECT(!is<SQL::AST::ErrorExpression>(*in.expression()));
  506. EXPECT_EQ(in.invert_expression(), expected_invert_expression);
  507. };
  508. validate("15 IN (SELECT * FROM table_name)", false);
  509. validate("15 NOT IN (SELECT * FROM table_name)", true);
  510. }
  511. TEST_CASE(expression_tree_depth_limit)
  512. {
  513. auto too_deep_expression = String::formatted("{:+^{}}1", "", SQL::AST::Limits::maximum_expression_tree_depth);
  514. EXPECT(!parse(too_deep_expression.substring_view(1)).is_error());
  515. EXPECT(parse(too_deep_expression).is_error());
  516. }