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

Out of range error in AVG(YEAR(datetime)) due to a wrong data type

Details

    Description

      I run this script:

      CREATE OR REPLACE TABLE t1 (a DATETIME);
      INSERT INTO t1 VALUES ('2001-01-01 10:20:30');
      CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1;
      

      It unexpectedly returns this error:

      ERROR 1264 (22003): Out of range value for column 'AVG(YEAR(a))' at row 2
      

      If I add LIMIT 0, the table gets created:

      CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1 LIMIT 0;
      SHOW CREATE TABLE t2;
      

      +-------+---------------------------------------------------------------------------------------------------------------------------------+
      | Table | Create Table                                                                                                                    |
      +-------+---------------------------------------------------------------------------------------------------------------------------------+
      | t2    | CREATE TABLE `t2` (
        `AVG(YEAR(a))` decimal(7,4) DEFAULT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci |
      +-------+---------------------------------------------------------------------------------------------------------------------------------+
      

      However, the column size is too small: a DECIMAL(7,4) can store up to 3 integer digits only.
      The expected column type is DECIMAL(8,4).

      Attachments

        Issue Links

          Activity

            bar Alexander Barkov created issue -
            bar Alexander Barkov made changes -
            Field Original Value New Value
            Description I run this script:
            {code:sql}
            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-01-01 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1;
            {code}
            In unexpectedly returns this error:
            {noformat}
            ERROR 1264 (22003): Out of range value for column 'AVG(YEAR(a))' at row 2
            {noformat}

            If I add LIMIT 0, the table gets created:
            {code:sql}
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1 LIMIT 0;
            SHOW CREATE TABLE t2;
            {code}
            {noformat}
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            | Table | Create Table |
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            | t2 | CREATE TABLE `t2` (
              `AVG(YEAR(a))` decimal(7,4) DEFAULT NULL
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci |
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            {noformat}
            However, the column size is too small: a DECIMAL(7,4) can store up to 3 integer digits.
            The expected column type is DECIMAL(8,4).

            I run this script:
            {code:sql}
            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-01-01 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1;
            {code}
            It unexpectedly returns this error:
            {noformat}
            ERROR 1264 (22003): Out of range value for column 'AVG(YEAR(a))' at row 2
            {noformat}

            If I add LIMIT 0, the table gets created:
            {code:sql}
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(YEAR(a)) FROM t1 LIMIT 0;
            SHOW CREATE TABLE t2;
            {code}
            {noformat}
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            | Table | Create Table |
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            | t2 | CREATE TABLE `t2` (
              `AVG(YEAR(a))` decimal(7,4) DEFAULT NULL
            ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci |
            +-------+---------------------------------------------------------------------------------------------------------------------------------+
            {noformat}
            However, the column size is too small: a DECIMAL(7,4) can store up to 3 integer digits only.
            The expected column type is DECIMAL(8,4).

            leonid.fedorov Leonid Fedorov made changes -
            Fix Version/s 10.6 [ 24028 ]
            leonid.fedorov Leonid Fedorov made changes -
            bar Alexander Barkov made changes -
            Affects Version/s 10.6 [ 24028 ]
            Affects Version/s 10.7 [ 24805 ]
            Affects Version/s 10.8 [ 26121 ]
            Affects Version/s 10.9 [ 26905 ]
            Affects Version/s 10.10 [ 27530 ]
            Affects Version/s 10.11 [ 27614 ]
            Affects Version/s 11.0 [ 28320 ]
            Affects Version/s 11.1 [ 28549 ]
            Affects Version/s 11.2 [ 28603 ]
            Affects Version/s 11.3 [ 28565 ]
            Affects Version/s 11.4 [ 29301 ]
            bar Alexander Barkov made changes -
            Summary Our of range error in AVG(YEAR(datetime)) due to a wrong data type Out of range error in AVG(YEAR(datetime)) due to a wrong data type

            A few other functions have the same problem:

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(MONTH(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(MONTH(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(DAY(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(DAY(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(DAYOFYEAR(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(DAYOFYEAR(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(WEEK(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(WEEK(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(HOUR(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(HOUR(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(MINUTE(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(MINUTE(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(SECOND(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(SECOND(a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME(6));
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30.999999');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(MICROSECOND(a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(MICROSECOND(a))' at row 2
            

            bar Alexander Barkov added a comment - A few other functions have the same problem: CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG ( MONTH (a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(MONTH(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG ( DAY (a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(DAY(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG (DAYOFYEAR(a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(DAYOFYEAR(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG (WEEK(a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(WEEK(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG ( HOUR (a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(HOUR(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG ( MINUTE (a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(MINUTE(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG ( SECOND (a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(SECOND(a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME(6)); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30.999999' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG (MICROSECOND(a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(MICROSECOND(a))' at row 2

            Some EXTRACT(unit FROM dt) have the same problem:

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(EXTRACT(YEAR FROM a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(EXTRACT(YEAR FROM a))' at row 2
            

            CREATE OR REPLACE TABLE t1 (a DATETIME);
            INSERT INTO t1 VALUES ('2001-12-31 10:20:30');
            CREATE OR REPLACE TABLE t2 AS SELECT AVG(EXTRACT(MONTH FROM a)) FROM t1;
            ERROR 1264 (22003): Out of range value for column 'AVG(EXTRACT(MONTH FROM a))' at row 2
            

            bar Alexander Barkov added a comment - Some EXTRACT(unit FROM dt) have the same problem: CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG (EXTRACT( YEAR FROM a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(EXTRACT(YEAR FROM a))' at row 2 CREATE OR REPLACE TABLE t1 (a DATETIME); INSERT INTO t1 VALUES ( '2001-12-31 10:20:30' ); CREATE OR REPLACE TABLE t2 AS SELECT AVG (EXTRACT( MONTH FROM a)) FROM t1; ERROR 1264 (22003): Out of range value for column 'AVG(EXTRACT(MONTH FROM a))' at row 2

            The same problem is repeatable with all these statements:

            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING YEAR(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING QUARTER(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MONTH(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING WEEK(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING DAY(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING DAYOFYEAR(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING HOUR(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MINUTE(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING SECOND(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MICROSECOND(TIMESTAMP'2001-12-31 10:20:30');
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MICROSECOND(TIMESTAMP'2001-12-31 10:20:30.999999');
            

            bar Alexander Barkov added a comment - The same problem is repeatable with all these statements: EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING YEAR ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING QUARTER( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MONTH ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING WEEK( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING DAY ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING DAYOFYEAR( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING HOUR ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MINUTE ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING SECOND ( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MICROSECOND( TIMESTAMP '2001-12-31 10:20:30' ); EXECUTE IMMEDIATE 'CREATE OR REPLACE TABLE t2 AS SELECT AVG(?)' USING MICROSECOND( TIMESTAMP '2001-12-31 10:20:30.999999' );
            bar Alexander Barkov made changes -
            Fix Version/s 10.5.25 [ 29626 ]
            Fix Version/s 10.6.18 [ 29627 ]
            Fix Version/s 10.11.8 [ 29630 ]
            Fix Version/s 11.0.6 [ 29628 ]
            Fix Version/s 11.1.5 [ 29629 ]
            Fix Version/s 11.2.4 [ 29631 ]
            Fix Version/s 11.4.2 [ 29633 ]
            Fix Version/s 10.5 [ 23123 ]
            Fix Version/s 10.6 [ 24028 ]
            Resolution Fixed [ 1 ]
            Status Open [ 1 ] Closed [ 6 ]

            People

              bar Alexander Barkov
              bar Alexander Barkov
              Votes:
              0 Vote for this issue
              Watchers:
              1 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.