Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-27544

database() function under UNION ALL truncates results to 34 characters despite databases having up to 64 character names

Details

    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.

      Attachments

        Activity

          danblack Daniel Black added a comment -

          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.

          danblack Daniel Black added a comment - 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.
          bar Alexander Barkov added a comment - - edited

          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;
             }
          

          bar Alexander Barkov added a comment - - edited 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; }
          danblack Daniel Black added a comment - 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 )

          People

            danblack Daniel Black
            danblack Daniel Black
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.