classSqliteQueryGuard
final class SqliteQueryGuard
Public API: explicitly declared with
@visibility public.Classifies SQL and enforces ZTD write-protection rules for SQLite.
$guard = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard(new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser());
$guard->classify("DELETE FROM users") // => \ZtdQuery\Rewrite\QueryKind::WRITE_SIMULATEDMethods§
public function __construct(SqliteParser $parser)Public API: explicitly declared with
@visibility public.Binds the dependencies used by this operation.
Parameters
$parser | SqliteParser |
$guard = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard(new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser());
$guard->classify("SELECT 1") // => \ZtdQuery\Rewrite\QueryKind::READpublic function classify(string $sql): ?QueryKindPublic API: explicitly declared with
@visibility public.Classify a SQL string into READ/WRITE_SIMULATED/DDL_SIMULATED or null if unsupported.
Parameters
$sql | string |
Returns
$guard = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard(new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser());
$guard->classify("CREATE TABLE users(id INTEGER)") // => \ZtdQuery\Rewrite\QueryKind::DDL_SIMULATED
$guard->classify("VACUUM") // => nullTest cases 23
ClassifyTarget::__invokecallsRewriteCheck::verifycallsSqliteQueryGuardTest::testAlterTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testClassifiesOnlyInMemoryAttachAsReadcallsSqliteQueryGuardTest::testClassifiesReadOnlyExplainAsReadcallsSqliteQueryGuardTest::testClassifyReturnsNullForCreateIndexcallsSqliteQueryGuardTest::testClassifyReturnsNullForEmptyStringcallsSqliteQueryGuardTest::testCreateTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testCteSelectClassifiesAsReadcallsSqliteQueryGuardTest::testDeleteClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testDeleteLowercaseClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testDropTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testEmptyReturnsNullcallsSqliteQueryGuardTest::testGarbageInputReturnsNullcallsSqliteQueryGuardTest::testInsertClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testInsertLowercaseClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testInsertOrReplaceClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testReplaceClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testSelectClassifiesAsReadcallsSqliteQueryGuardTest::testSelectLowercaseClassifiesAsReadcallsSqliteQueryGuardTest::testUnsupportedReturnsNullcallsSqliteQueryGuardTest::testUpdateClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testUpdateLowercaseClassifiesAsWriteSimulatedcalls
Called from 2
Calls 6
- static-call SqliteInMemoryAttachStatement::isSafe() line 43
- class-const QueryKind::READ() line 44
- static-call SqliteReadOnlyDiagnosticStatement::isSafe() line 46
- method-call SqliteParser::classifyStatement() line 49
- class-const QueryKind::WRITE_SIMULATED() line 56
- class-const QueryKind::DDL_SIMULATED() line 57
public function assertAllowed(string $sql): voidPublic API: explicitly declared with
@visibility public.Assert that the SQL is allowed by the guard.
Parameters
$sql | string |
Throws
RuntimeException When the SQL is not allowed.$guard = new \ZtdQuery\Platform\Sqlite\Rewrite\SqliteQueryGuard(new \ZtdQuery\Platform\Sqlite\Sql\SqliteParser());
$guard->assertAllowed('SELECT 1');
$guard->assertAllowed('VACUUM') // throws \RuntimeException: ZTD Write ProtectionTest cases 4
Calls 2
- method-call SqliteQueryGuard::classify() line 75
- new
RuntimeExceptionline 77
Private surface 1§
Implementation details, listed for orientation only.
private SqliteParser $parserTest cases 114§
Test cases that cover or call this symbol, from the coverage report and from the analyzed test sources.
Dedicated tests 25
SqliteQueryGuardTest::testAlterTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testAssertAllowedDoesNotThrowForSelectcallsSqliteQueryGuardTest::testAssertAllowedForCreateTablecallsSqliteQueryGuardTest::testAssertAllowedForInsertcallsSqliteQueryGuardTest::testAssertAllowedThrowsForUnsupportedcallsSqliteQueryGuardTest::testClassifiesOnlyInMemoryAttachAsReadcallsSqliteQueryGuardTest::testClassifiesReadOnlyExplainAsReadcallsSqliteQueryGuardTest::testClassifyReturnsNullForCreateIndexcallsSqliteQueryGuardTest::testClassifyReturnsNullForEmptyStringcallsSqliteQueryGuardTest::testCreateTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testCteSelectClassifiesAsReadcallsSqliteQueryGuardTest::testDeleteClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testDeleteLowercaseClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testDropTableClassifiesAsDdlSimulatedcallsSqliteQueryGuardTest::testEmptyReturnsNullcallsSqliteQueryGuardTest::testGarbageInputReturnsNullcallsSqliteQueryGuardTest::testInsertClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testInsertLowercaseClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testInsertOrReplaceClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testReplaceClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testSelectClassifiesAsReadcallsSqliteQueryGuardTest::testSelectLowercaseClassifiesAsReadcallsSqliteQueryGuardTest::testUnsupportedReturnsNullcallsSqliteQueryGuardTest::testUpdateClassifiesAsWriteSimulatedcallsSqliteQueryGuardTest::testUpdateLowercaseClassifiesAsWriteSimulatedcalls
Other tests reaching this symbol 89
RewriterBench::setUpcallsClassifyTarget::__invokecallsRewriteCheck::verifycallsRewriteTarget::__invokecallsSemanticsTarget::__invokecallsSqliteRewriterTest::testAlterTableUsesShadowedMigrationSelectcallsSqliteRewriterTest::testBuildTableContextIncludesMultipleTablesFromRegistrycallsSqliteRewriterTest::testBuildTableContextMergesColumnsFromMultipleRowscallsSqliteRewriterTest::testBuildTableContextRegistryOnlyTableIncludedcallsSqliteRewriterTest::testBuildTableContextShadowStoreEmptyRowsNoDefinitionPassesThroughcallsSqliteRewriterTest::testBuildTableContextSkipsAlreadyAddedFromShadowStorecallsSqliteRewriterTest::testBuildTableContextUsesDefinitionColumnscallsSqliteRewriterTest::testBuildTableContextWithShadowStoreColumnsInferredcallsSqliteRewriterTest::testCommitRewriteStateKeepsGeneratedIdentitiesAcrossRewritescallsSqliteRewriterTest::testCreateTableReturnsDdlSimulatedcallsSqliteRewriterTest::testCteReferencesAreMatchedCaseInsensitivelyDuringSchemaValidationcallsSqliteRewriterTest::testDdlSimulatedReturnsSqlSelectWhere0callsSqliteRewriterTest::testDeleteEnsuresShadowStorecallsSqliteRewriterTest::testDeleteEnsuresShadowStoreCalledOnTargetcallsSqliteRewriterTest::testDeleteEnsuresShadowStoreEntrycallsSqliteRewriterTest::testDeleteEnsuresShadowStoreForTargetTablecallsSqliteRewriterTest::testDeleteFromBacktickQuotedTableReturnsSqlWhere0callsSqliteRewriterTest::testDeleteFromBracketQuotedTableReturnsSqlWhere0callsSqliteRewriterTest::testDeleteFromLowercaseReturnsSqlWhere0callsSqliteRewriterTest::testDeleteFromQuotedTableWithoutWhereReturnsSqlWhere0callsSqliteRewriterTest::testDeleteFromWithCommentsReturnsSqlWhere0callsSqliteRewriterTest::testDeleteFromWithoutWhereReturnsSqlWithSelectWhere0callsSqliteRewriterTest::testDeleteFromWithoutWhereReturnsWriteSimulatedcallsSqliteRewriterTest::testDeleteFromWithSemicolonAndWhitespacecallsSqliteRewriterTest::testDeleteResolvesTargetAfterBlockCommentcallsSqliteRewriterTest::testDeleteReturnsWriteSimulatedWithMutationcallsSqliteRewriterTest::testDeleteWithWhereProducesTransformedSqlcallsSqliteRewriterTest::testDropTableReturnsDdlSimulatedcallsSqliteRewriterTest::testEmptyInputThrowsExceptioncallsSqliteRewriterTest::testEmptyResultSelectProducesNoRowscallsSqliteRewriterTest::testGeneratedExpressionIsPresentBeforeTheFirstShadowWritecallsSqliteRewriterTest::testHasSchemaContextWithRegistryOnlycallsSqliteRewriterTest::testHasSchemaContextWithShadowStoreOnlycallsSqliteRewriterTest::testInMemoryAttachPassesThroughUnchangedcallsSqliteRewriterTest::testInsertDoesNotEnsureShadowStoreForTargetTablecallsSqliteRewriterTest::testInsertOnConflictReturnsUpsertMutationcallsSqliteRewriterTest::testInsertOrReplaceReturnsWriteSimulatedWithReplaceMutationcallsSqliteRewriterTest::testInsertResolvesTargetAfterBlockCommentcallsSqliteRewriterTest::testInsertReturnsWriteSimulatedWithMutationcallsSqliteRewriterTest::testInsertRewriteOutputContainsSelectcallsSqliteRewriterTest::testInsertUsesDefaultsFromRegistryWithoutShadowRowscallsSqliteRewriterTest::testInsertUsesIdentityStrategyFromRegistryWithoutShadowRowscallsSqliteRewriterTest::testInsertWithShadowDataProducesTransformedSqlcallsSqliteRewriterTest::testMultiStatementThrowsExceptioncallsSqliteRewriterTest::testPersistentAttachRemainsUnsupportedcallsSqliteRewriterTest::testReadOnlyDiagnosticsPassThroughUnchangedcallsSqliteRewriterTest::testReadPlanHasNoMutationcallsSqliteRewriterTest::testRegisteredViewIsKnownAndMaterializedcallsSqliteRewriterTest::testRemovedTableIsShadowedInsteadOfFallingThroughcallsSqliteRewriterTest::testReplaceReturnsWriteSimulatedWithMutationcallsSqliteRewriterTest::testRewriteIsDeterministiccallsSqliteRewriterTest::testRewriteMultiplecallsSqliteRewriterTest::testRewriteMultipleEmptyThrowscallsSqliteRewriterTest::testRewriteOutputIsNonEmptycallsSqliteRewriterTest::testSchemaQualifiedSelectUsesShadowCtecallsSqliteRewriterTest::testSelectExistingInShadowStoreIsNotUnknowncallsSqliteRewriterTest::testSelectIgnoresSqlKeywordsInsideLeadingLineCommentcallsSqliteRewriterTest::testSelectKnownTableNoSchemaContextDoesNotThrowcallsSqliteRewriterTest::testSelectReturnsReadKindcallsSqliteRewriterTest::testSelectRewritesTableAfterBlockCommentcallsSqliteRewriterTest::testSelectTableInShadowStoreNotUnknowncallsSqliteRewriterTest::testSelectUnknownTableWithSchemaContextThrowscallsSqliteRewriterTest::testSelectWithMultipleRegisteredTablesIncludesAllcallsSqliteRewriterTest::testSelectWithRegistryOnlyBuildTableContextcallsSqliteRewriterTest::testSelectWithShadowDataColumnsInferredcallsSqliteRewriterTest::testSelectWithShadowDataIncludesCtecallsSqliteRewriterTest::testSelectWithShadowStoreAndRegistryTablesMergedcallsSqliteRewriterTest::testSelectWithShadowStoreOnlyHasSchemaContextcallsSqliteRewriterTest::testSplitStatementsPreservesQuotedSemicolonscallsSqliteRewriterTest::testTransactionStatementRestoresSnapshotOnRollbackcallsSqliteRewriterTest::testUnknownTableAfterDeclaredCteIsRejectedcallsSqliteRewriterTest::testUnsupportedSqlThrowsExceptioncallsSqliteRewriterTest::testUpdateDoesNotPromoteMaterializedUnknownTablecallsSqliteRewriterTest::testUpdateEnsuresShadowStorecallsSqliteRewriterTest::testUpdateEnsuresShadowStoreCalledOnTargetcallsSqliteRewriterTest::testUpdateEnsuresShadowStoreEntrycallsSqliteRewriterTest::testUpdateEnsuresShadowStoreForTargetTablecallsSqliteRewriterTest::testUpdateResolvesTargetAfterBlockCommentcallsSqliteRewriterTest::testUpdateReturnsWriteSimulatedWithMutationcallsSqliteRewriterTest::testWritePlanHasNonNullMutationcallsStatementRewriterTest::testRewriteStatementRejectsUnknownReadSourcescallsStatementRewriterTest::testRewriteStatementSimulatesWritesWithoutApplyingThemcallsStatementRewriterTest::testRewriteStatementUsesShadowRowsForReadscallsSqliteSessionFactoryTestcalls
Relations§
Instantiated in 1
Method calls 1
Type declarations 3
- type ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter packages/ztd-query-sqlite/src/Rewrite/SqliteRewriter.php:56
- type ZtdQuery\Platform\Sqlite\Rewrite\SqliteRewriter packages/ztd-query-sqlite/src/Rewrite/SqliteRewriter.php:80
- type ZtdQuery\Platform\Sqlite\Rewrite\StatementRewriter packages/ztd-query-sqlite/src/Rewrite/StatementRewriter.php:39