[MDEV-27544] database() function under UNION ALL truncates results to 34 characters despite databases having up to 64 character names Created: 2022-01-19  Updated: 2022-01-20  Resolved: 2022-01-20

Status: Closed
Project: MariaDB Server
Component/s: Data types
Affects Version/s: 5.5.68, 10.7.1
Fix Version/s: 10.2.42, 10.3.33, 10.4.23, 10.5.14, 10.6.6, 10.7.2

Type: Bug Priority: Major
Reporter: Daniel Black Assignee: Daniel Black
Resolution: Fixed Votes: 0
Labels: None


 Description   

From https://dba.stackexchange.com/questions/306183/why-is-my-database-name-truncated

$ db=$(printf 'a%.0s' {1..40})
$ echo $db
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
$ podman run -d --rm -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_DATABASE=$db -e MYSQL_USER=u -e MYSQL_PASSWORD=p --name m55 mariadb:5.5
1b2c0740bf664b8a3da8071bb96234a86fe8dd5f3eb6348598f5d0c2b59ede56
 
$ podman exec -ti m55 mysql -u u -pp  --column-type-info -e 'select database() as "database" union all select database()' $db
Field   1:  `database`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  latin1_swedish_ci (8)
Length:     34
Max_length: 34
Decimals:   0
Flags:      
 
 
+------------------------------------+
| database                           |
+------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------+
 
$ podman exec -ti m55 mysql -u u -pp  --column-type-info -e 'select database()' $db
Field   1:  `database()`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  latin1_swedish_ci (8)
Length:     34
Max_length: 40
Decimals:   31
Flags:      
 
 
+------------------------------------------+
| database()                               |
+------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------+

Above with 5.5 however have verified it on 10.2.



 Comments   
Comment by Daniel Black [ 2022-01-19 ]

bar is the fix just the following?

diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h
index 0bf21b63ac9..3abc7fba2f6 100644
--- a/sql/item_strfunc.h
+++ b/sql/item_strfunc.h
@@ -717,7 +717,7 @@ class Item_func_database :public Item_func_sysconst
   String *val_str(String *);
   bool fix_length_and_dec()
   {
-    max_length= MAX_FIELD_NAME * system_charset_info->mbmaxlen;
+    max_length= NAME_LEN;
     maybe_null=1;
     return FALSE;
   }

This results in:

$ mc -u root --default-character-set=utf8mb4 -e "create database $db"; mc -u root --default-character-set=utf8mb4   --column-type-info -e 'select database() as "database" union all select database()' $db
Field   1:  `database`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  utf8mb4_general_ci (45)
Length:     256
Max_length: 40
Decimals:   39
Flags:      
 
 
+------------------------------------------+
| database                                 |
+------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------+
 
~/repos/build-mariadb-server-10.2 
$ wc -c
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa40
 
~/repos/build-mariadb-server-10.2 
$ mc -u root --default-character-set=latin1   --column-type-info -e 'select database() as "database" union all select database()' $db
Field   1:  `database`
Catalog:    `def`
Database:   ``
Table:      ``
Org_table:  ``
Type:       VAR_STRING
Collation:  latin1_swedish_ci (8)
Length:     64
Max_length: 40
Decimals:   39
Flags:      
 
 
+------------------------------------------+
| database                                 |
+------------------------------------------+
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
| aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa |
+------------------------------------------+

Are you happy with this fix? If so I can progress with test cases.

Comment by Alexander Barkov [ 2022-01-19 ]

danblack, I think the correct way would be:

   bool fix_length_and_dec()
   {
     max_length= NAME_CHAR_LEN * system_charset_info->mbmaxlen;
     maybe_null=1;
     return FALSE;
   }

Comment by Daniel Black [ 2022-01-19 ]

bar are you happy with https://github.com/MariaDB/server/pull/1988

(test case word taken from https://www.thoughtco.com/longest-german-word-in-the-world-4061494)

Generated at Thu Feb 08 09:53:43 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.