Skip to content

Commit c138e01

Browse files
committed
Add CI probe for Turso columnN binding shapes
Run a focused matrix of INSERT-SELECT-FROM-VALUES variants directly against Turso (no driver) and print pass/fail for each. The matrix isolates each suspected dimension separately: - top-level vs INSERT context - bare column1 vs `column1` (backtick) - with vs without CAST - with vs without WHERE true - VALUES vs SELECT alias vs CTE alias The probe is decorated with continue-on-error so it cannot fail the job, and it runs before PHPUnit so it always produces output even if the main test step crashes. The aim is to identify which exact shape Turso rejects so the fix can be targeted rather than guessed at, since prior driver-side rewrites caused a Turso SIGSEGV in testReconstructTable.
1 parent 6f1f8a2 commit c138e01

1 file changed

Lines changed: 52 additions & 0 deletions

File tree

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

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,58 @@ jobs:
894894
echo "close: ok\n";
895895
PHP
896896
897+
- name: Probe Turso columnN binding in INSERT-SELECT-FROM-VALUES
898+
continue-on-error: true
899+
env:
900+
LD_PRELOAD: ${{ steps.preload.outputs.value }}
901+
run: |
902+
php <<'PHP'
903+
<?php
904+
// Probes Turso behaviour for the columnN reference pattern that the
905+
// mysql-on-sqlite driver emits for INSERT...VALUES type casting.
906+
// Each form is a small variation; we run them in isolation and
907+
// print the outcome so we can see exactly which shape Turso rejects.
908+
$pdo = new PDO('sqlite::memory:');
909+
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
910+
$pdo->exec('CREATE TABLE t (v INTEGER)');
911+
912+
$cases = [
913+
'top-level SELECT column1 FROM (VALUES)' =>
914+
'SELECT column1 FROM (VALUES (5))',
915+
'top-level SELECT `column1` FROM (VALUES)' =>
916+
'SELECT `column1` FROM (VALUES (5))',
917+
'top-level SELECT CAST(`column1`) FROM (VALUES)' =>
918+
'SELECT CAST(`column1` AS INTEGER) FROM (VALUES (5))',
919+
'top-level SELECT CAST(`column1`) FROM (VALUES) WHERE true' =>
920+
'SELECT CAST(`column1` AS INTEGER) FROM (VALUES (5)) WHERE true',
921+
'INSERT...SELECT column1 FROM (VALUES)' =>
922+
'INSERT INTO t (v) SELECT column1 FROM (VALUES (5))',
923+
'INSERT...SELECT `column1` FROM (VALUES)' =>
924+
'INSERT INTO t (v) SELECT `column1` FROM (VALUES (5))',
925+
'INSERT...SELECT CAST(`column1`) FROM (VALUES)' =>
926+
'INSERT INTO t (v) SELECT CAST(`column1` AS INTEGER) FROM (VALUES (5))',
927+
'INSERT...SELECT CAST(`column1`) FROM (VALUES) WHERE true' =>
928+
'INSERT INTO t (v) SELECT CAST(`column1` AS INTEGER) FROM (VALUES (5)) WHERE true',
929+
'INSERT...SELECT CAST(column1) FROM (VALUES) WHERE true (no backticks)' =>
930+
'INSERT INTO t (v) SELECT CAST(column1 AS INTEGER) FROM (VALUES (5)) WHERE true',
931+
'INSERT...SELECT CAST(`column1`) FROM (SELECT...)' =>
932+
'INSERT INTO t (v) SELECT CAST(`column1` AS INTEGER) FROM (SELECT 5 AS `column1`) WHERE true',
933+
'INSERT...SELECT CAST(`column1`) FROM CTE(VALUES)' =>
934+
"INSERT INTO t (v) WITH src(`column1`) AS (VALUES (5)) SELECT CAST(`column1` AS INTEGER) FROM src WHERE true",
935+
];
936+
foreach ($cases as $label => $sql) {
937+
try {
938+
$stmt = $pdo->query($sql);
939+
if ($stmt && stripos($sql, 'INSERT') === false) {
940+
$stmt->fetchAll();
941+
}
942+
echo "OK $label\n";
943+
} catch (Throwable $e) {
944+
echo "FAIL $label -> " . $e->getMessage() . "\n";
945+
}
946+
try { $pdo->exec('DELETE FROM t'); } catch (Throwable $_) {}
947+
}
948+
897949
- name: Install Composer dependencies (root)
898950
uses: ramsey/composer-install@v3
899951
with:

0 commit comments

Comments
 (0)