TestSqlExpressionParser.cpp 23 KB

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