AST.h 34 KB

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