From 81bbfe698232507d4f51b5b4a999a691e5e8ea28 Mon Sep 17 00:00:00 2001 From: Matts966 Date: Mon, 16 Aug 2021 07:16:13 +0900 Subject: [PATCH] Support for parsing scripts --- Makefile | 2 +- alphasql/BUILD | 10 + alphasql/alphacheck.cc | 246 +++++++++++++----- alphasql/common_lib.h | 61 +++++ alphasql/identifier_resolver.cc | 12 +- alphasql/table_name_resolver.h | 70 ++--- samples/scripting/alphacheck_stderr.txt | 0 samples/scripting/alphacheck_stdout.txt | 10 + samples/scripting/alphadag_stderr.txt | 0 samples/scripting/alphadag_stdout.txt | 5 + samples/scripting/dag.dot | 6 + samples/scripting/dag.png | Bin 0 -> 19716 bytes samples/scripting/external_tables.txt | 3 + samples/scripting/mart.sql | 19 ++ samples/scripting/procedure.sql | 8 + samples/scripting/script.sql | 13 + .../side_effect_first/alphadag_stderr.txt | 0 .../side_effect_first/alphadag_stdout.txt | 5 + samples/scripting/side_effect_first/dag.dot | 6 + samples/scripting/side_effect_first/dag.png | Bin 0 -> 19716 bytes .../side_effect_first/external_tables.txt | 3 + .../alphadag_stderr.txt | 0 .../alphadag_stdout.txt | 5 + .../side_effect_first_with_tables/dag.dot | 21 ++ .../side_effect_first_with_tables/dag.png | Bin 0 -> 40235 bytes .../external_tables.txt | 3 + .../scripting/with_all/alphadag_stderr.txt | 0 .../scripting/with_all/alphadag_stdout.txt | 5 + samples/scripting/with_all/dag.dot | 21 ++ samples/scripting/with_all/dag.png | Bin 0 -> 40235 bytes .../scripting/with_all/external_tables.txt | 3 + .../with_functions/alphadag_stderr.txt | 0 .../with_functions/alphadag_stdout.txt | 5 + samples/scripting/with_functions/dag.dot | 6 + samples/scripting/with_functions/dag.png | Bin 0 -> 19716 bytes .../with_functions/external_tables.txt | 3 + .../scripting/with_tables/alphadag_stderr.txt | 0 .../scripting/with_tables/alphadag_stdout.txt | 5 + samples/scripting/with_tables/dag.dot | 21 ++ samples/scripting/with_tables/dag.png | Bin 0 -> 40235 bytes .../scripting/with_tables/external_tables.txt | 3 + 41 files changed, 473 insertions(+), 107 deletions(-) create mode 100644 alphasql/common_lib.h create mode 100644 samples/scripting/alphacheck_stderr.txt create mode 100644 samples/scripting/alphacheck_stdout.txt create mode 100644 samples/scripting/alphadag_stderr.txt create mode 100644 samples/scripting/alphadag_stdout.txt create mode 100644 samples/scripting/dag.dot create mode 100644 samples/scripting/dag.png create mode 100644 samples/scripting/external_tables.txt create mode 100644 samples/scripting/mart.sql create mode 100644 samples/scripting/procedure.sql create mode 100644 samples/scripting/script.sql create mode 100644 samples/scripting/side_effect_first/alphadag_stderr.txt create mode 100644 samples/scripting/side_effect_first/alphadag_stdout.txt create mode 100644 samples/scripting/side_effect_first/dag.dot create mode 100644 samples/scripting/side_effect_first/dag.png create mode 100644 samples/scripting/side_effect_first/external_tables.txt create mode 100644 samples/scripting/side_effect_first_with_tables/alphadag_stderr.txt create mode 100644 samples/scripting/side_effect_first_with_tables/alphadag_stdout.txt create mode 100644 samples/scripting/side_effect_first_with_tables/dag.dot create mode 100644 samples/scripting/side_effect_first_with_tables/dag.png create mode 100644 samples/scripting/side_effect_first_with_tables/external_tables.txt create mode 100644 samples/scripting/with_all/alphadag_stderr.txt create mode 100644 samples/scripting/with_all/alphadag_stdout.txt create mode 100644 samples/scripting/with_all/dag.dot create mode 100644 samples/scripting/with_all/dag.png create mode 100644 samples/scripting/with_all/external_tables.txt create mode 100644 samples/scripting/with_functions/alphadag_stderr.txt create mode 100644 samples/scripting/with_functions/alphadag_stdout.txt create mode 100644 samples/scripting/with_functions/dag.dot create mode 100644 samples/scripting/with_functions/dag.png create mode 100644 samples/scripting/with_functions/external_tables.txt create mode 100644 samples/scripting/with_tables/alphadag_stderr.txt create mode 100644 samples/scripting/with_tables/alphadag_stdout.txt create mode 100644 samples/scripting/with_tables/dag.dot create mode 100644 samples/scripting/with_tables/dag.png create mode 100644 samples/scripting/with_tables/external_tables.txt diff --git a/Makefile b/Makefile index 58d6a0d7..e8248b82 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ without_options: osx dot -Tpng $$sample_path/dag.dot -o $$sample_path/dag.png; \ alphacheck $$sample_path/dag.dot \ --json_schema_path ./samples/sample-schema.json \ - > $$sample_path/alphacheck_stdout.txt 2> $$sample_path/alphacheck_stderr.txt; \ + > $$sample_path/alphacheck_stdout.txt 2> $$sample_path/alphacheck_stderr.txt || echo alphacheck $$sample_path failed; \ done; .PHONY: with_functions diff --git a/alphasql/BUILD b/alphasql/BUILD index a05a751a..d2413720 100644 --- a/alphasql/BUILD +++ b/alphasql/BUILD @@ -47,10 +47,19 @@ cc_library( ], ) +cc_library( + name = "common_lib", + hdrs = ["common_lib.h"], + deps = [ + "@com_google_zetasql//zetasql/parser:parser", + ], +) + cc_library( name = "table_name_resolver", hdrs = ["table_name_resolver.h"], deps = [ + ":common_lib", "@com_google_zetasql//zetasql/public:simple_catalog", "@com_google_zetasql//zetasql/public:type", "@boost//:property_tree", @@ -65,6 +74,7 @@ cc_binary( ], deps = [ ":json_schema_reader", + ":common_lib", "@com_google_zetasql//zetasql/base", "@com_google_zetasql//zetasql/base:map_util", "@com_google_zetasql//zetasql/base:ret_check", diff --git a/alphasql/alphacheck.cc b/alphasql/alphacheck.cc index 537d4e4a..0e232d0a 100644 --- a/alphasql/alphacheck.cc +++ b/alphasql/alphacheck.cc @@ -33,6 +33,7 @@ #include "zetasql/base/logging.h" #include "zetasql/public/analyzer.h" #include "zetasql/public/catalog.h" +#include "zetasql/public/error_helpers.h" #include "zetasql/public/evaluator.h" #include "zetasql/public/evaluator_table_iterator.h" #include "zetasql/public/language_options.h" @@ -42,6 +43,7 @@ #include "zetasql/public/value.h" #include "zetasql/resolved_ast/resolved_ast.h" +#include "alphasql/common_lib.h" #include "alphasql/json_schema_reader.h" #include "boost/graph/graphviz.hpp" #include "zetasql/base/status.h" @@ -122,6 +124,92 @@ SimpleCatalog *ConstructCatalog(const google::protobuf::DescriptorPool *pool, return catalog; } +absl::Status check(const std::string &sql, const ASTStatement *statement, + std::vector *temp_function_names, + std::vector *temp_table_names, + const AnalyzerOptions &options, SimpleCatalog *catalog) { + std::unique_ptr output; + + if (statement->node_kind() == AST_BEGIN_END_BLOCK) { + const ASTBeginEndBlock *stmt = statement->GetAs(); + for (const auto &body : stmt->statement_list_node()->statement_list()) { + ZETASQL_RETURN_IF_ERROR(check(sql, body, temp_function_names, + temp_table_names, options, catalog)); + } + if (stmt->handler_list() == nullptr) { + return absl::OkStatus(); + } + for (const ASTExceptionHandler *handler : + stmt->handler_list()->exception_handler_list()) { + auto exception_handlers = handler->statement_list()->statement_list(); + for (const auto &handler : exception_handlers) { + ZETASQL_RETURN_IF_ERROR(check(sql, handler, temp_function_names, + temp_table_names, options, catalog)); + } + } + return absl::OkStatus(); + } + ZETASQL_RETURN_IF_ERROR(AnalyzeStatementFromParserAST( + *statement, options, sql, catalog, catalog->type_factory(), &output)); + auto resolved_statement = output->resolved_statement(); + switch (resolved_statement->node_kind()) { + case RESOLVED_CREATE_TABLE_STMT: + case RESOLVED_CREATE_TABLE_AS_SELECT_STMT: { + auto *create_table_stmt = + resolved_statement->GetAs(); + std::cout << "DDL analyzed, adding table to catalog..." << std::endl; + std::string table_name = absl::StrJoin(create_table_stmt->name_path(), "."); + std::unique_ptr table( + new zetasql::SimpleTable(table_name)); + for (const auto &column_definition : + create_table_stmt->column_definition_list()) { + std::unique_ptr column(new SimpleColumn( + table_name, column_definition->column().name_id().ToString(), + catalog->type_factory()->MakeSimpleType( + column_definition->column().type()->kind()))); + ZETASQL_RETURN_IF_ERROR(table->AddColumn(column.release(), false)); + } + catalog->AddOwnedTable(table.release()); + if (create_table_stmt->create_scope() == + ResolvedCreateStatement::CREATE_TEMP) { + temp_table_names->push_back(table_name); + } + break; + } + case RESOLVED_CREATE_FUNCTION_STMT: { + auto *create_function_stmt = + resolved_statement->GetAs(); + std::cout + << "Create Function Statement analyzed, adding function to catalog..." + << std::endl; + std::string function_name = + absl::StrJoin(create_function_stmt->name_path(), "."); + Function *function = new Function(function_name, "group", Function::SCALAR); + function->AddSignature(create_function_stmt->signature()); + catalog->AddOwnedFunction(function); + if (create_function_stmt->create_scope() == + ResolvedCreateStatement::CREATE_TEMP) { + temp_function_names->push_back(function_name); + } + break; + } + case RESOLVED_DROP_STMT: { + auto *drop_stmt = resolved_statement->GetAs(); + std::cout << "Drop Statement analyzed, dropping table from catalog..." + << std::endl; + std::string table_name = absl::StrJoin(drop_stmt->name_path(), "."); + if (drop_stmt->is_if_exists()) { + zetasql::dropOwnedTableIfExists(catalog, table_name); + } else { + zetasql::dropOwnedTable(catalog, table_name); + } + break; + } + } + + return absl::OkStatus(); +} + // Runs the tool. absl::Status Run(const std::string &sql_file_path, const AnalyzerOptions &options, SimpleCatalog *catalog) { @@ -130,76 +218,98 @@ absl::Status Run(const std::string &sql_file_path, std::ifstream file(file_path, std::ios::in); std::string sql(std::istreambuf_iterator(file), {}); - TypeFactory factory; - ParseResumeLocation location = - ParseResumeLocation::FromStringView(sql_file_path, sql); - bool at_end_of_input = false; - std::unique_ptr output; - std::vector temp_function_names; std::vector temp_table_names; - while (!at_end_of_input) { - ZETASQL_RETURN_IF_ERROR(AnalyzeNextStatement( - &location, options, catalog, &factory, &output, &at_end_of_input)); - auto resolved_statement = output->resolved_statement(); - switch (resolved_statement->node_kind()) { - case RESOLVED_CREATE_TABLE_STMT: - case RESOLVED_CREATE_TABLE_AS_SELECT_STMT: { - auto *create_table_stmt = - resolved_statement->GetAs(); - std::cout << "DDL analyzed, adding table to catalog..." << std::endl; - std::string table_name = - absl::StrJoin(create_table_stmt->name_path(), "."); - std::unique_ptr table( - new zetasql::SimpleTable(table_name)); - for (const auto &column_definition : - create_table_stmt->column_definition_list()) { - std::unique_ptr column(new SimpleColumn( - table_name, column_definition->column().name_id().ToString(), - catalog->type_factory()->MakeSimpleType( - column_definition->column().type()->kind()))); - ZETASQL_RETURN_IF_ERROR(table->AddColumn(column.release(), false)); - } - catalog->AddOwnedTable(table.release()); - if (create_table_stmt->create_scope() == - ResolvedCreateStatement::CREATE_TEMP) { - temp_table_names.push_back(table_name); - } - break; - } - case RESOLVED_CREATE_FUNCTION_STMT: { - auto *create_function_stmt = - resolved_statement->GetAs(); - std::cout - << "Create Function Statement analyzed, adding function to catalog..." - << std::endl; - std::string function_name = - absl::StrJoin(create_function_stmt->name_path(), "."); - Function *function = - new Function(function_name, "group", Function::SCALAR); - function->AddSignature(create_function_stmt->signature()); - catalog->AddOwnedFunction(function); - if (create_function_stmt->create_scope() == - ResolvedCreateStatement::CREATE_TEMP) { - temp_function_names.push_back(function_name); - } - break; - } - case RESOLVED_DROP_STMT: { - auto *drop_stmt = resolved_statement->GetAs(); - std::cout << "Drop Statement analyzed, dropping table from catalog..." - << std::endl; - std::string table_name = absl::StrJoin(drop_stmt->name_path(), "."); - if (drop_stmt->is_if_exists()) { - zetasql::dropOwnedTableIfExists(catalog, table_name); - } else { - zetasql::dropOwnedTable(catalog, table_name); - } - break; - } - } + std::unique_ptr parser_output; + ZETASQL_RETURN_IF_ERROR(alphasql::ParseScript(sql, options.GetParserOptions(), + options.error_message_mode(), + &parser_output, file_path)); + + auto statements = + parser_output->script()->statement_list_node()->statement_list(); + for (const ASTStatement *statement : statements) { + ZETASQL_RETURN_IF_ERROR(check(sql, statement, &temp_function_names, + &temp_table_names, options, catalog)); } + /* for (const ASTStatement *statement : statements) { */ + /* if (statement->node_kind() == AST_BEGIN_END_BLOCK) { */ + /* const ASTBeginEndBlock *stmt = statement->GetAs(); */ + /* auto body = stmt->statement_list_node()->statement_list(); */ + /* statements.insert(statements.end(), body.begin(), body.end()); */ + /* for (const ASTExceptionHandler *handler : */ + /* stmt->handler_list()->exception_handler_list()) { */ + /* auto exception_handlers = + * handler->statement_list()->statement_list(); */ + /* statements.insert(statements.end(), exception_handlers.begin(), + * exception_handlers.end()); */ + /* } */ + /* continue; */ + /* } */ + /* ZETASQL_RETURN_IF_ERROR(AnalyzeStatementFromParserAST( */ + /* *statement, options, sql, catalog, &factory, &output)); */ + /* auto resolved_statement = output->resolved_statement(); */ + /* switch (resolved_statement->node_kind()) { */ + /* case RESOLVED_CREATE_TABLE_STMT: */ + /* case RESOLVED_CREATE_TABLE_AS_SELECT_STMT: { */ + /* auto *create_table_stmt = */ + /* resolved_statement->GetAs(); */ + /* std::cout << "DDL analyzed, adding table to catalog..." << std::endl; + */ + /* std::string table_name = */ + /* absl::StrJoin(create_table_stmt->name_path(), "."); */ + /* std::unique_ptr table( */ + /* new zetasql::SimpleTable(table_name)); */ + /* for (const auto &column_definition : */ + /* create_table_stmt->column_definition_list()) { */ + /* std::unique_ptr column(new SimpleColumn( */ + /* table_name, column_definition->column().name_id().ToString(), */ + /* catalog->type_factory()->MakeSimpleType( */ + /* column_definition->column().type()->kind()))); */ + /* ZETASQL_RETURN_IF_ERROR(table->AddColumn(column.release(), false)); + */ + /* } */ + /* catalog->AddOwnedTable(table.release()); */ + /* if (create_table_stmt->create_scope() == */ + /* ResolvedCreateStatement::CREATE_TEMP) { */ + /* temp_table_names.push_back(table_name); */ + /* } */ + /* break; */ + /* } */ + /* case RESOLVED_CREATE_FUNCTION_STMT: { */ + /* auto *create_function_stmt = */ + /* resolved_statement->GetAs(); */ + /* std::cout */ + /* << "Create Function Statement analyzed, adding function to + * catalog..." */ + /* << std::endl; */ + /* std::string function_name = */ + /* absl::StrJoin(create_function_stmt->name_path(), "."); */ + /* Function *function = */ + /* new Function(function_name, "group", Function::SCALAR); */ + /* function->AddSignature(create_function_stmt->signature()); */ + /* catalog->AddOwnedFunction(function); */ + /* if (create_function_stmt->create_scope() == */ + /* ResolvedCreateStatement::CREATE_TEMP) { */ + /* temp_function_names.push_back(function_name); */ + /* } */ + /* break; */ + /* } */ + /* case RESOLVED_DROP_STMT: { */ + /* auto *drop_stmt = resolved_statement->GetAs(); */ + /* std::cout << "Drop Statement analyzed, dropping table from catalog..." + */ + /* << std::endl; */ + /* std::string table_name = absl::StrJoin(drop_stmt->name_path(), "."); */ + /* if (drop_stmt->is_if_exists()) { */ + /* zetasql::dropOwnedTableIfExists(catalog, table_name); */ + /* } else { */ + /* zetasql::dropOwnedTable(catalog, table_name); */ + /* } */ + /* break; */ + /* } */ + /* } */ + /* } */ for (const auto &table_name : temp_table_names) { std::cout << "Removing temporary table " << table_name << std::endl; @@ -279,10 +389,12 @@ int main(int argc, char *argv[]) { std::cout << "ERROR: not a file " << sql_file_path << std::endl; return 1; } - const absl::Status status = alphasql::Run(sql_file_path, options, catalog); + absl::Status status = alphasql::Run(sql_file_path, options, catalog); if (status.ok()) { std::cout << "SUCCESS: analysis finished!" << std::endl; } else { + status = zetasql::UpdateErrorLocationPayloadWithFilenameIfNotPresent( + status, sql_file_path); std::cout << "ERROR: " << status << std::endl; std::cout << "catalog:" << std::endl; for (const std::string &table_name : catalog->table_names()) { diff --git a/alphasql/common_lib.h b/alphasql/common_lib.h new file mode 100644 index 00000000..e5525466 --- /dev/null +++ b/alphasql/common_lib.h @@ -0,0 +1,61 @@ +// +// Copyright 2020 Matts966 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +#include "zetasql/parser/bison_parser.h" +#include "zetasql/parser/bison_parser_mode.h" +#include "zetasql/parser/parse_tree.h" +#include "zetasql/parser/parser.h" + +namespace alphasql { + +using namespace zetasql; +using namespace zetasql::parser; +using zetasql::parser::BisonParser; +using zetasql::parser::BisonParserMode; + +absl::Status ParseScript(absl::string_view script_string, + const ParserOptions &parser_options_in, + ErrorMessageMode error_message_mode, + std::unique_ptr *output, + const std::string &filename) { + ParserOptions parser_options = parser_options_in; + parser_options.CreateDefaultArenasIfNotSet(); + + BisonParser parser; + std::unique_ptr ast_node; + std::vector> other_allocated_ast_nodes; + absl::Status status = parser.Parse( + BisonParserMode::kScript, filename, script_string, + /*start_byte_offset=*/0, parser_options.id_string_pool().get(), + parser_options.arena().get(), parser_options.language_options(), + &ast_node, &other_allocated_ast_nodes, + /*ast_statement_properties=*/nullptr, + /*statement_end_byte_offset=*/nullptr); + + std::unique_ptr script; + if (status.ok()) { + ZETASQL_RET_CHECK_EQ(ast_node->node_kind(), AST_SCRIPT); + script = absl::WrapUnique(ast_node.release()->GetAsOrDie()); + } + ZETASQL_RETURN_IF_ERROR(ConvertInternalErrorLocationAndAdjustErrorString( + error_message_mode, script_string, status)); + *output = absl::make_unique( + parser_options.id_string_pool(), parser_options.arena(), + std::move(other_allocated_ast_nodes), std::move(script)); + return absl::OkStatus(); +} + +} // namespace alphasql diff --git a/alphasql/identifier_resolver.cc b/alphasql/identifier_resolver.cc index e6c29579..a7eb99a6 100644 --- a/alphasql/identifier_resolver.cc +++ b/alphasql/identifier_resolver.cc @@ -73,16 +73,12 @@ GetIdentifierInformation(const std::string &sql_file_path) { std::ifstream file(file_path, std::ios::in); std::string sql(std::istreambuf_iterator(file), {}); - ZETASQL_RETURN_IF_ERROR(ParseScript(sql, options.GetParserOptions(), - options.error_message_mode(), - &parser_output)); + ZETASQL_RETURN_IF_ERROR(alphasql::ParseScript(sql, options.GetParserOptions(), + options.error_message_mode(), + &parser_output, file_path)); + IdentifierResolver resolver = IdentifierResolver(); parser_output->script()->Accept(&resolver, nullptr); - // TODO: The below function call is not OK compared to GetTables, but more - // performant. Try to fix bugs and use FindTableNamesInScript. - // ZETASQL_RETURN_IF_ERROR(alphasql::table_name_resolver::FindTableNamesInScript(sql, - // *parser_output->script(), options, - // &resolver.identifier_information.table_information.referenced)); table_name_resolver::GetTables( sql_file_path, options, &resolver.identifier_information.table_information.referenced); diff --git a/alphasql/table_name_resolver.h b/alphasql/table_name_resolver.h index 3f6d4c08..112b4d81 100644 --- a/alphasql/table_name_resolver.h +++ b/alphasql/table_name_resolver.h @@ -25,6 +25,8 @@ #include "zetasql/resolved_ast/resolved_ast.h" #include "zetasql/resolved_ast/resolved_node_kind.pb.h" +#include "alphasql/common_lib.h" + // TODO This implementation probably doesn't cover all edge cases for // table name extraction. It should be tested more and tuned for the final // name scoping rules once those are implemented in the full resolver. @@ -654,6 +656,26 @@ absl::Status TableNameResolver::FindInStatement(const ASTStatement *statement) { return FindInExpressionsUnder(stmt->sql(), /*visible_aliases=*/{}); } break; + + // Diffs + case AST_BEGIN_END_BLOCK: { + const ASTBeginEndBlock *stmt = statement->GetAs(); + for (const ASTStatement *statement : + stmt->statement_list_node()->statement_list()) { + ZETASQL_RETURN_IF_ERROR(FindInStatement(statement)); + } + if (stmt->handler_list() != nullptr) { + for (const ASTExceptionHandler *handler : + stmt->handler_list()->exception_handler_list()) { + for (const ASTStatement *statement : + handler->statement_list()->statement_list()) { + ZETASQL_RETURN_IF_ERROR(FindInStatement(statement)); + } + } + } + return absl::OkStatus(); + } + default: break; } @@ -855,8 +877,8 @@ absl::Status TableNameResolver::FindInQuery(const ASTQuery *query, absl::AsciiStrToLower(with_entry->alias()->GetAsString()); } } else { - // In WITH without RECURSIVE, entries can only access with aliases defined - // in prior entries. + // In WITH without RECURSIVE, entries can only access with aliases + // defined in prior entries. for (const ASTWithClauseEntry *with_entry : query->with_clause()->with()) { ZETASQL_RETURN_IF_ERROR( @@ -1001,12 +1023,12 @@ absl::Status TableNameResolver::FindInTVF(const ASTTVF *tvf, const AliasSet &external_visible_aliases, AliasSet *local_visible_aliases) { - // The 'tvf' here is the TVF parse node. Each TVF argument may be a scalar, a - // relation, or a TABLE clause. We've parsed all of the TVF arguments as - // expressions by this point, so the FindInExpressionsUnder call will descend - // into the relation arguments as expression subqueries. For TABLE clause - // arguments, we add each named table to the set of referenced table names in - // a separate step. + // The 'tvf' here is the TVF parse node. Each TVF argument may be a scalar, + // a relation, or a TABLE clause. We've parsed all of the TVF arguments as + // expressions by this point, so the FindInExpressionsUnder call will + // descend into the relation arguments as expression subqueries. For TABLE + // clause arguments, we add each named table to the set of referenced table + // names in a separate step. // // Note about correlation: if a TVF argument is a scalar, it should resolve // like a correlated subquery and be able to see 'local_visible_aliases'. On @@ -1078,9 +1100,9 @@ absl::Status TableNameResolver::FindInTablePathExpression( std::vector path = path_expr->ToIdentifierVector(); ZETASQL_RET_CHECK(!path.empty()); - // Single identifiers are always table names, not range variable references, - // but could be WITH table references or references to TVF arguments that - // should be ignored. + // Single identifiers are always table names, not range variable + // references, but could be WITH table references or references to TVF + // arguments that should be ignored. // // For paths, check if the first identifier is a known alias. This allows // us to ignore correlated alias references like: @@ -1192,33 +1214,19 @@ absl::Status GetTables(const std::string &sql_file_path, const AnalyzerOptions &analyzer_options, TableNamesSet *table_names) { std::unique_ptr parser_output; - std::filesystem::path file_path(sql_file_path); std::ifstream file(file_path, std::ios::in); std::string sql(std::istreambuf_iterator(file), {}); - - ParseResumeLocation location = - ParseResumeLocation::FromStringView(sql_file_path, sql); - bool at_end_of_input = false; + ZETASQL_RETURN_IF_ERROR(alphasql::ParseScript( + sql, analyzer_options.GetParserOptions(), + analyzer_options.error_message_mode(), &parser_output, file_path)); auto resolver = alphasql::table_name_resolver::TableNameResolver( sql, &analyzer_options, nullptr, nullptr, table_names, nullptr); - while (!at_end_of_input) { - auto status = - ParseNextStatement(&location, analyzer_options.GetParserOptions(), - &parser_output, &at_end_of_input); - - if (parser_output == nullptr) { - return ConvertInternalErrorLocationAndAdjustErrorString( - analyzer_options.error_message_mode(), sql, status); - } - - status = resolver.FindInStatement(parser_output->statement()); - if (!status.ok()) { - return ConvertInternalErrorLocationAndAdjustErrorString( - analyzer_options.error_message_mode(), sql, status); - } + auto statements = parser_output->script()->statement_list_node(); + for (const ASTStatement *statement : statements->statement_list()) { + ZETASQL_RETURN_IF_ERROR(resolver.FindInStatement(statement)); } return absl::OkStatus(); diff --git a/samples/scripting/alphacheck_stderr.txt b/samples/scripting/alphacheck_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/alphacheck_stdout.txt b/samples/scripting/alphacheck_stdout.txt new file mode 100644 index 00000000..8010f56c --- /dev/null +++ b/samples/scripting/alphacheck_stdout.txt @@ -0,0 +1,10 @@ +Analyzing "samples/scripting/script.sql" +DDL analyzed, adding table to catalog... +DDL analyzed, adding table to catalog... +ERROR: INVALID_ARGUMENT: Procedure not found: create_datawarehouse3 [at samples/scripting/script.sql:12:8] +catalog: + tablename2 + tablename1 + dataset.main + datawarehouse2 + datawarehouse1 diff --git a/samples/scripting/alphadag_stderr.txt b/samples/scripting/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/alphadag_stdout.txt b/samples/scripting/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/dag.dot b/samples/scripting/dag.dot new file mode 100644 index 00000000..8e7387c4 --- /dev/null +++ b/samples/scripting/dag.dot @@ -0,0 +1,6 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +2->0 ; +} diff --git a/samples/scripting/dag.png b/samples/scripting/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..c332d479efa6375319dcc56923050737e8aa7a28 GIT binary patch literal 19716 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 AaR2}S literal 0 HcmV?d00001 diff --git a/samples/scripting/external_tables.txt b/samples/scripting/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp diff --git a/samples/scripting/mart.sql b/samples/scripting/mart.sql new file mode 100644 index 00000000..d6663e88 --- /dev/null +++ b/samples/scripting/mart.sql @@ -0,0 +1,19 @@ +BEGIN TRANSACTION; + +CREATE TEMP TABLE tmp AS +SELECT * FROM datawarehouse1 +UNION ALL +SELECT * FROM datawarehouse2 +UNION ALL +SELECT * FROM datawarehouse3; + +DROP TABLE IF EXISTS `datawarehouse1`; +DROP TABLE IF EXISTS `datawarehouse2`; +DROP TABLE IF EXISTS `datawarehouse1`; + +CREATE OR REPLACE TABLE mart AS +SELECT * FROM tmp; + +DROP TABLE tmp; + +COMMIT TRANSACTION; diff --git a/samples/scripting/procedure.sql b/samples/scripting/procedure.sql new file mode 100644 index 00000000..db969e59 --- /dev/null +++ b/samples/scripting/procedure.sql @@ -0,0 +1,8 @@ +CREATE OR REPLACE PROCEDURE create_datawarehouse3() +BEGIN + CREATE OR REPLACE TABLE datawarehouse3 AS + SELECT + x + FROM + dataset.main; +END diff --git a/samples/scripting/script.sql b/samples/scripting/script.sql new file mode 100644 index 00000000..8ed2f8b3 --- /dev/null +++ b/samples/scripting/script.sql @@ -0,0 +1,13 @@ +BEGIN + CREATE OR REPLACE TABLE datawarehouse2 AS + SELECT + column1 AS x + FROM + tablename1; + CREATE OR REPLACE TABLE datawarehouse1 AS + SELECT + column2 AS x + FROM + tablename2; + CALL create_datawarehouse3(); +END diff --git a/samples/scripting/side_effect_first/alphadag_stderr.txt b/samples/scripting/side_effect_first/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/side_effect_first/alphadag_stdout.txt b/samples/scripting/side_effect_first/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/side_effect_first/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/side_effect_first/dag.dot b/samples/scripting/side_effect_first/dag.dot new file mode 100644 index 00000000..8e7387c4 --- /dev/null +++ b/samples/scripting/side_effect_first/dag.dot @@ -0,0 +1,6 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +2->0 ; +} diff --git a/samples/scripting/side_effect_first/dag.png b/samples/scripting/side_effect_first/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..c332d479efa6375319dcc56923050737e8aa7a28 GIT binary patch literal 19716 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 AaR2}S literal 0 HcmV?d00001 diff --git a/samples/scripting/side_effect_first/external_tables.txt b/samples/scripting/side_effect_first/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/side_effect_first/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp diff --git a/samples/scripting/side_effect_first_with_tables/alphadag_stderr.txt b/samples/scripting/side_effect_first_with_tables/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/side_effect_first_with_tables/alphadag_stdout.txt b/samples/scripting/side_effect_first_with_tables/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/side_effect_first_with_tables/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/side_effect_first_with_tables/dag.dot b/samples/scripting/side_effect_first_with_tables/dag.dot new file mode 100644 index 00000000..4be4249b --- /dev/null +++ b/samples/scripting/side_effect_first_with_tables/dag.dot @@ -0,0 +1,21 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +3 [label=datawarehouse1, shape=box, type=table]; +4 [label=datawarehouse2, shape=box, type=table]; +5 [label=datawarehouse3, shape=box, type=table]; +6 [label=mart, shape=box, type=table]; +7 [label=tablename1, shape=box, type=table]; +8 [label=tablename2, shape=box, type=table]; +9 [label=tmp, shape=box, type=table]; +0->6 ; +1->5 ; +2->3 ; +2->4 ; +3->0 ; +4->0 ; +7->2 ; +8->2 ; +9->0 ; +} diff --git a/samples/scripting/side_effect_first_with_tables/dag.png b/samples/scripting/side_effect_first_with_tables/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c027487d1d18e69b59043f4919ff2b58669554 GIT binary patch literal 40235 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 @mFdq*MR`MZrz(V)Vq&F)?zs%+(y+G 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

aq`dmE;dz2Tqrv6e3c6{BFVIO)w(=t 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 literal 0 HcmV?d00001 diff --git a/samples/scripting/side_effect_first_with_tables/external_tables.txt b/samples/scripting/side_effect_first_with_tables/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/side_effect_first_with_tables/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp diff --git a/samples/scripting/with_all/alphadag_stderr.txt b/samples/scripting/with_all/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/with_all/alphadag_stdout.txt b/samples/scripting/with_all/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/with_all/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/with_all/dag.dot b/samples/scripting/with_all/dag.dot new file mode 100644 index 00000000..4be4249b --- /dev/null +++ b/samples/scripting/with_all/dag.dot @@ -0,0 +1,21 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +3 [label=datawarehouse1, shape=box, type=table]; +4 [label=datawarehouse2, shape=box, type=table]; +5 [label=datawarehouse3, shape=box, type=table]; +6 [label=mart, shape=box, type=table]; +7 [label=tablename1, shape=box, type=table]; +8 [label=tablename2, shape=box, type=table]; +9 [label=tmp, shape=box, type=table]; +0->6 ; +1->5 ; +2->3 ; +2->4 ; +3->0 ; +4->0 ; +7->2 ; +8->2 ; +9->0 ; +} diff --git a/samples/scripting/with_all/dag.png b/samples/scripting/with_all/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c027487d1d18e69b59043f4919ff2b58669554 GIT binary patch literal 40235 zcmagG2{@N)`!)O{nahw&iAX}3r!tly5;7-aXfPxxBr=7NDM^V`GGrdg6q%!e%1p>y ziA;q=_}0Dm{=e^ceDCod-+rEBKTrDk-Pe5$=ef?c)_H~N>uGMG<)kH%NL!9-sT-0= z8Sc)W3LB4K3}n9=~+>k`&i%J zfBi8_Q2_bP%*TRv&2IPBaz<^A5@<4W&EDgE`MsP(#(g{Q^Dj7c?e^E1?dH^o>Sfl5 zl-@4BP+cqPVf$!^XWdhDUuEI0X2XZSryA)J4oa;)cz*8eqvT6R)YU1P*zF@Fx*uA} zNV-!*O5jf|a|eV@|MUMIut@&%w};M8kcvOm_}8SUo!TPpKB4bEGjLLD>g#&z%EWUO z@ouy2+qVmfh-@Yqo0>jJOQRq?))(A$ues~pyVH`!CMI2#AL{E>CoWyBzJH%%zlg|` z$T>$x8YwBM5&u{%ig0zlzpk#XVt++qwRSOwPg?D@uV5_c+@V_@SEjtWG~Lj0UuyB$ zg&Bst80FPX&O5@WLqb9XMMZB|iiYY41mWNKuWHI60|Tb)oE!r)v#{)J;Wwux@7%kW znwv|%XV0F@++1}xHwpYLZ@jjFl~vT}s2%Ch$&(!Knw!ZEnPucXfBrluwk>E|Kxt{I zxUB4rq9Td&E-toCPPF^>?K3kos~s5N>hA6qmyifdPTu*-PU6RpAE)f>$eo>?6Oxh| z>g&l(O-;q6q=MA>0`u}ja`W<=Z#VVa`Tn+x)hCT{m?6G9?ci-$yav_Yd6!43 zDFMd98ix-D_PJ&m-^740Vis0b+VF=u0%{oS&6_uaH%v6Y7sqPxV@RybY&&-B7;#9N zbVy7}+VRS+$o%A?waf>?yyUz1l}W+DG^EJL$lx<3PNFB+OrDtVSj8x6ryG`Rn9xX& z1mm??wr?j}wlU0eJlNHCtm|3!?zHsu^vul6LubzlWM^mVo0(Ck8)n`0>QPM0j;gAv zGQaKM>`WJ~{zUfuhYwqs!zq@QmI}+tLW6=fadB~-a&;~69FHsE5|Jl%N`^ls`OSw9 zM?5`cFI~PI8y6QeFfd^L*7`lg+=x+LZIF7);2<~Vwy>y(iJ3}4L81J`i>y6cv&ZW` ze9#lLxm;m3u%!I({Q2|l!Y6($6!OO3z5C?lOG~X8XMyED=Jf{;xcK+%IV=#Dl9@>? z{w?kF61{>5bw1w1#(N?eHass~x*iv|&C=2`xJFk;hrW|@TCKl-68k!(yqw+9(eX`7 zi}A6gXV0G9N=k|t7_dBj<_z!Ny-&LhcrmH&lbuJWH}$`M{qzHan~#rAa&&f4x0;7~ zcU|2`Y>x@{)Aj4*QJQz1^&+C8La=Cle#&@D0|SGU(uZ4j%0IS$9ewfACDqr_J4b%} z*v}vN;lqcC-lE-@g5k+YS|g(l&FIRik+fS9P39a}>&Qs@(`V1}2?-rtwpdhM7z`!PK|GC6tka1bTU+Xp#0IpQBbf3`Z1{?5z@yWo}<|J>Z1L+hn8XU<>- zR5$#VXP1|~9w_;+8fLM4`t(U(IKKW_wsOJbP=0V`jp^;JS{rlmaoyNqMD=F>F%E~JDoaV&OyP_j4 zPM%CTc29JoJ8wtDm09blr|A#gxr!1Y#Y`#(J5N=Wd}iQ9>fMDsd-sk#@?U4tyN`cp zc=UW%mm0_4#*KXaN_pkV6+E>5{d?V~JGj`L8FX}Yi66_!mB}}6Cr*nU_OGF#;jIS` zBKyl+$0piRwT>TWi$0JYeW6>2MM+U{cx)_4)T)B|ici^g;@JrgwbBi-n|K8TD2s}U z>W64(XfpHjDd&b+?uCX@DJm+8yYxwqxH2#>xKHY;6#K@#SwHCO%inUGwz~85$fM%=7H!)}!UH|H1V3 zw4}PG=5AqO+P1c~u!sn?Yu6NMX=zD{S z*x5v4sQmo9aQrb!EiJ9u6t&Q~w|gHw&d#Pia^%QFU&+3gRaGNXQxWTHs|`a#Jb0+c zdj87YojdI#OT@7!%CG(sc=F^)@S|6+)UgQ;95_&mkFBq-JH6#m`4m!A+JKXJ`0!zB zT3W*->yszL@wr!xjl8_PWb^a$VPRpl_iX&a-@Vf&qTt7m$9pxGS63T8eq>-}Wu?qM z>hjN&vLgI1PZiWKa&Ux4u!)VXEKa?7^M*t!udJkd`)E?@P*1+q7A^_<7JaN=Th0lw zg~_gCE)|H`Iy#Yk_uf|d{COlJ=(-`M;oBA~R7Qy>7_3}a&-@LmwCZ)iX+8kwGs z8Xi9N^4A9ic6oQfn5oz7&Yl7S0_>8fsc+D8TsO%v4Gd%C;fZO45WgjMqTQS>@-L68q~R3s}VC @mFdq*MR`MZrz(V)Vq&F)?zs%+(y+G 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

aq`dmE;dz2Tqrv6e3c6{BFVIO)w(=t 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 literal 0 HcmV?d00001 diff --git a/samples/scripting/with_all/external_tables.txt b/samples/scripting/with_all/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/with_all/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp diff --git a/samples/scripting/with_functions/alphadag_stderr.txt b/samples/scripting/with_functions/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/with_functions/alphadag_stdout.txt b/samples/scripting/with_functions/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/with_functions/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/with_functions/dag.dot b/samples/scripting/with_functions/dag.dot new file mode 100644 index 00000000..8e7387c4 --- /dev/null +++ b/samples/scripting/with_functions/dag.dot @@ -0,0 +1,6 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +2->0 ; +} diff --git a/samples/scripting/with_functions/dag.png b/samples/scripting/with_functions/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..c332d479efa6375319dcc56923050737e8aa7a28 GIT binary patch literal 19716 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 AaR2}S literal 0 HcmV?d00001 diff --git a/samples/scripting/with_functions/external_tables.txt b/samples/scripting/with_functions/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/with_functions/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp diff --git a/samples/scripting/with_tables/alphadag_stderr.txt b/samples/scripting/with_tables/alphadag_stderr.txt new file mode 100644 index 00000000..e69de29b diff --git a/samples/scripting/with_tables/alphadag_stdout.txt b/samples/scripting/with_tables/alphadag_stdout.txt new file mode 100644 index 00000000..bfb3dbaa --- /dev/null +++ b/samples/scripting/with_tables/alphadag_stdout.txt @@ -0,0 +1,5 @@ +Reading paths passed as a command line arguments... +Only files that end with .sql or .bq are analyzed. +Reading "samples/scripting/procedure.sql" +Reading "samples/scripting/script.sql" +Reading "samples/scripting/mart.sql" diff --git a/samples/scripting/with_tables/dag.dot b/samples/scripting/with_tables/dag.dot new file mode 100644 index 00000000..4be4249b --- /dev/null +++ b/samples/scripting/with_tables/dag.dot @@ -0,0 +1,21 @@ +digraph G { +0 [label="samples/scripting/mart.sql", shape="", type=query]; +1 [label="samples/scripting/procedure.sql", shape="", type=query]; +2 [label="samples/scripting/script.sql", shape="", type=query]; +3 [label=datawarehouse1, shape=box, type=table]; +4 [label=datawarehouse2, shape=box, type=table]; +5 [label=datawarehouse3, shape=box, type=table]; +6 [label=mart, shape=box, type=table]; +7 [label=tablename1, shape=box, type=table]; +8 [label=tablename2, shape=box, type=table]; +9 [label=tmp, shape=box, type=table]; +0->6 ; +1->5 ; +2->3 ; +2->4 ; +3->0 ; +4->0 ; +7->2 ; +8->2 ; +9->0 ; +} diff --git a/samples/scripting/with_tables/dag.png b/samples/scripting/with_tables/dag.png new file mode 100644 index 0000000000000000000000000000000000000000..d0c027487d1d18e69b59043f4919ff2b58669554 GIT binary patch literal 40235 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 @mFdq*MR`MZrz(V)Vq&F)?zs%+(y+G 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

aq`dmE;dz2Tqrv6e3c6{BFVIO)w(=t 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 literal 0 HcmV?d00001 diff --git a/samples/scripting/with_tables/external_tables.txt b/samples/scripting/with_tables/external_tables.txt new file mode 100644 index 00000000..d6551a6a --- /dev/null +++ b/samples/scripting/with_tables/external_tables.txt @@ -0,0 +1,3 @@ +tablename1 +tablename2 +tmp