TestSqlExpressionParser.cpp 20 KB

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