mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-18 09:04:19 +01:00
javascript: Fix Statement.get() for boundary values
This commit is contained in:
@@ -281,12 +281,19 @@ impl Statement {
|
|||||||
ValueType::Null => turso_core::Value::Null,
|
ValueType::Null => turso_core::Value::Null,
|
||||||
ValueType::Number => {
|
ValueType::Number => {
|
||||||
let n: f64 = unsafe { value.cast()? };
|
let n: f64 = unsafe { value.cast()? };
|
||||||
if n.fract() == 0.0 {
|
if n.fract() == 0.0 && n >= i64::MIN as f64 && n <= i64::MAX as f64 {
|
||||||
turso_core::Value::Integer(n as i64)
|
turso_core::Value::Integer(n as i64)
|
||||||
} else {
|
} else {
|
||||||
turso_core::Value::Float(n)
|
turso_core::Value::Float(n)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ValueType::BigInt => {
|
||||||
|
let bigint_str = value.coerce_to_string()?.into_utf8()?.as_str()?.to_owned();
|
||||||
|
let bigint_value = bigint_str.parse::<i64>().map_err(|e| {
|
||||||
|
Error::new(Status::NumberExpected, format!("Failed to parse BigInt: {e}"))
|
||||||
|
})?;
|
||||||
|
turso_core::Value::Integer(bigint_value)
|
||||||
|
}
|
||||||
ValueType::String => {
|
ValueType::String => {
|
||||||
let s = value.coerce_to_string()?.into_utf8()?;
|
let s = value.coerce_to_string()?.into_utf8()?;
|
||||||
turso_core::Value::Text(s.as_str()?.to_owned().into())
|
turso_core::Value::Text(s.as_str()?.to_owned().into())
|
||||||
|
|||||||
@@ -89,12 +89,20 @@ export function encodeValue(value: any): Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (typeof value === 'number') {
|
if (typeof value === 'number') {
|
||||||
if (Number.isInteger(value)) {
|
if (!Number.isFinite(value)) {
|
||||||
return { type: 'integer', value: value.toString() };
|
throw new Error("Only finite numbers (not Infinity or NaN) can be passed as arguments");
|
||||||
}
|
}
|
||||||
return { type: 'float', value };
|
return { type: 'float', value };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (typeof value === 'bigint') {
|
||||||
|
return { type: 'integer', value: value.toString() };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof value === 'boolean') {
|
||||||
|
return { type: 'integer', value: value ? '1' : '0' };
|
||||||
|
}
|
||||||
|
|
||||||
if (typeof value === 'string') {
|
if (typeof value === 'string') {
|
||||||
return { type: 'text', value };
|
return { type: 'text', value };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -279,6 +279,17 @@ test.serial("Statement.get() [raw]", async (t) => {
|
|||||||
t.deepEqual(await stmt.raw().get(1), [1, "Alice", "alice@example.org"]);
|
t.deepEqual(await stmt.raw().get(1), [1, "Alice", "alice@example.org"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.serial("Statement.get() values", async (t) => {
|
||||||
|
const db = t.context.db;
|
||||||
|
|
||||||
|
const stmt = (await db.prepare("SELECT ?")).raw();
|
||||||
|
t.deepEqual(await stmt.get(1), [1]);
|
||||||
|
t.deepEqual(await stmt.get(Number.MIN_VALUE), [Number.MIN_VALUE]);
|
||||||
|
t.deepEqual(await stmt.get(Number.MAX_VALUE), [Number.MAX_VALUE]);
|
||||||
|
t.deepEqual(await stmt.get(Number.MAX_SAFE_INTEGER), [Number.MAX_SAFE_INTEGER]);
|
||||||
|
t.deepEqual(await stmt.get(9007199254740991n), [9007199254740991]);
|
||||||
|
});
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// Statement.iterate()
|
// Statement.iterate()
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|||||||
@@ -334,7 +334,7 @@ test.serial("Statement.get() [raw]", async (t) => {
|
|||||||
t.deepEqual(stmt.raw().get(1), [1, "Alice", "alice@example.org"]);
|
t.deepEqual(stmt.raw().get(1), [1, "Alice", "alice@example.org"]);
|
||||||
});
|
});
|
||||||
|
|
||||||
test.skip("Statement.get() values", async (t) => {
|
test.serial("Statement.get() values", async (t) => {
|
||||||
const db = t.context.db;
|
const db = t.context.db;
|
||||||
|
|
||||||
const stmt = db.prepare("SELECT ?").raw();
|
const stmt = db.prepare("SELECT ?").raw();
|
||||||
|
|||||||
Reference in New Issue
Block a user