Version 8.0.11-TiDB-v7.5.0 SQL Execution Error: runtime error: index out of range [1] with length 0

Note:
This topic has been translated from a Chinese forum by GPT and might contain errors.

Original topic: 8.0.11-TiDB-v7.5.0版本 执行SQL报错:runtime error: index out of range [1] with length 0

| username: CAICAI

Version: 8.0.11-TiDB-v7.5.0
Environment: Test Environment

The SQL is just to concatenate some statements for partition tables, all using system tables.

Providing a table structure:

CREATE TABLE `advertise_timing_order` (
  `ruleUid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Unique code for scheduled rule data',
  `matching` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Matching object: campaign=activity, adgroup=ad group, keyword=keyword, target=targeting',
  `state` int NOT NULL DEFAULT '0' COMMENT 'Start/Pause 10=Start 20=Pause',
  `matchUid` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Unique ID of the matching object',
  `time` datetime NOT NULL COMMENT 'Modification time',
  `user` char(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'Operating user',
  PRIMARY KEY (`ruleUid`,`matchUid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='Amazon Ads - Registered Scheduled Tasks'
/*!50100 PARTITION BY KEY (ruleUid)
PARTITIONS 251 */;

Error SQL:

SELECT
                    `data`.TABLE_NAME,
                    CONCAT(
                        'PARTITION BY ',
                        `data`.PARTITION_METHOD,
                        '(',
                        `data`.PARTITION_EXPRESSION,
                        ') PARTITIONS ',
                        MAX(`data`.PARTITION_ORDINAL_POSITION),
                        `data`.sub_var,
                        ' (',
                        GROUP_CONCAT(                                                           /*Concatenate partition body*/
                            CONCAT(
                                'PARTITION `',
                                REPLACE(`data`.PARTITION_NAME, '`', '``'),
                                '`',
                                IF(
                                    `data`.PARTITION_METHOD = 'RANGE',
                                    CONCAT(' VALUES LESS THAN (', `data`.PARTITION_DESCRIPTION, ')'),
                                    IF(
                                        `data`.PARTITION_METHOD = 'LIST',
                                        CONCAT(' VALUES IN (', `data`.PARTITION_DESCRIPTION, ')'),
                                        ''
                                    )
                                ),
                                IFNULL(
                                    `data`.sub_body,                                            /*Subpartition*/
                                    CONCAT(
                                        ' COMMENT="',
                                        REPLACE(`data`.PARTITION_COMMENT, '"', '\\"'),
                                        '"'
                                    )
                                )
                            )
                            ORDER BY `data`.PARTITION_ORDINAL_POSITION
                            SEPARATOR ', '
                        ),
                        ')'
                    ) PARTITION_SQL,
                    CONCAT(
                        `data`.PARTITION_EXPRESSION, ',', 
                        IFNULL(`data`.SUBPARTITION_EXPRESSION, '')
                    ) COLUMNS_COMPARE                                                           /*Field change proof*/
                FROM
                    (SELECT
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        '',
                        CONCAT(
                            ' SUBPARTITION BY ',
                            `PARTITIONS`.SUBPARTITION_METHOD,
                            '(',
                            `PARTITIONS`.SUBPARTITION_EXPRESSION,
                            ') SUBPARTITIONS ',
                            MAX(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION)
                        )
                    ) `sub_var`,                                                                /*Subpartition description*/
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        NULL,
                        CONCAT(
                            ' (',
                            GROUP_CONCAT(
                                CONCAT(
                                    'SUBPARTITION `',
                                    REPLACE(`PARTITIONS`.SUBPARTITION_NAME, '`', '``'),
                                    '` COMMENT="',
                                    REPLACE(`PARTITIONS`.PARTITION_COMMENT, '"', '\\"'),
                                    '"'
                                )
                                ORDER BY `PARTITIONS`.SUBPARTITION_ORDINAL_POSITION
                                SEPARATOR ', '
                            ),
                            ')'
                        )
                    ) `sub_body`,                                                               /*Subpartition body*/
                    `PARTITIONS`.TABLE_NAME,
                    `PARTITIONS`.PARTITION_NAME,
                    `PARTITIONS`.PARTITION_ORDINAL_POSITION,
                    `PARTITIONS`.PARTITION_METHOD,
                    `PARTITIONS`.PARTITION_EXPRESSION,
                    `PARTITIONS`.PARTITION_DESCRIPTION,
                    `PARTITIONS`.PARTITION_COMMENT,
                    `PARTITIONS`.SUBPARTITION_EXPRESSION
                FROM
                    `information_schema`.`PARTITIONS`
                WHERE
                    `PARTITIONS`.TABLE_SCHEMA='test'
                AND `PARTITIONS`.TABLE_NAME IN ('advertise_timing_order')
                AND `PARTITIONS`.PARTITION_ORDINAL_POSITION IS NOT NULL
                GROUP BY
                    `PARTITIONS`.TABLE_NAME, `PARTITIONS`.PARTITION_NAME) `data`
                GROUP BY
                    `data`.TABLE_NAME

