Skip to content
No results
We use cookies to ensure that we give you the best experience on our website.

# 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