SQL expression parse tree traversal in preorder/inorder/postorder
SQL expression(condition) was often used in where clause to filter which records are returned in the query’s result set. Manipulate expression is a very common task when you process SQL query in your program. This demo illustrate how to iterate expression to list atomic elements in pre-order, in-order and post-order. Here is another example if you want to modify expression.
Expression in where clause of this SQL will be iterated.
SELECT f1 FROM t1
WHERE t1.a = 10.2
AND name = 'k'
OR id IN ( 2, 4, 5 )
SQL expression parse tree traversal in pre-order
OR AND = t1.a 10.2 = name 'k' IN id () , 2 , 4 5
SQL expression parse tree traversal in in-order
t1.a = 10.2 AND name = 'k' OR id IN 2 , 4 , 5 ()
SQL expression parse tree traversal in post-order
t1.a 10.2 = name 'k' = AND id 2 4 5 , , () IN OR
Demo code in C#
using System;
using System.Collections.Generic;
using System.Text;
using gudusoft.gsqlparser;
using gudusoft.gsqlparser.Units;
namespace visitexpression
{
class visitexpression
{
static void Main(string[] args)
{
TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVOracle);
sqlparser.SqlText.Text = @"SELECT f1 FROM t1 WHERE t1.a = 10.2 AND name = 'k' OR id IN ( 2, 4, 5 ) HAVING MAX(x) > 6 ";
Console.WriteLine("Processing..");
int i = sqlparser.Parse();
if (i == 0)
{
visitbinaryexprtree(sqlparser.SqlStatements[0].WhereClause);
}
else
Console.WriteLine(sqlparser.ErrorMessages);
}
public static void visitbinaryexprtree(TLzCustomExpression pExpr)
{
Console.WriteLine("pre-order:");
pExpr.PreOrderTraverse(treenodevisitor);
Console.WriteLine("in-order:");
pExpr.InOrderTraverse(treenodevisitor);
Console.WriteLine("post-order:");
pExpr.PostOrderTraverse(treenodevisitor);
}
public static Boolean treenodevisitor(TLz_Node pnode, Boolean pIsLeafNode)
{
TLzCustomExpression lcexpr;
if (pIsLeafNode)
{
Console.WriteLine(pnode.AsText);
}
else
{
lcexpr = (TLzCustomExpression)pnode;
if (lcexpr.oper == TLzOpType.Expr_Parenthesis)
{
Console.WriteLine("()");
}
else if (lcexpr.opname != null)
{
Console.WriteLine(lcexpr.opname.AsText);
}
}
return true;
}
}
}
Download this demo: C# version, Java version

