I would like to use Antrl4 in Python to process SQL/PLSQL scripts and extract JOIN conditions.
In order to do I am trying, first, to understand how these are represented in the parser tree returned by PlSqlParser.sql_script
.
I have a simple SQL:
SELECT ta.col1, tb.col5
FROM mytabA ta
JOIN mayTabB tb ON ta.col1 = tb.col2
WHERE ta.col3 = 'AXA';
I use the following Python script to process the SQL script:
from antlr4 import *
from antlr4.tree.Tree import TerminalNodeImpl
#from antlr4.tree.Tree import ParseTree
from antlr4.tree.Trees import Trees
from PlSqlLexer import PlSqlLexer
from PlSqlParser import PlSqlParser
from PlSqlParserListener import PlSqlParserListener
def handleTree(tree, lvl=0):
for child in tree.getChildren():
if isinstance(child, TerminalNode):
print(lvl*'│ ' + '└─', child)
else:
handleTree(child, lvl+1)
class KeyPrinter(PlSqlParserListener):
def enterSelect_statement(self, ctx):
handleTree(ctx, 0)
def main():
with open( "myscript.sql" ) as file:
filesrc = file.read()
lexer = PlSqlLexer(InputStream(filesrc))
tokens = CommonTokenStream(lexer)
tokens.fill()
parser = PlSqlParser(tokens)
tree = parser.sql_script()
printer = KeyPrinter()
walker = ParseTreeWalker()
walker.walk(printer, tree)
if __name__ == '__main__':
main()
And the output is:
│ │ │ │ └─ SELECT
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col1
│ │ │ │ │ └─ ,
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col5
│ │ │ │ │ └─ FROM
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ mytabA
│ │ │ │ │ │ │ │ │ │ │ │ └─ ta
│ │ │ │ │ │ │ │ └─ JOIN
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ mayTabB
│ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
│ │ │ │ │ │ │ │ │ └─ ON
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col1
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ =
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col2
│ │ │ │ │ └─ WHERE
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col3
│ │ │ │ │ │ │ │ │ │ │ │ └─ =
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ 'AXA'
I change the handleTree
function to print the child
, to try and understand what info can be used to extract the information I am after:
def handleTree(tree, lvl=0):
for child in tree.getChildren():
print ( child )
if isinstance(child, TerminalNode):
print(lvl*'│ ' + '└─', child)
else:
handleTree(child, lvl+1)
The output now is:
[16068 15857 2535 2384]
[16066 16068 15857 2535 2384]
[16256 16066 16068 15857 2535 2384]
[16263 16256 16066 16068 15857 2535 2384]
SELECT
│ │ │ │ └─ SELECT
[16284 16263 16256 16066 16068 15857 2535 2384]
[16309 16284 16263 16256 16066 16068 15857 2535 2384]
[16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[19747 19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
[19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[19747 19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16309 16284 16263 16256 16066 16068 15857 2535 2384]
col1
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col1
,
│ │ │ │ │ └─ ,
[16311 16284 16263 16256 16066 16068 15857 2535 2384]
[16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[19747 19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19724 2342 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
tb
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
[19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[19747 19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19733 17669 17555 17472 17409 17350 17339 17318 17280 17264 17255 16326 16311 16284 16263 16256 16066 16068 15857 2535 2384]
col5
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col5
[16288 16263 16256 16066 16068 15857 2535 2384]
FROM
│ │ │ │ │ └─ FROM
[16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16361 16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17152 16361 16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19376 17152 16361 16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20207 19376 17152 16361 16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 20207 19376 17152 16361 16351 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
mytabA
│ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ mytabA
[16358 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19174 16358 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20207 19174 16358 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 20207 19174 16358 16340 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
ta
│ │ │ │ │ │ │ │ │ │ │ │ └─ ta
[16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
JOIN
│ │ │ │ │ │ │ │ └─ JOIN
[16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[16361 16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17152 16361 16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19376 17152 16361 16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20207 19376 17152 16361 16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 20207 19376 17152 16361 16351 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
mayTabB
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ mayTabB
[16358 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19174 16358 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20207 19174 16358 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 20207 19174 16358 16397 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
tb
│ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
[16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
ON
│ │ │ │ │ │ │ │ │ └─ ON
[16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19747 19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
[19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19747 19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
col1
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col1
[17342 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
=
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ =
[17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[2342 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19724 2342 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19747 19724 2342 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19724 2342 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
tb
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ tb
.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
[19733 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[19747 19733 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19733 17669 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 16414 16401 16341 16332 16320 16288 16263 16256 16066 16068 15857 2535 2384]
col2
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col2
[16289 16263 16256 16066 16068 15857 2535 2384]
WHERE
│ │ │ │ │ └─ WHERE
[19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[19747 19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19724 2342 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
ta
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ ta
.
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ .
[19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[19747 19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[20209 19747 19733 17669 17555 17472 17409 17350 17339 2070 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
col3
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ col3
[17342 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
=
│ │ │ │ │ │ │ │ │ │ │ │ └─ =
[17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17409 17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[17667 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
[20185 17667 17555 17472 17409 17350 17339 17343 17318 17280 17264 17255 17217 19182 16289 16263 16256 16066 16068 15857 2535 2384]
'AXA'
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └─ 'AXA'
It seems what I need to do is keep track of the child
array values and identify which one(s) signal a table name, column name, JOIN etc.
Is using Antlr meant to be this complicated?
Is there a way to 'query' the tree structure for particular nodes, and if so what query to get this specific info?
Is there a way to print out the unique node types, such that we can figure out which ones to search for?
Here's a quick demo how you could use a listener in Python to "listen" when the parser enters a tableview_name
parser rule:
import antlr4
from PlSqlLexer import PlSqlLexer
from PlSqlParser import PlSqlParser
from antlr_utils import to_string_tree # from: https://gist.github.com/bkiers/13f72ef15d8353814cc7cbb93e9cc742
from PlSqlParserListener import PlSqlParserListener
class TableViewListener(PlSqlParserListener):
# (part of the) parse tree:
#
# ║ ║ ║ ║ ╚═ tableview_name
# ║ ║ ║ ║ ╚═ identifier
# ║ ║ ║ ║ ╚═ id_expression
# ║ ║ ║ ║ ╚═ regular_id
# ║ ║ ║ ║ ╚═ "mytabA" (REGULAR_ID)
#
# ANTLR parser rule for `tableview_name`:
#
# tableview_name
# : identifier ('.' id_expression)? (
# AT_SIGN link_name
# | partition_extension_clause
# )?
# | xmltable outer_join_sign?
# ;
def enterTableview_name(self, ctx:PlSqlParser.Tableview_nameContext):
print('Found a table:', ctx.getText())
if __name__ == '__main__':
sql = """
SELECT ta.col1, tb.col5
FROM mytabA ta
JOIN mayTabB tb ON ta.col1 = tb.col2
WHERE ta.col3 = 'AXA';
"""
lexer = PlSqlLexer(antlr4.InputStream(sql))
parser = PlSqlParser(antlr4.CommonTokenStream(lexer))
root = parser.sql_script()
print(to_string_tree(root, lexer.symbolicNames))
antlr4.ParseTreeWalker.DEFAULT.walk(TableViewListener(), root)
Running the Python code above will print:
╚═ sql_script
╠═ unit_statement
║ ╚═ data_manipulation_language_statements
║ ╚═ select_statement
║ ╚═ select_only_statement
║ ╚═ subquery
║ ╚═ subquery_basic_elements
║ ╚═ query_block
║ ╠═ "SELECT" (SELECT)
║ ╠═ selected_list
║ ║ ╠═ select_list_elements
║ ║ ║ ╚═ expression
║ ║ ║ ╚═ logical_expression
║ ║ ║ ╚═ unary_logical_expression
║ ║ ║ ╚═ multiset_expression
║ ║ ║ ╚═ relational_expression
║ ║ ║ ╚═ compound_expression
║ ║ ║ ╚═ concatenation
║ ║ ║ ╚═ model_expression
║ ║ ║ ╚═ unary_expression
║ ║ ║ ╚═ atom
║ ║ ║ ╚═ general_element
║ ║ ║ ╠═ general_element
║ ║ ║ ║ ╚═ general_element_part
║ ║ ║ ║ ╚═ id_expression
║ ║ ║ ║ ╚═ regular_id
║ ║ ║ ║ ╚═ "ta" (REGULAR_ID)
║ ║ ║ ╠═ "." (PERIOD)
║ ║ ║ ╚═ general_element_part
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "col1" (REGULAR_ID)
║ ║ ╠═ "," (COMMA)
║ ║ ╚═ select_list_elements
║ ║ ╚═ expression
║ ║ ╚═ logical_expression
║ ║ ╚═ unary_logical_expression
║ ║ ╚═ multiset_expression
║ ║ ╚═ relational_expression
║ ║ ╚═ compound_expression
║ ║ ╚═ concatenation
║ ║ ╚═ model_expression
║ ║ ╚═ unary_expression
║ ║ ╚═ atom
║ ║ ╚═ general_element
║ ║ ╠═ general_element
║ ║ ║ ╚═ general_element_part
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "tb" (REGULAR_ID)
║ ║ ╠═ "." (PERIOD)
║ ║ ╚═ general_element_part
║ ║ ╚═ id_expression
║ ║ ╚═ regular_id
║ ║ ╚═ "col5" (REGULAR_ID)
║ ╠═ from_clause
║ ║ ╠═ "FROM" (FROM)
║ ║ ╚═ table_ref_list
║ ║ ╚═ table_ref
║ ║ ╠═ table_ref_aux
║ ║ ║ ╠═ table_ref_aux_internal_one
║ ║ ║ ║ ╚═ dml_table_expression_clause
║ ║ ║ ║ ╚═ tableview_name
║ ║ ║ ║ ╚═ identifier
║ ║ ║ ║ ╚═ id_expression
║ ║ ║ ║ ╚═ regular_id
║ ║ ║ ║ ╚═ "mytabA" (REGULAR_ID)
║ ║ ║ ╚═ table_alias
║ ║ ║ ╚═ identifier
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "ta" (REGULAR_ID)
║ ║ ╚═ join_clause
║ ║ ╠═ "JOIN" (JOIN)
║ ║ ╠═ table_ref_aux
║ ║ ║ ╠═ table_ref_aux_internal_one
║ ║ ║ ║ ╚═ dml_table_expression_clause
║ ║ ║ ║ ╚═ tableview_name
║ ║ ║ ║ ╚═ identifier
║ ║ ║ ║ ╚═ id_expression
║ ║ ║ ║ ╚═ regular_id
║ ║ ║ ║ ╚═ "mayTabB" (REGULAR_ID)
║ ║ ║ ╚═ table_alias
║ ║ ║ ╚═ identifier
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "tb" (REGULAR_ID)
║ ║ ╚═ join_on_part
║ ║ ╠═ "ON" (ON)
║ ║ ╚═ condition
║ ║ ╚═ expression
║ ║ ╚═ logical_expression
║ ║ ╚═ unary_logical_expression
║ ║ ╚═ multiset_expression
║ ║ ╚═ relational_expression
║ ║ ╠═ relational_expression
║ ║ ║ ╚═ compound_expression
║ ║ ║ ╚═ concatenation
║ ║ ║ ╚═ model_expression
║ ║ ║ ╚═ unary_expression
║ ║ ║ ╚═ atom
║ ║ ║ ╚═ general_element
║ ║ ║ ╠═ general_element
║ ║ ║ ║ ╚═ general_element_part
║ ║ ║ ║ ╚═ id_expression
║ ║ ║ ║ ╚═ regular_id
║ ║ ║ ║ ╚═ "ta" (REGULAR_ID)
║ ║ ║ ╠═ "." (PERIOD)
║ ║ ║ ╚═ general_element_part
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "col1" (REGULAR_ID)
║ ║ ╠═ relational_operator
║ ║ ║ ╚═ "=" (EQUALS_OP)
║ ║ ╚═ relational_expression
║ ║ ╚═ compound_expression
║ ║ ╚═ concatenation
║ ║ ╚═ model_expression
║ ║ ╚═ unary_expression
║ ║ ╚═ atom
║ ║ ╚═ general_element
║ ║ ╠═ general_element
║ ║ ║ ╚═ general_element_part
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "tb" (REGULAR_ID)
║ ║ ╠═ "." (PERIOD)
║ ║ ╚═ general_element_part
║ ║ ╚═ id_expression
║ ║ ╚═ regular_id
║ ║ ╚═ "col2" (REGULAR_ID)
║ ╚═ where_clause
║ ╠═ "WHERE" (WHERE)
║ ╚═ condition
║ ╚═ expression
║ ╚═ logical_expression
║ ╚═ unary_logical_expression
║ ╚═ multiset_expression
║ ╚═ relational_expression
║ ╠═ relational_expression
║ ║ ╚═ compound_expression
║ ║ ╚═ concatenation
║ ║ ╚═ model_expression
║ ║ ╚═ unary_expression
║ ║ ╚═ atom
║ ║ ╚═ general_element
║ ║ ╠═ general_element
║ ║ ║ ╚═ general_element_part
║ ║ ║ ╚═ id_expression
║ ║ ║ ╚═ regular_id
║ ║ ║ ╚═ "ta" (REGULAR_ID)
║ ║ ╠═ "." (PERIOD)
║ ║ ╚═ general_element_part
║ ║ ╚═ id_expression
║ ║ ╚═ regular_id
║ ║ ╚═ "col3" (REGULAR_ID)
║ ╠═ relational_operator
║ ║ ╚═ "=" (EQUALS_OP)
║ ╚═ relational_expression
║ ╚═ compound_expression
║ ╚═ concatenation
║ ╚═ model_expression
║ ╚═ unary_expression
║ ╚═ atom
║ ╚═ constant
║ ╚═ quoted_string
║ ╚═ "'AXA'" (CHAR_STRING)
╠═ ";" (SEMICOLON)
╚═ "<EOF>"
Found a table: mytabA
Found a table: mayTabB
Notice the last 2 lines:
Found a table: mytabA
Found a table: mayTabB