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

LP:985828 - regression in sql queries using sub queries (with order by)

Details

    • Bug
    • Status: Closed (View Workflow)
    • Trivial
    • Resolution: Won't Fix
    • None
    • None
    • None

    Description

      1. Since mariadb version 5.3.3, I do have regression with sql queries using
      2. sub queries (with order by) and user variables. Theses queries just worked
      3. fine since many months/years, and they now return wrong result. May be
      4. it's just me doing something that's not supposed to work. I include here
      5. detailed explanation. Any hint would be highly appreciated
      1. I wish to parse this stock table in a given order and
      2. display in the same time a column showing the quantity
      3. cumulated. So expected result is (with "ORDER BY uid DESC") :
      4. ---------------------------
      5. uid quantity total_quantity
      6. ---------------------------
      7. 3 4 4
      8. 1 2 6
      9. ---------------------------

      DROP TABLE IF EXISTS stock_table;
      CREATE TABLE stock_table ( `uid` BIGINT UNSIGNED NOT NULL, `quantity` BIGINT UNSIGNED NOT NULL);
      INSERT INTO stock_table values (1, 2), (3, 4);

      SET @total_quantity := 0 ;
      SELECT
      q1.*,
      @total_quantity := @total_quantity + q1.quantity as total_quantity
      FROM (SELECT stock_table.uid,
      stock_table.quantity
      FROM
      stock_table
      ORDER BY
      stock_table.uid DESC) as q1;

      1. that was giving the expected result for us since a very long time,
      2. on older version of mariadb and mysql. We were relying on the fact,
      3. in our usage, that mariadb was always parsing the subquery in the specified
      4. order. But theses days (5.5.22-MariaDB-log), it does not work, it give :
      5. ---------------------------
      6. uid quantity total_quantity
      7. ---------------------------
      8. 1 2 2
      9. 3 4 6
      10. ---------------------------
      11. we want uid to be 3 then 1
        #
      12. It start failing after we moved from mariadb 5.3.2-beta to 5.3.3-rc
      13. In the changelog http://kb.askmonty.org/en/mariadb-533-changelog
      14. I see that there is optimization on "useless subquery clauses", it
      15. could be related.
      1. Is it expected that the outer query does not read the subquery in
      2. the order specified by the subquery ?
      3. Is there a way to solve this problem with mariadb if this is not considered
      4. as a regression?

      Attachments

        Activity

          Re: regression in sql queries using sub queries (with order by)
          Hi,

          If you want to get the old behavior, I suppose you can try either of these, whichever suits you best:

          1. Workaround 1
            #---------------------
          2. Modify default optimizer switch at runtime for the session or globally in the cnf:

          SET optimizer_switch = 'derived_merge=off';

          1. The rest of the test case is unchanged

          DROP TABLE IF EXISTS stock_table;
          CREATE TABLE stock_table ( `uid` BIGINT UNSIGNED NOT NULL, `quantity` BIGINT UNSIGNED NOT NULL);
          INSERT INTO stock_table values (1, 2), (3, 4);

          SET @total_quantity := 0 ;
          SELECT
          q1.*,
          @total_quantity := @total_quantity + q1.quantity as total_quantity
          FROM (SELECT stock_table.uid,
          stock_table.quantity
          FROM
          stock_table
          ORDER BY
          stock_table.uid DESC) as q1;

          1. End of workaround 1
          1. uid quantity total_quantity
          2. 3 4 4
          3. 1 2 6

          #

          1. Workaround 2
          2. ----------------------
          1. Convert FROM subquery into a view:

          DROP TABLE IF EXISTS stock_table;
          CREATE TABLE stock_table ( `uid` BIGINT UNSIGNED NOT NULL, `quantity` BIGINT UNSIGNED NOT NULL);
          INSERT INTO stock_table values (1, 2), (3, 4);

          CREATE VIEW q1 AS
          SELECT stock_table.uid,
          stock_table.quantity
          FROM
          stock_table
          ORDER BY
          stock_table.uid DESC;

          SET @total_quantity := 0 ;
          SELECT
          q1.*,
          @total_quantity := @total_quantity + q1.quantity as total_quantity
          FROM q1;

          1. End of workaround 2
          1. uid quantity total_quantity
          2. 3 4 4
          3. 1 2 6
          elenst Elena Stepanova added a comment - Re: regression in sql queries using sub queries (with order by) Hi, If you want to get the old behavior, I suppose you can try either of these, whichever suits you best: Workaround 1 #--------------------- Modify default optimizer switch at runtime for the session or globally in the cnf: SET optimizer_switch = 'derived_merge=off'; The rest of the test case is unchanged DROP TABLE IF EXISTS stock_table; CREATE TABLE stock_table ( `uid` BIGINT UNSIGNED NOT NULL, `quantity` BIGINT UNSIGNED NOT NULL); INSERT INTO stock_table values (1, 2), (3, 4); SET @total_quantity := 0 ; SELECT q1.*, @total_quantity := @total_quantity + q1.quantity as total_quantity FROM (SELECT stock_table.uid, stock_table.quantity FROM stock_table ORDER BY stock_table.uid DESC) as q1; End of workaround 1 uid quantity total_quantity 3 4 4 1 2 6 # Workaround 2 ---------------------- Convert FROM subquery into a view: DROP TABLE IF EXISTS stock_table; CREATE TABLE stock_table ( `uid` BIGINT UNSIGNED NOT NULL, `quantity` BIGINT UNSIGNED NOT NULL); INSERT INTO stock_table values (1, 2), (3, 4); CREATE VIEW q1 AS SELECT stock_table.uid, stock_table.quantity FROM stock_table ORDER BY stock_table.uid DESC; SET @total_quantity := 0 ; SELECT q1.*, @total_quantity := @total_quantity + q1.quantity as total_quantity FROM q1; End of workaround 2 uid quantity total_quantity 3 4 4 1 2 6

          Re: regression in sql queries using sub queries (with order by)
          Logically, I don't see a reason why the query is obliged to behave the way it did before, but I will forward the bug report to Igor to confirm the current behavior is legitimate.

          elenst Elena Stepanova added a comment - Re: regression in sql queries using sub queries (with order by) Logically, I don't see a reason why the query is obliged to behave the way it did before, but I will forward the bug report to Igor to confirm the current behavior is legitimate.

          Re: regression in sql queries using sub queries (with order by)
          Now subquery in the FROM clause could be merged so it behave as merged VIEW. it was always so that VIEWS if merged algorithm applied and it is not part of UNION append upper query ORDER BY with its one. If one put ORDER BY in subquery or view it should know what he/she is doing. IMHO it is not a bug.

          sanja Oleksandr Byelkin added a comment - Re: regression in sql queries using sub queries (with order by) Now subquery in the FROM clause could be merged so it behave as merged VIEW. it was always so that VIEWS if merged algorithm applied and it is not part of UNION append upper query ORDER BY with its one. If one put ORDER BY in subquery or view it should know what he/she is doing. IMHO it is not a bug.

          Re: regression in sql queries using sub queries (with order by)
          I forgot solution to the problem: do not put ORDER BY in the SUBQUERY/VIEW if you do not want to have ordered results in most cases.

          sanja Oleksandr Byelkin added a comment - Re: regression in sql queries using sub queries (with order by) I forgot solution to the problem: do not put ORDER BY in the SUBQUERY/VIEW if you do not want to have ordered results in most cases.

          Launchpad bug id: 985828

          ratzpo Rasmus Johansson (Inactive) added a comment - Launchpad bug id: 985828

          People

            sanja Oleksandr Byelkin
            sebastienrobin Sebastien Robin (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 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.