Skip to content

gstat truncates name of index if a table belongs to schema, DB charset = utf8 and schema, table and index lengths are close to max allowed (56 + 63 + 63) characters #8789

@pavel-zotov

Description

@pavel-zotov

Unfortunately, we have one more problem with gstat output when use non-ascii names for created DB objects.
This occurs when all three conditions are met:

  • custom schemas are created and tables are specified as belonged to these schemas;
  • all names have approx. max allowed length (56 characters for schema and 63 for tables and 63 for indices);
  • DB objects have character = UTF-8 and 3 or 4 bytes per character required for encoding in appropriate unicode range.

In that case gstat -r can not display full name of indices (maybe because total number of bytes for <schema>.<table>.<index> representation become close to 255 bytes ?).
What's worse is that it is NOT the last Unicode that is 'cutted off'.
Rather some part of it remains in the string, thus it can not be correctly decoded / displayed (see screens below).

Following example illustrates this (3 bytes per character are required for euro sign and for any letter from Georgian alphabet; 4 bytes per character needs to display musician sign 'treble clef' ( 𝄞 )and any of Dominoes (e.g. 🂉).

This is script for Linux:

set bail on;
set blob all;
set list on;
set names utf8;
shell rm -f /var/tmp/tmp4test.fdb;
create database 'localhost:/var/tmp/tmp4test.fdb' user 'sysdba' password 'masterkey' default character set utf8;

-- 2 bytes per char:
create schema "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ";

-- 2 bytes per char:
create schema "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр";

-- 3 bytes per char:
create schema "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€";
 
-- 3 bytes per char:
create schema "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ";
commit;

-- 4 bytes per char:
create schema "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞";

-- 4 bytes per char:
create schema "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉";
commit;

set count on;
select
	'>' || trim(rdb$schema_name) || '<' as sch_name
	,char_length(trim(rdb$schema_name)) as char_len
	,octet_length(trim(rdb$schema_name)) as octet_len
from rdb$schemas
where rdb$schema_name not in ('SYSTEM', 'PUBLIC')
;
set count off;

-- tables with schemas:
set term ^;
execute block as
    declare v_sn varchar(8190) character set utf8;
begin
    for
	    execute statement
	    q'#select trim(rdb$schema_name) sn from rdb$schemas where rdb$system_flag=0 and rdb$schema_name<>'PUBLIC'#'
	    into v_sn
	do begin
	    execute statement 'create table "' || v_sn || '_pub"(id int primary key using index "' || v_sn || '_asc")';
	    execute statement 'create table "' || v_sn || '"."' || v_sn || '_sch"(id int primary key using descending index "' || v_sn || '_dec")';
	end	
end
^
set term ;^
commit;

set echo on;
show schema;
show table;
show index;
quit;
NOTE. We create 6 schemas but number of created tables is 2*6 = **12**: first table (from each pair) is created in the schema PUBLIC and second in the "long-named' custom schema.
Tables within PUBLIC schema have suffix ```_pub``` and PK which index name has suffix ```_asc```.
Tables within 'long-named' schemas have suffix ```_sch``` and PK based on descending index with suffix ```_dec```.

Output of this script will be following:

ISQL Version: LI-T6.0.0.1313 Firebird 6.0 7e32c33
Server version:
LI-T6.0.0.1313 Firebird 6.0 7e32c33
LI-T6.0.0.1313 Firebird 6.0 7e32c33/tcp (deb10build1)/P20:C
LI-T6.0.0.1313 Firebird 6.0 7e32c33/tcp (deb10build1)/P20:C

SCH_NAME                        >έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ<
CHAR_LEN                        56
OCTET_LEN                       112

SCH_NAME                        >МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр<
CHAR_LEN                        56
OCTET_LEN                       112

SCH_NAME                        >€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€<
CHAR_LEN                        56
OCTET_LEN                       168

SCH_NAME                        >ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ<
CHAR_LEN                        56
OCTET_LEN                       168

SCH_NAME                        >𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞<
CHAR_LEN                        56
OCTET_LEN                       224

SCH_NAME                        >🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉<
CHAR_LEN                        56
OCTET_LEN                       224

Records affected: 6
show schema;
PUBLIC
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"

show table;
PUBLIC."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_pub"
PUBLIC."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_pub"
PUBLIC."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_pub"
PUBLIC."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_pub"
PUBLIC."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_pub"
PUBLIC."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_pub"
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_sch"
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_sch"
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_sch"
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_sch"
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_sch"
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_sch"

show index;
PUBLIC."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_asc" UNIQUE INDEX ON "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_pub"(ID)
PUBLIC."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_asc" UNIQUE INDEX ON "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_pub"(ID)
PUBLIC."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_asc" UNIQUE INDEX ON "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_pub"(ID)
PUBLIC."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_asc" UNIQUE INDEX ON "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_pub"(ID)
PUBLIC."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_asc" UNIQUE INDEX ON "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_pub"(ID)
PUBLIC."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_asc" UNIQUE INDEX ON "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_pub"(ID)
"έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ"."έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_dec" UNIQUE DESCENDING INDEX ON "έαισορροπίαθαείναικάτωαπότομηδέαισορροπίαθαείναικάτωαπτέ_sch"(ID)
"МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр"."МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_dec" UNIQUE DESCENDING INDEX ON "МетодЗейделяДляЛинейныхГиперболическихИТрансцендентныхУр_sch"(ID)
"ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ"."ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_dec" UNIQUE DESCENDING INDEX ON "ლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლლ_sch"(ID)
"€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€"."€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_dec" UNIQUE DESCENDING INDEX ON "€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€_sch"(ID)
"𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞"."𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_dec" UNIQUE DESCENDING INDEX ON "𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞𝄞_sch"(ID)
"🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉"."🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_dec" UNIQUE DESCENDING INDEX ON "🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉🂉_sch"(ID)
quit;

Screen:
ImageImage
(so far - so good: all names are readable and not truncated).

Now let's run

gstat localhost:/var/tmp/tmp4test.fdb -r -user sysdba -pas masterkey 1>gstat-8773-long.txt 2>&1

-- and see in log.

It will contain truncated names of indices for cases when 3 or 4 bytes required to display unicode symbol.

These two screens are for names when 3 bytes per character are used:
ImageImage

And these two - when 4 bytes per character are used:
Image
Image

Checked on LI-T6.0.0.1313-7e32c33.
Similar result on Windows (checked 6.0.0.1312-2cac6fc):Image

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions