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

UBSAN: runtime error: signed integer overflow: 10000000000000 * 10000000000000 cannot be represented in type 'long long int' in sql/sql_analyse.cc

Details

    Description

      CREATE TABLE t (id BIGINT) ENGINE=InnoDB;
      INSERT INTO t VALUES ('10000000000000');
      SELECT * FROM t PROCEDURE ANALYSE();
      

      Leads to:

      10.9.0 161fd2d29cc2f8390fa3bf7e739c52bc8d5c39df (Optimized)

      /test/10.9_opt_san/sql/sql_analyse.cc:590:19: runtime error: signed integer overflow: 10000000000000 * 10000000000000 cannot be represented in type 'long long int'
      /test/10.9_opt_san/sql/sql_analyse.h:270:37: runtime error: signed integer overflow: 10000000000000 * 10000000000000 cannot be represented in type 'long long int'
      

      Setup:

      Compiled with GCC >=7.5.0 (I use GCC 9.4.0) and:
          -DWITH_ASAN=ON -DWITH_ASAN_SCOPE=ON -DWITH_UBSAN=ON -DWITH_RAPID=OFF -DWSREP_LIB_WITH_ASAN=ON
      Set before execution:
          export UBSAN_OPTIONS=print_stacktrace=1
      

      Bug confirmed present in:
      MariaDB: 10.2.44 (dbg), 10.2.44 (opt), 10.3.35 (dbg), 10.3.35 (opt), 10.4.25 (dbg), 10.4.25 (opt), 10.5.16 (dbg), 10.5.16 (opt), 10.6.8 (dbg), 10.6.8 (opt), 10.7.4 (dbg), 10.7.4 (opt), 10.8.3 (dbg), 10.8.3 (opt), 10.9.0 (dbg), 10.9.0 (opt)

      Attachments

        Issue Links

          Activity

            Please also test any bugfix with this testcase:

            CREATE TABLE t (c INT) ENGINE=InnoDB UNION=(t,t2) INSERT_METHOD=LAST;
            CREATE TABLE t3 LIKE t;
            INSERT INTO t VALUES (1),(2),(-685113344),(0);
            INSERT INTO t3 SELECT * FROM t;
            INSERT INTO t SELECT * FROM t;
            INSERT INTO t SELECT * FROM t;
            INSERT INTO t3 SELECT * FROM t;
            SELECT * FROM t3 PROCEDURE ANALYSE();
            

            Roel Roel Van de Paar added a comment - Please also test any bugfix with this testcase: CREATE TABLE t (c INT ) ENGINE=InnoDB UNION =(t,t2) INSERT_METHOD= LAST ; CREATE TABLE t3 LIKE t; INSERT INTO t VALUES (1),(2),(-685113344),(0); INSERT INTO t3 SELECT * FROM t; INSERT INTO t SELECT * FROM t; INSERT INTO t SELECT * FROM t; INSERT INTO t3 SELECT * FROM t; SELECT * FROM t3 PROCEDURE ANALYSE();

            This testcase:

            SET sql_mode='';
            CREATE TABLE t (c INT) ENGINE=InnoDB UNION=(t,t2) INSERT_METHOD=LAST;
            INSERT INTO t VALUES (1);
            INSERT INTO t VALUES (0xA9BD);
            INSERT INTO t (c) VALUES (ADDTIME(NOW(),1));
            CREATE TABLE c AS SELECT 1 A;
            SELECT * FROM t a,c,t b PROCEDURE ANALYSE();
            

            Produces a new UniqueID on 11.6:

            11.6.0 29e9ade269d803b6823ec57808e0b7fad28baf9e (Optimized, UBASAN)

            UBSAN|signed integer overflow: X + Y cannot be represented in type 'long long int'|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|JOIN_CACHE::generate_full_extensions
            

            Roel Roel Van de Paar added a comment - This testcase: SET sql_mode= '' ; CREATE TABLE t (c INT ) ENGINE=InnoDB UNION =(t,t2) INSERT_METHOD= LAST ; INSERT INTO t VALUES (1); INSERT INTO t VALUES (0xA9BD); INSERT INTO t (c) VALUES (ADDTIME(NOW(),1)); CREATE TABLE c AS SELECT 1 A; SELECT * FROM t a,c,t b PROCEDURE ANALYSE(); Produces a new UniqueID on 11.6: 11.6.0 29e9ade269d803b6823ec57808e0b7fad28baf9e (Optimized, UBASAN) UBSAN|signed integer overflow: X + Y cannot be represented in type 'long long int'|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|JOIN_CACHE::generate_full_extensions
            Roel Roel Van de Paar added a comment - - edited

            CREATE TABLE t (c BIGINT);
            INSERT INTO t VALUES (1000000000000000);
            SELECT * FROM t PROCEDURE ANALYSE(0,0);
            

            Produces an UBSAN stack:

            11.0.2 8e55d7ea4a2f94ae3f38fdd8785778612d4b1203 (Debug, UBASAN)

            /test/11.0_dbg_san/sql/sql_analyse.cc:642:19: runtime error: signed integer overflow: 1000000000000000 * 1000000000000000 cannot be represented in type 'long long int'
            

            11.0.2 8e55d7ea4a2f94ae3f38fdd8785778612d4b1203 (Debug, UBASAN)

                #0 0x55eca41215df in field_ulonglong::add() /test/11.0_dbg_san/sql/sql_analyse.cc:642
                #1 0x55eca40f9ef5 in analyse::send_row(List<Item>&) /test/11.0_dbg_san/sql/sql_analyse.cc:669
                #2 0x55eca1d3ff80 in end_send /test/11.0_dbg_san/sql/sql_select.cc:24281
                #3 0x55eca1bd1f15 in evaluate_join_record /test/11.0_dbg_san/sql/sql_select.cc:23269
                #4 0x55eca1c78d01 in sub_select(JOIN*, st_join_table*, bool) /test/11.0_dbg_san/sql/sql_select.cc:23036
                #5 0x55eca1e3b2a0 in do_select /test/11.0_dbg_san/sql/sql_select.cc:22568
                #6 0x55eca1e3b2a0 in JOIN::exec_inner() /test/11.0_dbg_san/sql/sql_select.cc:4895
                #7 0x55eca1e3ca3c in JOIN::exec() /test/11.0_dbg_san/sql/sql_select.cc:4672
                #8 0x55eca1e2b1fa in mysql_select(THD*, TABLE_LIST*, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /test/11.0_dbg_san/sql/sql_select.cc:5153
                #9 0x55eca1e2f655 in handle_select(THD*, LEX*, select_result*, unsigned long long) /test/11.0_dbg_san/sql/sql_select.cc:611
                #10 0x55eca19aee35 in execute_sqlcom_select /test/11.0_dbg_san/sql/sql_parse.cc:6267
                #11 0x55eca1a10190 in mysql_execute_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:3949
                #12 0x55eca1a3faa8 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.0_dbg_san/sql/sql_parse.cc:7999
                #13 0x55eca1a4f83c in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1894
                #14 0x55eca1a5d641 in do_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1407
                #15 0x55eca242191b in do_handle_one_connection(CONNECT*, bool) /test/11.0_dbg_san/sql/sql_connect.cc:1416
                #16 0x55eca2422e36 in handle_one_connection /test/11.0_dbg_san/sql/sql_connect.cc:1318
                #17 0x14be34c94b42 in start_thread nptl/pthread_create.c:442
                #18 0x14be34d269ff  (/lib/x86_64-linux-gnu/libc.so.6+0x1269ff)
            

            Roel Roel Van de Paar added a comment - - edited CREATE TABLE t (c BIGINT ); INSERT INTO t VALUES (1000000000000000); SELECT * FROM t PROCEDURE ANALYSE(0,0); Produces an UBSAN stack: 11.0.2 8e55d7ea4a2f94ae3f38fdd8785778612d4b1203 (Debug, UBASAN) /test/11.0_dbg_san/sql/sql_analyse.cc:642:19: runtime error: signed integer overflow: 1000000000000000 * 1000000000000000 cannot be represented in type 'long long int' 11.0.2 8e55d7ea4a2f94ae3f38fdd8785778612d4b1203 (Debug, UBASAN) #0 0x55eca41215df in field_ulonglong::add() /test/11.0_dbg_san/sql/sql_analyse.cc:642 #1 0x55eca40f9ef5 in analyse::send_row(List<Item>&) /test/11.0_dbg_san/sql/sql_analyse.cc:669 #2 0x55eca1d3ff80 in end_send /test/11.0_dbg_san/sql/sql_select.cc:24281 #3 0x55eca1bd1f15 in evaluate_join_record /test/11.0_dbg_san/sql/sql_select.cc:23269 #4 0x55eca1c78d01 in sub_select(JOIN*, st_join_table*, bool) /test/11.0_dbg_san/sql/sql_select.cc:23036 #5 0x55eca1e3b2a0 in do_select /test/11.0_dbg_san/sql/sql_select.cc:22568 #6 0x55eca1e3b2a0 in JOIN::exec_inner() /test/11.0_dbg_san/sql/sql_select.cc:4895 #7 0x55eca1e3ca3c in JOIN::exec() /test/11.0_dbg_san/sql/sql_select.cc:4672 #8 0x55eca1e2b1fa in mysql_select(THD*, TABLE_LIST*, List<Item>&, Item*, unsigned int, st_order*, st_order*, Item*, st_order*, unsigned long long, select_result*, st_select_lex_unit*, st_select_lex*) /test/11.0_dbg_san/sql/sql_select.cc:5153 #9 0x55eca1e2f655 in handle_select(THD*, LEX*, select_result*, unsigned long long) /test/11.0_dbg_san/sql/sql_select.cc:611 #10 0x55eca19aee35 in execute_sqlcom_select /test/11.0_dbg_san/sql/sql_parse.cc:6267 #11 0x55eca1a10190 in mysql_execute_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:3949 #12 0x55eca1a3faa8 in mysql_parse(THD*, char*, unsigned int, Parser_state*) /test/11.0_dbg_san/sql/sql_parse.cc:7999 #13 0x55eca1a4f83c in dispatch_command(enum_server_command, THD*, char*, unsigned int, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1894 #14 0x55eca1a5d641 in do_command(THD*, bool) /test/11.0_dbg_san/sql/sql_parse.cc:1407 #15 0x55eca242191b in do_handle_one_connection(CONNECT*, bool) /test/11.0_dbg_san/sql/sql_connect.cc:1416 #16 0x55eca2422e36 in handle_one_connection /test/11.0_dbg_san/sql/sql_connect.cc:1318 #17 0x14be34c94b42 in start_thread nptl/pthread_create.c:442 #18 0x14be34d269ff (/lib/x86_64-linux-gnu/libc.so.6+0x1269ff)

            Additional stack with

            CREATE SEQUENCE t CACHE=1 MAXVALUE=0 INCREMENT=-1;
            SELECT * FROM t PROCEDURE ANALYSE();
            

            UBSAN|signed integer overflow: -X * -Y cannot be represented in type 'long long int'|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|do_select
            

            Roel Roel Van de Paar added a comment - Additional stack with CREATE SEQUENCE t CACHE=1 MAXVALUE=0 INCREMENT=-1; SELECT * FROM t PROCEDURE ANALYSE(); UBSAN|signed integer overflow: -X * -Y cannot be represented in type 'long long int'|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|do_select

            Additional stack with

            SET sql_mode='';
            CREATE TABLE t (a INT) ENGINE=FEDERATED;
            INSERT INTO t VALUES ('-9223372036854775808');
            INSERT INTO t SELECT * FROM t;
            SELECT * FROM t PROCEDURE ANALYSE(2);
            

            UBSAN|signed integer overflow: X + Y cannot be represented in type 'longlong' (aka 'long long')|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|evaluate_join_record
            

            Roel Roel Van de Paar added a comment - Additional stack with SET sql_mode= '' ; CREATE TABLE t (a INT ) ENGINE=FEDERATED; INSERT INTO t VALUES ( '-9223372036854775808' ); INSERT INTO t SELECT * FROM t; SELECT * FROM t PROCEDURE ANALYSE(2); UBSAN|signed integer overflow: X + Y cannot be represented in type 'longlong' (aka 'long long')|sql/sql_analyse.cc|field_longlong::add|analyse::send_row|end_send|evaluate_join_record

            People

              bar Alexander Barkov
              Roel Roel Van de Paar
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:

                Git Integration

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