Skip to content

Commit

Permalink
Merge pull request #15 from goccy/add-analyze-statemnt-from-parser-ast
Browse files Browse the repository at this point in the history
Add AnalyzeStatementFromParserAST API
  • Loading branch information
goccy authored Aug 12, 2022
2 parents 53a6511 + 32024d4 commit 7c3e678
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 3 deletions.
27 changes: 27 additions & 0 deletions analyzer.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"unsafe"

"github.com/goccy/go-zetasql/ast"
internal "github.com/goccy/go-zetasql/internal/ccall/go-zetasql"
"github.com/goccy/go-zetasql/internal/helper"
"github.com/goccy/go-zetasql/resolved_ast"
Expand Down Expand Up @@ -494,6 +495,32 @@ func AnalyzeType(typeName string, catalog types.Catalog, opt *AnalyzerOptions) (
return nil, fmt.Errorf("go-zetasql: unimplemented")
}

func AnalyzeStatementFromParserAST(sql string, stmt ast.StatementNode, catalog types.Catalog, opt *AnalyzerOptions) (*AnalyzerOutput, error) {
var (
out unsafe.Pointer
status unsafe.Pointer
)
if catalog == nil {
return nil, ErrRequiredCatalog
}
if opt == nil || opt.raw == nil {
opt = NewAnalyzerOptions()
}
internal.AnalyzeStatementFromParserAST(
getNodeRaw(stmt),
opt.raw,
helper.StringToPtr(sql),
getRawCatalog(catalog),
&out,
&status,
)
st := helper.NewStatus(status)
if !st.OK() {
return nil, st.Error()
}
return newAnalyzerOutput(out), nil
}

type TableNameSet struct{}

func ExtractTableNamesFromStatement(sql string) (*TableNameSet, error) {
Expand Down
15 changes: 15 additions & 0 deletions internal/ccall/go-zetasql/bind_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -11671,6 +11671,21 @@ func zetasql_AnalyzeExpression(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 un
C.export_zetasql_AnalyzeExpression(arg0, arg1, arg2, arg3, arg4)
}

func AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
zetasql_AnalyzeStatementFromParserAST(
arg0,
arg1,
arg2,
arg3,
arg4,
arg5,
)
}

func zetasql_AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
C.export_zetasql_AnalyzeStatementFromParserAST(arg0, arg1, arg2, arg3, arg4, arg5)
}

func AnalyzerOutput_resolved_statement(arg0 unsafe.Pointer, arg1 *unsafe.Pointer) {
zetasql_AnalyzerOutput_resolved_statement(
arg0,
Expand Down
15 changes: 15 additions & 0 deletions internal/ccall/go-zetasql/bind_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -11674,6 +11674,21 @@ func zetasql_AnalyzeExpression(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 un
C.export_zetasql_AnalyzeExpression(arg0, arg1, arg2, arg3, arg4)
}

func AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
zetasql_AnalyzeStatementFromParserAST(
arg0,
arg1,
arg2,
arg3,
arg4,
arg5,
)
}

func zetasql_AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
C.export_zetasql_AnalyzeStatementFromParserAST(arg0, arg1, arg2, arg3, arg4, arg5)
}

func AnalyzerOutput_resolved_statement(arg0 unsafe.Pointer, arg1 *unsafe.Pointer) {
zetasql_AnalyzerOutput_resolved_statement(
arg0,
Expand Down
15 changes: 15 additions & 0 deletions internal/ccall/go-zetasql/public/analyzer/bind_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,21 @@ func analyzer_AnalyzeExpression(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 u
C.export_zetasql_public_analyzer_AnalyzeExpression(arg0, arg1, arg2, arg3, arg4)
}

func AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
analyzer_AnalyzeStatementFromParserAST(
arg0,
arg1,
arg2,
arg3,
arg4,
arg5,
)
}

func analyzer_AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
C.export_zetasql_public_analyzer_AnalyzeStatementFromParserAST(arg0, arg1, arg2, arg3, arg4, arg5)
}

