Skip to content

Commit f7dbdb9

Browse files
committed
Swap system libsqlite3 for Doltlite and harden verification
The first attempt used LD_PRELOAD, but pdo_sqlite.so's DT_NEEDED on libsqlite3.so.0 resolved to the system SQLite and the preload was ignored — the tests passed against stock SQLite, not Doltlite. Physically replace /usr/local/lib/libsqlite3.so.0 (and the multiarch symlink) with libdoltlite.so, run ldconfig, and assert that doltlite_engine() returns 'prolly' before running PHPUnit.
1 parent c37c609 commit f7dbdb9

1 file changed

Lines changed: 33 additions & 10 deletions

File tree

.github/workflows/phpunit-tests-doltlite.yml

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,16 +46,41 @@ jobs:
4646
php-version: '${{ matrix.php }}'
4747
tools: phpunit-polyfills
4848

49-
- name: Verify Doltlite is wired up via LD_PRELOAD
50-
env:
51-
LD_PRELOAD: ${{ github.workspace }}/doltlite-src/build/libdoltlite.so
49+
- name: Install Doltlite as the system libsqlite3
50+
# Replace the system libsqlite3 the dynamic linker resolves for
51+
# pdo_sqlite with the Doltlite build. This is more reliable than
52+
# LD_PRELOAD, which loses to pdo_sqlite's DT_NEEDED on libsqlite3.so.0.
5253
run: |
54+
SRC="${GITHUB_WORKSPACE}/doltlite-src/build/libdoltlite.so"
55+
test -f "$SRC"
56+
57+
# Drop the build into /usr/local/lib and point libsqlite3 sonames at it,
58+
# both in /usr/local/lib (takes precedence in ld.so.conf) and in the
59+
# multiarch dir so anything hard-coded to that path still works.
60+
sudo install -m 0755 "$SRC" /usr/local/lib/libdoltlite.so
61+
62+
sudo ln -sf /usr/local/lib/libdoltlite.so /usr/local/lib/libsqlite3.so
63+
sudo ln -sf /usr/local/lib/libdoltlite.so /usr/local/lib/libsqlite3.so.0
64+
65+
MULTIARCH_DIR="$(dirname "$(readlink -f /lib/x86_64-linux-gnu/libsqlite3.so.0)")"
66+
sudo rm -f "${MULTIARCH_DIR}/libsqlite3.so.0"
67+
sudo ln -s /usr/local/lib/libdoltlite.so "${MULTIARCH_DIR}/libsqlite3.so.0"
68+
69+
sudo ldconfig
70+
5371
echo "ldd pdo_sqlite:"
54-
ldd "$(php -r 'echo ini_get("extension_dir");')/pdo_sqlite.so" || true
55-
echo
56-
php -r '$v = (new PDO("sqlite::memory:"))->query("SELECT SQLITE_VERSION()")->fetch()[0]; echo "SQLITE_VERSION() = $v\n";'
57-
echo "If Doltlite is active, the engine() check below should print 'prolly':"
58-
php -r '$r = (new PDO("sqlite::memory:"))->query("SELECT doltlite_engine()")->fetch(); var_dump($r);' || true
72+
ldd "$(php -r 'echo ini_get("extension_dir");')/pdo_sqlite.so"
73+
74+
- name: Verify Doltlite is active in PHP
75+
run: |
76+
VERSION=$(php -r 'echo (new PDO("sqlite::memory:"))->query("SELECT SQLITE_VERSION()")->fetch()[0];')
77+
ENGINE=$(php -r 'echo (new PDO("sqlite::memory:"))->query("SELECT doltlite_engine()")->fetch()[0];')
78+
echo "SQLITE_VERSION() = ${VERSION}"
79+
echo "doltlite_engine() = ${ENGINE}"
80+
if [ "${ENGINE}" != "prolly" ]; then
81+
echo "::error::Doltlite is not active (expected doltlite_engine() = 'prolly', got '${ENGINE}')"
82+
exit 1
83+
fi
5984
6085
- name: Install Composer dependencies (root)
6186
uses: ramsey/composer-install@v3
@@ -71,7 +96,5 @@ jobs:
7196
composer-options: "--optimize-autoloader"
7297

7398
- name: Run PHPUnit tests against Doltlite
74-
env:
75-
LD_PRELOAD: ${{ github.workspace }}/doltlite-src/build/libdoltlite.so
7699
run: php ./vendor/bin/phpunit -c ./phpunit.xml.dist
77100
working-directory: packages/mysql-on-sqlite

0 commit comments

Comments
 (0)