| 1 | #include "catch.hpp" |
| 2 | #include "test_helpers.hpp" |
| 3 | |
| 4 | using namespace duckdb; |
| 5 | using namespace std; |
| 6 | |
| 7 | TEST_CASE("regex search test" , "[regex]" ) { |
| 8 | unique_ptr<QueryResult> result; |
| 9 | DuckDB db(nullptr); |
| 10 | Connection con(db); |
| 11 | con.EnableQueryVerification(); |
| 12 | |
| 13 | // constant strings |
| 14 | result = con.Query("SELECT regexp_matches('asdf', '.*sd.*')" ); |
| 15 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 16 | |
| 17 | result = con.Query("SELECT regexp_matches('asdf', '.*yu.*')" ); |
| 18 | REQUIRE(CHECK_COLUMN(result, 0, {false})); |
| 19 | |
| 20 | result = con.Query("SELECT regexp_matches('asdf', '')" ); |
| 21 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 22 | |
| 23 | // partial matches okay |
| 24 | result = con.Query("SELECT regexp_matches('asdf', 'sd')" ); |
| 25 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 26 | // full match requires entire match |
| 27 | result = con.Query("SELECT regexp_full_match('asdf', 'sd')" ); |
| 28 | REQUIRE(CHECK_COLUMN(result, 0, {false})); |
| 29 | result = con.Query("SELECT regexp_full_match('asdf', '.sd.')" ); |
| 30 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 31 | |
| 32 | result = con.Query("SELECT regexp_matches('asdf', '^sdf$')" ); |
| 33 | REQUIRE(CHECK_COLUMN(result, 0, {false})); |
| 34 | |
| 35 | // empty strings |
| 36 | result = con.Query("SELECT regexp_matches('', '.*yu.*')" ); |
| 37 | REQUIRE(CHECK_COLUMN(result, 0, {false})); |
| 38 | |
| 39 | result = con.Query("SELECT regexp_matches('', '.*')" ); |
| 40 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 41 | |
| 42 | // NULLs |
| 43 | result = con.Query("SELECT regexp_matches('asdf', CAST(NULL AS STRING))" ); |
| 44 | REQUIRE(CHECK_COLUMN(result, 0, {Value()})); |
| 45 | |
| 46 | result = con.Query("SELECT regexp_matches(CAST(NULL AS STRING), '.*sd.*')" ); |
| 47 | REQUIRE(CHECK_COLUMN(result, 0, {Value()})); |
| 48 | |
| 49 | result = con.Query("SELECT regexp_matches(CAST(NULL AS STRING), CAST(NULL AS STRING))" ); |
| 50 | REQUIRE(CHECK_COLUMN(result, 0, {Value()})); |
| 51 | |
| 52 | result = con.Query("SELECT regexp_matches('foobarbequebaz', '(bar)(beque)')" ); |
| 53 | REQUIRE(CHECK_COLUMN(result, 0, {true})); |
| 54 | |
| 55 | // postgres says throw error on invalid regex |
| 56 | REQUIRE_FAIL(con.Query("SELECT regexp_matches('', '\\X')" )); |
| 57 | |
| 58 | REQUIRE_NO_FAIL(con.Query("CREATE TABLE regex(s STRING, p STRING)" )); |
| 59 | REQUIRE_NO_FAIL( |
| 60 | con.Query("INSERT INTO regex VALUES ('asdf', 'sd'), ('asdf', '^sd'), (NULL, '^sd'), ('asdf', NULL)" )); |
| 61 | result = con.Query("SELECT regexp_matches(s, '.*') FROM regex" ); |
| 62 | REQUIRE(CHECK_COLUMN(result, 0, {true, true, Value(), true})); |
| 63 | |
| 64 | result = con.Query("SELECT regexp_matches(s, p) FROM regex" ); |
| 65 | REQUIRE(CHECK_COLUMN(result, 0, {true, false, Value(), Value()})); |
| 66 | } |
| 67 | |
| 68 | TEST_CASE("regex filter push test" , "[regex]" ) { |
| 69 | unique_ptr<QueryResult> result; |
| 70 | DuckDB db(nullptr); |
| 71 | Connection con(db); |
| 72 | con.EnableQueryVerification(); |
| 73 | |
| 74 | REQUIRE_NO_FAIL(con.Query("CREATE TABLE regex(s STRING)" )); |
| 75 | REQUIRE_NO_FAIL(con.Query("INSERT INTO regex VALUES ('asdf'), ('xxxx'), ('aaaa')" )); |
| 76 | |
| 77 | result = con.Query("SELECT s FROM regex WHERE REGEXP_MATCHES(s, 'as(c|d|e)f')" ); |
| 78 | REQUIRE(CHECK_COLUMN(result, 0, {"asdf" })); |
| 79 | |
| 80 | result = con.Query("SELECT s FROM regex WHERE NOT REGEXP_MATCHES(s, 'as(c|d|e)f')" ); |
| 81 | REQUIRE(CHECK_COLUMN(result, 0, {"xxxx" , "aaaa" })); |
| 82 | |
| 83 | result = con.Query("SELECT s FROM regex WHERE REGEXP_MATCHES(s, 'as(c|d|e)f') AND s = 'asdf'" ); |
| 84 | REQUIRE(CHECK_COLUMN(result, 0, {"asdf" })); |
| 85 | |
| 86 | result = con.Query("SELECT s FROM regex WHERE REGEXP_MATCHES(s, 'as(c|d|e)f') AND REGEXP_MATCHES(s, 'as[a-z]f')" ); |
| 87 | REQUIRE(CHECK_COLUMN(result, 0, {"asdf" })); |
| 88 | } |
| 89 | |
| 90 | TEST_CASE("regex replace test" , "[regex]" ) { |
| 91 | unique_ptr<QueryResult> result; |
| 92 | DuckDB db(nullptr); |
| 93 | Connection con(db); |
| 94 | con.EnableQueryVerification(); |
| 95 | |
| 96 | result = con.Query("SELECT regexp_replace('foobarbaz', 'b..', 'X')" ); |
| 97 | REQUIRE(CHECK_COLUMN(result, 0, {"fooXbaz" })); |
| 98 | } |
| 99 | |