public ImmutableDataInsertActionNode( IQsiTreeNode parent, IQsiTableDirectivesNode directives, IQsiTableAccessNode target, QsiQualifiedIdentifier[] partitions, QsiQualifiedIdentifier[] columns, IQsiRowValueExpressionNode[] values, IQsiSetColumnExpressionNode[] setValues, IQsiTableNode valueTable, QsiDataConflictBehavior conflictBehavior, IQsiDataConflictActionNode conflictAction, IUserDataHolder userData) { Parent = parent; Directives = directives; Target = target; Partitions = partitions; Columns = columns; Values = values; SetValues = setValues; ValueTable = valueTable; ConflictBehavior = conflictBehavior; ConflictAction = conflictAction; UserData = userData; }
protected virtual async ValueTask <QsiTableStructure> BuildTableAccessStructure(TableCompileContext context, IQsiTableAccessNode table) { context.ThrowIfCancellationRequested(); var lookup = ResolveTableStructure(context, table.Identifier); // view if (context.Options.UseViewTracing && !lookup.IsSystem && (lookup.Type == QsiTableType.View || lookup.Type == QsiTableType.MaterializedView)) { var script = context.Engine.RepositoryProvider.LookupDefinition(lookup.Identifier, lookup.Type) ?? throw new QsiException(QsiError.UnableResolveDefinition, lookup.Identifier); var viewTable = (IQsiTableNode)context.Engine.TreeParser.Parse(script) ?? throw new QsiException(QsiError.Internal, "Invalid view node"); var typeBackup = lookup.Type; using var viewCompileContext = new TableCompileContext(context); if (lookup.Identifier.Level > 1) { viewCompileContext.PushIdentifierScope(lookup.Identifier.SubIdentifier(..^ 1)); } var viewTableStructure = await BuildTableStructure(viewCompileContext, viewTable); viewTableStructure.Identifier = ResolveQualifiedIdentifier(context, viewTableStructure.Identifier); lookup = viewTableStructure; lookup.Type = typeBackup; } return(lookup); }
protected override async ValueTask <QsiTableStructure> BuildTableAccessStructure(TableCompileContext context, IQsiTableAccessNode table) { var structure = await base.BuildTableAccessStructure(context, table); if (table is IDynamicTableNode dynamicTableNode) { structure = structure.Clone(); PatchDynamicTable(structure, dynamicTableNode); } return(structure); }