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

doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git


The following commit(s) were added to refs/heads/version3 by this push:
     new 1735d4d  EMPIREDB-373 bugfix for DBCommand.clone()
1735d4d is described below

commit 1735d4de88bba6e50242ab2d8e17689df2446bd0
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Feb 15 18:58:19 2022 +0100

    EMPIREDB-373 bugfix for DBCommand.clone()
---
 .../main/java/org/apache/empire/db/DBCommand.java  | 54 +++++++++++++++++-----
 .../empire/db/expr/compare/DBCompareAndOrExpr.java | 10 ++++
 .../empire/db/expr/compare/DBCompareColExpr.java   | 14 ++++++
 .../empire/db/expr/compare/DBCompareExpr.java      |  6 +++
 .../empire/db/expr/compare/DBCompareNotExpr.java   | 14 +++++-
 .../empire/db/expr/compare/DBExistsExpr.java       | 15 +++++-
 .../empire/db/expr/compare/DBParenthesisExpr.java  | 24 ++++++++--
 .../empire/db/expr/join/DBCompareJoinExpr.java     |  2 +-
 .../org/apache/empire/db/expr/set/DBSetExpr.java   | 17 ++++++-
 9 files changed, 135 insertions(+), 21 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java 
b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index 0c9e288..bb6a4bd 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -115,15 +115,32 @@ public abstract class DBCommand extends DBCommandExpr
     protected void resetParamUsage()
     {
         paramUsageCount = 0;
-        // clear subquery params
         if (cmdParams==null)
             return;
+        // clear subquery params
         for (int i=cmdParams.size()-1; i>=0 ;i--)
             if (cmdParams.get(i).getCmd()!=this)
                 cmdParams.remove(i);
     }
     
     /**
+     * internally used to remove unused Command Params from list
+     * Note: Only one thread my generate an SQL statement 
+     */
+    protected void completeParamUsage()
+    {
+        if (cmdParams==null)
+            return;
+        // check whether all params have been used
+        if (paramUsageCount < cmdParams.size())
+        {   // Remove unused parameters
+            log.warn("DBCommand has {} unused Command params", 
cmdParams.size()-paramUsageCount);
+            for (int i=cmdParams.size()-1; i>=paramUsageCount; i--)
+                cmdParams.remove(i);
+        }
+    }
+    
+    /**
      * internally used to reorder the command params to match their order of 
occurance
      */
     protected void notifyParamUsage(DBCmdParam param)
@@ -189,18 +206,18 @@ public abstract class DBCommand extends DBCommandExpr
                 clone.groupBy = new ArrayList<DBColumnExpr>(groupBy);
             if (having!=null)
                 clone.having = new ArrayList<DBCompareExpr>(having);
-            if (cmdParams!=null)
+            if (cmdParams!=null && !cmdParams.isEmpty())
             {   // clone params
                 clone.paramUsageCount = 0;
                 clone.cmdParams = new ArrayList<DBCmdParam>();
-                for (DBCmdParam p : cmdParams)
-                {   // checkCmd
-                    if (p.getCmd()!=this)
-                        continue;
-                    // copy
-                    DBCmdParam param = new DBCmdParam(clone, p.getDataType(), 
p.getValue());
-                    clone.cmdParams.add(param);
-                }
+                // clone set
+                for (int i=0; (clone.set!=null && i<clone.set.size()); i++)
+                    clone.set.set(i, clone.set.get(i).copyCommand(clone));
+                // clone where and having
+                for (int i=0; (clone.where!=null && i<clone.where.size()); i++)
+                    clone.where.set(i, clone.where.get(i).copyCommand(clone));
+                for (int i=0; (clone.having!=null && i<clone.having.size()); 
i++)
+                    clone.having.set(i, 
clone.having.get(i).copyCommand(clone));
             }
             // done
             return clone;
@@ -1078,8 +1095,16 @@ public abstract class DBCommand extends DBCommandExpr
      */
     public void clearSet()
     {
+        if (set!=null && cmdParams!=null)
+        {   // remove params
+            for (DBSetExpr set : this.set)
+            {   // remove all
+                Object value = set.getValue();
+                if (value instanceof DBCmdParam)
+                    cmdParams.remove(value);
+            }
+        }
         set = null;
-        cmdParams = null;
     }
 
     /**
@@ -1353,6 +1378,8 @@ public abstract class DBCommand extends DBCommandExpr
         addGrouping(buf);
         // Add Order
         addOrder(buf);
+        // done
+        completeParamUsage();
     }
 
     /**
@@ -1410,6 +1437,8 @@ public abstract class DBCommand extends DBCommandExpr
             addListExpr(buf, set, CTX_VALUE, ", ");
         // End
         buf.append(")");
+        // done
+        completeParamUsage();
         return buf.toString();
     }
 
@@ -1448,6 +1477,7 @@ public abstract class DBCommand extends DBCommandExpr
             addWhere(buf, context);
         }
         // done
+        completeParamUsage();
         return buf.toString();
     }
     
@@ -1478,6 +1508,8 @@ public abstract class DBCommand extends DBCommandExpr
             // where
             addWhere(buf, CTX_NAME|CTX_VALUE);
         }
+        // done
+        completeParamUsage();
         return buf.toString();
     }
     
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
index 9acf423..98ae024 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
@@ -94,6 +94,16 @@ public class DBCompareAndOrExpr extends DBCompareExpr
     }
 
     /**
+     * Copy Command
+     * @param cmd
+     */
+    @Override
+    public DBCompareExpr copyCommand(DBCommand cmd)
+    {
+        return new DBCompareAndOrExpr(left.copyCommand(cmd), 
right.copyCommand(cmd), or);
+    }
+
+    /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
      */
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
index e31acf0..f9da3f7 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
@@ -20,6 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
+import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBCmdParam;
 import org.apache.empire.db.DBCmpType;
 import org.apache.empire.db.DBColumn;
