Esempio n. 1
0
 private void parseStatement(TCustomSqlStatement stmt)
 {
     if (!stmtList.Contains(stmt.ToString()))
     {
         stmtList.Add(stmt.ToString());
     }
     else
     {
         return;
     }
     if (stmt is TCreateViewSqlStatement)
     {
         TCreateViewSqlStatement createView = ((TCreateViewSqlStatement)stmt);
         parseCreateView(createView);
     }
     else if (stmt is TCreateTableSqlStatement && ((TCreateTableSqlStatement)stmt).SubQuery != null)
     {
         TCreateTableSqlStatement createTable = ((TCreateTableSqlStatement)stmt);
         parseCreateTable(createTable);
     }
     else if (stmt is TInsertSqlStatement && ((TInsertSqlStatement)stmt).SubQuery != null)
     {
         TInsertSqlStatement insert = ((TInsertSqlStatement)stmt);
         parseInsertStmt(insert);
     }
     if (stmt is TUseDatabase)
     {
         TUseDatabase use = (TUseDatabase)stmt;
         database = use.DatabaseName.ToString();
     }
 }
Esempio n. 2
0
        private void removeObjectFromResultColumn(TCustomSqlStatement stmt, TObjectName column)
        {
            if (stmt.ResultColumnList != null)
            {
                for (int i = 0; i < stmt.ResultColumnList.Count; i++)
                {
                    TResultColumn resultSetColumn = stmt.ResultColumnList.getResultColumn(i);
                    TExpression   expression      = resultSetColumn.Expr;
                    switch (expression.ExpressionType)
                    {
                    case EExpressionType.simple_object_name_t:
                        if (column.startToken == expression.startToken && column.endToken == expression.endToken)
                        {
                            stmt.ResultColumnList.removeResultColumn(i);
                            return;
                        }
                        break;
                    }
                }
            }

            if (stmt is TInsertSqlStatement)
            {
                TInsertSqlStatement insert = (TInsertSqlStatement)stmt;
                if (insert.ColumnList == null)
                {
                    return;
                }
                for (int i = 0; i < insert.ColumnList.Count; i++)
                {
                    TObjectName insertColumn = insert.ColumnList.getObjectName(i);

                    if (column.startToken == insertColumn.startToken && column.endToken == insertColumn.endToken)
                    {
                        if (insert.Values != null)
                        {
                            for (int j = 0; j < insert.Values.Count; j++)
                            {
                                TMultiTarget target = insert.Values[j];
                                if (target.ColumnList != null && target.ColumnList.Count == insert.ColumnList.Count)
                                {
                                    target.ColumnList.removeResultColumn(i);
                                }
                            }
                        }

                        insert.ColumnList.removeObjectName(i);
                        return;
                    }
                }
            }
        }
Esempio n. 3
0
        public void testNetezzaSelectFromExternalTable()
        {
            TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvnetezza);

            sqlparser.sqltext = "insert into \"$hist_column_access_1\"(npsid, npsinstanceid, opid, logentryid, seqid, sessionid, dbid, dbname, schemaid, schemaname, tableid, tablename, columnid, columnname, usage) select 1, * from external '/nz/data.1.0/hist/loading/alc_20140215_151309.473439/alc_co_20140215_151309.473439' (npsinstanceid int, opid bigint, logentryid bigint, seqid integer, sessionid bigint, dbid int, dbname nvarchar (128), schemaid int , schemaname nvarchar (128), tableid int, tablename nvarchar (128), columnid int, columnname nvarchar (128), usage int) using( logdir '/nz/data.1.0/hist/loading/alc_20140215_151309.473439' encoding 'internal' escapechar '\\' fillrecord true ctrlchars true crinstring true)";
            Assert.IsTrue(sqlparser.parse() == 0);
            TInsertSqlStatement insertSqlStatement = (TInsertSqlStatement)sqlparser.sqlstatements.get(0);
            TTable table = insertSqlStatement.tables.getTable(0);

            Assert.IsTrue(table.TableName.ToString().Equals("\"$hist_column_access_1\"", StringComparison.CurrentCultureIgnoreCase));
            TSelectSqlStatement select = (TSelectSqlStatement)insertSqlStatement.SubQuery;

            table = select.tables.getTable(0);
            Assert.IsTrue(table.TableName.ToString().Equals("'/nz/data.1.0/hist/loading/alc_20140215_151309.473439/alc_co_20140215_151309.473439'", StringComparison.CurrentCultureIgnoreCase));
        }
