Пример #1
0
        public ISyntaxNode Visit(TSqlFragment node, TSqlFragment parent, string sourceProperty, ISyntaxNode result)
        {
            DeleteSpecification delete = node as DeleteSpecification;

            if (delete == null)
            {
                return(result);
            }

            StatementNode statement = new StatementNode()
            {
                Parent         = result,
                Fragment       = node,
                ParentFragment = parent,
                TargetProperty = sourceProperty
            };

            if (result is ScriptNode script)
            {
                if (parent is DeleteStatement)
                {
                    script.Statements.Add(statement);
                    return(statement);
                }
            }
            return(result);
        }
Пример #2
0
        public override void Visit(DeleteSpecification node)
        {
            if (node.WhereClause != null)
            {
                return;
            }

            errorCallback(RULE_NAME, RULE_TEXT, node.StartLine, GetColumnNumber(node));
        }
Пример #3
0
        public override void Visit(DeleteSpecification node)
        {
            base.Visit(node);

            if (node.WhereClause == null)
            {
                AddFinding(node, "DELETE without WHERE clause.");
            }
        }
Пример #4
0
        public static EngineResult Evaluate(DataModificationSpecification dml, Scope scope)
        {
            IOutputSink sink;

            // TODO: support scalar expressions in TableOutputSink, not just column names
            //       how to handle INSERTED. and DELETED. aliases?

            if (dml.OutputClause != null || dml.OutputIntoClause != null)
            {
                sink = new TableOutputSink(
                    (dml.OutputClause?.SelectColumns ?? dml.OutputIntoClause?.SelectColumns)?
                    .Select(s => new Column
                {
                    Name = ((ColumnReferenceExpression)((SelectScalarExpression)s).Expression)
                           .MultiPartIdentifier.Identifiers.Select(x => x.Value).ToArray(),
                    Type = DbType.AnsiString
                }).ToList());
            }
            else
            {
                sink = new NullOutputSink();
            }

            var result = dml switch
            {
                InsertSpecification insert => Evaluate(insert, sink, scope),
                MergeSpecification merge => Evaluate(merge, sink, scope),
                DeleteSpecification delete => Evaluate(delete, sink, scope),
                UpdateSpecification update => Evaluate(update, sink, scope),
                _ => throw FeatureNotSupportedException.Subtype(dml)
            };

            if (dml.OutputIntoClause != null)
            {
                var(table, scope2) = Evaluate(dml.OutputIntoClause.IntoTable, null, scope);
                Evaluate(
                    table,
                    dml.OutputIntoClause.IntoTableColumns,
                    ((TableOutputSink)sink).Output,
                    new NullOutputSink(),
                    scope2);
            }

            return(dml.OutputClause != null
                ? new EngineResult(((TableOutputSink)sink).Output)
                : result);
        }
    }
Пример #5
0
        public override void Visit(DeleteSpecification node)
        {
            WhereClause lol = node.WhereClause;

            if (lol != null)
            {
                if (!GetNodeTokenText(lol).ToLower().Contains("select"))
                {
                    seperate(GetNodeTokenText(lol).ToLower().Replace("where", ""));
                }
                else
                {
                    seperate(GetNodeTokenText(lol).ToLower().Substring(6, GetNodeTokenText(lol).Length - 6));
                }
            }
        }
Пример #6
0
        public static EngineResult Evaluate(DeleteSpecification delete, IOutputSink sink, Scope scope)
        {
            var tableRef = (NamedTableReference)delete.Target;
            var table    = scope.Env.Tables[tableRef.SchemaObject.BaseIdentifier.Value];
            var rowCount = 0;

            foreach (var row in table.Rows.ToList())
            {
                if (delete.WhereClause == null ||
                    Evaluate(delete.WhereClause.SearchCondition, new RowArgument(row), scope))
                {
                    table.Rows.Remove(row);
                    rowCount++;
                }

                sink.Deleted(row, scope.Env);
            }

            scope.Env.RowCount = rowCount;
            return(new EngineResult(rowCount));
        }
Пример #7
0
        protected override object InternalVisit(DeleteSpecification node)
        {
            //TODO:node.FromClause;
            //TODO:node.OutputIntoClause;

            var env = Database.GlobalEnvironment.NewChild();

            var table     = (Table)Visit <IResultTable>(node.Target);
            var top       = EvaluateExpression <TopResult>(node.TopRowFilter, env);
            var predicate = EvaluateExpression <Func <Row, bool> >(node.WhereClause, env, row => true);

            var rows = Filter.From(table.Rows, predicate, top).ToArray();

            foreach (Row item in rows)
            {
                // TODO(Richo): What happens if one of these throws an error?
                item.Delete();
            }
            table.AcceptChanges();
            return(new SQLExecutionResult(rows.Count(),
                                          ApplyOutputClause(new RecordTable("DELETED", table.Columns, rows), node.OutputClause)));
        }
