Example #1
0
 public void Push(bool isInvoke)
 {
     if (isInvoke)
     {
         this.session.sessionData.persistentStoreCollection.Push();
     }
     this._ObjectArrayStack.Push(this.DynamicArguments);
     this._ObjectArrayStack.Push(this.RoutineArguments);
     this._ObjectArrayStack.Push(this.RoutineVariables);
     this._IRangeIteratorArrayStack.Push(this.RangeIterators);
     this._HashMappedListStack.Push(this.Savepoints);
     this._LongDequeStack.Push(this.SavepointTimestamps);
     this._BoolStack.Push(this.IsAutoCommit);
     this._BoolStack.Push(this.IsReadOnly);
     this._BoolStack.Push(this.NoSql);
     this._IntStack.Push(this.CurrentMaxRows);
     this._DelegateStack.Push(this.RestoreTriggerIterators);
     this._ObjectArrayStack.Push(this.triggerNewData);
     this._ObjectArrayStack.Push(this.triggerOldData);
     this.RangeIterators      = new IRangeIterator[4];
     this.SavepointTimestamps = this.longDequePool.Fetch();
     this.SavepointTimestamps.Clear();
     this.Savepoints = this.hashMappedListPool.Fetch();
     this.Savepoints.Clear();
     this.IsAutoCommit   = false;
     this.CurrentMaxRows = 0;
     this.Depth++;
 }
Example #2
0
 public SessionContext(Session session)
 {
     this.session               = session;
     this.RangeIterators        = new IRangeIterator[4];
     this.Savepoints            = new HashMappedList <string, int>(4);
     this.SavepointTimestamps   = new LongDeque();
     this.SessionVariables      = new HashMappedList <string, ColumnSchema>();
     this.SessionVariablesRange = new RangeVariable[] { new RangeVariable(this.SessionVariables, true) };
     this.IsAutoCommit          = this.IsReadOnly = this.NoSql = false;
 }
Example #3
0
        private void ReadMergeWhen(LongDeque updateColIndexList, OrderedHashSet <string> insertColumnNames, OrderedHashSet <Expression> updateTargetSet, List <Expression> insertExpressions, List <Expression> updateExpressions, RangeVariable[] targetRangeVars, RangeVariable sourceRangeVar)
        {
            int columnCount = targetRangeVars[0].RangeTable.GetColumnCount();

            base.ReadThis(0x138);
            if (base.token.TokenType == 0x1b4)
            {
                if (updateExpressions.Count != 0)
                {
                    throw Error.GetError(0x15ab);
                }
                base.Read();
                base.ReadThis(0x116);
                base.ReadThis(0x12d);
                base.ReadThis(0xfc);
                this.ReadSetClauseList(targetRangeVars, updateTargetSet, updateColIndexList, updateExpressions);
            }
            else
            {
                if (base.token.TokenType != 0xb5)
                {
                    throw base.UnexpectedToken();
                }
                if (insertExpressions.Count != 0)
                {
                    throw Error.GetError(0x15ac);
                }
                base.Read();
                base.ReadThis(0x1b4);
                base.ReadThis(0x116);
                base.ReadThis(0x85);
                if (base.ReadOpenBrackets() == 1)
                {
                    base.ReadSimpleColumnNames(insertColumnNames, targetRangeVars[0]);
                    columnCount = insertColumnNames.Size();
                    base.ReadThis(0x2aa);
                }
                base.ReadThis(0x132);
                Expression item = base.XreadContextuallyTypedTable(columnCount);
                if (item.nodes.Length != 1)
                {
                    throw Error.GetError(0xc81);
                }
                insertExpressions.Add(item);
            }
            if (base.token.TokenType == 0x138)
            {
                this.ReadMergeWhen(updateColIndexList, insertColumnNames, updateTargetSet, insertExpressions, updateExpressions, targetRangeVars, sourceRangeVar);
            }
        }
