Exemple #1
0
 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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #6
0
 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)
Exemple #7
0
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)
Exemple #8
0
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)
Exemple #10
0
 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)
Exemple #11
0
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
Exemple #13
0
def _select(x):
    return parser.parse("select %s" % x).query_body
Exemple #14
0
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)
Exemple #15
0
def create_select_123():
    return parser.parse("select 123").query_body
Exemple #16
0
def assert_statement(expr, expected):
    assert_parsed(expr, expected, parser.parse(expr))
Exemple #17
0
def assert_statement(expr, expected):
    assert_parsed(expr, expected, parser.parse(expr))
def create_select_123():
    return parser.parse("select 123").query_body