I'm the lead developer of the Mondrian ROLAP server, and I confess that
Mondrian generates SQL just like this too. The SQL is unpleasant, but when
you want to 'join' a large array of values in memory to a database table,
the SQL language doesn't present any better alternatives. Writing the values
to a temp table and joining to that is not practical in a connection-pooled
environment. It would be nice to say 'x in (?1)' where ?1 is a bind variable
which holds a list of integers, but this is not widely supported, even if it
is valid.
 
If it's any consolation, other DBMSes that Mondrian runs on have problems
with large IN lists too. Oracle refuses to accept an IN list with more than
1,000 elements, and for DB2 the practical limit is 5,000.
 
The reality is that a lot of modern SQL is generated by stupid tools such as
Mondrian, and generated SQL often has different patterns than hand-written
SQL. Ideally Derby would recognize and optimize these patterns. In this
case, one implementation strategy would be to recognise such a construct and
implement internally as a join to an 'inline table'. But I don't expect
miracles, and I'm not holding my breath. :)
 
Julian


  _____  

From: Michael Segel [mailto:[EMAIL PROTECTED] On Behalf Of [EMAIL PROTECTED]
Sent: Wednesday, November 15, 2006 5:29 AM
To: 'Derby Discussion'
Subject: RE: Large IN clause produces server error



Ok.

Sigh.

 

It's early in the morning and I haven't had my first cup of coffee.

 

If we were in the same office, I'd roll up the C section of the WSJ and
politely bop you on the head saying "Bad boy! Bad boy! Did you do this?"

 

This is yet another example of a maxim :

"Just because you can write code that is syntactically correct, doesn't mean
it's a good idea."

 

Now I realize that you're writing a unit test case, but what would be the
*USE CASE*  that would cause this type of query to be written?

Of course I'm assuming that you're testing a section of code that is
dynamically written.

 

If the numbers are static, then you should be able to write a fact table and
then write a sub query for the NOT IN clause.

 

If the values are in a range, or a set of ranges you can use the '<' or '>'
comparators. (Not to mention the combination with the '=' too. ;-)

 

If this is more than just a "hypothetical" possibility, then I'd go back to
the developer and tell them to think more about what it is they are doing
and write better code.

 

I believe that there is a problem with how derby handles the IN clause, but
this goes beyond that.

 

Sorry, HTH

 

 


  _____  


From: Robert Enyedi [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, November 15, 2006 2:47 AM
To: Derby Discussion
Subject: Re: Large IN clause produces server error

 

The query from the attached log file is:



UPDATE task_config_permission SET default_value=NULL
WHERE task_type_id IN (SELECT id FROM task_type WHERE proj_id=?)
AND CAST(default_value AS INTEGER) NOT
IN(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27
,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,
53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,7
8,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102
,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121
,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140
,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178
,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197
,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216
,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235
,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254
,255,256,257,258,259,260,261,262,263,2
64,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,2
83,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,3
02,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,3
21,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,3
40,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,3
59,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,3
78,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,3
97,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,4
16,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,4
35,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,4
54,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,4
73,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,4
92,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,5
11
,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530
,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549
,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568
,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587
,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606
,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625
,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644
,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663
,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682
,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701
,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720
,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739
,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758
,7
59,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,7
78,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,7
97,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,8
16,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,8
35,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,8
54,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,8
73,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,8
92,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,9
11,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,9
30,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,9
49,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,9
68,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,9
87,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,
10
05,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,102
0,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035
,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,
1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1
066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,10
81,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,109
6,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111
,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,
1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1
142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,11
57,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,117
2,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187
,1188,1189,1190,1191,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,
12
03,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,121
8,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1232,1233
,1234,1235,1236,1237,1238,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,
1249,1250,1251,1252,1253,1254,1255,1256,1257,1258,1259,1260,1261,1262,1263,1
264,1265,1266,1267,1268,1269,1270,1271,1272,1273,1274,1275,1276,1277,1278,12
79,1280,1281,1282,1283,1284,1285,1286,1287,1288,1289,1290,1291,1292,1293,129
4,1295,1296,1297,1298,1299,1300,1301,1302,1303,1304,1305,1306,1307,1308,1309
,1310,1311,1312,1313,1314,1315,1316,1317,1318,1319,1320,1321,1322,1323,1324,
1325,1326,1327,1328,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1
340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,13
55,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,1367,1368,1369,137
0,1371,1372,1373,1374,1375,1376,1377,1378,1379,1380,1381,1382,1383,1384,1385
,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,
14
01,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,141
6,1417,1418,1419,1420,1421,1422,1423,1424,1425,1426,1427,1428,1429,1430,1431
,1432,1433,1434,1435,1436,1437,1438,1439,1440,1441,1442,1443,1444,1445,1446,
1447,1448,1449,1450,1451,1452,1453,1454,1455,1456,1457,1458,1459,1460,1461,1
462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1476,14
77,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,149
2,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507
,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,
1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1
538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,15
53,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,156
8,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583
,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,
15
99,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,161
4,1615,1616,1617,1618,1619,1620,1621,1622,1623,1624,1625,1626,1627,1628,1629
,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641,1642,1643,1644,
1645,1646,1647,1648,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1
660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,16
75,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,169
0,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705
,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,
1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1
736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1748,1749,1750,17
51,1752,1753,1754,1755,1756,1757,1758,1759,1760,1761,1762,1763,1764,1765,176
6,1767,1768,1769,1770,1771,1772,1773,1774,1775,1776,1777,1778,1779,1780,1781
,1782,1783,1784,1785,1786,1787,1788,1789,1790,1791,1792,1793,1794,1795,1796,
17
97,1798,1799) AND label_id IN(5,32)

I'm not saying that this is efficient. This is a unit test which takes
things a little bit to the extreme, but nevertheless this scenario might
happen. Altering the query and the logic behind it is not really an option
at this point so I would be more interested, first of all, for the query not
to fail. Please note that the query does not fail on MySQL 4.1 and Oracle
10.

Regards,
Robert

Michael Segel wrote: 

Can you provide the query?
1800 items in an IN clause? 
That doesn't sound right or efficient.
 
Why not use a subselect?
 
  

-----Original Message-----
From: Robert Enyedi [mailto:[EMAIL PROTECTED]
Sent: Tuesday, November 14, 2006 9:51 AM
To: Derby Discussion
Subject: Large IN clause produces server error
 
In the attached JUnit error log one can see that for an query containing
an IN clause with 1800 items, Derby generates the following error:
 
java.sql.SQLException: Statement too complex. Try rewriting the query to
remove complexity. Eliminating many duplicate expressions or breaking up
the query and storing interim results in a temporary table can often
help resolve this error. SQLSTATE: XBCM4: Java class file format
limit(s) exceeded: method:e4 code_length (134022 > 65535) in generated
class org.apache.derby.exe.ac8dd747d7x010exe6b4x4757x0000000d8160183.
 
If rewriting the query is not an option, what alternatives are there to
overcome this limitation?
 
Regards,
Robert
    

 
 
 
  

 

Reply via email to