Beispiel #1
0
        private IQsiTreeNode ParseInternal(QsiScript script, Parser parser)
        {
            var primarSqlParser = (global::PrimarSql.Internal.PrimarSqlParser)parser;
            var rootContext     = primarSqlParser.root();

            if (rootContext.children[0] is not SqlStatementContext sqlStatement)
            {
                return(null);
            }

            if (sqlStatement.children[0] is not DmlStatementContext dmlStatement)
            {
                return(null);
            }

            switch (dmlStatement.children[0])
            {
            case SelectStatementContext selectStatement:
                return(TableVisitor.VisitSelectStatement(selectStatement));

            case InsertStatementContext insertStatement:
                return(ActionVisitor.VisitInsertStatement(insertStatement));

            case DeleteStatementContext deleteStatement:
                return(ActionVisitor.VisitDeleteStatement(deleteStatement));

            case UpdateStatementContext updateStatement:
                return(ActionVisitor.VisitUpdateStatement(updateStatement));

            default:
                return(null);
            }
        }
Beispiel #2
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var stream = new AntlrInputStream(script.Script);
            var lexer  = new CqlLexerInternal(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new CqlParserInternal(tokens);

            parser.AddErrorListener(new ErrorListener());

            var statement = parser.cqlStatement().children[0];

            switch (statement)
            {
            case SelectStatementContext selectStatement:
                return(TableVisitor.VisitSelectStatement(selectStatement));

            case CreateMaterializedViewStatementContext createMaterializedViewStatement:
                return(DefinitionVisitor.VisitCreateMaterializedViewStatement(createMaterializedViewStatement));

            case UseStatementContext useStatement:
                return(ActionVisitor.VisitUseStatement(useStatement));

            case InsertStatementContext insertStatement:
                return(ActionVisitor.VisitInsertStatement(insertStatement));

            case UpdateStatementContext updateStatement:
                return(ActionVisitor.VisitUpdateStatement(updateStatement));

            case DeleteStatementContext deleteStatement:
                return(ActionVisitor.VisitDeleteStatement(deleteStatement));

            default:
                throw TreeHelper.NotSupportedTree(statement);
            }
        }
        IQsiTreeNode IQsiTreeParser.Parse(QsiScript script, CancellationToken cancellationToken)
        {
            var parser = CreateParser(script);

            parser.AddErrorListener(_parserErrorHandler);
            return(Parse(script, parser));
        }
Beispiel #4
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var stream = new AntlrInputStream(script.Script);
            var lexer  = new HanaLexerInternal(stream);
            var tokens = new CommonTokenStream(lexer);
            var parser = new HanaParserInternal(tokens);

            parser.AddErrorListener(new ErrorListener());

            var statement = parser.hanaStatement();

            switch (statement.children[0])
            {
            case DataManipulationStatementContext dataManipulationStatement:
                return(ParseDataManipulationStatement(dataManipulationStatement));

            case DataDefinitionStatementContext dataDefinitionStatement:
                return(ParseDataDefinitionStatementStatement(dataDefinitionStatement));

            case SessionManagementStatementContext sessionManagementStatement:
                return(ParseSessionManagementStatement(sessionManagementStatement));

            default:
                throw TreeHelper.NotSupportedTree(statement.children[0]);
            }
        }
Beispiel #5
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var parser = MySQLUtility.CreateParser(script.Script, _version);
            var query  = parser.query();

            if (query.children[0] is not SimpleStatementContext simpleStatement)
            {
                return(null);
            }

            switch (simpleStatement.children[0])
            {
            case SelectStatementContext selectStatement:
                return(TableVisitor.VisitSelectStatement(selectStatement));

            case CreateStatementContext createStatement when
                createStatement.children[1] is CreateViewContext createView:
                return(TableVisitor.VisitCreateView(createView));

            case DeleteStatementContext deleteStatement:
                return(ActionVisitor.VisitDeleteStatement(deleteStatement));

            case ReplaceStatementContext replaceStatement:
                return(ActionVisitor.VisitReplaceStatement(replaceStatement));

            case UpdateStatementContext updateStatement:
                return(ActionVisitor.VisitUpdateStatement(updateStatement));

            case InsertStatementContext insertStatement:
                return(ActionVisitor.VisitInsertStatement(insertStatement));

            default:
                throw TreeHelper.NotSupportedTree(simpleStatement.children[0]);
            }
        }
Beispiel #6
0
        protected override Parser CreateParser(QsiScript script)
        {
            var stream = new AntlrUpperInputStream(script.Script);
            var lexer  = new PrimarSqlLexer(stream);
            var tokens = new CommonTokenStream(lexer);

            return(new global::PrimarSql.Internal.PrimarSqlParser(tokens));
        }
