regression in sql queries using sub queries (with order by)
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
MariaDB |
Won't Fix
|
Low
|
Oleksandr "Sanja" Byelkin |
Bug Description
# Since mariadb version 5.3.3, I do have regression with sql queries using
# sub queries (with order by) and user variables. Theses queries just worked
# fine since many months/years, and they now return wrong result. May be
# it's just me doing something that's not supposed to work. I include here
# detailed explanation. Any hint would be highly appreciated
# I wish to parse this stock table in a given order and
# display in the same time a column showing the quantity
# cumulated. So expected result is (with "ORDER BY uid DESC") :
# +-----+
# | uid | quantity | total_quantity |
# +-----+
# | 3 | 4 | 4 |
# | 1 | 2 | 6 |
# +-----+
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,
FROM
stock_table
ORDER BY
# that was giving the expected result for us since a very long time,
# on older version of mariadb and mysql. We were relying on the fact,
# in our usage, that mariadb was always parsing the subquery in the specified
# order. But theses days (5.5.22-
# +-----+
# | uid | quantity | total_quantity |
# +-----+
# | 1 | 2 | 2 |
# | 3 | 4 | 6 |
# +-----+
# we want uid to be 3 then 1
#
# It start failing after we moved from mariadb 5.3.2-beta to 5.3.3-rc
# In the changelog http://
# I see that there is optimization on "useless subquery clauses", it
# could be related.
# Is it expected that the outer query does not read the subquery in
# the order specified by the subquery ?
# Is there a way to solve this problem with mariadb if this is not considered
# as a regression?
Changed in maria: | |
assignee: | Igor Babaev (igorb-seattle) → Oleksandr "Sanja" Byelkin (sanja-byelkin) |
Changed in maria: | |
importance: | Undecided → Low |
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 ;
stock_table. quantity
stock_ table
stock_ table.uid DESC) as q1;
SELECT
q1.*,
@total_quantity := @total_quantity + q1.quantity as total_quantity
FROM (SELECT stock_table.uid,
FROM
ORDER BY
# 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
stock_table. quantity
stock_ table
stock_ table.uid DESC;
SELECT stock_table.uid,
FROM
ORDER BY
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