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,313 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DDLDiffGenerator = void 0;
|
|
4
|
+
const SqlParser_1 = require("../parsers/SqlParser");
|
|
5
|
+
const SqlFormatter_1 = require("./SqlFormatter");
|
|
6
|
+
const DDLGeneralizer_1 = require("./DDLGeneralizer");
|
|
7
|
+
const MultiQuerySplitter_1 = require("../utils/MultiQuerySplitter");
|
|
8
|
+
const CreateTableQuery_1 = require("../models/CreateTableQuery");
|
|
9
|
+
const DDLStatements_1 = require("../models/DDLStatements");
|
|
10
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
11
|
+
class DDLDiffGenerator {
|
|
12
|
+
static generateDiff(currentSql, expectedSql, options = {}) {
|
|
13
|
+
const currentAst = this.parseAndGeneralize(currentSql);
|
|
14
|
+
const expectedAst = this.parseAndGeneralize(expectedSql);
|
|
15
|
+
const currentSchema = this.buildSchema(currentAst);
|
|
16
|
+
const expectedSchema = this.buildSchema(expectedAst);
|
|
17
|
+
const diffAsts = [];
|
|
18
|
+
// Compare Tables
|
|
19
|
+
for (const [tableName, expectedTable] of expectedSchema.tables) {
|
|
20
|
+
const currentTable = currentSchema.tables.get(tableName);
|
|
21
|
+
if (!currentTable) {
|
|
22
|
+
// Table missing in current -> Create it
|
|
23
|
+
// We reconstruct the CreateTableQuery from columns
|
|
24
|
+
const columns = Array.from(expectedTable.columns.values()).map(c => c.definition);
|
|
25
|
+
const tableNameStr = expectedTable.qualifiedName.name instanceof ValueComponent_1.RawString
|
|
26
|
+
? expectedTable.qualifiedName.name.value
|
|
27
|
+
: expectedTable.qualifiedName.name.name;
|
|
28
|
+
const namespaces = expectedTable.qualifiedName.namespaces
|
|
29
|
+
? expectedTable.qualifiedName.namespaces.map(ns => ns.name)
|
|
30
|
+
: null;
|
|
31
|
+
const createTable = new CreateTableQuery_1.CreateTableQuery({
|
|
32
|
+
tableName: tableNameStr,
|
|
33
|
+
namespaces: namespaces,
|
|
34
|
+
columns: columns
|
|
35
|
+
});
|
|
36
|
+
diffAsts.push(createTable);
|
|
37
|
+
// And add constraints
|
|
38
|
+
for (const constraint of expectedTable.constraints) {
|
|
39
|
+
diffAsts.push(new DDLStatements_1.AlterTableStatement({
|
|
40
|
+
table: expectedTable.qualifiedName,
|
|
41
|
+
actions: [new DDLStatements_1.AlterTableAddConstraint({ constraint: constraint.definition })]
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
// And add indexes
|
|
45
|
+
for (const index of expectedTable.indexes) {
|
|
46
|
+
diffAsts.push(index.definition);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// Table exists -> Compare columns and constraints
|
|
51
|
+
this.compareColumns(currentTable, expectedTable, diffAsts, options);
|
|
52
|
+
this.compareConstraints(currentTable, expectedTable, diffAsts, options);
|
|
53
|
+
this.compareIndexes(currentTable, expectedTable, diffAsts, options);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Drop Tables (if enabled)
|
|
57
|
+
if (options.dropTables) {
|
|
58
|
+
for (const [tableName, currentTable] of currentSchema.tables) {
|
|
59
|
+
if (!expectedSchema.tables.has(tableName)) {
|
|
60
|
+
// Table exists in current but not in expected -> Drop it
|
|
61
|
+
// We need a DropTableStatement. For now, we can manually construct the SQL or add DropTableStatement model.
|
|
62
|
+
// Since we return string[], we can just push a raw SQL string if we don't have the AST model yet,
|
|
63
|
+
// OR better, let's use a simple object that formats to DROP TABLE.
|
|
64
|
+
// But wait, the return type is string[] derived from ASTs.
|
|
65
|
+
// Let's assume we can use a raw SQL component or similar.
|
|
66
|
+
// Actually, let's just use a simple custom AST node or formatted string injection if possible.
|
|
67
|
+
// Looking at imports, we don't have DropTableStatement.
|
|
68
|
+
// Let's add a temporary workaround or just return the string directly?
|
|
69
|
+
// The method returns string[] by mapping diffAsts.
|
|
70
|
+
// We should add a DropTableStatement class or similar.
|
|
71
|
+
// For now, let's just push a dummy component that formats to DROP TABLE.
|
|
72
|
+
// Actually, let's check if we can import DropTableStatement.
|
|
73
|
+
// It seems it's not imported. Let's check DDLStatements.ts.
|
|
74
|
+
// If we can't easily add the AST, we might need to hack it or add the class.
|
|
75
|
+
// Let's try to add a simple DropTableStatement to DDLStatements.ts first if needed.
|
|
76
|
+
// But for now, let's assume we can just append the string at the end?
|
|
77
|
+
// No, the return is `diffAsts.map(...)`.
|
|
78
|
+
// Let's create a simple ad-hoc object that satisfies SqlComponent and formats correctly.
|
|
79
|
+
diffAsts.push(new DDLStatements_1.DropTableStatement({
|
|
80
|
+
tables: [currentTable.qualifiedName],
|
|
81
|
+
ifExists: false
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Format output
|
|
87
|
+
const formatter = new SqlFormatter_1.SqlFormatter(options.formatOptions || { keywordCase: 'upper' });
|
|
88
|
+
return diffAsts.map(ast => formatter.format(ast).formattedSql + ';');
|
|
89
|
+
}
|
|
90
|
+
static parseAndGeneralize(sql) {
|
|
91
|
+
const split = MultiQuerySplitter_1.MultiQuerySplitter.split(sql);
|
|
92
|
+
const asts = [];
|
|
93
|
+
for (const q of split.queries) {
|
|
94
|
+
if (q.isEmpty)
|
|
95
|
+
continue;
|
|
96
|
+
try {
|
|
97
|
+
const ast = SqlParser_1.SqlParser.parse(q.sql);
|
|
98
|
+
asts.push(ast);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
// Ignore parse errors? Or throw?
|
|
102
|
+
// For diffing, we probably want to know if input is invalid.
|
|
103
|
+
console.warn("Failed to parse SQL for diff:", q.sql, e);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return DDLGeneralizer_1.DDLGeneralizer.generalize(asts);
|
|
107
|
+
}
|
|
108
|
+
static buildSchema(asts) {
|
|
109
|
+
var _a;
|
|
110
|
+
const tables = new Map();
|
|
111
|
+
const formatter = new SqlFormatter_1.SqlFormatter({ keywordCase: 'none' });
|
|
112
|
+
for (const ast of asts) {
|
|
113
|
+
if (ast instanceof CreateTableQuery_1.CreateTableQuery) {
|
|
114
|
+
const qName = new ValueComponent_1.QualifiedName(ast.namespaces || [], ast.tableName);
|
|
115
|
+
const key = this.getQualifiedNameKey(qName);
|
|
116
|
+
const tableModel = {
|
|
117
|
+
name: key,
|
|
118
|
+
qualifiedName: qName,
|
|
119
|
+
columns: new Map(),
|
|
120
|
+
constraints: [],
|
|
121
|
+
indexes: []
|
|
122
|
+
};
|
|
123
|
+
for (const col of ast.columns) {
|
|
124
|
+
tableModel.columns.set(col.name.name, {
|
|
125
|
+
name: col.name.name,
|
|
126
|
+
definition: col
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Generalized CreateTable shouldn't have tableConstraints, but if it did, we'd handle them.
|
|
130
|
+
tables.set(key, tableModel);
|
|
131
|
+
}
|
|
132
|
+
else if (ast instanceof DDLStatements_1.AlterTableStatement) {
|
|
133
|
+
const key = this.getQualifiedNameKey(ast.table);
|
|
134
|
+
const tableModel = tables.get(key);
|
|
135
|
+
if (tableModel) {
|
|
136
|
+
for (const action of ast.actions) {
|
|
137
|
+
if (action instanceof DDLStatements_1.AlterTableAddConstraint) {
|
|
138
|
+
const formatted = formatter.format(action.constraint).formattedSql;
|
|
139
|
+
tableModel.constraints.push({
|
|
140
|
+
name: (_a = action.constraint.constraintName) === null || _a === void 0 ? void 0 : _a.name,
|
|
141
|
+
kind: action.constraint.kind,
|
|
142
|
+
definition: action.constraint,
|
|
143
|
+
formatted: formatted
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else if (action instanceof DDLStatements_1.AlterTableAddColumn) {
|
|
147
|
+
tableModel.columns.set(action.column.name.name, {
|
|
148
|
+
name: action.column.name.name,
|
|
149
|
+
definition: action.column
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else if (ast instanceof DDLStatements_1.CreateIndexStatement) {
|
|
156
|
+
const key = this.getQualifiedNameKey(ast.tableName);
|
|
157
|
+
const tableModel = tables.get(key);
|
|
158
|
+
if (tableModel) {
|
|
159
|
+
const formatted = formatter.format(ast).formattedSql;
|
|
160
|
+
tableModel.indexes.push({
|
|
161
|
+
name: ast.indexName.toString(),
|
|
162
|
+
definition: ast,
|
|
163
|
+
formatted: formatted
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return { tables };
|
|
169
|
+
}
|
|
170
|
+
static compareColumns(current, expected, diffs, options) {
|
|
171
|
+
// Add missing columns
|
|
172
|
+
for (const [name, col] of expected.columns) {
|
|
173
|
+
if (!current.columns.has(name)) {
|
|
174
|
+
diffs.push(new DDLStatements_1.AlterTableStatement({
|
|
175
|
+
table: expected.qualifiedName,
|
|
176
|
+
actions: [new DDLStatements_1.AlterTableAddColumn({ column: col.definition })]
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Drop extra columns
|
|
181
|
+
if (options.dropColumns) {
|
|
182
|
+
for (const [name, col] of current.columns) {
|
|
183
|
+
if (!expected.columns.has(name)) {
|
|
184
|
+
diffs.push(new DDLStatements_1.AlterTableStatement({
|
|
185
|
+
table: expected.qualifiedName,
|
|
186
|
+
actions: [new DDLStatements_1.AlterTableDropColumn({ columnName: col.definition.name })]
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
static compareConstraints(current, expected, diffs, options) {
|
|
193
|
+
// We need to match constraints.
|
|
194
|
+
// If checkConstraintNames is true, match by name.
|
|
195
|
+
// Else, match by formatted definition (ignoring name in formatting if possible, but SqlFormatter prints name).
|
|
196
|
+
// To compare by definition ignoring name, we might need to strip name from definition before formatting.
|
|
197
|
+
const formatter = new SqlFormatter_1.SqlFormatter({ keywordCase: 'none' });
|
|
198
|
+
const getConstraintSignature = (c) => {
|
|
199
|
+
if (options.checkConstraintNames) {
|
|
200
|
+
// Special handling for PRIMARY KEY: ignore name difference
|
|
201
|
+
if (c.kind === 'primary-key') {
|
|
202
|
+
// Strip "CONSTRAINT name" prefix, handling both quoted and unquoted names
|
|
203
|
+
// Match: CONSTRAINT "name" or CONSTRAINT name (case-insensitive)
|
|
204
|
+
const sig = c.formatted.replace(/^constraint\s+("[^"]+"|[^\s]+)\s+/i, '').trim();
|
|
205
|
+
return sig;
|
|
206
|
+
}
|
|
207
|
+
return c.name || c.formatted; // Fallback if no name?
|
|
208
|
+
}
|
|
209
|
+
// Remove name from definition for comparison
|
|
210
|
+
// "CONSTRAINT name PRIMARY KEY ..." vs "PRIMARY KEY ..."
|
|
211
|
+
// If we format it, it might include CONSTRAINT name.
|
|
212
|
+
// We can regex remove it?
|
|
213
|
+
return c.formatted.replace(/^constraint\s+("[^"]+"|[^\s]+)\s+/i, '').trim();
|
|
214
|
+
};
|
|
215
|
+
const currentSignatures = new Set(current.constraints.map(getConstraintSignature));
|
|
216
|
+
// Add missing constraints
|
|
217
|
+
for (const expectedC of expected.constraints) {
|
|
218
|
+
const sig = getConstraintSignature(expectedC);
|
|
219
|
+
if (!currentSignatures.has(sig)) {
|
|
220
|
+
diffs.push(new DDLStatements_1.AlterTableStatement({
|
|
221
|
+
table: expected.qualifiedName,
|
|
222
|
+
actions: [new DDLStatements_1.AlterTableAddConstraint({ constraint: expectedC.definition })]
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Drop extra constraints
|
|
227
|
+
if (options.dropConstraints) {
|
|
228
|
+
const expectedSignatures = new Set(expected.constraints.map(getConstraintSignature));
|
|
229
|
+
for (const currentC of current.constraints) {
|
|
230
|
+
const sig = getConstraintSignature(currentC);
|
|
231
|
+
if (!expectedSignatures.has(sig)) {
|
|
232
|
+
// To drop, we need a name. If no name, we can't drop easily (DBs usually auto-name).
|
|
233
|
+
if (currentC.name) {
|
|
234
|
+
diffs.push(new DDLStatements_1.AlterTableStatement({
|
|
235
|
+
table: expected.qualifiedName,
|
|
236
|
+
actions: [new DDLStatements_1.AlterTableDropConstraint({ constraintName: new ValueComponent_1.IdentifierString(currentC.name) })]
|
|
237
|
+
}));
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
console.warn("Cannot drop unnamed constraint:", currentC.formatted);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
static compareIndexes(current, expected, diffs, options) {
|
|
247
|
+
const getIndexSignature = (idx) => {
|
|
248
|
+
if (options.checkConstraintNames) {
|
|
249
|
+
// When Check Names is enabled, index name matters
|
|
250
|
+
return idx.name;
|
|
251
|
+
}
|
|
252
|
+
// When Check Names is disabled, compare by structural properties from AST
|
|
253
|
+
// Compare: table name, columns (expressions), unique flag, using method, where clause
|
|
254
|
+
const def = idx.definition;
|
|
255
|
+
const parts = [];
|
|
256
|
+
// Table name
|
|
257
|
+
parts.push(def.tableName.toString());
|
|
258
|
+
// Unique flag
|
|
259
|
+
if (def.unique) {
|
|
260
|
+
parts.push('UNIQUE');
|
|
261
|
+
}
|
|
262
|
+
// Using method (e.g., BTREE, HASH)
|
|
263
|
+
if (def.usingMethod) {
|
|
264
|
+
parts.push(`USING:${def.usingMethod.toString()}`);
|
|
265
|
+
}
|
|
266
|
+
// Columns (expressions and sort orders)
|
|
267
|
+
const columnSigs = def.columns.map(col => {
|
|
268
|
+
const expr = col.expression.toString();
|
|
269
|
+
const sort = col.sortOrder || '';
|
|
270
|
+
const nulls = col.nullsOrder || '';
|
|
271
|
+
return `${expr}${sort}${nulls}`;
|
|
272
|
+
});
|
|
273
|
+
parts.push(`COLS:${columnSigs.join(',')}`);
|
|
274
|
+
// Include columns
|
|
275
|
+
if (def.include && def.include.length > 0) {
|
|
276
|
+
parts.push(`INCLUDE:${def.include.map(i => i.toString()).join(',')}`);
|
|
277
|
+
}
|
|
278
|
+
// Where clause
|
|
279
|
+
if (def.where) {
|
|
280
|
+
parts.push(`WHERE:${def.where.toString()}`);
|
|
281
|
+
}
|
|
282
|
+
return parts.join('|');
|
|
283
|
+
};
|
|
284
|
+
const currentSignatures = new Set(current.indexes.map(getIndexSignature));
|
|
285
|
+
// Add missing indexes
|
|
286
|
+
for (const expectedIdx of expected.indexes) {
|
|
287
|
+
const sig = getIndexSignature(expectedIdx);
|
|
288
|
+
if (!currentSignatures.has(sig)) {
|
|
289
|
+
diffs.push(expectedIdx.definition);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Drop extra indexes
|
|
293
|
+
// When checkConstraintNames is enabled, we should drop indexes with different names
|
|
294
|
+
// When dropIndexes is enabled, we should drop all extra indexes
|
|
295
|
+
if (options.checkConstraintNames || options.dropIndexes) {
|
|
296
|
+
const expectedSignatures = new Set(expected.indexes.map(getIndexSignature));
|
|
297
|
+
for (const currentIdx of current.indexes) {
|
|
298
|
+
const sig = getIndexSignature(currentIdx);
|
|
299
|
+
if (!expectedSignatures.has(sig)) {
|
|
300
|
+
diffs.push(new DDLStatements_1.DropIndexStatement({
|
|
301
|
+
indexNames: [currentIdx.definition.indexName],
|
|
302
|
+
ifExists: false
|
|
303
|
+
}));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
static getQualifiedNameKey(qName) {
|
|
309
|
+
return qName.toString();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
exports.DDLDiffGenerator = DDLDiffGenerator;
|
|
313
|
+
//# sourceMappingURL=DDLDiffGenerator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DDLDiffGenerator.js","sourceRoot":"","sources":["../../src/transformers/DDLDiffGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DDLGeneralizer = void 0;
|
|
4
|
+
const CreateTableQuery_1 = require("../models/CreateTableQuery");
|
|
5
|
+
const DDLStatements_1 = require("../models/DDLStatements");
|
|
6
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
7
|
+
class DDLGeneralizer {
|
|
8
|
+
/**
|
|
9
|
+
* Generalizes DDL statements by moving constraints from CREATE TABLE to ALTER TABLE statements.
|
|
10
|
+
* This normalizes the DDL for easier comparison.
|
|
11
|
+
*
|
|
12
|
+
* @param ast List of SQL components (DDL statements)
|
|
13
|
+
* @returns Generalized list of SQL components
|
|
14
|
+
*/
|
|
15
|
+
static generalize(ast) {
|
|
16
|
+
const result = [];
|
|
17
|
+
for (const component of ast) {
|
|
18
|
+
if (component instanceof CreateTableQuery_1.CreateTableQuery) {
|
|
19
|
+
const { createTable, alterTables } = this.splitCreateTable(component);
|
|
20
|
+
result.push(createTable);
|
|
21
|
+
result.push(...alterTables);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
result.push(component);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return result;
|
|
28
|
+
}
|
|
29
|
+
static splitCreateTable(query) {
|
|
30
|
+
const newColumns = [];
|
|
31
|
+
const alterTables = [];
|
|
32
|
+
// Construct QualifiedName for the table
|
|
33
|
+
const tableQualifiedName = new ValueComponent_1.QualifiedName(query.namespaces || [], query.tableName.name);
|
|
34
|
+
// Process columns
|
|
35
|
+
for (const col of query.columns) {
|
|
36
|
+
const newConstraints = [];
|
|
37
|
+
for (const constraint of col.constraints) {
|
|
38
|
+
if (['primary-key', 'unique', 'references', 'check'].includes(constraint.kind)) {
|
|
39
|
+
// Move to Alter Table
|
|
40
|
+
const tableConstraint = this.columnToTableConstraint(col.name, constraint);
|
|
41
|
+
alterTables.push(new DDLStatements_1.AlterTableStatement({
|
|
42
|
+
table: tableQualifiedName,
|
|
43
|
+
actions: [new DDLStatements_1.AlterTableAddConstraint({ constraint: tableConstraint })]
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// Keep (not-null, default, etc.)
|
|
48
|
+
newConstraints.push(constraint);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
newColumns.push(new CreateTableQuery_1.TableColumnDefinition({
|
|
52
|
+
name: col.name,
|
|
53
|
+
dataType: col.dataType,
|
|
54
|
+
constraints: newConstraints
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
// Process table constraints
|
|
58
|
+
if (query.tableConstraints) {
|
|
59
|
+
for (const constraint of query.tableConstraints) {
|
|
60
|
+
alterTables.push(new DDLStatements_1.AlterTableStatement({
|
|
61
|
+
table: tableQualifiedName,
|
|
62
|
+
actions: [new DDLStatements_1.AlterTableAddConstraint({ constraint })]
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const newCreateTable = new CreateTableQuery_1.CreateTableQuery({
|
|
67
|
+
tableName: query.tableName.name,
|
|
68
|
+
namespaces: query.namespaces,
|
|
69
|
+
columns: newColumns,
|
|
70
|
+
ifNotExists: query.ifNotExists,
|
|
71
|
+
isTemporary: query.isTemporary,
|
|
72
|
+
tableOptions: query.tableOptions,
|
|
73
|
+
asSelectQuery: query.asSelectQuery,
|
|
74
|
+
withDataOption: query.withDataOption,
|
|
75
|
+
// tableConstraints is empty
|
|
76
|
+
tableConstraints: []
|
|
77
|
+
});
|
|
78
|
+
return { createTable: newCreateTable, alterTables };
|
|
79
|
+
}
|
|
80
|
+
static columnToTableConstraint(columnName, constraint) {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
const baseParams = {
|
|
83
|
+
constraintName: constraint.constraintName,
|
|
84
|
+
deferrable: (_a = constraint.reference) === null || _a === void 0 ? void 0 : _a.deferrable,
|
|
85
|
+
initially: (_b = constraint.reference) === null || _b === void 0 ? void 0 : _b.initially
|
|
86
|
+
};
|
|
87
|
+
switch (constraint.kind) {
|
|
88
|
+
case 'primary-key':
|
|
89
|
+
return new CreateTableQuery_1.TableConstraintDefinition({
|
|
90
|
+
kind: 'primary-key',
|
|
91
|
+
columns: [columnName],
|
|
92
|
+
...baseParams
|
|
93
|
+
});
|
|
94
|
+
case 'unique':
|
|
95
|
+
return new CreateTableQuery_1.TableConstraintDefinition({
|
|
96
|
+
kind: 'unique',
|
|
97
|
+
columns: [columnName],
|
|
98
|
+
...baseParams
|
|
99
|
+
});
|
|
100
|
+
case 'references':
|
|
101
|
+
return new CreateTableQuery_1.TableConstraintDefinition({
|
|
102
|
+
kind: 'foreign-key',
|
|
103
|
+
columns: [columnName],
|
|
104
|
+
reference: constraint.reference,
|
|
105
|
+
...baseParams
|
|
106
|
+
});
|
|
107
|
+
case 'check':
|
|
108
|
+
return new CreateTableQuery_1.TableConstraintDefinition({
|
|
109
|
+
kind: 'check',
|
|
110
|
+
checkExpression: constraint.checkExpression,
|
|
111
|
+
...baseParams
|
|
112
|
+
});
|
|
113
|
+
default:
|
|
114
|
+
throw new Error(`Unsupported constraint kind for generalization: ${constraint.kind}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.DDLGeneralizer = DDLGeneralizer;
|
|
119
|
+
//# sourceMappingURL=DDLGeneralizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DDLGeneralizer.js","sourceRoot":"","sources":["../../src/transformers/DDLGeneralizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DDLToFixtureConverter = void 0;
|
|
4
|
+
const MultiQuerySplitter_1 = require("../utils/MultiQuerySplitter");
|
|
5
|
+
const SqlParser_1 = require("../parsers/SqlParser");
|
|
6
|
+
const CreateTableQuery_1 = require("../models/CreateTableQuery");
|
|
7
|
+
const InsertQuery_1 = require("../models/InsertQuery");
|
|
8
|
+
const ValuesQuery_1 = require("../models/ValuesQuery");
|
|
9
|
+
const TableDefinitionModel_1 = require("../models/TableDefinitionModel");
|
|
10
|
+
const ValueComponent_1 = require("../models/ValueComponent");
|
|
11
|
+
const SqlFormatter_1 = require("./SqlFormatter");
|
|
12
|
+
class DDLToFixtureConverter {
|
|
13
|
+
/**
|
|
14
|
+
* Converts DDL statements (CREATE TABLE) in the provided SQL text to a Fixture JSON object.
|
|
15
|
+
* Ignores non-DDL statements and parse errors.
|
|
16
|
+
*
|
|
17
|
+
* @param ddlSql The SQL text containing CREATE TABLE statements.
|
|
18
|
+
* @returns A Record representing the Fixture JSON.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Converts DDL statements (CREATE TABLE) in the provided SQL text to a Fixture JSON object.
|
|
22
|
+
* Ignores non-DDL statements and parse errors.
|
|
23
|
+
*
|
|
24
|
+
* @param ddlSql The SQL text containing CREATE TABLE statements.
|
|
25
|
+
* @returns A Record representing the Fixture JSON.
|
|
26
|
+
*/
|
|
27
|
+
static convert(ddlSql) {
|
|
28
|
+
const splitResult = MultiQuerySplitter_1.MultiQuerySplitter.split(ddlSql);
|
|
29
|
+
const createTableQueries = [];
|
|
30
|
+
const insertQueries = [];
|
|
31
|
+
for (const query of splitResult.queries) {
|
|
32
|
+
if (query.isEmpty)
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
const ast = SqlParser_1.SqlParser.parse(query.sql);
|
|
36
|
+
if (ast instanceof CreateTableQuery_1.CreateTableQuery) {
|
|
37
|
+
createTableQueries.push(ast);
|
|
38
|
+
}
|
|
39
|
+
else if (ast instanceof InsertQuery_1.InsertQuery) {
|
|
40
|
+
insertQueries.push(ast);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
// Ignore parse errors for non-DDL or invalid SQL
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const registry = (0, TableDefinitionModel_1.createTableDefinitionRegistryFromCreateTableQueries)(createTableQueries);
|
|
48
|
+
const fixtureJson = {};
|
|
49
|
+
// Initialize fixtureJson with empty rows
|
|
50
|
+
for (const [tableName, def] of Object.entries(registry)) {
|
|
51
|
+
fixtureJson[tableName] = {
|
|
52
|
+
columns: def.columns.map(col => ({
|
|
53
|
+
name: col.name,
|
|
54
|
+
type: col.typeName,
|
|
55
|
+
default: this.formatDefaultValue(col.defaultValue)
|
|
56
|
+
})),
|
|
57
|
+
rows: []
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Sequence counters for nextval defaults: table -> column -> counter
|
|
61
|
+
const sequences = {};
|
|
62
|
+
// Process INSERT statements
|
|
63
|
+
for (const insert of insertQueries) {
|
|
64
|
+
// Only support INSERT ... VALUES
|
|
65
|
+
if (!(insert.selectQuery instanceof ValuesQuery_1.ValuesQuery)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
const tableName = insert.insertClause.source.getAliasName();
|
|
69
|
+
if (!tableName || !fixtureJson[tableName]) {
|
|
70
|
+
// Ignore INSERTs for unknown tables
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const tableDef = registry[tableName];
|
|
74
|
+
const targetColumns = insert.insertClause.columns;
|
|
75
|
+
const valuesQuery = insert.selectQuery;
|
|
76
|
+
// If columns are not specified, use all columns in order
|
|
77
|
+
const columnNames = targetColumns
|
|
78
|
+
? targetColumns.map(c => c.name)
|
|
79
|
+
: tableDef.columns.map(c => c.name);
|
|
80
|
+
for (const tuple of valuesQuery.tuples) {
|
|
81
|
+
const row = {};
|
|
82
|
+
// Map provided values
|
|
83
|
+
for (let i = 0; i < columnNames.length; i++) {
|
|
84
|
+
const colName = columnNames[i];
|
|
85
|
+
if (i < tuple.values.length) {
|
|
86
|
+
const val = tuple.values[i];
|
|
87
|
+
row[colName] = this.extractValue(val);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Fill missing columns with defaults
|
|
91
|
+
for (const colDef of tableDef.columns) {
|
|
92
|
+
if (row[colDef.name] !== undefined) {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
// Check for NOT NULL constraint without default
|
|
96
|
+
// TableColumnDefinitionModel.required is true if NOT NULL and no default/identity
|
|
97
|
+
if (colDef.required) {
|
|
98
|
+
throw new Error(`Column '${colDef.name}' in table '${tableName}' cannot be null and has no default value.`);
|
|
99
|
+
}
|
|
100
|
+
const hasDefault = colDef.defaultValue !== null && colDef.defaultValue !== undefined;
|
|
101
|
+
if (hasDefault) {
|
|
102
|
+
const defaultValStr = this.formatDefaultValue(colDef.defaultValue);
|
|
103
|
+
if (defaultValStr) {
|
|
104
|
+
const trimmedDefault = defaultValStr.trim();
|
|
105
|
+
const lowerTrimmed = trimmedDefault.toLowerCase();
|
|
106
|
+
const stringLiteralValue = trimmedDefault.startsWith("'") && trimmedDefault.endsWith("'")
|
|
107
|
+
? trimmedDefault.slice(1, -1).replace(/''/g, "'")
|
|
108
|
+
: trimmedDefault;
|
|
109
|
+
// Normalize literal NULLs (even when quoted) into JS null
|
|
110
|
+
if (stringLiteralValue.toLowerCase() === 'null') {
|
|
111
|
+
row[colDef.name] = null;
|
|
112
|
+
}
|
|
113
|
+
else if (lowerTrimmed.includes('nextval')) {
|
|
114
|
+
// Handle nextval sequence
|
|
115
|
+
if (!sequences[tableName])
|
|
116
|
+
sequences[tableName] = {};
|
|
117
|
+
if (!sequences[tableName][colDef.name])
|
|
118
|
+
sequences[tableName][colDef.name] = 0;
|
|
119
|
+
sequences[tableName][colDef.name]++;
|
|
120
|
+
row[colDef.name] = sequences[tableName][colDef.name];
|
|
121
|
+
}
|
|
122
|
+
else if (lowerTrimmed.includes('now') || lowerTrimmed.includes('current_timestamp')) {
|
|
123
|
+
// Handle timestamp defaults - use a fixed date for consistency or current date
|
|
124
|
+
// Using a fixed date makes tests deterministic
|
|
125
|
+
row[colDef.name] = "2023-01-01 00:00:00";
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Use the literal default value
|
|
129
|
+
// Try to unquote if it's a string literal
|
|
130
|
+
if (trimmedDefault.startsWith("'") && trimmedDefault.endsWith("'")) {
|
|
131
|
+
row[colDef.name] = stringLiteralValue;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
// Try to parse number/boolean/null
|
|
135
|
+
const num = Number(trimmedDefault);
|
|
136
|
+
if (!isNaN(num)) {
|
|
137
|
+
row[colDef.name] = num;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const lower = trimmedDefault.toLowerCase();
|
|
141
|
+
if (lower === 'true') {
|
|
142
|
+
row[colDef.name] = true;
|
|
143
|
+
}
|
|
144
|
+
else if (lower === 'false') {
|
|
145
|
+
row[colDef.name] = false;
|
|
146
|
+
}
|
|
147
|
+
else if (lower === 'null') {
|
|
148
|
+
row[colDef.name] = null;
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
row[colDef.name] = trimmedDefault;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
// Default to null
|
|
160
|
+
row[colDef.name] = null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
fixtureJson[tableName].rows.push(row);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return fixtureJson;
|
|
167
|
+
}
|
|
168
|
+
static extractValue(value) {
|
|
169
|
+
if (value instanceof ValueComponent_1.LiteralValue) {
|
|
170
|
+
return value.value;
|
|
171
|
+
}
|
|
172
|
+
// For other types, try to format to string
|
|
173
|
+
try {
|
|
174
|
+
const formatter = new SqlFormatter_1.SqlFormatter({ keywordCase: 'none' });
|
|
175
|
+
const { formattedSql } = formatter.format(value);
|
|
176
|
+
// Remove quotes if it looks like a string literal
|
|
177
|
+
if (formattedSql.startsWith("'") && formattedSql.endsWith("'")) {
|
|
178
|
+
return formattedSql.slice(1, -1).replace(/''/g, "'");
|
|
179
|
+
}
|
|
180
|
+
return formattedSql;
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
return String(value);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
static formatDefaultValue(value) {
|
|
187
|
+
if (value === null || value === undefined) {
|
|
188
|
+
return undefined;
|
|
189
|
+
}
|
|
190
|
+
if (typeof value === 'string') {
|
|
191
|
+
return value;
|
|
192
|
+
}
|
|
193
|
+
try {
|
|
194
|
+
// Use SqlFormatter to print the AST node
|
|
195
|
+
const formatter = new SqlFormatter_1.SqlFormatter({ keywordCase: 'none' });
|
|
196
|
+
const { formattedSql } = formatter.format(value);
|
|
197
|
+
return formattedSql;
|
|
198
|
+
}
|
|
199
|
+
catch (e) {
|
|
200
|
+
// Fallback if formatter fails
|
|
201
|
+
return String(value);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
exports.DDLToFixtureConverter = DDLToFixtureConverter;
|
|
206
|
+
//# sourceMappingURL=DDLToFixtureConverter.js.map
|