BF [ 2840157 ] AccessSqlParser is not parsing well ON keyword
https://sourceforge.net/tracker/?func=detail&aid=2840157&group_id=176962&atid=879332
This commit is contained in:
parent
03fd7868a2
commit
ba24e137f0
|
@ -32,6 +32,8 @@ import org.compiere.util.CLogger;
|
||||||
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
* @author Teo Sarca, SC ARHIPAC SERVICE SRL
|
||||||
* <li>BF [ 1652623 ] AccessSqlParser.getTableInfo(String) - tablename parsing bug
|
* <li>BF [ 1652623 ] AccessSqlParser.getTableInfo(String) - tablename parsing bug
|
||||||
* <li>BF [ 1964496 ] AccessSqlParser is not parsing well JOIN CLAUSE
|
* <li>BF [ 1964496 ] AccessSqlParser is not parsing well JOIN CLAUSE
|
||||||
|
* <li>BF [ 2840157 ] AccessSqlParser is not parsing well ON keyword
|
||||||
|
* https://sourceforge.net/tracker/?func=detail&aid=2840157&group_id=176962&atid=879332
|
||||||
*/
|
*/
|
||||||
public class AccessSqlParser
|
public class AccessSqlParser
|
||||||
{
|
{
|
||||||
|
@ -233,6 +235,7 @@ public class AccessSqlParser
|
||||||
from = from.replaceAll("[\r\n\t ]+LEFT[\r\n\t ]+OUTER[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
from = from.replaceAll("[\r\n\t ]+LEFT[\r\n\t ]+OUTER[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
||||||
from = from.replaceAll("[\r\n\t ]+RIGHT[\r\n\t ]+OUTER[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
from = from.replaceAll("[\r\n\t ]+RIGHT[\r\n\t ]+OUTER[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
||||||
from = from.replaceAll("[\r\n\t ]+FULL[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
from = from.replaceAll("[\r\n\t ]+FULL[\r\n\t ]+JOIN[\r\n\t ]+", ", ");
|
||||||
|
from = from.replaceAll("[\r\n\t ]+[Oo][Nn][\r\n\t ]+", ON); // teo_sarca, BF [ 2840157 ]
|
||||||
// Remove ON clause - assumes that there is no IN () in the clause
|
// Remove ON clause - assumes that there is no IN () in the clause
|
||||||
index = from.indexOf(ON);
|
index = from.indexOf(ON);
|
||||||
while (index != -1)
|
while (index != -1)
|
||||||
|
@ -242,7 +245,13 @@ public class AccessSqlParser
|
||||||
if (indexNextOn != -1)
|
if (indexNextOn != -1)
|
||||||
indexClose = from.lastIndexOf(')', indexNextOn);
|
indexClose = from.lastIndexOf(')', indexNextOn);
|
||||||
if (indexClose != -1)
|
if (indexClose != -1)
|
||||||
|
{
|
||||||
|
if (index > indexClose)
|
||||||
|
{
|
||||||
|
throw new IllegalStateException("Could not remove (index="+index+" > indexClose="+indexClose+") - "+from);
|
||||||
|
}
|
||||||
from = from.substring(0, index) + from.substring(indexClose+1);
|
from = from.substring(0, index) + from.substring(indexClose+1);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log.log(Level.SEVERE, "Could not remove ON " + from);
|
log.log(Level.SEVERE, "Could not remove ON " + from);
|
||||||
|
|
|
@ -234,6 +234,35 @@ public class AccessSqlParserTest extends TestCase
|
||||||
assertEquals("AccessSqlParser[C_Invoice,C_BPartner=bp|0]", fixture.toString());
|
assertEquals("AccessSqlParser[C_Invoice,C_BPartner=bp|0]", fixture.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* BF [ 2840157 ] AccessSqlParser is not parsing well ON keyword
|
||||||
|
* <pre>
|
||||||
|
* Following query is generating OutOfMemoryException:
|
||||||
|
* SELECT 1
|
||||||
|
* FROM M_Product p
|
||||||
|
* INNER JOIN M_Product_Category pc on
|
||||||
|
* (pc.M_Product_Category_ID=p.M_Product_Category_ID)
|
||||||
|
* LEFT OUTER JOIN M_Product_PO mpo ON (mpo.M_Product_ID=p.M_Product_ID)
|
||||||
|
*
|
||||||
|
* (please note the lower case "on")
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @see https://sourceforge.net/tracker/?func=detail&aid=2840157&group_id=176962&atid=879332
|
||||||
|
*/
|
||||||
|
public void test_BF2840157()
|
||||||
|
{
|
||||||
|
final String sql =
|
||||||
|
"SELECT 1 FROM M_Product p"
|
||||||
|
+"\n"+"INNER JOIN M_Product_Category pc on (pc.M_Product_Category_ID=p.M_Product_Category_ID)"
|
||||||
|
+"\n"+"LEFT OUTER JOIN M_Product_PO mpo ON (mpo.M_Product_ID=p.M_Product_ID)"
|
||||||
|
+"\n"+" WHERE p.IsActive='Y' AND p.IsPurchased='Y'"
|
||||||
|
+"\n"+"AND COALESCE(mpo.DeliveryTime_Promised,0) <= 0"
|
||||||
|
;
|
||||||
|
final String expected = "AccessSqlParser[M_Product=p,M_Product_Category=pc,M_Product_PO=mpo|0]";
|
||||||
|
AccessSqlParser fixture = new AccessSqlParser(sql);
|
||||||
|
assertEquals(expected, fixture.toString());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*$CPS$ This comment was generated by CodePro. Do not edit it.
|
/*$CPS$ This comment was generated by CodePro. Do not edit it.
|
||||||
|
|
Loading…
Reference in New Issue