diff --git a/src/common/backend/utils/adt/ruleutils.cpp b/src/common/backend/utils/adt/ruleutils.cpp index d7d5781c4..6262f3d38 100644 --- a/src/common/backend/utils/adt/ruleutils.cpp +++ b/src/common/backend/utils/adt/ruleutils.cpp @@ -3806,7 +3806,7 @@ static text* pg_get_expr_worker(text* expr, Oid relid, const char* relname, int exprstr = text_to_cstring(expr); /* Convert expression to node tree */ - node = (Node*)stringToNode(exprstr); + node = (Node*)stringToNode_skip_extern_fields(exprstr); pfree_ext(exprstr); diff --git a/src/common/backend/utils/adt/varchar.cpp b/src/common/backend/utils/adt/varchar.cpp index 998602bd6..454f3d129 100644 --- a/src/common/backend/utils/adt/varchar.cpp +++ b/src/common/backend/utils/adt/varchar.cpp @@ -675,7 +675,7 @@ Datum bpcharlen(PG_FUNCTION_ARGS) int len; /* get number of bytes, ignoring trailing spaces */ - if (DB_IS_CMPT(PG_FORMAT)) { + if (DB_IS_CMPT(PG_FORMAT | B_FORMAT)) { len = bcTruelen(arg); } else { len = VARSIZE_ANY_EXHDR(arg); diff --git a/src/common/backend/utils/mb/mbutils.cpp b/src/common/backend/utils/mb/mbutils.cpp index c204fd0d1..eb33fa772 100644 --- a/src/common/backend/utils/mb/mbutils.cpp +++ b/src/common/backend/utils/mb/mbutils.cpp @@ -921,8 +921,8 @@ template int MbCharClipLen(const char* mbstr, int len, int l */ int pg_mbcharcliplen(const char* mbstr, int len, int limit) { - bool pgFormat = DB_IS_CMPT(PG_FORMAT); - if (pgFormat) { + bool calCharLength = DB_IS_CMPT(PG_FORMAT | B_FORMAT); + if (calCharLength) { return MbCharClipLen(mbstr, len, limit); } else { return MbCharClipLen(mbstr, len, limit); diff --git a/src/test/regress/expected/b_compatibility.out b/src/test/regress/expected/b_compatibility.out index a8cafb595..55d919743 100644 --- a/src/test/regress/expected/b_compatibility.out +++ b/src/test/regress/expected/b_compatibility.out @@ -269,9 +269,9 @@ select cast('s' as int); --------------- limit #,#------------------- -- limit case in postgresql \c regression -create table test(a int); -insert into test values (1),(2),(3),(4),(5); -select * from test order by 1 limit 2,3; +create table test_limit(a int); +insert into test_limit values (1),(2),(3),(4),(5); +select * from test_limit order by 1 limit 2,3; a --- 3 @@ -279,7 +279,7 @@ select * from test order by 1 limit 2,3; 5 (3 rows) -select * from test order by 1 limit 2,6; +select * from test_limit order by 1 limit 2,6; a --- 3 @@ -287,17 +287,17 @@ select * from test order by 1 limit 2,6; 5 (3 rows) -select * from test order by 1 limit 6,2; +select * from test_limit order by 1 limit 6,2; a --- (0 rows) -drop table test; +drop table test_limit; -- limit case in b \c b -create table test(a int); -insert into test values (1),(2),(3),(4),(5); -select * from test order by 1 limit 2,3; +create table test_limit(a int); +insert into test_limit values (1),(2),(3),(4),(5); +select * from test_limit order by 1 limit 2,3; a --- 3 @@ -305,7 +305,7 @@ select * from test order by 1 limit 2,3; 5 (3 rows) -select * from test order by 1 limit 2,6; +select * from test_limit order by 1 limit 2,6; a --- 3 @@ -313,12 +313,12 @@ select * from test order by 1 limit 2,6; 5 (3 rows) -select * from test order by 1 limit 6,2; +select * from test_limit order by 1 limit 6,2; a --- (0 rows) -drop table test; +drop table test_limit; --------------timestampdiff----------------- -- timestamp with time zone -- timestamp1 > timestamp2 @@ -634,8 +634,8 @@ select timestampdiff(second, '2018-01-01', now()); (1 row) select timestampdiff(microsecond, '2018-01-01', now()); - timestamp_diff ----------------- + timestamp_diff +----------------- --?.* (1 row) @@ -731,5 +731,79 @@ select timestampdiff(microsecond, '2018-01-01 01:01:01.000001', b) from timestam (1 row) drop table timestamp; +-- test char/varchar length +create table char_test(a char(10),b varchar(10)); +insert into char_test values('零一二三四五六七八九','零一二三四五六七八九'); +insert into char_test values('零1二3四5六7八9','零1二3四5六7八9'); +insert into char_test values('零1二3四5六7八9','零1二3四5六7八90'); +ERROR: value too long for type character varying(10) +CONTEXT: referenced column: b +insert into char_test values('零1二3四5六7八90','零1二3四5六7八9'); +ERROR: value too long for type character(10) +CONTEXT: referenced column: a +insert into char_test values('零0','零1二3'); +insert into char_test values('零0 ','零1二3'); +insert into char_test values('零0','零1二3 '); +insert into char_test values('',''); +insert into char_test values(null,null); +insert into char_test values('0','0'); +select length(a),length(b) from char_test; + length | length +--------+-------- + 10 | 10 + 10 | 10 + 2 | 4 + 2 | 4 + 2 | 6 + 0 | 0 + | + 1 | 1 +(8 rows) + +select lengthb(a),lengthb(b) from char_test; + lengthb | lengthb +---------+--------- + 30 | 30 + 20 | 20 + 10 | 8 + 10 | 8 + 10 | 10 + 10 | 0 + | + 10 | 1 +(8 rows) + +select bit_length(a),bit_length(b) from char_test; + bit_length | bit_length +------------+------------ + 240 | 240 + 160 | 160 + 32 | 64 + 32 | 64 + 32 | 80 + 0 | 0 + | + 8 | 8 +(8 rows) + +create index a on char_test(a); +create index b on char_test(b); +set enable_seqscan to off; +select * from char_test where a = '零0'; + a | b +-----------+---------- + 零0 | 零1二3 + 零0 | 零1二3 + 零0 | 零1二3 +(3 rows) + +select * from char_test where b = '零1二3'; + a | b +-----------+-------- + 零0 | 零1二3 + 零0 | 零1二3 +(2 rows) + +drop table char_test; \c regression drop database b; diff --git a/src/test/regress/expected/create_schema.out b/src/test/regress/expected/create_schema.out index c6bb2acce..2bb81aa76 100644 --- a/src/test/regress/expected/create_schema.out +++ b/src/test/regress/expected/create_schema.out @@ -1,9 +1,34 @@ create role samedb_schema_cn_role_02_001 password 'Ttest_234'; create schema authorization samedb_schema_cn_role_02_001 -create table samedb_schema_cn_role_02_001.cn_table_00 (cn_a int, cn_b text , cn_c date ,cn_d interval) +create table samedb_schema_cn_role_02_001.cn_table_00 (cn_a int, cn_b text , cn_c date ,cn_d interval, cn_e serial) create view cn_view_00 as select cn_b,cn_d, cn_c from cn_table_00; +NOTICE: CREATE TABLE will create implicit sequence "cn_table_00_cn_e_seq" for serial column "cn_table_00.cn_e" +\d+ samedb_schema_cn_role_02_001.cn_table_00 + Table "samedb_schema_cn_role_02_001.cn_table_00" + Column | Type | Modifiers | Storage | Stats target | Description +--------+--------------------------------+-----------------------------------------------------------------------------------------+----------+--------------+------------- + cn_a | integer | | plain | | + cn_b | text | | extended | | + cn_c | timestamp(0) without time zone | | plain | | + cn_d | interval | | plain | | + cn_e | integer | not null default nextval('samedb_schema_cn_role_02_001.cn_table_00_cn_e_seq'::regclass) | plain | | +Has OIDs: no +Options: orientation=row, compression=no + alter schema samedb_schema_cn_role_02_001 rename to samedb_schema_cn_role_02_001_bak; +\d+ samedb_schema_cn_role_02_001_bak.cn_table_00 + Table "samedb_schema_cn_role_02_001_bak.cn_table_00" + Column | Type | Modifiers | Storage | Stats target | Description +--------+--------------------------------+---------------------------------------------------------------------------------------------+----------+--------------+------------- + cn_a | integer | | plain | | + cn_b | text | | extended | | + cn_c | timestamp(0) without time zone | | plain | | + cn_d | interval | | plain | | + cn_e | integer | not null default nextval('samedb_schema_cn_role_02_001_bak.cn_table_00_cn_e_seq'::regclass) | plain | | +Has OIDs: no +Options: orientation=row, compression=no + alter view samedb_schema_cn_role_02_001_bak.cn_view_00 rename to cn_view_00_bak; drop view samedb_schema_cn_role_02_001_bak.cn_view_00_bak; drop table samedb_schema_cn_role_02_001_bak.cn_table_00; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 7f940e646..742884654 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -749,7 +749,7 @@ test: copy2 temp test: truncate #test: temp_table -#test: b_compatibility +test: b_compatibility test: hw_compatibility test: hw_groupingsets hw_row_grouping_set test: char_truncation_common char_truncation_cast diff --git a/src/test/regress/sql/b_compatibility.sql b/src/test/regress/sql/b_compatibility.sql index a43d99cc4..c394c3dd0 100644 --- a/src/test/regress/sql/b_compatibility.sql +++ b/src/test/regress/sql/b_compatibility.sql @@ -82,21 +82,21 @@ select cast('s' as int); --------------- limit #,#------------------- -- limit case in postgresql \c regression -create table test(a int); -insert into test values (1),(2),(3),(4),(5); -select * from test order by 1 limit 2,3; -select * from test order by 1 limit 2,6; -select * from test order by 1 limit 6,2; -drop table test; +create table test_limit(a int); +insert into test_limit values (1),(2),(3),(4),(5); +select * from test_limit order by 1 limit 2,3; +select * from test_limit order by 1 limit 2,6; +select * from test_limit order by 1 limit 6,2; +drop table test_limit; -- limit case in b \c b -create table test(a int); -insert into test values (1),(2),(3),(4),(5); -select * from test order by 1 limit 2,3; -select * from test order by 1 limit 2,6; -select * from test order by 1 limit 6,2; -drop table test; +create table test_limit(a int); +insert into test_limit values (1),(2),(3),(4),(5); +select * from test_limit order by 1 limit 2,3; +select * from test_limit order by 1 limit 2,6; +select * from test_limit order by 1 limit 6,2; +drop table test_limit; --------------timestampdiff----------------- -- timestamp with time zone @@ -189,6 +189,29 @@ select timestampdiff(second, '2018-01-01 01:01:01.000001', b) from timestamp; select timestampdiff(microsecond, '2018-01-01 01:01:01.000001', b) from timestamp; drop table timestamp; +-- test char/varchar length +create table char_test(a char(10),b varchar(10)); +insert into char_test values('零一二三四五六七八九','零一二三四五六七八九'); +insert into char_test values('零1二3四5六7八9','零1二3四5六7八9'); +insert into char_test values('零1二3四5六7八9','零1二3四5六7八90'); +insert into char_test values('零1二3四5六7八90','零1二3四5六7八9'); +insert into char_test values('零0','零1二3'); +insert into char_test values('零0 ','零1二3'); +insert into char_test values('零0','零1二3 '); +insert into char_test values('',''); +insert into char_test values(null,null); +insert into char_test values('0','0'); +select length(a),length(b) from char_test; +select lengthb(a),lengthb(b) from char_test; +select bit_length(a),bit_length(b) from char_test; + +create index a on char_test(a); +create index b on char_test(b); +set enable_seqscan to off; +select * from char_test where a = '零0'; +select * from char_test where b = '零1二3'; +drop table char_test; + \c regression drop database b; diff --git a/src/test/regress/sql/create_schema.sql b/src/test/regress/sql/create_schema.sql index 7b22d8011..6c41d0c44 100644 --- a/src/test/regress/sql/create_schema.sql +++ b/src/test/regress/sql/create_schema.sql @@ -1,12 +1,16 @@ create role samedb_schema_cn_role_02_001 password 'Ttest_234'; create schema authorization samedb_schema_cn_role_02_001 -create table samedb_schema_cn_role_02_001.cn_table_00 (cn_a int, cn_b text , cn_c date ,cn_d interval) +create table samedb_schema_cn_role_02_001.cn_table_00 (cn_a int, cn_b text , cn_c date ,cn_d interval, cn_e serial) create view cn_view_00 as select cn_b,cn_d, cn_c from cn_table_00; +\d+ samedb_schema_cn_role_02_001.cn_table_00 + alter schema samedb_schema_cn_role_02_001 rename to samedb_schema_cn_role_02_001_bak; +\d+ samedb_schema_cn_role_02_001_bak.cn_table_00 + alter view samedb_schema_cn_role_02_001_bak.cn_view_00 rename to cn_view_00_bak; drop view samedb_schema_cn_role_02_001_bak.cn_view_00_bak;