Skip to content

Commit

Permalink
Improved error highlighting after internal rewriting
Browse files Browse the repository at this point in the history
  • Loading branch information
MarkMpn committed Aug 26, 2024
1 parent c6f5520 commit bd04351
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 28 deletions.
2 changes: 1 addition & 1 deletion MarkMpn.Sql4Cds.Engine.Tests/CteTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -480,7 +480,7 @@ WITH cte (id, fname, lname) AS (
Assert.AreEqual("lname", select.ColumnSet[2].OutputColumn);
Assert.AreEqual("contact.lastname", select.ColumnSet[2].SourceColumn);
var compute = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual("contact.firstname + ''", compute.Columns["Expr1"].ToSql());
Assert.AreEqual("contact.firstname + ''", compute.Columns["Expr1"].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(compute.Source);
AssertFetchXml(fetch, @"
<fetch>
Expand Down
50 changes: 25 additions & 25 deletions MarkMpn.Sql4Cds.Engine.Tests/ExecutionPlanTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1055,7 +1055,7 @@ public void ComputeScalarSelect()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(1, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns["Expr1"].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns["Expr1"].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(computeScalar.Source);
AssertFetchXml(fetch, @"
<fetch>
Expand Down Expand Up @@ -1110,8 +1110,8 @@ public void SelectSubqueryWithMergeJoin()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr3.name", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr3.name", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(computeScalar.Source);
AssertFetchXml(fetch, @"
<fetch>
Expand Down Expand Up @@ -1143,8 +1143,8 @@ public void SelectSubqueryWithNestedLoop()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual("@Expr2", nestedLoop.OuterReferences["contact.createdon"]);
var fetch = AssertNode<FetchXmlScan>(nestedLoop.LeftSource);
Expand Down Expand Up @@ -1236,8 +1236,8 @@ public void SelectSubqueryWithSmallNestedLoop()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual("@Expr2", nestedLoop.OuterReferences["contact.createdon"]);
var fetch = AssertNode<FetchXmlScan>(nestedLoop.LeftSource);
Expand Down Expand Up @@ -1281,8 +1281,8 @@ public void SelectSubqueryWithNonCorrelatedNestedLoop()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr2", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr2", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual(QualifiedJoinType.LeftOuter, nestedLoop.JoinType);
Assert.IsTrue(nestedLoop.SemiJoin);
Expand Down Expand Up @@ -1323,8 +1323,8 @@ public void SelectSubqueryWithCorrelatedSpooledNestedLoop()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual(QualifiedJoinType.LeftOuter, nestedLoop.JoinType);
Assert.IsTrue(nestedLoop.SemiJoin);
Expand Down Expand Up @@ -1374,8 +1374,8 @@ public void SelectSubqueryWithPartiallyCorrelatedSpooledNestedLoop()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr3", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual(QualifiedJoinType.LeftOuter, nestedLoop.JoinType);
Assert.IsTrue(nestedLoop.SemiJoin);
Expand Down Expand Up @@ -1427,8 +1427,8 @@ public void SelectSubqueryUsingOuterReferenceInSelectClause()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(2, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("'Account: ' + Expr5", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
Assert.AreEqual("'Account: ' + Expr5", computeScalar.Columns[select.ColumnSet[1].SourceColumn].ToNormalizedSql());
var nestedLoop = AssertNode<NestedLoopNode>(computeScalar.Source);
Assert.AreEqual("@Expr2", nestedLoop.OuterReferences["contact.parentcustomerid"]);
Assert.AreEqual("@Expr3", nestedLoop.OuterReferences["contact.firstname"]);
Expand Down Expand Up @@ -1516,7 +1516,7 @@ public void WhereSubquery()
var select = AssertNode<SelectNode>(plans[0]);
var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual(1, computeScalar.Columns.Count);
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToSql());
Assert.AreEqual("contact.firstname + ' ' + contact.lastname", computeScalar.Columns[select.ColumnSet[0].SourceColumn].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(computeScalar.Source);
AssertFetchXml(fetch, @"
<fetch>
Expand Down Expand Up @@ -2933,7 +2933,7 @@ FROM metadata.entity
var meta = AssertNode<MetadataQueryNode>(filter.Source);

// We don't know the case of the schema name, so need to do this condition in a filter node to do it case insensitively
Assert.AreEqual("entity.schemaname = 'Account'", filter.Filter.ToSql());
Assert.AreEqual("entity.schemaname = 'Account'", filter.Filter.ToNormalizedSql());

// We know logical names are lower case so we can fold this part of the filter into the data source.
Assert.AreEqual(MetadataSource.Entity, meta.MetadataSource);
Expand Down Expand Up @@ -3653,7 +3653,7 @@ GROUP BY firstname
var innerAlias = AssertNode<AliasNode>(innerSort.Source);
Assert.AreEqual("Expr1", innerAlias.Alias);
var innerFilter = AssertNode<FilterNode>(innerAlias.Source);
Assert.AreEqual("count > 1", innerFilter.Filter.ToSql());
Assert.AreEqual("count > 1", innerFilter.Filter.ToNormalizedSql());
var innerTry1 = AssertNode<TryCatchNode>(innerFilter.Source);
var innerTry2 = AssertNode<TryCatchNode>(innerTry1.TrySource);
var innerAggregateFetch = AssertNode<FetchXmlScan>(innerTry2.TrySource);
Expand Down Expand Up @@ -3804,10 +3804,10 @@ public void MetadataExpressions()
Assert.AreEqual("Expr1", select.ColumnSet[0].SourceColumn);

var computeScalar = AssertNode<ComputeScalarNode>(select.Source);
Assert.AreEqual("entity.collectionschemaname + '.' + entity.entitysetname", computeScalar.Columns["Expr1"].ToSql());
Assert.AreEqual("entity.collectionschemaname + '.' + entity.entitysetname", computeScalar.Columns["Expr1"].ToNormalizedSql());

var filter = AssertNode<FilterNode>(computeScalar.Source);
Assert.AreEqual("entity.description LIKE '%test%'", filter.Filter.ToSql());
Assert.AreEqual("entity.description LIKE '%test%'", filter.Filter.ToNormalizedSql());

var metadataQuery = AssertNode<MetadataQueryNode>(filter.Source);
Assert.AreEqual(MetadataSource.Entity, metadataQuery.MetadataSource);
Expand Down Expand Up @@ -4185,7 +4185,7 @@ public void OrderBySelectExpression()
var sort = AssertNode<SortNode>(select.Source);
Assert.AreEqual("Expr1", sort.Sorts.Single().ToSql());
var compute = AssertNode<ComputeScalarNode>(sort.Source);
Assert.AreEqual("account.name + 'foo'", compute.Columns["Expr1"].ToSql());
Assert.AreEqual("account.name + 'foo'", compute.Columns["Expr1"].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(compute.Source);
AssertFetchXml(fetch, @"
<fetch>
Expand Down Expand Up @@ -5443,7 +5443,7 @@ public void DistinctOrderByOptionSet()
Assert.AreEqual(1, plans.Length);
var select = AssertNode<SelectNode>(plans[0]);
var sort = AssertNode<SortNode>(select.Source);
Assert.AreEqual("new_customentity.new_optionsetvalue", sort.Sorts[0].ToSql());
Assert.AreEqual("new_customentity.new_optionsetvalue", sort.Sorts[0].ToNormalizedSql());
var fetch = AssertNode<FetchXmlScan>(sort.Source);

AssertFetchXml(fetch, @"
Expand Down Expand Up @@ -6482,7 +6482,7 @@ FROM account AS sub
Assert.AreEqual(AggregateType.CountStar, aggregate.Aggregates["count"].AggregateType);

var filter = AssertNode<FilterNode>(aggregate.Source);
Assert.AreEqual("sub.employees <= @Expr1", filter.Filter.ToSql());
Assert.AreEqual("sub.employees <= @Expr1", filter.Filter.ToNormalizedSql());

var indexSpool = AssertNode<IndexSpoolNode>(filter.Source);
Assert.AreEqual("@Expr2", indexSpool.SeekValue);
Expand Down Expand Up @@ -7327,9 +7327,9 @@ cross apply (select name + '' as n) x
Assert.AreEqual("Expr2", alias.ColumnSet.Single().SourceColumn);
Assert.AreEqual("n", alias.ColumnSet.Single().OutputColumn);
var filter = AssertNode<FilterNode>(alias.Source);
Assert.AreEqual("Expr2 = 'a'", filter.Filter.ToSql());
Assert.AreEqual("Expr2 = 'a'", filter.Filter.ToNormalizedSql());
var computeScalar = AssertNode<ComputeScalarNode>(filter.Source);
Assert.AreEqual("@Expr1 + ''", computeScalar.Columns["Expr2"].ToSql());
Assert.AreEqual("@Expr1 + ''", computeScalar.Columns["Expr2"].ToNormalizedSql());
var constantScan = AssertNode<ConstantScanNode>(computeScalar.Source);
Assert.AreEqual(1, constantScan.Values.Count);
}
Expand Down
2 changes: 1 addition & 1 deletion MarkMpn.Sql4Cds.Engine.Tests/Sql2FetchXmlTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2035,7 +2035,7 @@ public void GlobalOptionSet()
Assert.AreEqual(1, selectNode.ColumnSet.Count);
Assert.AreEqual("globaloptionset.displayname", selectNode.ColumnSet[0].SourceColumn);
var filterNode = (FilterNode)selectNode.Source;
Assert.AreEqual("globaloptionset.name = 'test'", filterNode.Filter.ToSql());
Assert.AreEqual("globaloptionset.name = 'test'", filterNode.Filter.ToNormalizedSql());
var optionsetNode = (GlobalOptionSetQueryNode)filterNode.Source;

var dataReader = selectNode.Execute(new NodeExecutionContext(GetDataSources(_context), this, new Dictionary<string, DataTypeReference>(), new Dictionary<string, INullable>(), null), CommandBehavior.Default);
Expand Down
2 changes: 1 addition & 1 deletion MarkMpn.Sql4Cds.Engine/Visitors/RewriteVisitorBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ private string ReplaceExpression<T>(T target, Expression<Func<T, ScalarExpressio
if (expression != replaced)
{
property.SetValue(target, replaced);
target.ScriptTokenStream = null;
//target.ScriptTokenStream = null;
}

return name;
Expand Down

0 comments on commit bd04351

Please sign in to comment.