From 4f66ad2ae07e55262923fc620cb2b58e5921971f Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 10 Jan 2022 15:57:57 +0100 Subject: [PATCH 01/10] demo --- demo.php | 19 +++++++++++++++++++ phpstan.neon.dist | 5 ++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 demo.php diff --git a/demo.php b/demo.php new file mode 100644 index 000000000..4e7d1fdb1 --- /dev/null +++ b/demo.php @@ -0,0 +1,19 @@ +prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid'); + $stmt->execute([':wrongParamName' => 1]); + + $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid'); + $stmt->execute(); // missing parameter + + $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = ? and email = ?'); + $stmt->execute([1]); // wrong number of parameters + + $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid and email = :email'); + $stmt->execute(['adaid' => 1]); // wrong number of parameters + + $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid and email = :email'); + $stmt->execute([':email' => 'email@example.org']); // wrong number of parameters +} diff --git a/phpstan.neon.dist b/phpstan.neon.dist index a66a82f3a..a5eecb0ca 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -1,12 +1,11 @@ includes: - - config/stubFiles.neon - - config/extensions.neon + - config/dba.neon parameters: level: max paths: - - src/ + - demo.php bootstrapFiles: - bootstrap.php From a6bbf027480e0085423de3b3b06916e585ce49c6 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Mon, 10 Jan 2022 16:00:46 +0100 Subject: [PATCH 02/10] simplify --- demo.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/demo.php b/demo.php index 4e7d1fdb1..4d3dc4f6e 100644 --- a/demo.php +++ b/demo.php @@ -2,18 +2,24 @@ function demo(\PDO $pdo): void { + $pdo->query('SELECT * FROM unknownTable', PDO::FETCH_ASSOC); + + $pdo->query('SELECT email adaid WHERE gesperrt freigabe1u1 FROM ada', PDO::FETCH_ASSOC); + + $pdo->query('SELECT doesNotExist, adaid, gesperrt, freigabe1u1 FROM ada', PDO::FETCH_ASSOC); + $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid'); $stmt->execute([':wrongParamName' => 1]); $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid'); - $stmt->execute(); // missing parameter + $stmt->execute(); $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = ? and email = ?'); - $stmt->execute([1]); // wrong number of parameters + $stmt->execute([1]); $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid and email = :email'); - $stmt->execute(['adaid' => 1]); // wrong number of parameters + $stmt->execute(['adaid' => 1]); $stmt = $pdo->prepare('SELECT email, adaid FROM ada WHERE adaid = :adaid and email = :email'); - $stmt->execute([':email' => 'email@example.org']); // wrong number of parameters + $stmt->execute([':email' => 'email@example.org']); } From f6b5b3aa7a8e3ab76c1e633e2fb8a7d185aabbab Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 18 May 2022 20:53:41 +0200 Subject: [PATCH 03/10] result set type inference demo --- demo.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/demo.php b/demo.php index 4d3dc4f6e..ae8bb683a 100644 --- a/demo.php +++ b/demo.php @@ -2,6 +2,19 @@ function demo(\PDO $pdo): void { + // ---------- result-set type inference ---------- + $stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_ASSOC); + assertType('PDOStatement}>', $stmt); + + foreach ($stmt as $row) { + parse_str($row['adaid'], $x); + if ($row['email'] + 25) { + $x = $row['doesnotexit']; + } + } + + // ---------- in-depth query analysis ---------- + $pdo->query('SELECT * FROM unknownTable', PDO::FETCH_ASSOC); $pdo->query('SELECT email adaid WHERE gesperrt freigabe1u1 FROM ada', PDO::FETCH_ASSOC); From 939849bbce8bb69da08d158ebdbeca6736aba0dd Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 18 May 2022 20:56:15 +0200 Subject: [PATCH 04/10] simplify --- demo.php | 1 - 1 file changed, 1 deletion(-) diff --git a/demo.php b/demo.php index ae8bb683a..5350ccda2 100644 --- a/demo.php +++ b/demo.php @@ -4,7 +4,6 @@ function demo(\PDO $pdo): void { // ---------- result-set type inference ---------- $stmt = $pdo->query('SELECT email, adaid FROM ada', PDO::FETCH_ASSOC); - assertType('PDOStatement}>', $stmt); foreach ($stmt as $row) { parse_str($row['adaid'], $x); From bbe4540787ed43f535640d024de2ab54a9932405 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 18 May 2022 20:57:10 +0200 Subject: [PATCH 05/10] simplify --- .github/workflows/tests-postgres.yml | 69 ---------------------------- .github/workflows/tests.yml | 29 +----------- 2 files changed, 2 insertions(+), 96 deletions(-) delete mode 100644 .github/workflows/tests-postgres.yml diff --git a/.github/workflows/tests-postgres.yml b/.github/workflows/tests-postgres.yml deleted file mode 100644 index 812206340..000000000 --- a/.github/workflows/tests-postgres.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: Unit Tests Postgres - -on: - push: - branches: - - main - pull_request: - -jobs: - phpunit: - name: PHPUnit - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - php-version: "8.0" - db-image: 'postgres:14' - reflector: "pdo-pgsql" - mode: "recording" - - env: - DBA_REFLECTOR: ${{ matrix.reflector }} - DBA_MODE: ${{ matrix.mode }} - DBA_USER: postgres - DBA_DATABASE: postgres - DBA_PASSWORD: postgres - - # https://docs.github.com/en/free-pro-team@latest/actions/guides/about-service-containers - services: - postgres: - image: ${{ matrix.db-image }} - env: - POSTGRES_PASSWORD: postgres - options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3 - ports: - - 5432:5432 - - steps: - - uses: actions/checkout@v2 - with: - repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} - ref: ${{ github.event.client_payload.pull_request.head.ref }} - - - name: Setup PHP with PDO - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php-version }}" - coverage: none - - - uses: "ramsey/composer-install@v2" - with: - composer-options: "--prefer-dist --no-progress" - - - name: Setup Problem Matchers for PHPUnit - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - - name: Install PostgreSQL client - run: | - sudo apt-get update - sudo apt-get install --yes postgresql-client - - - name: Setup PSQL - run: psql -h localhost -U postgres < tests/pgsql-schema.sql - env: - PGPASSWORD: postgres - - - run: composer phpunit diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 17a5f676c..457f97fe4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -16,33 +16,11 @@ jobs: fail-fast: false matrix: include: - - php-version: "7.4" - db-image: 'mysql:8.0' - reflector: "pdo-mysql" - mode: "recording" - php-version: "8.0" db-image: 'mysql:8.0' - reflector: "pdo-mysql" - mode: "recording" - - php-version: "8.0" - db-image: 'mysql:8.0' - reflector: "mysqli" + reflector: "pdo" mode: "recording" - - php-version: "8.1" - db-image: 'mysql:8.0' - reflector: "mysqli" - mode: "recording" - - php-version: '8.1' - db-image: 'mariadb:latest' - reflector: "mysqli" - mode: "recording" - - - php-version: "8.1" - db-image: 'mysql:8.0' - reflector: "pdo-mysql" - mode: "replay-and-recording" - env: DBA_REFLECTOR: ${{ matrix.reflector }} DBA_MODE: ${{ matrix.mode }} @@ -76,9 +54,6 @@ jobs: - name: Setup Problem Matchers for PHPUnit run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - name: Lint - run: php vendor/bin/parallel-lint --colors src tests - - name: Setup mysql run: | mysql -uroot -h127.0.0.1 -proot < tests/schema.sql @@ -94,7 +69,7 @@ jobs: matrix: include: - php-version: "8.1" - reflector: "pdo-mysql" + reflector: "pdo" mode: "replay" - php-version: "8.1" reflector: "mysqli" From 802be3da393f907d04d9d0d212d73ec384cea980 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 18 May 2022 20:59:20 +0200 Subject: [PATCH 06/10] simplify --- .github/workflows/tests.yml | 40 ------------------------------------- 1 file changed, 40 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 457f97fe4..62e51433e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -59,43 +59,3 @@ jobs: mysql -uroot -h127.0.0.1 -proot < tests/schema.sql - run: composer phpunit - - replay: - name: PHPUnit (reflection replay) - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - php-version: "8.1" - reflector: "pdo" - mode: "replay" - - php-version: "8.1" - reflector: "mysqli" - mode: "replay" - - env: - DBA_REFLECTOR: ${{ matrix.reflector }} - DBA_MODE: ${{ matrix.mode }} - - steps: - - uses: actions/checkout@v2 - with: - repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} - ref: ${{ github.event.client_payload.pull_request.head.ref }} - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php-version }}" - coverage: none - - - uses: "ramsey/composer-install@v2" - with: - composer-options: "--prefer-dist --no-progress" - - - name: Setup Problem Matchers for PHPUnit - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - - run: composer phpunit From 4cf43f16bd58e4b98182b7a84592749d8622e017 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 18 May 2022 21:00:20 +0200 Subject: [PATCH 07/10] simplify --- .github/workflows/tests.yml | 61 ------------------------------------- 1 file changed, 61 deletions(-) delete mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 62e51433e..000000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: Unit Tests MySQL - -on: - push: - branches: - - main - pull_request: - -jobs: - - phpunit: - name: PHPUnit - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - php-version: "8.0" - db-image: 'mysql:8.0' - reflector: "pdo" - mode: "recording" - - env: - DBA_REFLECTOR: ${{ matrix.reflector }} - DBA_MODE: ${{ matrix.mode }} - - # https://docs.github.com/en/free-pro-team@latest/actions/guides/about-service-containers - services: - mysql: - image: ${{ matrix.db-image }} - env: - MYSQL_ROOT_PASSWORD: root - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 - - steps: - - uses: actions/checkout@v2 - with: - repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} - ref: ${{ github.event.client_payload.pull_request.head.ref }} - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php-version }}" - coverage: none - - - uses: "ramsey/composer-install@v2" - with: - composer-options: "--prefer-dist --no-progress" - - - name: Setup Problem Matchers for PHPUnit - run: echo "::add-matcher::${{ runner.tool_cache }}/phpunit.json" - - - name: Setup mysql - run: | - mysql -uroot -h127.0.0.1 -proot < tests/schema.sql - - - run: composer phpunit From 0768e892a9d47dc4e6f53229d04e3b7d8fe06155 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 25 May 2022 17:04:36 +0200 Subject: [PATCH 08/10] enable analyzeQueryPlans --- bootstrap.php | 1 + 1 file changed, 1 insertion(+) diff --git a/bootstrap.php b/bootstrap.php index b0ebbdbec..a5c442ed8 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -15,6 +15,7 @@ $config = RuntimeConfiguration::create(); $config->errorMode(RuntimeConfiguration::ERROR_MODE_EXCEPTION); // $config->debugMode(true); +$config->analyzeQueryPlans(true, 2); if (false === getenv('GITHUB_ACTION') && false === getenv('DBA_MODE')) { putenv('DBA_MODE=replay-and-recording'); From 44d1dba73ebffb04fa7bff664e9d7a0e43a3b622 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 25 May 2022 17:06:56 +0200 Subject: [PATCH 09/10] cleanup --- .github/workflows/phpstan.yml | 56 ----------------------------------- 1 file changed, 56 deletions(-) diff --git a/.github/workflows/phpstan.yml b/.github/workflows/phpstan.yml index 51288050a..147e6498c 100644 --- a/.github/workflows/phpstan.yml +++ b/.github/workflows/phpstan.yml @@ -16,29 +16,11 @@ jobs: fail-fast: false matrix: include: - - php-version: "8.0" - db-image: 'mysql:8.0' - reflector: "pdo-mysql" - mode: "recording" - php-version: "8.0" db-image: 'mysql:8.0' reflector: "mysqli" mode: "recording" - - php-version: "8.1" - db-image: 'mysql:8.0' - reflector: "mysqli" - mode: "recording" - - php-version: '8.1' - db-image: 'mariadb:latest' - reflector: "mysqli" - mode: "recording" - - - php-version: "8.1" - db-image: 'mysql:8.0' - reflector: "mysqli" - mode: "replay-and-recording" - env: DBA_REFLECTOR: ${{ matrix.reflector }} DBA_MODE: ${{ matrix.mode }} @@ -75,41 +57,3 @@ jobs: mysql -uroot -h127.0.0.1 -proot < tests/schema.sql - run: composer phpstan - - replay: - name: PHPStan (reflection replay) - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - include: - - php-version: "8.1" - reflector: "mysqli" - mode: "replay" - - php-version: "8.1" - reflector: "pdo-mysql" - mode: "replay" - - env: - DBA_REFLECTOR: ${{ matrix.reflector }} - DBA_MODE: ${{ matrix.mode }} - - steps: - - uses: actions/checkout@v2 - with: - repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} - ref: ${{ github.event.client_payload.pull_request.head.ref }} - - - name: Setup PHP - id: setup-php - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php-version }}" - coverage: none - - - uses: "ramsey/composer-install@v2" - with: - composer-options: "--prefer-dist --no-progress" - - - run: composer phpstan From be77fc69484fc51331c0043cca36bcaef279d81f Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Wed, 25 May 2022 17:09:25 +0200 Subject: [PATCH 10/10] query plan analysis --- demo.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/demo.php b/demo.php index 5350ccda2..71585f757 100644 --- a/demo.php +++ b/demo.php @@ -12,6 +12,10 @@ function demo(\PDO $pdo): void } } + // ---------- query plan analysis ---------- + + $pdo->query("SELECT * FROM `ada` WHERE email = 'test@example.com';"); + // ---------- in-depth query analysis ---------- $pdo->query('SELECT * FROM unknownTable', PDO::FETCH_ASSOC);