Example #4
0
 public void Pop(bool isInvoke)
 {
     if (isInvoke)
     {
         this.session.sessionData.persistentStoreCollection.Pop();
     }
     this.longDequePool.Store(this.SavepointTimestamps);
     this.hashMappedListPool.Store(this.Savepoints);
     this.triggerOldData          = this._ObjectArrayStack.Pop();
     this.triggerNewData          = this._ObjectArrayStack.Pop();
     this.RestoreTriggerIterators = this._DelegateStack.Pop();
     this.CurrentMaxRows          = this._IntStack.Pop();
     this.NoSql               = this._BoolStack.Pop();
     this.IsReadOnly          = this._BoolStack.Pop();
     this.IsAutoCommit        = this._BoolStack.Pop();
     this.SavepointTimestamps = this._LongDequeStack.Pop();
     this.Savepoints          = this._HashMappedListStack.Pop();
     this.RangeIterators      = this._IRangeIteratorArrayStack.Pop();
     this.RoutineVariables    = this._ObjectArrayStack.Pop();
     this.RoutineArguments    = this._ObjectArrayStack.Pop();
     this.DynamicArguments    = this._ObjectArrayStack.Pop();
     this.Depth--;
 }
Example #5
0
        public void ReadSetClauseList(RangeVariable[] rangeVars, OrderedHashSet <Expression> targets, LongDeque colIndexList, List <Expression> expressions)
        {
            Expression expression;

            while (true)
            {
                int num;
                if (base.token.TokenType == 0x2b7)
                {
                    base.Read();
                    int num4 = targets.Size();
                    base.ReadTargetSpecificationList(targets, rangeVars, colIndexList);
                    num = targets.Size() - num4;
                    base.ReadThis(0x2aa);
                }
                else
                {
                    expression = base.XreadTargetSpecification(rangeVars, colIndexList);
                    if (!targets.Add(expression))
                    {
                        break;
                    }
                    num = 1;
                }
                if (base.token.TokenType == 0x18c)
                {
                    base.ReadThis(0x18c);
                }
                else
                {
                    base.ReadThis(0x223);
                }
                int position = base.GetPosition();
                int num3     = base.ReadOpenBrackets();
                if (base.token.TokenType == 0xf9)
                {
                    this.Rewind(position);
                    SubQuery sq = base.XreadSubqueryBody(false, 0x16);
                    if (num != sq.queryExpression.GetColumnCount())
                    {
                        throw Error.GetError(0x15aa);
                    }
                    Expression item = new Expression(0x16, sq);
                    expressions.Add(item);
                    if (base.token.TokenType != 0x2ac)
                    {
                        return;
                    }
                    base.Read();
                }
                else
                {
                    if (num3 > 0)
                    {
                        this.Rewind(position);
                    }
                    if (num > 1)
                    {
                        base.ReadThis(0x2b7);
                        Expression item = base.ReadRow();
                        base.ReadThis(0x2aa);
                        int num5 = (item.GetExprType() == 0x19) ? item.nodes.Length : 1;
                        if (num != num5)
                        {
                            throw Error.GetError(0x15aa);
                        }
                        expressions.Add(item);
                    }
                    else
                    {
                        Expression item = base.XreadValueExpressionWithContext();
                        expressions.Add(item);
                    }
                    if (base.token.TokenType != 0x2ac)
                    {
                        return;
                    }
                    base.Read();
                }
            }
            ColumnSchema column = expression.GetColumn();

            throw Error.GetError(0x15cb, column.GetName().Name);
        }
