|
| 1 | +SELECT EXISTS(SELECT 1 FROM pg_available_extensions WHERE name = 're2') AS have_re2 \gset |
| 2 | +\if :have_re2 |
| 3 | +CREATE SERVER re2_svr FOREIGN DATA WRAPPER clickhouse_fdw OPTIONS(dbname 're2_test'); |
| 4 | +CREATE USER MAPPING FOR CURRENT_USER SERVER re2_svr; |
| 5 | +SELECT clickhouse_raw_query('DROP DATABASE IF EXISTS re2_test'); |
| 6 | + clickhouse_raw_query |
| 7 | +---------------------- |
| 8 | + |
| 9 | +(1 row) |
| 10 | + |
| 11 | +SELECT clickhouse_raw_query('CREATE DATABASE re2_test'); |
| 12 | + clickhouse_raw_query |
| 13 | +---------------------- |
| 14 | + |
| 15 | +(1 row) |
| 16 | + |
| 17 | +SELECT clickhouse_raw_query($$ |
| 18 | + CREATE TABLE re2_test.t1 ( |
| 19 | + id Int32, |
| 20 | + val String |
| 21 | + ) ENGINE = MergeTree ORDER BY id |
| 22 | +$$); |
| 23 | + clickhouse_raw_query |
| 24 | +---------------------- |
| 25 | + |
| 26 | +(1 row) |
| 27 | + |
| 28 | +SELECT clickhouse_raw_query($$ |
| 29 | + INSERT INTO re2_test.t1 VALUES |
| 30 | + (1, 'POSIX uses BRE and ERE'), |
| 31 | + (2, 're2 uses finite automata'), |
| 32 | + (3, 'PCRE supports backtracking') |
| 33 | +$$); |
| 34 | + clickhouse_raw_query |
| 35 | +---------------------- |
| 36 | + |
| 37 | +(1 row) |
| 38 | + |
| 39 | +CREATE SCHEMA re2_test; |
| 40 | +IMPORT FOREIGN SCHEMA re2_test FROM SERVER re2_svr INTO re2_test; |
| 41 | +SET search_path = re2_test, public; |
| 42 | +CREATE EXTENSION re2; |
| 43 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2match(val, 're2'); |
| 44 | + QUERY PLAN |
| 45 | +------------------------------------------------------------------------- |
| 46 | + Foreign Scan on re2_test.t1 |
| 47 | + Output: id, val |
| 48 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE (match(val, 're2')) |
| 49 | +(3 rows) |
| 50 | + |
| 51 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2extract(val, '(re2)') = 're2'; |
| 52 | + QUERY PLAN |
| 53 | +--------------------------------------------------------------------------------------- |
| 54 | + Foreign Scan on re2_test.t1 |
| 55 | + Output: id, val |
| 56 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((extract(val, '(re2)') = 're2')) |
| 57 | +(3 rows) |
| 58 | + |
| 59 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2extractall(val, '[A-Z]+') = ARRAY['POSIX','BRE','ERE']; |
| 60 | + QUERY PLAN |
| 61 | +----------------------------------------------------------------------------------------------------------- |
| 62 | + Foreign Scan on re2_test.t1 |
| 63 | + Output: id, val |
| 64 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((extractAll(val, '[A-Z]+') = ['POSIX','BRE','ERE'])) |
| 65 | +(3 rows) |
| 66 | + |
| 67 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2regexpextract(val, '(re2)', 1) = 're2'; |
| 68 | + QUERY PLAN |
| 69 | +------------------------------------------------------------------------------------------------ |
| 70 | + Foreign Scan on re2_test.t1 |
| 71 | + Output: id, val |
| 72 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((regexpExtract(val, '(re2)', 1) = 're2')) |
| 73 | +(3 rows) |
| 74 | + |
| 75 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2extractgroups(val, '(POSIX) uses (BRE)') = ARRAY['POSIX','BRE']; |
| 76 | + QUERY PLAN |
| 77 | +-------------------------------------------------------------------------------------------------------------------- |
| 78 | + Foreign Scan on re2_test.t1 |
| 79 | + Output: id, val |
| 80 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((extractGroups(val, '(POSIX) uses (BRE)') = ['POSIX','BRE'])) |
| 81 | +(3 rows) |
| 82 | + |
| 83 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2replaceregexpone(val, 'POSIX', 're2') = 're2 uses BRE and ERE'; |
| 84 | + QUERY PLAN |
| 85 | +------------------------------------------------------------------------------------------------------------------------ |
| 86 | + Foreign Scan on re2_test.t1 |
| 87 | + Output: id, val |
| 88 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((replaceRegexpOne(val, 'POSIX', 're2') = 're2 uses BRE and ERE')) |
| 89 | +(3 rows) |
| 90 | + |
| 91 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2replaceregexpall(val, ' ', '-') = 're2-uses-finite-automata'; |
| 92 | + QUERY PLAN |
| 93 | +---------------------------------------------------------------------------------------------------------------------- |
| 94 | + Foreign Scan on re2_test.t1 |
| 95 | + Output: id, val |
| 96 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((replaceRegexpAll(val, ' ', '-') = 're2-uses-finite-automata')) |
| 97 | +(3 rows) |
| 98 | + |
| 99 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2countmatches(val, 'e') > 0; |
| 100 | + QUERY PLAN |
| 101 | +------------------------------------------------------------------------------------ |
| 102 | + Foreign Scan on re2_test.t1 |
| 103 | + Output: id, val |
| 104 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((countMatches(val, 'e') > 0)) |
| 105 | +(3 rows) |
| 106 | + |
| 107 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2countmatchescaseinsensitive(val, 'E') > 0; |
| 108 | + QUERY PLAN |
| 109 | +--------------------------------------------------------------------------------------------------- |
| 110 | + Foreign Scan on re2_test.t1 |
| 111 | + Output: id, val |
| 112 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((countMatchesCaseInsensitive(val, 'E') > 0)) |
| 113 | +(3 rows) |
| 114 | + |
| 115 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2multimatchany(val, ARRAY['POSIX','PCRE']); |
| 116 | + QUERY PLAN |
| 117 | +-------------------------------------------------------------------------------------------- |
| 118 | + Foreign Scan on re2_test.t1 |
| 119 | + Output: id, val |
| 120 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE (multiMatchAny(val, ['POSIX','PCRE'])) |
| 121 | +(3 rows) |
| 122 | + |
| 123 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2multimatchanyindex(val, ARRAY['POSIX','PCRE']) > 0; |
| 124 | + QUERY PLAN |
| 125 | +------------------------------------------------------------------------------------------------------- |
| 126 | + Foreign Scan on re2_test.t1 |
| 127 | + Output: id, val |
| 128 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((multiMatchAnyIndex(val, ['POSIX','PCRE']) > 0)) |
| 129 | +(3 rows) |
| 130 | + |
| 131 | +EXPLAIN (VERBOSE, COSTS OFF) SELECT * FROM t1 WHERE re2multimatchallindices(val, ARRAY['POSIX','PCRE']) = ARRAY[1]; |
| 132 | + QUERY PLAN |
| 133 | +----------------------------------------------------------------------------------------------------------- |
| 134 | + Foreign Scan on re2_test.t1 |
| 135 | + Output: id, val |
| 136 | + Remote SQL: SELECT id, val FROM re2_test.t1 WHERE ((multiMatchAllIndices(val, ['POSIX','PCRE']) = [1])) |
| 137 | +(3 rows) |
| 138 | + |
| 139 | +DROP EXTENSION re2; |
| 140 | +DROP USER MAPPING FOR CURRENT_USER SERVER re2_svr; |
| 141 | +SELECT clickhouse_raw_query('DROP DATABASE re2_test'); |
| 142 | + clickhouse_raw_query |
| 143 | +---------------------- |
| 144 | + |
| 145 | +(1 row) |
| 146 | + |
| 147 | +DROP SERVER re2_svr CASCADE; |
| 148 | +NOTICE: drop cascades to foreign table t1 |
| 149 | +\else |
| 150 | +\echo 'SKIP: re2 extension not available' |
| 151 | +\endif |
0 commit comments