This is an automated email from the ASF dual-hosted git repository.

struberg pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/openjpa.git

commit 0fc957a02be3c4ad2f862f1424e56717b0887917
Author: Mark Struberg <strub...@apache.org>
AuthorDate: Tue Apr 6 22:30:10 2021 +0200

    OPENJPA-2861 fix Raw handling
    
    Raw did loose the internal type. Once 'interned' to Raw the type was always 
String.class.
    And this broke quite a few return type situations in quite a nasty way.
---
 .../jdbc/kernel/exps/JDBCExpressionFactory.java    | 20 +----------
 .../org/apache/openjpa/jdbc/kernel/exps/Lit.java   | 40 +++++++++++++---------
 .../openjpa/jira1794/TestAggregateFunctions.java   |  2 --
 .../expressions/TestJPQLScalarExpressions.java     |  2 +-
 4 files changed, 25 insertions(+), 39 deletions(-)

diff --git 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
index a7887fa..fbb2732 100644
--- 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
+++ 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
@@ -26,7 +26,6 @@ import org.apache.openjpa.jdbc.meta.Discriminator;
 import org.apache.openjpa.jdbc.meta.strats.NoneDiscriminatorStrategy;
 import org.apache.openjpa.jdbc.meta.strats.VerticalClassStrategy;
 import org.apache.openjpa.jdbc.sql.DBDictionary;
-import org.apache.openjpa.jdbc.sql.Raw;
 import org.apache.openjpa.kernel.exps.AggregateListener;
 import org.apache.openjpa.kernel.exps.Arguments;
 import org.apache.openjpa.kernel.exps.Expression;
@@ -578,24 +577,7 @@ public class JDBCExpressionFactory
     private Value getLiteralRawString(Value val) {
         if (val instanceof Lit) {
             Lit lit = (Lit) val;
-            StringBuilder value = new StringBuilder();
-            int pType = lit.getParseType();
-            if (pType == Literal.TYPE_SQ_STRING ||
-                pType == Literal.TYPE_STRING)
-                
value.append("'").append(lit.getValue().toString()).append("'");
-            else if (pType == Literal.TYPE_BOOLEAN) {
-                Boolean boolVal = (Boolean)lit.getValue();
-                if (_isBooleanLiteralAsNumeric)
-                    value.append(boolVal ? "1" : "0");
-                else
-                    value.append(boolVal ? "true" : "false");
-            } else if (pType == Literal.TYPE_ENUM) {
-                lit.setRaw(true);
-                return val;
-            } else
-                value.append(lit.getValue().toString());
-            lit.setValue(new Raw(value.toString()));
-            return lit;
+            lit.setRaw(true);
         }
         return val;
     }
diff --git 
a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java 
b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
index a0ed1bc..1323b54 100644
--- a/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
+++ b/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Lit.java
@@ -39,7 +39,6 @@ public class Lit
     private Object _val;
     private int _ptype;
     private boolean _isRaw;
