use super::common::pgwire_harness::TestServer;
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn create_unique_index_rejects_duplicate_insert() {
let server = TestServer::start().await;
server
.exec("CREATE COLLECTION idx_unique_enforce")
.await
.unwrap();
server
.exec("CREATE UNIQUE INDEX ON idx_unique_enforce(email)")
.await
.unwrap();
server
.exec("INSERT INTO idx_unique_enforce { id: 'a', email: 'x@y.z' }")
.await
.unwrap();
server
.expect_error(
"INSERT INTO idx_unique_enforce { id: 'b', email: 'x@y.z' }",
"unique",
)
.await;
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn create_index_backfills_existing_rows() {
let server = TestServer::start().await;
server.exec("CREATE COLLECTION bf_col").await.unwrap();
server
.exec("INSERT INTO bf_col { id: 'a', email: 'one@x.com' }")
.await
.unwrap();
server
.exec("INSERT INTO bf_col { id: 'b', email: 'two@x.com' }")
.await
.unwrap();
server.exec("CREATE INDEX ON bf_col(email)").await.unwrap();
let rows = server
.query_text("SELECT id FROM bf_col WHERE email = 'one@x.com'")
.await
.expect("indexed SELECT must succeed");
assert_eq!(
rows.len(),
1,
"indexed SELECT must return exactly one row, got: {rows:?}"
);
assert_eq!(
rows[0], "a",
"indexed SELECT row must reference doc id 'a', got: {}",
rows[0]
);
}
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn create_unique_index_rejects_existing_duplicates() {
let server = TestServer::start().await;
server.exec("CREATE COLLECTION bf_unique").await.unwrap();
server
.exec("INSERT INTO bf_unique { id: 'a', code: 'ABC' }")
.await
.unwrap();
server
.exec("INSERT INTO bf_unique { id: 'b', code: 'ABC' }")
.await
.unwrap();
server
.expect_error("CREATE UNIQUE INDEX ON bf_unique(code)", "unique")
.await;
}