()
| 137 | |
| 138 | #[test] |
| 139 | fn vector_extension_direct_smoke() -> Result<()> { |
| 140 | let _trace = TestTrace::new("vector_extension_direct_smoke"); |
| 141 | let mut db = Pglite::builder() |
| 142 | .temporary() |
| 143 | .extension(extensions::VECTOR) |
| 144 | .open()?; |
| 145 | |
| 146 | db.exec("CREATE TEMP TABLE oxide_vec (embedding vector(3))", None)?; |
| 147 | db.exec("INSERT INTO oxide_vec VALUES ('[1,2,3]')", None)?; |
| 148 | let result = db.query( |
| 149 | "SELECT embedding <-> '[1,2,4]'::vector AS distance FROM oxide_vec", |
| 150 | &[], |
| 151 | None, |
| 152 | )?; |
| 153 | assert_eq!(first_f64(&result, "distance"), 1.0); |
| 154 | |
| 155 | let version = db.query( |
| 156 | "SELECT extversion, n.nspname AS schema_name \ |
| 157 | FROM pg_extension e \ |
| 158 | JOIN pg_namespace n ON n.oid = e.extnamespace \ |
| 159 | WHERE e.extname = 'vector'", |
| 160 | &[], |
| 161 | None, |
| 162 | )?; |
| 163 | let extversion = version.rows[0]["extversion"] |
| 164 | .as_str() |
| 165 | .expect("vector extversion"); |
| 166 | assert!(!extversion.is_empty()); |
| 167 | assert_eq!(version.rows[0]["schema_name"], json!("pg_catalog")); |
| 168 | |
| 169 | trace_expected("vector_direct division-by-zero"); |
| 170 | let err = db |
| 171 | .query( |
| 172 | "SELECT 10 / $1::int4 AS impossible_after_vector", |
| 173 | &[serde_json::json!(0)], |
| 174 | None, |
| 175 | ) |
| 176 | .expect_err("division by zero after vector load should fail"); |
| 177 | assert_pglite_code(&err, "22012", "division by zero"); |
| 178 | let recovered = db.query("SELECT 13::int AS recovered_after_vector_error", &[], None)?; |
| 179 | assert_eq!(recovered.rows[0]["recovered_after_vector_error"], json!(13)); |
| 180 | |
| 181 | trace_expected("vector_direct invalid-vector-literal"); |
| 182 | let invalid_vector = db |
| 183 | .query( |
| 184 | "SELECT $1::vector AS embedding", |
| 185 | &[json!("[hello,1]")], |
| 186 | None, |
| 187 | ) |
| 188 | .expect_err("invalid vector literal should fail inside the vector extension"); |
| 189 | assert_pglite_code( |
| 190 | &invalid_vector, |
| 191 | "22P02", |
| 192 | "invalid input syntax for type vector", |
| 193 | ); |
| 194 | let recovered = db.query( |
| 195 | "SELECT 15::int AS recovered_after_invalid_vector", |
| 196 | &[], |
nothing calls this directly
no test coverage detected