AST.h 34 KB

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