rawsql-ts 0.12.0 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/esm/index.js +11 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +16 -16
- package/dist/esm/index.min.js.map +3 -3
- package/dist/esm/src/index.d.ts +12 -0
- package/dist/esm/src/index.js +11 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/models/Clause.d.ts +7 -3
- package/dist/esm/src/models/Clause.js +17 -4
- package/dist/esm/src/models/Clause.js.map +1 -1
- package/dist/esm/src/models/DDLStatements.d.ts +14 -2
- package/dist/esm/src/models/DDLStatements.js +12 -0
- package/dist/esm/src/models/DDLStatements.js.map +1 -1
- package/dist/esm/src/models/InsertQuery.d.ts +1 -4
- package/dist/esm/src/models/InsertQuery.js +3 -5
- package/dist/esm/src/models/InsertQuery.js.map +1 -1
- package/dist/esm/src/models/SqlPrintToken.d.ts +1 -0
- package/dist/esm/src/models/SqlPrintToken.js +1 -0
- package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
- package/dist/esm/src/models/TableDefinitionModel.d.ts +39 -0
- package/dist/esm/src/models/TableDefinitionModel.js +77 -0
- package/dist/esm/src/models/TableDefinitionModel.js.map +1 -0
- package/dist/esm/src/models/ValuesQuery.d.ts +2 -0
- package/dist/esm/src/models/ValuesQuery.js +1 -0
- package/dist/esm/src/models/ValuesQuery.js.map +1 -1
- package/dist/esm/src/parsers/AlterTableParser.js +1 -1
- package/dist/esm/src/parsers/AlterTableParser.js.map +1 -1
- package/dist/esm/src/parsers/InsertQueryParser.js +4 -1
- package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/esm/src/parsers/ReturningClauseParser.js +33 -47
- package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlParser.d.ts +0 -1
- package/dist/esm/src/parsers/SqlParser.js +44 -58
- package/dist/esm/src/parsers/SqlParser.js.map +1 -1
- package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +1 -0
- package/dist/esm/src/parsers/SqlPrintTokenParser.js +23 -5
- package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js +7 -0
- package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/DDLDiffGenerator.d.ts +14 -0
- package/dist/esm/src/transformers/DDLDiffGenerator.js +197 -0
- package/dist/esm/src/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/esm/src/transformers/DDLGeneralizer.d.ts +13 -0
- package/dist/esm/src/transformers/DDLGeneralizer.js +98 -0
- package/dist/esm/src/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.d.ts +19 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.js +202 -0
- package/dist/esm/src/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.js +394 -0
- package/dist/esm/src/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.d.ts +60 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.js +147 -0
- package/dist/esm/src/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
- package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
- package/dist/esm/src/transformers/InsertResultSelectConverter.d.ts +64 -0
- package/dist/esm/src/transformers/InsertResultSelectConverter.js +495 -0
- package/dist/esm/src/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.d.ts +38 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.js +306 -0
- package/dist/esm/src/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/QueryBuilder.d.ts +11 -0
- package/dist/esm/src/transformers/QueryBuilder.js +19 -3
- package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/SelectResultSelectConverter.d.ts +10 -0
- package/dist/esm/src/transformers/SelectResultSelectConverter.js +32 -0
- package/dist/esm/src/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.d.ts +23 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.js +61 -0
- package/dist/esm/src/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.js +340 -0
- package/dist/esm/src/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.js +43 -0
- package/dist/esm/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/esm/src/utils/ValueComponentRewriter.d.ts +3 -0
- package/dist/esm/src/utils/ValueComponentRewriter.js +180 -0
- package/dist/esm/src/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/formatters/OriginalFormatRestorer.js +139 -0
- package/dist/formatters/OriginalFormatRestorer.js.map +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.js +17 -17
- package/dist/index.min.js.map +3 -3
- package/dist/models/BinarySelectQuery.js +198 -0
- package/dist/models/BinarySelectQuery.js.map +1 -0
- package/dist/models/CTEError.js +37 -0
- package/dist/models/CTEError.js.map +1 -0
- package/dist/models/Clause.js +535 -0
- package/dist/models/Clause.js.map +1 -0
- package/dist/models/CreateTableQuery.js +135 -0
- package/dist/models/CreateTableQuery.js.map +1 -0
- package/dist/models/DDLStatements.js +275 -0
- package/dist/models/DDLStatements.js.map +1 -0
- package/dist/models/DeleteQuery.js +20 -0
- package/dist/models/DeleteQuery.js.map +1 -0
- package/dist/models/FormattingLexeme.js +3 -0
- package/dist/models/FormattingLexeme.js.map +1 -0
- package/dist/models/HintClause.js +41 -0
- package/dist/models/HintClause.js.map +1 -0
- package/dist/models/InsertQuery.js +23 -0
- package/dist/models/InsertQuery.js.map +1 -0
- package/dist/models/KeywordTrie.js +54 -0
- package/dist/models/KeywordTrie.js.map +1 -0
- package/dist/models/Lexeme.js +22 -0
- package/dist/models/Lexeme.js.map +1 -0
- package/dist/models/MergeQuery.js +104 -0
- package/dist/models/MergeQuery.js.map +1 -0
- package/dist/models/SelectQuery.js +22 -0
- package/dist/models/SelectQuery.js.map +1 -0
- package/dist/models/SimpleSelectQuery.js +648 -0
- package/dist/models/SimpleSelectQuery.js.map +1 -0
- package/dist/models/SqlComponent.js +73 -0
- package/dist/models/SqlComponent.js.map +1 -0
- package/dist/models/SqlPrintToken.js +143 -0
- package/dist/models/SqlPrintToken.js.map +1 -0
- package/dist/models/TableDefinitionModel.js +86 -0
- package/dist/models/TableDefinitionModel.js.map +1 -0
- package/dist/models/UpdateQuery.js +29 -0
- package/dist/models/UpdateQuery.js.map +1 -0
- package/dist/models/ValueComponent.js +380 -0
- package/dist/models/ValueComponent.js.map +1 -0
- package/dist/models/ValuesQuery.js +62 -0
- package/dist/models/ValuesQuery.js.map +1 -0
- package/dist/parsers/AlterTableParser.js +490 -0
- package/dist/parsers/AlterTableParser.js.map +1 -0
- package/dist/parsers/AnalyzeStatementParser.js +94 -0
- package/dist/parsers/AnalyzeStatementParser.js.map +1 -0
- package/dist/parsers/CommandExpressionParser.js +213 -0
- package/dist/parsers/CommandExpressionParser.js.map +1 -0
- package/dist/parsers/CommonTableParser.js +177 -0
- package/dist/parsers/CommonTableParser.js.map +1 -0
- package/dist/parsers/CreateIndexParser.js +241 -0
- package/dist/parsers/CreateIndexParser.js.map +1 -0
- package/dist/parsers/CreateTableParser.js +738 -0
- package/dist/parsers/CreateTableParser.js.map +1 -0
- package/dist/parsers/DeleteClauseParser.js +37 -0
- package/dist/parsers/DeleteClauseParser.js.map +1 -0
- package/dist/parsers/DeleteQueryParser.js +77 -0
- package/dist/parsers/DeleteQueryParser.js.map +1 -0
- package/dist/parsers/DropConstraintParser.js +51 -0
- package/dist/parsers/DropConstraintParser.js.map +1 -0
- package/dist/parsers/DropIndexParser.js +73 -0
- package/dist/parsers/DropIndexParser.js.map +1 -0
- package/dist/parsers/DropTableParser.js +63 -0
- package/dist/parsers/DropTableParser.js.map +1 -0
- package/dist/parsers/ExplainStatementParser.js +189 -0
- package/dist/parsers/ExplainStatementParser.js.map +1 -0
- package/dist/parsers/FetchClauseParser.js +89 -0
- package/dist/parsers/FetchClauseParser.js.map +1 -0
- package/dist/parsers/ForClauseParser.js +58 -0
- package/dist/parsers/ForClauseParser.js.map +1 -0
- package/dist/parsers/FromClauseParser.js +54 -0
- package/dist/parsers/FromClauseParser.js.map +1 -0
- package/dist/parsers/FullNameParser.js +110 -0
- package/dist/parsers/FullNameParser.js.map +1 -0
- package/dist/parsers/FunctionExpressionParser.js +524 -0
- package/dist/parsers/FunctionExpressionParser.js.map +1 -0
- package/dist/parsers/GroupByParser.js +58 -0
- package/dist/parsers/GroupByParser.js.map +1 -0
- package/dist/parsers/HavingParser.js +36 -0
- package/dist/parsers/HavingParser.js.map +1 -0
- package/dist/parsers/IdentifierDecorator.js +17 -0
- package/dist/parsers/IdentifierDecorator.js.map +1 -0
- package/dist/parsers/IdentifierParser.js +15 -0
- package/dist/parsers/IdentifierParser.js.map +1 -0
- package/dist/parsers/InsertQueryParser.js +162 -0
- package/dist/parsers/InsertQueryParser.js.map +1 -0
- package/dist/parsers/JoinClauseParser.js +117 -0
- package/dist/parsers/JoinClauseParser.js.map +1 -0
- package/dist/parsers/JoinOnClauseParser.js +21 -0
- package/dist/parsers/JoinOnClauseParser.js.map +1 -0
- package/dist/parsers/JoinUsingClauseParser.js +23 -0
- package/dist/parsers/JoinUsingClauseParser.js.map +1 -0
- package/dist/parsers/KeywordParser.js +99 -0
- package/dist/parsers/KeywordParser.js.map +1 -0
- package/dist/parsers/LimitClauseParser.js +38 -0
- package/dist/parsers/LimitClauseParser.js.map +1 -0
- package/dist/parsers/LiteralParser.js +48 -0
- package/dist/parsers/LiteralParser.js.map +1 -0
- package/dist/parsers/MergeQueryParser.js +483 -0
- package/dist/parsers/MergeQueryParser.js.map +1 -0
- package/dist/parsers/OffsetClauseParser.js +42 -0
- package/dist/parsers/OffsetClauseParser.js.map +1 -0
- package/dist/parsers/OrderByClauseParser.js +108 -0
- package/dist/parsers/OrderByClauseParser.js.map +1 -0
- package/dist/parsers/OverExpressionParser.js +44 -0
- package/dist/parsers/OverExpressionParser.js.map +1 -0
- package/dist/parsers/ParameterDecorator.js +40 -0
- package/dist/parsers/ParameterDecorator.js.map +1 -0
- package/dist/parsers/ParameterExpressionParser.js +24 -0
- package/dist/parsers/ParameterExpressionParser.js.map +1 -0
- package/dist/parsers/ParenExpressionParser.js +109 -0
- package/dist/parsers/ParenExpressionParser.js.map +1 -0
- package/dist/parsers/ParseError.js +25 -0
- package/dist/parsers/ParseError.js.map +1 -0
- package/dist/parsers/PartitionByParser.js +53 -0
- package/dist/parsers/PartitionByParser.js.map +1 -0
- package/dist/parsers/ReturningClauseParser.js +64 -0
- package/dist/parsers/ReturningClauseParser.js.map +1 -0
- package/dist/parsers/SelectClauseParser.js +244 -0
- package/dist/parsers/SelectClauseParser.js.map +1 -0
- package/dist/parsers/SelectQueryParser.js +564 -0
- package/dist/parsers/SelectQueryParser.js.map +1 -0
- package/dist/parsers/SequenceParser.js +245 -0
- package/dist/parsers/SequenceParser.js.map +1 -0
- package/dist/parsers/SetClauseParser.js +125 -0
- package/dist/parsers/SetClauseParser.js.map +1 -0
- package/dist/parsers/SourceAliasExpressionParser.js +60 -0
- package/dist/parsers/SourceAliasExpressionParser.js.map +1 -0
- package/dist/parsers/SourceExpressionParser.js +69 -0
- package/dist/parsers/SourceExpressionParser.js.map +1 -0
- package/dist/parsers/SourceParser.js +144 -0
- package/dist/parsers/SourceParser.js.map +1 -0
- package/dist/parsers/SqlParser.js +431 -0
- package/dist/parsers/SqlParser.js.map +1 -0
- package/dist/parsers/SqlPrintTokenParser.js +3289 -0
- package/dist/parsers/SqlPrintTokenParser.js.map +1 -0
- package/dist/parsers/SqlTokenizer.js +553 -0
- package/dist/parsers/SqlTokenizer.js.map +1 -0
- package/dist/parsers/StringSpecifierExpressionParser.js +22 -0
- package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -0
- package/dist/parsers/UnaryExpressionParser.js +39 -0
- package/dist/parsers/UnaryExpressionParser.js.map +1 -0
- package/dist/parsers/UpdateClauseParser.js +21 -0
- package/dist/parsers/UpdateClauseParser.js.map +1 -0
- package/dist/parsers/UpdateQueryParser.js +98 -0
- package/dist/parsers/UpdateQueryParser.js.map +1 -0
- package/dist/parsers/UsingClauseParser.js +33 -0
- package/dist/parsers/UsingClauseParser.js.map +1 -0
- package/dist/parsers/ValueParser.js +562 -0
- package/dist/parsers/ValueParser.js.map +1 -0
- package/dist/parsers/ValuesQueryParser.js +112 -0
- package/dist/parsers/ValuesQueryParser.js.map +1 -0
- package/dist/parsers/WhereClauseParser.js +51 -0
- package/dist/parsers/WhereClauseParser.js.map +1 -0
- package/dist/parsers/WindowClauseParser.js +57 -0
- package/dist/parsers/WindowClauseParser.js.map +1 -0
- package/dist/parsers/WindowExpressionParser.js +163 -0
- package/dist/parsers/WindowExpressionParser.js.map +1 -0
- package/dist/parsers/WithClauseParser.js +165 -0
- package/dist/parsers/WithClauseParser.js.map +1 -0
- package/dist/parsers/utils/LexemeCommentUtils.js +29 -0
- package/dist/parsers/utils/LexemeCommentUtils.js.map +1 -0
- package/dist/reporting/models/DataFlowEdge.js +58 -0
- package/dist/reporting/models/DataFlowEdge.js.map +1 -0
- package/dist/reporting/models/DataFlowGraph.js +138 -0
- package/dist/reporting/models/DataFlowGraph.js.map +1 -0
- package/dist/reporting/models/DataFlowNode.js +148 -0
- package/dist/reporting/models/DataFlowNode.js.map +1 -0
- package/dist/reporting/services/CTEHandler.js +58 -0
- package/dist/reporting/services/CTEHandler.js.map +1 -0
- package/dist/reporting/services/DataSourceHandler.js +95 -0
- package/dist/reporting/services/DataSourceHandler.js.map +1 -0
- package/dist/reporting/services/JoinHandler.js +84 -0
- package/dist/reporting/services/JoinHandler.js.map +1 -0
- package/dist/reporting/services/ProcessHandler.js +26 -0
- package/dist/reporting/services/ProcessHandler.js.map +1 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.js +13 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/models/Clause.d.ts +7 -3
- package/dist/src/models/Clause.js +16 -3
- package/dist/src/models/Clause.js.map +1 -1
- package/dist/src/models/DDLStatements.d.ts +97 -2
- package/dist/src/models/DDLStatements.js +14 -1
- package/dist/src/models/DDLStatements.js.map +1 -1
- package/dist/src/models/InsertQuery.d.ts +1 -4
- package/dist/src/models/InsertQuery.js +3 -5
- package/dist/src/models/InsertQuery.js.map +1 -1
- package/dist/src/models/SqlPrintToken.d.ts +6 -0
- package/dist/src/models/SqlPrintToken.js +1 -0
- package/dist/src/models/SqlPrintToken.js.map +1 -1
- package/dist/src/models/TableDefinitionModel.d.ts +41 -0
- package/dist/src/models/TableDefinitionModel.js +85 -0
- package/dist/src/models/TableDefinitionModel.js.map +1 -0
- package/dist/src/models/ValueComponent.d.ts +2 -1
- package/dist/src/models/ValuesQuery.d.ts +2 -0
- package/dist/src/models/ValuesQuery.js +1 -0
- package/dist/src/models/ValuesQuery.js.map +1 -1
- package/dist/src/parsers/AlterTableParser.d.ts +1 -0
- package/dist/src/parsers/AlterTableParser.js +26 -5
- package/dist/src/parsers/AlterTableParser.js.map +1 -1
- package/dist/src/parsers/FunctionExpressionParser.d.ts +1 -0
- package/dist/src/parsers/InsertQueryParser.js +4 -1
- package/dist/src/parsers/InsertQueryParser.js.map +1 -1
- package/dist/src/parsers/ReturningClauseParser.js +33 -47
- package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
- package/dist/src/parsers/SequenceParser.d.ts +16 -0
- package/dist/src/parsers/SqlParser.d.ts +4 -3
- package/dist/src/parsers/SqlParser.js +44 -63
- package/dist/src/parsers/SqlParser.js.map +1 -1
- package/dist/src/parsers/SqlPrintTokenParser.d.ts +9 -0
- package/dist/src/parsers/SqlPrintTokenParser.js +22 -4
- package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
- package/dist/src/parsers/SqlTokenizer.d.ts +1 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js +7 -0
- package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
- package/dist/src/transformers/DDLDiffGenerator.d.ts +18 -0
- package/dist/src/transformers/DDLDiffGenerator.js +313 -0
- package/dist/src/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/src/transformers/DDLGeneralizer.d.ts +13 -0
- package/dist/src/transformers/DDLGeneralizer.js +119 -0
- package/dist/src/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/src/transformers/DDLToFixtureConverter.d.ts +19 -0
- package/dist/src/transformers/DDLToFixtureConverter.js +206 -0
- package/dist/src/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
- package/dist/src/transformers/DeleteResultSelectConverter.js +398 -0
- package/dist/src/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/FixtureCteBuilder.d.ts +60 -0
- package/dist/src/transformers/FixtureCteBuilder.js +151 -0
- package/dist/src/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
- package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
- package/dist/src/transformers/InsertResultSelectConverter.d.ts +67 -0
- package/dist/src/transformers/InsertResultSelectConverter.js +499 -0
- package/dist/src/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/MergeResultSelectConverter.d.ts +38 -0
- package/dist/src/transformers/MergeResultSelectConverter.js +310 -0
- package/dist/src/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/QueryBuilder.d.ts +11 -0
- package/dist/src/transformers/QueryBuilder.js +19 -3
- package/dist/src/transformers/QueryBuilder.js.map +1 -1
- package/dist/src/transformers/SelectResultSelectConverter.d.ts +10 -0
- package/dist/src/transformers/SelectResultSelectConverter.js +36 -0
- package/dist/src/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/src/transformers/SimulatedSelectConverter.d.ts +23 -0
- package/dist/src/transformers/SimulatedSelectConverter.js +65 -0
- package/dist/src/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
- package/dist/src/transformers/UpdateResultSelectConverter.js +344 -0
- package/dist/src/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/src/types/GenericFixture.d.ts +17 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.js +47 -0
- package/dist/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/src/utils/TableNameUtils.d.ts +10 -0
- package/dist/src/utils/ValueComponentRewriter.d.ts +3 -0
- package/dist/src/utils/ValueComponentRewriter.js +183 -0
- package/dist/src/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/tokenReaders/BaseTokenReader.js +86 -0
- package/dist/tokenReaders/BaseTokenReader.js.map +1 -0
- package/dist/tokenReaders/CommandTokenReader.js +221 -0
- package/dist/tokenReaders/CommandTokenReader.js.map +1 -0
- package/dist/tokenReaders/EscapedIdentifierTokenReader.js +99 -0
- package/dist/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/FunctionTokenReader.js +47 -0
- package/dist/tokenReaders/FunctionTokenReader.js.map +1 -0
- package/dist/tokenReaders/IdentifierTokenReader.js +34 -0
- package/dist/tokenReaders/IdentifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/LiteralTokenReader.js +329 -0
- package/dist/tokenReaders/LiteralTokenReader.js.map +1 -0
- package/dist/tokenReaders/OperatorTokenReader.js +152 -0
- package/dist/tokenReaders/OperatorTokenReader.js.map +1 -0
- package/dist/tokenReaders/ParameterTokenReader.js +190 -0
- package/dist/tokenReaders/ParameterTokenReader.js.map +1 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js +31 -0
- package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
- package/dist/tokenReaders/SymbolTokenReader.js +35 -0
- package/dist/tokenReaders/SymbolTokenReader.js.map +1 -0
- package/dist/tokenReaders/TokenReaderManager.js +110 -0
- package/dist/tokenReaders/TokenReaderManager.js.map +1 -0
- package/dist/tokenReaders/TypeTokenReader.js +69 -0
- package/dist/tokenReaders/TypeTokenReader.js.map +1 -0
- package/dist/transformers/AliasRenamer.js +600 -0
- package/dist/transformers/AliasRenamer.js.map +1 -0
- package/dist/transformers/CTEBuilder.js +188 -0
- package/dist/transformers/CTEBuilder.js.map +1 -0
- package/dist/transformers/CTECollector.js +409 -0
- package/dist/transformers/CTECollector.js.map +1 -0
- package/dist/transformers/CTEComposer.js +302 -0
- package/dist/transformers/CTEComposer.js.map +1 -0
- package/dist/transformers/CTEDependencyAnalyzer.js +285 -0
- package/dist/transformers/CTEDependencyAnalyzer.js.map +1 -0
- package/dist/transformers/CTEDependencyTracer.js +253 -0
- package/dist/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/transformers/CTEDisabler.js +355 -0
- package/dist/transformers/CTEDisabler.js.map +1 -0
- package/dist/transformers/CTEInjector.js +83 -0
- package/dist/transformers/CTEInjector.js.map +1 -0
- package/dist/transformers/CTENormalizer.js +46 -0
- package/dist/transformers/CTENormalizer.js.map +1 -0
- package/dist/transformers/CTEQueryDecomposer.js +589 -0
- package/dist/transformers/CTEQueryDecomposer.js.map +1 -0
- package/dist/transformers/CTERenamer.js +486 -0
- package/dist/transformers/CTERenamer.js.map +1 -0
- package/dist/transformers/CTETableReferenceCollector.js +358 -0
- package/dist/transformers/CTETableReferenceCollector.js.map +1 -0
- package/dist/transformers/ColumnReferenceCollector.js +478 -0
- package/dist/transformers/ColumnReferenceCollector.js.map +1 -0
- package/dist/transformers/DDLDiffGenerator.js +313 -0
- package/dist/transformers/DDLDiffGenerator.js.map +1 -0
- package/dist/transformers/DDLGeneralizer.js +119 -0
- package/dist/transformers/DDLGeneralizer.js.map +1 -0
- package/dist/transformers/DDLToFixtureConverter.js +206 -0
- package/dist/transformers/DDLToFixtureConverter.js.map +1 -0
- package/dist/transformers/DeleteResultSelectConverter.js +414 -0
- package/dist/transformers/DeleteResultSelectConverter.js.map +1 -0
- package/dist/transformers/DynamicQueryBuilder.js +164 -0
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -0
- package/dist/transformers/EnhancedJsonMapping.js +223 -0
- package/dist/transformers/EnhancedJsonMapping.js.map +1 -0
- package/dist/transformers/FilterableItemCollector.js +259 -0
- package/dist/transformers/FilterableItemCollector.js.map +1 -0
- package/dist/transformers/FixtureCteBuilder.js +151 -0
- package/dist/transformers/FixtureCteBuilder.js.map +1 -0
- package/dist/transformers/FormatOptionResolver.js +67 -0
- package/dist/transformers/FormatOptionResolver.js.map +1 -0
- package/dist/transformers/Formatter.js +38 -0
- package/dist/transformers/Formatter.js.map +1 -0
- package/dist/transformers/InsertQuerySelectValuesConverter.js +125 -0
- package/dist/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
- package/dist/transformers/InsertResultSelectConverter.js +589 -0
- package/dist/transformers/InsertResultSelectConverter.js.map +1 -0
- package/dist/transformers/JoinAggregationDecomposer.js +497 -0
- package/dist/transformers/JoinAggregationDecomposer.js.map +1 -0
- package/dist/transformers/JsonMappingConverter.js +392 -0
- package/dist/transformers/JsonMappingConverter.js.map +1 -0
- package/dist/transformers/JsonMappingUnifier.js +216 -0
- package/dist/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/transformers/LinePrinter.js +148 -0
- package/dist/transformers/LinePrinter.js.map +1 -0
- package/dist/transformers/MergeResultSelectConverter.js +310 -0
- package/dist/transformers/MergeResultSelectConverter.js.map +1 -0
- package/dist/transformers/ModelDrivenJsonMapping.js +122 -0
- package/dist/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/transformers/OnelineFormattingHelper.js +99 -0
- package/dist/transformers/OnelineFormattingHelper.js.map +1 -0
- package/dist/transformers/ParameterCollector.js +37 -0
- package/dist/transformers/ParameterCollector.js.map +1 -0
- package/dist/transformers/PostgresArrayEntityCteBuilder.js +458 -0
- package/dist/transformers/PostgresArrayEntityCteBuilder.js.map +1 -0
- package/dist/transformers/PostgresJsonQueryBuilder.js +245 -0
- package/dist/transformers/PostgresJsonQueryBuilder.js.map +1 -0
- package/dist/transformers/PostgresObjectEntityCteBuilder.js +347 -0
- package/dist/transformers/PostgresObjectEntityCteBuilder.js.map +1 -0
- package/dist/transformers/QueryBuilder.js +649 -0
- package/dist/transformers/QueryBuilder.js.map +1 -0
- package/dist/transformers/QueryFlowDiagramGenerator.js +157 -0
- package/dist/transformers/QueryFlowDiagramGenerator.js.map +1 -0
- package/dist/transformers/SchemaCollector.js +523 -0
- package/dist/transformers/SchemaCollector.js.map +1 -0
- package/dist/transformers/SelectResultSelectConverter.js +36 -0
- package/dist/transformers/SelectResultSelectConverter.js.map +1 -0
- package/dist/transformers/SelectValueCollector.js +244 -0
- package/dist/transformers/SelectValueCollector.js.map +1 -0
- package/dist/transformers/SelectableColumnCollector.js +674 -0
- package/dist/transformers/SelectableColumnCollector.js.map +1 -0
- package/dist/transformers/SimulatedSelectConverter.js +65 -0
- package/dist/transformers/SimulatedSelectConverter.js.map +1 -0
- package/dist/transformers/SmartRenamer.js +422 -0
- package/dist/transformers/SmartRenamer.js.map +1 -0
- package/dist/transformers/SqlFormatter.js +77 -0
- package/dist/transformers/SqlFormatter.js.map +1 -0
- package/dist/transformers/SqlIdentifierRenamer.js +504 -0
- package/dist/transformers/SqlIdentifierRenamer.js.map +1 -0
- package/dist/transformers/SqlOutputToken.js +13 -0
- package/dist/transformers/SqlOutputToken.js.map +1 -0
- package/dist/transformers/SqlPaginationInjector.js +108 -0
- package/dist/transformers/SqlPaginationInjector.js.map +1 -0
- package/dist/transformers/SqlParamInjector.js +802 -0
- package/dist/transformers/SqlParamInjector.js.map +1 -0
- package/dist/transformers/SqlParameterBinder.js +70 -0
- package/dist/transformers/SqlParameterBinder.js.map +1 -0
- package/dist/transformers/SqlPrinter.js +1478 -0
- package/dist/transformers/SqlPrinter.js.map +1 -0
- package/dist/transformers/SqlSortInjector.js +153 -0
- package/dist/transformers/SqlSortInjector.js.map +1 -0
- package/dist/transformers/TableColumnResolver.js +3 -0
- package/dist/transformers/TableColumnResolver.js.map +1 -0
- package/dist/transformers/TableSourceCollector.js +439 -0
- package/dist/transformers/TableSourceCollector.js.map +1 -0
- package/dist/transformers/TypeTransformationPostProcessor.js +363 -0
- package/dist/transformers/TypeTransformationPostProcessor.js.map +1 -0
- package/dist/transformers/UpdateResultSelectConverter.js +359 -0
- package/dist/transformers/UpdateResultSelectConverter.js.map +1 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js +184 -0
- package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/Formatting.js +3 -0
- package/dist/types/Formatting.js.map +1 -0
- package/dist/types/GenericFixture.js +3 -0
- package/dist/types/GenericFixture.js.map +1 -0
- package/dist/utils/CTERegionDetector.js +464 -0
- package/dist/utils/CTERegionDetector.js.map +1 -0
- package/dist/utils/CommentEditor.js +345 -0
- package/dist/utils/CommentEditor.js.map +1 -0
- package/dist/utils/CommentUtils.js +69 -0
- package/dist/utils/CommentUtils.js.map +1 -0
- package/dist/utils/CursorContextAnalyzer.js +338 -0
- package/dist/utils/CursorContextAnalyzer.js.map +1 -0
- package/dist/utils/IntelliSenseApi.js +292 -0
- package/dist/utils/IntelliSenseApi.js.map +1 -0
- package/dist/utils/JsonSchemaValidator.js +215 -0
- package/dist/utils/JsonSchemaValidator.js.map +1 -0
- package/dist/utils/KeywordCache.js +206 -0
- package/dist/utils/KeywordCache.js.map +1 -0
- package/dist/utils/LexemeCursor.js +314 -0
- package/dist/utils/LexemeCursor.js.map +1 -0
- package/dist/utils/MultiQuerySplitter.js +292 -0
- package/dist/utils/MultiQuerySplitter.js.map +1 -0
- package/dist/utils/OperatorPrecedence.js +107 -0
- package/dist/utils/OperatorPrecedence.js.map +1 -0
- package/dist/utils/ParameterDetector.js +53 -0
- package/dist/utils/ParameterDetector.js.map +1 -0
- package/dist/utils/ParameterHelper.js +31 -0
- package/dist/utils/ParameterHelper.js.map +1 -0
- package/dist/utils/ParameterRemover.js +783 -0
- package/dist/utils/ParameterRemover.js.map +1 -0
- package/dist/utils/ParserStringUtils.js +31 -0
- package/dist/utils/ParserStringUtils.js.map +1 -0
- package/dist/utils/PositionAwareParser.js +363 -0
- package/dist/utils/PositionAwareParser.js.map +1 -0
- package/dist/utils/SchemaManager.js +217 -0
- package/dist/utils/SchemaManager.js.map +1 -0
- package/dist/utils/ScopeResolver.js +272 -0
- package/dist/utils/ScopeResolver.js.map +1 -0
- package/dist/utils/SelectQueryWithClauseHelper.js +47 -0
- package/dist/utils/SelectQueryWithClauseHelper.js.map +1 -0
- package/dist/utils/SqlSchemaValidator.js +55 -0
- package/dist/utils/SqlSchemaValidator.js.map +1 -0
- package/dist/utils/TableNameUtils.js +35 -0
- package/dist/utils/TableNameUtils.js.map +1 -0
- package/dist/utils/TextPositionUtils.js +128 -0
- package/dist/utils/TextPositionUtils.js.map +1 -0
- package/dist/utils/ValueComponentRewriter.js +187 -0
- package/dist/utils/ValueComponentRewriter.js.map +1 -0
- package/dist/utils/charLookupTable.js +73 -0
- package/dist/utils/charLookupTable.js.map +1 -0
- package/dist/utils/stringUtils.js +230 -0
- package/dist/utils/stringUtils.js.map +1 -0
- package/package.json +62 -62
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValuesQueryParser = void 0;
|
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
|
5
|
+
const SelectQuery_1 = require("../models/SelectQuery");
|
|
6
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
7
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
8
|
+
const ValueParser_1 = require("./ValueParser");
|
|
9
|
+
const LexemeCommentUtils_1 = require("./utils/LexemeCommentUtils");
|
|
10
|
+
class ValuesQueryParser {
|
|
11
|
+
static parse(query) {
|
|
12
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
|
13
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
|
14
|
+
// Parse
|
|
15
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
16
|
+
// Error if there are remaining tokens
|
|
17
|
+
if (result.newIndex < lexemes.length) {
|
|
18
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The VALUES clause is complete but there are additional tokens.`);
|
|
19
|
+
}
|
|
20
|
+
return result.value;
|
|
21
|
+
}
|
|
22
|
+
static parseFromLexeme(lexemes, index) {
|
|
23
|
+
let idx = index;
|
|
24
|
+
if (idx >= lexemes.length) {
|
|
25
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but input ended early.`);
|
|
26
|
+
}
|
|
27
|
+
const valuesLexeme = lexemes[idx];
|
|
28
|
+
if (valuesLexeme.value.toLowerCase() !== 'values') {
|
|
29
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'VALUES' keyword but found "${valuesLexeme.value}". VALUES clauses must start with the VALUES keyword.`);
|
|
30
|
+
}
|
|
31
|
+
const valuesComments = (0, LexemeCommentUtils_1.extractLexemeComments)(valuesLexeme);
|
|
32
|
+
idx++;
|
|
33
|
+
if (idx >= lexemes.length) {
|
|
34
|
+
throw new Error(`Syntax error: Unexpected end of input after 'VALUES' keyword. The VALUES clause requires at least one tuple expression.`);
|
|
35
|
+
}
|
|
36
|
+
const tuples = [];
|
|
37
|
+
const firstTuple = this.parseTuple(lexemes, idx);
|
|
38
|
+
tuples.push(firstTuple.value);
|
|
39
|
+
idx = firstTuple.newIndex;
|
|
40
|
+
if (valuesComments.after.length > 0) {
|
|
41
|
+
firstTuple.value.addPositionedComments('before', valuesComments.after);
|
|
42
|
+
}
|
|
43
|
+
while (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
|
44
|
+
idx++;
|
|
45
|
+
const tuple = this.parseTuple(lexemes, idx);
|
|
46
|
+
tuples.push(tuple.value);
|
|
47
|
+
idx = tuple.newIndex;
|
|
48
|
+
}
|
|
49
|
+
const query = new SelectQuery_1.ValuesQuery(tuples);
|
|
50
|
+
if (valuesComments.before.length > 0) {
|
|
51
|
+
query.headerComments = valuesComments.before;
|
|
52
|
+
}
|
|
53
|
+
return { value: query, newIndex: idx };
|
|
54
|
+
}
|
|
55
|
+
static parseTuple(lexemes, index) {
|
|
56
|
+
let idx = index;
|
|
57
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
|
58
|
+
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis but found "${idx < lexemes.length ? lexemes[idx].value : "end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);
|
|
59
|
+
}
|
|
60
|
+
const openingComments = (0, LexemeCommentUtils_1.extractLexemeComments)(lexemes[idx]);
|
|
61
|
+
idx++;
|
|
62
|
+
const values = [];
|
|
63
|
+
if (idx >= lexemes.length) {
|
|
64
|
+
throw new Error(`Syntax error: Unexpected end of input after opening parenthesis in tuple expression.`);
|
|
65
|
+
}
|
|
66
|
+
if (lexemes[idx].type & Lexeme_1.TokenType.CloseParen) {
|
|
67
|
+
const tuple = new ValueComponent_1.TupleExpression([]);
|
|
68
|
+
const closingComments = (0, LexemeCommentUtils_1.extractLexemeComments)(lexemes[idx]);
|
|
69
|
+
idx++;
|
|
70
|
+
if (openingComments.before.length > 0) {
|
|
71
|
+
tuple.addPositionedComments('before', openingComments.before);
|
|
72
|
+
}
|
|
73
|
+
if (closingComments.after.length > 0) {
|
|
74
|
+
tuple.addPositionedComments('after', closingComments.after);
|
|
75
|
+
}
|
|
76
|
+
return { value: tuple, newIndex: idx };
|
|
77
|
+
}
|
|
78
|
+
const firstValue = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
79
|
+
values.push(firstValue.value);
|
|
80
|
+
idx = firstValue.newIndex;
|
|
81
|
+
while (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
|
82
|
+
idx++;
|
|
83
|
+
if (idx >= lexemes.length) {
|
|
84
|
+
throw new Error(`Syntax error: Unexpected end of input after comma in tuple expression.`);
|
|
85
|
+
}
|
|
86
|
+
const value = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
87
|
+
values.push(value.value);
|
|
88
|
+
idx = value.newIndex;
|
|
89
|
+
}
|
|
90
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.CloseParen) {
|
|
91
|
+
throw new Error(`Syntax error at position ${idx}: Expected closing parenthesis but found "${idx < lexemes.length ? lexemes[idx].value : "end of input"}". Tuple expressions in VALUES clause must be enclosed in parentheses.`);
|
|
92
|
+
}
|
|
93
|
+
const closingComments = (0, LexemeCommentUtils_1.extractLexemeComments)(lexemes[idx]);
|
|
94
|
+
idx++;
|
|
95
|
+
const tuple = new ValueComponent_1.TupleExpression(values);
|
|
96
|
+
if (openingComments.before.length > 0) {
|
|
97
|
+
tuple.addPositionedComments('before', openingComments.before);
|
|
98
|
+
}
|
|
99
|
+
if (openingComments.after.length > 0 && values.length > 0) {
|
|
100
|
+
values[0].addPositionedComments('before', openingComments.after);
|
|
101
|
+
}
|
|
102
|
+
if (closingComments.before.length > 0 && values.length > 0) {
|
|
103
|
+
values[values.length - 1].addPositionedComments('after', closingComments.before);
|
|
104
|
+
}
|
|
105
|
+
if (closingComments.after.length > 0) {
|
|
106
|
+
tuple.addPositionedComments('after', closingComments.after);
|
|
107
|
+
}
|
|
108
|
+
return { value: tuple, newIndex: idx };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ValuesQueryParser = ValuesQueryParser;
|
|
112
|
+
//# sourceMappingURL=ValuesQueryParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ValuesQueryParser.js","sourceRoot":"","sources":["../../src/parsers/ValuesQueryParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WhereClauseParser = void 0;
|
|
4
|
+
const Clause_1 = require("../models/Clause");
|
|
5
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
6
|
+
const ValueParser_1 = require("./ValueParser");
|
|
7
|
+
const CommentUtils_1 = require("../utils/CommentUtils");
|
|
8
|
+
class WhereClauseParser {
|
|
9
|
+
// Parse SQL string to AST (was: parse)
|
|
10
|
+
static parse(query) {
|
|
11
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
|
12
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
|
13
|
+
// Parse
|
|
14
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
15
|
+
// Error if there are remaining tokens
|
|
16
|
+
if (result.newIndex < lexemes.length) {
|
|
17
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WHERE clause is complete but there are additional tokens.`);
|
|
18
|
+
}
|
|
19
|
+
return result.value;
|
|
20
|
+
}
|
|
21
|
+
// Parse from lexeme array (was: parse)
|
|
22
|
+
static parseFromLexeme(lexemes, index) {
|
|
23
|
+
let idx = index;
|
|
24
|
+
// Capture comments associated with the WHERE clause
|
|
25
|
+
const whereLexeme = lexemes[idx];
|
|
26
|
+
const whereTokenComments = CommentUtils_1.CommentUtils.collectClauseComments(lexemes, idx, 'where');
|
|
27
|
+
// Preserve positioned comments from the WHERE keyword so we can reapply them during printing
|
|
28
|
+
const wherePositionedComments = whereLexeme.positionedComments;
|
|
29
|
+
if (whereLexeme.value !== 'where') {
|
|
30
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'WHERE' keyword but found "${lexemes[idx].value}". WHERE clauses must start with the WHERE keyword.`);
|
|
31
|
+
}
|
|
32
|
+
idx++;
|
|
33
|
+
if (idx >= lexemes.length) {
|
|
34
|
+
throw new Error(`Syntax error: Unexpected end of input after 'WHERE' keyword. The WHERE clause requires a condition expression.`);
|
|
35
|
+
}
|
|
36
|
+
const item = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
37
|
+
const clause = new Clause_1.WhereClause(item.value);
|
|
38
|
+
// Set comments from the WHERE token to the clause
|
|
39
|
+
clause.comments = whereTokenComments;
|
|
40
|
+
if (wherePositionedComments && wherePositionedComments.length > 0) {
|
|
41
|
+
// Clone positioned comments so mutations on the clause do not leak back to the tokenizer state
|
|
42
|
+
clause.positionedComments = wherePositionedComments.map((comment) => ({
|
|
43
|
+
position: comment.position,
|
|
44
|
+
comments: [...comment.comments],
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
return { value: clause, newIndex: item.newIndex };
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.WhereClauseParser = WhereClauseParser;
|
|
51
|
+
//# sourceMappingURL=WhereClauseParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WhereClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WhereClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAA+C;AAE/C,iDAA8C;AAC9C,+CAA4C;AAC5C,wDAAqD;AAErD,MAAa,iBAAiB;IAC1B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,aAAa;QAErD,QAAQ;QACR,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEhD,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,iEAAiE,CAAC,CAAC;QACxL,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,oDAAoD;QACpD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,kBAAkB,GAAG,2BAAY,CAAC,qBAAqB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACrF,6FAA6F;QAC7F,MAAM,uBAAuB,GAAG,WAAW,CAAC,kBAAkB,CAAC;QAE/D,IAAI,WAAW,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,yCAAyC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,qDAAqD,CAAC,CAAC;QACrK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;QACtI,CAAC;QAED,MAAM,IAAI,GAAG,yBAAW,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,kDAAkD;QAClD,MAAM,CAAC,QAAQ,GAAG,kBAAkB,CAAC;QAErC,IAAI,uBAAuB,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChE,+FAA+F;YAC/F,MAAM,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAClE,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;aAClC,CAAC,CAAC,CAAC;QACR,CAAC;QAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;CACJ;AAnDD,8CAmDC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WindowClauseParser = void 0;
|
|
4
|
+
const Clause_1 = require("../models/Clause");
|
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
7
|
+
const WindowExpressionParser_1 = require("./WindowExpressionParser");
|
|
8
|
+
class WindowClauseParser {
|
|
9
|
+
// Parse SQL string to AST (was: parse)
|
|
10
|
+
static parse(query) {
|
|
11
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query);
|
|
12
|
+
const lexemes = tokenizer.readLexmes();
|
|
13
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
14
|
+
if (result.newIndex < lexemes.length) {
|
|
15
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WINDOW clause is complete but there are additional tokens.`);
|
|
16
|
+
}
|
|
17
|
+
return result.value;
|
|
18
|
+
}
|
|
19
|
+
// Parse from lexeme array (was: parse)
|
|
20
|
+
static parseFromLexeme(lexemes, index) {
|
|
21
|
+
let idx = index;
|
|
22
|
+
if (lexemes[idx].value !== 'window') {
|
|
23
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'WINDOW' keyword but found "${lexemes[idx].value}". WINDOW clauses must start with the WINDOW keyword.`);
|
|
24
|
+
}
|
|
25
|
+
idx++;
|
|
26
|
+
if (idx >= lexemes.length) {
|
|
27
|
+
throw new Error(`Syntax error: Unexpected end of input after 'WINDOW' keyword. The WINDOW clause requires at least one window definition.`);
|
|
28
|
+
}
|
|
29
|
+
const windows = [];
|
|
30
|
+
while (idx < lexemes.length) {
|
|
31
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.Identifier) {
|
|
32
|
+
throw new Error(`Syntax error: Expected window name after 'WINDOW' keyword.`);
|
|
33
|
+
}
|
|
34
|
+
const name = lexemes[idx].value;
|
|
35
|
+
idx++;
|
|
36
|
+
if (idx >= lexemes.length || lexemes[idx].value !== 'as') {
|
|
37
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'AS' keyword after window name.`);
|
|
38
|
+
}
|
|
39
|
+
idx++;
|
|
40
|
+
const expr = WindowExpressionParser_1.WindowExpressionParser.parseFromLexeme(lexemes, idx);
|
|
41
|
+
idx = expr.newIndex;
|
|
42
|
+
windows.push(new Clause_1.WindowFrameClause(name, expr.value));
|
|
43
|
+
if (idx < lexemes.length && lexemes[idx].type & Lexeme_1.TokenType.Comma) {
|
|
44
|
+
idx++;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (windows.length === 0) {
|
|
51
|
+
throw new Error('At least one WINDOW clause is required after WINDOW keyword.');
|
|
52
|
+
}
|
|
53
|
+
return { value: new Clause_1.WindowsClause(windows), newIndex: idx };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.WindowClauseParser = WindowClauseParser;
|
|
57
|
+
//# sourceMappingURL=WindowClauseParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WindowClauseParser.ts"],"names":[],"mappings":";;;AAAA,6CAAoE;AACpE,6CAAqD;AACrD,iDAA8C;AAC9C,qEAAkE;AAElE,MAAa,kBAAkB;IAC3B,uCAAuC;IAChC,MAAM,CAAC,KAAK,CAAC,KAAa;QAC7B,MAAM,SAAS,GAAG,IAAI,2BAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChD,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,mCAAmC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,iBAAiB,MAAM,CAAC,QAAQ,kEAAkE,CAAC,CAAC;QACzL,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,uCAAuC;IAChC,MAAM,CAAC,eAAe,CAAC,OAAiB,EAAE,KAAa;QAC1D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,0CAA0C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,uDAAuD,CAAC,CAAC;QACxK,CAAC;QACD,GAAG,EAAE,CAAC;QAEN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0HAA0H,CAAC,CAAC;QAChJ,CAAC;QAED,MAAM,OAAO,GAAwB,EAAE,CAAC;QACxC,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAE1B,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,kBAAS,CAAC,UAAU,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;YAClF,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;YAChC,GAAG,EAAE,CAAC;YACN,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,4CAA4C,CAAC,CAAC;YACjG,CAAC;YACD,GAAG,EAAE,CAAC;YACN,MAAM,IAAI,GAAG,+CAAsB,CAAC,eAAe,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAClE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,IAAI,0BAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtD,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,kBAAS,CAAC,KAAK,EAAE,CAAC;gBAC9D,GAAG,EAAE,CAAC;YACV,CAAC;iBAAM,CAAC;gBACJ,MAAM;YACV,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACpF,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,IAAI,sBAAa,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChE,CAAC;CACJ;AArDD,gDAqDC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WindowExpressionParser = void 0;
|
|
4
|
+
const Lexeme_1 = require("../models/Lexeme");
|
|
5
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
6
|
+
const OrderByClauseParser_1 = require("./OrderByClauseParser");
|
|
7
|
+
const PartitionByParser_1 = require("./PartitionByParser");
|
|
8
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
9
|
+
const ValueParser_1 = require("./ValueParser");
|
|
10
|
+
class WindowExpressionParser {
|
|
11
|
+
// Parse SQL string to AST (was: parse)
|
|
12
|
+
static parse(query) {
|
|
13
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
|
14
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
|
15
|
+
// Parse
|
|
16
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
17
|
+
// Error if there are remaining tokens
|
|
18
|
+
if (result.newIndex < lexemes.length) {
|
|
19
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The window frame expression is complete but there are additional tokens.`);
|
|
20
|
+
}
|
|
21
|
+
return result.value;
|
|
22
|
+
}
|
|
23
|
+
// Parse from lexeme array (was: parse)
|
|
24
|
+
static parseFromLexeme(lexemes, index) {
|
|
25
|
+
let idx = index;
|
|
26
|
+
if (lexemes[idx].type !== Lexeme_1.TokenType.OpenParen) {
|
|
27
|
+
throw new Error(`Syntax error at position ${idx}: Expected opening parenthesis '(' but found "${lexemes[idx].value}".`);
|
|
28
|
+
}
|
|
29
|
+
idx++;
|
|
30
|
+
let partition = null;
|
|
31
|
+
let order = null;
|
|
32
|
+
let frameSpec = null;
|
|
33
|
+
if (idx < lexemes.length && lexemes[idx].value === 'partition by') {
|
|
34
|
+
const partitionResult = PartitionByParser_1.PartitionByParser.parseFromLexeme(lexemes, idx);
|
|
35
|
+
partition = partitionResult.value;
|
|
36
|
+
idx = partitionResult.newIndex;
|
|
37
|
+
}
|
|
38
|
+
if (idx < lexemes.length && lexemes[idx].value === 'order by') {
|
|
39
|
+
const orderResult = OrderByClauseParser_1.OrderByClauseParser.parseFromLexeme(lexemes, idx);
|
|
40
|
+
order = orderResult.value;
|
|
41
|
+
idx = orderResult.newIndex;
|
|
42
|
+
}
|
|
43
|
+
// Parse frame clause (ROWS/RANGE/GROUPS)
|
|
44
|
+
if (idx < lexemes.length && this.isFrameTypeKeyword(lexemes[idx].value)) {
|
|
45
|
+
const frameSpecResult = this.parseFrameSpec(lexemes, idx);
|
|
46
|
+
frameSpec = frameSpecResult.value;
|
|
47
|
+
idx = frameSpecResult.newIndex;
|
|
48
|
+
}
|
|
49
|
+
if (idx >= lexemes.length || lexemes[idx].type !== Lexeme_1.TokenType.CloseParen) {
|
|
50
|
+
throw new Error(`Syntax error at position ${idx}: Missing closing parenthesis ')' for window frame. Each opening parenthesis must have a matching closing parenthesis.`);
|
|
51
|
+
}
|
|
52
|
+
// Read close paren
|
|
53
|
+
idx++;
|
|
54
|
+
return { value: new ValueComponent_1.WindowFrameExpression(partition, order, frameSpec), newIndex: idx };
|
|
55
|
+
}
|
|
56
|
+
static isFrameTypeKeyword(value) {
|
|
57
|
+
const lowerValue = value;
|
|
58
|
+
return lowerValue === 'rows' || lowerValue === 'range' || lowerValue === 'groups';
|
|
59
|
+
}
|
|
60
|
+
static parseFrameSpec(lexemes, index) {
|
|
61
|
+
let idx = index;
|
|
62
|
+
// Determine frame type (ROWS/RANGE/GROUPS)
|
|
63
|
+
const frameTypeStr = lexemes[idx].value;
|
|
64
|
+
let frameType;
|
|
65
|
+
switch (frameTypeStr) {
|
|
66
|
+
case 'rows':
|
|
67
|
+
frameType = ValueComponent_1.WindowFrameType.Rows;
|
|
68
|
+
break;
|
|
69
|
+
case 'range':
|
|
70
|
+
frameType = ValueComponent_1.WindowFrameType.Range;
|
|
71
|
+
break;
|
|
72
|
+
case 'groups':
|
|
73
|
+
frameType = ValueComponent_1.WindowFrameType.Groups;
|
|
74
|
+
break;
|
|
75
|
+
default:
|
|
76
|
+
throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`);
|
|
77
|
+
}
|
|
78
|
+
idx++;
|
|
79
|
+
// Check for BETWEEN ... AND ... syntax
|
|
80
|
+
if (idx < lexemes.length && lexemes[idx].value === 'between') {
|
|
81
|
+
// BETWEEN ... AND ... syntax
|
|
82
|
+
idx++;
|
|
83
|
+
// Parse start boundary
|
|
84
|
+
const startBoundResult = this.parseFrameBoundary(lexemes, idx);
|
|
85
|
+
const startBound = startBoundResult.value;
|
|
86
|
+
idx = startBoundResult.newIndex;
|
|
87
|
+
// Check for AND keyword - may be recognized as a separate token or part of a compound token
|
|
88
|
+
if (idx >= lexemes.length || (lexemes[idx].value !== 'and')) {
|
|
89
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'AND' keyword in BETWEEN clause.`);
|
|
90
|
+
}
|
|
91
|
+
idx++; // Skip AND
|
|
92
|
+
// Parse end boundary
|
|
93
|
+
const endBoundResult = this.parseFrameBoundary(lexemes, idx);
|
|
94
|
+
const endBound = endBoundResult.value;
|
|
95
|
+
idx = endBoundResult.newIndex;
|
|
96
|
+
return {
|
|
97
|
+
value: new ValueComponent_1.WindowFrameSpec(frameType, startBound, endBound),
|
|
98
|
+
newIndex: idx
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Single boundary specification
|
|
103
|
+
const boundaryResult = this.parseFrameBoundary(lexemes, idx);
|
|
104
|
+
const startBound = boundaryResult.value;
|
|
105
|
+
idx = boundaryResult.newIndex;
|
|
106
|
+
return {
|
|
107
|
+
value: new ValueComponent_1.WindowFrameSpec(frameType, startBound, null),
|
|
108
|
+
newIndex: idx
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
static parseFrameBoundary(lexemes, index) {
|
|
113
|
+
let idx = index;
|
|
114
|
+
// Check for predefined boundaries
|
|
115
|
+
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Command)) {
|
|
116
|
+
const currentValue = lexemes[idx].value;
|
|
117
|
+
let frameBound;
|
|
118
|
+
switch (currentValue) {
|
|
119
|
+
case 'current row':
|
|
120
|
+
frameBound = ValueComponent_1.WindowFrameBound.CurrentRow;
|
|
121
|
+
break;
|
|
122
|
+
case 'unbounded preceding':
|
|
123
|
+
frameBound = ValueComponent_1.WindowFrameBound.UnboundedPreceding;
|
|
124
|
+
break;
|
|
125
|
+
case 'unbounded following':
|
|
126
|
+
frameBound = ValueComponent_1.WindowFrameBound.UnboundedFollowing;
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
throw new Error(`Syntax error at position ${idx}: Invalid frame type "${lexemes[idx].value}". Expected one of: ROWS, RANGE, GROUPS.`);
|
|
130
|
+
}
|
|
131
|
+
const bound = new ValueComponent_1.WindowFrameBoundStatic(frameBound);
|
|
132
|
+
return { value: bound, newIndex: idx + 1 };
|
|
133
|
+
}
|
|
134
|
+
else if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Literal)) {
|
|
135
|
+
// Parse the numeric/literal value
|
|
136
|
+
const valueResult = ValueParser_1.ValueParser.parseFromLexeme(lexemes, idx);
|
|
137
|
+
idx = valueResult.newIndex;
|
|
138
|
+
// Next token must be 'preceding' or 'following'
|
|
139
|
+
if (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Command)) {
|
|
140
|
+
const direction = lexemes[idx].value;
|
|
141
|
+
let isFollowing;
|
|
142
|
+
if (direction === 'preceding') {
|
|
143
|
+
isFollowing = false;
|
|
144
|
+
}
|
|
145
|
+
else if (direction === 'following') {
|
|
146
|
+
isFollowing = true;
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
|
150
|
+
}
|
|
151
|
+
idx++;
|
|
152
|
+
const bound = new ValueComponent_1.WindowFrameBoundaryValue(valueResult.value, isFollowing);
|
|
153
|
+
return { value: bound, newIndex: idx };
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
throw new Error(`Syntax error at position ${idx}: Expected 'preceding' or 'following' after numeric value in window frame boundary.`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
throw new Error(`Syntax error at position ${idx}: Expected a valid frame boundary component.`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.WindowExpressionParser = WindowExpressionParser;
|
|
163
|
+
//# sourceMappingURL=WindowExpressionParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowExpressionParser.js","sourceRoot":"","sources":["../../src/parsers/WindowExpressionParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WithClauseParser = void 0;
|
|
4
|
+
const Clause_1 = require("../models/Clause");
|
|
5
|
+
const Lexeme_1 = require("../models/Lexeme");
|
|
6
|
+
const SqlTokenizer_1 = require("./SqlTokenizer");
|
|
7
|
+
const CommonTableParser_1 = require("./CommonTableParser");
|
|
8
|
+
/**
|
|
9
|
+
* Parser for SQL WITH clauses (Common Table Expressions - CTEs).
|
|
10
|
+
* Parses only the WITH clause portion of SQL, not the entire query.
|
|
11
|
+
*
|
|
12
|
+
* **Note**: For most use cases, use `SelectQueryParser` which provides more comprehensive SQL parsing.
|
|
13
|
+
* This parser should only be used for the special case where you need to analyze only the WITH clause portion.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // Parses only the WITH clause, not the following SELECT
|
|
18
|
+
* const sql = "WITH recursive_cte AS (SELECT 1 as n UNION SELECT n+1 FROM recursive_cte WHERE n < 10)";
|
|
19
|
+
* const withClause = WithClauseParser.parse(sql);
|
|
20
|
+
* console.log(withClause.recursive); // true
|
|
21
|
+
* console.log(withClause.tables.length); // 1
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
class WithClauseParser {
|
|
25
|
+
/**
|
|
26
|
+
* Parses a SQL string containing only a WITH clause into a WithClause AST.
|
|
27
|
+
* The input should contain only the WITH clause, not the subsequent main query.
|
|
28
|
+
*
|
|
29
|
+
* @param query - The SQL string containing only the WITH clause
|
|
30
|
+
* @returns The parsed WithClause object
|
|
31
|
+
* @throws Error if the syntax is invalid or there are unexpected tokens after the WITH clause
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* // Correct: Only the WITH clause
|
|
36
|
+
* const sql = "WITH users_data AS (SELECT id, name FROM users)";
|
|
37
|
+
* const withClause = WithClauseParser.parse(sql);
|
|
38
|
+
*
|
|
39
|
+
* // Error: Contains SELECT after WITH clause
|
|
40
|
+
* // const badSql = "WITH users_data AS (SELECT id, name FROM users) SELECT * FROM users_data";
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
static parse(query) {
|
|
44
|
+
const tokenizer = new SqlTokenizer_1.SqlTokenizer(query); // Initialize tokenizer
|
|
45
|
+
const lexemes = tokenizer.readLexmes(); // Get tokens
|
|
46
|
+
// Parse
|
|
47
|
+
const result = this.parseFromLexeme(lexemes, 0);
|
|
48
|
+
// Error if there are remaining tokens
|
|
49
|
+
if (result.newIndex < lexemes.length) {
|
|
50
|
+
throw new Error(`Syntax error: Unexpected token "${lexemes[result.newIndex].value}" at position ${result.newIndex}. The WITH clause is complete but there are additional tokens.`);
|
|
51
|
+
}
|
|
52
|
+
return result.value;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parses a WITH clause from an array of lexemes starting at the specified index.
|
|
56
|
+
*
|
|
57
|
+
* @param lexemes - Array of lexemes to parse from
|
|
58
|
+
* @param index - Starting index in the lexemes array
|
|
59
|
+
* @returns Object containing the parsed WithClause and the new index position
|
|
60
|
+
* @throws Error if the syntax is invalid or WITH keyword is not found
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const tokenizer = new SqlTokenizer("WITH cte AS (SELECT 1)");
|
|
65
|
+
* const lexemes = tokenizer.readLexmes();
|
|
66
|
+
* const result = WithClauseParser.parseFromLexeme(lexemes, 0);
|
|
67
|
+
* console.log(result.value.tables.length); // 1
|
|
68
|
+
* console.log(result.newIndex); // position after the WITH clause
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
static parseFromLexeme(lexemes, index) {
|
|
72
|
+
let idx = index;
|
|
73
|
+
// Extract header comments from WITH token
|
|
74
|
+
const headerComments = this.extractWithTokenHeaderComments(lexemes, idx);
|
|
75
|
+
// Parse WITH keyword
|
|
76
|
+
idx = this.parseWithKeyword(lexemes, idx);
|
|
77
|
+
// Parse optional RECURSIVE keyword
|
|
78
|
+
const { recursive, newIndex: recursiveIndex } = this.parseRecursiveFlag(lexemes, idx);
|
|
79
|
+
idx = recursiveIndex;
|
|
80
|
+
// Parse all CTEs
|
|
81
|
+
const { tables, trailingComments, newIndex: ctesIndex } = this.parseAllCommonTables(lexemes, idx);
|
|
82
|
+
idx = ctesIndex;
|
|
83
|
+
// Create WITH clause and apply trailing comments directly
|
|
84
|
+
const withClause = new Clause_1.WithClause(recursive, tables);
|
|
85
|
+
if (trailingComments.length > 0) {
|
|
86
|
+
withClause.trailingComments = trailingComments;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
value: withClause,
|
|
90
|
+
newIndex: idx,
|
|
91
|
+
headerComments: headerComments
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Extract header comments from WITH token
|
|
95
|
+
static extractWithTokenHeaderComments(lexemes, index) {
|
|
96
|
+
if (index >= lexemes.length)
|
|
97
|
+
return null;
|
|
98
|
+
const withToken = lexemes[index];
|
|
99
|
+
let headerComments = null;
|
|
100
|
+
// Extract positioned comments: only "before" comments are header comments
|
|
101
|
+
if (withToken.positionedComments && withToken.positionedComments.length > 0) {
|
|
102
|
+
for (const posComment of withToken.positionedComments) {
|
|
103
|
+
if (posComment.position === 'before' && posComment.comments) {
|
|
104
|
+
if (!headerComments)
|
|
105
|
+
headerComments = [];
|
|
106
|
+
headerComments.push(...posComment.comments);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Fallback to legacy comments if no positioned comments (for backward compatibility)
|
|
111
|
+
if (!headerComments && withToken.comments && withToken.comments.length > 0) {
|
|
112
|
+
headerComments = [...withToken.comments];
|
|
113
|
+
}
|
|
114
|
+
return headerComments;
|
|
115
|
+
}
|
|
116
|
+
// Parse WITH keyword
|
|
117
|
+
static parseWithKeyword(lexemes, index) {
|
|
118
|
+
if (index < lexemes.length && lexemes[index].value.toLowerCase() === "with") {
|
|
119
|
+
return index + 1;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
throw new Error(`Syntax error at position ${index}: Expected WITH keyword.`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Parse optional RECURSIVE keyword
|
|
126
|
+
static parseRecursiveFlag(lexemes, index) {
|
|
127
|
+
const recursive = index < lexemes.length && lexemes[index].value.toLowerCase() === "recursive";
|
|
128
|
+
return {
|
|
129
|
+
recursive,
|
|
130
|
+
newIndex: recursive ? index + 1 : index
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
// Parse all common table expressions
|
|
134
|
+
static parseAllCommonTables(lexemes, index) {
|
|
135
|
+
let idx = index;
|
|
136
|
+
const tables = [];
|
|
137
|
+
const allTrailingComments = [];
|
|
138
|
+
// Parse first CTE (required)
|
|
139
|
+
const firstCte = CommonTableParser_1.CommonTableParser.parseFromLexeme(lexemes, idx);
|
|
140
|
+
tables.push(firstCte.value);
|
|
141
|
+
idx = firstCte.newIndex;
|
|
142
|
+
// Collect trailing comments from first CTE directly
|
|
143
|
+
if (firstCte.trailingComments) {
|
|
144
|
+
allTrailingComments.push(...firstCte.trailingComments);
|
|
145
|
+
}
|
|
146
|
+
// Parse additional CTEs (optional)
|
|
147
|
+
while (idx < lexemes.length && (lexemes[idx].type & Lexeme_1.TokenType.Comma)) {
|
|
148
|
+
idx++; // Skip comma
|
|
149
|
+
const cteResult = CommonTableParser_1.CommonTableParser.parseFromLexeme(lexemes, idx);
|
|
150
|
+
tables.push(cteResult.value);
|
|
151
|
+
idx = cteResult.newIndex;
|
|
152
|
+
// Collect trailing comments from this CTE directly
|
|
153
|
+
if (cteResult.trailingComments) {
|
|
154
|
+
allTrailingComments.push(...cteResult.trailingComments);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
tables,
|
|
159
|
+
trailingComments: allTrailingComments,
|
|
160
|
+
newIndex: idx
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
exports.WithClauseParser = WithClauseParser;
|
|
165
|
+
//# sourceMappingURL=WithClauseParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WithClauseParser.js","sourceRoot":"","sources":["../../src/parsers/WithClauseParser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractLexemeComments = extractLexemeComments;
|
|
4
|
+
// Extracts positioned comments from a lexeme while preserving order and duplicates.
|
|
5
|
+
function extractLexemeComments(lexeme) {
|
|
6
|
+
const before = [];
|
|
7
|
+
const after = [];
|
|
8
|
+
if (!lexeme) {
|
|
9
|
+
return { before, after };
|
|
10
|
+
}
|
|
11
|
+
if (lexeme.positionedComments && lexeme.positionedComments.length > 0) {
|
|
12
|
+
for (const positioned of lexeme.positionedComments) {
|
|
13
|
+
if (!positioned.comments || positioned.comments.length === 0) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
if (positioned.position === "before") {
|
|
17
|
+
before.push(...positioned.comments);
|
|
18
|
+
}
|
|
19
|
+
else if (positioned.position === "after") {
|
|
20
|
+
after.push(...positioned.comments);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else if (lexeme.comments && lexeme.comments.length > 0) {
|
|
25
|
+
before.push(...lexeme.comments);
|
|
26
|
+
}
|
|
27
|
+
return { before, after };
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=LexemeCommentUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LexemeCommentUtils.js","sourceRoot":"","sources":["../../../src/parsers/utils/LexemeCommentUtils.ts"],"names":[],"mappings":";;AAQA,sDAyBC;AA1BD,oFAAoF;AACpF,SAAgB,qBAAqB,CAAC,MAA0B;IAC5D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,kBAAkB,IAAI,MAAM,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,kBAAkB,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3D,SAAS;YACb,CAAC;YAED,IAAI,UAAU,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBACnC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,UAAU,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;IACL,CAAC;SAAM,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC"}
|