@@ -142,6 +143,19 @@ public class DBCompareColExpr extends DBCompareExpr
                 return;
         }
     }
+
+    /**
+     * Copy Command
+     * @param cmd
+     */
+    @Override
+    public DBCompareExpr copyCommand(DBCommand cmd)
+    {
+        Object valueCopy = value;
+        if (value instanceof DBCmdParam) 
+            valueCopy = cmd.addParam(DataType.UNKNOWN, 
((DBCmdParam)value).getValue());
+        return new DBCompareColExpr(expr, cmpop, valueCopy);
+    }
     
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
index b721c4b..20c47a0 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
@@ -70,5 +70,11 @@ public abstract class DBCompareExpr extends DBExpr
         * @param cmd
         */
        public abstract void prepareCommand(DBCommand cmd); 
+    
+    /**
+     * internally used for parameter cloning
+     * @param cmd
+     */
+    public abstract DBCompareExpr copyCommand(DBCommand cmd); 
 
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
index 9c01eb4..5ffd495 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
@@ -18,12 +18,12 @@
  */
 package org.apache.empire.db.expr.compare;
 
+import java.util.Set;
+
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
 
-import java.util.Set;
-
 
 /**
  * This class is used for defining filter constraints based on a column 
expression in SQL<br>
@@ -72,6 +72,16 @@ public class DBCompareNotExpr extends DBCompareExpr
     }
 
     /**
+     * Copy Command
+     * @param cmd
+     */
+    @Override
+    public DBCompareExpr copyCommand(DBCommand cmd)
+    {
+        return new DBCompareNotExpr(expr.copyCommand(cmd));
+    }
+
+    /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
      */
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
index 032ba99..63d12d4 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
@@ -83,7 +83,20 @@ public class DBExistsExpr extends DBCompareExpr
     @Override
     public void prepareCommand(DBCommand cmd) 
     {
-        /* nothing yet */
+        if (compareExpr!=null)
+            compareExpr.prepareCommand(cmd);
+    }
+
+    /**
+     * Copy Command
+     * @param cmd
+     */
+    @Override
+    public DBCompareExpr copyCommand(DBCommand newCmd)
+    {
+        if (compareExpr==null)
+            return this;
+        return new DBExistsExpr(cmd, compareExpr.copyCommand(newCmd));
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
index dffdf0f..d5ad8ed 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
@@ -20,6 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
+import org.apache.empire.commons.Unwrappable;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
@@ -28,17 +29,24 @@ import org.apache.empire.db.DBDatabase;
  * This class wraps an existing compare expression with parenthesis.
  * <P>
  */
-public class DBParenthesisExpr extends DBCompareExpr
+public class DBParenthesisExpr extends DBCompareExpr implements 
Unwrappable<DBCompareExpr>
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
     private final DBCompareExpr wrapped;
     
-    public DBParenthesisExpr(DBCompareExpr wrap)
+    public DBParenthesisExpr(DBCompareExpr expr)
     {
-        this.wrapped = wrap;
+        this.wrapped = expr;
     }
-    
-    public DBCompareExpr getWrapped()
+
+    @Override
+    public boolean isWrapper()
+    {
+        return true;
+    }
+
+    @Override
+    public DBCompareExpr unwrap()
     {
         return wrapped;
     }
@@ -63,6 +71,12 @@ public class DBParenthesisExpr extends DBCompareExpr
     }
 
     @Override
+    public DBCompareExpr copyCommand(DBCommand cmd)
+    {
+        return new DBParenthesisExpr(wrapped.copyCommand(cmd));
+    }
+
+    @Override
     public void addReferencedColumns(Set<DBColumn> list)
     {
         wrapped.addReferencedColumns(list);
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
index 0d6ff18..a67dec2 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
@@ -48,7 +48,7 @@ public class DBCompareJoinExpr extends DBColumnJoinExpr
     {
         // DBParenthesisExpr
         if (expr instanceof DBParenthesisExpr)
-            return findFirstColumn(((DBParenthesisExpr)expr).getWrapped());
+            return findFirstColumn(((DBParenthesisExpr)expr).unwrap());
         // DBCompareORExpr
         if (expr instanceof DBCompareAndOrExpr)
             return findFirstColumn(((DBCompareAndOrExpr)expr).getLeft());
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
index 5ea509a..8d258b5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
@@ -18,9 +18,12 @@
  */
 package org.apache.empire.db.expr.set;
 
-import java.util.*;
+import java.util.Set;
 
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBCmdParam;
 import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBExpr;
 import org.apache.empire.db.DBRowSet;
@@ -111,6 +114,18 @@ public class DBSetExpr extends DBExpr
     }
 
     /**
+     * Copy Command
+     * @param cmd
+     */
+    public DBSetExpr copyCommand(DBCommand cmd)
+    {
+        Object valueCopy = value;
+        if (value instanceof DBCmdParam) 
+            valueCopy = cmd.addParam(DataType.UNKNOWN, 
((DBCmdParam)value).getValue());
+        return new DBSetExpr(column, valueCopy);
+    }
+
+    /**
      * Creates the SQL-Command.
      * 
      * @param buf the SQL-Command

Reply via email to