From 370c205e171b02a091c85660412b13a2d2053e4f Mon Sep 17 00:00:00 2001 From: Heng Sin Low Date: Fri, 5 Oct 2007 03:56:08 +0000 Subject: [PATCH] [ 1807657 ] MProduct.afterSave() throws SQL Error in Postgres --- .../compiere/dbPort/Convert_PostgreSQL.java | 7 ++++++- .../dbPort/Convert_PostgreSQLTest.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/base/src/org/compiere/dbPort/Convert_PostgreSQL.java b/base/src/org/compiere/dbPort/Convert_PostgreSQL.java index 6968bc6cac..be19ffdad3 100644 --- a/base/src/org/compiere/dbPort/Convert_PostgreSQL.java +++ b/base/src/org/compiere/dbPort/Convert_PostgreSQL.java @@ -507,12 +507,13 @@ public class Convert_PostgreSQL extends Convert_SQL92 { String joinFields = null; String joinFromClause = null; int joinFromClauseStart = 0; + open = -1; for (int i = 0; i < subQuery.length(); i++) { char c = subQuery.charAt(i); if (Character.isWhitespace(c)) { - if (token.length() > 0) + if (token.length() > 0 && open < 0) { if ("FROM".equalsIgnoreCase(previousToken)) { @@ -546,6 +547,10 @@ public class Convert_PostgreSQL extends Convert_SQL92 { (previousToken != null && previousToken.toUpperCase().endsWith("SELECT")))) joinFieldsBegin = i; } + else if (c == '(') + open++; + else if (c == ')') + open--; token.append(c); } } diff --git a/base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java b/base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java index fcbd0fd086..fe1bb2a7f5 100644 --- a/base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java +++ b/base/src/org/compiere/dbPort/Convert_PostgreSQLTest.java @@ -28,6 +28,25 @@ public final class Convert_PostgreSQLTest extends TestCase{ public Convert_PostgreSQLTest() {} + public void test1807657() { + sql = "UPDATE A_Asset a " + + "SET (Name, Description)=" + + "(SELECT SUBSTR((SELECT bp.Name FROM C_BPartner bp WHERE bp.C_BPartner_ID=a.C_BPartner_ID) || ' - ' || p.Name,1,60), p.Description " + + "FROM M_Product p " + + "WHERE p.M_Product_ID=a.M_Product_ID) " + + "WHERE IsActive='Y' " + + "AND M_Product_ID=0"; + + sqe = "UPDATE A_Asset " + + "SET Name=SUBSTR((SELECT bp.Name FROM C_BPartner bp WHERE bp.C_BPartner_ID=A_Asset.C_BPartner_ID) || ' - ' || p.Name,1,60)," + + "Description=p.Description " + + "FROM M_Product p " + + "WHERE p.M_Product_ID=A_Asset.M_Product_ID " + + "AND A_Asset.IsActive='Y' AND A_Asset.M_Product_ID=0"; + + r = convert.convert(sql); + assertEquals(sqe, r[0]); + } public void test1751966() { sql = "UPDATE I_ReportLine i " + "SET (Description, SeqNo, IsSummary, IsPrinted, LineType, CalculationType, AmountType, PostingType)="