sqlite: excess bound parameters produce an opaque "column index out of range" error
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức phù hợp với người mới
- 68/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Ít trao đổi
- Công nghệ
- javascript, node.js, sqlite
- Lĩnh vực
- databases
Hướng nghiên cứu
Bắt đầu trong src/node_sqlite.cc tại StatementSync::BindParams, đọc cách xử lý param_count hiện có và vòng lặp binding ẩn danh. Tái hiện vấn đề bằng các đoạn SQL được cung cấp; được xem là hoàn tất khi các đối số ẩn danh dư thừa báo lỗi rõ ràng về số lượng tham số thay vì SQLite errcode 25, mà không thay đổi hành vi binding hiện có.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Version
v24.15.0 (also present on main)
Platform
Darwin 25.6.0 arm64 (platform-independent — pure BindParams logic)
Subsystem
sqlite
What steps will reproduce the bug?
const { DatabaseSync } = require('node:sqlite');
const db = new DatabaseSync(':memory:');
db.exec('CREATE TABLE t(a)');
const ins = db.prepare('INSERT INTO t VALUES (?)');
ins.run(1, 2); // ERR_SQLITE_ERROR, errcode 25, "column index out of range"
db.prepare('SELECT 1').get(5); // same
Any excess anonymous argument reproduces it, regardless of type — 2, 'x', and null all give the identical message.
How often does it reproduce? Is there a required condition?
Always, whenever the number of anonymous arguments exceeds the statement's sqlite3_bind_parameter_count().
What is the expected behavior? Why is that the expected behavior?
An error naming the actual problem — that more parameters were supplied than the statement accepts, ideally with both counts. Something like:
TypeError [ERR_INVALID_ARG_COUNT]: Statement accepts 1 parameter, but 2 were provided.
Two reasons this matters:
-
The message describes the wrong thing. "Column index out of range" is SQLite's wording for a binding index, but to a JS caller "column" reads as a table column, pointing them at their schema rather than their call site. Nothing in the message indicates an argument-count mismatch.
-
It's inconsistent with how the adjacent failure is reported. A wrong-type argument gets a precise Node-authored error:
ERR_INVALID_ARG_TYPE: Provided value cannot be bound to SQLite parameter 2.A wrong-count argument falls through to a raw SQLite error code. Both are caller mistakes in the same call, caught in the same function.
What do you see instead?
ERR_SQLITE_ERROR with errcode: 25 and message column index out of range.
Additional information
The anonymous-binding loop in StatementSync::BindParams (src/node_sqlite.cc) iterates args from anon_start to args.Length() without comparing that span against sqlite3_bind_parameter_count(), so the overflow surfaces from sqlite3_bind_* instead. param_count is already fetched a few lines above, inside the bare-named-params block. A pre-loop guard would cover every excess-argument case at once.
Worth deciding up front whether this should throw at all, or ignore extra arguments the way ordinary JS functions do. Throwing seems better for a database API, and it's the current behavior, so a guard would preserve semantics while fixing only the message. Note this would be a breaking change for anyone matching on ERR_SQLITE_ERROR/errcode 25, so it likely wants semver-major treatment.
Surfaced while reviewing #62008, which changes undefined handling in the same function; the two are independent.
- Ngôn ngữ chính
- JavaScript
- Star
- 122k
- Fork
- 37.4k
- Merge trung bình
- 4 ngày 3 giờ
- Pull request đã merge (30 ngày)
- 279
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của nodejs/node
-
doc
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
build
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 90/100
-
feature request
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
-
Theme loads third-party resources on every page (jsdelivr web font, cdnjs Font Awesome) – GDPR Đang mở
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
docToolchain/docToolchain#1705 ·
-
Timezone select lists one option per character; duplicate "Failed" reason; shared tracker popover id Đang mởbug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
nightscout/nocturne#1414 ·
-
bug v2
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
modelcontextprotocol/inspector#2458 · 1 bình luận ·
-
Mend: dependency security vulnerability status: needs triage 🕵️♀️
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
carbon-design-system/ibm-products#9907 ·