AST.h 34 KB

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