Strangely, commenting out the ORDER BY in GROUP_CONCAT executes without issues, SQL as follows:

SELECT
                    `data`.TABLE_NAME,
                    CONCAT(
                        'PARTITION BY ',
                        `data`.PARTITION_METHOD,
                        '(',
                        `data`.PARTITION_EXPRESSION,
                        ') PARTITIONS ',
                        MAX(`data`.PARTITION_ORDINAL_POSITION),
                        `data`.sub_var,
                        ' (',
                        GROUP_CONCAT(                                                           /*Concatenate partition body*/
                            CONCAT(
                                'PARTITION `',
                                REPLACE(`data`.PARTITION_NAME, '`', '``'),
                                '`',
                                IF(
                                    `data`.PARTITION_METHOD = 'RANGE',
                                    CONCAT(' VALUES LESS THAN (', `data`.PARTITION_DESCRIPTION, ')'),
                                    IF(
                                        `data`.PARTITION_METHOD = 'LIST',
                                        CONCAT(' VALUES IN (', `data`.PARTITION_DESCRIPTION, ')'),
                                        ''
                                    )
                                ),
                                IFNULL(
                                    `data`.sub_body,                                            /*Subpartition*/
                                    CONCAT(
                                        ' COMMENT="',
                                        REPLACE(`data`.PARTITION_COMMENT, '"', '\\"'),
                                        '"'
                                    )
                                )
                            )
                            #ORDER BY `data`.PARTITION_ORDINAL_POSITION
                            SEPARATOR ', '
                        ),
                        ')'
                    ) PARTITION_SQL,
                    CONCAT(
                        `data`.PARTITION_EXPRESSION, ',', 
                        IFNULL(`data`.SUBPARTITION_EXPRESSION, '')
                    ) COLUMNS_COMPARE                                                           /*Field change proof*/
                FROM
                    (SELECT
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        '',
                        CONCAT(
                            ' SUBPARTITION BY ',
                            `PARTITIONS`.SUBPARTITION_METHOD,
                            '(',
                            `PARTITIONS`.SUBPARTITION_EXPRESSION,
                            ') SUBPARTITIONS ',
                            MAX(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION)
                        )
                    ) `sub_var`,                                                                /*Subpartition description*/
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        NULL,
                        CONCAT(
                            ' (',
                            GROUP_CONCAT(
                                CONCAT(
                                    'SUBPARTITION `',
                                    REPLACE(`PARTITIONS`.SUBPARTITION_NAME, '`', '``'),
                                    '` COMMENT="',
                                    REPLACE(`PARTITIONS`.PARTITION_COMMENT, '"', '\\"'),
                                    '"'
                                )
                                ORDER BY `PARTITIONS`.SUBPARTITION_ORDINAL_POSITION
                                SEPARATOR ', '
                            ),
                            ')'
                        )
                    ) `sub_body`,                                                               /*Subpartition body*/
                    `PARTITIONS`.TABLE_NAME,
                    `PARTITIONS`.PARTITION_NAME,
                    `PARTITIONS`.PARTITION_ORDINAL_POSITION,
                    `PARTITIONS`.PARTITION_METHOD,
                    `PARTITIONS`.PARTITION_EXPRESSION,
                    `PARTITIONS`.PARTITION_DESCRIPTION,
                    `PARTITIONS`.PARTITION_COMMENT,
                    `PARTITIONS`.SUBPARTITION_EXPRESSION
                FROM
                    `information_schema`.`PARTITIONS`
                WHERE
                    `PARTITIONS`.TABLE_SCHEMA='test'
                AND `PARTITIONS`.TABLE_NAME IN ('advertise_timing_order')
                AND `PARTITIONS`.PARTITION_ORDINAL_POSITION IS NOT NULL
                GROUP BY
                    `PARTITIONS`.TABLE_NAME, `PARTITIONS`.PARTITION_NAME) `data`
                GROUP BY
                    `data`.TABLE_NAME

Also, commenting out some other parts of the SQL, it executes without errors:

