// Copyright (c) 2023-2025 ParadeDB, Inc. // // This file is part of ParadeDB - Postgres for Search and Analytics // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . mod fixtures; use fixtures::*; use rstest::*; use sqlx::PgConnection; #[rstest] fn mvcc_heap_filter(mut conn: PgConnection) { r#" CALL paradedb.create_bm25_test_table(table_name => 'heap_and_clauses_table', schema_name => 'public'); CREATE INDEX heap_and_clauses_idx ON heap_and_clauses_table USING bm25 (id, description) WITH (key_field = 'id'); "#.execute(&mut conn); // Ensure that heap filters continue to be applied correctly in the presence of updates. for _ in 0..128 { let results: Vec<(i32, String)> = r#" SELECT id, description FROM heap_and_clauses_table WHERE id @@@ paradedb.match('description', 'Sleek running', conjunction_mode := true) AND description ILIKE 'Sleek running shoes' ORDER BY id; "# .fetch(&mut conn); assert_eq!(results.len(), 1); assert_eq!(results[0].0, 3); assert_eq!(results[0].1, "Sleek running shoes"); r#" UPDATE heap_and_clauses_table SET last_updated_date = NOW(); "# .execute(&mut conn); } } #[rstest] fn mvcc_snippet(mut conn: PgConnection) { if pg_major_version(&mut conn) <= 14 { // TODO: See https://github.com/paradedb/paradedb/issues/3358. return; } r#" CALL paradedb.create_bm25_test_table(table_name => 'mock_items', schema_name => 'public'); CREATE INDEX mock_items_idx ON mock_items USING bm25 (id, description) WITH (key_field = 'id'); "# .execute(&mut conn); // Ensure that snippet lookups from the heap succeed in the presence of updates. for _ in 0..128 { let results: Vec<(i32, String)> = r#" SELECT id, pdb.snippet(description) FROM mock_items WHERE description @@@ 'shoes' ORDER BY id LIMIT 5; "# .fetch(&mut conn); assert_eq!(results.len(), 3); assert_eq!(results[0].0, 3); assert_eq!(results[0].1, "Sleek running shoes"); assert_eq!(results[1].0, 4); assert_eq!(results[1].1, "White jogging shoes"); assert_eq!(results[2].0, 5); assert_eq!(results[2].1, "Generic shoes"); r#" UPDATE mock_items SET last_updated_date = NOW(); "# .execute(&mut conn); } }