AST.h 36 KB

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