Beispiel #7
0
        string IQsiTreeDeparser.Deparse(IQsiTreeNode node, QsiScript script)
        {
            var writer = new ScriptWriter();

            DeparseTreeNode(writer, node, script);

            return(writer.ToString());
        }
Beispiel #8
0
 public AnalyzerContext(QsiEngine engine, QsiScript script, IQsiTreeNode tree, QsiAnalyzerOptions options, CancellationToken cancellationToken)
 {
     Engine            = engine;
     Script            = script;
     Tree              = tree;
     Options           = options ?? throw new ArgumentNullException(nameof(options));
     CancellationToken = cancellationToken;
 }
Beispiel #9
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var statement  = CCJSqlParserUtility.Parse(script.Script);
            var visitorSet = new VisitorSetImpl();

            visitorSet.TableVisitor      = CreateTableVisitor(visitorSet);
            visitorSet.ExpressionVisitor = CreateExpressionVisitor(visitorSet);
            visitorSet.IdentifierVisitor = CreateIdentifierVisitor(visitorSet);

            return(visitorSet.TableVisitor.Visit(statement) ?? throw new QsiException(QsiError.NotSupportedScript, script.ScriptType));
        }
Beispiel #10
0
        public ValueTask <IQsiAnalysisResult> Execute(
            QsiScript script,
            IQsiTreeNode tree,
            QsiAnalyzerOptions options,
            CancellationToken cancellationToken = default)
        {
            if (!CanExecute(script, tree))
            {
                throw new QsiException(QsiError.NotSupportedScript, script.ScriptType);
            }

            return(OnExecute(new AnalyzerContext(_engine, script, tree, options, cancellationToken)));
        }
Beispiel #11
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            _pgParser ??= new PgQuery10();

            var pgTree = (IPg10Node)_pgParser.Parse(script.Script) ?? throw new QsiException(QsiError.NotSupportedScript, script.ScriptType);

            switch (script.ScriptType)
            {
            case QsiScriptType.Set:
                return(ActionVisitor.Visit(pgTree));

            default:
                return(TableVisitor.Visit(pgTree));
            }
        }
Beispiel #12
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            _pgParser ??= new PgQuery10();

            var pgTree       = (IPg10Node)_pgParser.Parse(script.Script) ?? throw new QsiException(QsiError.NotSupportedScript, script.ScriptType);
            var pgVisitorSet = _pgParser.CreateVisitorSet();

            switch (pgTree)
            {
            case RawStmt rawStmt:
                return(ParseRawStmt(pgVisitorSet, rawStmt));

            default:
                throw TreeHelper.NotSupportedTree(pgTree);
            }
        }
Beispiel #13
0
        public ValueTask <IQsiAnalysisResult[]> Explain(QsiScript script, CancellationToken cancellationToken = default)
        {
            var parameters = new[] { new QsiParameter(QsiParameterType.Name, string.Empty, QsiDataValue.Explain) };

            if (IsExplainEngine)
            {
                return(Execute(script, parameters, cancellationToken));
            }

            var explainLanguageService = new ExplainLanguageService(LanguageService);
            var explainEngine          = new QsiEngine(explainLanguageService);

            explainLanguageService.ExplainEngine = explainEngine;

            return(explainEngine.Execute(script, parameters, cancellationToken));
        }
Beispiel #14
0
        public async ValueTask <IQsiAnalysisResult> Execute(QsiScript script, CancellationToken cancellationToken = default)
        {
            var tree = TreeParser.Parse(script, cancellationToken);

            var options  = LanguageService.CreateAnalyzerOptions();
            var analyzer = _analyzers.Value.FirstOrDefault(a => a.CanExecute(script, tree));

            if (analyzer == null)
            {
                if (script.ScriptType == QsiScriptType.Comment || script.ScriptType == QsiScriptType.Delimiter)
                {
                    return(new EmptyAnalysisResult());
                }

                throw new QsiException(QsiError.NotSupportedScript, script.ScriptType);
            }

            return(await analyzer.Execute(script, tree, options, cancellationToken));
        }
Beispiel #15
0
        public async Task <QsiDataTable> GetDataTable(QsiScript script, QsiParameter[] parameters, CancellationToken cancellationToken)
        {
            IQsiAnalysisResult[] results = await _engine.Explain(script, cancellationToken);

            if (results.Length != 1 || results[0] is not QsiTableResult tableResult)
            {
                throw new QsiException(QsiError.InvalidNestedExplain, script.Script);
            }

            var dataTable = new QsiDataTable(tableResult.Table);
            var dataRow   = dataTable.Rows.NewRow();

            for (int i = 0; i < dataRow.Length; i++)
            {
                dataRow.Items[i] = QsiDataValue.Explain;
            }

            return(dataTable);
        }
