Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
5.5.47, 10.1.9, 10.1.10, 5.5(EOL), 10.0(EOL), 10.1(EOL)
-
Ubuntu 14.04.3 LTS, VM with 10GB RAM
-
5.5.48-0
Description
Tested on MySQL 5.5.29 as well as MariaDB 10.0.21, bug not present. The explain returns the desired result (56 rows).
The bug is easily reproducible on MariaDB 10.1 by running the attached explain_bug.sql script on any test database. All it does is create 2 empty tables and running an explain.
The result is
ERROR 5 (HY000) at line 79 in file: '/home/tnguyen/explailn_bug.sql': Out of memory (Needed 5784 bytes)
|
MySQL error log:
2016-01-25 16:47:45 139975536690944 [ERROR] mysqld: Out of memory (Needed 5784 bytes)
|
2016-01-25 16:47:45 139975536690944 [ERROR] Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space
|
ulimit -a:
core file size (blocks, -c) 0
|
data seg size (kbytes, -d) unlimited
|
scheduling priority (-e) 0
|
file size (blocks, -f) unlimited
|
pending signals (-i) 47584
|
max locked memory (kbytes, -l) 64
|
max memory size (kbytes, -m) unlimited
|
open files (-n) 1024
|
pipe size (512 bytes, -p) 8
|
POSIX message queues (bytes, -q) 819200
|
real-time priority (-r) 0
|
stack size (kbytes, -s) 8192
|
cpu time (seconds, -t) unlimited
|
max user processes (-u) 47584
|
virtual memory (kbytes, -v) unlimited
|
file locks (-x) unlimited
|
syslog:
nothing
This bug is causing previously working ETL code to fail after a database upgrade, even though we don't have any real memory issue as it was working fine on older db versions.
Also attached the same my.cnf that I used to test on 10.0.21 and 10.1.9 & 10.1.10.
Attachments
- explain_bug.sql
- 15 kB
- my.cnf
- 5 kB
Activity
Thanks for your prompt reply and bug confirmation. Note that I have a pretty basic installation of MariaDB 10.0.21 which is not affected by this bug for some reason:
Welcome to the MariaDB monitor. Commands end with ; or \g.
|
Your MariaDB connection id is 219
|
Server version: 10.0.21-MariaDB-1~trusty-log mariadb.org binary distribution
|
|
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
|
|
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
|
|
MariaDB [(none)]> use sandbox2;
|
Database changed
|
MariaDB [sandbox2]> \. /home/tnguyen/UNPTEST.sql
|
Query OK, 0 rows affected (0.02 sec)
|
|
Query OK, 0 rows affected (0.03 sec)
|
|
+------+-------------+-------------+------+---------------+------+---------+--------------------------------------------------------------+------+----------------------------------------------+
|
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
|
+------+-------------+-------------+------+---------------+------+---------+--------------------------------------------------------------+------+----------------------------------------------+
|
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | Using filesort |
|
| 1 | PRIMARY | <derived3> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived4> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived5> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived6> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived7> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived8> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived9> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived10> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived11> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived12> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived13> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived14> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived15> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived16> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived17> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived18> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived19> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived20> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived21> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived22> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived23> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived24> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived25> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived26> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived27> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived28> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 1 | PRIMARY | <derived29> | ref | key0 | key0 | 60 | A.RECEIVABLE_GROUP,A.DIVISION,A.CLIENT_NUMBER,A.CREDIT_LIMIT | 2 | Using where |
|
| 29 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 28 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 27 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 26 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 25 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 24 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 23 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 22 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 21 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 20 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 19 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 18 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 17 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 16 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 15 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 14 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 13 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 12 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 11 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 10 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 9 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 8 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 7 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 6 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 5 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 4 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 3 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using temporary; Using filesort |
|
| 2 | DERIVED | UNPTEST1 | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Using filesort |
|
+------+-------------+-------------+------+---------------+------+---------+--------------------------------------------------------------+------+----------------------------------------------+
|
56 rows in set (0.01 sec)
|
Note that I have a pretty basic installation of MariaDB 10.0.21 which is not affected by this bug for some reason
This is because the mentioned revision, from which the problem started, was a part of 10.0.23. Previous releases are not affected.
in sql_yacc.yy:
if (!sel->next_select())
|
$2->select_n_where_fields+=
|
sel->select_n_where_fields;
|
actually add items of the same SELECT, that is an error.
revision-id: d8c50ced2bd14fcec3378fa5a6c3032d3b099ce7 (mariadb-5.5.47-26-gd8c50ce)
parent(s): f66d01610f713a76f38de650464bfaea476b9f32
committer: Oleksandr Byelkin
timestamp: 2016-02-03 17:15:22 +0100
message:
MDEV-9462: Out of memory using explain on 2 empty tables
Fixed adding derived tables items to outer one.
—
OOM happened because instead of adding number of items from derived table it doubled number of items in main SELECT for each derived table (wrong SELECT_LEX was taken).
tnguyen,
thank you for the report and the test case.
Reproducible on current 5.5, 10.0, 10.1. The problem was introduced in 5.5.47 with the following revision:
commit 7e4da9b370d032db9015adb47ad2ff585aeaea5d
Author: Oleksandr Byelkin <sanja@mariadb.com>
Date: Fri Nov 6 16:36:41 2015 +0100
DEV-8632 Segmentation fault on INSERT
View/derived fields should be taken into account when we build ref_pointer_array constructed.
DBUG_ASSERTs added to avoid memory overrun.
MTR-like test case (same contents as in the attachment)
CREATE TABLE `UNPTEST` (
`REC_GROUP` char(2) DEFAULT NULL,
`CLIENT_INFO` text CHARACTER SET utf8,
`NAME` text,
`PHONE_NUMBER` text,
`ATTENTION_NAME` text,
`PAYMENT_TERM` text CHARACTER SET utf8,
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
`LAST_PAY_DATE` text CHARACTER SET utf8,
`TOTAL` double DEFAULT NULL,
`TOTAL_MCL` double DEFAULT NULL,
`TOTAL_MFS` double DEFAULT NULL,
`TOTAL_MIS` double DEFAULT NULL,
`BEFORE_DUE_7_MCL` double DEFAULT NULL,
`BEFORE_DUE_7_MFS` double DEFAULT NULL,
`BEFORE_DUE_7_MIS` double DEFAULT NULL,
`PER1_MCL` double DEFAULT NULL,
`PER1_MFS` double DEFAULT NULL,
`PER1_MIS` double DEFAULT NULL,
`PER2_MCL` double DEFAULT NULL,
`PER2_MFS` double DEFAULT NULL,
`PER2_MIS` double DEFAULT NULL,
`PER3_MCL` double DEFAULT NULL,
`PER3_MFS` double DEFAULT NULL,
`PER3_MIS` double DEFAULT NULL,
`PER4_MCL` double DEFAULT NULL,
`PER4_MFS` double DEFAULT NULL,
`PER4_MIS` double DEFAULT NULL,
`PER5_MCL` double DEFAULT NULL,
`PER5_MFS` double DEFAULT NULL,
`PER5_MIS` double DEFAULT NULL,
`PER6_MCL` double DEFAULT NULL,
`PER6_MFS` double DEFAULT NULL,
`PER6_MIS` double DEFAULT NULL,
`PER7_MCL` double DEFAULT NULL,
`PER7_MFS` double DEFAULT NULL,
`PER7_MIS` double DEFAULT NULL,
`BEFORE_DUE_7` double DEFAULT NULL,
`PER1` double DEFAULT NULL,
`PER2` double DEFAULT NULL,
`PER3` double DEFAULT NULL,
`PER4` double DEFAULT NULL,
`PER5` double DEFAULT NULL,
`PER6` double DEFAULT NULL,
`PER7` double DEFAULT NULL,
`REF` varchar(30) DEFAULT NULL,
`TYPE` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL
) DEFAULT CHARSET=latin1;
CREATE TABLE `UNPTEST1` (
`RECEIVABLE_GROUP` char(2) DEFAULT NULL,
`CLIENT_NUMBER` varchar(35) DEFAULT NULL,
`CLIENT_NAME` varchar(73) DEFAULT NULL,
`PHONE_NUMBER` char(12) DEFAULT NULL,
`ATTENTION_NAME` char(26) DEFAULT NULL,
`PAYMENT_TERM` varchar(26) CHARACTER SET utf8 DEFAULT NULL,
`CREDIT_LIMIT` decimal(12,2) DEFAULT NULL,
`LAST_PAY_DATE` varchar(42) CHARACTER SET utf8 DEFAULT NULL,
`TOTAL` decimal(12,2) DEFAULT NULL,
`BEFORE_DUE_7` decimal(12,2) DEFAULT NULL,
`PER1` decimal(12,2) DEFAULT NULL,
`PER2` decimal(12,2) DEFAULT NULL,
`PER3` decimal(12,2) DEFAULT NULL,
`PER4` decimal(12,2) DEFAULT NULL,
`PER5` decimal(12,2) DEFAULT NULL,
`PER6` decimal(12,2) DEFAULT NULL,
`PER7` decimal(12,2) DEFAULT NULL,
`DIVISION` varchar(3) CHARACTER SET utf8 NOT NULL,
`CLIENT_INFO` varchar(294) CHARACTER SET utf8 DEFAULT NULL,
`EXCHANGE_RATE` double NOT NULL,
`REF` varchar(30) DEFAULT NULL
) DEFAULT CHARSET=latin1;
SELECT A.RECEIVABLE_GROUP,A.CLIENT_INFO,A.CLIENT_NAME,A.PHONE_NUMBER,A.ATTENTION_NAME,A.PAYMENT_TERM,A.CREDIT_LIMIT,A.LAST_PAY_DATE,A.TOTAL,
COALESCE(B.TOTAL_MCL,0) AS TOTAL_MCL,
COALESCE(C.TOTAL_MFS,0) AS TOTAL_MFS,
COALESCE(D.TOTAL_MIS,0) AS TOTAL_MIS,
COALESCE(F.BEFORE_DUE_7_MCL,0) AS BEFORE_DUE_7_MCL,
COALESCE(G.BEFORE_DUE_7_MFS,0) AS BEFORE_DUE_7_MFS,
COALESCE(H.BEFORE_DUE_7_MIS,0) AS BEFORE_DUE_7_MIS,
COALESCE(I.PER1_MCL,0) AS PER1_MCL,
COALESCE(J.PER1_MFS,0) AS PER1_MFS,
COALESCE(K.PER1_MIS,0) AS PER1_MIS,
COALESCE(L.PER2_MCL,0) AS PER2_MCL,
COALESCE(M.PER2_MFS,0) AS PER2_MFS,
COALESCE(N.PER2_MIS,0) AS PER2_MIS,
COALESCE(O.PER3_MCL,0) AS PER3_MCL,
COALESCE(P.PER3_MFS,0) AS PER3_MFS,
COALESCE(R.PER3_MIS,0) AS PER3_MIS,
COALESCE(S.PER4_MCL,0) AS PER4_MCL,
COALESCE(T.PER4_MFS,0) AS PER4_MFS,
COALESCE(U.PER4_MIS,0) AS PER4_MIS,
COALESCE(V.PER5_MCL,0) AS PER5_MCL,
COALESCE(X.PER5_MFS,0) AS PER5_MFS,
COALESCE(Z.PER5_MIS,0) AS PER5_MIS,
COALESCE(Q.PER6_MCL,0) AS PER6_MCL,
COALESCE(Y.PER6_MFS,0) AS PER6_MFS,
COALESCE(W.PER6_MIS,0) AS PER6_MIS,
COALESCE(A1.PER7_MCL,0) AS PER7_MCL,
COALESCE(B1.PER7_MFS,0) AS PER7_MFS,
COALESCE(C1.PER7_MIS,0) AS PER7_MIS,
A.BEFORE_DUE_7,A.PER1,A.PER2,A.PER3,A.PER4,A.PER5,A.PER6,A.PER7,
CONCAT(A.DIVISION,'-',A.CLIENT_NUMBER) AS REF,"2" AS TYPE FROM
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,
GROUP_CONCAT(DISTINCT CLIENT_INFO SEPARATOR '<br>') AS CLIENT_INFO,
GROUP_CONCAT(DISTINCT CLIENT_NAME SEPARATOR '<br>') AS CLIENT_NAME,
GROUP_CONCAT( DISTINCT `PHONE_NUMBER` SEPARATOR '<br>' ) AS PHONE_NUMBER ,
GROUP_CONCAT( DISTINCT `ATTENTION_NAME` SEPARATOR '<br>' ) AS ATTENTION_NAME,
GROUP_CONCAT( DISTINCT `PAYMENT_TERM` SEPARATOR '<br>' ) AS PAYMENT_TERM,
CREDIT_LIMIT ,
GROUP_CONCAT( `LAST_PAY_DATE` SEPARATOR '<br>' ) AS LAST_PAY_DATE,
SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL,
SUM( `BEFORE_DUE_7`*EXCHANGE_RATE ) AS BEFORE_DUE_7,
SUM( `PER1`*EXCHANGE_RATE ) AS PER1,
SUM( `PER2`*EXCHANGE_RATE ) AS PER2,
SUM( `PER3`*EXCHANGE_RATE ) AS PER3,
SUM( `PER4`*EXCHANGE_RATE ) AS PER4,
SUM( `PER5`*EXCHANGE_RATE ) AS PER5,
SUM( `PER6`*EXCHANGE_RATE ) AS PER6,
SUM( `PER7`*EXCHANGE_RATE ) AS PER7
FROM `UNPTEST1`
WHERE REF IS NULL GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B ON A.CLIENT_NUMBER=B.CLIENT_NUMBER AND
A.DIVISION=B.DIVISION AND A.RECEIVABLE_GROUP=B.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C ON A.CLIENT_NUMBER=C.CLIENT_NUMBER
AND
A.DIVISION=C.DIVISION AND A.RECEIVABLE_GROUP=C.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( `TOTAL`*EXCHANGE_RATE ) AS TOTAL_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS D ON A.CLIENT_NUMBER=D.CLIENT_NUMBER AND
A.DIVISION=D.DIVISION AND A.RECEIVABLE_GROUP=D.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=D.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS F ON A.CLIENT_NUMBER=F.CLIENT_NUMBER AND
A.DIVISION=F.DIVISION AND A.RECEIVABLE_GROUP=F.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=F.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS G ON A.CLIENT_NUMBER=G.CLIENT_NUMBER AND
A.DIVISION=G.DIVISION AND A.RECEIVABLE_GROUP=G.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=G.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( BEFORE_DUE_7*EXCHANGE_RATE ) AS BEFORE_DUE_7_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS H ON A.CLIENT_NUMBER=H.CLIENT_NUMBER AND
A.DIVISION=H.DIVISION AND A.RECEIVABLE_GROUP=H.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=H.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS I ON A.CLIENT_NUMBER=I.CLIENT_NUMBER AND
A.DIVISION=I.DIVISION AND A.RECEIVABLE_GROUP=I.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=I.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS J ON A.CLIENT_NUMBER=J.CLIENT_NUMBER AND
A.DIVISION=J.DIVISION AND A.RECEIVABLE_GROUP=J.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=J.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER1*EXCHANGE_RATE ) AS PER1_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS K ON A.CLIENT_NUMBER=K.CLIENT_NUMBER AND
A.DIVISION=K.DIVISION AND A.RECEIVABLE_GROUP=K.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=K.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS L ON A.CLIENT_NUMBER=L.CLIENT_NUMBER AND
A.DIVISION=L.DIVISION AND A.RECEIVABLE_GROUP=L.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=L.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS M ON A.CLIENT_NUMBER=M.CLIENT_NUMBER AND
A.DIVISION=M.DIVISION AND A.RECEIVABLE_GROUP=M.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=M.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER2*EXCHANGE_RATE ) AS PER2_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS N ON A.CLIENT_NUMBER=N.CLIENT_NUMBER AND
A.DIVISION=N.DIVISION AND A.RECEIVABLE_GROUP=N.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=N.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS O ON A.CLIENT_NUMBER=O.CLIENT_NUMBER AND
A.DIVISION=O.DIVISION AND A.RECEIVABLE_GROUP=O.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=O.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS P ON A.CLIENT_NUMBER=P.CLIENT_NUMBER AND
A.DIVISION=P.DIVISION AND A.RECEIVABLE_GROUP=P.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=P.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER3*EXCHANGE_RATE ) AS PER3_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS R ON A.CLIENT_NUMBER=R.CLIENT_NUMBER AND
A.DIVISION=R.DIVISION AND A.RECEIVABLE_GROUP=R.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=R.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS S ON A.CLIENT_NUMBER=S.CLIENT_NUMBER AND
A.DIVISION=S.DIVISION AND A.RECEIVABLE_GROUP=S.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=S.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS T ON A.CLIENT_NUMBER=T.CLIENT_NUMBER AND
A.DIVISION=T.DIVISION AND A.RECEIVABLE_GROUP=T.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=T.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER4*EXCHANGE_RATE ) AS PER4_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS U ON A.CLIENT_NUMBER=U.CLIENT_NUMBER AND
A.DIVISION=U.DIVISION AND A.RECEIVABLE_GROUP=U.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=U.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS V ON A.CLIENT_NUMBER=V.CLIENT_NUMBER AND
A.DIVISION=V.DIVISION AND A.RECEIVABLE_GROUP=V.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=V.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS X ON A.CLIENT_NUMBER=X.CLIENT_NUMBER AND
A.DIVISION=X.DIVISION AND A.RECEIVABLE_GROUP=X.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=X.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER5*EXCHANGE_RATE ) AS PER5_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Z ON A.CLIENT_NUMBER=Z.CLIENT_NUMBER AND
A.DIVISION=Z.DIVISION AND A.RECEIVABLE_GROUP=Z.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Z.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Q ON A.CLIENT_NUMBER=Q.CLIENT_NUMBER AND
A.DIVISION=Q.DIVISION AND A.RECEIVABLE_GROUP=Q.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Q.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS Y ON A.CLIENT_NUMBER=Y.CLIENT_NUMBER AND
A.DIVISION=Y.DIVISION AND A.RECEIVABLE_GROUP=Y.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=Y.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER6*EXCHANGE_RATE ) AS PER6_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS W ON A.CLIENT_NUMBER=W.CLIENT_NUMBER AND
A.DIVISION=W.DIVISION AND A.RECEIVABLE_GROUP=W.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=W.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MCL
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MCL" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS A1 ON A.CLIENT_NUMBER=A1.CLIENT_NUMBER AND
A.DIVISION=A1.DIVISION AND A.RECEIVABLE_GROUP=A1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=A1.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MFS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MFS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS B1 ON A.CLIENT_NUMBER=B1.CLIENT_NUMBER AND
A.DIVISION=B1.DIVISION AND A.RECEIVABLE_GROUP=B1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=B1.CREDIT_LIMIT
LEFT JOIN
(SELECT RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT,SUM( PER7*EXCHANGE_RATE ) AS PER7_MIS
FROM `UNPTEST1`
WHERE REF IS NULL AND DIVISION="MIS" GROUP BY RECEIVABLE_GROUP,DIVISION,CLIENT_NUMBER,CREDIT_LIMIT) AS C1 ON A.CLIENT_NUMBER=C1.CLIENT_NUMBER AND
A.DIVISION=C1.DIVISION AND A.RECEIVABLE_GROUP=C1.RECEIVABLE_GROUP AND A.CREDIT_LIMIT=C1.CREDIT_LIMIT
ORDER BY TOTAL DESC;
DROP TABLE UNPTEST, UNPTEST1;