diff --git a/src/NHibernate/Criterion/Distinct.cs b/src/NHibernate/Criterion/Distinct.cs index 993f403167a..60adf13f4af 100644 --- a/src/NHibernate/Criterion/Distinct.cs +++ b/src/NHibernate/Criterion/Distinct.cs @@ -17,8 +17,7 @@ public Distinct(IProjection proj) public virtual SqlString ToSqlString(ICriteria criteria, int position, ICriteriaQuery criteriaQuery) { - return new SqlString("distinct ") - .Append(projection.ToSqlString(criteria, position, criteriaQuery)); + return new SqlString("distinct ", projection.ToSqlString(criteria, position, criteriaQuery)); } public virtual SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) @@ -77,4 +76,4 @@ public override string ToString() return "distinct " + projection.ToString(); } } -} \ No newline at end of file +} diff --git a/src/NHibernate/Criterion/Order.cs b/src/NHibernate/Criterion/Order.cs index 6f1e466a0e7..de1bc797257 100644 --- a/src/NHibernate/Criterion/Order.cs +++ b/src/NHibernate/Criterion/Order.cs @@ -40,12 +40,9 @@ public virtual SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteria { if (projection != null) { - SqlString sb = SqlString.Empty; - SqlString produced = this.projection.ToSqlString(criteria, 0, criteriaQuery); + SqlString produced = projection.ToSqlString(criteria, 0, criteriaQuery); SqlString truncated = SqlStringHelper.RemoveAsAliasesFromSql(produced); - sb = sb.Append(truncated); - sb = sb.Append(ascending ? " asc" : " desc"); - return sb; + return new SqlString(truncated, ascending ? " asc" : " desc"); } string[] columns = criteriaQuery.GetColumnAliasesUsingProjection(criteria, propertyName); diff --git a/src/NHibernate/Criterion/SubqueryProjection.cs b/src/NHibernate/Criterion/SubqueryProjection.cs index c7a68afdbfc..763af33fc50 100644 --- a/src/NHibernate/Criterion/SubqueryProjection.cs +++ b/src/NHibernate/Criterion/SubqueryProjection.cs @@ -42,7 +42,7 @@ public override IType[] GetTypes(ICriteria criteria, ICriteriaQuery criteriaQuer public override SqlString ToSqlString(ICriteria criteria, int loc, ICriteriaQuery criteriaQuery) { return _subQuery.ToSqlString(criteria, criteriaQuery) - .Append(new SqlString(" as y", loc.ToString(), "_")); + .Append(" as y", loc.ToString(), "_"); } public override SqlString ToGroupSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery) diff --git a/src/NHibernate/Dialect/PostgreSQL81Dialect.cs b/src/NHibernate/Dialect/PostgreSQL81Dialect.cs index 81b062bafdd..77953561029 100644 --- a/src/NHibernate/Dialect/PostgreSQL81Dialect.cs +++ b/src/NHibernate/Dialect/PostgreSQL81Dialect.cs @@ -111,7 +111,7 @@ public override SqlString AppendIdentitySelectToInsert(SqlString insertSql) public override SqlString AppendIdentitySelectToInsert(SqlString insertString, string identifierColumnName) { - return insertString.Append(" returning ").Append(identifierColumnName); + return insertString.Append(" returning ", identifierColumnName); } public override bool SupportsInsertSelectIdentity diff --git a/src/NHibernate/Dialect/PostgreSQLDialect.cs b/src/NHibernate/Dialect/PostgreSQLDialect.cs index d1353bb037b..b81c2df86a8 100644 --- a/src/NHibernate/Dialect/PostgreSQLDialect.cs +++ b/src/NHibernate/Dialect/PostgreSQLDialect.cs @@ -177,7 +177,7 @@ public override string GetDropSequenceString(string sequenceName) public override SqlString AddIdentifierOutParameterToInsert(SqlString insertString, string identifierColumnName, string parameterName) { - return insertString.Append(" returning ").Append(identifierColumnName); + return insertString.Append(" returning ", identifierColumnName); } public override InsertGeneratedIdentifierRetrievalMethod InsertGeneratedIdentifierRetrievalMethod diff --git a/src/NHibernate/Driver/BasicResultSetsCommand.cs b/src/NHibernate/Driver/BasicResultSetsCommand.cs index 36e6a8a8485..748698adfa8 100644 --- a/src/NHibernate/Driver/BasicResultSetsCommand.cs +++ b/src/NHibernate/Driver/BasicResultSetsCommand.cs @@ -22,7 +22,7 @@ public BasicResultSetsCommand(ISessionImplementor session) { Commands = new List(); Session = session; - _statementTerminator = session.Factory.Dialect.StatementTerminator.ToString(); + _statementTerminator = session.Factory.Dialect.StatementTerminator.ToString() + Environment.NewLine; } protected List Commands { get; private set; } @@ -32,7 +32,7 @@ public BasicResultSetsCommand(ISessionImplementor session) public virtual void Append(ISqlCommand command) { Commands.Add(command); - sqlString = sqlString.Append(command.Query).Append(_statementTerminator).Append(Environment.NewLine); + sqlString = sqlString.Append(command.Query, _statementTerminator); } public bool HasQueries diff --git a/src/NHibernate/Engine/JoinSequence.cs b/src/NHibernate/Engine/JoinSequence.cs index 8d5a20b15ab..12520798f46 100644 --- a/src/NHibernate/Engine/JoinSequence.cs +++ b/src/NHibernate/Engine/JoinSequence.cs @@ -204,7 +204,7 @@ internal virtual JoinFragment ToJoinFragment( { if (join.Alias.Equals(withClauseJoinAlias)) { - condition = condition.Append(" and ").Append(withClauseFragment); + condition = condition.Append(" and ", withClauseFragment); } } diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs index 21040c961bc..99d7d69e54b 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs @@ -30,12 +30,16 @@ internal override JoinFragment ToJoinFragment( { var joinFragment = new ANSIJoinFragment(); - var on = withClauseFragment ?? new SqlString(); - var filters = _entityType.GetOnCondition(_tableAlias, Factory, enabledFilters); - if (!string.IsNullOrEmpty(filters)) - { - on.Append(" and ").Append(filters); - } + var on = withClauseFragment ?? SqlString.Empty; + //Note: filters logic commented due to following issues + //1) Original code is non functional as SqlString is immutable and so all Append results are lost. Correct code would look like: on = on.Append(filters); + //2) Also it seems GetOnCondition always returns empty string for entity join (as IsReferenceToPrimaryKey is always true). + // So if filters for entity join really make sense we need to inline GetOnCondition part that retrieves filters +// var filters = _entityType.GetOnCondition(_tableAlias, Factory, enabledFilters); +// if (!string.IsNullOrEmpty(filters)) +// { +// on.Append(" and ").Append(filters); +// } joinFragment.AddJoin(_tableName, _tableAlias, Array.Empty(), Array.Empty(), _joinType, on); return joinFragment; } diff --git a/src/NHibernate/Loader/JoinWalker.cs b/src/NHibernate/Loader/JoinWalker.cs index 5e1398f4607..23aae65620b 100644 --- a/src/NHibernate/Loader/JoinWalker.cs +++ b/src/NHibernate/Loader/JoinWalker.cs @@ -805,7 +805,7 @@ protected SqlString MergeOrderings(SqlString ass, SqlString orderBy) else if (orderBy.Length == 0) return ass; else - return ass.Append(StringHelper.CommaSpace).Append(orderBy); + return ass.Append(StringHelper.CommaSpace, orderBy); } protected SqlString MergeOrderings(string ass, SqlString orderBy) { diff --git a/src/NHibernate/Loader/OuterJoinableAssociation.cs b/src/NHibernate/Loader/OuterJoinableAssociation.cs index 106ef7dd067..a5c52587e23 100644 --- a/src/NHibernate/Loader/OuterJoinableAssociation.cs +++ b/src/NHibernate/Loader/OuterJoinableAssociation.cs @@ -49,7 +49,7 @@ public OuterJoinableAssociation(IAssociationType joinableType, String lhsAlias, rhsColumns = JoinHelper.GetRHSColumnNames(joinableType, factory); on = new SqlString(joinableType.GetOnCondition(rhsAlias, factory, enabledFilters)); if (SqlStringHelper.IsNotEmpty(withClause)) - on = on.Append(" and ( ").Append(withClause).Append(" )"); + on = on.Append(" and ( ", withClause, " )"); this.enabledFilters = enabledFilters; // needed later for many-to-many/filter application } @@ -166,7 +166,7 @@ public void AddManyToManyJoin(JoinFragment outerjoin, IQueryableCollection colle SqlString condition = string.Empty.Equals(manyToManyFilter) ? on : SqlStringHelper.IsEmpty(on) ? new SqlString(manyToManyFilter) : - on.Append(" and ").Append(manyToManyFilter); + on.Append(" and ", manyToManyFilter); outerjoin.AddJoin(joinable.TableName, rhsAlias, lhsColumns, rhsColumns, joinType, condition); outerjoin.AddJoins(joinable.FromJoinFragment(rhsAlias, false, true), diff --git a/src/NHibernate/SqlCommand/SqlString.cs b/src/NHibernate/SqlCommand/SqlString.cs index 71870969fa5..86aeb3bbc41 100644 --- a/src/NHibernate/SqlCommand/SqlString.cs +++ b/src/NHibernate/SqlCommand/SqlString.cs @@ -347,7 +347,23 @@ public SqlString Append(string text) { if (string.IsNullOrEmpty(text)) return this; if (_length == 0) return new SqlString(text); - return new SqlString(new object[] { this, text }); + return new SqlString(this, text); + } + + public SqlString Append(params object[] parts) + { + return _length == 0 + ? new SqlString(parts) + : new SqlString(GetAppendParts(parts)); + } + + private IEnumerable GetAppendParts(object[] parts) + { + yield return this; + foreach (var part in parts) + { + yield return part; + } } /// diff --git a/src/NHibernate/SqlCommand/SqlUpdateBuilder.cs b/src/NHibernate/SqlCommand/SqlUpdateBuilder.cs index def92f8fe50..809b22ee0d8 100644 --- a/src/NHibernate/SqlCommand/SqlUpdateBuilder.cs +++ b/src/NHibernate/SqlCommand/SqlUpdateBuilder.cs @@ -134,7 +134,7 @@ private void AddColumnWithValueOrType(string columnName, object valueOrType) public SqlUpdateBuilder AppendAssignmentFragment(SqlString fragment) { // SqlString is immutable - assignments = assignments == null ? fragment : assignments.Append(", ").Append(fragment); + assignments = assignments == null ? fragment : assignments.Append(", ", fragment); return this; }