Beispiel #16
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var result = _parser.Parse(script.Script);

            if (result is TSqlScript sqlScript)
            {
                var batch = sqlScript.Batches.FirstOrDefault();

                var statement = batch?.Statements?.FirstOrDefault()
                                ?? throw new QsiException(QsiError.Syntax);

                switch (statement)
                {
                case UseStatement useStatement:
                    return(_actionVisitor.VisitUseStatement(useStatement));

                case InsertStatement insertStatement:
                    return(_actionVisitor.VisitInsertStatement(insertStatement));

                case DeleteStatement deleteStatement:
                    return(_actionVisitor.VisitDeleteStatement(deleteStatement));

                case UpdateStatement updateStatement:
                    return(_actionVisitor.VisitUpdateStatement(updateStatement));

                case MergeStatement mergeStatement:
                    return(_actionVisitor.VisitMergeStatement(mergeStatement));

                case AlterUserStatement alterUserStatement:
                    return(_actionVisitor.VisitAlterUser(alterUserStatement));

                case ViewStatementBody viewStatementBody:
                    return(_definitionVisitor.VisitViewStatementBody(viewStatementBody));

                default:
                    return(_tableVisitor.Visit(statement));
                }
            }

            throw new InvalidOperationException();
        }
Beispiel #17
0
        public async ValueTask <IQsiAnalysisResult[]> Execute(
            QsiScript script,
            QsiParameter[] parameters,
            IQsiTreeNode tree,
            QsiAnalyzerOptions options,
            CancellationToken cancellationToken = default)
        {
            IQsiAnalysisResult[] results = await _analyzer.Execute(script, parameters, tree, options, cancellationToken);

            for (int i = 0; i < results.Length; i++)
            {
                var result = results[i];

                if (result is QsiDataManipulationResult dmResult)
                {
                    results[i] = ConvertToExplain(dmResult);
                }
            }

            return(results);
        }
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var result = _parser.Parse(script.Script);

            if (result is TSqlScript sqlScript)
            {
                var batch     = sqlScript.Batches.FirstOrDefault();
                var statement = batch?.Statements?.FirstOrDefault()
                                ?? throw new QsiException(QsiError.Syntax);

                switch (statement)
                {
                case UseStatement useStatement:
                    return(_actionVisitor.VisitUseStatement(useStatement));

                default:
                    return(_tableVisitor.Visit(statement));
                }
            }

            throw new InvalidOperationException();
        }
Beispiel #19
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var parser = ImpalaUtility.CreateParserInternal(
                script.Script,
                Dialect
                );

            var stmt = parser.root().stmt();

            switch (stmt.children[0])
            {
            case Query_stmtContext queryStmt:
                return(TableVisitor.VisitQueryStmt(queryStmt));

            case Create_view_stmtContext createViewStmt:
                return(ActionVisitor.VisitCreateViewStmt(createViewStmt));

            case Create_tbl_as_select_stmtContext createTblAsSelectStmt:
                return(ActionVisitor.VisitCreateTblAsSelectStmt(createTblAsSelectStmt));

            case Use_stmtContext useStmt:
                return(ActionVisitor.VisitUseStmt(useStmt));

            case Upsert_stmtContext upsertStmt:
                return(ActionVisitor.VisitUpsertStmt(upsertStmt));

            case Update_stmtContext updateStmt:
                return(ActionVisitor.VisitUpdateStmt(updateStmt));

            case Insert_stmtContext insertStmt:
                return(ActionVisitor.VisitInsertStmt(insertStmt));

            case Delete_stmtContext deleteStmt:
                return(ActionVisitor.VisitDeleteStmt(deleteStmt));

            default:
                throw TreeHelper.NotSupportedTree(stmt.children[0]);
            }
        }
        private IQsiTreeNode ParseInternal(QsiScript script, Parser parser)
        {
            var primarSqlParser = (global::PrimarSql.Internal.PrimarSqlParser)parser;

            switch (script.ScriptType)
            {
            case QsiScriptType.Select:
                return(TableVisitor.VisitSelectStatement(primarSqlParser.selectStatement()));

            case QsiScriptType.Insert:
                return(ActionVisitor.VisitInsertStatement(primarSqlParser.insertStatement()));

            case QsiScriptType.Delete:
                return(ActionVisitor.VisitDeleteStatement(primarSqlParser.deleteStatement()));

            case QsiScriptType.Update:
                return(ActionVisitor.VisitUpdateStatement(primarSqlParser.updateStatement()));

            default:
                return(null);
            }
        }
