Beispiel #1
0
 public void AssignToRangeVariables()
 {
     for (int i = 0; i < this.RangeVariables.Length; i++)
     {
         bool flag = false;
         if (this.RangeVariables[i].IsLeftJoin || this.RangeVariables[i].IsRightJoin)
         {
             RangeVariable.RangeVariableConditions conditions = this.RangeVariables[i].JoinConditions[0];
             this.AssignToRangeVariable(this.RangeVariables[i], conditions, i, this._joinExpressions[i]);
             conditions = this.RangeVariables[i].JoinConditions[0];
             if (conditions.HasIndexCondition())
             {
                 flag = true;
             }
             conditions = this.RangeVariables[i].WhereConditions[0];
             if (this.RangeVariables[i].IsRightJoin)
             {
                 AssignToRangeVariable(conditions, this._whereExpressions[i]);
             }
             else if (flag)
             {
                 AssignToRangeVariable(conditions, this._whereExpressions[i]);
             }
             else
             {
                 this.AssignToRangeVariable(this.RangeVariables[i], conditions, i, this._whereExpressions[i]);
             }
         }
         else
         {
             RangeVariable.RangeVariableConditions conditions = this.RangeVariables[i].JoinConditions[0];
             if (this._hasOuterJoin)
             {
                 AssignToRangeVariable(this.RangeVariables[i].WhereConditions[0], this._whereExpressions[i]);
             }
             else
             {
                 this._joinExpressions[i].AddRange(this._whereExpressions[i]);
             }
             this.AssignToRangeVariable(this.RangeVariables[i], conditions, i, this._joinExpressions[i]);
         }
     }
     if (this._inExpressionCount != 0)
     {
         this.SetInConditionsAsTables();
     }
 }
Beispiel #2
0
        private void SetIndexConditions(RangeVariable.RangeVariableConditions conditions, List <Expression> exprList, int rangeVarIndex, bool includeOr)
        {
            this._colIndexSetEqual.Clear();
            this._colIndexSetOther.Clear();
            int num   = 0;
            int count = exprList.Count;

            while (num < count)
            {
                Expression expression = exprList[num];
                if ((expression != null) && expression.IsIndexable(conditions.RangeVar))
                {
                    switch (expression.GetExprType())
                    {
                    case 0x29:
                        if (((expression.ExprSubType != 0x34) && (expression.ExprSubType != 0x33)) && (expression.GetLeftNode().GetRangeVariable() == conditions.RangeVar))
                        {
                            int columnIndex = expression.GetLeftNode().GetColumnIndex();
                            this._colIndexSetEqual.Add(columnIndex);
                        }
                        goto Label_01C9;

                    case 0x2a:
                    case 0x2b:
                    case 0x2c:
                    case 0x2d:
                        if (expression.GetLeftNode().GetRangeVariable() == conditions.RangeVar)
                        {
                            int num8;
                            int columnIndex = expression.GetLeftNode().GetColumnIndex();
                            if (!this._colIndexSetOther.TryGetValue(columnIndex, out num8))
                            {
                                num8 = 0;
                            }
                            this._colIndexSetOther[columnIndex] = num8 + 1;
                        }
                        goto Label_01C9;

                    case 0x2f:
                        if (expression.GetLeftNode().GetRangeVariable() == conditions.RangeVar)
                        {
                            int columnIndex = expression.GetLeftNode().GetColumnIndex();
                            this._colIndexSetEqual.Add(columnIndex);
                        }
                        goto Label_01C9;

                    case 0x30:
                        if (expression.GetLeftNode().GetLeftNode().GetRangeVariable() == conditions.RangeVar)
                        {
                            int num11;
                            int columnIndex = expression.GetLeftNode().GetLeftNode().GetColumnIndex();
                            if (!this._colIndexSetOther.TryGetValue(columnIndex, out num11))
                            {
                                num11 = 0;
                            }
                            this._colIndexSetOther[columnIndex] = num11 + 1;
                        }
                        goto Label_01C9;

                    case 50:
                    case 2:
                        goto Label_01C9;
                    }
                    Error.RuntimeError(0xc9, "RangeVariableResolver");
                }
Label_01C9:
                num++;
            }
            this.SetEqaulityConditions(conditions, exprList);
            if (!conditions.HasIndexCondition())
            {
                this.SetNonEqualityConditions(conditions, exprList);
            }
            bool flag  = conditions.HasIndexCondition();
            bool flag2 = false;

            if (!flag & includeOr)
            {
                int num12 = 0;
                int num13 = exprList.Count;
                while (num12 < num13)
                {
                    Expression expression2 = exprList[num12];
                    if (expression2 != null)
                    {
                        if (expression2.GetExprType() == 50)
                        {
                            flag = expression2.IsIndexable(conditions.RangeVar);
                            if (flag)
                            {
                                flag = this.SetOrConditions(conditions, (ExpressionLogical)expression2, rangeVarIndex);
                            }
                            if (!flag)
                            {
                                goto Label_02FC;
                            }
                            exprList[num12] = null;
                            flag2           = true;
                            break;
                        }
                        if (((expression2.GetExprType() == 0x29) && (expression2.ExprSubType == 0x34)) && !expression2.GetRightNode().IsCorrelated())
                        {
                            OrderedIntHashSet set = new OrderedIntHashSet();
                            ((ExpressionLogical)expression2).AddLeftColumnsForAllAny(conditions.RangeVar, set);
                            if ((conditions.RangeVar.RangeTable.GetIndexForColumns(this.session, set, false) != null) && (this._inExpressions[rangeVarIndex] == null))
                            {
                                this._inExpressions[rangeVarIndex] = expression2;
                                this._inInJoin[rangeVarIndex]      = conditions.IsJoin;
                                this._inExpressionCount++;
                                exprList[num12] = null;
                                break;
                            }
                        }
                    }
Label_02FC:
                    num12++;
                }
            }
            int num3 = 0;
            int num4 = exprList.Count;

            while (num3 < num4)
            {
                Expression expression3 = exprList[num3];
                if (expression3 != null)
                {
                    if (flag2)
                    {
                        for (int i = 0; i < conditions.RangeVar.JoinConditions.Length; i++)
                        {
                            if (conditions.IsJoin)
                            {
                                conditions.RangeVar.JoinConditions[i].NonIndexCondition = ExpressionLogical.AndExpressions(expression3, conditions.RangeVar.JoinConditions[i].NonIndexCondition);
                            }
                            else
                            {
                                conditions.RangeVar.WhereConditions[i].NonIndexCondition = ExpressionLogical.AndExpressions(expression3, conditions.RangeVar.WhereConditions[i].NonIndexCondition);
                            }
                        }
                    }
                    else
                    {
                        conditions.AddCondition(expression3);
                    }
                }
                num3++;
            }
        }