7#include <mutable/mutable-config.hpp>
41 friend struct GetCorrelationInfo;
47 const Type *type_ =
nullptr;
50 bool is_correlated_ =
false;
63 bool has_type()
const {
return type_ !=
nullptr; }
80 virtual uint64_t
hash()
const = 0;
95 Schema get_required()
const;
98 void dot(std::ostream &out)
const;
104 std::ostringstream oss;
110 void dump(std::ostream &out)
const;
124 uint64_t
hash()
const override {
return 8546018603292329429UL; }
126 bool operator==(
const Expr &other)
const override;
137 using target_type = std::variant<std::monostate, const Expr*, const Attribute*>;
142 unsigned binding_depth_ = 0;
148 , table_name(
Token::CreateArtificial())
149 , attr_name(
std::move(attr_name))
154 , table_name(
std::move(table_name))
155 , attr_name(
std::move(attr_name))
160 , table_name(
std::move(table_name))
161 , attr_name(
std::move(attr_name))
166 if (
auto e = std::get_if<const Expr*>(&target_))
167 return (*e)->is_constant();
172 [](
const Expr *e) ->
bool {
return e->can_be_null(); },
173 [](
const Attribute *a) ->
bool {
return not a->not_nullable; },
174 [](std::monostate) ->
bool {
return true; }
185 uint64_t hash()
const override;
187 bool operator==(
const Expr &other)
const override;
199 "if the table name was not explicitly provided, semantic analysis must deduce it first");
200 return table_name.
text.assert_not_none();
221 uint64_t hash()
const override;
223 bool operator==(
const Expr &other)
const override;
228 bool is_null()
const {
return tok.type == TK_Null; }
229 bool is_bool()
const {
return tok.type == TK_True or tok.type == TK_False; }
230 bool is_number()
const {
return is_integer() or is_float(); }
231 bool is_integer()
const {
return tok.type == TK_OCT_INT or tok.type == TK_DEC_INT or tok.type == TK_HEX_FLOAT; }
232 bool is_float()
const {
return tok.type == TK_DEC_FLOAT or tok.type == TK_HEX_FLOAT; }
233 bool is_string()
const {
return tok.type == TK_STRING_LITERAL; }
234 bool is_date()
const {
return tok.type == TK_DATE; }
249 std::unique_ptr<Expr>
fn;
250 std::vector<std::unique_ptr<Expr>>
args;
269 switch (func_->fnid) {
276 case Function::FN_COUNT:
277 case Function::FN_ISNULL:
280 case Function::FN_MIN:
281 case Function::FN_MAX:
282 case Function::FN_SUM:
283 case Function::FN_AVG:
284 case Function::FN_INT:
286 return args[0]->can_be_null();
293 for (
auto &arg :
args)
294 if (arg->contains_free_variables())
300 if (fn->contains_bound_variables())
return true;
301 for (
auto &arg :
args)
302 if (arg->contains_bound_variables())
307 uint64_t hash()
const override;
309 bool operator==(
const Expr &other)
const override;
338 uint64_t hash()
const override;
340 bool operator==(
const Expr &other)
const override;
349 std::unique_ptr<Expr>
lhs;
350 std::unique_ptr<Expr>
rhs;
359 bool is_constant()
const override {
return lhs->is_constant()
and rhs->is_constant(); }
361 if (tok.type == TK_And or tok.type == TK_Or) {
363 const auto dominating_element = tok.type == TK_And ? TK_False : TK_True;
364 const auto lhs_const = cast<Constant>(lhs.get());
365 const auto rhs_const = cast<Constant>(rhs.get());
366 const bool lhs_dominates = lhs_const
and lhs_const->tok.type == dominating_element;
367 const bool rhs_dominates = rhs_const
and rhs_const->tok.type == dominating_element;
368 return not lhs_dominates
and not rhs_dominates
and (lhs->can_be_null() or rhs->can_be_null());
370 return lhs->can_be_null() or rhs->can_be_null();
374 {
return lhs->contains_free_variables() or rhs->contains_free_variables(); }
376 {
return lhs->contains_bound_variables() or rhs->contains_bound_variables(); }
379 uint64_t hash()
const override;
381 bool operator==(
const Expr &other)
const override;
399 , alias_(make_unique_alias())
402 bool is_constant()
const override;
403 bool can_be_null()
const override;
414 uint64_t hash()
const override;
416 bool operator==(
const Expr &other)
const override;
427#define M_AST_EXPR_LIST(X) \
428 X(m::ast::ErrorExpr) \
429 X(m::ast::Designator) \
430 X(m::ast::Constant) \
431 X(m::ast::FnApplicationExpr) \
432 X(m::ast::UnaryExpr) \
433 X(m::ast::BinaryExpr) \
443 using super = std::conditional_t<C, ConstASTExprVisitor, ASTExprVisitor>;
448 using super::operator();
451 for (
auto &arg : e.args)
464 using super = std::conditional_t<C, ConstASTExprVisitor, ASTExprVisitor>;
469 void operator()(Const<Expr> &e);
475 using super = std::conditional_t<C, ConstASTExprVisitor, ASTExprVisitor>;
480 void operator()(Const<Expr> &e);
508 void dot(std::ostream &out)
const;
510 void dump(std::ostream &out)
const;
534 , select(
std::move(select))
535 , select_all(
std::move(select_all))
557 from_type(std::unique_ptr<Stmt> S,
Token alias) : source(S.release()), alias(
std::move(alias)) { }
592 , group_by(
std::move(group_by))
620 , order_by(
std::move(order_by))
634 , limit(
std::move(limit))
635 , offset(
std::move(offset))
642#define M_AST_CLAUSE_LIST(X) \
643 X(m::ast::ErrorClause) \
644 X(m::ast::SelectClause) \
645 X(m::ast::FromClause) \
646 X(m::ast::WhereClause) \
647 X(m::ast::GroupByClause) \
648 X(m::ast::HavingClause) \
649 X(m::ast::OrderByClause) \
650 X(m::ast::LimitClause)
703 , cond(
std::move(cond))
726 , table_name(
std::move(table_name))
727 , attr_name(
std::move(attr_name))
735#define M_AST_CONSTRAINT_LIST(X) \
736 X(m::ast::PrimaryKeyConstraint) \
737 X(m::ast::UniqueConstraint) \
738 X(m::ast::NotNullConstraint) \
739 X(m::ast::CheckConditionConstraint) \
740 X(m::ast::ReferenceConstraint)
757 void dump(std::ostream &out)
const;
778 : tok(
std::move(tok))
779 , name(
std::move(name))
798 void dot(std::ostream &out)
const;
838 : database_name(
std::move(database_name))
839 , has_if_exists(has_if_exists)
865 : name(
std::move(name))
867 , constraints(
std::move(constraints))
872 std::vector<std::unique_ptr<attribute_definition>>
attributes;
875 : table_name(
std::move(table_name))
876 , attributes(
std::move(attributes))
888 DropTableStmt(std::vector<std::unique_ptr<Token>> table_names,
bool has_if_exists)
889 : table_names(
std::move(table_names))
890 , has_if_exists(has_if_exists)
907 std::vector<std::unique_ptr<Expr>> key_fields)
908 : has_unique(
std::move(has_unique))
909 , has_if_not_exists(has_if_not_exists)
910 , index_name(
std::move(index_name))
911 , table_name(
std::move(table_name))
912 , method(
std::move(method))
913 , key_fields(
std::move(key_fields))
925 DropIndexStmt(std::vector<std::unique_ptr<Token>> index_names,
bool has_if_exists)
926 : index_names(
std::move(index_names))
927 , has_if_exists(has_if_exists)
946 std::unique_ptr<Clause> from,
947 std::unique_ptr<Clause> where,
948 std::unique_ptr<Clause> group_by,
949 std::unique_ptr<Clause> having,
950 std::unique_ptr<Clause> order_by,
951 std::unique_ptr<Clause> limit)
953 , from(
std::move(from))
954 , where(
std::move(where))
955 , group_by(
std::move(group_by))
956 , having(
std::move(having))
957 , order_by(
std::move(order_by))
958 , limit(
std::move(limit))
976 : table_name(
std::move(table_name))
977 , tuples(
std::move(tuples))
987 using set_type = std::pair<Token, std::unique_ptr<Expr>>;
990 std::vector<set_type>
set;
993 UpdateStmt(
Token table_name, std::vector<set_type> set, std::unique_ptr<Clause> where)
994 : table_name(
std::move(table_name))
995 , set(
std::move(set))
996 , where(
std::move(where))
1007 std::unique_ptr<Clause> where =
nullptr;
1010 : table_name(
std::move(table_name))
1011 , where(
std::move(where))
1029 Token delimiter = Token::CreateArtificial();
1033 bool has_header =
false;
1034 bool skip_header =
false;
1042#define M_AST_COMMAND_LIST(X) \
1043 X(m::ast::Instruction) \
1044 X(m::ast::ErrorStmt) \
1045 X(m::ast::EmptyStmt) \
1046 X(m::ast::CreateDatabaseStmt) \
1047 X(m::ast::UseDatabaseStmt) \
1048 X(m::ast::DropDatabaseStmt) \
1049 X(m::ast::CreateTableStmt) \
1050 X(m::ast::DropTableStmt) \
1051 X(m::ast::CreateIndexStmt) \
1052 X(m::ast::DropIndexStmt) \
1053 X(m::ast::SelectStmt) \
1054 X(m::ast::InsertStmt) \
1055 X(m::ast::UpdateStmt) \
1056 X(m::ast::DeleteStmt) \
1057 X(m::ast::DSVImportStmt)
1063#define M_AST_LIST(X) \
1064 M_AST_EXPR_LIST(X) \
1065 M_AST_CLAUSE_LIST(X) \
1066 M_AST_CONSTRAINT_LIST(X) \
1067 M_AST_COMMAND_LIST(X)
1071 template<
typename T>
using Const = ASTExprVisitor::Const<T>;
1073 using ASTExprVisitor::operator();
1074 using ASTClauseVisitor::operator();
1075 using ASTConstraintVisitor::operator();
1076 using ASTCommandVisitor::operator();
1081 template<
typename T>
using Const = ConstASTExprVisitor::Const<T>;
1083 using ConstASTExprVisitor::operator();
1084 using ConstASTClauseVisitor::operator();
1085 using ConstASTConstraintVisitor::operator();
1086 using ConstASTCommandVisitor::operator();
1107struct hash<
m::ast::Expr>
#define M_AST_EXPR_LIST(X)
#define M_AST_CONSTRAINT_LIST(X)
#define M_AST_COMMAND_LIST(X)
#define M_AST_CLAUSE_LIST(X)
#define M_DECLARE_VISITOR(VISITOR_NAME, BASE_CLASS, CLASS_LIST)
Defines a visitor VISITOR_NAME to visit the class hierarchy rooted in BASE_CLASS and with subclasses ...
#define M_MAKE_STL_VISITABLE(VISITOR, BASE_CLASS, CLASS_LIST)
Defines a function visit() to make the class hierarchy STL-style visitable with VISITOR.
and(sizeof(T)==4) U64x1 reinterpret_to_U64(m
#define M_unreachable(MSG)
std::string escape(char c)
std::string quote(const std::string &str)
ThreadSafeStringPool::proxy_type ThreadSafePooledString
ThreadSafeStringPool::proxy_optional_type ThreadSafePooledOptionalString
The numeric type represents integer and floating-point types of different precision and scale.
A Schema represents a sequence of identifiers, optionally with a prefix, and their associated types.
A table is a sorted set of attributes.
This class represents types in the SQL type system.
ASTExprVisitor::Const< T > Const
void accept(ASTExprVisitor &v) override
std::unique_ptr< Expr > lhs
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
BinaryExpr(Token op, std::unique_ptr< Expr > lhs, std::unique_ptr< Expr > rhs)
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
void accept(ConstASTExprVisitor &v) const override
bool contains_free_variables() const override
Returns true iff this Expr contains a free variable.
bool contains_bound_variables() const override
Returns true iff this Expr contains a bound variable.
std::unique_ptr< Expr > rhs
void accept(ASTConstraintVisitor &v) override
void accept(ConstASTConstraintVisitor &v) const override
std::unique_ptr< Expr > cond
CheckConditionConstraint(Token tok, std::unique_ptr< Expr > cond)
friend std::ostream &M_EXPORT operator<<(std::ostream &out, const Clause &c)
virtual void accept(ASTClauseVisitor &v)=0
virtual void accept(ConstASTClauseVisitor &v) const =0
virtual void accept(ASTCommandVisitor &v)=0
friend std::ostream &M_EXPORT operator<<(std::ostream &out, const Command &cmd)
virtual void accept(ConstASTCommandVisitor &v) const =0
virtual ~Command()=default
ConstASTExprVisitor::Const< T > Const
A constant: a string literal or a numeric constant.
bool contains_bound_variables() const override
Returns true iff this Expr contains a bound variable.
bool contains_free_variables() const override
Returns true iff this Expr contains a free variable.
void accept(ConstASTExprVisitor &v) const override
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
void accept(ASTExprVisitor &v) override
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
Abstract class to represent constraints attached to attributes of a table.
virtual void accept(ASTConstraintVisitor &v)=0
virtual void accept(ConstASTConstraintVisitor &v) const =0
CreateDatabaseStmt(Token database_name)
void accept(ConstASTCommandVisitor &v) const override
void accept(ASTCommandVisitor &v) override
void accept(ConstASTCommandVisitor &v) const override
CreateIndexStmt(Token has_unique, bool has_if_not_exists, Token index_name, Token table_name, Token method, std::vector< std::unique_ptr< Expr > > key_fields)
std::vector< std::unique_ptr< Expr > > key_fields
void accept(ASTCommandVisitor &v) override
attribute_definition(Token name, const Type *type, std::vector< std::unique_ptr< Constraint > > constraints)
std::vector< std::unique_ptr< Constraint > > constraints
std::vector< std::unique_ptr< attribute_definition > > attributes
void accept(ASTCommandVisitor &v) override
CreateTableStmt(Token table_name, std::vector< std::unique_ptr< attribute_definition > > attributes)
void accept(ConstASTCommandVisitor &v) const override
An import statement for a delimiter separated values (DSV) file.
void accept(ASTCommandVisitor &v) override
DSVImportStmt(Token table_name)
void accept(ConstASTCommandVisitor &v) const override
DeleteStmt(Token table_name, std::unique_ptr< Clause > where)
void accept(ConstASTCommandVisitor &v) const override
void accept(ASTCommandVisitor &v) override
Designator(Token dot, Token table_name, Token attr_name)
ThreadSafePooledOptionalString unique_id_
a unique ID created for Designators in nested queries (for decorrelation)
ThreadSafePooledString get_table_name() const
bool contains_bound_variables() const override
Returns false iff this Designator is a free variable.
void decrease_binding_depth()
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
Designator(Token attr_name)
void set_binding_depth(unsigned depth)
Marks this Designator as free variable, i.e.
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
bool contains_free_variables() const override
Returns true iff this Designator is a free variable.
void accept(ConstASTExprVisitor &v) const override
unsigned binding_depth() const
void accept(ASTExprVisitor &v) override
bool has_explicit_table_name() const
bool is_identifier() const
Returns true iff this Designator has no table name, neither explicitly nor implicitly (by sema).
std::variant< std::monostate, const Expr *, const Attribute * > target_type
bool has_table_name() const
Designator(Token dot, Token table_name, Token attr_name, const Type *type, target_type target)
const target_type & target() const
target_type target_
the target that is referenced by this designator
void accept(ConstASTCommandVisitor &v) const override
DropDatabaseStmt(Token database_name, bool has_if_exists)
void accept(ASTCommandVisitor &v) override
void accept(ASTCommandVisitor &v) override
DropIndexStmt(std::vector< std::unique_ptr< Token > > index_names, bool has_if_exists)
void accept(ConstASTCommandVisitor &v) const override
std::vector< std::unique_ptr< Token > > index_names
std::vector< std::unique_ptr< Token > > table_names
DropTableStmt(std::vector< std::unique_ptr< Token > > table_names, bool has_if_exists)
void accept(ASTCommandVisitor &v) override
void accept(ConstASTCommandVisitor &v) const override
void accept(ConstASTCommandVisitor &v) const override
void accept(ASTCommandVisitor &v) override
void accept(ASTClauseVisitor &v) override
void accept(ConstASTClauseVisitor &v) const override
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
uint64_t hash() const override
Computes a hash of this, considering only syntactic properties.
bool contains_free_variables() const override
Returns true iff this Expr contains a free variable.
bool contains_bound_variables() const override
Returns true iff this Expr contains a bound variable.
void accept(ASTExprVisitor &v) override
void accept(ConstASTExprVisitor &v) const override
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
void accept(ConstASTCommandVisitor &v) const override
void accept(ASTCommandVisitor &v) override
virtual bool contains_bound_variables() const =0
Returns true iff this Expr contains a bound variable.
bool has_type() const
Returns true iff this Expr has been assigned a Type, most likely by Sema.
const Type * type() const
Returns the Type of this Expr.
virtual bool is_constant() const =0
Returns true iff this Expr is constant, i.e.
virtual bool contains_free_variables() const =0
Returns true iff this Expr contains a free variable.
bool operator!=(const Expr &other) const
Returns false iff other is syntactically equal to this.
virtual uint64_t hash() const =0
Computes a hash of this, considering only syntactic properties.
M_LCOV_EXCL_START friend std::string to_string(const Expr &e)
Expr(Token tok, const Type *type)
virtual void accept(ConstASTExprVisitor &v) const =0
Token tok
the token of the expression; serves as an anchor to locate the expression in the source
virtual void accept(ASTExprVisitor &v)=0
virtual bool operator==(const Expr &other) const =0
Returns true iff other is syntactically equal to this.
void type(const Type *type)
Sets the Type of this Expr.
friend std::ostream &M_EXPORT operator<<(std::ostream &out, const Expr &e)
virtual bool can_be_null() const =0
Returns true iff this Expr is nullable, i.e.
std::vector< std::unique_ptr< Expr > > args
FnApplicationExpr(Token lpar, std::unique_ptr< Expr > fn, std::vector< std::unique_ptr< Expr > > args)
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
const Function & get_function() const
std::unique_ptr< Expr > fn
bool contains_bound_variables() const override
Returns true iff this Expr contains a bound variable.
bool has_function() const
void accept(ConstASTExprVisitor &v) const override
void accept(ASTExprVisitor &v) override
bool contains_free_variables() const override
Returns true iff this Expr contains a free variable.
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
std::variant< Token, Stmt * > source
from_type(std::unique_ptr< Stmt > S, Token alias)
const Table & table() const
from_type(Token name, Token alias)
FromClause(Token tok, std::vector< from_type > from)
void accept(ConstASTClauseVisitor &v) const override
void accept(ASTClauseVisitor &v) override
std::vector< from_type > from
void accept(ASTClauseVisitor &v) override
GroupByClause(Token tok, std::vector< group_type > group_by)
a list of expressions to group by
void accept(ConstASTClauseVisitor &v) const override
std::pair< std::unique_ptr< Expr >, Token > group_type
std::vector< group_type > group_by
HavingClause(Token tok, std::unique_ptr< Expr > having)
std::unique_ptr< Expr > having
void accept(ConstASTClauseVisitor &v) const override
void accept(ASTClauseVisitor &v) override
ImportStmt(Token table_name)
InsertStmt(Token table_name, std::vector< tuple_t > tuples)
std::vector< tuple_t > tuples
void accept(ConstASTCommandVisitor &v) const override
void accept(ASTCommandVisitor &v) override
std::pair< kind_t, std::unique_ptr< Expr > > element_type
std::vector< element_type > tuple_t
void accept(ASTCommandVisitor &v) override
Token tok
the token of the Instruction; starts with \
Instruction(Token tok, ThreadSafePooledString name, std::vector< std::string > args)
ThreadSafePooledString name
the name of the Instruction (without leading \)
std::vector< std::string > args
the arguments to the Instruction; may be empty
void accept(ConstASTCommandVisitor &v) const override
void accept(ConstASTClauseVisitor &v) const override
LimitClause(Token tok, Token limit, Token offset)
void accept(ASTClauseVisitor &v) override
NotNullConstraint(Token tok)
void accept(ConstASTConstraintVisitor &v) const override
void accept(ASTConstraintVisitor &v) override
std::vector< order_type > order_by
true means ascending, false means descending
void accept(ASTClauseVisitor &v) override
std::pair< std::unique_ptr< Expr >, bool > order_type
OrderByClause(Token tok, std::vector< order_type > order_by)
void accept(ConstASTClauseVisitor &v) const override
PrimaryKeyConstraint(Token tok)
void accept(ASTConstraintVisitor &v) override
void accept(ConstASTConstraintVisitor &v) const override
A query expression for nested queries.
QueryExpr(Token op, std::unique_ptr< Stmt > query)
bool contains_bound_variables() const override
Conceptually, QueryExprs have no variables at all.
bool contains_free_variables() const override
Conceptually, QueryExprs have no variables at all.
std::unique_ptr< Stmt > query
void accept(ASTExprVisitor &v) override
ThreadSafePooledString alias_
the alias that is used for this query expression
const ThreadSafePooledString & alias() const
void accept(ConstASTExprVisitor &v) const override
void accept(ConstASTConstraintVisitor &v) const override
ReferenceConstraint(Token tok, Token table_name, Token attr_name, OnDeleteAction action)
void accept(ASTConstraintVisitor &v) override
void accept(ConstASTClauseVisitor &v) const override
SelectClause(Token tok, std::vector< select_type > select, Token select_all)
list of expressions expanded from SELECT *
std::vector< select_type > select
list of selected elements; expr AS name
void accept(ASTClauseVisitor &v) override
std::pair< std::unique_ptr< Expr >, Token > select_type
std::vector< std::unique_ptr< Expr > > expanded_select_all
std::unique_ptr< Clause > from
std::unique_ptr< Clause > select
void accept(ASTCommandVisitor &v) override
void accept(ConstASTCommandVisitor &v) const override
std::unique_ptr< Clause > where
std::unique_ptr< Clause > order_by
SelectStmt(std::unique_ptr< Clause > select, std::unique_ptr< Clause > from, std::unique_ptr< Clause > where, std::unique_ptr< Clause > group_by, std::unique_ptr< Clause > having, std::unique_ptr< Clause > order_by, std::unique_ptr< Clause > limit)
std::unique_ptr< Clause > having
std::unique_ptr< Clause > group_by
std::unique_ptr< Clause > limit
std::conditional_t< C, ConstASTExprVisitor, ASTExprVisitor > super
typename super::template Const< T > Const
virtual ~ThePostOrderExprVisitor()
typename super::template Const< T > Const
std::conditional_t< C, ConstASTExprVisitor, ASTExprVisitor > super
virtual ~ThePreOrderExprVisitor()
A generic base class for implementing recursive ast::Expr visitors.
typename super::template Const< T > Const
void operator()(Const< UnaryExpr > &e) override
void operator()(Const< FnApplicationExpr > &e) override
virtual ~TheRecursiveExprVisitorBase()
std::conditional_t< C, ConstASTExprVisitor, ASTExprVisitor > super
void operator()(Const< BinaryExpr > &e) override
ThreadSafePooledOptionalString text
declared as optional for dummy tokens
A unary expression: "+e", "-e", "~e", "NOT e".
bool contains_free_variables() const override
Returns true iff this Expr contains a free variable.
bool can_be_null() const override
Returns true iff this Expr is nullable, i.e.
void accept(ConstASTExprVisitor &v) const override
UnaryExpr(Token op, std::unique_ptr< Expr > expr)
void accept(ASTExprVisitor &v) override
std::unique_ptr< Expr > expr
bool is_constant() const override
Returns true iff this Expr is constant, i.e.
bool contains_bound_variables() const override
Returns true iff this Expr contains a bound variable.
UniqueConstraint(Token tok)
void accept(ASTConstraintVisitor &v) override
void accept(ConstASTConstraintVisitor &v) const override
UpdateStmt(Token table_name, std::vector< set_type > set, std::unique_ptr< Clause > where)
std::unique_ptr< Clause > where
std::pair< Token, std::unique_ptr< Expr > > set_type
void accept(ConstASTCommandVisitor &v) const override
std::vector< set_type > set
void accept(ASTCommandVisitor &v) override
void accept(ConstASTCommandVisitor &v) const override
UseDatabaseStmt(Token database_name)
void accept(ASTCommandVisitor &v) override
WhereClause(Token tok, std::unique_ptr< Expr > where)
void accept(ConstASTClauseVisitor &v) const override
std::unique_ptr< Expr > where
void accept(ASTClauseVisitor &v) override
Signals a runtime error that mu*t*able is not responsible for and that mu*t*able was not able to reco...
std::size_t operator()(const m::ast::Expr &e) const