SQLite附加数据库中使用db.table.*查询报错是否为Bug?
SQLite中
db.table.*语法报错的问题分析 我在SQLite中执行以下语句附加内存数据库:
ATTACH DATABASE 'file::memory:?cache=shared' AS backend
遇到了语法规则的不一致问题:
- 使用
SELECT db.table.* FROM db.table会触发语法错误 - 显式列出所有列的语句
SELECT db.table.col1, db.table.col2 FROM db.table可以正常执行 - 使用
SELECT table.* FROM db.table也能正常执行
查看SQLite的语法定义可知,result-column语法仅支持table-name.*格式,不支持db-name.table-name.*的写法。这种情况不属于SQLite的Bug,而是其语法规范的明确限制。
以下是PHP测试代码,可复现该问题:
$db = new PDO('sqlite::memory:'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec("ATTACH DATABASE 'file::memory:?cache=shared' AS backend"); $db->exec("CREATE TABLE users (user_id INTEGER PRIMARY KEY, name TEXT)"); $db->exec("INSERT INTO users (user_id, name) VALUES (1, 'Alice'), (2, 'Bob')"); $db->exec("CREATE TABLE backend.posts (post_id INTEGER PRIMARY KEY, text TEXT)"); $db->exec("INSERT INTO backend.posts (post_id, text) VALUES (1, 'Lorem'), (2, 'Ipsum')"); // 正常执行 $query = "SELECT posts.* FROM backend.posts"; dump($db->query($query)->fetchAll(PDO::FETCH_ASSOC)); // 正常执行 $query = "SELECT backend.posts.post_id, backend.posts.text FROM backend.posts"; dump($db->query($query)->fetchAll(PDO::FETCH_ASSOC)); // 报错:General error: 1 near "*": syntax error $query = "SELECT backend.posts.* FROM backend.posts"; dump($db->query($query)->fetchAll(PDO::FETCH_ASSOC));
内容的提问来源于stack exchange,提问作者Vertex
相关产品推荐
相关产品推荐