func AnalyzerOutput_resolved_statement(arg0 unsafe.Pointer, arg1 *unsafe.Pointer) {
analyzer_AnalyzerOutput_resolved_statement(
arg0,
Expand Down
15 changes: 15 additions & 0 deletions internal/ccall/go-zetasql/public/analyzer/bind_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -736,6 +736,21 @@ func analyzer_AnalyzeExpression(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 u
C.export_zetasql_public_analyzer_AnalyzeExpression(arg0, arg1, arg2, arg3, arg4)
}

func AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
analyzer_AnalyzeStatementFromParserAST(
arg0,
arg1,
arg2,
arg3,
arg4,
arg5,
)
}

func analyzer_AnalyzeStatementFromParserAST(arg0 unsafe.Pointer, arg1 unsafe.Pointer, arg2 unsafe.Pointer, arg3 unsafe.Pointer, arg4 *unsafe.Pointer, arg5 *unsafe.Pointer) {
C.export_zetasql_public_analyzer_AnalyzeStatementFromParserAST(arg0, arg1, arg2, arg3, arg4, arg5)
}

func AnalyzerOutput_resolved_statement(arg0 unsafe.Pointer, arg1 *unsafe.Pointer) {
analyzer_AnalyzerOutput_resolved_statement(
arg0,
Expand Down
16 changes: 16 additions & 0 deletions internal/ccall/go-zetasql/public/analyzer/bridge.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1296,6 +1296,22 @@ void GO_EXPORT(AnalyzeExpression)(void * arg0,void * arg1,void * arg2,void ** ar
*arg4 = (void *)(new absl::Status(ret));
}

void GO_EXPORT(AnalyzeStatementFromParserAST)(void * arg0,void * arg1,void * arg2,void * arg3,void ** arg4,void ** arg5)
{
std::unique_ptr<const zetasql::AnalyzerOutput> out;
auto typeFactory = new zetasql::TypeFactory(); // FIXME: typeFactory will be leaked.
absl::Status ret = zetasql::AnalyzeStatementFromParserAST(
*(zetasql::ASTStatement *)arg0,
*(zetasql::AnalyzerOptions *)arg1,
(char *)arg2,
(zetasql::Catalog *)arg3,
typeFactory,
&out
);
*(std::unique_ptr<const zetasql::AnalyzerOutput> *)arg4 = std::move(out);
*arg5 = (void *)(new absl::Status(ret));
}

void GO_EXPORT(AnalyzerOutput_resolved_statement)(void * arg0,void ** arg1)
{
zetasql::AnalyzerOutput *out = (zetasql::AnalyzerOutput *)arg0;
Expand Down
1 change: 1 addition & 0 deletions internal/ccall/go-zetasql/public/analyzer/bridge_extern.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ extern void GO_EXPORT(ValidateAnalyzerOptions)(void * arg0,void ** arg1);
extern void GO_EXPORT(AnalyzeStatement)(void * arg0,void * arg1,void * arg2,void ** arg3,void ** arg4);
extern void GO_EXPORT(AnalyzeNextStatement)(void * arg0,void * arg1,void * arg2,void ** arg3,int* arg4,void ** arg5);
extern void GO_EXPORT(AnalyzeExpression)(void * arg0,void * arg1,void * arg2,void ** arg3,void ** arg4);
extern void GO_EXPORT(AnalyzeStatementFromParserAST)(void * arg0,void * arg1,void * arg2,void * arg3,void ** arg4,void ** arg5);
extern void GO_EXPORT(AnalyzerOutput_resolved_statement)(void * arg0,void ** arg1);
extern void GO_EXPORT(ResolvedNode_node_kind)(void * arg0,int* arg1);
extern void GO_EXPORT(ResolvedNode_IsScan)(void * arg0,int* arg1);
Expand Down
9 changes: 9 additions & 0 deletions internal/cmd/generator/bridge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6867,6 +6867,15 @@
ret:
- struct
- struct
- name: AnalyzeStatementFromParserAST
args:
- struct
- struct
- string
- struct
ret:
- struct
- struct
- name: AnalyzerOutput_resolved_statement
args:
- struct
Expand Down
6 changes: 3 additions & 3 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ func ParseNextStatement(loc *ParseResumeLocation, opt *ParserOptions) (ast.State
// Entire constructs such as IF...END IF,
// WHILE...END WHILE, and BEGIN...END are returned as a single statement, and
// may contain inner statements, which can be examined through the returned parse tree.
func ParseNextScriptStatement(loc *ParseResumeLocation, opt *ParserOptions) (ast.ScriptNode, bool, error) {
func ParseNextScriptStatement(loc *ParseResumeLocation, opt *ParserOptions) (ast.StatementNode, bool, error) {
var (
out unsafe.Pointer
isEnd bool
Expand All @@ -214,8 +214,8 @@ func ParseNextScriptStatement(loc *ParseResumeLocation, opt *ParserOptions) (ast
return nil, isEnd, st.Error()
}
parserOut := &parserOutput{raw: out}
script, err := parserOut.script()
return script, isEnd, err
stmt, err := parserOut.stmt()
return stmt, isEnd, err
}

// Unparse a given AST back to a canonical SQL string and return it.
Expand Down

0 comments on commit 7c3e678

Please sign in to comment.