()
| 598 | |
| 599 | #[tokio::test(flavor = "multi_thread")] |
| 600 | async fn vector_extension_server_sqlx_smoke() -> Result<()> { |
| 601 | let _trace = TestTrace::new("vector_extension_server_sqlx_smoke"); |
| 602 | let server = PgliteServer::builder() |
| 603 | .temporary() |
| 604 | .extension(extensions::VECTOR) |
| 605 | .start()?; |
| 606 | let mut conn = sqlx::PgConnection::connect(&server.connection_uri()).await?; |
| 607 | |
| 608 | sqlx::query("CREATE TABLE oxide_vec_server (embedding vector(3))") |
| 609 | .execute(&mut conn) |
| 610 | .await?; |
| 611 | sqlx::query("INSERT INTO oxide_vec_server VALUES ('[1,2,3]')") |
| 612 | .execute(&mut conn) |
| 613 | .await?; |
| 614 | let row = |
| 615 | sqlx::query("SELECT embedding <-> '[1,2,4]'::vector AS distance FROM oxide_vec_server") |
| 616 | .fetch_one(&mut conn) |
| 617 | .await?; |
| 618 | |
| 619 | assert_eq!(row.try_get::<f64, _>("distance")?, 1.0); |
| 620 | |
| 621 | trace_expected("vector_server_sqlx division-by-zero"); |
| 622 | let err = sqlx::query("SELECT 10 / $1::int4 AS impossible_after_vector") |
| 623 | .bind(0_i32) |
| 624 | .fetch_one(&mut conn) |
| 625 | .await |
| 626 | .expect_err("division by zero after vector load should fail"); |
| 627 | assert_sqlx_code(&err, "22012"); |
| 628 | let row = sqlx::query("SELECT 14::int4 AS recovered_after_vector_error") |
| 629 | .fetch_one(&mut conn) |
| 630 | .await?; |
| 631 | assert_eq!(row.try_get::<i32, _>("recovered_after_vector_error")?, 14); |
| 632 | |
| 633 | trace_expected("vector_server_sqlx invalid-vector-literal"); |
| 634 | let err = sqlx::query("SELECT $1::text::vector AS embedding") |
| 635 | .bind("[hello,1]") |
| 636 | .fetch_one(&mut conn) |
| 637 | .await |
| 638 | .expect_err("invalid vector input through SQLx should fail in the vector extension"); |
| 639 | assert_sqlx_code(&err, "22P02"); |
| 640 | let row = sqlx::query("SELECT 18::int4 AS recovered_after_invalid_vector") |
| 641 | .fetch_one(&mut conn) |
| 642 | .await?; |
| 643 | assert_eq!(row.try_get::<i32, _>("recovered_after_invalid_vector")?, 18); |
| 644 | |
| 645 | trace_expected("vector_server_sqlx dimension-mismatch"); |
| 646 | let err = sqlx::query("SELECT $1::text::vector <-> $2::text::vector AS distance") |
| 647 | .bind("[1,2]") |
| 648 | .bind("[3]") |
| 649 | .fetch_one(&mut conn) |
| 650 | .await |
| 651 | .expect_err("vector distance should reject mismatched dimensions through SQLx"); |
| 652 | assert_sqlx_code(&err, "22000"); |
| 653 | let row = sqlx::query("SELECT 19::int4 AS recovered_after_dimension_mismatch") |
| 654 | .fetch_one(&mut conn) |
| 655 | .await?; |
| 656 | assert_eq!( |
| 657 | row.try_get::<i32, _>("recovered_after_dimension_mismatch")?, |
nothing calls this directly
no test coverage detected