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

            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' );

            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.