-    private Object _rawVal;
 
     /**
      * Constructor. Supply literal value.
@@ -54,9 +53,10 @@ public class Lit
 
     @Override
     public Class getType() {
-        if (_isRaw && _rawVal != null)
-            return Raw.class;
-        return (_val == null) ? Object.class : _val.getClass();
+        if (_val == null) {
+            return Object.class;
+        }
+        return _val.getClass();
     }
 
     @Override
@@ -92,10 +92,6 @@ public class Lit
         _isRaw = isRaw;
     }
 
-    public Object getRawValue() {
-        return _rawVal;
-    }
-
     @Override
     public ExpState initialize(Select sel, ExpContext ctx, int flags) {
         return new LitExpState();
@@ -112,8 +108,7 @@ public class Lit
     }
 
     @Override
-    public void calculateValue(Select sel, ExpContext ctx, ExpState state,
-        Val other, ExpState otherState) {
+    public void calculateValue(Select sel, ExpContext ctx, ExpState state, Val 
other, ExpState otherState) {
         super.calculateValue(sel, ctx, state, other, otherState);
         LitExpState lstate = (LitExpState) state;
         if (other != null) {
@@ -124,8 +119,7 @@ public class Lit
     }
 
     @Override
-    public void appendTo(Select sel, ExpContext ctx, ExpState state,
-        SQLBuffer sql, int index) {
+    public void appendTo(Select sel, ExpContext ctx, ExpState state, SQLBuffer 
sql, int index) {
         LitExpState lstate = (LitExpState) state;
         if (lstate.otherLength > 1) {
             sql.appendValue(((Object[]) lstate.sqlValue)[index], 
lstate.getColumn(index));
@@ -133,7 +127,21 @@ public class Lit
             return;
         } else if (_isRaw) {
             int parseType = getParseType();
-            if (parseType == Literal.TYPE_ENUM) {
+            if (parseType == Literal.TYPE_SQ_STRING || parseType == 
Literal.TYPE_STRING) {
+                lstate.sqlValue = new Raw("'" + _val.toString() + "'");
+            } else if (parseType == Literal.TYPE_BOOLEAN) {
+                Boolean boolVal = (Boolean)_val;
+                Object dbRepresentation = 
ctx.store.getDBDictionary().getBooleanRepresentation().getRepresentation(boolVal);
+                if (dbRepresentation instanceof String) {
+                    lstate.sqlValue = new Raw("'" + 
dbRepresentation.toString() + "'");
+                } else if (dbRepresentation instanceof Boolean ||
+                           dbRepresentation instanceof Integer) {
+                    lstate.sqlValue = new Raw(dbRepresentation.toString());
+                } else {
+                    // continue without Raw
+                    lstate.sqlValue = _val;
+                }
+            } else if (parseType == Literal.TYPE_ENUM) {
                 StringBuilder value = new StringBuilder();
                 boolean isOrdinal = false;
                 if (lstate.sqlValue instanceof Integer)
@@ -144,18 +152,16 @@ public class Lit
                 if (!isOrdinal)
                     value.append("'");
                 lstate.sqlValue = new Raw(value.toString());
-                _rawVal = lstate.sqlValue;
             } else if (parseType == Literal.TYPE_DATE || parseType == 
Literal.TYPE_TIME ||
                 parseType == Literal.TYPE_TIMESTAMP) {
                 lstate.sqlValue = new Raw(_val.toString());
-                _rawVal = lstate.sqlValue;
+            } else if (parseType == Literal.TYPE_NUMBER) {
+                lstate.sqlValue = new Raw(_val.toString());
             } else {
                 lstate.sqlValue = new Raw(_val instanceof String ? 
"'"+_val+"'" : _val.toString());
-                _rawVal = lstate.sqlValue;
             }
         }
         Object useLiteral = 
ctx.fetch.getHint(QueryHints.HINT_USE_LITERAL_IN_SQL);
-//        useLiteral = true;
         boolean useParamToken = useLiteral != null ? !(Boolean)useLiteral : 
true;
         sql.appendValue(lstate.sqlValue, lstate.getColumn(index), null, 
useParamToken);
     }
diff --git 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
index b1cb054..9225d28 100644
--- 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
+++ 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/jira1794/TestAggregateFunctions.java
@@ -111,12 +111,10 @@ public class TestAggregateFunctions extends 
SingleEMFTestCase {
         em.persist(ae2);
         em.getTransaction().commit();
 
-/*X
         em.getTransaction().begin();
         final TypedQuery<Long> q2 = em.createQuery("select SUM(ae.intVal) from 
AggEntity AS ae", Long.class);
         final Long sum = q2.getSingleResult();
         assertEquals(2L, (long) sum);
-*/
 
         final TypedQuery<Long> q = em.createQuery("select SUM(CASE 
ae.stringVal WHEN 'bare' THEN 1 ELSE 0 END) from AggEntity AS ae", Long.class);
         final Long sumC = q.getSingleResult();
diff --git 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
index 7aacca6..597b947 100644
--- 
a/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
+++ 
b/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jpql/expressions/TestJPQLScalarExpressions.java
@@ -319,7 +319,7 @@ public class TestJPQLScalarExpressions extends 
AbstractTestCase {
         List rs3 = em.createQuery(query3).getResultList();
         Object[] result3 = (Object[]) rs3.get(0);
         assertEquals("the name is not Jacob", "Jacob", result3[0]);
-        assertEquals("the credit rating is not 'POOR'", "POOR", result3[1]);
+        assertEquals("the credit rating is not 'POOR'", 
CompUser.CreditRating.POOR, result3[1]);
 
         String update2 = "update CompUser c set c.creditRating = " +
             " CASE WHEN c.name ='Jacob' THEN " +

Reply via email to