AST.h 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110
  1. /*
  2. * Copyright (c) 2021, Tim Flynn <trflynn89@serenityos.org>
  3. * Copyright (c) 2021, Mahmoud Mandour <ma.mandourr@gmail.com>
  4. * Copyright (c) 2022, the SerenityOS developers.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #pragma once
  9. #include <AK/DeprecatedString.h>
  10. #include <AK/NonnullRefPtr.h>
  11. #include <AK/RefCounted.h>
  12. #include <AK/RefPtr.h>
  13. #include <LibSQL/AST/Token.h>
  14. #include <LibSQL/Forward.h>
  15. #include <LibSQL/Result.h>
  16. #include <LibSQL/ResultSet.h>
  17. #include <LibSQL/Type.h>
  18. namespace SQL::AST {
  19. template<class T, class... Args>
  20. static inline NonnullRefPtr<T>
  21. create_ast_node(Args&&... args)
  22. {
  23. return adopt_ref(*new T(forward<Args>(args)...));
  24. }
  25. class ASTNode : public RefCounted<ASTNode> {
  26. public:
  27. virtual ~ASTNode() = default;
  28. protected:
  29. ASTNode() = default;
  30. };
  31. //==================================================================================================
  32. // Language types
  33. //==================================================================================================
  34. class SignedNumber final : public ASTNode {
  35. public:
  36. explicit SignedNumber(double value)
  37. : m_value(value)
  38. {
  39. }
  40. double value() const { return m_value; }
  41. private:
  42. double m_value;
  43. };
  44. class TypeName : public ASTNode {
  45. public:
  46. TypeName(DeprecatedString name, Vector<NonnullRefPtr<SignedNumber>> signed_numbers)
  47. : m_name(move(name))
  48. , m_signed_numbers(move(signed_numbers))
  49. {
  50. VERIFY(m_signed_numbers.size() <= 2);
  51. }
  52. DeprecatedString const& name() const { return m_name; }
  53. Vector<NonnullRefPtr<SignedNumber>> const& signed_numbers() const { return m_signed_numbers; }
  54. private:
  55. DeprecatedString m_name;
  56. Vector<NonnullRefPtr<SignedNumber>> m_signed_numbers;
  57. };
  58. class ColumnDefinition : public ASTNode {
  59. public:
  60. ColumnDefinition(DeprecatedString name, NonnullRefPtr<TypeName> type_name)
  61. : m_name(move(name))
  62. , m_type_name(move(type_name))
  63. {
  64. }
  65. DeprecatedString const& name() const { return m_name; }
  66. NonnullRefPtr<TypeName> const& type_name() const { return m_type_name; }
  67. private:
  68. DeprecatedString m_name;
  69. NonnullRefPtr<TypeName> m_type_name;
  70. };
  71. class CommonTableExpression : public ASTNode {
  72. public:
  73. CommonTableExpression(DeprecatedString table_name, Vector<DeprecatedString> column_names, NonnullRefPtr<Select> select_statement)
  74. : m_table_name(move(table_name))
  75. , m_column_names(move(column_names))
  76. , m_select_statement(move(select_statement))
  77. {
  78. }
  79. DeprecatedString const& table_name() const { return m_table_name; }
  80. Vector<DeprecatedString> const& column_names() const { return m_column_names; }
  81. NonnullRefPtr<Select> const& select_statement() const { return m_select_statement; }
  82. private:
  83. DeprecatedString m_table_name;
  84. Vector<DeprecatedString> m_column_names;
  85. NonnullRefPtr<Select> m_select_statement;
  86. };
  87. class CommonTableExpressionList : public ASTNode {
  88. public:
  89. CommonTableExpressionList(bool recursive, Vector<NonnullRefPtr<CommonTableExpression>> common_table_expressions)
  90. : m_recursive(recursive)
  91. , m_common_table_expressions(move(common_table_expressions))
  92. {
  93. VERIFY(!m_common_table_expressions.is_empty());
  94. }
  95. bool recursive() const { return m_recursive; }
  96. Vector<NonnullRefPtr<CommonTableExpression>> const& common_table_expressions() const { return m_common_table_expressions; }
  97. private:
  98. bool m_recursive;
  99. Vector<NonnullRefPtr<CommonTableExpression>> m_common_table_expressions;
  100. };
  101. class QualifiedTableName : public ASTNode {
  102. public:
  103. QualifiedTableName(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString alias)
  104. : m_schema_name(move(schema_name))
  105. , m_table_name(move(table_name))
  106. , m_alias(move(alias))
  107. {
  108. }
  109. DeprecatedString const& schema_name() const { return m_schema_name; }
  110. DeprecatedString const& table_name() const { return m_table_name; }
  111. DeprecatedString const& alias() const { return m_alias; }
  112. private:
  113. DeprecatedString m_schema_name;
  114. DeprecatedString m_table_name;
  115. DeprecatedString m_alias;
  116. };
  117. class ReturningClause : public ASTNode {
  118. public:
  119. struct ColumnClause {
  120. NonnullRefPtr<Expression> expression;
  121. DeprecatedString column_alias;
  122. };
  123. ReturningClause() = default;
  124. explicit ReturningClause(Vector<ColumnClause> columns)
  125. : m_columns(move(columns))
  126. {
  127. }
  128. bool return_all_columns() const { return m_columns.is_empty(); }
  129. Vector<ColumnClause> const& columns() const { return m_columns; }
  130. private:
  131. Vector<ColumnClause> m_columns;
  132. };
  133. enum class ResultType {
  134. All,
  135. Table,
  136. Expression,
  137. };
  138. class ResultColumn : public ASTNode {
  139. public:
  140. ResultColumn() = default;
  141. explicit ResultColumn(DeprecatedString table_name)
  142. : m_type(ResultType::Table)
  143. , m_table_name(move(table_name))
  144. {
  145. }
  146. ResultColumn(NonnullRefPtr<Expression> expression, DeprecatedString column_alias)
  147. : m_type(ResultType::Expression)
  148. , m_expression(move(expression))
  149. , m_column_alias(move(column_alias))
  150. {
  151. }
  152. ResultType type() const { return m_type; }
  153. bool select_from_table() const { return m_table_name.has_value(); }
  154. Optional<DeprecatedString> const& table_name() const { return m_table_name; }
  155. bool select_from_expression() const { return !m_expression.is_null(); }
  156. RefPtr<Expression> const& expression() const { return m_expression; }
  157. DeprecatedString const& column_alias() const { return m_column_alias; }
  158. private:
  159. ResultType m_type { ResultType::All };
  160. Optional<DeprecatedString> m_table_name {};
  161. RefPtr<Expression> m_expression {};
  162. DeprecatedString m_column_alias {};
  163. };
  164. class GroupByClause : public ASTNode {
  165. public:
  166. GroupByClause(Vector<NonnullRefPtr<Expression>> group_by_list, RefPtr<Expression> having_clause)
  167. : m_group_by_list(move(group_by_list))
  168. , m_having_clause(move(having_clause))
  169. {
  170. VERIFY(!m_group_by_list.is_empty());
  171. }
  172. Vector<NonnullRefPtr<Expression>> const& group_by_list() const { return m_group_by_list; }
  173. RefPtr<Expression> const& having_clause() const { return m_having_clause; }
  174. private:
  175. Vector<NonnullRefPtr<Expression>> m_group_by_list;
  176. RefPtr<Expression> m_having_clause;
  177. };
  178. class TableOrSubquery : public ASTNode {
  179. public:
  180. TableOrSubquery() = default;
  181. TableOrSubquery(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString table_alias)
  182. : m_is_table(true)
  183. , m_schema_name(move(schema_name))
  184. , m_table_name(move(table_name))
  185. , m_table_alias(move(table_alias))
  186. {
  187. }
  188. explicit TableOrSubquery(Vector<NonnullRefPtr<TableOrSubquery>> subqueries)
  189. : m_is_subquery(!subqueries.is_empty())
  190. , m_subqueries(move(subqueries))
  191. {
  192. }
  193. bool is_table() const { return m_is_table; }
  194. DeprecatedString const& schema_name() const { return m_schema_name; }
  195. DeprecatedString const& table_name() const { return m_table_name; }
  196. DeprecatedString const& table_alias() const { return m_table_alias; }
  197. bool is_subquery() const { return m_is_subquery; }
  198. Vector<NonnullRefPtr<TableOrSubquery>> const& subqueries() const { return m_subqueries; }
  199. private:
  200. bool m_is_table { false };
  201. DeprecatedString m_schema_name {};
  202. DeprecatedString m_table_name {};
  203. DeprecatedString m_table_alias {};
  204. bool m_is_subquery { false };
  205. Vector<NonnullRefPtr<TableOrSubquery>> m_subqueries {};
  206. };
  207. class OrderingTerm : public ASTNode {
  208. public:
  209. OrderingTerm(NonnullRefPtr<Expression> expression, DeprecatedString collation_name, Order order, Nulls nulls)
  210. : m_expression(move(expression))
  211. , m_collation_name(move(collation_name))
  212. , m_order(order)
  213. , m_nulls(nulls)
  214. {
  215. }
  216. NonnullRefPtr<Expression> const& expression() const { return m_expression; }
  217. DeprecatedString const& collation_name() const { return m_collation_name; }
  218. Order order() const { return m_order; }
  219. Nulls nulls() const { return m_nulls; }
  220. private:
  221. NonnullRefPtr<Expression> m_expression;
  222. DeprecatedString m_collation_name;
  223. Order m_order;
  224. Nulls m_nulls;
  225. };
  226. class LimitClause : public ASTNode {
  227. public:
  228. LimitClause(NonnullRefPtr<Expression> limit_expression, RefPtr<Expression> offset_expression)
  229. : m_limit_expression(move(limit_expression))
  230. , m_offset_expression(move(offset_expression))
  231. {
  232. }
  233. NonnullRefPtr<Expression> const& limit_expression() const { return m_limit_expression; }
  234. RefPtr<Expression> const& offset_expression() const { return m_offset_expression; }
  235. private:
  236. NonnullRefPtr<Expression> m_limit_expression;
  237. RefPtr<Expression> m_offset_expression;
  238. };
  239. //==================================================================================================
  240. // Expressions
  241. //==================================================================================================
  242. struct ExecutionContext {
  243. NonnullRefPtr<Database> database;
  244. Statement const* statement { nullptr };
  245. ReadonlySpan<Value> placeholder_values {};
  246. Tuple* current_row { nullptr };
  247. };
  248. class Expression : public ASTNode {
  249. public:
  250. virtual ResultOr<Value> evaluate(ExecutionContext&) const
  251. {
  252. return Result { SQLCommand::Unknown, SQLErrorCode::NotYetImplemented };
  253. }
  254. };
  255. class ErrorExpression final : public Expression {
  256. };
  257. class NumericLiteral : public Expression {
  258. public:
  259. explicit NumericLiteral(double value)
  260. : m_value(value)
  261. {
  262. }
  263. double value() const { return m_value; }
  264. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  265. private:
  266. double m_value;
  267. };
  268. class StringLiteral : public Expression {
  269. public:
  270. explicit StringLiteral(DeprecatedString value)
  271. : m_value(move(value))
  272. {
  273. }
  274. DeprecatedString const& value() const { return m_value; }
  275. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  276. private:
  277. DeprecatedString m_value;
  278. };
  279. class BlobLiteral : public Expression {
  280. public:
  281. explicit BlobLiteral(DeprecatedString value)
  282. : m_value(move(value))
  283. {
  284. }
  285. DeprecatedString const& value() const { return m_value; }
  286. private:
  287. DeprecatedString m_value;
  288. };
  289. class BooleanLiteral : public Expression {
  290. public:
  291. explicit BooleanLiteral(bool value)
  292. : m_value(value)
  293. {
  294. }
  295. bool value() const { return m_value; }
  296. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  297. private:
  298. bool m_value { false };
  299. };
  300. class NullLiteral : public Expression {
  301. public:
  302. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  303. };
  304. class Placeholder : public Expression {
  305. public:
  306. explicit Placeholder(size_t parameter_index)
  307. : m_parameter_index(parameter_index)
  308. {
  309. }
  310. size_t parameter_index() const { return m_parameter_index; }
  311. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  312. private:
  313. size_t m_parameter_index { 0 };
  314. };
  315. class NestedExpression : public Expression {
  316. public:
  317. NonnullRefPtr<Expression> const& expression() const { return m_expression; }
  318. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  319. protected:
  320. explicit NestedExpression(NonnullRefPtr<Expression> expression)
  321. : m_expression(move(expression))
  322. {
  323. }
  324. private:
  325. NonnullRefPtr<Expression> m_expression;
  326. };
  327. class NestedDoubleExpression : public Expression {
  328. public:
  329. NonnullRefPtr<Expression> const& lhs() const { return m_lhs; }
  330. NonnullRefPtr<Expression> const& rhs() const { return m_rhs; }
  331. protected:
  332. NestedDoubleExpression(NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  333. : m_lhs(move(lhs))
  334. , m_rhs(move(rhs))
  335. {
  336. }
  337. private:
  338. NonnullRefPtr<Expression> m_lhs;
  339. NonnullRefPtr<Expression> m_rhs;
  340. };
  341. class InvertibleNestedExpression : public NestedExpression {
  342. public:
  343. bool invert_expression() const { return m_invert_expression; }
  344. protected:
  345. InvertibleNestedExpression(NonnullRefPtr<Expression> expression, bool invert_expression)
  346. : NestedExpression(move(expression))
  347. , m_invert_expression(invert_expression)
  348. {
  349. }
  350. private:
  351. bool m_invert_expression;
  352. };
  353. class InvertibleNestedDoubleExpression : public NestedDoubleExpression {
  354. public:
  355. bool invert_expression() const { return m_invert_expression; }
  356. protected:
  357. InvertibleNestedDoubleExpression(NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs, bool invert_expression)
  358. : NestedDoubleExpression(move(lhs), move(rhs))
  359. , m_invert_expression(invert_expression)
  360. {
  361. }
  362. private:
  363. bool m_invert_expression;
  364. };
  365. class ColumnNameExpression : public Expression {
  366. public:
  367. ColumnNameExpression(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString column_name)
  368. : m_schema_name(move(schema_name))
  369. , m_table_name(move(table_name))
  370. , m_column_name(move(column_name))
  371. {
  372. }
  373. DeprecatedString const& schema_name() const { return m_schema_name; }
  374. DeprecatedString const& table_name() const { return m_table_name; }
  375. DeprecatedString const& column_name() const { return m_column_name; }
  376. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  377. private:
  378. DeprecatedString m_schema_name;
  379. DeprecatedString m_table_name;
  380. DeprecatedString m_column_name;
  381. };
  382. #define __enum_UnaryOperator(S) \
  383. S(Minus, "-") \
  384. S(Plus, "+") \
  385. S(BitwiseNot, "~") \
  386. S(Not, "NOT")
  387. enum class UnaryOperator {
  388. #undef __UnaryOperator
  389. #define __UnaryOperator(code, name) code,
  390. __enum_UnaryOperator(__UnaryOperator)
  391. #undef __UnaryOperator
  392. };
  393. constexpr char const* UnaryOperator_name(UnaryOperator op)
  394. {
  395. switch (op) {
  396. #undef __UnaryOperator
  397. #define __UnaryOperator(code, name) \
  398. case UnaryOperator::code: \
  399. return name;
  400. __enum_UnaryOperator(__UnaryOperator)
  401. #undef __UnaryOperator
  402. default : VERIFY_NOT_REACHED();
  403. }
  404. }
  405. class UnaryOperatorExpression : public NestedExpression {
  406. public:
  407. UnaryOperatorExpression(UnaryOperator type, NonnullRefPtr<Expression> expression)
  408. : NestedExpression(move(expression))
  409. , m_type(type)
  410. {
  411. }
  412. UnaryOperator type() const { return m_type; }
  413. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  414. private:
  415. UnaryOperator m_type;
  416. };
  417. // Note: These are in order of highest-to-lowest operator precedence.
  418. #define __enum_BinaryOperator(S) \
  419. S(Concatenate, "||") \
  420. S(Multiplication, "*") \
  421. S(Division, "/") \
  422. S(Modulo, "%") \
  423. S(Plus, "+") \
  424. S(Minus, "-") \
  425. S(ShiftLeft, "<<") \
  426. S(ShiftRight, ">>") \
  427. S(BitwiseAnd, "&") \
  428. S(BitwiseOr, "|") \
  429. S(LessThan, "<") \
  430. S(LessThanEquals, "<=") \
  431. S(GreaterThan, ">") \
  432. S(GreaterThanEquals, ">=") \
  433. S(Equals, "=") \
  434. S(NotEquals, "!=") \
  435. S(And, "and") \
  436. S(Or, "or")
  437. enum class BinaryOperator {
  438. #undef __BinaryOperator
  439. #define __BinaryOperator(code, name) code,
  440. __enum_BinaryOperator(__BinaryOperator)
  441. #undef __BinaryOperator
  442. };
  443. constexpr char const* BinaryOperator_name(BinaryOperator op)
  444. {
  445. switch (op) {
  446. #undef __BinaryOperator
  447. #define __BinaryOperator(code, name) \
  448. case BinaryOperator::code: \
  449. return name;
  450. __enum_BinaryOperator(__BinaryOperator)
  451. #undef __BinaryOperator
  452. default : VERIFY_NOT_REACHED();
  453. }
  454. }
  455. class BinaryOperatorExpression : public NestedDoubleExpression {
  456. public:
  457. BinaryOperatorExpression(BinaryOperator type, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs)
  458. : NestedDoubleExpression(move(lhs), move(rhs))
  459. , m_type(type)
  460. {
  461. }
  462. BinaryOperator type() const { return m_type; }
  463. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  464. private:
  465. BinaryOperator m_type;
  466. };
  467. class ChainedExpression : public Expression {
  468. public:
  469. explicit ChainedExpression(Vector<NonnullRefPtr<Expression>> expressions)
  470. : m_expressions(move(expressions))
  471. {
  472. }
  473. Vector<NonnullRefPtr<Expression>> const& expressions() const { return m_expressions; }
  474. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  475. private:
  476. Vector<NonnullRefPtr<Expression>> m_expressions;
  477. };
  478. class CastExpression : public NestedExpression {
  479. public:
  480. CastExpression(NonnullRefPtr<Expression> expression, NonnullRefPtr<TypeName> type_name)
  481. : NestedExpression(move(expression))
  482. , m_type_name(move(type_name))
  483. {
  484. }
  485. NonnullRefPtr<TypeName> const& type_name() const { return m_type_name; }
  486. private:
  487. NonnullRefPtr<TypeName> m_type_name;
  488. };
  489. class CaseExpression : public Expression {
  490. public:
  491. struct WhenThenClause {
  492. NonnullRefPtr<Expression> when;
  493. NonnullRefPtr<Expression> then;
  494. };
  495. CaseExpression(RefPtr<Expression> case_expression, Vector<WhenThenClause> when_then_clauses, RefPtr<Expression> else_expression)
  496. : m_case_expression(case_expression)
  497. , m_when_then_clauses(when_then_clauses)
  498. , m_else_expression(else_expression)
  499. {
  500. VERIFY(!m_when_then_clauses.is_empty());
  501. }
  502. RefPtr<Expression> const& case_expression() const { return m_case_expression; }
  503. Vector<WhenThenClause> const& when_then_clauses() const { return m_when_then_clauses; }
  504. RefPtr<Expression> const& else_expression() const { return m_else_expression; }
  505. private:
  506. RefPtr<Expression> m_case_expression;
  507. Vector<WhenThenClause> m_when_then_clauses;
  508. RefPtr<Expression> m_else_expression;
  509. };
  510. class ExistsExpression : public Expression {
  511. public:
  512. ExistsExpression(NonnullRefPtr<Select> select_statement, bool invert_expression)
  513. : m_select_statement(move(select_statement))
  514. , m_invert_expression(invert_expression)
  515. {
  516. }
  517. NonnullRefPtr<Select> const& select_statement() const { return m_select_statement; }
  518. bool invert_expression() const { return m_invert_expression; }
  519. private:
  520. NonnullRefPtr<Select> m_select_statement;
  521. bool m_invert_expression;
  522. };
  523. class CollateExpression : public NestedExpression {
  524. public:
  525. CollateExpression(NonnullRefPtr<Expression> expression, DeprecatedString collation_name)
  526. : NestedExpression(move(expression))
  527. , m_collation_name(move(collation_name))
  528. {
  529. }
  530. DeprecatedString const& collation_name() const { return m_collation_name; }
  531. private:
  532. DeprecatedString m_collation_name;
  533. };
  534. enum class MatchOperator {
  535. Like,
  536. Glob,
  537. Match,
  538. Regexp,
  539. };
  540. class MatchExpression : public InvertibleNestedDoubleExpression {
  541. public:
  542. MatchExpression(MatchOperator type, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs, RefPtr<Expression> escape, bool invert_expression)
  543. : InvertibleNestedDoubleExpression(move(lhs), move(rhs), invert_expression)
  544. , m_type(type)
  545. , m_escape(move(escape))
  546. {
  547. }
  548. MatchOperator type() const { return m_type; }
  549. RefPtr<Expression> const& escape() const { return m_escape; }
  550. virtual ResultOr<Value> evaluate(ExecutionContext&) const override;
  551. private:
  552. MatchOperator m_type;
  553. RefPtr<Expression> m_escape;
  554. };
  555. class NullExpression : public InvertibleNestedExpression {
  556. public:
  557. NullExpression(NonnullRefPtr<Expression> expression, bool invert_expression)
  558. : InvertibleNestedExpression(move(expression), invert_expression)
  559. {
  560. }
  561. };
  562. class IsExpression : public InvertibleNestedDoubleExpression {
  563. public:
  564. IsExpression(NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs, bool invert_expression)
  565. : InvertibleNestedDoubleExpression(move(lhs), move(rhs), invert_expression)
  566. {
  567. }
  568. };
  569. class BetweenExpression : public InvertibleNestedDoubleExpression {
  570. public:
  571. BetweenExpression(NonnullRefPtr<Expression> expression, NonnullRefPtr<Expression> lhs, NonnullRefPtr<Expression> rhs, bool invert_expression)
  572. : InvertibleNestedDoubleExpression(move(lhs), move(rhs), invert_expression)
  573. , m_expression(move(expression))
  574. {
  575. }
  576. NonnullRefPtr<Expression> const& expression() const { return m_expression; }
  577. private:
  578. NonnullRefPtr<Expression> m_expression;
  579. };
  580. class InSelectionExpression : public InvertibleNestedExpression {
  581. public:
  582. InSelectionExpression(NonnullRefPtr<Expression> expression, NonnullRefPtr<Select> select_statement, bool invert_expression)
  583. : InvertibleNestedExpression(move(expression), invert_expression)
  584. , m_select_statement(move(select_statement))
  585. {
  586. }
  587. NonnullRefPtr<Select> const& select_statement() const { return m_select_statement; }
  588. private:
  589. NonnullRefPtr<Select> m_select_statement;
  590. };
  591. class InChainedExpression : public InvertibleNestedExpression {
  592. public:
  593. InChainedExpression(NonnullRefPtr<Expression> expression, NonnullRefPtr<ChainedExpression> expression_chain, bool invert_expression)
  594. : InvertibleNestedExpression(move(expression), invert_expression)
  595. , m_expression_chain(move(expression_chain))
  596. {
  597. }
  598. NonnullRefPtr<ChainedExpression> const& expression_chain() const { return m_expression_chain; }
  599. private:
  600. NonnullRefPtr<ChainedExpression> m_expression_chain;
  601. };
  602. class InTableExpression : public InvertibleNestedExpression {
  603. public:
  604. InTableExpression(NonnullRefPtr<Expression> expression, DeprecatedString schema_name, DeprecatedString table_name, bool invert_expression)
  605. : InvertibleNestedExpression(move(expression), invert_expression)
  606. , m_schema_name(move(schema_name))
  607. , m_table_name(move(table_name))
  608. {
  609. }
  610. DeprecatedString const& schema_name() const { return m_schema_name; }
  611. DeprecatedString const& table_name() const { return m_table_name; }
  612. private:
  613. DeprecatedString m_schema_name;
  614. DeprecatedString m_table_name;
  615. };
  616. //==================================================================================================
  617. // Statements
  618. //==================================================================================================
  619. class Statement : public ASTNode {
  620. public:
  621. ResultOr<ResultSet> execute(AK::NonnullRefPtr<Database> database, ReadonlySpan<Value> placeholder_values = {}) const;
  622. virtual ResultOr<ResultSet> execute(ExecutionContext&) const
  623. {
  624. return Result { SQLCommand::Unknown, SQLErrorCode::NotYetImplemented };
  625. }
  626. };
  627. class ErrorStatement final : public Statement {
  628. };
  629. class CreateSchema : public Statement {
  630. public:
  631. CreateSchema(DeprecatedString schema_name, bool is_error_if_schema_exists)
  632. : m_schema_name(move(schema_name))
  633. , m_is_error_if_schema_exists(is_error_if_schema_exists)
  634. {
  635. }
  636. DeprecatedString const& schema_name() const { return m_schema_name; }
  637. bool is_error_if_schema_exists() const { return m_is_error_if_schema_exists; }
  638. ResultOr<ResultSet> execute(ExecutionContext&) const override;
  639. private:
  640. DeprecatedString m_schema_name;
  641. bool m_is_error_if_schema_exists;
  642. };
  643. class CreateTable : public Statement {
  644. public:
  645. CreateTable(DeprecatedString schema_name, DeprecatedString table_name, RefPtr<Select> select_statement, bool is_temporary, bool is_error_if_table_exists)
  646. : m_schema_name(move(schema_name))
  647. , m_table_name(move(table_name))
  648. , m_select_statement(move(select_statement))
  649. , m_is_temporary(is_temporary)
  650. , m_is_error_if_table_exists(is_error_if_table_exists)
  651. {
  652. }
  653. CreateTable(DeprecatedString schema_name, DeprecatedString table_name, Vector<NonnullRefPtr<ColumnDefinition>> columns, bool is_temporary, bool is_error_if_table_exists)
  654. : m_schema_name(move(schema_name))
  655. , m_table_name(move(table_name))
  656. , m_columns(move(columns))
  657. , m_is_temporary(is_temporary)
  658. , m_is_error_if_table_exists(is_error_if_table_exists)
  659. {
  660. }
  661. DeprecatedString const& schema_name() const { return m_schema_name; }
  662. DeprecatedString const& table_name() const { return m_table_name; }
  663. bool has_selection() const { return !m_select_statement.is_null(); }
  664. RefPtr<Select> const& select_statement() const { return m_select_statement; }
  665. bool has_columns() const { return !m_columns.is_empty(); }
  666. Vector<NonnullRefPtr<ColumnDefinition>> const& columns() const { return m_columns; }
  667. bool is_temporary() const { return m_is_temporary; }
  668. bool is_error_if_table_exists() const { return m_is_error_if_table_exists; }
  669. ResultOr<ResultSet> execute(ExecutionContext&) const override;
  670. private:
  671. DeprecatedString m_schema_name;
  672. DeprecatedString m_table_name;
  673. RefPtr<Select> m_select_statement;
  674. Vector<NonnullRefPtr<ColumnDefinition>> m_columns;
  675. bool m_is_temporary;
  676. bool m_is_error_if_table_exists;
  677. };
  678. class AlterTable : public Statement {
  679. public:
  680. DeprecatedString const& schema_name() const { return m_schema_name; }
  681. DeprecatedString const& table_name() const { return m_table_name; }
  682. protected:
  683. AlterTable(DeprecatedString schema_name, DeprecatedString table_name)
  684. : m_schema_name(move(schema_name))
  685. , m_table_name(move(table_name))
  686. {
  687. }
  688. private:
  689. DeprecatedString m_schema_name;
  690. DeprecatedString m_table_name;
  691. };
  692. class RenameTable : public AlterTable {
  693. public:
  694. RenameTable(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString new_table_name)
  695. : AlterTable(move(schema_name), move(table_name))
  696. , m_new_table_name(move(new_table_name))
  697. {
  698. }
  699. DeprecatedString const& new_table_name() const { return m_new_table_name; }
  700. private:
  701. DeprecatedString m_new_table_name;
  702. };
  703. class RenameColumn : public AlterTable {
  704. public:
  705. RenameColumn(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString column_name, DeprecatedString new_column_name)
  706. : AlterTable(move(schema_name), move(table_name))
  707. , m_column_name(move(column_name))
  708. , m_new_column_name(move(new_column_name))
  709. {
  710. }
  711. DeprecatedString const& column_name() const { return m_column_name; }
  712. DeprecatedString const& new_column_name() const { return m_new_column_name; }
  713. private:
  714. DeprecatedString m_column_name;
  715. DeprecatedString m_new_column_name;
  716. };
  717. class AddColumn : public AlterTable {
  718. public:
  719. AddColumn(DeprecatedString schema_name, DeprecatedString table_name, NonnullRefPtr<ColumnDefinition> column)
  720. : AlterTable(move(schema_name), move(table_name))
  721. , m_column(move(column))
  722. {
  723. }
  724. NonnullRefPtr<ColumnDefinition> const& column() const { return m_column; }
  725. private:
  726. NonnullRefPtr<ColumnDefinition> m_column;
  727. };
  728. class DropColumn : public AlterTable {
  729. public:
  730. DropColumn(DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString column_name)
  731. : AlterTable(move(schema_name), move(table_name))
  732. , m_column_name(move(column_name))
  733. {
  734. }
  735. DeprecatedString const& column_name() const { return m_column_name; }
  736. private:
  737. DeprecatedString m_column_name;
  738. };
  739. class DropTable : public Statement {
  740. public:
  741. DropTable(DeprecatedString schema_name, DeprecatedString table_name, bool is_error_if_table_does_not_exist)
  742. : m_schema_name(move(schema_name))
  743. , m_table_name(move(table_name))
  744. , m_is_error_if_table_does_not_exist(is_error_if_table_does_not_exist)
  745. {
  746. }
  747. DeprecatedString const& schema_name() const { return m_schema_name; }
  748. DeprecatedString const& table_name() const { return m_table_name; }
  749. bool is_error_if_table_does_not_exist() const { return m_is_error_if_table_does_not_exist; }
  750. private:
  751. DeprecatedString m_schema_name;
  752. DeprecatedString m_table_name;
  753. bool m_is_error_if_table_does_not_exist;
  754. };
  755. enum class ConflictResolution {
  756. Abort,
  757. Fail,
  758. Ignore,
  759. Replace,
  760. Rollback,
  761. };
  762. class Insert : public Statement {
  763. public:
  764. Insert(RefPtr<CommonTableExpressionList> common_table_expression_list, ConflictResolution conflict_resolution, DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString alias, Vector<DeprecatedString> column_names, Vector<NonnullRefPtr<ChainedExpression>> chained_expressions)
  765. : m_common_table_expression_list(move(common_table_expression_list))
  766. , m_conflict_resolution(conflict_resolution)
  767. , m_schema_name(move(schema_name))
  768. , m_table_name(move(table_name))
  769. , m_alias(move(alias))
  770. , m_column_names(move(column_names))
  771. , m_chained_expressions(move(chained_expressions))
  772. {
  773. }
  774. Insert(RefPtr<CommonTableExpressionList> common_table_expression_list, ConflictResolution conflict_resolution, DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString alias, Vector<DeprecatedString> column_names, RefPtr<Select> select_statement)
  775. : m_common_table_expression_list(move(common_table_expression_list))
  776. , m_conflict_resolution(conflict_resolution)
  777. , m_schema_name(move(schema_name))
  778. , m_table_name(move(table_name))
  779. , m_alias(move(alias))
  780. , m_column_names(move(column_names))
  781. , m_select_statement(move(select_statement))
  782. {
  783. }
  784. Insert(RefPtr<CommonTableExpressionList> common_table_expression_list, ConflictResolution conflict_resolution, DeprecatedString schema_name, DeprecatedString table_name, DeprecatedString alias, Vector<DeprecatedString> column_names)
  785. : m_common_table_expression_list(move(common_table_expression_list))
  786. , m_conflict_resolution(conflict_resolution)
  787. , m_schema_name(move(schema_name))
  788. , m_table_name(move(table_name))
  789. , m_alias(move(alias))
  790. , m_column_names(move(column_names))
  791. {
  792. }
  793. RefPtr<CommonTableExpressionList> const& common_table_expression_list() const { return m_common_table_expression_list; }
  794. ConflictResolution conflict_resolution() const { return m_conflict_resolution; }
  795. DeprecatedString const& schema_name() const { return m_schema_name; }
  796. DeprecatedString const& table_name() const { return m_table_name; }
  797. DeprecatedString const& alias() const { return m_alias; }
  798. Vector<DeprecatedString> const& column_names() const { return m_column_names; }
  799. bool default_values() const { return !has_expressions() && !has_selection(); }
  800. bool has_expressions() const { return !m_chained_expressions.is_empty(); }
  801. Vector<NonnullRefPtr<ChainedExpression>> const& chained_expressions() const { return m_chained_expressions; }
  802. bool has_selection() const { return !m_select_statement.is_null(); }
  803. RefPtr<Select> const& select_statement() const { return m_select_statement; }
  804. virtual ResultOr<ResultSet> execute(ExecutionContext&) const override;
  805. private:
  806. RefPtr<CommonTableExpressionList> m_common_table_expression_list;
  807. ConflictResolution m_conflict_resolution;
  808. DeprecatedString m_schema_name;
  809. DeprecatedString m_table_name;
  810. DeprecatedString m_alias;
  811. Vector<DeprecatedString> m_column_names;
  812. Vector<NonnullRefPtr<ChainedExpression>> m_chained_expressions;
  813. RefPtr<Select> m_select_statement;
  814. };
  815. class Update : public Statement {
  816. public:
  817. struct UpdateColumns {
  818. Vector<DeprecatedString> column_names;
  819. NonnullRefPtr<Expression> expression;
  820. };
  821. Update(RefPtr<CommonTableExpressionList> common_table_expression_list, ConflictResolution conflict_resolution, NonnullRefPtr<QualifiedTableName> qualified_table_name, Vector<UpdateColumns> update_columns, Vector<NonnullRefPtr<TableOrSubquery>> table_or_subquery_list, RefPtr<Expression> where_clause, RefPtr<ReturningClause> returning_clause)
  822. : m_common_table_expression_list(move(common_table_expression_list))
  823. , m_conflict_resolution(conflict_resolution)
  824. , m_qualified_table_name(move(qualified_table_name))
  825. , m_update_columns(move(update_columns))
  826. , m_table_or_subquery_list(move(table_or_subquery_list))
  827. , m_where_clause(move(where_clause))
  828. , m_returning_clause(move(returning_clause))
  829. {
  830. }
  831. RefPtr<CommonTableExpressionList> const& common_table_expression_list() const { return m_common_table_expression_list; }
  832. ConflictResolution conflict_resolution() const { return m_conflict_resolution; }
  833. NonnullRefPtr<QualifiedTableName> const& qualified_table_name() const { return m_qualified_table_name; }
  834. Vector<UpdateColumns> const& update_columns() const { return m_update_columns; }
  835. Vector<NonnullRefPtr<TableOrSubquery>> const& table_or_subquery_list() const { return m_table_or_subquery_list; }
  836. RefPtr<Expression> const& where_clause() const { return m_where_clause; }
  837. RefPtr<ReturningClause> const& returning_clause() const { return m_returning_clause; }
  838. virtual ResultOr<ResultSet> execute(ExecutionContext&) const override;
  839. private:
  840. RefPtr<CommonTableExpressionList> m_common_table_expression_list;
  841. ConflictResolution m_conflict_resolution;
  842. NonnullRefPtr<QualifiedTableName> m_qualified_table_name;
  843. Vector<UpdateColumns> m_update_columns;
  844. Vector<NonnullRefPtr<TableOrSubquery>> m_table_or_subquery_list;
  845. RefPtr<Expression> m_where_clause;
  846. RefPtr<ReturningClause> m_returning_clause;
  847. };
  848. class Delete : public Statement {
  849. public:
  850. Delete(RefPtr<CommonTableExpressionList> common_table_expression_list, NonnullRefPtr<QualifiedTableName> qualified_table_name, RefPtr<Expression> where_clause, RefPtr<ReturningClause> returning_clause)
  851. : m_common_table_expression_list(move(common_table_expression_list))
  852. , m_qualified_table_name(move(qualified_table_name))
  853. , m_where_clause(move(where_clause))
  854. , m_returning_clause(move(returning_clause))
  855. {
  856. }
  857. RefPtr<CommonTableExpressionList> const& common_table_expression_list() const { return m_common_table_expression_list; }
  858. NonnullRefPtr<QualifiedTableName> const& qualified_table_name() const { return m_qualified_table_name; }
  859. RefPtr<Expression> const& where_clause() const { return m_where_clause; }
  860. RefPtr<ReturningClause> const& returning_clause() const { return m_returning_clause; }
  861. virtual ResultOr<ResultSet> execute(ExecutionContext&) const override;
  862. private:
  863. RefPtr<CommonTableExpressionList> m_common_table_expression_list;
  864. NonnullRefPtr<QualifiedTableName> m_qualified_table_name;
  865. RefPtr<Expression> m_where_clause;
  866. RefPtr<ReturningClause> m_returning_clause;
  867. };
  868. class Select : public Statement {
  869. public:
  870. Select(RefPtr<CommonTableExpressionList> common_table_expression_list, bool select_all, Vector<NonnullRefPtr<ResultColumn>> result_column_list, Vector<NonnullRefPtr<TableOrSubquery>> table_or_subquery_list, RefPtr<Expression> where_clause, RefPtr<GroupByClause> group_by_clause, Vector<NonnullRefPtr<OrderingTerm>> ordering_term_list, RefPtr<LimitClause> limit_clause)
  871. : m_common_table_expression_list(move(common_table_expression_list))
  872. , m_select_all(move(select_all))
  873. , m_result_column_list(move(result_column_list))
  874. , m_table_or_subquery_list(move(table_or_subquery_list))
  875. , m_where_clause(move(where_clause))
  876. , m_group_by_clause(move(group_by_clause))
  877. , m_ordering_term_list(move(ordering_term_list))
  878. , m_limit_clause(move(limit_clause))
  879. {
  880. }
  881. RefPtr<CommonTableExpressionList> const& common_table_expression_list() const { return m_common_table_expression_list; }
  882. bool select_all() const { return m_select_all; }
  883. Vector<NonnullRefPtr<ResultColumn>> const& result_column_list() const { return m_result_column_list; }
  884. Vector<NonnullRefPtr<TableOrSubquery>> const& table_or_subquery_list() const { return m_table_or_subquery_list; }
  885. RefPtr<Expression> const& where_clause() const { return m_where_clause; }
  886. RefPtr<GroupByClause> const& group_by_clause() const { return m_group_by_clause; }
  887. Vector<NonnullRefPtr<OrderingTerm>> const& ordering_term_list() const { return m_ordering_term_list; }
  888. RefPtr<LimitClause> const& limit_clause() const { return m_limit_clause; }
  889. ResultOr<ResultSet> execute(ExecutionContext&) const override;
  890. private:
  891. RefPtr<CommonTableExpressionList> m_common_table_expression_list;
  892. bool m_select_all;
  893. Vector<NonnullRefPtr<ResultColumn>> m_result_column_list;
  894. Vector<NonnullRefPtr<TableOrSubquery>> m_table_or_subquery_list;
  895. RefPtr<Expression> m_where_clause;
  896. RefPtr<GroupByClause> m_group_by_clause;
  897. Vector<NonnullRefPtr<OrderingTerm>> m_ordering_term_list;
  898. RefPtr<LimitClause> m_limit_clause;
  899. };
  900. class DescribeTable : public Statement {
  901. public:
  902. DescribeTable(NonnullRefPtr<QualifiedTableName> qualified_table_name)
  903. : m_qualified_table_name(move(qualified_table_name))
  904. {
  905. }
  906. NonnullRefPtr<QualifiedTableName> qualified_table_name() const { return m_qualified_table_name; }
  907. ResultOr<ResultSet> execute(ExecutionContext&) const override;
  908. private:
  909. NonnullRefPtr<QualifiedTableName> m_qualified_table_name;
  910. };
  911. }