// Copyright (c) 2023-2026 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 . use rstest::*; use sqlx::PgConnection; use tests::fixtures::*; // In addition to checking whether all the expected types work for keys, make sure to include tests for anything that // is reliant on keys (e.g. stable_sort, alias) #[rstest] fn json_datatype(mut conn: PgConnection) { r#" CREATE TABLE test_table ( id serial8, value json ); INSERT INTO test_table (value) VALUES ('{"currency_code": "USD", "salary": 120000 }'); INSERT INTO test_table (value) VALUES ('{"currency_code": "USD", "salary": 75000 }'); INSERT INTO test_table (value) VALUES ('{"currency_code": "USD", "salary": 140000 }'); "# .execute(&mut conn); // if we don't segfault postgres here, we're good r#" CREATE INDEX test_index ON test_table USING bm25 (id, value) WITH (key_field='id', json_fields='{"value": {"indexed": true, "fast": true}}'); "# .execute(&mut conn); } #[rstest] fn simple_jsonb_string_array_crash(mut conn: PgConnection) { // ensure that we can index top-level json arrays that are strings. // Prior to 82fb7126ce6d2368cf19dd4dc6e28915afc5cf1e (PR #1618, <=v0.9.4) this didn't work r#" CREATE TABLE crash ( id serial8, j jsonb ); INSERT INTO crash (j) SELECT '["one-element-string-array"]' FROM generate_series(1, 10000); CREATE INDEX crash_idx ON crash USING bm25 (id, j) WITH (key_field='id', json_fields='{"j": {"indexed": true, "fast": true}}'); "# .execute(&mut conn); } #[rstest] fn json_date_query_with_date_in_path(mut conn: PgConnection) { r#" CREATE TABLE json_date_collapse_test ( id SERIAL PRIMARY KEY, metadata JSONB ); INSERT INTO json_date_collapse_test (metadata) VALUES ('{"a": {"date": "2023-05-01T09:12:34Z"}}'); CREATE INDEX json_date_collapse_test_idx ON json_date_collapse_test USING bm25 (id, metadata) WITH (key_field = 'id'); "# .execute(&mut conn); let rows: Vec<(i32,)> = r#" SELECT id FROM json_date_collapse_test WHERE id @@@ paradedb.term('metadata.a.date', '2023-05-01T09:12:34Z'::timestamptz) ORDER BY id; "# .fetch_collect(&mut conn); assert_eq!(rows.len(), 1); }