Manish Khettry (JIRA) wrote:
     [ http://issues.apache.org/jira/browse/DERBY-578?page=all ]

Manish Khettry updated DERBY-578:
---------------------------------

    Attachment: predicatePushdown.out.patch

Looks like the join order changed between when I generated the patch and now. Try this version of predicatePushdown.

I haven't had time to follow this issue closely, but the diff you just posted caught my attention--somehow these master updates seem "funny" to me (for lack of a better technical term).

I glanced through all of the master updates that you've made for this issue and they all show two kinds of diffs: the first is that Distinct Scans are no longer reporting index usage, and the second is that start/stop position for heap scans has gone from "None" to "null".

For example:

- Distinct Scan ResultSet for T1 using index xxxxFILTERED-UUIDxxxx at read committed isolation level using instantaneous share row locking: + Distinct Scan ResultSet for T1 at read committed isolation level using instantaneous share row locking:

Did your changes actually make it so that the query no longer uses an index on T1, or did it just change the logQueryPlan output so that the index is no longer being printed? My guess (having not looked closely at the code) is that your changes have just affected logQueryPlan output--i.e. that the query plan itself is still what it was before.

If that's true, then I'm not sure I like the idea of losing this index information--truth is, index information is one of *the* most useful things (at least for me) when I'm reading a logged query plan, so to lose this info seems like a less-than-ideal change.

As for the "None" vs "null", I personally prefer the former over the latter--so I'm wondering if it's possible to somehow fix the issue described but still retain the more meaningful "None" keyword in this output? This is perhaps being a bit picky, but I thought I'd bring it up.

As I said, I haven't had time to do a thorough review, but I did notice the following changes in your patch:
        
+        /* helper method used by generateMaxSpecialResultSet and
+         * generateDistinctScan to return the name of the index if the
+         * conglomerate is an index.
+         */
+        private void pushIndexName(ConglomerateDescriptor cd, MethodBuilder mb)
+          throws StandardException
+        {
+            if (cd.isConstraint()) {
+                DataDictionary dd = getDataDictionary();
+                ConstraintDescriptor constraintDesc =
+                    dd.getConstraintDescriptor(tableDescriptor, cd.getUUID());
+                mb.push(constraintDesc.getConstraintName());
+            } else if (cd.isIndex())  {
+                mb.push(cd.getConglomerateName());
+            } else {
+              mb.pushNull("java.lang.String");
+            }
+        }
+       

@@ -3128,7 +3148,7 @@
mb.push(org.apache.derby.iapi.util.PropertyUtil.sortProperties(tableProperties));
                else
                        mb.pushNull("java.lang.String");
-               mb.push(cd.getConglomerateName());
+                pushIndexName(cd, mb);
                mb.push(colRefItem);
                mb.push(getTrulyTheBestAccessPath().getLockMode());
                mb.push(tableLockGranularity);

If I'm reading this correctly, we used to _always_ push cd.getConglomerateName()--which, if we're using an index, is the name of the index--but now, in order to avoid the NPE reported as part of this issue, we will only push the conglomerate name if it (the conglomerate) is not a constraint. Logically, I'm not entirely sure that's the correct thing to do, since I *think* that a conglomerate can be an index and a constraint at the same time (I'd have to investigate more--if anyone out there knows for sure, please chime in!). If that's true, then in situations where we used to have a conglomerate that was both an index and a constraint, we would push the index name; but now for that same conglomerate we will push the constraint name instead, and I'm guessing that the constraint name and the index name are not always the same--which might account for the fact the index name is now missing from the logQueryPlan?

That's just speculation, though--if anyone can confirm/deny, that'd be great. In any event, in order to preserve the existing behavior in logQueryPlan, the change might be as small as something like:

+        /* helper method used by generateMaxSpecialResultSet and
+         * generateDistinctScan to return the name of the index if the
+         * conglomerate is an index.
+         */
+        private void pushIndexName(ConglomerateDescriptor cd, MethodBuilder mb)
+          throws StandardException
+        {
+            if (cd.getConglomerateName() != null)
+                mb.push(cd.getConglomerateName());
+            else if (cd.isConstraint()) {
+                DataDictionary dd = getDataDictionary();
+                ConstraintDescriptor constraintDesc =
+                    dd.getConstraintDescriptor(tableDescriptor, cd.getUUID());
+                mb.push(constraintDesc.getConstraintName());
+            } else {
+              mb.pushNull("java.lang.String");
+            }
+        }

Assuming, of course, that constraintDesc.getConstraintName() can't ever be null... :)

I didn't test the above suggestion so it may need some tweaking--but if you could look at the changes again and/or explain a bit more about what is causing the diff in the master files--and hopefully post your findings--then I'd feel a lot better about this patch...

For what it's worth,
Army

Reply via email to