AST.h 33 KB

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