Example #6
0
        public StatementDMQL CompileUpdateStatement(RangeVariable[] outerRanges)
        {
            base.Read();
            OrderedHashSet <Expression> targets = new OrderedHashSet <Expression>();
            LongDeque         colIndexList      = new LongDeque();
            List <Expression> expressions       = new List <Expression>();

            RangeVariable[] rangeVars  = new RangeVariable[] { base.ReadSimpleRangeVariable(0x52) };
            Table           rangeTable = rangeVars[0].RangeTable;
            Table           baseTable  = rangeTable.GetBaseTable();

            base.ReadThis(0xfc);
            this.ReadSetClauseList(rangeVars, targets, colIndexList, expressions);
            int[] array = new int[colIndexList.Size()];
            colIndexList.ToArray(array);
            Expression[] a = new Expression[targets.Size()];
            targets.ToArray(a);
            for (int i = 0; i < a.Length; i++)
            {
                this.ResolveOuterReferencesAndTypes(outerRanges, a[i]);
            }
            bool[]       columnCheckList = rangeTable.GetColumnCheckList(array);
            Expression[] colExpressions  = expressions.ToArray();
            Expression   expression      = null;

            if (base.token.TokenType == 0x13a)
            {
                base.Read();
                expression = base.XreadBooleanValueExpression();
                List <Expression> sourceSet = expression.ResolveColumnReferences(outerRanges, null);
                if (outerRanges.Length != 0)
                {
                    sourceSet = Expression.ResolveColumnSet(outerRanges, outerRanges.Length, sourceSet, null);
                }
                ExpressionColumn.CheckColumnsResolved(Expression.ResolveColumnSet(rangeVars, rangeVars.Length, sourceSet, null));
                expression.ResolveTypes(base.session, null);
                if (expression.IsUnresolvedParam())
                {
                    expression.DataType = SqlType.SqlBoolean;
                }
                if (expression.GetDataType() != SqlType.SqlBoolean)
                {
                    throw Error.GetError(0x15c0);
                }
            }
            this.ResolveUpdateExpressions(rangeTable, rangeVars, array, colExpressions, outerRanges);
            if (rangeTable != baseTable)
            {
                QuerySpecification mainSelect = rangeTable.GetQueryExpression().GetMainSelect();
                RangeVariable[]    newRanges  = (RangeVariable[])mainSelect.RangeVariables.Clone();
                newRanges[0] = mainSelect.RangeVariables[0].Duplicate();
                Expression[] list = new Expression[mainSelect.IndexLimitData];
                for (int j = 0; j < mainSelect.IndexLimitData; j++)
                {
                    Expression expression3 = mainSelect.ExprColumns[j].Duplicate();
                    list[j] = expression3;
                    expression3.ReplaceRangeVariables(mainSelect.RangeVariables, newRanges);
                }
                Expression queryCondition = mainSelect.QueryCondition;
                if (queryCondition != null)
                {
                    queryCondition = queryCondition.Duplicate();
                    queryCondition.ReplaceRangeVariables(rangeVars, newRanges);
                }
                if (expression != null)
                {
                    expression = expression.ReplaceColumnReferences(rangeVars[0], list);
                }
                for (int k = 0; k < colExpressions.Length; k++)
                {
                    colExpressions[k] = colExpressions[k].ReplaceColumnReferences(rangeVars[0], list);
                }
                rangeVars  = newRanges;
                expression = ExpressionLogical.AndExpressions(queryCondition, expression);
            }
            if (expression != null)
            {
                rangeVars[0].AddJoinCondition(expression);
                RangeVariableResolver resolver1 = new RangeVariableResolver(rangeVars, null, base.compileContext);
                resolver1.ProcessConditions(base.session);
                rangeVars = resolver1.RangeVariables;
            }
            if ((baseTable != null) && (rangeTable != baseTable))
            {
                int[] newRow = new int[array.Length];
                ArrayUtil.ProjectRow(rangeTable.GetBaseTableColumnMap(), array, newRow);
                array = newRow;
                for (int j = 0; j < array.Length; j++)
                {
                    if (baseTable.ColGenerated[array[j]])
                    {
                        throw Error.GetError(0x1589);
                    }
                }
            }
            StatementDML tdml1 = new StatementDML(base.session, a, rangeTable, rangeVars, array, colExpressions, columnCheckList, base.compileContext);

            tdml1.CheckAccessRights(base.session);
            return(tdml1);
        }