Beispiel #21
0
        public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
        {
            var result = PhoenixSqlParserInternal.Parse(script.Script);

            switch (result)
            {
            case SelectStatement selectStatement:
                return(TableVisitor.VisitSelectStatement(selectStatement));

            case CreateTableStatement {
                    TableType: PTableType.View
            } createTableStatement:
                return(TableVisitor.VisitCreateViewStatement(createTableStatement));

            case IDMLStatement dmlStatement:
                return(ActionVisitor.Visit(dmlStatement));

            case UseSchemaStatement useSchemaStatement:
                return(ActionVisitor.VisitUseSchemaStatement(useSchemaStatement));
            }

            throw TreeHelper.NotSupportedTree(result);
        }
        protected override void DeparseDerivedTableNode(ScriptWriter writer, IQsiDerivedTableNode node, QsiScript script)
        {
            base.DeparseDerivedTableNode(writer, node, script);

            if (node is not MySqlDerivedTableNode mysqlNode)
            {
                return;
            }

            if (!mysqlNode.ProcedureAnalyse.IsEmpty)
            {
                var procedureAnalyse = mysqlNode.ProcedureAnalyse.Value;

                writer.WriteSpace();
                writer.Write("PROCEDURE ANALYSE (");
                writer.Write(procedureAnalyse.MaxElements);

                if (procedureAnalyse.MaxMemory.HasValue)
                {
                    writer.Write(", ");
                    writer.Write(procedureAnalyse.MaxMemory.Value);
                }

                writer.Write(')');
            }

            if (mysqlNode.Lockings?.Count > 0)
            {
                writer.WriteSpace();
                writer.WriteJoin(" ", mysqlNode.Lockings, DeparseLockingNode);
            }
        }
Beispiel #23
0
 protected override Task <QsiDataTable> GetDataTable(QsiScript script)
 {
     throw new NotImplementedException();
 }
Beispiel #24
0
        private void DeparseHanaTableSerializeBehaviorNode(ScriptWriter writer, HanaTableSerializeBehaviorNode node, QsiScript script)
        {
            writer.Write("FOR ").Write(node.Type == HanaTableSerializeType.Json ? "JSON" : "XML");

            if (node.Options.Count > 0)
            {
                writer.Write(" (");

                writer.WriteJoin(", ", node.Options, (w, n) =>
                {
                    w.Write(IdentifierUtility.Escape(n.Key, EscapeQuotes.Single, EscapeBehavior.TwoTime));
                    w.Write('=');
                    w.Write(IdentifierUtility.Escape(n.Value, EscapeQuotes.Single, EscapeBehavior.TwoTime));
                });

                writer.Write(')');
            }

            if (!string.IsNullOrEmpty(node.ReturnType))
            {
                writer.Write(" RETURNS ").Write(node.ReturnType);
            }
        }
Beispiel #25
0
 protected override IQsiTreeNode Parse(QsiScript script, Parser parser)
 {
     return(ParseInternal(script, parser) ?? throw new QsiException(QsiError.NotSupportedScript, script.ScriptType));
 }
        protected override void DeparseTreeNode(ScriptWriter writer, IQsiTreeNode node, QsiScript script)
        {
            var range = MySqlTree.Span[node];

            if (Equals(range, default(Range)))
            {
                base.DeparseTreeNode(writer, node, script);
                return;
            }

            writer.Write(script.Script[range]);
        }
Beispiel #27
0
 public IQsiTreeNode Parse(QsiScript script, CancellationToken cancellationToken = default)
 {
     return(((IQsiTreeParser)this).Parse(script, cancellationToken));
 }
Beispiel #28
0
 public override bool CanExecute(QsiScript script, IQsiTreeNode tree)
 {
     return
         (tree is IQsiTableNode &&
          (script.ScriptType == QsiScriptType.With || script.ScriptType == QsiScriptType.Select));
 }
Beispiel #29
0
 public bool CanExecute(QsiScript script, IQsiTreeNode tree)
 {
     return(_analyzer.CanExecute(script, tree));
 }
Beispiel #30
0
        protected override void DeparseTreeNode(ScriptWriter writer, IQsiTreeNode node, QsiScript script)
        {
            var rawNode = PTree.RawNode[node];

            if (rawNode == null)
            {
                base.DeparseTreeNode(writer, node, script);
                return;
            }

            writer.Write(global::PhoenixSql.PhoenixSqlDeparser.Deparse(rawNode));
        }