Esempio n. 4
0
        private void parseSubQueryColumnDefinition(TInsertSqlStatement insert, TSelectSqlStatement stmt, TableMetaData tableMetaData, ColumnImpactModel columnImpactModel)
        {
            if (stmt.SetOperatorType != ESetOperatorType.none)
            {
                parseSubQueryColumnDefinition(insert, stmt.LeftStmt, tableMetaData, columnImpactModel);
                parseSubQueryColumnDefinition(insert, stmt.RightStmt, tableMetaData, columnImpactModel);
            }
            else
            {
                if (insert.ColumnList != null)
                {
                    TObjectNameList items       = insert.ColumnList;
                    int             columnCount = items.size();
                    string[]        aliasNames  = new string[columnCount];

                    for (int i = 0; i < items.size(); i++)
                    {
                        aliasNames[i] = items.getObjectName(i).ToString();
                    }

                    for (int i = 0; i < columnCount; i++)
                    {
                        TResultColumn resultColumn = null;
                        if (i < stmt.ResultColumnList.size())
                        {
                            resultColumn = stmt.ResultColumnList.getResultColumn(i);
                        }
                        else
                        {
                            resultColumn = stmt.ResultColumnList.getResultColumn(stmt.ResultColumnList.size() - 1);
                        }
                        parseInsertColumnDefinition(resultColumn, tableMetaData, columnImpactModel, aliasNames[i]);
                    }
                }
                else if (insert.SubQuery != null && insert.SubQuery.ResultColumnList != null)
                {
                    int      columnCount = insert.SubQuery.ResultColumnList.size();
                    String[] aliasNames  = new String[columnCount];
                    for (int i = 0; i < columnCount; i++)
                    {
                        TResultColumn resultColumn = insert.SubQuery.ResultColumnList.getResultColumn(i);
                        parseColumnDefinition(resultColumn, tableMetaData, columnImpactModel, aliasNames[i]);
                    }
                }
            }
        }
Esempio n. 5
0
 private void parseInsertStmt(TInsertSqlStatement insert)
 {
     if (insert.TargetTable.TableName != null)
     {
         string        tableName     = insert.TargetTable.TableName.TableString;
         string        tableSchema   = insert.TargetTable.TableName.SchemaString;
         string        databaseName  = insert.TargetTable.TableName.DatabaseString;
         TableMetaData tableMetaData = new TableMetaData(vendor, strict);
         tableMetaData.Name       = tableName;
         tableMetaData.SchemaName = tableSchema;
         if (isNotEmpty(databaseName))
         {
             tableMetaData.CatalogName = databaseName;
         }
         else
         {
             tableMetaData.CatalogName = database;
         }
         tableMetaData.View = false;
         if (!tableColumns.ContainsKey(tableMetaData))
         {
             tableColumns[tableMetaData] = new List <ColumnMetaData>();
         }
         else
         {
             IList <TableMetaData> tables = new List <TableMetaData>(tableColumns.Keys);
             tableMetaData      = (TableMetaData)tables[tables.IndexOf(tableMetaData)];
             tableMetaData.View = false;
         }
         if (insert.SubQuery != null)
         {
             ColumnImpact impact = new ColumnImpact(insert.SubQuery.ToString(), insert.dbvendor, tableColumns, strict);
             impact.ignoreTopSelect(true);
             impact.Debug             = false;
             impact.ShowUIInfo        = true;
             impact.TraceErrorMessage = false;
             impact.impactSQL();
             ColumnImpactModel columnImpactModel = impact.generateModel();
             parseSubQueryColumnDefinition(insert, insert.SubQuery, tableMetaData, columnImpactModel);
         }
     }
 }
