Parser.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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/DeprecatedString.h>
  9. #include <AK/StringView.h>
  10. #include <LibSQL/AST/AST.h>
  11. #include <LibSQL/AST/Lexer.h>
  12. #include <LibSQL/AST/Token.h>
  13. namespace SQL::AST {
  14. namespace Limits {
  15. // https://www.sqlite.org/limits.html
  16. constexpr size_t maximum_expression_tree_depth = 1000;
  17. constexpr size_t maximum_subquery_depth = 100;
  18. constexpr size_t maximum_bound_parameters = 1000;
  19. }
  20. class Parser {
  21. struct Error {
  22. DeprecatedString message;
  23. SourcePosition position;
  24. DeprecatedString to_deprecated_string() const
  25. {
  26. return DeprecatedString::formatted("{} (line: {}, column: {})", message, position.line, position.column);
  27. }
  28. };
  29. public:
  30. explicit Parser(Lexer lexer);
  31. NonnullRefPtr<Statement> next_statement();
  32. bool has_errors() const { return m_parser_state.m_errors.size(); }
  33. Vector<Error> const& errors() const { return m_parser_state.m_errors; }
  34. protected:
  35. NonnullRefPtr<Expression> parse_expression(); // Protected for unit testing.
  36. private:
  37. struct ParserState {
  38. explicit ParserState(Lexer);
  39. Lexer m_lexer;
  40. Token m_token;
  41. Vector<Error> m_errors;
  42. size_t m_current_expression_depth { 0 };
  43. size_t m_current_subquery_depth { 0 };
  44. size_t m_bound_parameters { 0 };
  45. };
  46. NonnullRefPtr<Statement> parse_statement();
  47. NonnullRefPtr<Statement> parse_statement_with_expression_list(RefPtr<CommonTableExpressionList>);
  48. NonnullRefPtr<CreateSchema> parse_create_schema_statement();
  49. NonnullRefPtr<CreateTable> parse_create_table_statement();
  50. NonnullRefPtr<AlterTable> parse_alter_table_statement();
  51. NonnullRefPtr<DropTable> parse_drop_table_statement();
  52. NonnullRefPtr<DescribeTable> parse_describe_table_statement();
  53. NonnullRefPtr<Insert> parse_insert_statement(RefPtr<CommonTableExpressionList>);
  54. NonnullRefPtr<Update> parse_update_statement(RefPtr<CommonTableExpressionList>);
  55. NonnullRefPtr<Delete> parse_delete_statement(RefPtr<CommonTableExpressionList>);
  56. NonnullRefPtr<Select> parse_select_statement(RefPtr<CommonTableExpressionList>);
  57. RefPtr<CommonTableExpressionList> parse_common_table_expression_list();
  58. NonnullRefPtr<Expression> parse_primary_expression();
  59. NonnullRefPtr<Expression> parse_secondary_expression(NonnullRefPtr<Expression> primary);
  60. bool match_secondary_expression() const;
  61. RefPtr<Expression> parse_literal_value_expression();
  62. RefPtr<Expression> parse_bind_parameter_expression();
  63. RefPtr<Expression> parse_column_name_expression(Optional<DeprecatedString> with_parsed_identifier = {}, bool with_parsed_period = false);
  64. RefPtr<Expression> parse_unary_operator_expression();
  65. RefPtr<Expression> parse_binary_operator_expression(NonnullRefPtr<Expression> lhs);
  66. RefPtr<Expression> parse_chained_expression(bool surrounded_by_parentheses = true);
  67. RefPtr<Expression> parse_cast_expression();
  68. RefPtr<Expression> parse_case_expression();
  69. RefPtr<Expression> parse_exists_expression(bool invert_expression);
  70. RefPtr<Expression> parse_collate_expression(NonnullRefPtr<Expression> expression);
  71. RefPtr<Expression> parse_is_expression(NonnullRefPtr<Expression> expression);
  72. RefPtr<Expression> parse_match_expression(NonnullRefPtr<Expression> lhs, bool invert_expression);
  73. RefPtr<Expression> parse_null_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  74. RefPtr<Expression> parse_between_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  75. RefPtr<Expression> parse_in_expression(NonnullRefPtr<Expression> expression, bool invert_expression);
  76. NonnullRefPtr<ColumnDefinition> parse_column_definition();
  77. NonnullRefPtr<TypeName> parse_type_name();
  78. NonnullRefPtr<SignedNumber> parse_signed_number();
  79. NonnullRefPtr<CommonTableExpression> parse_common_table_expression();
  80. NonnullRefPtr<QualifiedTableName> parse_qualified_table_name();
  81. NonnullRefPtr<ReturningClause> parse_returning_clause();
  82. NonnullRefPtr<ResultColumn> parse_result_column();
  83. NonnullRefPtr<TableOrSubquery> parse_table_or_subquery();
  84. NonnullRefPtr<OrderingTerm> parse_ordering_term();
  85. void parse_schema_and_table_name(DeprecatedString& schema_name, DeprecatedString& table_name);
  86. ConflictResolution parse_conflict_resolution();
  87. template<typename ParseCallback>
  88. void parse_comma_separated_list(bool surrounded_by_parentheses, ParseCallback&& parse_callback)
  89. {
  90. if (surrounded_by_parentheses)
  91. consume(TokenType::ParenOpen);
  92. while (!has_errors() && !match(TokenType::Eof)) {
  93. parse_callback();
  94. if (!match(TokenType::Comma))
  95. break;
  96. consume(TokenType::Comma);
  97. };
  98. if (surrounded_by_parentheses)
  99. consume(TokenType::ParenClose);
  100. }
  101. Token consume();
  102. Token consume(TokenType type);
  103. bool consume_if(TokenType type);
  104. bool match(TokenType type) const;
  105. void expected(StringView what);
  106. void syntax_error(DeprecatedString message);
  107. SourcePosition position() const;
  108. ParserState m_parser_state;
  109. };
  110. }