classUpdateTransformer
final class UpdateTransformer
implements SqlTransformer
Transforms UPDATE statements into SELECT projections with CTE shadowing.
PostgreSQL differences:
- FROM clause for multi-table updates (not comma-separated table list)
- Double-quote identifiers
Methods§
public function __construct(PgSqlParser $parser, SelectTransformer $selectTransformer)Initializes the collaborators and state used by this update transformer.
Parameters
$parser | PgSqlParser | |
$selectTransformer | SelectTransformer |
Calls 1
public function transform(string $sql, array $tables): string{@inheritDoc}
Parameters
$sql | string | |
$tables | array |
Returns
stringThrows
Test cases 4
Called from 1
Calls 5
- method-call PgSqlParser::extractUpdateTable() line 43
- new UnsupportedSqlException line 45
- method-call UpdateTransformer::buildProjection() line 49
- method-call SelectTransformer::transform() line 56
- method-call PgSqlCteShadowComposer::carryPrefix() line 57
public function buildProjection(
string $sql,
string $targetTable,
array<int, string> $columns,
array<int, string> $primaryKeys = [],
): array{sql: string, table: string, tables: array<string, array{alias: string}>}Build a result-select SQL from an UPDATE statement.
Parameters
$sql | string | |
$targetTable | string | |
$columns | array<int, string> | |
$primaryKeys | array<int, string> |
Returns
array{sql: string, table: string, tables: array<string, array{alias: string}>}Test cases 15
UpdateTransformerTest::testBuildProjectionExactOutputSimplecallsUpdateTransformerTest::testBuildProjectionExactOutputWithAliascallsUpdateTransformerTest::testBuildProjectionOnlySetColumnsWhenNoTableColumnscallsUpdateTransformerTest::testBuildProjectionReturnsTablesArraycallsUpdateTransformerTest::testBuildProjectionSetColumnExcludesFromRemainingColumnscallsUpdateTransformerTest::testBuildProjectionSetColumnIsCoveredNotDuplicatedcallsUpdateTransformerTest::testBuildProjectionSimpleUpdatecallsUpdateTransformerTest::testBuildProjectionUsesDoubleQuoteIdentifierscallsUpdateTransformerTest::testBuildProjectionWildcardFallbackcallsUpdateTransformerTest::testBuildProjectionWithAliascallsUpdateTransformerTest::testBuildProjectionWithEmptyColumnsUsesWildcardcallsUpdateTransformerTest::testBuildProjectionWithFromClausecallsUpdateTransformerTest::testBuildProjectionWithFromClauseExactcallsUpdateTransformerTest::testBuildProjectionWithMultipleSetColumnscallsUpdateTransformerTest::testBuildProjectionWithNoWhereClausecalls
Called from 1
Calls 6
- method-call PgSqlParser::extractUpdateAlias() line 75
- method-call PgSqlParser::extractUpdateSets() line 78
- method-call ColumnProjection::render() line 80
- new ColumnProjection line 80
- method-call PgSqlParser::extractUpdateFromClause() line 87
- method-call PgSqlParser::extractWhereClause() line 94
Private surface 3§
Implementation details, listed for orientation only.
private PgSqlParser $parserprivate SelectTransformer $selectTransformerprivate PgSqlCteShadowComposer $cteComposerTest cases 163§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 19
UpdateTransformerTest::testBuildProjectionCoalesceColumnsFromTableContextcallsUpdateTransformerTest::testBuildProjectionExactOutputSimplecallsUpdateTransformerTest::testBuildProjectionExactOutputWithAliascallsUpdateTransformerTest::testBuildProjectionOnlySetColumnsWhenNoTableColumnscallsUpdateTransformerTest::testBuildProjectionReturnsTablesArraycallsUpdateTransformerTest::testBuildProjectionSetColumnExcludesFromRemainingColumnscallsUpdateTransformerTest::testBuildProjectionSetColumnIsCoveredNotDuplicatedcallsUpdateTransformerTest::testBuildProjectionSimpleUpdatecallsUpdateTransformerTest::testBuildProjectionUsesDoubleQuoteIdentifierscallsUpdateTransformerTest::testBuildProjectionWildcardFallbackcallsUpdateTransformerTest::testBuildProjectionWithAliascallsUpdateTransformerTest::testBuildProjectionWithEmptyColumnsUsesWildcardcallsUpdateTransformerTest::testBuildProjectionWithFromClausecallsUpdateTransformerTest::testBuildProjectionWithFromClauseExactcallsUpdateTransformerTest::testBuildProjectionWithMultipleSetColumnscallsUpdateTransformerTest::testBuildProjectionWithNoWhereClausecallsUpdateTransformerTest::testTransformAppliesCteShadowingcallsUpdateTransformerTest::testTransformThrowsOnUnresolvableTargetcallsUpdateTransformerTest::testTransformWithEmptyTableContextcalls
Other tests reaching this symbol 144
RewriterBench::setUpcallsFullPipelineFuzzTest::testCreateTableRewriteRegistersThenDmlSucceedscallsFullPipelineFuzzTest::testCreateTableThenDeleteDoesNotCrashcallsFullPipelineFuzzTest::testCreateTableThenInsertDoesNotCrashcallsFullPipelineFuzzTest::testCreateTableThenSelectDoesNotCrashcallsFullPipelineFuzzTest::testCreateTableThenUpdateDoesNotCrashcallsFullPipelineFuzzTest::testShadowStoreIntegrityAfterMultipleOperationscallsRewriteCheck::verifycallsRewriteFuzzTest::setUpcallsPgSqlSessionFactoryTestcallsPgSqlRewriterTest::testAlterTableThrowsUnsupportedcallsPgSqlRewriterTest::testBuildTableContextMergesRegistryAndShadowcallsPgSqlRewriterTest::testBuildTableContextRegistryAndShadowBothIncludedcallsPgSqlRewriterTest::testBuildTableContextRegistryOnlyNoShadowcallsPgSqlRewriterTest::testBuildTableContextShadowOnlyDerivesDifferentColumnsAcrossRowscallsPgSqlRewriterTest::testBuildTableContextShadowOnlyDifferentColumnKeyscallsPgSqlRewriterTest::testBuildTableContextShadowOnlyDifferentColumnKeysDetailedcallsPgSqlRewriterTest::testBuildTableContextShadowOnlyWithEmptyRowsNoCtecallsPgSqlRewriterTest::testBuildTableContextShadowOnlyWithRowsDeriveColumnscallsPgSqlRewriterTest::testChildPartitionSelectUsesFilteredParentShadowSourcecallsPgSqlRewriterTest::testChildPartitionWriteMutationTargetsRootParentcallsPgSqlRewriterTest::testCommitIsSkippedcallsPgSqlRewriterTest::testCommitRewriteStateRetainsAllocatedSequenceValuescallsPgSqlRewriterTest::testCreateTableAsSelectNoShadowReturnsSqlWhereFalsecallsPgSqlRewriterTest::testCreateTableAsSelectReturnsDdlWithTransformedSqlcallsPgSqlRewriterTest::testCreateTableAsSelectTransformsSelectPartcallsPgSqlRewriterTest::testCreateTableAsSelectWithRegisteredSourceTablecallsPgSqlRewriterTest::testCreateTableNotAsSelectReturnsSqlWhereFalsecallsPgSqlRewriterTest::testCreateTableReturnsDdlSimulatedcallsPgSqlRewriterTest::testCreateTableReturnsSelectOneWhereFalsecallsPgSqlRewriterTest::testCreateTableWithoutAsSelectReturnsSqlWhereFalsecallsPgSqlRewriterTest::testCteReferencesAreMatchedCaseInsensitivelyDuringSchemaValidationcallsPgSqlRewriterTest::testDefaultPartitionExcludesOnlySpecificSiblingsOfSameParentcallsPgSqlRewriterTest::testDeleteEnsuresDmlTargetInShadowStorecallsPgSqlRewriterTest::testDeleteEnsuresDmlTargetIsCalledForDeletecallsPgSqlRewriterTest::testDeleteEnsuresDmlTargetViaShadowStorecallsPgSqlRewriterTest::testDeleteMutationTableNamecallsPgSqlRewriterTest::testDeleteResolvesTargetAfterBlockCommentcallsPgSqlRewriterTest::testDeleteReturnsWriteSimulatedWithMutationcallsPgSqlRewriterTest::testDeleteSqlIsTransformedcallsPgSqlRewriterTest::testDoBlockPassesThroughWithoutInspectingBodyTablescallsPgSqlRewriterTest::testDropTableReturnsDdlSimulatedcallsPgSqlRewriterTest::testDropTableReturnsSelectOneWhereFalsecallsPgSqlRewriterTest::testDropTableThenCreateDoesNotThrowcallsPgSqlRewriterTest::testEmptyInputThrowsExceptioncallsPgSqlRewriterTest::testEmptyResultSelectProducesNoRowscallsPgSqlRewriterTest::testExplainPassesThroughUnchangedcallsPgSqlRewriterTest::testGeneratedExpressionIsPresentBeforeTheFirstShadowWritecallsPgSqlRewriterTest::testInsertDoesNotCallEnsureDmlTargetcallsPgSqlRewriterTest::testInsertMutationTableNamecallsPgSqlRewriterTest::testInsertResolvesTargetAfterBlockCommentcallsPgSqlRewriterTest::testInsertResultSelectContainsColumnNamescallsPgSqlRewriterTest::testInsertReturnsWriteSimulatedWithMutationcallsPgSqlRewriterTest::testInsertRewriteOutputContainsSelectcallsPgSqlRewriterTest::testInsertSqlIsTransformedcallsPgSqlRewriterTest::testLateralDerivedTableKeepsNestedPhysicalRelationInShadowScopecallsPgSqlRewriterTest::testMergeBuildsAtomicSynchronizationPlancallsPgSqlRewriterTest::testMultiStatementThrowsExceptioncallsPgSqlRewriterTest::testNestedPartitionInsertAllocatesIdentityFromRootRowscallsPgSqlRewriterTest::testReadPlanHasNoMutationcallsPgSqlRewriterTest::testRegisteredTableUpsertProjectsConflictExpressioncallsPgSqlRewriterTest::testRegisteredViewIsKnownAndMaterializedcallsPgSqlRewriterTest::testRewriteCreateTableAsSelectNonCreateStatementDoesNotEnterCtasBranchcallsPgSqlRewriterTest::testRewriteDeleteEnsuresShadowStoreEntrycallsPgSqlRewriterTest::testRewriteDeleteReturnsWriteSimulatedcallsPgSqlRewriterTest::testRewriteDropTableReturnsSelectWhereFalsecallsPgSqlRewriterTest::testRewriteEmptyInputForRewriteMultipleThrowscallsPgSqlRewriterTest::testRewriteInsertDoesNotCallEnsureDmlTargetcallsPgSqlRewriterTest::testRewriteInsertReturnsWriteSimulatedcallsPgSqlRewriterTest::testRewriteInsertUsesDefaultsFromRegistryWithoutShadowRowscallsPgSqlRewriterTest::testRewriteInsertUsesIdentityStrategyFromRegistryWithoutShadowRowscallsPgSqlRewriterTest::testRewriteIsDeterministiccallsPgSqlRewriterTest::testRewriteLeadingWhitespaceTrimsBeforeClassifycallsPgSqlRewriterTest::testRewriteMultiplecallsPgSqlRewriterTest::testRewriteMultipleAllReadStatementscallsPgSqlRewriterTest::testRewriteMultipleEmptycallsPgSqlRewriterTest::testRewriteMultipleEmptyStringThrowscallsPgSqlRewriterTest::testRewriteMultipleLeadingWhitespaceTrimsBeforeClassifycallsPgSqlRewriterTest::testRewriteMultipleMultiStatementcallsPgSqlRewriterTest::testRewriteMultipleSingleStatementcallsPgSqlRewriterTest::testRewriteMultipleWhitespaceOnlyThrowscallsPgSqlRewriterTest::testRewriteMultipleWithDdlcallsPgSqlRewriterTest::testRewriteMultipleWithLeadingTrailingWhitespaceProducesValidSqlcallsPgSqlRewriterTest::testRewriteMultipleWithLeadingWhitespacecallsPgSqlRewriterTest::testRewriteMultipleWithOnlyWhitespaceThrowsAfterTrimcallsPgSqlRewriterTest::testRewriteOutputIsNonEmptycallsPgSqlRewriterTest::testRewriteUpdateEnsuresShadowStoreEntrycallsPgSqlRewriterTest::testRewriteUpdateReturnsWriteSimulatedcallsPgSqlRewriterTest::testRewriteWhitespaceOnlyThrowscallsPgSqlRewriterTest::testRewriteWithLeadingTrailingWhitespaceProducesValidSqlcallsPgSqlRewriterTest::testRewriteWithLeadingWhitespacecallsPgSqlRewriterTest::testRewriteWithLeadingWhitespaceTrimsFirstcallsPgSqlRewriterTest::testRewriteWithOnlyWhitespaceThrowsAfterTrimcallsPgSqlRewriterTest::testRollbackIsSkippedcallsPgSqlRewriterTest::testSchemaQualifiedSelectUsesShadowCtecallsPgSqlRewriterTest::testSelectIgnoresSqlKeywordsInsideLeadingLineCommentcallsPgSqlRewriterTest::testSelectReturnsReadKindcallsPgSqlRewriterTest::testSelectRewritesTableAfterBlockCommentcallsPgSqlRewriterTest::testSelectTableExistsInBothRegistryAndShadowcallsPgSqlRewriterTest::testSelectTableExistsInRegistryOnlycallsPgSqlRewriterTest::testSelectTableExistsInShadowStoreNotRegistrycallsPgSqlRewriterTest::testSelectTransformsCteWithShadowDatacallsPgSqlRewriterTest::testSelectUnknownTableWithSchemaContextThrowscallsPgSqlRewriterTest::testSelectUnknownTableWithShadowContextThrowscallsPgSqlRewriterTest::testSelectWithEmptyShadowGeneratesEmptyCtecallsPgSqlRewriterTest::testSelectWithMultiRowShadowUsesValuescallsPgSqlRewriterTest::testSelectWithNoSchemaContextPassesThroughcallsPgSqlRewriterTest::testSelectWithShadowOnlyDataDerivesColumnscallsPgSqlRewriterTest::testSelectWithShadowOnlyDataMergesColumnsAcrossRowscallsPgSqlRewriterTest::testSelectWithShadowOnlyHasSchemaContextcallsPgSqlRewriterTest::testShowPassesThroughUnchangedcallsPgSqlRewriterTest::testSkippedStatementPassesThroughcallsPgSqlRewriterTest::testSplitStatementsPreservesQuotedSemicolonscallsPgSqlRewriterTest::testStoredTableUpsertProjectsConflictExpressioncallsPgSqlRewriterTest::testTableFunctionDoesNotHideJoinedShadowRelationcallsPgSqlRewriterTest::testTransactionStatementParsesShadowTransactionOperationscallsPgSqlRewriterTest::testTruncateMutationTableNamecallsPgSqlRewriterTest::testTruncateReturnsSelectOneWhereFalsecallsPgSqlRewriterTest::testTruncateReturnsSelectWhereFalsecallsPgSqlRewriterTest::testTruncateReturnsWriteSimulatedWithMutationcallsPgSqlRewriterTest::testUnknownTableAfterDeclaredCteIsRejectedcallsPgSqlRewriterTest::testUnsupportedSqlThrowsExceptioncallsPgSqlRewriterTest::testUpdateDoesNotPromoteMaterializedUnknownTablecallsPgSqlRewriterTest::testUpdateEnsuresDmlTargetInShadowStorecallsPgSqlRewriterTest::testUpdateEnsuresDmlTargetIsCalledForUpdatecallsPgSqlRewriterTest::testUpdateEnsuresDmlTargetViaShadowStorecallsPgSqlRewriterTest::testUpdateMutationTableNamecallsPgSqlRewriterTest::testUpdatePreservesDollarQuotedStringBeforeWherecallsPgSqlRewriterTest::testUpdatePreservesDoubledQuoteStringBeforeWherecallsPgSqlRewriterTest::testUpdatePreservesEscapeStringBeforeWherecallsPgSqlRewriterTest::testUpdateResolvesTargetAfterBlockCommentcallsPgSqlRewriterTest::testUpdateReturnsWriteSimulatedWithMutationcallsPgSqlRewriterTest::testUpdateSqlIsTransformedcallsPgSqlRewriterTest::testWritePlanHasNonNullMutationcallsStatementRewriterTest::testRewriteMutationStagesDdlUntilItIsAppliedcallsStatementRewriterTest::testRewriteStatementShadowsRegisteredTablescallsStatementRewriterTest::testValidateReadTablesRejectsUndeclaredRelationscallsPgSqlTransformerTest::testCommitRewriteStateCommitsGeneratedIdentityValuescallsPgSqlTransformerTest::testTransformDeleteDelegatesToDeleteTransformercallsPgSqlTransformerTest::testTransformInsertDelegatesToInsertTransformercallsPgSqlTransformerTest::testTransformMergeDelegatesToMergeTransformercallsPgSqlTransformerTest::testTransformSelectDelegatesToSelectTransformercallsPgSqlTransformerTest::testTransformUnsupportedStatementThrowscallsPgSqlTransformerTest::testTransformUpdateDelegatesToUpdateTransformercalls