Esempio n. 6
0
        public void testCreateProcedure()
        {
            TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvdb2);

            sqlparser.sqltext = "CREATE PROCEDURE CREATE_T_EMP()\n" + "   LANGUAGE SQL\n" + "BEGIN\n" + "DECLARE SQLCODE INT;\n" + "DECLARE l_sqlcode INT DEFAULT 0;\n" + "\n" + "  DECLARE CONTINUE HANDLER FOR NOT FOUND\n" + "    SET l_sqlcode = SQLCODE; \n" + "\n" + "        INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE) \n" + "        VALUES('HG0023', 'NEW NETWORK', 'E11', '200280', CURRENT DATE); \n" + "END";

            Assert.IsTrue(sqlparser.parse() == 0);

            Assert.IsTrue(sqlparser.sqlstatements.get(0).sqlstatementtype == ESqlStatementType.sstdb2createprocedure);
            TDb2CreateProcedure procedure = (TDb2CreateProcedure)sqlparser.sqlstatements.get(0);

            // System.out.print(procedure.getBodyStatements().size());
            Assert.IsTrue(procedure.DeclareStatements.size() == 3);
            Assert.IsTrue(procedure.DeclareStatements.get(2).ToString().Equals("DECLARE CONTINUE HANDLER FOR NOT FOUND\n" + "    SET l_sqlcode = SQLCODE", StringComparison.CurrentCultureIgnoreCase));
            Assert.IsTrue(procedure.BodyStatements.size() == 1);

            Assert.IsTrue(procedure.BodyStatements.get(0).sqlstatementtype == ESqlStatementType.sstinsert);
            TInsertSqlStatement insert = (TInsertSqlStatement)procedure.BodyStatements.get(0);

            // System.out.print(insert.toString());
            // Assert.IsTrue(insert.toString() != null);
            Assert.IsTrue(insert.ToString().Equals("INSERT INTO PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP, PRSTDATE) \n" + "        VALUES('HG0023', 'NEW NETWORK', 'E11', '200280', CURRENT DATE)", StringComparison.CurrentCultureIgnoreCase));
        }
