addToAssertionCount(2); } #[DataProvider('unsafeSqlProvider')] public function test_write_or_high_risk_sql_is_rejected(string $sql): void { $this->expectException(InvalidArgumentException::class); UpstreamReadOnlyQuery::assertReadOnlySql($sql); } public static function unsafeSqlProvider(): array { return [ 'insert' => ['INSERT INTO finance_orders (id) VALUES (1)'], 'cte delete' => ['WITH target AS (SELECT id FROM finance_orders) DELETE FROM target'], 'select into' => ['SELECT * INTO temp_orders FROM finance_orders'], 'stored procedure' => ['EXEC refresh_finance_data'], 'multiple statements' => ['SELECT 1; DELETE FROM finance_orders'], 'comment' => ['SELECT id FROM finance_orders -- hidden statement'], 'sequence mutation' => ['SELECT NEXT VALUE FOR finance_sequence'], ]; } }