SELECT
                   # `data`.TABLE_NAME,
                   # CONCAT(
                   #     'PARTITION BY ',
                   #     `data`.PARTITION_METHOD,
                   #     '(',
                   #     `data`.PARTITION_EXPRESSION,
                   #     ') PARTITIONS ',
                   #     MAX(`data`.PARTITION_ORDINAL_POSITION),
                   #     `data`.sub_var,
                   #     ' (',
                        GROUP_CONCAT(                                                           /*Concatenate partition body*/
                            CONCAT(
                                'PARTITION `',
                                REPLACE(`data`.PARTITION_NAME, '`', '``'),
                                '`',
                                IF(
                                    `data`.PARTITION_METHOD = 'RANGE',
                                    CONCAT(' VALUES LESS THAN (', `data`.PARTITION_DESCRIPTION, ')'),
                                    IF(
                                        `data`.PARTITION_METHOD = 'LIST',
                                        CONCAT(' VALUES IN (', `data`.PARTITION_DESCRIPTION, ')'),
                                        ''
                                    )
                                ),
                                IFNULL(
                                    `data`.sub_body,                                            /*Subpartition*/
                                    CONCAT(
                                        ' COMMENT="',
                                        REPLACE(`data`.PARTITION_COMMENT, '"', '\\"'),
                                        '"'
                                    )
                                )
                            )
                            ORDER BY `data`.PARTITION_ORDINAL_POSITION
                            SEPARATOR ', '
                        ) aa
                    #    ')'
                    #) PARTITION_SQL,
                    #CONCAT(
                    #    `data`.PARTITION_EXPRESSION, ',', 
                    #    IFNULL(`data`.SUBPARTITION_EXPRESSION, '')
                    #) COLUMNS_COMPARE                                                           /*Field change proof*/
                FROM
                    (SELECT
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        '',
                        CONCAT(
                            ' SUBPARTITION BY ',
                            `PARTITIONS`.SUBPARTITION_METHOD,
                            '(',
                            `PARTITIONS`.SUBPARTITION_EXPRESSION,
                            ') SUBPARTITIONS ',
                            MAX(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION)
                        )
                    ) `sub_var`,                                                                /*Subpartition description*/
                    IF(
                        ISNULL(`PARTITIONS`.SUBPARTITION_ORDINAL_POSITION),
                        NULL,
                        CONCAT(
                            ' (',
                            GROUP_CONCAT(
                                CONCAT(
                                    'SUBPARTITION `',
                                    REPLACE(`PARTITIONS`.SUBPARTITION_NAME, '`', '``'),
                                    '` COMMENT="',
                                    REPLACE(`PARTITIONS`.PARTITION_COMMENT, '"', '\\"'),
                                    '"'
                                )
                                ORDER BY `PARTITIONS`.SUBPARTITION_ORDINAL_POSITION
                                SEPARATOR ', '
                            ),
                            ')'
                        )
                    ) `sub_body`,                                                               /*Subpartition body*/
                    `PARTITIONS`.TABLE_NAME,
                    `PARTITIONS`.PARTITION_NAME,
                    `PARTITIONS`.PARTITION_ORDINAL_POSITION,
                    `PARTITIONS`.PARTITION_METHOD,
                    `PARTITIONS`.PARTITION_EXPRESSION,
                    `PARTITIONS`.PARTITION_DESCRIPTION,
                    `PARTITIONS`.PARTITION_COMMENT,
                    `PARTITIONS`.SUBPARTITION_EXPRESSION
                FROM
                    `information_schema`.`PARTITIONS`
                WHERE
                    `PARTITIONS`.TABLE_SCHEMA='test'
                AND `PARTITIONS`.TABLE_NAME IN ('advertise_timing_order')
                AND `PARTITIONS`.PARTITION_ORDINAL_POSITION IS NOT NULL
                GROUP BY
                    `PARTITIONS`.TABLE_NAME, `PARTITIONS`.PARTITION_NAME) `data`
                GROUP BY
                    `data`.TABLE_NAME

Is this a bug?

| username: 哈喽沃德 | Original post link

If the subquery returns an empty result set, this error may occur when trying to access the second column in the result set. Please ensure that the result set returned by the subquery is not empty.

| username: 哈喽沃德 | Original post link

Try this.
| username: CAICAI | Original post link

Even if the subquery returns a non-empty result set, it will still report an error. The SQL you provided will still report an error.

| username: Billmay表妹 | Original post link

Could it be due to compatibility issues?

| username: Billmay表妹 | Original post link

Feedback has been given to R&D!

| username: CAICAI | Original post link

It might be necessary to have the development team take a look at what the issue is.

| username: 小龙虾爱大龙虾 | Original post link

This is a code issue, the index is out of bounds.
But why do you need to piece together the table structure? Can’t you just use show create table directly?

| username: oceanzhang | Original post link

It feels like it should be a bug.

| username: aytrack | Original post link

The same issue as ERROR 1105 (HY000): runtime error: index out of range [0] with length 0 · Issue #49986 · pingcap/tidb · GitHub, it has been fixed on master.

| username: mono | Original post link

What is sql_mode? I have encountered such errors with MySQL before. Check sql_mode or rewrite the SQL.

| username: 哈喽沃德 | Original post link

Then we can only let the official technical team check if it is caused by an excessively long SQL.

| username: soulmz | Original post link

+1 I also encountered this problem.

How did you handle it?

| username: system | Original post link

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.