TestSqlExpressionParser.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@pm.me>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/TestSuite.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(collate_expression)
  273. {
  274. EXPECT(parse("COLLATE").is_error());
  275. EXPECT(parse("COLLATE name").is_error());
  276. EXPECT(parse("15 COLLATE").is_error());
  277. auto validate = [](StringView sql, StringView expected_collation_name) {
  278. auto result = parse(sql);
  279. EXPECT(!result.is_error());
  280. auto expression = result.release_value();
  281. EXPECT(is<SQL::CollateExpression>(*expression));
  282. const auto& collate = static_cast<const SQL::CollateExpression&>(*expression);
  283. EXPECT(!is<SQL::ErrorExpression>(*collate.expression()));
  284. EXPECT_EQ(collate.collation_name(), expected_collation_name);
  285. };
  286. validate("15 COLLATE fifteen", "fifteen");
  287. validate("(15, 16) COLLATE chain", "chain");
  288. }
  289. TEST_CASE(is_expression)
  290. {
  291. EXPECT(parse("IS").is_error());
  292. EXPECT(parse("IS 1").is_error());
  293. EXPECT(parse("1 IS").is_error());
  294. EXPECT(parse("IS NOT").is_error());
  295. EXPECT(parse("IS NOT 1").is_error());
  296. EXPECT(parse("1 IS NOT").is_error());
  297. auto validate = [](StringView sql, bool expected_invert_expression) {
  298. auto result = parse(sql);
  299. EXPECT(!result.is_error());
  300. auto expression = result.release_value();
  301. EXPECT(is<SQL::IsExpression>(*expression));
  302. const auto& is_ = static_cast<const SQL::IsExpression&>(*expression);
  303. EXPECT(!is<SQL::ErrorExpression>(*is_.lhs()));
  304. EXPECT(!is<SQL::ErrorExpression>(*is_.rhs()));
  305. EXPECT_EQ(is_.invert_expression(), expected_invert_expression);
  306. };
  307. validate("1 IS NULL", false);
  308. validate("1 IS NOT NULL", true);
  309. }
  310. TEST_CASE(match_expression)
  311. {
  312. HashMap<StringView, SQL::MatchOperator> operators {
  313. { "LIKE", SQL::MatchOperator::Like },
  314. { "GLOB", SQL::MatchOperator::Glob },
  315. { "MATCH", SQL::MatchOperator::Match },
  316. { "REGEXP", SQL::MatchOperator::Regexp },
  317. };
  318. for (auto op : operators) {
  319. EXPECT(parse(op.key).is_error());
  320. StringBuilder builder;
  321. builder.append("1 ");
  322. builder.append(op.key);
  323. EXPECT(parse(builder.build()).is_error());
  324. builder.clear();
  325. builder.append(op.key);
  326. builder.append(" 1");
  327. EXPECT(parse(builder.build()).is_error());
  328. }
  329. auto validate = [](StringView sql, SQL::MatchOperator expected_operator, bool expected_invert_expression) {
  330. auto result = parse(sql);
  331. EXPECT(!result.is_error());
  332. auto expression = result.release_value();
  333. EXPECT(is<SQL::MatchExpression>(*expression));
  334. const auto& match = static_cast<const SQL::MatchExpression&>(*expression);
  335. EXPECT(!is<SQL::ErrorExpression>(*match.lhs()));
  336. EXPECT(!is<SQL::ErrorExpression>(*match.rhs()));
  337. EXPECT_EQ(match.type(), expected_operator);
  338. EXPECT_EQ(match.invert_expression(), expected_invert_expression);
  339. };
  340. for (auto op : operators) {
  341. StringBuilder builder;
  342. builder.append("1 ");
  343. builder.append(op.key);
  344. builder.append(" 1");
  345. validate(builder.build(), op.value, false);
  346. builder.clear();
  347. builder.append("1 NOT ");
  348. builder.append(op.key);
  349. builder.append(" 1");
  350. validate(builder.build(), op.value, true);
  351. }
  352. }
  353. TEST_CASE(null_expression)
  354. {
  355. EXPECT(parse("ISNULL").is_error());
  356. EXPECT(parse("NOTNULL").is_error());
  357. EXPECT(parse("15 NOT").is_error());
  358. auto validate = [](StringView sql, bool expected_invert_expression) {
  359. auto result = parse(sql);
  360. EXPECT(!result.is_error());
  361. auto expression = result.release_value();
  362. EXPECT(is<SQL::NullExpression>(*expression));
  363. const auto& null = static_cast<const SQL::NullExpression&>(*expression);
  364. EXPECT_EQ(null.invert_expression(), expected_invert_expression);
  365. };
  366. validate("15 ISNULL", false);
  367. validate("15 NOTNULL", true);
  368. validate("15 NOT NULL", true);
  369. }
  370. TEST_CASE(between_expression)
  371. {
  372. EXPECT(parse("BETWEEN").is_error());
  373. EXPECT(parse("NOT BETWEEN").is_error());
  374. EXPECT(parse("BETWEEN 10 AND 20").is_error());
  375. EXPECT(parse("NOT BETWEEN 10 AND 20").is_error());
  376. EXPECT(parse("15 BETWEEN 10").is_error());
  377. EXPECT(parse("15 BETWEEN 10 AND").is_error());
  378. EXPECT(parse("15 BETWEEN AND 20").is_error());
  379. EXPECT(parse("15 BETWEEN 10 OR 20").is_error());
  380. auto validate = [](StringView sql, bool expected_invert_expression) {
  381. auto result = parse(sql);
  382. EXPECT(!result.is_error());
  383. auto expression = result.release_value();
  384. EXPECT(is<SQL::BetweenExpression>(*expression));
  385. const auto& between = static_cast<const SQL::BetweenExpression&>(*expression);
  386. EXPECT(!is<SQL::ErrorExpression>(*between.expression()));
  387. EXPECT(!is<SQL::ErrorExpression>(*between.lhs()));
  388. EXPECT(!is<SQL::ErrorExpression>(*between.rhs()));
  389. EXPECT_EQ(between.invert_expression(), expected_invert_expression);
  390. };
  391. validate("15 BETWEEN 10 AND 20", false);
  392. validate("15 NOT BETWEEN 10 AND 20", true);
  393. }
  394. TEST_CASE(in_table_expression)
  395. {
  396. EXPECT(parse("IN").is_error());
  397. EXPECT(parse("IN table").is_error());
  398. EXPECT(parse("NOT IN").is_error());
  399. EXPECT(parse("NOT IN table").is_error());
  400. auto validate = [](StringView sql, StringView expected_schema, StringView expected_table, bool expected_invert_expression) {
  401. auto result = parse(sql);
  402. EXPECT(!result.is_error());
  403. auto expression = result.release_value();
  404. EXPECT(is<SQL::InTableExpression>(*expression));
  405. const auto& in = static_cast<const SQL::InTableExpression&>(*expression);
  406. EXPECT(!is<SQL::ErrorExpression>(*in.expression()));
  407. EXPECT_EQ(in.schema_name(), expected_schema);
  408. EXPECT_EQ(in.table_name(), expected_table);
  409. EXPECT_EQ(in.invert_expression(), expected_invert_expression);
  410. };
  411. validate("15 IN table", {}, "table", false);
  412. validate("15 IN schema.table", "schema", "table", false);
  413. validate("15 NOT IN table", {}, "table", true);
  414. validate("15 NOT IN schema.table", "schema", "table", true);
  415. }
  416. TEST_CASE(in_chained_expression)
  417. {
  418. EXPECT(parse("IN ()").is_error());
  419. EXPECT(parse("NOT IN ()").is_error());
  420. auto validate = [](StringView sql, size_t expected_chain_size, bool expected_invert_expression) {
  421. auto result = parse(sql);
  422. EXPECT(!result.is_error());
  423. auto expression = result.release_value();
  424. EXPECT(is<SQL::InChainedExpression>(*expression));
  425. const auto& in = static_cast<const SQL::InChainedExpression&>(*expression);
  426. EXPECT(!is<SQL::ErrorExpression>(*in.expression()));
  427. EXPECT_EQ(in.expression_chain()->expressions().size(), expected_chain_size);
  428. EXPECT_EQ(in.invert_expression(), expected_invert_expression);
  429. for (const auto& chained_expression : in.expression_chain()->expressions())
  430. EXPECT(!is<SQL::ErrorExpression>(chained_expression));
  431. };
  432. validate("15 IN ()", 0, false);
  433. validate("15 IN (15)", 1, false);
  434. validate("15 IN (15, 16)", 2, false);
  435. validate("15 NOT IN ()", 0, true);
  436. validate("15 NOT IN (15)", 1, true);
  437. validate("15 NOT IN (15, 16)", 2, true);
  438. }
  439. TEST_MAIN(SqlExpressionParser)