private static void WalkFAFSpec( FireAndForgetSpec fireAndForgetSpec, ExprNodeSubselectDeclaredDotVisitor visitor) { if (fireAndForgetSpec == null) { return; } if (fireAndForgetSpec is FireAndForgetSpecUpdate update) { foreach (OnTriggerSetAssignment assignment in update.Assignments) { assignment.Expression.Accept(visitor); } } }
/// <summary> /// Ctor. /// </summary> /// <param name="onTriggerDesc">describes on-delete statements</param> /// <param name="createWindowDesc">describes create-window statements</param> /// <param name="createIndexDesc">when an index get</param> /// <param name="createVariableDesc">describes create-variable statements</param> /// <param name="createTableDesc">The create table desc.</param> /// <param name="createSchemaDesc">The create schema desc.</param> /// <param name="insertIntoDesc">insert into def</param> /// <param name="selectClauseStreamSelectorEnum">stream selection</param> /// <param name="selectClauseSpec">select clause</param> /// <param name="streamSpecs">specs for streams</param> /// <param name="outerJoinDescList">outer join def</param> /// <param name="filterExprRootNode">where filter expr nodes</param> /// <param name="havingExprRootNode">having expression</param> /// <param name="outputLimitSpec">output limit</param> /// <param name="orderByList">order by</param> /// <param name="subSelectExpressions">list of subqueries</param> /// <param name="declaredExpressions">The declared expressions.</param> /// <param name="variableReferences">variables referenced</param> /// <param name="rowLimitSpec">row limit specification, or null if none supplied</param> /// <param name="eventTypeReferences">event type names statically determined</param> /// <param name="annotations">statement annotations</param> /// <param name="updateSpec">update specification if used</param> /// <param name="matchRecognizeSpec">if provided</param> /// <param name="forClauseSpec">For clause spec.</param> /// <param name="sqlParameters">The SQL parameters.</param> /// <param name="contextDesc">The context desc.</param> /// <param name="optionalContextName">Name of the optional context.</param> /// <param name="createGraphDesc">The create graph desc.</param> /// <param name="createExpressionDesc">The create expression desc.</param> /// <param name="fireAndForgetSpec">The fire and forget spec.</param> /// <param name="groupByExpressions">The group by expressions.</param> /// <param name="intoTableSpec">The into table spec.</param> /// <param name="tableNodes">The table nodes.</param> public StatementSpecCompiled(OnTriggerDesc onTriggerDesc, CreateWindowDesc createWindowDesc, CreateIndexDesc createIndexDesc, CreateVariableDesc createVariableDesc, CreateTableDesc createTableDesc, CreateSchemaDesc createSchemaDesc, InsertIntoDesc insertIntoDesc, SelectClauseStreamSelectorEnum selectClauseStreamSelectorEnum, SelectClauseSpecCompiled selectClauseSpec, StreamSpecCompiled[] streamSpecs, OuterJoinDesc[] outerJoinDescList, ExprNode filterExprRootNode, ExprNode havingExprRootNode, OutputLimitSpec outputLimitSpec, OrderByItem[] orderByList, ExprSubselectNode[] subSelectExpressions, ExprDeclaredNode[] declaredExpressions, ICollection <string> variableReferences, RowLimitSpec rowLimitSpec, string[] eventTypeReferences, Attribute[] annotations, UpdateDesc updateSpec, MatchRecognizeSpec matchRecognizeSpec, ForClauseSpec forClauseSpec, IDictionary <int, IList <ExprNode> > sqlParameters, CreateContextDesc contextDesc, string optionalContextName, CreateDataFlowDesc createGraphDesc, CreateExpressionDesc createExpressionDesc, FireAndForgetSpec fireAndForgetSpec, GroupByClauseExpressions groupByExpressions, IntoTableSpec intoTableSpec, ExprTableAccessNode[] tableNodes) { OnTriggerDesc = onTriggerDesc; CreateWindowDesc = createWindowDesc; CreateIndexDesc = createIndexDesc; CreateVariableDesc = createVariableDesc; CreateTableDesc = createTableDesc; CreateSchemaDesc = createSchemaDesc; InsertIntoDesc = insertIntoDesc; SelectStreamDirEnum = selectClauseStreamSelectorEnum; SelectClauseSpec = selectClauseSpec; StreamSpecs = streamSpecs; OuterJoinDescList = outerJoinDescList; FilterExprRootNode = filterExprRootNode; HavingExprRootNode = havingExprRootNode; OutputLimitSpec = outputLimitSpec; OrderByList = orderByList; this.SubSelectExpressions = subSelectExpressions; DeclaredExpressions = declaredExpressions; VariableReferences = variableReferences; RowLimitSpec = rowLimitSpec; EventTypeReferences = eventTypeReferences; Annotations = annotations; UpdateSpec = updateSpec; MatchRecognizeSpec = matchRecognizeSpec; ForClauseSpec = forClauseSpec; SqlParameters = sqlParameters; ContextDesc = contextDesc; OptionalContextName = optionalContextName; CreateGraphDesc = createGraphDesc; CreateExpressionDesc = createExpressionDesc; FireAndForgetSpec = fireAndForgetSpec; GroupByExpressions = groupByExpressions; IntoTableSpec = intoTableSpec; TableNodes = tableNodes; }
public static bool IsWritesToTables(StatementSpecRaw statementSpec, TableService tableService) { // determine if writing to a table: // insert-into (single) if (statementSpec.InsertIntoDesc != null) { if (IsTable(statementSpec.InsertIntoDesc.EventTypeName, tableService)) { return(true); } } // into-table if (statementSpec.IntoTableSpec != null) { return(true); } // triggers if (statementSpec.OnTriggerDesc != null) { OnTriggerDesc onTriggerDesc = statementSpec.OnTriggerDesc; // split-stream insert-into if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_SPLITSTREAM) { OnTriggerSplitStreamDesc split = (OnTriggerSplitStreamDesc)onTriggerDesc; foreach (OnTriggerSplitStream stream in split.SplitStreams) { if (IsTable(stream.InsertInto.EventTypeName, tableService)) { return(true); } } } // on-delete/update/merge/on-selectdelete if (onTriggerDesc is OnTriggerWindowDesc) { OnTriggerWindowDesc window = (OnTriggerWindowDesc)onTriggerDesc; if (onTriggerDesc.OnTriggerType == OnTriggerType.ON_DELETE || onTriggerDesc.OnTriggerType == OnTriggerType.ON_UPDATE || onTriggerDesc.OnTriggerType == OnTriggerType.ON_MERGE || window.IsDeleteAndSelect) { if (IsTable(window.WindowName, tableService)) { return(true); } } } // on-merge with insert-action if (onTriggerDesc is OnTriggerMergeDesc) { OnTriggerMergeDesc merge = (OnTriggerMergeDesc)onTriggerDesc; foreach (OnTriggerMergeMatched item in merge.Items) { foreach (OnTriggerMergeAction action in item.Actions) { if (action is OnTriggerMergeActionInsert) { OnTriggerMergeActionInsert insert = (OnTriggerMergeActionInsert)action; if (insert.OptionalStreamName != null && IsTable(insert.OptionalStreamName, tableService)) { return(true); } } } } } } // end of trigger handling // fire-and-forget insert/update/delete if (statementSpec.FireAndForgetSpec != null) { FireAndForgetSpec faf = statementSpec.FireAndForgetSpec; if (faf is FireAndForgetSpecDelete || faf is FireAndForgetSpecInsert || faf is FireAndForgetSpecUpdate) { if (statementSpec.StreamSpecs.Count == 1) { return(IsTable(((FilterStreamSpecRaw)statementSpec.StreamSpecs[0]).RawFilterSpec.EventTypeName, tableService)); } } } return(false); }