sqlite - WITH子句中的准备语句导致无限循环

sqlite - Prepared statement in WITH clause causes infinite loop

我有 PHP 脚本,它使用带有 WITH 子句的 SQLite 准备语句打印从 2 到指定结尾范围内的数字。当我 运行 它时,程序永远不会退出并输出 5 之后的数字(指定为参数)。当我 运行 类似的程序结束固定(SQL 代码中的常量)而不是准备好的语句时,它输出预期的数字。

<?php

// Version with prepared statement

$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
  SELECT 2
  UNION
  SELECT i + 1 FROM range WHERE i < :to
) select * from range
");
$s->execute(array(":to" => 5));

foreach ($s as $value)
    echo $value[0] . "\n";

<?php

// Version with constant -- working

$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
  SELECT 2
  UNION
  SELECT i + 1 FROM range WHERE i < 5
) select * from range
");
$s->execute(array());

foreach ($s as $value)
    echo $value[0] . "\n";

LIMIT可以用来限制行数。这并不适用于所有情况,但当我们知道行数时就可以了。

<?php

// Version with prepared statement and LIMIT

$db = new PDO("sqlite::memory:");
$s = $db->prepare("WITH RECURSIVE range(i) AS (
  SELECT 2
  UNION
  SELECT i + 1 FROM range WHERE i < :to
) select i from range limit :to - 1
");
$s->execute(array(":to" => 5));

foreach ($s as $value)
    echo $value[0] . "\n";