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++; }
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; }
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); } }
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--; }
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); }
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); }
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); }