//UPDATEやINSERTなどでSELECTを使用したときに発生するExplicitVisit public override void ExplicitVisit(QueryDerivedTable node) { TableNameIllegalCandidate candidate = CreateAndPushCandidate(); base.ExplicitVisit(node); PopAndSetIllegalStatement(candidate); }
private BooleanIsNullExpression GetIsNotNull() { var isNull = new BooleanIsNullExpression(); isNull.IsNot = true; var query = (isNull.Expression = new ScalarSubquery()) as ScalarSubquery; var spec = (query.QueryExpression = new QuerySpecification()) as QuerySpecification; spec.SelectElements.Add(new SelectStarExpression()); var fromTable = new QueryDerivedTable(); spec.FromClause = new FromClause(); spec.FromClause.TableReferences.Add(fromTable); var subQuerySpec = new QuerySpecification(); var version = new GlobalVariableExpression(); version.Name = "@@version"; var columnName = new IdentifierOrValueExpression(); //var v = (columnName.ValueExpression = new StringLiteral()) as StringLiteral; //v.Value = "v"; columnName.Identifier = new Identifier(); columnName.Identifier.Value = "v"; subQuerySpec.SelectElements.Add(new SelectScalarExpression {Expression = version, ColumnName = columnName}); fromTable.QueryExpression = subQuerySpec; fromTable.Alias = new Identifier {Value = "edition"}; spec.WhereClause = new WhereClause(); var likePredicate = (spec.WhereClause.SearchCondition = new LikePredicate()) as LikePredicate; var col = (likePredicate.FirstExpression = new ColumnReferenceExpression()) as ColumnReferenceExpression; col.ColumnType = ColumnType.Regular; col.MultiPartIdentifier = new MultiPartIdentifier(); col.MultiPartIdentifier.Identifiers.Add(new Identifier {Value = "v"}); var ver = (likePredicate.SecondExpression = new StringLiteral()) as StringLiteral; ver.Value = "%Enterprise%"; return isNull; }
protected override object InternalVisit(QueryDerivedTable node) { var realTable = Visit <SQLExecutionResult>(node.QueryExpression).Values; if (node.Alias != null) { return(new RecordTable(node.Alias.Value, realTable.Columns, realTable.Records)); } return(realTable); }
private BooleanIsNullExpression GetIsNotNull() { var isNull = new BooleanIsNullExpression(); isNull.IsNot = true; var query = (isNull.Expression = new ScalarSubquery()) as ScalarSubquery; var spec = (query.QueryExpression = new QuerySpecification()) as QuerySpecification; spec.SelectElements.Add(new SelectStarExpression()); var fromTable = new QueryDerivedTable(); spec.FromClause = new FromClause(); spec.FromClause.TableReferences.Add(fromTable); var subQuerySpec = new QuerySpecification(); var version = new GlobalVariableExpression(); version.Name = "@@version"; var columnName = new IdentifierOrValueExpression(); //var v = (columnName.ValueExpression = new StringLiteral()) as StringLiteral; //v.Value = "v"; columnName.Identifier = new Identifier(); columnName.Identifier.Value = "v"; subQuerySpec.SelectElements.Add(new SelectScalarExpression { Expression = version, ColumnName = columnName }); fromTable.QueryExpression = subQuerySpec; fromTable.Alias = new Identifier { Value = "edition" }; spec.WhereClause = new WhereClause(); var likePredicate = (spec.WhereClause.SearchCondition = new LikePredicate()) as LikePredicate; var col = (likePredicate.FirstExpression = new ColumnReferenceExpression()) as ColumnReferenceExpression; col.ColumnType = ColumnType.Regular; col.MultiPartIdentifier = new MultiPartIdentifier(); col.MultiPartIdentifier.Identifiers.Add(new Identifier { Value = "v" }); var ver = (likePredicate.SecondExpression = new StringLiteral()) as StringLiteral; ver.Value = "%Enterprise%"; return(isNull); }
private void ProcessTableReference(TableReference TableRef) { string Type = GetFragmentType(TableRef); switch (Type) { case "FullTextTableReference": break; case "NamedTableReference": var NamedTableRef = (NamedTableReference)TableRef; var Naming = NamedTableRef.SchemaObject; string ObjectName = (Naming.DatabaseIdentifier == null ? this.databaseName : Naming.DatabaseIdentifier.Value) + "." + (Naming.SchemaIdentifier == null ? this.schemaName : Naming.SchemaIdentifier.Value) + "." + (Naming.BaseIdentifier == null ? "" : Naming.BaseIdentifier.Value); addSourcetoCurrentObject(ObjectName); break; case "QueryDerivedTable": QueryDerivedTable qdt = (QueryDerivedTable)TableRef; ProcessQueryExpression(qdt.QueryExpression); break; case "QualifiedJoin": QualifiedJoin qj = (QualifiedJoin)TableRef; ProcessTableReference(qj.FirstTableReference); ProcessTableReference(qj.SecondTableReference); break; case "UnqualifiedJoin": UnqualifiedJoin uqj = (UnqualifiedJoin)TableRef; ProcessTableReference(uqj.FirstTableReference); ProcessTableReference(uqj.SecondTableReference); break; case "SchemaObjectFunctionTableReference": SchemaObjectFunctionTableReference ftr = (SchemaObjectFunctionTableReference)TableRef; break; case "PivotedTableReference": PivotedTableReference pvt = (PivotedTableReference)TableRef; ProcessTableReference(pvt.TableReference); break; default: break; } }
public QsiDerivedTableNode VisitQueryDerivedTable(QueryDerivedTable queryDerivedTable) { return(TreeHelper.Create <QsiDerivedTableNode>(n => { if (queryDerivedTable.Alias != null) { n.Alias.SetValue(CreateAliasNode(queryDerivedTable.Alias)); } n.Columns.SetValue(TreeHelper.CreateAllColumnsDeclaration()); n.Source.SetValue(VisitQueryExpression(queryDerivedTable.QueryExpression)); SqlServerTree.PutFragmentSpan(n, queryDerivedTable); })); }
internal gsFromTerm GetTable(QueryDerivedTable queryDerivedTable) { gsSubQueryFromTerm table = new gsSubQueryFromTerm(); table.TableAlias = Convert.ToString(queryDerivedTable.Alias.Value); if (queryDerivedTable.QueryExpression is QuerySpecification) { gsSelectQuery subQry = new gsSelectQuery(); QuerySpecification qrySpec = queryDerivedTable.QueryExpression as QuerySpecification; gsSelectQueryParser qryParser = new gsSelectQueryParser(); qryParser.ProcessQuerySpecification(qrySpec, subQry); table.SubQuery = subQry; } else { throw new NotImplementedException($"QuerySpecification {queryDerivedTable.QueryExpression.GetType().Name} not supported"); } return(table); }
private void recursifRecuperationProjection(QuerySpecification node) { bool starExpression = false; if (node.SelectElements != null) { foreach (TSqlFragment selectElement in node.SelectElements) { if (selectElement is SelectStarExpression) { starExpression = true; if (node.SelectElements.Count > 1) { //Lever une exception qui dit que c'est non géré* break; } else { if (node.FromClause != null) { foreach (TSqlFragment fromElement in node.FromClause.TableReferences) { if (fromElement is NamedTableReference) { String namedTableReferenceText = GetNodeTokenText(fromElement); projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText)); } if (fromElement is QualifiedJoin) { QualifiedJoin currQualifiedJoin = (QualifiedJoin)fromElement; if (currQualifiedJoin.FirstTableReference is NamedTableReference && currQualifiedJoin.SecondTableReference is NamedTableReference) { String namedTableReferenceText1 = GetNodeTokenText(currQualifiedJoin.FirstTableReference); projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText1)); String namedTableReferenceText2 = GetNodeTokenText(currQualifiedJoin.SecondTableReference); projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText2)); } } if (fromElement is PivotedTableReference) { PivotedTableReference currPivotedTable = (PivotedTableReference)fromElement; if (currPivotedTable.TableReference is NamedTableReference) { String namedTableReferenceText = GetNodeTokenText(currPivotedTable.TableReference); projectionList.AddRange(GetProjectionsFromTablesReference(namedTableReferenceText)); } } if (fromElement is QueryDerivedTable) { QueryDerivedTable currQueryDerivedTable = (QueryDerivedTable)fromElement; if (currQueryDerivedTable.QueryExpression is QuerySpecification) { QuerySpecification currQuerySpecification = (QuerySpecification)currQueryDerivedTable.QueryExpression; recursifRecuperationProjection(currQuerySpecification); } if (currQueryDerivedTable.QueryExpression is BinaryQueryExpression) { //BinaryQueryExpression représente un union entre deux requête donc si on veut les projections dans le cas ou //Il y à un * il faut prendre les projections de la première requête d'union ou intersection BinaryQueryExpression currBinaryQueryExpression = (BinaryQueryExpression)currQueryDerivedTable.QueryExpression; while (currBinaryQueryExpression.FirstQueryExpression is BinaryQueryExpression) { currBinaryQueryExpression = (BinaryQueryExpression)currBinaryQueryExpression.FirstQueryExpression; } if (currBinaryQueryExpression.FirstQueryExpression is QuerySpecification) { QuerySpecification currQuerySpecification = (QuerySpecification)currBinaryQueryExpression.FirstQueryExpression; recursifRecuperationProjection(currQuerySpecification); } } } } } } } } if (starExpression == false) { foreach (SelectElement selectElement in node.SelectElements) { projectionList.Add(GetNodeTokenText(selectElement)); } } } }
public override void Visit(QueryDerivedTable node) { this.action(node); }
public override void ExplicitVisit(QueryDerivedTable fragment) { _fragments.Add(fragment); }