diff --git a/src/common/backend/regex/regprefix.cpp b/src/common/backend/regex/regprefix.cpp index 55d6354ce..4991f3a17 100644 --- a/src/common/backend/regex/regprefix.cpp +++ b/src/common/backend/regex/regprefix.cpp @@ -192,8 +192,10 @@ static int findprefix(struct cnfa* cnfa, struct colormap* cm, chr* string, size_ */ if (cm->cd[thiscolor].nschrs == 1 || thiscolor == 0) { c = cm->cd[thiscolor].firstchr; - } else { + } else if (cm->cmranges != NULL && thiscolor > 0 && thiscolor <= cm->numcmranges) { c = cm->cmranges[thiscolor - 1].cmin; + } else { + break; } if (GETCOLOR(cm, c) != thiscolor) break; diff --git a/src/test/regress/expected/test_regexp.out b/src/test/regress/expected/test_regexp.out new file mode 100644 index 000000000..b8309dc38 --- /dev/null +++ b/src/test/regress/expected/test_regexp.out @@ -0,0 +1,247 @@ +-- create new schema -- +drop schema if exists test_regexp; +NOTICE: schema "test_regexp" does not exist, skipping +create schema test_regexp; +set search_path=test_regexp; +create table t1 +( + f_int1 integer default 0 not null, + f_int2 integer, + f_int3 integer, + f_bigint1 bigint, + f_bigint2 bigint, + f_bigint3 bigint, + f_bool1 bool, + f_bool2 bool, + f_num1 number(38, 0), + f_num2 number(38, 0), + f_dec1 DECIMAL(38, 0), + f_dec2 DECIMAL(38, 0), + f_num10 number(38, 10), + f_dec10 decimal(38, 10), + f_float float, + f_double double precision, + f_real real, + f_char1 char(128), + f_char2 char(128), + f_varchar1 varchar(512), + f_varchar2 varchar2(512), + f_date1 date, + f_date2 date, + f_time date, + f_timestamp timestamp, + f_tp_tz timestamp, + f_tp_ltz timestamp, + f_binary bytea, + f_varbinary bytea, + f_blob blob, + f_clob clob +); +create index idx_1 on t1(f_int1); +delete from t1; +insert into t1(f_int1, f_varchar1) values (1,'1234560'); +insert into t1(f_int1, f_varchar1) values (2,'1234560'); +insert into t1(f_int1, f_varchar1) values (3,'1b3b560'); +insert into t1(f_int1, f_varchar1) values (4,'abc'); +insert into t1(f_int1, f_varchar1) values (5,'abcde'); +insert into t1(f_int1, f_varchar1) values (6,'ADREasx'); +insert into t1(f_int1, f_varchar1) values (7,'123 45'); +insert into t1(f_int1, f_varchar1) values (8,'adc de'); +insert into t1(f_int1, f_varchar1) values (9,'adc,.de'); +insert into t1(f_int1, f_varchar1) values (10,'1B'); +insert into t1(f_int1, f_varchar1) values (11,'abcbvbnb'); +insert into t1(f_int1, f_varchar1) values (12,'11114560'); +insert into t1(f_int1, f_varchar1) values (13,'11124560'); +insert into t1(f_int1, f_varchar1) values(14, 'abc'||chr(10)||'DEF'||chr(10)||'hij'); +insert into t1(f_int1, f_varchar1) values(15, '1abc2abc3abc4abc5abc6abc7abc8abc9abc9abcAabcBabc'); +insert into t1(f_int1, f_varchar1) values(16, '1abc2abc3abc4abc5abc6abc7abc8abc9abcAabcAabcBabc'); +insert into t1(f_int1, f_varchar1) values(17, 'oltp100'); +insert into t1(f_int1, f_varchar1) values(18, 'oltp 100'); +insert into t1(f_int1, f_char1, f_varchar2) values(19,'Fluffy','Fluffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(20,'Buffy','Buffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(21,'fluffy','fluffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(22,'buffy','buffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(23,'桂林山水abc高山流水','桂林山水abc高山流水'); +insert into t1(f_int1, f_char1, f_varchar2) values(24,'aa abc zzzz','aa abc zzzz'); +insert into t1(f_int1, f_char1, f_varchar2) values(25,'我的的的的 abcabcabcabcabcabcabcabcabcabcabcabc','我的的的的 abcabcabcabcabcabcabcabcabcabcabcabc'); +insert into t1(f_int1, f_char1, f_varchar2) values(26,'abcbvbnb +efgh +ijjkkkkkkk','abcbvbnb +efgh +ijjkkkkkkk123'); +insert into t1(f_int1, f_char1, f_varchar2) values(27,'abc efg','hgj khln'); +insert into t1(f_int1, f_char1, f_varchar2) values(28,'abc\efg','hgj(khln'); +insert into t1(f_int1, f_char1, f_varchar2) values(29,'*+?|^${}.','*+?|^${}.'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1....60'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 3 | 1b3b560 + 12 | 11114560 + 13 | 11124560 +(5 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1[0-9]{4}60'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 12 | 11114560 + 13 | 11124560 +(4 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1[[:digit:]]{4}60'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 12 | 11114560 + 13 | 11124560 +(4 rows) + +select f_int1,f_varchar1 from t1 where not regexp_like(f_varchar1,'^[[:digit:]]+$'); + f_int1 | f_varchar1 +--------+-------------------------------------------------- + 3 | 1b3b560 + 4 | abc + 5 | abcde + 6 | ADREasx + 7 | 123 45 + 8 | adc de + 9 | adc,.de + 10 | 1B + 11 | abcbvbnb + 14 | abc + + | DEF + + | hij + 15 | 1abc2abc3abc4abc5abc6abc7abc8abc9abc9abcAabcBabc + 16 | 1abc2abc3abc4abc5abc6abc7abc8abc9abcAabcAabcBabc + 17 | oltp100 + 18 | oltp 100 +(14 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^[^[:digit:]]+$'); + f_int1 | f_varchar1 +--------+------------ + 4 | abc + 5 | abcde + 6 | ADREasx + 8 | adc de + 9 | adc,.de + 11 | abcbvbnb + 14 | abc + + | DEF + + | hij +(7 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2B]'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 7 | 123 45 + 10 | 1B +(4 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'[[:space:]]'); + f_int1 | f_varchar1 +--------+------------ + 7 | 123 45 + 8 | adc de + 14 | abc + + | DEF + + | hij + 18 | oltp 100 +(4 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^([a-z]+|[0-9]+)$'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 4 | abc + 5 | abcde + 11 | abcbvbnb + 12 | 11114560 + 13 | 11124560 +(7 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'[[:punct:]]'); + f_int1 | f_varchar1 +--------+------------ + 9 | adc,.de +(1 row) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^DEF$'); + f_int1 | f_varchar1 +--------+------------ +(0 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2b]','ic'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 3 | 1b3b560 + 7 | 123 45 +(4 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2b]','ci'); + f_int1 | f_varchar1 +--------+------------ + 1 | 1234560 + 2 | 1234560 + 3 | 1b3b560 + 7 | 123 45 + 10 | 1B +(5 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'a'); + f_int1 | f_varchar1 +--------+-------------------------------------------------- + 4 | abc + 5 | abcde + 6 | ADREasx + 8 | adc de + 9 | adc,.de + 11 | abcbvbnb + 14 | abc + + | DEF + + | hij + 15 | 1abc2abc3abc4abc5abc6abc7abc8abc9abc9abcAabcBabc + 16 | 1abc2abc3abc4abc5abc6abc7abc8abc9abcAabcAabcBabc +(9 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'(1abc)(2abc)(3abc)(4abc)(5abc)(6abc)(7abc)(8abc)(9abc)\9(Aabc)(Babc)'); + f_int1 | f_varchar1 +--------+-------------------------------------------------- + 15 | 1abc2abc3abc4abc5abc6abc7abc8abc9abc9abcAabcBabc +(1 row) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'(1abc)(2abc)(3abc)(4abc)(5abc)(6abc)(7abc)(8abc)(9abc)(Aabc)\a(Babc)'); + f_int1 | f_varchar1 +--------+------------ +(0 rows) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'oltp 100'); + f_int1 | f_varchar1 +--------+------------ + 18 | oltp 100 +(1 row) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'oltp100'); + f_int1 | f_varchar1 +--------+------------ + 17 | oltp100 +(1 row) + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'ffy*') order by 1; + f_int1 | f_varchar1 +--------+------------ +(0 rows) + +-- clean +drop index idx_1; +drop table t1; +drop schema if exists test_regexp cascade; diff --git a/src/test/regress/parallel_schedule0A b/src/test/regress/parallel_schedule0A index ea68f5f4e..13a91f0bc 100644 --- a/src/test/regress/parallel_schedule0A +++ b/src/test/regress/parallel_schedule0A @@ -161,7 +161,7 @@ test: single_node_inet single_node_macaddr single_node_tstypes single_node_comme # ---------- #test: single_node_geometry single_node_horology #test: single_node_regex -test: single_node_regex_temp +test: single_node_regex_temp test_regexp test: single_node_oidjoins single_node_type_sanity # ---------- diff --git a/src/test/regress/sql/test_regexp.sql b/src/test/regress/sql/test_regexp.sql new file mode 100644 index 000000000..80c50afec --- /dev/null +++ b/src/test/regress/sql/test_regexp.sql @@ -0,0 +1,105 @@ +-- create new schema -- +drop schema if exists test_regexp; +create schema test_regexp; +set search_path=test_regexp; + + +create table t1 +( + f_int1 integer default 0 not null, + f_int2 integer, + f_int3 integer, + f_bigint1 bigint, + f_bigint2 bigint, + f_bigint3 bigint, + f_bool1 bool, + f_bool2 bool, + f_num1 number(38, 0), + f_num2 number(38, 0), + f_dec1 DECIMAL(38, 0), + f_dec2 DECIMAL(38, 0), + f_num10 number(38, 10), + f_dec10 decimal(38, 10), + f_float float, + f_double double precision, + f_real real, + f_char1 char(128), + f_char2 char(128), + f_varchar1 varchar(512), + f_varchar2 varchar2(512), + f_date1 date, + f_date2 date, + f_time date, + f_timestamp timestamp, + f_tp_tz timestamp, + f_tp_ltz timestamp, + f_binary bytea, + f_varbinary bytea, + f_blob blob, + f_clob clob +); + +create index idx_1 on t1(f_int1); + +delete from t1; +insert into t1(f_int1, f_varchar1) values (1,'1234560'); +insert into t1(f_int1, f_varchar1) values (2,'1234560'); +insert into t1(f_int1, f_varchar1) values (3,'1b3b560'); +insert into t1(f_int1, f_varchar1) values (4,'abc'); +insert into t1(f_int1, f_varchar1) values (5,'abcde'); +insert into t1(f_int1, f_varchar1) values (6,'ADREasx'); +insert into t1(f_int1, f_varchar1) values (7,'123 45'); +insert into t1(f_int1, f_varchar1) values (8,'adc de'); +insert into t1(f_int1, f_varchar1) values (9,'adc,.de'); +insert into t1(f_int1, f_varchar1) values (10,'1B'); +insert into t1(f_int1, f_varchar1) values (11,'abcbvbnb'); +insert into t1(f_int1, f_varchar1) values (12,'11114560'); +insert into t1(f_int1, f_varchar1) values (13,'11124560'); +insert into t1(f_int1, f_varchar1) values(14, 'abc'||chr(10)||'DEF'||chr(10)||'hij'); +insert into t1(f_int1, f_varchar1) values(15, '1abc2abc3abc4abc5abc6abc7abc8abc9abc9abcAabcBabc'); +insert into t1(f_int1, f_varchar1) values(16, '1abc2abc3abc4abc5abc6abc7abc8abc9abcAabcAabcBabc'); +insert into t1(f_int1, f_varchar1) values(17, 'oltp100'); +insert into t1(f_int1, f_varchar1) values(18, 'oltp 100'); +insert into t1(f_int1, f_char1, f_varchar2) values(19,'Fluffy','Fluffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(20,'Buffy','Buffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(21,'fluffy','fluffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(22,'buffy','buffy'); +insert into t1(f_int1, f_char1, f_varchar2) values(23,'桂林山水abc高山流水','桂林山水abc高山流水'); +insert into t1(f_int1, f_char1, f_varchar2) values(24,'aa abc zzzz','aa abc zzzz'); +insert into t1(f_int1, f_char1, f_varchar2) values(25,'我的的的的 abcabcabcabcabcabcabcabcabcabcabcabc','我的的的的 abcabcabcabcabcabcabcabcabcabcabcabc'); +insert into t1(f_int1, f_char1, f_varchar2) values(26,'abcbvbnb +efgh +ijjkkkkkkk','abcbvbnb +efgh +ijjkkkkkkk123'); +insert into t1(f_int1, f_char1, f_varchar2) values(27,'abc efg','hgj khln'); +insert into t1(f_int1, f_char1, f_varchar2) values(28,'abc\efg','hgj(khln'); +insert into t1(f_int1, f_char1, f_varchar2) values(29,'*+?|^${}.','*+?|^${}.'); + + + +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1....60'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1[0-9]{4}60'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'1[[:digit:]]{4}60'); +select f_int1,f_varchar1 from t1 where not regexp_like(f_varchar1,'^[[:digit:]]+$'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^[^[:digit:]]+$'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2B]'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'[[:space:]]'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^([a-z]+|[0-9]+)$'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'[[:punct:]]'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^DEF$'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2b]','ic'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'^1[2b]','ci'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'a'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'(1abc)(2abc)(3abc)(4abc)(5abc)(6abc)(7abc)(8abc)(9abc)\9(Aabc)(Babc)'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'(1abc)(2abc)(3abc)(4abc)(5abc)(6abc)(7abc)(8abc)(9abc)(Aabc)\a(Babc)'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'oltp 100'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'oltp100'); +select f_int1,f_varchar1 from t1 where regexp_like(f_varchar1,'ffy*') order by 1; + +-- clean +drop index idx_1; +drop table t1; + +drop schema if exists test_regexp cascade; +