Esempio n. 7
0
        private void analyzeSqlStatement(procedureInfo procedureInfo, TCustomSqlStatement stmt)
        {
            if (stmt is TMssqlBlock)
            {
                TMssqlBlock block = (TMssqlBlock)stmt;
                if (block.BodyStatements != null)
                {
                    for (int i = 0; i < block.BodyStatements.size(); i++)
                    {
                        analyzeSqlStatement(procedureInfo, block.BodyStatements.get(i));
                    }
                }
            }
            else if (stmt is TMssqlIfElse)
            {
                TMssqlIfElse ifElse = (TMssqlIfElse)stmt;
                if (ifElse.Stmt != null)
                {
                    analyzeSqlStatement(procedureInfo, ifElse.Stmt);
                }
                if (ifElse.Condition != null)
                {
                }
                if (ifElse.ElseStmt != null)
                {
                    analyzeSqlStatement(procedureInfo, ifElse.ElseStmt);
                }
            }
            else if (stmt is TMssqlDeclare)
            {
                TMssqlDeclare declareStmt = (TMssqlDeclare)stmt;
                if (declareStmt.Subquery != null && declareStmt.Subquery.ToString().Trim().Length > 0)
                {
                    analyzeSqlStatement(procedureInfo, declareStmt.Subquery);
                }
            }
            else if (stmt is TMssqlExecute && ((TMssqlExecute)stmt).ModuleName != null)
            {
                TMssqlExecute executeStmt = (TMssqlExecute)stmt;
                operateInfo   operateInfo = new operateInfo();
                operateInfo.objectType = objectType.SP;
                operateInfo.objectUsed = executeStmt.ModuleName.ToString().Trim();
                operateInfo.usageType  = usageType.Exec;
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TCreateTableSqlStatement)
            {
                TCreateTableSqlStatement createStmt = (TCreateTableSqlStatement)stmt;
                TColumnDefinitionList    columns    = createStmt.ColumnList;
                operateInfo operateInfo             = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = createStmt.TargetTable.ToString().Trim();
                operateInfo.usageType  = usageType.Create;
                for (int i = 0; i < columns.size(); i++)
                {
                    TColumnDefinition column = columns.getColumn(i);
                    operateInfo.columns.Add(column.ColumnName.ToString());
                }
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TInsertSqlStatement)
            {
                TInsertSqlStatement insertStmt  = (TInsertSqlStatement)stmt;
                TObjectNameList     columns     = insertStmt.ColumnList;
                operateInfo         operateInfo = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = insertStmt.TargetTable.ToString().Trim();
                operateInfo.usageType  = usageType.Insert;
                if (columns != null)
                {
                    for (int i = 0; i < columns.size(); i++)
                    {
                        TObjectName column = columns.getObjectName(i);
                        operateInfo.columns.Add(column.ToString());
                    }
                }
                procedureInfo.operates.Add(operateInfo);

                // if (insertStmt.ExecStmt != null)
                // {
                // analyzeSqlStatement(procedureInfo, insertStmt.ExecStmt);
                // }
            }
            else if (stmt is TUpdateSqlStatement)
            {
                TUpdateSqlStatement updateStmt  = (TUpdateSqlStatement)stmt;
                TResultColumnList   columns     = updateStmt.ResultColumnList;
                operateInfo         operateInfo = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = updateStmt.TargetTable.ToString().Trim();
                operateInfo.usageType  = usageType.Update;
                for (int i = 0; i < columns.size(); i++)
                {
                    TResultColumn column = columns.getResultColumn(i);
                    operateInfo.columns.Add(column.Expr.LeftOperand.ToString());
                }
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TDeleteSqlStatement)
            {
                TDeleteSqlStatement deleteStmt  = (TDeleteSqlStatement)stmt;
                operateInfo         operateInfo = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = deleteStmt.TargetTable.ToString().Trim();
                operateInfo.usageType  = usageType.Delete;
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TMssqlDropTable)
            {
                TMssqlDropTable dropStmt    = (TMssqlDropTable)stmt;
                operateInfo     operateInfo = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = dropStmt.TargetTable.ToString().Trim();
                operateInfo.usageType  = usageType.Drop;
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TDropTableSqlStatement)
            {
                TDropTableSqlStatement dropStmt    = (TDropTableSqlStatement)stmt;
                operateInfo            operateInfo = new operateInfo();
                operateInfo.objectType = objectType.Table;
                operateInfo.objectUsed = dropStmt.TableName.ToString().Trim();
                operateInfo.usageType  = usageType.Drop;
                procedureInfo.operates.Add(operateInfo);
            }
            else if (stmt is TSelectSqlStatement)
            {
                TSelectSqlStatement selectStmt  = (TSelectSqlStatement)stmt;
                List <columnInfo>   columnInfos = new List <columnInfo>();
                List <tableInfo>    tableInfos  = new List <tableInfo>();
                tableTokensInStmt(columnInfos, tableInfos, selectStmt);
                LinkedHashMap <tableInfo, List <columnInfo> > columnMap = new LinkedHashMap <tableInfo, List <columnInfo> >();
                for (int i = 0; i < columnInfos.Count; i++)
                {
                    columnInfo column = columnInfos[i];
                    tableInfo  table  = column.table;
                    if (columnMap.ContainsKey(table))
                    {
                        List <columnInfo> columns = (List <columnInfo>)columnMap[table];
                        bool flag = false;
                        foreach (columnInfo temp in columns)
                        {
                            if (temp.ToString().Equals(column.ToString(), StringComparison.CurrentCultureIgnoreCase))
                            {
                                flag = true;
                                break;
                            }
                        }
                        if (!flag)
                        {
                            columns.Add(column);
                        }
                    }
                    else
                    {
                        List <columnInfo> columns = new List <columnInfo>();
                        columnMap[table] = columns;
                        columns.Add(column);
                    }
                }
                for (int i = 0; i < tableInfos.Count; i++)
                {
                    operateInfo operateInfo = new operateInfo();
                    operateInfo.objectType = objectType.Table;
                    operateInfo.objectUsed = tableInfos[i].ToString();
                    if (tableInfos[i].stmt is TSelectSqlStatement && ((TSelectSqlStatement)tableInfos[i].stmt).IntoClause != null)
                    {
                        operateInfo.usageType = usageType.Insert;
                    }
                    else
                    {
                        operateInfo.usageType = usageType.Read;
                    }
                    if (columnMap.ContainsKey(tableInfos[i]))
                    {
                        foreach (columnInfo column in (List <columnInfo>)columnMap[tableInfos[i]])
                        {
                            operateInfo.columns.Add(column.ToString());
                            operateInfo.objectUsed = column.table.ToString();
                        }
                    }
                    procedureInfo.operates.Add(operateInfo);
                }
            }
        }