Пример #8
0
        private string buildChunkedDelete(DeleteSpecification delete)
        {

            var counter = new DeclareVariableStatement();
            var counterVariable = new DeclareVariableElement();
            counterVariable.DataType = new SqlDataTypeReference() {SqlDataTypeOption = SqlDataTypeOption.Int};
            counterVariable.VariableName = new Identifier() {Value = "@rowcount"};
            counterVariable.Value = new IntegerLiteral() {Value = "10000"};
            counter.Declarations.Add(counterVariable);
            
            delete.TopRowFilter = new TopRowFilter();
            delete.TopRowFilter.Expression = new ParenthesisExpression() {Expression = new IntegerLiteral() {Value = "10000"} };

            var setCounter = new SetVariableStatement();
            setCounter.Variable = new VariableReference() {Name = "@rowcount"};
            setCounter.Expression = new GlobalVariableExpression() {Name = "@@rowcount"};
            setCounter.AssignmentKind = AssignmentKind.Equals;

            var deleteStatement = new DeleteStatement();
            deleteStatement.DeleteSpecification = delete;

            var beginEnd = new BeginEndBlockStatement();
            beginEnd.StatementList = new StatementList();
            beginEnd.StatementList.Statements.Add(deleteStatement);
            beginEnd.StatementList.Statements.Add(setCounter);

            var whilePredicate = new BooleanComparisonExpression();
            whilePredicate.ComparisonType = BooleanComparisonType.GreaterThan;
            whilePredicate.FirstExpression = new VariableReference() {Name = "@rowcount"};
            whilePredicate.SecondExpression = new IntegerLiteral() {Value = "0"};

            var whileStatement = new WhileStatement();
            whileStatement.Predicate = whilePredicate;
            whileStatement.Statement = beginEnd;
            
            var text = ScriptDom.GenerateTSql(counter) + "\r\n" + ScriptDom.GenerateTSql(whileStatement);

            return text;
        }
Пример #9
0
        private WSqlStatement ParseDeleteStatement(DeleteSpecification delSpec)
        {
            if (delSpec == null)
                return null;

            var wdelSpec = new WDeleteSpecification
            {
                Target = ParseTableReference(delSpec.Target),
                FirstTokenIndex = delSpec.FirstTokenIndex,
                LastTokenIndex = delSpec.LastTokenIndex
            };

            //From Clause
            if (delSpec.FromClause != null && delSpec.FromClause.TableReferences != null)
            {
                wdelSpec.FromClause = new WFromClause
                {
                    FirstTokenIndex = delSpec.FromClause.FirstTokenIndex,
                    LastTokenIndex = delSpec.FromClause.LastTokenIndex,
                    TableReferences = new List<WTableReference>(delSpec.FromClause.TableReferences.Count)
                };
                foreach (var pref in delSpec.FromClause.TableReferences.Select(ParseTableReference).Where(pref => pref != null))
                {
                    wdelSpec.FromClause.TableReferences.Add(pref);
                }
            }

            //where clause
            if (delSpec.WhereClause != null && delSpec.WhereClause.SearchCondition != null)
            {
                wdelSpec.WhereClause = new WWhereClause
                {
                    FirstTokenIndex = delSpec.WhereClause.FirstTokenIndex,
                    LastTokenIndex = delSpec.WhereClause.LastTokenIndex,
                    SearchCondition = ParseBooleanExpression(delSpec.WhereClause.SearchCondition)
                };
            }

            //top row filter
            if (delSpec.TopRowFilter != null)
            {
                wdelSpec.TopRowFilter = new WTopRowFilter
                {
                    Expression = ParseScalarExpression(delSpec.TopRowFilter.Expression),
                    Percent = delSpec.TopRowFilter.Percent,
                    WithTies = delSpec.TopRowFilter.WithTies,
                    FirstTokenIndex = delSpec.TopRowFilter.FirstTokenIndex,
                    LastTokenIndex = delSpec.TopRowFilter.LastTokenIndex
                };
            }

            return wdelSpec;
        }
Пример #10
0
 public override void Visit(DeleteSpecification node) { this.action(node); }
 public override void ExplicitVisit(DeleteSpecification fragment)
 {
     _fragments.Add(fragment);
 }
Пример #12
0
        private string buildChunkedDelete(DeleteSpecification delete)
        {
            var counter         = new DeclareVariableStatement();
            var counterVariable = new DeclareVariableElement();

            counterVariable.DataType = new SqlDataTypeReference()
            {
                SqlDataTypeOption = SqlDataTypeOption.Int
            };
            counterVariable.VariableName = new Identifier()
            {
                Value = "@rowcount"
            };
            counterVariable.Value = new IntegerLiteral()
            {
                Value = "10000"
            };
            counter.Declarations.Add(counterVariable);

            delete.TopRowFilter            = new TopRowFilter();
            delete.TopRowFilter.Expression = new ParenthesisExpression()
            {
                Expression = new IntegerLiteral()
                {
                    Value = "10000"
                }
            };

            var setCounter = new SetVariableStatement();

            setCounter.Variable = new VariableReference()
            {
                Name = "@rowcount"
            };
            setCounter.Expression = new GlobalVariableExpression()
            {
                Name = "@@rowcount"
            };
            setCounter.AssignmentKind = AssignmentKind.Equals;

            var deleteStatement = new DeleteStatement();

            deleteStatement.DeleteSpecification = delete;

            var beginEnd = new BeginEndBlockStatement();

            beginEnd.StatementList = new StatementList();
            beginEnd.StatementList.Statements.Add(deleteStatement);
            beginEnd.StatementList.Statements.Add(setCounter);

            var whilePredicate = new BooleanComparisonExpression();

            whilePredicate.ComparisonType  = BooleanComparisonType.GreaterThan;
            whilePredicate.FirstExpression = new VariableReference()
            {
                Name = "@rowcount"
            };
            whilePredicate.SecondExpression = new IntegerLiteral()
            {
                Value = "0"
            };

            var whileStatement = new WhileStatement();

            whileStatement.Predicate = whilePredicate;
            whileStatement.Statement = beginEnd;

            var text = ScriptDom.GenerateTSql(counter) + "\r\n" + ScriptDom.GenerateTSql(whileStatement);

            return(text);
        }