-
Notifications
You must be signed in to change notification settings - Fork 94
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2396 from kuzudb/parsed-statement-visitor
Add parsed statement visitor
- Loading branch information
Showing
12 changed files
with
247 additions
and
63 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
29 changes: 0 additions & 29 deletions
29
src/include/binder/visitor/statement_read_write_analyzer.h
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#pragma once | ||
|
||
#include "statement.h" | ||
|
||
namespace kuzu { | ||
namespace parser { | ||
|
||
class SingleQuery; | ||
class QueryPart; | ||
class ReadingClause; | ||
class UpdatingClause; | ||
class WithClause; | ||
class ReturnClause; | ||
|
||
class StatementVisitor { | ||
public: | ||
StatementVisitor() = default; | ||
virtual ~StatementVisitor() = default; | ||
|
||
void visit(const Statement& statement); | ||
|
||
private: | ||
// LCOV_EXCL_START | ||
virtual void visitQuery(const Statement& statement); | ||
virtual void visitSingleQuery(const SingleQuery* singleQuery); | ||
virtual void visitQueryPart(const QueryPart* queryPart); | ||
virtual void visitReadingClause(const ReadingClause* readingClause); | ||
virtual void visitMatch(const ReadingClause* readingClause) {} | ||
virtual void visitUnwind(const ReadingClause* readingClause) {} | ||
virtual void visitInQueryCall(const ReadingClause* readingClause) {} | ||
virtual void visitLoadFrom(const ReadingClause* readingClause) {} | ||
virtual void visitUpdatingClause(const UpdatingClause* updatingClause); | ||
virtual void visitSet(const UpdatingClause* updatingClause) {} | ||
virtual void visitDelete(const UpdatingClause* updatingClause) {} | ||
virtual void visitInsert(const UpdatingClause* updatingClause) {} | ||
virtual void visitMerge(const UpdatingClause* updatingClause) {} | ||
virtual void visitWithClause(const WithClause* withClause) {} | ||
virtual void visitReturnClause(const ReturnClause* returnClause) {} | ||
|
||
virtual void visitCreateTable(const Statement& statement) {} | ||
virtual void visitDropTable(const Statement& statement) {} | ||
virtual void visitAlter(const Statement& statement) {} | ||
virtual void visitCopyFrom(const Statement& statement) {} | ||
virtual void visitCopyTo(const Statement& statement) {} | ||
virtual void visitStandaloneCall(const Statement& statement) {} | ||
virtual void visitExplain(const Statement& statement); | ||
virtual void visitCreateMacro(const Statement& statement) {} | ||
virtual void visitCommentOn(const Statement& statement) {} | ||
virtual void visitTransaction(const Statement& statement) {} | ||
// LCOV_EXCL_STOP | ||
}; | ||
|
||
} // namespace parser | ||
} // namespace kuzu |
30 changes: 30 additions & 0 deletions
30
src/include/parser/visitor/statement_read_write_analyzer.h
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
#pragma once | ||
|
||
#include "parser/parsed_statement_visitor.h" | ||
|
||
namespace kuzu { | ||
namespace parser { | ||
|
||
class StatementReadWriteAnalyzer final : public StatementVisitor { | ||
public: | ||
StatementReadWriteAnalyzer() : StatementVisitor{}, readOnly{true} {} | ||
|
||
bool isReadOnly(const Statement& statement); | ||
|
||
private: | ||
inline void visitCreateTable(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitDropTable(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitAlter(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitCopyFrom(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitStandaloneCall(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitCreateMacro(const Statement& /*statement*/) { readOnly = false; } | ||
inline void visitCommentOn(const Statement& /*statement*/) { readOnly = false; } | ||
|
||
inline void visitUpdatingClause(const UpdatingClause* /*updatingClause*/) { readOnly = false; } | ||
|
||
private: | ||
bool readOnly; | ||
}; | ||
|
||
} // namespace parser | ||
} // namespace kuzu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
#include "parser/parsed_statement_visitor.h" | ||
|
||
#include "common/assert.h" | ||
#include "parser/explain_statement.h" | ||
#include "parser/query/regular_query.h" | ||
|
||
using namespace kuzu::common; | ||
|
||
namespace kuzu { | ||
namespace parser { | ||
|
||
void StatementVisitor::visit(const Statement& statement) { | ||
switch (statement.getStatementType()) { | ||
case StatementType::QUERY: { | ||
visitQuery(statement); | ||
} break; | ||
case StatementType::CREATE_TABLE: { | ||
visitCreateTable(statement); | ||
} break; | ||
case StatementType::DROP_TABLE: { | ||
visitDropTable(statement); | ||
} break; | ||
case StatementType::ALTER: { | ||
visitAlter(statement); | ||
} break; | ||
case StatementType::COPY_FROM: { | ||
visitCopyFrom(statement); | ||
} break; | ||
case StatementType::COPY_TO: { | ||
visitCopyTo(statement); | ||
} break; | ||
case StatementType::STANDALONE_CALL: { | ||
visitStandaloneCall(statement); | ||
} break; | ||
case StatementType::EXPLAIN: { | ||
visitExplain(statement); | ||
} break; | ||
case StatementType::CREATE_MACRO: { | ||
visitCreateMacro(statement); | ||
} break; | ||
case StatementType::COMMENT_ON: { | ||
visitCommentOn(statement); | ||
} break; | ||
case StatementType::TRANSACTION: { | ||
visitTransaction(statement); | ||
} break; | ||
default: | ||
KU_UNREACHABLE; | ||
} | ||
} | ||
|
||
void StatementVisitor::visitExplain(const Statement& statement) { | ||
auto& explainStatement = reinterpret_cast<const ExplainStatement&>(statement); | ||
visit(*explainStatement.getStatementToExplain()); | ||
} | ||
|
||
void StatementVisitor::visitQuery(const Statement& statement) { | ||
auto& regularQuery = reinterpret_cast<const RegularQuery&>(statement); | ||
for (auto i = 0u; i < regularQuery.getNumSingleQueries(); ++i) { | ||
visitSingleQuery(regularQuery.getSingleQuery(i)); | ||
} | ||
} | ||
|
||
void StatementVisitor::visitSingleQuery(const SingleQuery* singleQuery) { | ||
for (auto i = 0u; i < singleQuery->getNumQueryParts(); ++i) { | ||
visitQueryPart(singleQuery->getQueryPart(i)); | ||
} | ||
for (auto i = 0u; i < singleQuery->getNumReadingClauses(); ++i) { | ||
visitReadingClause(singleQuery->getReadingClause(i)); | ||
} | ||
for (auto i = 0u; i < singleQuery->getNumUpdatingClauses(); ++i) { | ||
visitUpdatingClause(singleQuery->getUpdatingClause(i)); | ||
} | ||
visitReturnClause(singleQuery->getReturnClause()); | ||
} | ||
|
||
void StatementVisitor::visitQueryPart(const QueryPart* queryPart) { | ||
for (auto i = 0u; i < queryPart->getNumReadingClauses(); ++i) { | ||
visitReadingClause(queryPart->getReadingClause(i)); | ||
} | ||
for (auto i = 0u; i < queryPart->getNumUpdatingClauses(); ++i) { | ||
visitUpdatingClause(queryPart->getUpdatingClause(i)); | ||
} | ||
visitWithClause(queryPart->getWithClause()); | ||
} | ||
|
||
void StatementVisitor::visitReadingClause(const ReadingClause* readingClause) { | ||
switch (readingClause->getClauseType()) { | ||
case ClauseType::MATCH: { | ||
visitMatch(readingClause); | ||
} break; | ||
case ClauseType::UNWIND: { | ||
visitUnwind(readingClause); | ||
} break; | ||
case ClauseType::IN_QUERY_CALL: { | ||
visitInQueryCall(readingClause); | ||
} break; | ||
case ClauseType::LOAD_FROM: { | ||
visitLoadFrom(readingClause); | ||
} break; | ||
default: | ||
KU_UNREACHABLE; | ||
} | ||
} | ||
|
||
void StatementVisitor::visitUpdatingClause(const UpdatingClause* updatingClause) { | ||
switch (updatingClause->getClauseType()) { | ||
case ClauseType::SET: { | ||
visitSet(updatingClause); | ||
} break; | ||
case ClauseType::DELETE_: { | ||
visitDelete(updatingClause); | ||
} break; | ||
case ClauseType::INSERT: { | ||
visitInsert(updatingClause); | ||
} break; | ||
case ClauseType::MERGE: { | ||
visitMerge(updatingClause); | ||
} break; | ||
default: | ||
KU_UNREACHABLE; | ||
} | ||
} | ||
|
||
} // namespace parser | ||
} // namespace kuzu |
Oops, something went wrong.