public DeleteStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, OutputClause outputClause, Optional<FromClause> fromClause, Optional<Predicate> whereClause, QueryHint queryHint) {
			this.queryOptions = queryOptions;
			this.topExpression = topExpression;
			this.destinationRowset = destinationRowset;
			this.outputClause = outputClause;
			this.fromClause = fromClause;
			this.whereClause = whereClause;
			this.queryHint = queryHint;
		}
		public MergeStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, RowsetAlias destinationAlias, SourceRowset sourceRowset, Predicate predicate, Sequence<MergeWhenMatched> mergeWhenMatcheds, OutputClause outputClause, QueryHint queryHint) {
			this.queryOptions = queryOptions;
			this.topExpression = topExpression;
			this.destinationRowset = destinationRowset;
			this.destinationAlias = destinationAlias;
			this.sourceRowset = sourceRowset;
			this.predicate = predicate;
			whenMatchedCollection = mergeWhenMatcheds.ToList();
			this.outputClause = outputClause;
			this.queryHint = queryHint;
		}
		public UpdateStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, Sequence<UpdateItem> updateItems, OutputClause outputClause, Optional<FromClause> fromClause, Optional<Predicate> whereClause, QueryHint queryHint) {
			Debug.Assert(destinationRowset != null);
			this.queryOptions = queryOptions;
			this.topExpression = topExpression;
			this.destinationRowset = destinationRowset;
			this.updateItems = updateItems.ToList();
			this.outputClause = outputClause;
			this.fromClause = fromClause;
			this.whereClause = whereClause;
			this.queryHint = queryHint;
		}
		public InsertDefaultsStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, QueryHint queryHint): base(queryOptions, topExpression, destinationRowset, queryHint) {}
		public InsertExecuteValuesStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, Optional<Sequence<ColumnName>> columnNames, OutputClause output, ExecuteStatement executeStatement, QueryHint queryHint)
				: base(queryOptions, topExpression, destinationRowset, columnNames, output, queryHint) {
			Debug.Assert(executeStatement != null);
			this.executeStatement = executeStatement;
		}
		public SelectStatement(QueryOptions queryOptions, SelectQuery selectQuery, QueryHint queryHint) {
			Debug.Assert(selectQuery != null);
			this.queryOptions = queryOptions;
			this.selectQuery = selectQuery;
			this.queryHint = queryHint;
		}
		protected InsertValuesStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, Optional<Sequence<ColumnName>> columnNames, OutputClause output, QueryHint queryHint): base(queryOptions, topExpression, destinationRowset, queryHint) {
			Debug.Assert(output != null);
			this.columnNames = columnNames.ToList();
			this.output = output;
		}
		public InsertSelectValuesStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, Optional<Sequence<ColumnName>> columnNames, OutputClause output, SelectQuery selectQuery, QueryHint queryHint)
				: base(queryOptions, topExpression, destinationRowset, columnNames, output, queryHint) {
			Debug.Assert(selectQuery != null);
			this.selectQuery = selectQuery;
		}
		protected InsertStatement(QueryOptions queryOptions, TopExpression topExpression, DestinationRowset destinationRowset, QueryHint queryHint) {
			this.queryOptions = queryOptions;
			this.topExpression = topExpression;
			this.destinationRowset = destinationRowset;
			this.queryHint = queryHint;
		}