def test_parse_queries(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: parser.parse(query, tracking=True) except SyntaxError as e: print("Error parsing query:") e.print_file_and_line(e) err +=1 if err: self.fail("Encountered %d errors" % err)
def test_parse_queries(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: parser.parse(query, tracking=True) except SyntaxError as e: print("Error parsing query:") e.print_file_and_line(e) err += 1 if err: self.fail("Encountered %d errors" % err)
def test_error_message(self): try: bad_sql = "select foo(selcet bar from b)" parser.parse(bad_sql) except SyntaxError as e: err_pos = bad_sql.find("bar") self.assertEqual("Syntax error at position %d (bar)" % err_pos, e.msg) try: bad_sql = "select foo\n\n\n(selcet bar from b)" parser.parse(bad_sql) except SyntaxError as e: err_pos = bad_sql.split("\n")[3].find("bar") self.assertEqual("Syntax error at position %d (bar)" % err_pos, e.msg)
def test_error_message(self): try: bad_sql = "select foo(selcet bar from b)" parser.parse(bad_sql) except SyntaxError as e: err_pos = bad_sql.find("bar") self.assertEqual("Syntax error at position %d (bar)" % err_pos, e.msg) try: bad_sql = "select foo\n\n\n(selcet bar from b)" parser.parse(bad_sql) except SyntaxError as e: err_pos = bad_sql.split("\n")[3].find("bar") self.assertEqual("Syntax error at position %d (bar)" % err_pos, e.msg)
def test_format_json(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: tree = parser.parse(query, tracking=True) print(JsonNodeEncoder(indent=4).encode(tree)) except SyntaxError as e: err += 1 if err: self.fail("Encountered %d errors" % err)
def test_format_json(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: tree = parser.parse(query, tracking=True) NodeEncoder(indent=4).encode(tree) except SyntaxError as e: err += 1 if err: self.fail("Encountered %d errors" % err)
def check_has_subquery(query): class SubqueryCheck(DefaultTraversalVisitor): has_subquery = False def visit_subquery_expression(self, node, context): self.has_subquery = True print("Checking query:\n%s" % query) checker = SubqueryCheck() checker.process(parser.parse(query)) has_subquery = "not " if not checker.has_subquery else "" print("...query does %shave a subquery.\n" % has_subquery)
def check_has_subquery(query): class SubqueryCheck(DefaultTraversalVisitor): has_subquery = False def visit_subquery_expression(self, node, context): self.has_subquery = True print("Checking query:\n%s" % query) checker = SubqueryCheck() checker.process(parser.parse(query)) has_subquery = "not " if not checker.has_subquery else "" print("...query does %shave a subquery.\n" % has_subquery)
def test_format_queries(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: tree = parser.parse(query, tracking=True) format_sql(tree, 0) except Exception as e: err += 1 print("\n\n") print(query) print("failed to format:\n" + str(tree)) print(e) print("\n\n") if err: self.fail("Encountered %d errors" % err)
def test_format_queries(self): err = 0 for query in self.queries: if query[:2] == "--": continue try: tree = parser.parse(query, tracking=True) format_sql(tree, 0) except Exception as e: err += 1 print("\n\n") print(query) print("failed to format:\n" + str(tree)) print(e) print("\n\n") if err: self.fail("Encountered %d errors" % err)
def check_extracted_columns(query, with_resolution=False): class TableAndColumnExtractor(DefaultTraversalVisitor): def __init__(self): self.columns = [] self.tables = [] def visit_query_specification(self, node, context): for item in node.select.select_items: if isinstance(item, SingleColumn): self.columns.append(item) if node.from_: self.tables = [] if isinstance(node.from_, Join): relation = node.from_ self.tables.append(relation.right) while isinstance(relation.left, Join): relation = relation.left self.tables.append(relation.right) self.tables.append(relation.left) else: self.tables.append(node.from_) self.tables.reverse() def print_column_resolution_order(columns, tables): table_columns = [] tables_and_aliases = OrderedDict() for i in range(len(columns)): column = columns[i] if isinstance(column.expression, QualifiedNameReference): table_columns.append((column, i)) for table in tables: if isinstance(table, AliasedRelation): if isinstance(table.relation, Table): tables_and_aliases[table.alias] = table.relation else: print("WARNING: Aliased Relation is not a table and is omitted") else: tables_and_aliases[".".join(table.name.parts)] = table print("\nTable Column Resolution:") for (column, position) in table_columns: names = column.expression.name.parts column_name = names[-1] resolution = [] if len(names) > 1: qualified_table_name = ".".join(names[:-1]) if qualified_table_name in tables_and_aliases: resolution.append(tables_and_aliases[qualified_table_name]) else: resolution = [v for v in tables_and_aliases.values()] print(repr(column) + ": " + str(resolution)) print("\n\nChecking query:\n" + query) visitor = TableAndColumnExtractor() visitor.process(parser.parse(query), None) print(visitor.columns) print(visitor.tables) if with_resolution: print_column_resolution_order(visitor.columns, visitor.tables)
def _select(x): return parser.parse("select %s" % x).query_body
def _select(x): return parser.parse("select %s" % x).query_body
def check_extracted_columns(query, with_resolution=False): class TableAndColumnExtractor(DefaultTraversalVisitor): def __init__(self): self.columns = [] self.tables = [] def visit_query_specification(self, node, context): for item in node.select.select_items: if isinstance(item, SingleColumn): self.columns.append(item) if node.from_: self.tables = [] if isinstance(node.from_, Join): relation = node.from_ self.tables.append(relation.right) while isinstance(relation.left, Join): relation = relation.left self.tables.append(relation.right) self.tables.append(relation.left) else: self.tables.append(node.from_) self.tables.reverse() def print_column_resolution_order(columns, tables): table_columns = [] tables_and_aliases = OrderedDict() for i in range(len(columns)): column = columns[i] if isinstance(column.expression, QualifiedNameReference): table_columns.append((column, i)) for table in tables: if isinstance(table, AliasedRelation): if isinstance(table.relation, Table): tables_and_aliases[table.alias] = table.relation else: print( "WARNING: Aliased Relation is not a table and is omitted" ) else: tables_and_aliases[".".join(table.name.parts)] = table print("\nTable Column Resolution:") for (column, position) in table_columns: names = column.expression.name.parts column_name = names[-1] resolution = [] if len(names) > 1: qualified_table_name = ".".join(names[:-1]) if qualified_table_name in tables_and_aliases: resolution.append(tables_and_aliases[qualified_table_name]) else: resolution = [v for v in tables_and_aliases.values()] print(repr(column) + ": " + str(resolution)) print("\n\nChecking query:\n" + query) visitor = TableAndColumnExtractor() visitor.process(parser.parse(query), None) print(visitor.columns) print(visitor.tables) if with_resolution: print_column_resolution_order(visitor.columns, visitor.tables)
def create_select_123(): return parser.parse("select 123").query_body
def assert_statement(expr, expected): assert_parsed(expr, expected, parser.parse(expr))
def assert_statement(expr, expected): assert_parsed(expr, expected, parser.parse(expr))
def create_select_123(): return parser.parse("select 123").query_body