mirror of
https://github.com/apache/superset.git
synced 2026-04-15 14:15:15 +00:00
* Download RAT binary via HTTPS, not HTTP * Merge branch 'patch-1' of github.com:hajdbo/incubator-superset into patch-1
76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
#!/usr/bin/env python
|
|
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you 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.
|
|
# pylint: disable=C,R,W
|
|
#
|
|
# Copyright (C) 2016 Andi Albrecht, albrecht.andi@gmail.com
|
|
#
|
|
# This example is part of python-sqlparse and is released under
|
|
# the BSD License: http://www.opensource.org/licenses/bsd-license.php
|
|
#
|
|
# This example illustrates how to extract table names from nested
|
|
# SELECT statements.
|
|
#
|
|
# See:
|
|
# https://groups.google.com/forum/#!topic/sqlparse/sL2aAi6dSJU
|
|
import sqlparse
|
|
from sqlparse.sql import Identifier, IdentifierList
|
|
from sqlparse.tokens import DML, Keyword
|
|
|
|
|
|
def is_subselect(parsed):
|
|
if not parsed.is_group():
|
|
return False
|
|
for item in parsed.tokens:
|
|
if item.ttype is DML and item.value.upper() == 'SELECT':
|
|
return True
|
|
return False
|
|
|
|
|
|
def extract_from_part(parsed):
|
|
from_seen = False
|
|
for item in parsed.tokens:
|
|
if from_seen:
|
|
if is_subselect(item):
|
|
for x in extract_from_part(item):
|
|
yield x
|
|
elif item.ttype is Keyword:
|
|
raise StopIteration
|
|
else:
|
|
yield item
|
|
elif item.ttype is Keyword and item.value.upper() == 'FROM':
|
|
from_seen = True
|
|
|
|
|
|
def extract_table_identifiers(token_stream):
|
|
for item in token_stream:
|
|
if isinstance(item, IdentifierList):
|
|
for identifier in item.get_identifiers():
|
|
yield identifier.get_name()
|
|
elif isinstance(item, Identifier):
|
|
yield item.get_name()
|
|
# It's a bug to check for Keyword here, but in the example
|
|
# above some tables names are identified as keywords...
|
|
elif item.ttype is Keyword:
|
|
yield item.value
|
|
|
|
|
|
# TODO(bkyryliuk): add logic to support joins and unions.
|
|
def extract_tables(sql):
|
|
stream = extract_from_part(sqlparse.parse(sql)[0])
|
|
return list(extract_table_identifiers(stream))
|