use super::*;
fn live_db_url(key: &str) -> Option<String> {
match std::env::var(key) {
Ok(url) if !url.is_empty() => Some(url),
_ => {
if std::env::var("ECAT_REQUIRE_LIVE_DB").is_ok_and(|v| !v.is_empty()) {
panic!("{key} 未设,但 ECAT_REQUIRE_LIVE_DB 要求真库用例必须运行(跳过即失败)");
}
println!("skip: {key} 未设置");
None
}
}
}
#[tokio::test]
async fn pg_native_types_decode_and_unsupported_type_errors() {
let Some(url) = live_db_url("ECAT_TEST_PG_URL") else {
return;
};
let db = SqlxClient::connect(&url).await.unwrap();
let rows = db
.query(
"SELECT 7::int2 AS s, 3000000000::int8 AS b, 1.5::float4 AS r, \
0.1::float4 AS r2, DATE '2026-10-05' AS d, \
TIMESTAMP '2026-10-05 12:34:56' AS ts",
)
.await
.unwrap();
assert_eq!(rows[0].get("s"), Some(&serde_json::json!(7)), "int2 落空");
assert_eq!(rows[0].get("b"), Some(&serde_json::json!(3000000000i64)));
assert_eq!(
rows[0].get("r"),
Some(&serde_json::json!(1.5)),
"float4 落空"
);
assert_eq!(
rows[0].get("r2"),
Some(&serde_json::json!(0.1)),
"float4 不是最短表示"
);
assert_eq!(rows[0].get("d"), Some(&serde_json::json!("2026-10-05")));
assert_eq!(
rows[0].get("ts"),
Some(&serde_json::json!("2026-10-05T12:34:56Z"))
);
let msg = db
.query("SELECT 1.5::numeric AS n")
.await
.unwrap_err()
.to_string();
assert!(msg.contains("unsupported column type"), "{msg}");
assert!(
msg.to_uppercase().contains("(NUMERIC)"),
"错误信息要带类型名: {msg}"
);
}
#[tokio::test]
async fn mysql_unsigned_columns_decode_and_unsupported_type_errors() {
let Some(url) = live_db_url("ECAT_TEST_MYSQL_URL") else {
return;
};
let params = PoolParams {
max_connections: 1,
..PoolParams::for_url(&url)
};
let db = SqlxClient::connect_with_params(&url, ¶ms)
.await
.unwrap();
db.execute("CREATE TEMPORARY TABLE t6_unsigned (big BIGINT UNSIGNED, tiny TINYINT UNSIGNED)")
.await
.unwrap();
db.execute("INSERT INTO t6_unsigned VALUES (5000000000, 128)")
.await
.unwrap();
let rows = db.query("SELECT big, tiny FROM t6_unsigned").await.unwrap();
assert_eq!(rows[0].get("big"), Some(&serde_json::json!(5000000000u64)));
assert_eq!(rows[0].get("tiny"), Some(&serde_json::json!(128)));
db.execute("CREATE TEMPORARY TABLE t6_types (flag BOOLEAN, bits BIT(1), d DATE)")
.await
.unwrap();
db.execute("INSERT INTO t6_types VALUES (TRUE, b'1', '2026-10-05')")
.await
.unwrap();
let rows = db
.query("SELECT flag, bits, d FROM t6_types")
.await
.unwrap();
assert_eq!(rows[0].get("flag"), Some(&serde_json::json!(1)));
assert_eq!(rows[0].get("bits"), Some(&serde_json::json!(1)));
assert_eq!(rows[0].get("d"), Some(&serde_json::json!("2026-10-05")));
let msg = db
.query("SELECT CAST(1.5 AS DECIMAL(10,2)) AS d")
.await
.unwrap_err()
.to_string();
assert!(msg.contains("unsupported column type"), "{msg}");
}