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);
                }
            }
        }
예제 #2
0
 /// <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;
 }
예제 #3
0
        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);
        }