public static int Delete(this IMutableTable table, ITable other, int limit)
        {
            List<int> rowSet = new List<int>(other.RowCount);
            var e = other.GetEnumerator();
            while (e.MoveNext()) {
                rowSet.Add(e.Current.RowId.RowNumber);
            }

            // HACKY: Find the first column of this table in the search table.  This
            //   will allow us to generate a row set of only the rows in the search
            //   table.
            int firstColumn = other.IndexOfColumn(table.GetResolvedColumnName(0));

            if (firstColumn == -1)
                throw new DatabaseSystemException("Search table does not contain any reference to table being deleted from");

            // Generate a row set that is in this tables domain.
            var rowsToDelete = other.ResolveRows(firstColumn, rowSet, table).ToList();

            // row_set may contain duplicate row indices, therefore we must sort so
            // any duplicates are grouped and therefore easier to find.
            rowSet.Sort();

            // If limit less than zero then limit is whole set.
            if (limit < 0)
                limit = Int32.MaxValue;

            // Remove each row in row set in turn.  Make sure we don't remove the
            // same row index twice.
            int len = System.Math.Min(rowsToDelete.Count, limit);
            int lastRemoved = -1;
            int removeCount = 0;
            for (int i = 0; i < len; ++i) {
                int toRemove = rowsToDelete[i];
                if (toRemove < lastRemoved)
                    throw new DatabaseSystemException("Internal error: row sorting error or row set not in the range > 0");

                if (toRemove != lastRemoved) {
                    table.RemoveRow(toRemove);
                    lastRemoved = toRemove;
                    ++removeCount;
                }
            }

            if (removeCount > 0)
                // Perform a referential integrity check on any changes to the table.
                table.AssertConstraints();

            return removeCount;
        }
        public static int Update(this IMutableTable mutableTable, IQueryContext context, ITable table,
			IEnumerable<SqlAssignExpression> assignList, int limit)
        {
            // Get the rows from the input table.
            var rowSet = new List<int>();
            var e = table.GetEnumerator();
            while (e.MoveNext()) {
                rowSet.Add(e.Current.RowId.RowNumber);
            }

            // HACKY: Find the first column of this table in the search table.  This
            //   will allow us to generate a row set of only the rows in the search
            //   table.
            int firstColumn = table.FindColumn(mutableTable.GetResolvedColumnName(0));
            if (firstColumn == -1)
                throw new InvalidOperationException("Search table does not contain any " +
                                            "reference to table being updated from");

            // Convert the row_set to this table's domain.
            rowSet = table.ResolveRows(firstColumn, rowSet, mutableTable).ToList();

            // NOTE: Assume there's no duplicate rows.

            // If limit less than zero then limit is whole set.
            if (limit < 0)
                limit = Int32.MaxValue;

            // Update each row in row set in turn up to the limit.
            int len = System.Math.Min(rowSet.Count, limit);

            int updateCount = 0;
            for (int i = 0; i < len; ++i) {
                int toUpdate = rowSet[i];

                // Make a row object from this row (plus keep the original intact
                // in case we need to roll back to it).
                var row = mutableTable.GetRow(toUpdate);
                row.SetFromTable();

                // Run each assignment on the row.
                foreach (var assignment in assignList) {
                    row.EvaluateAssignment(assignment, context);
                }

                // Update the row
                mutableTable.UpdateRow(row);

                ++updateCount;
            }

            if (updateCount > 0)
                // Perform a referential integrity check on any changes to the table.
                mutableTable.AssertConstraints();

            return updateCount;
        }