Experiment: Port MySQL-on-SQLite to LALR(1) parser #1326
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: PHPUnit Tests | |
| on: | |
| push: | |
| branches: | |
| - trunk | |
| paths: | |
| - '.github/workflows/phpunit-tests.yml' | |
| - 'packages/mysql-on-sqlite/**' | |
| - 'packages/mysql-parser/**' | |
| - 'composer.json' | |
| - 'composer.lock' | |
| pull_request: | |
| paths: | |
| - '.github/workflows/phpunit-tests.yml' | |
| - 'packages/mysql-on-sqlite/**' | |
| - 'packages/mysql-parser/**' | |
| - 'composer.json' | |
| - 'composer.lock' | |
| workflow_dispatch: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| # Disable permissions for all available scopes by default. | |
| # Any needed permissions should be configured at the job level. | |
| permissions: {} | |
| jobs: | |
| test: | |
| name: PHP ${{ matrix.php }} / SQLite ${{ matrix.sqlite }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| permissions: | |
| contents: read # Required to clone the repo. | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # All supported PHP versions, each pinned to a representative SQLite | |
| # version spanning the supported range. | |
| - { php: '7.2', sqlite: '3.27.0' } # minimum with WP_SQLITE_UNSAFE_ENABLE_UNSUPPORTED_VERSIONS | |
| - { php: '7.3', sqlite: '3.31.1' } # Ubuntu 20.04 LTS | |
| - { php: '7.4', sqlite: '3.34.1' } # Debian 11 (Bullseye) | |
| - { php: '8.0', sqlite: '3.37.0' } # minimum supported version (STRICT tables) | |
| - { php: '8.1', sqlite: '3.40.1' } # Debian 12 (Bookworm) | |
| - { php: '8.2', sqlite: '3.45.1' } # Ubuntu 24.04 LTS | |
| - { php: '8.3', sqlite: '3.46.1' } # Debian 13 (Trixie) | |
| - { php: '8.4', sqlite: '3.51.2' } # First 2026 release | |
| - { php: '8.5', sqlite: 'latest' } | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Set up SQLite | |
| run: | | |
| VERSION='${{ matrix.sqlite }}' | |
| if [ "$VERSION" = 'latest' ]; then | |
| TAG='release' | |
| else | |
| TAG="version-${VERSION}" | |
| fi | |
| SQLITE_SOURCE="https://sqlite.org/src/tarball/sqlite.tar.gz?r=${TAG}" | |
| SQLITE_MIRROR="https://github.com/sqlite/sqlite/archive/refs/tags/${TAG}.tar.gz" | |
| DOWNLOADED=0 | |
| for url in "$SQLITE_SOURCE" "$SQLITE_MIRROR"; do | |
| for attempt in 1 2 3 4 5; do | |
| if wget -O sqlite.tar.gz "$url"; then | |
| DOWNLOADED=1 | |
| break 2 | |
| fi | |
| if [ "$attempt" -lt 5 ]; then | |
| sleep $(( attempt * 10 )) | |
| fi | |
| done | |
| done | |
| if [ "$DOWNLOADED" -ne 1 ]; then | |
| exit 1 | |
| fi | |
| tar xzf sqlite.tar.gz | |
| if [ ! -d sqlite ]; then | |
| SQLITE_DIR=$(find . -maxdepth 1 -type d -name 'sqlite-*' | head -n 1) | |
| if [ -z "$SQLITE_DIR" ]; then | |
| exit 1 | |
| fi | |
| mv "$SQLITE_DIR" sqlite | |
| fi | |
| cd sqlite | |
| ./configure --prefix=/usr/local CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA -DSQLITE_ENABLE_FTS5 -DSQLITE_USE_URI -DSQLITE_ENABLE_JSON1" LDFLAGS="-lm" | |
| make -j$(nproc) | |
| sudo make install | |
| sudo ldconfig | |
| - name: Set up PHP | |
| uses: shivammathur/setup-php@v2 | |
| with: | |
| php-version: ${{ matrix.php }} | |
| coverage: none | |
| tools: phpunit-polyfills | |
| - name: Verify SQLite version in PHP | |
| run: | | |
| EXPECTED='${{ matrix.sqlite }}' | |
| if [ "$EXPECTED" = 'latest' ]; then | |
| EXPECTED=$(cat sqlite/VERSION) | |
| fi | |
| PDO=$(php -r "echo (new PDO('sqlite::memory'))->query('SELECT SQLITE_VERSION();')->fetch()[0];") | |
| echo "Expected SQLite version: $EXPECTED" | |
| echo "PHP PDO SQLite version: $PDO" | |
| if [ "$EXPECTED" != "$PDO" ]; then | |
| echo "Error: Expected SQLite version $EXPECTED, but PHP PDO uses $PDO" | |
| exit 1 | |
| fi | |
| - name: Install Composer dependencies (root) | |
| uses: ramsey/composer-install@v3 | |
| with: | |
| ignore-cache: "yes" | |
| composer-options: "--optimize-autoloader" | |
| - name: Install Composer dependencies (mysql-on-sqlite) | |
| uses: ramsey/composer-install@v3 | |
| with: | |
| working-directory: packages/mysql-on-sqlite | |
| ignore-cache: "yes" | |
| composer-options: "--optimize-autoloader" | |
| - name: Run PHPUnit suite | |
| run: php ./vendor/bin/phpunit -c ./phpunit.xml.dist | |
| working-directory: packages/mysql-on-sqlite |