Esempio n. 8
0
        public static void doIt()
        {
            TGSqlParser sqlparser = new TGSqlParser(EDbVendor.dbvmssql);

            sqlparser.sqltext = "select employee_id,last_name,sal\n" + "from employees\n" + "where department_id = 90\n" + "group by employee_id having sal>10\n" + "order by last_name;";

            sqlparser.parse();

            TSelectSqlStatement select = (TSelectSqlStatement)sqlparser.sqlstatements.get(0);

            gudusoft.gsqlparser.nodes.TTable table = select.tables.getTable(0);
            TObjectName o;

            Console.WriteLine("Select statement, find out what clause a TObjectName belongs to:");
            for (int i = 0; i < table.LinkedColumns.size(); i++)
            {
                o = table.LinkedColumns.getObjectName(i);
                Console.WriteLine(o.ToString() + "\t\t\tlocation:" + o.Location);
            }

            sqlparser.sqltext = "insert into emp e1 (e1.lastname,job) values('scott',10);";
            sqlparser.parse();

            TInsertSqlStatement insert = (TInsertSqlStatement)sqlparser.sqlstatements.get(0);

            table = insert.tables.getTable(0);

            Console.WriteLine("\n\nInsert statement, find out what clause a TObjectName belongs to:");
            for (int i = 0; i < table.LinkedColumns.size(); i++)
            {
                o = table.LinkedColumns.getObjectName(i);
                Console.WriteLine(o.ToString() + "\t\t\tlocation:" + o.Location);
            }

            sqlparser.sqltext = "update employees\n" + "set department_ID = 70\n" + "where employee_id = 113;";
            sqlparser.parse();


            TUpdateSqlStatement update = (TUpdateSqlStatement)sqlparser.sqlstatements.get(0);

            table = update.tables.getTable(0);
            Console.WriteLine("\n\nUpdate statement, find out what clause a TObjectName belongs to:");
            for (int i = 0; i < table.LinkedColumns.size(); i++)
            {
                o = table.LinkedColumns.getObjectName(i);
                Console.WriteLine(o.ToString() + "\t\t\tlocation:" + o.Location);
            }

            sqlparser.sqltext = "delete from employees E\n" + "where employee_id = \n" + "(select employee_sal\n" + "from emp_history\n" + "where employee_id = e.employee_id);";
            sqlparser.parse();


            TDeleteSqlStatement delete = (TDeleteSqlStatement)sqlparser.sqlstatements.get(0);

            table = delete.tables.getTable(0);

            Console.WriteLine("\n\nDelete statement, find out what clause a TObjectName belongs to:");
            for (int i = 0; i < table.LinkedColumns.size(); i++)
            {
                o = table.LinkedColumns.getObjectName(i);
                Console.WriteLine(o.ToString() + "\t\t\tlocation:" + o.Location);
            }


            // subquery in where clause
            select = (TSelectSqlStatement)delete.Statements.get(0);
            gudusoft.gsqlparser.nodes.TTable table1 = select.tables.getTable(0);
            Console.WriteLine("\nSubquery in delete statement, find out what clause a TObjectName belongs to:");
            for (int i = 0; i < table1.LinkedColumns.size(); i++)
            {
                o = table1.LinkedColumns.getObjectName(i);
                Console.WriteLine(o.ToString() + "\t\t\tlocation:" + o.Location);
            }
        }