Example #7
0
        public StatementDMQL CompileMergeStatement(RangeVariable[] outerRanges)
        {
            int[]             array             = null;
            Expression[]      a                 = null;
            List <Expression> updateExpressions = new List <Expression>();

            Expression[]      emptyArray        = Expression.emptyArray;
            List <Expression> insertExpressions = new List <Expression>();
            Expression        tableExpression   = null;

            base.Read();
            base.ReadThis(0x8b);
            RangeVariable variable   = base.ReadSimpleRangeVariable(0x80);
            Table         rangeTable = variable.RangeTable;

            base.ReadThis(0x130);
            RangeVariable sourceRangeVar = base.ReadTableOrSubquery();

            base.ReadThis(0xc0);
            Expression conditions = base.XreadBooleanValueExpression();

            if (conditions.GetDataType() != SqlType.SqlBoolean)
            {
                throw Error.GetError(0x15c0);
            }
            RangeVariable[]             rangeVarArray      = new RangeVariable[] { sourceRangeVar, variable };
            RangeVariable[]             rangeVariables     = new RangeVariable[] { sourceRangeVar };
            RangeVariable[]             targetRangeVars    = new RangeVariable[] { variable };
            int[]                       columnMap          = rangeTable.GetColumnMap();
            bool[]                      newColumnCheckList = rangeTable.GetNewColumnCheckList();
            OrderedHashSet <Expression> updateTargetSet    = new OrderedHashSet <Expression>();
            OrderedHashSet <string>     insertColumnNames  = new OrderedHashSet <string>();
            LongDeque                   updateColIndexList = new LongDeque();

            this.ReadMergeWhen(updateColIndexList, insertColumnNames, updateTargetSet, insertExpressions, updateExpressions, targetRangeVars, sourceRangeVar);
            if (insertExpressions.Count > 0)
            {
                if (insertColumnNames.Size() != 0)
                {
                    columnMap          = rangeTable.GetColumnIndexes(insertColumnNames);
                    newColumnCheckList = rangeTable.GetColumnCheckList(columnMap);
                }
                tableExpression = insertExpressions[0];
                SetParameterTypes(tableExpression, rangeTable, columnMap);
            }
            if (updateExpressions.Count > 0)
            {
                a = new Expression[updateTargetSet.Size()];
                updateTargetSet.ToArray(a);
                for (int i = 0; i < a.Length; i++)
                {
                    this.ResolveOuterReferencesAndTypes(outerRanges, a[i]);
                }
                emptyArray = updateExpressions.ToArray();
                array      = new int[updateColIndexList.Size()];
                updateColIndexList.ToArray(array);
            }
            if (emptyArray.Length != 0)
            {
                Table baseTable = rangeTable.GetBaseTable();
                if (rangeTable != baseTable)
                {
                    int[] newRow = new int[array.Length];
                    ArrayUtil.ProjectRow(rangeTable.GetBaseTableColumnMap(), array, newRow);
                }
                this.ResolveUpdateExpressions(rangeTable, rangeVariables, array, emptyArray, outerRanges);
            }
            List <Expression> set = conditions.ResolveColumnReferences(rangeVarArray, null);

            ExpressionColumn.CheckColumnsResolved(set);
            conditions.ResolveTypes(base.session, null);
            if (conditions.IsUnresolvedParam())
            {
                conditions.DataType = SqlType.SqlBoolean;
            }
            if (conditions.GetDataType() != SqlType.SqlBoolean)
            {
                throw Error.GetError(0x15c0);
            }
            RangeVariableResolver resolver1 = new RangeVariableResolver(rangeVarArray, conditions, base.compileContext);

            resolver1.ProcessConditions(base.session);
            rangeVarArray = resolver1.GetRangeVariables();
            if (tableExpression != null)
            {
                ExpressionColumn.CheckColumnsResolved(tableExpression.ResolveColumnReferences(rangeVariables, set));
                tableExpression.ResolveTypes(base.session, null);
            }
            StatementDML tdml1 = new StatementDML(base.session, a, rangeVarArray, columnMap, array, newColumnCheckList, conditions, tableExpression, emptyArray, base.compileContext);

            tdml1.CheckAccessRights(base.session);
            return(tdml1);
        }