Esempio n. 1
0
        public StatementDMQL CompileInsertStatement(RangeVariable[] outerRanges)
        {
            bool[] columnCheckList;
            base.Read();
            base.ReadThis(0x8b);
            Table targetTable = base.ReadTableName();
            bool  flag        = false;
            bool  flag2       = false;
            bool  flag3       = false;

            int[] columnMap   = targetTable.GetColumnMap();
            int   columnCount = targetTable.GetColumnCount();
            int   position    = base.GetPosition();

            if ((!targetTable.IsInsertable() && !targetTable.IsTriggerInsertable()) && !base.session.IsProcessingScript())
            {
                throw Error.GetError(0x15a9);
            }
            Table table2    = targetTable.IsTriggerInsertable() ? targetTable : targetTable.GetBaseTable();
            int   tokenType = base.token.TokenType;

            if (tokenType <= 0x114)
            {
                switch (tokenType)
                {
                case 0xf9:
                case 0x114:
                    goto Label_046B;

                case 0x4d:
                {
                    base.Read();
                    base.ReadThis(0x132);
                    Expression   insertExpression = new Expression(0x19, new Expression[0]);
                    Expression[] list             = new Expression[] { insertExpression };
                    insertExpression = new Expression(0x1a, list);
                    columnCheckList  = targetTable.GetNewColumnCheckList();
                    for (int j = 0; j < targetTable.ColDefaults.Length; j++)
                    {
                        if (((targetTable.ColDefaults[j] == null) && (targetTable.IdentityColumn != j)) && !targetTable.GetColumn(j).IsGenerated())
                        {
                            throw Error.GetError(0x15a8);
                        }
                    }
                    StatementInsert insert2 = new StatementInsert(base.session, targetTable, columnMap, insertExpression, columnCheckList);
                    insert2.SetDatabseObjects(base.session, base.compileContext);
                    insert2.CheckAccessRights(base.session);
                    insert2.SetupChecks();
                    insert2.InitSimpleInsert();
                    return(insert2);
                }
                }
                goto Label_0464;
            }
            if (tokenType <= 0x13d)
            {
                switch (tokenType)
                {
                case 0x132:
                    goto Label_01E7;

                case 0x13d:
                    goto Label_046B;
                }
                goto Label_0464;
            }
            if (tokenType != 460)
            {
                if (tokenType != 0x2b7)
                {
                    goto Label_0464;
                }
                if (base.ReadOpenBrackets() != 1)
                {
                    this.Rewind(position);
                    goto Label_046B;
                }
                bool flag4 = false;
                switch (base.token.TokenType)
                {
                case 0xf9:
                case 0x114:
                case 0x13d:
                    this.Rewind(position);
                    flag4 = true;
                    break;
                }
                if (flag4)
                {
                    goto Label_046B;
                }
                OrderedHashSet <string> columns = new OrderedHashSet <string>();
                base.ReadSimpleColumnNames(columns, targetTable);
                base.ReadThis(0x2aa);
                columnCount = columns.Size();
                columnMap   = targetTable.GetColumnIndexes(columns);
                if ((base.token.TokenType != 0x132) && (base.token.TokenType != 460))
                {
                    goto Label_046B;
                }
            }
            if (base.token.TokenType == 460)
            {
                base.Read();
                if (base.token.TokenType == 0x12f)
                {
                    base.Read();
                    flag = true;
                }
                else if (base.token.TokenType == 0x112)
                {
                    base.Read();
                    flag2 = true;
                }
                else
                {
                    base.UnexpectedToken();
                }
                base.ReadThis(0x131);
                if (base.token.TokenType != 0x132)
                {
                    goto Label_046B;
                }
            }
Label_01E7:
            base.Read();
            columnCheckList = targetTable.GetColumnCheckList(columnMap);
            Expression tableExpression = base.XreadContextuallyTypedTable(columnCount);

            ExpressionColumn.CheckColumnsResolved(tableExpression.ResolveColumnReferences(outerRanges, null));
            tableExpression.ResolveTypes(base.session, null);
            SetParameterTypes(tableExpression, targetTable, columnMap);
            if (targetTable != table2)
            {
                int[] numArray2 = new int[columnMap.Length];
                ArrayUtil.ProjectRow(targetTable.GetBaseTableColumnMap(), columnMap, numArray2);
                columnMap = numArray2;
            }
            Expression[] nodes = tableExpression.nodes;
            for (int i = 0; i < nodes.Length; i++)
            {
                Expression[] expressionArray2 = nodes[i].nodes;
                for (int j = 0; j < expressionArray2.Length; j++)
                {
                    Expression   expression3 = expressionArray2[j];
                    ColumnSchema column      = table2.GetColumn(columnMap[j]);
                    if (column.IsIdentity())
                    {
                        flag3 = true;
                        if (expression3.GetExprType() != 4)
                        {
                            if ((column.GetIdentitySequence().IsAlways() && !flag) && !flag2)
                            {
                                throw Error.GetError(0x15a7);
                            }
                            if (flag)
                            {
                                expressionArray2[j] = new ExpressionColumn(4);
                            }
                        }
                    }
                    else if (!column.HasDefault)
                    {
                        if (column.IsGenerated())
                        {
                            if (expression3.GetExprType() != 4)
                            {
                                throw Error.GetError(0x15a5);
                            }
                        }
                        else if (expression3.GetExprType() == 4)
                        {
                            throw Error.GetError(0x15a8);
                        }
                    }
                    if (expression3.IsUnresolvedParam())
                    {
                        expression3.SetAttributesAsColumn(column, true);
                    }
                }
            }
            if (!flag3 && (flag | flag2))
            {
                base.UnexpectedTokenRequire("OVERRIDING");
            }
            StatementInsert insert1 = new StatementInsert(base.session, targetTable, columnMap, tableExpression, columnCheckList);

            insert1.SetDatabseObjects(base.session, base.compileContext);
            insert1.CheckAccessRights(base.session);
            insert1.SetupChecks();
            insert1.InitSimpleInsert();
            return(insert1);

Label_0464:
            throw base.UnexpectedToken();
Label_046B:
            columnCheckList = targetTable.GetColumnCheckList(columnMap);
            if ((targetTable != table2) && (targetTable != table2))
            {
                int[] numArray3 = new int[columnMap.Length];
                ArrayUtil.ProjectRow(targetTable.GetBaseTableColumnMap(), columnMap, numArray3);
                columnMap = numArray3;
            }
            int identityColumnIndex = targetTable.GetIdentityColumnIndex();
            int overrid             = -1;

            if ((identityColumnIndex != -1) && (ArrayUtil.Find(columnMap, identityColumnIndex) > -1))
            {
                if ((targetTable.IdentitySequence.IsAlways() && !flag) && !flag2)
                {
                    throw Error.GetError(0x15a7);
                }
                if (flag)
                {
                    overrid = identityColumnIndex;
                }
            }
            else if (flag | flag2)
            {
                base.UnexpectedTokenRequire("OVERRIDING");
            }
            SqlType[] newRow = new SqlType[columnMap.Length];
            ArrayUtil.ProjectRow(table2.GetColumnTypes(), columnMap, newRow);
            QueryExpression queryExpression = base.XreadQueryExpression();

            queryExpression.SetReturningResult();
            queryExpression.Resolve(base.session, outerRanges, newRow);
            if (columnCount != queryExpression.GetColumnCount())
            {
                throw Error.GetError(0x15aa);
            }
            StatementInsert insert3 = new StatementInsert(base.session, targetTable, columnMap, columnCheckList, queryExpression, overrid);

            insert3.SetDatabseObjects(base.session, base.compileContext);
            insert3.CheckAccessRights(base.session);
            insert3.SetupChecks();
            return(insert3);
        }