1
0
mirror of https://github.com/MariaDB/server.git synced 2026-01-06 05:22:24 +03:00
Files
mariadb/sql
Alexander Barkov 534a2bf1c6 MDEV-32275 getting error 'Illegal parameter data types row and bigint for operation '+' ' when using ITERATE in a FOR..DO
An "ITERATE innerLoop" did not work properly inside
a WHILE loop, which itself is inside an outer FOR loop:

outerLoop:
  FOR
   ...
   innerLoop:
    WHILE
      ...
      ITERATE innerLoop;
      ...
    END WHILE;
    ...
  END FOR;

It erroneously generated an integer increment code for the outer FOR loop.
There were two problems:
1. "ITERATE innerLoop" worked like "ITERATE outerLoop"
2. It was always integer increment, even in case of FOR cursor loops.

Background:
- A FOR loop automatically creates a dedicated sp_pcontext stack entry,
  to put the iteration and bound variables on it.

- Other loop types (LOOP, WHILE, REPEAT), do not generate a dedicated
  slack entry.

  The old code erroneously assumed that sp_pcontext::m_for_loop
  either describes the most inner loop (in case the inner loop is FOR),
  or is empty (in case the inner loop is not FOR).

  But in fact, sp_pcontext::m_for_loop is never empty inside a FOR loop:
  it describes the closest FOR loop, even if this FOR loop has nested
  non-FOR loops inside.

  So when we're near the ITERATE statement in the above script,
  sp_pcontext::m_for_loop is not empty - it stores information about
  the FOR loop labeled as "outrLoop:".

Fix:
- Adding a new member sp_pcontext::Lex_for_loop::m_start_label,
  to remember the explicit or the auto-generated label correspoding
  to the start of the FOR body. It's used during generation
  of "ITERATE loop_label" code to check if "loop_label" belongs
  to the current FOR loop pointed by sp_pcontext::m_for_loop,
  or belongs to a non-FOR nested loop.

- Adding LEX methods sp_for_loop_intrange_iterate() and
  sp_for_loop_cursor_iterate() to reuse the code between
  methods handling:
  * ITERATE
  * END FOR

- Adding a test for Lex_for_loop::is_for_loop_cursor()
  and generate a code either a cursor fetch, or for an integer increment.
  Before this change, it always erroneously generated an integer increment
  version.

- Cleanup: Initialize Lex_for_loop_st::m_cursor_offset inside
  Lex_for_loop_st::init(), to avoid not initialized members.

- Cleanup: Removing a redundant method:
    Lex_for_loop_st::init(const Lex_for_loop_st &other)
  Using Lex_for_loop_st::operator(const Lex_for_loop_st &other) instead.
2023-10-04 16:06:59 +04:00
..
2020-08-03 14:44:06 +02:00
2021-04-20 12:30:09 +03:00
2022-03-23 10:47:27 +11:00
2020-08-03 13:41:29 +02:00
2020-08-03 14:44:06 +02:00
2021-04-22 07:51:33 +03:00
2021-06-21 12:38:25 +03:00
2020-07-14 22:59:19 +03:00
2023-05-02 10:09:27 +02:00
2021-03-31 09:47:14 +03:00
2020-03-30 14:50:23 +03:00
2020-10-29 13:38:38 +02:00
2021-10-13 12:03:32 +03:00
2020-07-31 18:09:08 +03:00
2023-04-26 16:15:29 +02:00
2020-11-03 14:49:17 +02:00
2021-06-30 18:41:46 +03:00
2023-04-10 12:18:16 +02:00
2020-11-02 15:48:47 +02:00
2021-04-21 07:25:48 +03:00
2020-02-11 14:40:35 +01:00
2020-11-03 14:49:17 +02:00
2020-05-30 11:04:27 +03:00
2023-06-07 15:08:29 +02:00
2022-06-09 11:53:46 +03:00
2021-03-20 13:04:36 +02:00
2022-01-30 09:46:52 +01:00
2022-02-10 20:23:56 +01:00
2020-08-10 18:40:57 +03:00
2020-09-03 09:26:54 +03:00
2021-10-21 14:57:00 +03:00
2021-10-21 14:57:00 +03:00
2020-11-12 15:39:02 +05:30
2021-07-31 22:59:58 +02:00
2023-05-02 10:09:27 +02:00
2022-05-03 10:59:54 +02:00
2022-10-05 10:09:49 +03:00
2021-08-11 23:00:37 +04:00
2023-01-03 16:10:02 +02:00
2022-11-27 05:11:39 +10:00
2023-01-28 18:22:55 +01:00
2023-01-28 18:22:55 +01:00
2019-12-09 15:09:41 +01:00
2021-06-30 18:41:46 +03:00
2022-05-08 23:03:08 +02:00
2020-12-25 09:13:28 +01:00
2023-01-28 18:22:55 +01:00
2021-03-05 10:36:51 +02:00
2022-06-27 10:14:37 +03:00
2021-02-23 09:25:57 +01:00
2021-04-20 12:30:09 +03:00
2022-10-25 10:04:37 +03:00
2020-07-31 18:09:08 +03:00
2022-10-01 23:07:26 +02:00
2022-09-23 13:47:15 +03:00
2020-10-22 13:27:18 +03:00
2022-03-29 11:13:18 +03:00
2021-07-02 11:48:51 +03:00
2020-06-13 15:11:43 +03:00
2020-06-12 10:55:53 +03:00
2022-03-29 11:13:18 +03:00
2023-01-03 16:10:02 +02:00
2020-07-15 09:49:48 +02:00
2020-12-01 14:55:46 +02:00
2020-11-11 07:37:05 +02:00
2022-06-27 10:14:37 +03:00
2020-08-26 11:30:20 +03:00