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,674 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SelectableColumnCollector = exports.DuplicateDetectionMode = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Enum for duplicate detection modes in SelectableColumnCollector.
|
|
6
|
+
* Determines how duplicates are identified during column collection.
|
|
7
|
+
*/
|
|
8
|
+
var DuplicateDetectionMode;
|
|
9
|
+
(function (DuplicateDetectionMode) {
|
|
10
|
+
/**
|
|
11
|
+
* Detect duplicates based only on column names.
|
|
12
|
+
* This mode ignores the table name, so columns with the same name
|
|
13
|
+
* from different tables are considered duplicates.
|
|
14
|
+
*/
|
|
15
|
+
DuplicateDetectionMode["ColumnNameOnly"] = "columnNameOnly";
|
|
16
|
+
/**
|
|
17
|
+
* Detect duplicates based on both table and column names.
|
|
18
|
+
* This mode ensures that columns with the same name from different
|
|
19
|
+
* tables are treated as distinct.
|
|
20
|
+
*/
|
|
21
|
+
DuplicateDetectionMode["FullName"] = "fullName";
|
|
22
|
+
})(DuplicateDetectionMode || (exports.DuplicateDetectionMode = DuplicateDetectionMode = {}));
|
|
23
|
+
const Clause_1 = require("../models/Clause");
|
|
24
|
+
const SelectQuery_1 = require("../models/SelectQuery");
|
|
25
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
26
|
+
const CTECollector_1 = require("./CTECollector");
|
|
27
|
+
const SelectValueCollector_1 = require("./SelectValueCollector");
|
|
28
|
+
/**
|
|
29
|
+
* A visitor that collects all ColumnReference instances from SQL query structures.
|
|
30
|
+
* This visitor scans through all clauses and collects all unique ColumnReference objects.
|
|
31
|
+
* It supports both regular column collection and upstream column collection for maximum
|
|
32
|
+
* search conditions in DynamicQuery scenarios.
|
|
33
|
+
*
|
|
34
|
+
* Supported query types:
|
|
35
|
+
* - SimpleSelectQuery: Basic SELECT queries with all standard clauses
|
|
36
|
+
* - BinarySelectQuery: UNION, INTERSECT, EXCEPT queries (collects from both sides)
|
|
37
|
+
* - Common Table Expressions (CTEs) within queries
|
|
38
|
+
* - Subqueries and nested queries
|
|
39
|
+
*
|
|
40
|
+
* Behavioral notes:
|
|
41
|
+
* - Collects column references to tables defined in the root FROM/JOIN clauses
|
|
42
|
+
* - For aliased columns (e.g., 'title as name'), collects both the original column
|
|
43
|
+
* reference ('title') AND the alias ('name') to enable complete dependency tracking
|
|
44
|
+
* - When upstream option is enabled, collects all available columns from upstream sources
|
|
45
|
+
* (CTEs, subqueries, and tables) for maximum search conditions in DynamicQuery
|
|
46
|
+
* - Automatically removes duplicates based on the specified duplicate detection mode
|
|
47
|
+
*
|
|
48
|
+
* Use cases:
|
|
49
|
+
* - Dependency analysis and schema migration tools
|
|
50
|
+
* - Column usage tracking across complex queries including unions and CTEs
|
|
51
|
+
* - Security analysis for column-level access control
|
|
52
|
+
* - DynamicQuery maximum search condition column discovery
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* // Basic usage - collect only referenced columns
|
|
57
|
+
* const collector = new SelectableColumnCollector();
|
|
58
|
+
* const columns = collector.collect(query);
|
|
59
|
+
*
|
|
60
|
+
* // With upstream collection for DynamicQuery
|
|
61
|
+
* const upstreamCollector = new SelectableColumnCollector(
|
|
62
|
+
* null, false, DuplicateDetectionMode.ColumnNameOnly,
|
|
63
|
+
* { upstream: true }
|
|
64
|
+
* );
|
|
65
|
+
* const allColumns = upstreamCollector.collect(query);
|
|
66
|
+
*
|
|
67
|
+
* // Works with union queries and CTEs
|
|
68
|
+
* const unionQuery = SelectQueryParser.parse(`
|
|
69
|
+
* SELECT name, email FROM users
|
|
70
|
+
* UNION
|
|
71
|
+
* SELECT name, email FROM customers
|
|
72
|
+
* `);
|
|
73
|
+
* const unionColumns = collector.collect(unionQuery);
|
|
74
|
+
* ```
|
|
75
|
+
* Related tests: packages/core/tests/transformers/SelectableColumnCollector.test.ts
|
|
76
|
+
*/
|
|
77
|
+
class SelectableColumnCollector {
|
|
78
|
+
/**
|
|
79
|
+
* Creates a new instance of SelectableColumnCollector.
|
|
80
|
+
*
|
|
81
|
+
* @param {TableColumnResolver | null} [tableColumnResolver=null] - The resolver used to resolve column references to their respective tables.
|
|
82
|
+
* @param {boolean} [includeWildCard=false] - If true, wildcard columns (e.g., `*`) are included in the collection.
|
|
83
|
+
* @param {DuplicateDetectionMode} [duplicateDetection=DuplicateDetectionMode.ColumnNameOnly] - Specifies the duplicate detection mode: 'columnNameOnly' (default, only column name is used), or 'fullName' (table name + column name).
|
|
84
|
+
* @param {Object} [options={}] - Additional options for the collector.
|
|
85
|
+
* @param {boolean} [options.ignoreCaseAndUnderscore=false] - If true, column names are compared without considering case and underscores.
|
|
86
|
+
* @param {boolean} [options.upstream=false] - If true, collect all columns available from upstream sources for maximum search conditions in DynamicQuery.
|
|
87
|
+
*/
|
|
88
|
+
constructor(tableColumnResolver, includeWildCard = false, duplicateDetection = DuplicateDetectionMode.ColumnNameOnly, options) {
|
|
89
|
+
this.selectValues = [];
|
|
90
|
+
this.visitedNodes = new Set();
|
|
91
|
+
this.uniqueKeys = new Set();
|
|
92
|
+
this.isRootVisit = true;
|
|
93
|
+
this.tableColumnResolver = null;
|
|
94
|
+
this.commonTables = [];
|
|
95
|
+
this.initializeProperties(tableColumnResolver, includeWildCard, duplicateDetection, options);
|
|
96
|
+
this.initializeHandlers();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Initialize instance properties.
|
|
100
|
+
*/
|
|
101
|
+
initializeProperties(tableColumnResolver, includeWildCard, duplicateDetection, options) {
|
|
102
|
+
this.tableColumnResolver = tableColumnResolver !== null && tableColumnResolver !== void 0 ? tableColumnResolver : null;
|
|
103
|
+
this.includeWildCard = includeWildCard;
|
|
104
|
+
this.commonTableCollector = new CTECollector_1.CTECollector();
|
|
105
|
+
this.commonTables = [];
|
|
106
|
+
this.duplicateDetection = duplicateDetection;
|
|
107
|
+
this.options = options || {};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Initialize the handler map for different SQL component types.
|
|
111
|
+
*/
|
|
112
|
+
initializeHandlers() {
|
|
113
|
+
this.handlers = new Map();
|
|
114
|
+
// Main entry point handlers
|
|
115
|
+
this.handlers.set(SelectQuery_1.SimpleSelectQuery.kind, (expr) => this.visitSimpleSelectQuery(expr));
|
|
116
|
+
this.handlers.set(SelectQuery_1.BinarySelectQuery.kind, (expr) => this.visitBinarySelectQuery(expr));
|
|
117
|
+
// Clause handlers
|
|
118
|
+
this.initializeClauseHandlers();
|
|
119
|
+
// Value component handlers
|
|
120
|
+
this.initializeValueComponentHandlers();
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Initialize handlers for SQL clause types.
|
|
124
|
+
*/
|
|
125
|
+
initializeClauseHandlers() {
|
|
126
|
+
this.handlers.set(Clause_1.SelectClause.kind, (expr) => this.visitSelectClause(expr));
|
|
127
|
+
this.handlers.set(Clause_1.FromClause.kind, (expr) => this.visitFromClause(expr));
|
|
128
|
+
this.handlers.set(Clause_1.WhereClause.kind, (expr) => this.visitWhereClause(expr));
|
|
129
|
+
this.handlers.set(Clause_1.GroupByClause.kind, (expr) => this.visitGroupByClause(expr));
|
|
130
|
+
this.handlers.set(Clause_1.HavingClause.kind, (expr) => this.visitHavingClause(expr));
|
|
131
|
+
this.handlers.set(Clause_1.OrderByClause.kind, (expr) => this.visitOrderByClause(expr));
|
|
132
|
+
this.handlers.set(Clause_1.WindowFrameClause.kind, (expr) => this.visitWindowFrameClause(expr));
|
|
133
|
+
this.handlers.set(Clause_1.LimitClause.kind, (expr) => this.visitLimitClause(expr));
|
|
134
|
+
this.handlers.set(Clause_1.OffsetClause.kind, (expr) => this.offsetClause(expr));
|
|
135
|
+
this.handlers.set(Clause_1.FetchClause.kind, (expr) => this.visitFetchClause(expr));
|
|
136
|
+
// JOIN condition handlers
|
|
137
|
+
this.handlers.set(Clause_1.JoinOnClause.kind, (expr) => this.visitJoinOnClause(expr));
|
|
138
|
+
this.handlers.set(Clause_1.JoinUsingClause.kind, (expr) => this.visitJoinUsingClause(expr));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Initialize handlers for value component types.
|
|
142
|
+
*/
|
|
143
|
+
initializeValueComponentHandlers() {
|
|
144
|
+
this.handlers.set(ValueComponent_1.ColumnReference.kind, (expr) => this.visitColumnReference(expr));
|
|
145
|
+
this.handlers.set(ValueComponent_1.BinaryExpression.kind, (expr) => this.visitBinaryExpression(expr));
|
|
146
|
+
this.handlers.set(ValueComponent_1.UnaryExpression.kind, (expr) => this.visitUnaryExpression(expr));
|
|
147
|
+
this.handlers.set(ValueComponent_1.FunctionCall.kind, (expr) => this.visitFunctionCall(expr));
|
|
148
|
+
this.handlers.set(ValueComponent_1.InlineQuery.kind, (expr) => this.visitInlineQuery(expr));
|
|
149
|
+
this.handlers.set(ValueComponent_1.ParenExpression.kind, (expr) => this.visitParenExpression(expr));
|
|
150
|
+
this.handlers.set(ValueComponent_1.CaseExpression.kind, (expr) => this.visitCaseExpression(expr));
|
|
151
|
+
this.handlers.set(ValueComponent_1.CastExpression.kind, (expr) => this.visitCastExpression(expr));
|
|
152
|
+
this.handlers.set(ValueComponent_1.BetweenExpression.kind, (expr) => this.visitBetweenExpression(expr));
|
|
153
|
+
this.handlers.set(ValueComponent_1.ArrayExpression.kind, (expr) => this.visitArrayExpression(expr));
|
|
154
|
+
this.handlers.set(ValueComponent_1.ArrayQueryExpression.kind, (expr) => this.visitArrayQueryExpression(expr));
|
|
155
|
+
this.handlers.set(ValueComponent_1.ArraySliceExpression.kind, (expr) => this.visitArraySliceExpression(expr));
|
|
156
|
+
this.handlers.set(ValueComponent_1.ArrayIndexExpression.kind, (expr) => this.visitArrayIndexExpression(expr));
|
|
157
|
+
this.handlers.set(ValueComponent_1.ValueList.kind, (expr) => this.visitValueList(expr));
|
|
158
|
+
this.handlers.set(ValueComponent_1.WindowFrameExpression.kind, (expr) => this.visitWindowFrameExpression(expr));
|
|
159
|
+
this.handlers.set(Clause_1.PartitionByClause.kind, (expr) => this.visitPartitionByClause(expr));
|
|
160
|
+
}
|
|
161
|
+
getValues() {
|
|
162
|
+
return this.selectValues;
|
|
163
|
+
}
|
|
164
|
+
collect(arg) {
|
|
165
|
+
// Input validation
|
|
166
|
+
if (!arg) {
|
|
167
|
+
throw new Error("Input argument cannot be null or undefined");
|
|
168
|
+
}
|
|
169
|
+
// Visit the component and return the collected select items
|
|
170
|
+
this.visit(arg);
|
|
171
|
+
const items = this.getValues();
|
|
172
|
+
this.reset(); // Reset after collection
|
|
173
|
+
return items;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Reset the collection of ColumnReferences
|
|
177
|
+
*/
|
|
178
|
+
reset() {
|
|
179
|
+
this.selectValues = [];
|
|
180
|
+
this.visitedNodes.clear();
|
|
181
|
+
this.uniqueKeys.clear();
|
|
182
|
+
this.commonTables = [];
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Add a select value as unique, according to the duplicate detection option.
|
|
186
|
+
* Uses efficient Set-based duplicate detection for better performance.
|
|
187
|
+
*/
|
|
188
|
+
addSelectValueAsUnique(name, value) {
|
|
189
|
+
const key = this.generateUniqueKey(name, value);
|
|
190
|
+
if (!this.uniqueKeys.has(key)) {
|
|
191
|
+
this.uniqueKeys.add(key);
|
|
192
|
+
this.selectValues.push({ name, value });
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Generate a unique key based on the duplicate detection mode.
|
|
197
|
+
*/
|
|
198
|
+
generateUniqueKey(name, value) {
|
|
199
|
+
if (this.duplicateDetection === DuplicateDetectionMode.ColumnNameOnly) {
|
|
200
|
+
// Apply case and underscore normalization if specified
|
|
201
|
+
return this.normalizeColumnName(name);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
// FullName mode: include table name
|
|
205
|
+
let tableName = '';
|
|
206
|
+
if (value && typeof value.getNamespace === 'function') {
|
|
207
|
+
tableName = value.getNamespace() || '';
|
|
208
|
+
}
|
|
209
|
+
const fullName = tableName ? tableName + '.' + name : name;
|
|
210
|
+
return this.normalizeColumnName(fullName);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Normalize column name based on options.
|
|
215
|
+
* Ensures safe string handling to prevent injection attacks.
|
|
216
|
+
*/
|
|
217
|
+
normalizeColumnName(name) {
|
|
218
|
+
if (typeof name !== 'string') {
|
|
219
|
+
throw new Error("Column name must be a string");
|
|
220
|
+
}
|
|
221
|
+
if (this.options.ignoreCaseAndUnderscore) {
|
|
222
|
+
return name.toLowerCase().replace(/_/g, '');
|
|
223
|
+
}
|
|
224
|
+
return name;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Main entry point for the visitor pattern.
|
|
228
|
+
* Implements the shallow visit pattern to distinguish between root and recursive visits.
|
|
229
|
+
*/
|
|
230
|
+
visit(arg) {
|
|
231
|
+
// If not a root visit, just visit the node and return
|
|
232
|
+
if (!this.isRootVisit) {
|
|
233
|
+
this.visitNode(arg);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (!(arg instanceof SelectQuery_1.SimpleSelectQuery || arg instanceof SelectQuery_1.BinarySelectQuery)) {
|
|
237
|
+
throw new Error("Root visit requires a SimpleSelectQuery or BinarySelectQuery.");
|
|
238
|
+
}
|
|
239
|
+
// If this is a root visit, we need to reset the state
|
|
240
|
+
this.reset();
|
|
241
|
+
this.isRootVisit = false;
|
|
242
|
+
this.commonTables = this.commonTableCollector.collect(arg);
|
|
243
|
+
try {
|
|
244
|
+
this.visitNode(arg);
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
// Regardless of success or failure, reset the root visit flag
|
|
248
|
+
this.isRootVisit = true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Internal visit method used for all nodes.
|
|
253
|
+
* This separates the visit flag management from the actual node visitation logic.
|
|
254
|
+
*/
|
|
255
|
+
visitNode(arg) {
|
|
256
|
+
// Skip if we've already visited this node to prevent infinite recursion
|
|
257
|
+
if (this.visitedNodes.has(arg)) {
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
// Mark as visited
|
|
261
|
+
this.visitedNodes.add(arg);
|
|
262
|
+
try {
|
|
263
|
+
const handler = this.handlers.get(arg.getKind());
|
|
264
|
+
if (handler) {
|
|
265
|
+
handler(arg);
|
|
266
|
+
}
|
|
267
|
+
// For any other component types, we don't need to do anything
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
// Re-throw with additional context
|
|
271
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
272
|
+
throw new Error(`Error processing SQL component of type ${arg.getKind().toString()}: ${errorMessage}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Process a SimpleSelectQuery to collect ColumnReferences from all its clauses
|
|
277
|
+
*/
|
|
278
|
+
visitSimpleSelectQuery(query) {
|
|
279
|
+
// Visit all clauses that might contain column references
|
|
280
|
+
if (query.selectClause) {
|
|
281
|
+
query.selectClause.accept(this);
|
|
282
|
+
}
|
|
283
|
+
if (query.fromClause) {
|
|
284
|
+
query.fromClause.accept(this);
|
|
285
|
+
}
|
|
286
|
+
if (query.whereClause) {
|
|
287
|
+
query.whereClause.accept(this);
|
|
288
|
+
}
|
|
289
|
+
if (query.groupByClause) {
|
|
290
|
+
query.groupByClause.accept(this);
|
|
291
|
+
}
|
|
292
|
+
if (query.havingClause) {
|
|
293
|
+
query.havingClause.accept(this);
|
|
294
|
+
}
|
|
295
|
+
if (query.windowClause) {
|
|
296
|
+
for (const win of query.windowClause.windows) {
|
|
297
|
+
win.accept(this);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (query.orderByClause) {
|
|
301
|
+
query.orderByClause.accept(this);
|
|
302
|
+
}
|
|
303
|
+
if (query.limitClause) {
|
|
304
|
+
query.limitClause.accept(this);
|
|
305
|
+
}
|
|
306
|
+
if (query.offsetClause) {
|
|
307
|
+
query.offsetClause.accept(this);
|
|
308
|
+
}
|
|
309
|
+
if (query.fetchClause) {
|
|
310
|
+
query.fetchClause.accept(this);
|
|
311
|
+
}
|
|
312
|
+
if (query.forClause) {
|
|
313
|
+
query.forClause.accept(this);
|
|
314
|
+
}
|
|
315
|
+
// Explicitly NOT processing query.WithClause to avoid scanning CTEs
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Process a BinarySelectQuery (UNION, INTERSECT, EXCEPT) to collect ColumnReferences from both sides
|
|
319
|
+
*/
|
|
320
|
+
visitBinarySelectQuery(query) {
|
|
321
|
+
// Collect from the left side
|
|
322
|
+
if (query.left instanceof SelectQuery_1.SimpleSelectQuery) {
|
|
323
|
+
this.visitSimpleSelectQuery(query.left);
|
|
324
|
+
}
|
|
325
|
+
else if (query.left instanceof SelectQuery_1.BinarySelectQuery) {
|
|
326
|
+
this.visitBinarySelectQuery(query.left);
|
|
327
|
+
}
|
|
328
|
+
// Collect from the right side
|
|
329
|
+
if (query.right instanceof SelectQuery_1.SimpleSelectQuery) {
|
|
330
|
+
this.visitSimpleSelectQuery(query.right);
|
|
331
|
+
}
|
|
332
|
+
else if (query.right instanceof SelectQuery_1.BinarySelectQuery) {
|
|
333
|
+
this.visitBinarySelectQuery(query.right);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
// Clause handlers
|
|
337
|
+
visitSelectClause(clause) {
|
|
338
|
+
for (const item of clause.items) {
|
|
339
|
+
if (item.identifier) {
|
|
340
|
+
// For aliased items, add the alias name
|
|
341
|
+
this.addSelectValueAsUnique(item.identifier.name, item.value);
|
|
342
|
+
}
|
|
343
|
+
else if (item.value instanceof ValueComponent_1.ColumnReference) {
|
|
344
|
+
// For non-aliased column references, preserve namespace information
|
|
345
|
+
// This ensures u.id and p.id are treated as separate columns in FullName mode
|
|
346
|
+
const columnName = item.value.column.name;
|
|
347
|
+
if (columnName !== "*") {
|
|
348
|
+
this.addSelectValueAsUnique(columnName, item.value);
|
|
349
|
+
}
|
|
350
|
+
else if (this.includeWildCard) {
|
|
351
|
+
this.addSelectValueAsUnique(columnName, item.value);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
// For other value types (functions, expressions, etc.), process normally
|
|
356
|
+
item.value.accept(this);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
visitFromClause(clause) {
|
|
361
|
+
// import source values
|
|
362
|
+
const collector = new SelectValueCollector_1.SelectValueCollector(this.tableColumnResolver, this.commonTables);
|
|
363
|
+
const sourceValues = collector.collect(clause);
|
|
364
|
+
for (const item of sourceValues) {
|
|
365
|
+
// Add the select value as unique to avoid duplicates
|
|
366
|
+
this.addSelectValueAsUnique(item.name, item.value);
|
|
367
|
+
}
|
|
368
|
+
// If upstream option is enabled, collect all available columns from upstream sources
|
|
369
|
+
if (this.options.upstream) {
|
|
370
|
+
this.collectUpstreamColumns(clause);
|
|
371
|
+
}
|
|
372
|
+
if (clause.joins) {
|
|
373
|
+
for (const join of clause.joins) {
|
|
374
|
+
if (join.condition) {
|
|
375
|
+
join.condition.accept(this);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
visitWhereClause(clause) {
|
|
381
|
+
if (clause.condition) {
|
|
382
|
+
clause.condition.accept(this);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
visitGroupByClause(clause) {
|
|
386
|
+
if (clause.grouping) {
|
|
387
|
+
for (const item of clause.grouping) {
|
|
388
|
+
item.accept(this);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
visitHavingClause(clause) {
|
|
393
|
+
if (clause.condition) {
|
|
394
|
+
clause.condition.accept(this);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
visitOrderByClause(clause) {
|
|
398
|
+
if (clause.order) {
|
|
399
|
+
for (const item of clause.order) {
|
|
400
|
+
item.accept(this);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
visitWindowFrameClause(clause) {
|
|
405
|
+
clause.expression.accept(this);
|
|
406
|
+
}
|
|
407
|
+
visitWindowFrameExpression(expr) {
|
|
408
|
+
if (expr.partition) {
|
|
409
|
+
expr.partition.accept(this);
|
|
410
|
+
}
|
|
411
|
+
if (expr.order) {
|
|
412
|
+
expr.order.accept(this);
|
|
413
|
+
}
|
|
414
|
+
if (expr.frameSpec) {
|
|
415
|
+
expr.frameSpec.accept(this);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
visitLimitClause(clause) {
|
|
419
|
+
if (clause.value) {
|
|
420
|
+
clause.value.accept(this);
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
offsetClause(clause) {
|
|
424
|
+
if (clause.value) {
|
|
425
|
+
clause.value.accept(this);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
visitFetchClause(clause) {
|
|
429
|
+
if (clause.expression) {
|
|
430
|
+
clause.expression.accept(this);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
visitJoinOnClause(joinOnClause) {
|
|
434
|
+
// Visit the join condition
|
|
435
|
+
if (joinOnClause.condition) {
|
|
436
|
+
joinOnClause.condition.accept(this);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
visitJoinUsingClause(joinUsingClause) {
|
|
440
|
+
// Visit the columns in the USING clause
|
|
441
|
+
if (joinUsingClause.condition) {
|
|
442
|
+
joinUsingClause.condition.accept(this);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Value component handlers
|
|
446
|
+
visitColumnReference(columnRef) {
|
|
447
|
+
if (columnRef.column.name !== "*") {
|
|
448
|
+
this.addSelectValueAsUnique(columnRef.column.name, columnRef);
|
|
449
|
+
}
|
|
450
|
+
else if (!this.includeWildCard) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
this.addSelectValueAsUnique(columnRef.column.name, columnRef);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
visitBinaryExpression(expr) {
|
|
458
|
+
// Visit both sides of the expression
|
|
459
|
+
if (expr.left) {
|
|
460
|
+
expr.left.accept(this);
|
|
461
|
+
}
|
|
462
|
+
if (expr.right) {
|
|
463
|
+
expr.right.accept(this);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
visitUnaryExpression(expr) {
|
|
467
|
+
if (expr.expression) {
|
|
468
|
+
expr.expression.accept(this);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
visitFunctionCall(func) {
|
|
472
|
+
// Visit function arguments - this handles both single arguments and ValueList arguments
|
|
473
|
+
if (func.argument) {
|
|
474
|
+
func.argument.accept(this);
|
|
475
|
+
}
|
|
476
|
+
// Visit OVER clause for window functions
|
|
477
|
+
if (func.over) {
|
|
478
|
+
func.over.accept(this);
|
|
479
|
+
}
|
|
480
|
+
// Visit WITHIN GROUP clause for ordered aggregate functions
|
|
481
|
+
if (func.withinGroup) {
|
|
482
|
+
func.withinGroup.accept(this);
|
|
483
|
+
}
|
|
484
|
+
// Visit internal ORDER BY clause (for array_agg, json_agg, etc.)
|
|
485
|
+
if (func.internalOrderBy) {
|
|
486
|
+
func.internalOrderBy.accept(this);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
visitInlineQuery(inlineQuery) {
|
|
490
|
+
// Visit the nested SELECT query within the inline query expression
|
|
491
|
+
if (inlineQuery.selectQuery) {
|
|
492
|
+
this.visitNode(inlineQuery.selectQuery);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
visitParenExpression(expr) {
|
|
496
|
+
if (expr.expression) {
|
|
497
|
+
expr.expression.accept(this);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
visitCaseExpression(expr) {
|
|
501
|
+
if (expr.condition) {
|
|
502
|
+
expr.condition.accept(this);
|
|
503
|
+
}
|
|
504
|
+
if (expr.switchCase) {
|
|
505
|
+
expr.switchCase.accept(this);
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
visitCastExpression(expr) {
|
|
509
|
+
if (expr.input) {
|
|
510
|
+
expr.input.accept(this);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
visitBetweenExpression(expr) {
|
|
514
|
+
if (expr.expression) {
|
|
515
|
+
expr.expression.accept(this);
|
|
516
|
+
}
|
|
517
|
+
if (expr.lower) {
|
|
518
|
+
expr.lower.accept(this);
|
|
519
|
+
}
|
|
520
|
+
if (expr.upper) {
|
|
521
|
+
expr.upper.accept(this);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
visitArrayExpression(expr) {
|
|
525
|
+
if (expr.expression) {
|
|
526
|
+
expr.expression.accept(this);
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
visitArrayQueryExpression(expr) {
|
|
530
|
+
expr.query.accept(this);
|
|
531
|
+
}
|
|
532
|
+
visitArraySliceExpression(expr) {
|
|
533
|
+
// Visit the array and slice indices for column references
|
|
534
|
+
if (expr.array) {
|
|
535
|
+
expr.array.accept(this);
|
|
536
|
+
}
|
|
537
|
+
if (expr.startIndex) {
|
|
538
|
+
expr.startIndex.accept(this);
|
|
539
|
+
}
|
|
540
|
+
if (expr.endIndex) {
|
|
541
|
+
expr.endIndex.accept(this);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
visitArrayIndexExpression(expr) {
|
|
545
|
+
// Visit the array and index for column references
|
|
546
|
+
if (expr.array) {
|
|
547
|
+
expr.array.accept(this);
|
|
548
|
+
}
|
|
549
|
+
if (expr.index) {
|
|
550
|
+
expr.index.accept(this);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
visitValueList(expr) {
|
|
554
|
+
// Visit all values in the list to collect column references from function arguments
|
|
555
|
+
if (expr.values && Array.isArray(expr.values)) {
|
|
556
|
+
for (const value of expr.values) {
|
|
557
|
+
if (value) {
|
|
558
|
+
value.accept(this);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
visitPartitionByClause(clause) {
|
|
564
|
+
clause.value.accept(this);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Collect all upstream columns available for DynamicQuery maximum search conditions.
|
|
568
|
+
* This includes columns from CTEs, subqueries, and tables that can be used for filtering.
|
|
569
|
+
*/
|
|
570
|
+
collectUpstreamColumns(clause) {
|
|
571
|
+
// For upstream collection, collect columns from ALL available CTEs
|
|
572
|
+
// not just the ones directly referenced in the FROM clause
|
|
573
|
+
// This ensures complex multi-CTE queries have all available columns for filtering
|
|
574
|
+
this.collectAllAvailableCTEColumns();
|
|
575
|
+
// Collect columns from primary source
|
|
576
|
+
this.collectUpstreamColumnsFromSource(clause.source);
|
|
577
|
+
// Collect columns from JOIN sources
|
|
578
|
+
if (clause.joins) {
|
|
579
|
+
for (const join of clause.joins) {
|
|
580
|
+
this.collectUpstreamColumnsFromSource(join.source);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Collect upstream columns from a specific source (table, subquery, or CTE).
|
|
586
|
+
*/
|
|
587
|
+
collectUpstreamColumnsFromSource(source) {
|
|
588
|
+
if (source.datasource instanceof Clause_1.TableSource) {
|
|
589
|
+
// Check if this is a CTE reference first
|
|
590
|
+
const cteTable = this.findCTEByName(source.datasource.table.name);
|
|
591
|
+
if (cteTable) {
|
|
592
|
+
this.collectUpstreamColumnsFromCTE(cteTable);
|
|
593
|
+
}
|
|
594
|
+
else {
|
|
595
|
+
// For regular table sources, use table column resolver if available
|
|
596
|
+
this.collectUpstreamColumnsFromTable(source.datasource);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
else if (source.datasource instanceof Clause_1.SubQuerySource) {
|
|
600
|
+
// For subquery sources, collect columns from the subquery
|
|
601
|
+
this.collectUpstreamColumnsFromSubquery(source.datasource);
|
|
602
|
+
}
|
|
603
|
+
else if (source.datasource instanceof Clause_1.ParenSource) {
|
|
604
|
+
// For parenthesized sources, recursively collect
|
|
605
|
+
this.collectUpstreamColumnsFromSource(new Clause_1.SourceExpression(source.datasource.source, null));
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* Collect upstream columns from a table source using table column resolver.
|
|
610
|
+
*/
|
|
611
|
+
collectUpstreamColumnsFromTable(tableSource) {
|
|
612
|
+
if (this.tableColumnResolver) {
|
|
613
|
+
const tableName = tableSource.table.name;
|
|
614
|
+
const columns = this.tableColumnResolver(tableName);
|
|
615
|
+
for (const columnName of columns) {
|
|
616
|
+
// Create a column reference for each available column
|
|
617
|
+
const columnRef = new ValueComponent_1.ColumnReference(tableSource.table.name, columnName);
|
|
618
|
+
this.addSelectValueAsUnique(columnName, columnRef);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Collect upstream columns from a subquery source.
|
|
624
|
+
*/
|
|
625
|
+
collectUpstreamColumnsFromSubquery(subquerySource) {
|
|
626
|
+
if (subquerySource.query instanceof SelectQuery_1.SimpleSelectQuery) {
|
|
627
|
+
// Create a new collector for the subquery
|
|
628
|
+
const subqueryCollector = new SelectableColumnCollector(this.tableColumnResolver, this.includeWildCard, this.duplicateDetection, { ...this.options, upstream: true });
|
|
629
|
+
// Collect columns from the subquery
|
|
630
|
+
const subqueryColumns = subqueryCollector.collect(subquerySource.query);
|
|
631
|
+
// Add all columns from the subquery
|
|
632
|
+
for (const item of subqueryColumns) {
|
|
633
|
+
this.addSelectValueAsUnique(item.name, item.value);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Collect upstream columns from a CTE.
|
|
639
|
+
*/
|
|
640
|
+
collectUpstreamColumnsFromCTE(cteTable) {
|
|
641
|
+
if (cteTable.query instanceof SelectQuery_1.SimpleSelectQuery) {
|
|
642
|
+
// Create a recursive SelectableColumnCollector to collect ALL column references from the CTE
|
|
643
|
+
// This includes columns from SELECT, FROM, WHERE, JOIN, and other clauses within the CTE
|
|
644
|
+
// NOTE: Set upstream to false to prevent infinite recursion through collectAllAvailableCTEColumns
|
|
645
|
+
const cteCollector = new SelectableColumnCollector(this.tableColumnResolver, this.includeWildCard, this.duplicateDetection, { ...this.options, upstream: false });
|
|
646
|
+
// Collect all columns from the CTE query (including WHERE clause columns)
|
|
647
|
+
const cteColumns = cteCollector.collect(cteTable.query);
|
|
648
|
+
// Add all columns from the CTE, excluding wildcards
|
|
649
|
+
for (const item of cteColumns) {
|
|
650
|
+
// Skip wildcard columns as they are not valid selectable column names
|
|
651
|
+
if (item.name !== '*') {
|
|
652
|
+
this.addSelectValueAsUnique(item.name, item.value);
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
/**
|
|
658
|
+
* Collect columns from ALL available CTEs for upstream functionality.
|
|
659
|
+
* This ensures that complex multi-CTE queries have all available columns for filtering.
|
|
660
|
+
*/
|
|
661
|
+
collectAllAvailableCTEColumns() {
|
|
662
|
+
for (const cte of this.commonTables) {
|
|
663
|
+
this.collectUpstreamColumnsFromCTE(cte);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Find a CTE by name in the common tables.
|
|
668
|
+
*/
|
|
669
|
+
findCTEByName(name) {
|
|
670
|
+
return this.commonTables.find(cte => cte.getSourceAliasName() === name) || null;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
exports.SelectableColumnCollector = SelectableColumnCollector;
|
|
674
|
+
//# sourceMappingURL=SelectableColumnCollector.js.map
|