db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kmars...@apache.org
Subject svn commit: r1071146 - in /db/derby/code/branches/10.5: ./ java/engine/org/apache/derby/impl/sql/compile/ java/testing/org/apache/derbyTesting/functionTests/tests/lang/
Date Wed, 16 Feb 2011 05:33:57 GMT
Author: kmarsden
Date: Wed Feb 16 05:33:56 2011
New Revision: 1071146

URL: http://svn.apache.org/viewvc?rev=1071146&view=rev
Log:
DERBY-4679 Several left outer joins causes unstable query with incorrect results
merge revisions 957287 and 958621 from 10.6

Contributed by Dag H. Wanvik


Modified:
    db/derby/code/branches/10.5/   (props changed)
    db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ColumnReference.java
    db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
    db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/VirtualColumnNode.java
    db/derby/code/branches/10.5/java/testing/org/apache/derbyTesting/functionTests/tests/lang/JoinTest.java

Propchange: db/derby/code/branches/10.5/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Feb 16 05:33:56 2011
@@ -1,2 +1,2 @@
-/db/derby/code/branches/10.6:942027,957000,962738,965351,987678,997790*,1031623,1055601,1068474
-/db/derby/code/trunk:757811,764912,769596,769602,769606,769962,772090,772337,772449,772534,774281,777105,779681,782991,785131,785139,785163,785570,785662,788369,788670,788674,788968,789264,790218,791027,792001,792254,792434,793089,793588,794106,794276,794303,794955,795166,795459,796020,796027,796316,796372,797147,798347,798742,800523,803548,803948,805696,808494,808850,809643,810860,812669,816531,816536,819006,822289,823659,824694,826263,827505,829022,829410,830545,831304,831319,832379,833430,835286,881074,881444,882732,884163,885421,885659,887246,888311,891350,892912,897161,898635,901165,901648,901760,902857,903108,905224,908418,908586,909176,910481,910511,911315,911793,915177,915733,916075,916897,917771,918152,918359,921028,927430,928065,929085,931076,934474,936215,938959,940462,940469,942286,942476,942480,942587,946794,948045,948069,951346,951366,952138,952581,954748,955001,955634,956075,956445,956659,958163,959550,961892,962716,964039,964402,965647,967304,980089,980684,98
 6689,986834,987539,989099,997325*,999119,1002291,1002682,1002853,1021426,1025795,1030043,1040658,1053724,1055169,1062096,1063809,1065061,1067250
+/db/derby/code/branches/10.6:942027,957000,957287,958621,962738,965351,987678,997790*,1031623,1055601,1068474
+/db/derby/code/trunk:757811,764912,769596,769602,769606,769962,772090,772337,772449,772534,774281,777105,779681,782991,785131,785139,785163,785570,785662,788369,788670,788674,788968,789264,790218,791027,792001,792254,792434,793089,793588,794106,794276,794303,794955,795166,795459,796020,796027,796316,796372,797147,798347,798742,800523,803548,803948,805696,808494,808850,809643,810860,812669,816531,816536,819006,822289,823659,824694,826263,827505,829022,829410,830545,831304,831319,832379,833430,835286,881074,881444,882732,884163,885421,885659,887246,888311,891350,892912,897161,898635,901165,901648,901760,902857,903108,905224,908418,908586,909176,910481,910511,911315,911793,915177,915733,916075,916897,917771,918152,918359,921028,927430,928065,929085,931076,934474,936215,938959,940462,940469,942286,942476,942480,942587,946794,948045,948069,951346,951366,952138,952237,952581,954748,955001,955634,956075,956445,956659,957260,958163,958618,959550,961892,962716,964039,964402,965647,96
 7304,980089,980684,986689,986834,987539,989099,997325*,999119,1002291,1002682,1002853,1021426,1025795,1030043,1040658,1053724,1055169,1062096,1063809,1065061,1067250

Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ColumnReference.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ColumnReference.java?rev=1071146&r1=1071145&r2=1071146&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ColumnReference.java
(original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ColumnReference.java
Wed Feb 16 05:33:56 2011
@@ -71,6 +71,10 @@ public class ColumnReference extends Val
 	int				origTableNumber = -1;
 	int				origColumnNumber = -1;
 
+    /* For remembering original (tn,cn) of this CR during join flattening. */
+    private int tableNumberBeforeFlattening = -1;
+    private int columnNumberBeforeFlattening = -1;
+
 	/* Reuse generated code where possible */
 	//Expression genResult;
 
@@ -819,12 +823,6 @@ public class ColumnReference extends Val
 			if (rsn instanceof FromTable)
 			{
 				FromTable ft = (FromTable)rsn;
-				tableNumber = ft.getTableNumber();
-				if (SanityManager.DEBUG)
-				{
-					SanityManager.ASSERT(tableNumber != -1,
-						"tableNumber not expected to be -1");
-				}
 
 				/* It's not enough to just set the table number.  Depending
 				 * on the original query specified and on whether or not
@@ -834,15 +832,53 @@ public class ColumnReference extends Val
 				 * we got here.  In that case we also need to update the
 				 * columnNumber to point to the correct column in "ft".
 				 * See DERBY-2526 for details.
+                 * See DERBY-3023 and DERBY-4679 for further improvement
+                 * details.
 				 */
-				ResultColumn ftRC =
-					ft.getResultColumns().getResultColumn(columnName);
 
-				if (SanityManager.DEBUG)
-				{
-					SanityManager.ASSERT(ftRC != null,
-						"Failed to find column '" + columnName + "' in the " +
-						"RCL for '" + ft.getTableName() + "'.");
+                ResultColumnList rcl = ft.getResultColumns();
+
+                ResultColumn ftRC = null;
+
+
+                // Need to save original (tn,cn) in case we have several
+                // flattenings so we can relocate the correct column many
+                // times. After the first flattening, the (tn,cn) pair points
+                // to the top RCL which is going away..
+                if (tableNumberBeforeFlattening == -1) {
+                    tableNumberBeforeFlattening = tableNumber;
+                    columnNumberBeforeFlattening = columnNumber;
+                }
+
+                // Covers references to a table not being flattened out, e.g.
+                // inside a join tree, which can have many columns in the rcl
+                // with the same name, so looking up via column name can give
+                // the wrong column. DERBY-4679.
+                ftRC = rcl.getResultColumn(
+                    tableNumberBeforeFlattening,
+                    columnNumberBeforeFlattening,
+                    columnName);
+
+                if (ftRC == null) {
+                    // The above lookup won't work for references to a base
+                    // column, so fall back on column name, which is unique
+                    // then.
+                    ftRC = rcl.getResultColumn(columnName);
+                }
+
+                if (SanityManager.DEBUG) {
+                    SanityManager.ASSERT(
+                        ftRC != null,
+                        "Failed to find column '" + columnName +
+                        "' in the " + "RCL for '" + ft.getTableName() +
+                        "'.");
+                }
+
+                tableNumber = ft.getTableNumber();
+
+				if (SanityManager.DEBUG) {
+					SanityManager.ASSERT(tableNumber != -1,
+						"tableNumber not expected to be -1");
 				}
 
 				/* Use the virtual column id if the ResultColumn's expression

Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java?rev=1071146&r1=1071145&r2=1071146&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
(original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
Wed Feb 16 05:33:56 2011
@@ -310,6 +310,139 @@ public class ResultColumnList extends Qu
 		return null;
 	}
 
+    /**
+     * Return a result column, if any found, which contains in its
+     * expression/{VCN,CR} chain a result column with the given
+     * columnNumber from a FromTable with the given tableNumber.
+     * <p/>
+     * Used by the optimizer preprocess phase when it is flattening queries,
+     * which has to use the pair &#123;table number, column number&#125; to
+     * uniquely distinguish the column desired in situations where the same
+     * table may appear multiple times in the queries with separate correlation
+     * names, and/or column names from different tables may be the same (hence
+     * looking up by column name will not always work), cf DERBY-4679.
+     * <p/>
+     * {@code columnName} is used to assert that we find the right column.
+     * If we found a match on (tn, cn) but columnName is wrong, return null.
+     * Once we trust table numbers and column numbers to always be correct,
+     * cf. DERBY-4695, we could remove this parameter.
+     *
+     * @param tableNumber the table number to look for
+     * @param columnNumber the column number to look for
+     * @param columnName name of the desired column
+     */
+    public ResultColumn getResultColumn(int tableNumber,
+                                        int columnNumber,
+                                        String columnName)
+    {
+        int size = size();
+
+        for (int index = 0; index < size; index++)
+        {
+            ResultColumn resultColumn = (ResultColumn)elementAt(index);
+            ResultColumn rc = resultColumn;
+
+            while (rc != null) {
+                ValueNode exp = rc.getExpression();
+
+                if (exp instanceof VirtualColumnNode) {
+                    VirtualColumnNode vcn = (VirtualColumnNode)exp;
+                    ResultSetNode rsn = vcn.getSourceResultSet();
+
+                    if (rsn instanceof FromTable) {
+                        FromTable ft = (FromTable)rsn;
+
+                        if (ft.getTableNumber() == tableNumber) {
+                            // We have the right table, now try to match the
+                            // column number. Looking at a join, for a base
+                            // table participant, we will find the correct
+                            // column position in the
+                            // JOIN's ColumnDescriptor. Normally, we could just
+                            // call rc.getColumnPosition, but this doesn't work
+                            // if we have a join with a subquery participant
+                            // (it would give us the virtualColumnId one level
+                            // too high up, since the column descriptor is null
+                            // in that case inside a JOIN's RC.
+                            //
+                            // If FromTable is a FromSubquery we need to look
+                            // at the JOIN RC's source column to match the
+                            // table column number. However, at that level, the
+                            // table number would be that of the underlying
+                            // SELECT (for example), rather than the
+                            // FromSubquery's, so we need to match the table
+                            // number one level above, cf the test cases in
+                            // JoinTest#testDerby_4679 which have subqueries.
+
+                            ColumnDescriptor cd = rc.getTableColumnDescriptor();
+
+                            if (SanityManager.DEBUG) {
+                                SanityManager.ASSERT(
+                                    cd != null || ft instanceof FromSubquery);
+                            }
+
+                            if ( (cd != null && cd.getPosition() ==
+                                      columnNumber) ||
+                                 (vcn.getSourceColumn().getColumnPosition() ==
+                                     columnNumber) ) {
+
+                                // Found matching (t,c) within this top
+                                // resultColumn. Now do sanity check that column
+                                // name is correct. Remove when DERBY-4695 is
+                                // fixed.
+                                if (columnName.equals(
+                                            vcn.getSourceColumn().getName())) {
+                                    resultColumn.setReferenced();
+                                    return resultColumn;
+                                } else {
+                                    if (SanityManager.DEBUG) {
+                                        SanityManager.ASSERT(
+                                            false,
+                                            "wrong (tn,cn) for column " +
+                                            columnName +
+                                            " found: this pair points to " +
+                                            vcn.getSourceColumn().getName());
+                                    }
+                                    // Fall back on column name based lookup,
+                                    // cf. DERBY-4679. See ColumnReference#
+                                    // remapColumnReferencesToExpressions
+                                    return null;
+                                }
+                            } else {
+                                rc = vcn.getSourceColumn();
+                            }
+                        } else {
+                            rc = vcn.getSourceColumn();
+                        }
+                    } else {
+                        rc = null;
+                    }
+                } else if (exp instanceof ColumnReference) {
+                    ColumnReference cr = (ColumnReference)exp;
+
+                    if (cr.getTableNumber() == tableNumber &&
+                            cr.getColumnNumber() == columnNumber) {
+                        // Found matching (t,c) within this top resultColumn
+                        resultColumn.setReferenced();
+                        return resultColumn;
+                    } else {
+                        rc = null;
+                    }
+                } else {
+                    if (SanityManager.DEBUG) {
+                        SanityManager.ASSERT(
+                            exp instanceof BaseColumnNode,
+                            "expected BaseColumnNode, found: " +
+                            exp.getClass());
+                    }
+                    rc = null;
+                }
+            }
+
+        }
+        return null;
+    }
+
+
 	/**
 	 * Get a ResultColumn that matches the specified columnName and
 	 * mark the ResultColumn as being referenced.

Modified: db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/VirtualColumnNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/VirtualColumnNode.java?rev=1071146&r1=1071145&r2=1071146&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/VirtualColumnNode.java
(original)
+++ db/derby/code/branches/10.5/java/engine/org/apache/derby/impl/sql/compile/VirtualColumnNode.java
Wed Feb 16 05:33:56 2011
@@ -94,6 +94,8 @@ public class VirtualColumnNode extends V
 
 			printLabel(depth, "sourceColumn: ");
 		    sourceColumn.treePrint(depth + 1);
+            printLabel(depth, "sourceResultSet: ");
+            sourceResultSet.treePrint(depth + 1);
 		}
 	}
 

Modified: db/derby/code/branches/10.5/java/testing/org/apache/derbyTesting/functionTests/tests/lang/JoinTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.5/java/testing/org/apache/derbyTesting/functionTests/tests/lang/JoinTest.java?rev=1071146&r1=1071145&r2=1071146&view=diff
==============================================================================
--- db/derby/code/branches/10.5/java/testing/org/apache/derbyTesting/functionTests/tests/lang/JoinTest.java
(original)
+++ db/derby/code/branches/10.5/java/testing/org/apache/derbyTesting/functionTests/tests/lang/JoinTest.java
Wed Feb 16 05:33:56 2011
@@ -237,4 +237,175 @@ public class JoinTest extends BaseJDBCTe
 
         rollback();
     }
+
+
+    /**
+     * DERBY-4679. Verify that when transitive closure generates new criteria
+     * into the query, it isn't confused by situations where the same column
+     * name appears in a result column list multiple times due to flattening of
+     * sub-queries.  
+     * <p/>
+     * Flattening requires remapping of (table, column) numbers in column
+     * references. In cases where the same column name appears in a result
+     * column list multiple times, this might earlier lead to remapping
+     * (reassigning) wrong (table, column) numbers to column references in join
+     * predicates transformed to where clauses as a result of the flattening.
+     * <p/>
+     * See also DERBY-2526 and DERBY-3023 whose fixes which were partial
+     * solutions to the problem of wrong column number remappings confusing
+     * the transitive closure of search predicates performed by the
+     * preprocessing step of the optimizer.
+     */
+    public void testDerby_4679() throws SQLException {
+        setAutoCommit(false);
+        Statement s = createStatement();
+
+        s.execute("create table abstract_instance (" +
+                  "    jz_discriminator int, " +
+                  "    item_id char(32), " +
+                  "    family_item_id char(32), " +
+                  "    state_id char(32), " +
+                  "    visibility bigint)");
+
+        s.execute("create table lab_resource_operatingsystem (" +
+                  "    jz_parent_id char(32), " +
+                  "    item_id char(32))");
+
+        s.execute("create table operating_system_software_install (" +
+                  "    jz_parent_id char(32), " +
+                  "    item_id char(32))");
+
+        s.execute("create table family (" +
+                  "    item_id char(32), " +
+                  "    root_item_id char(32))");
+
+        s.execute("insert into abstract_instance (" +
+                  "    jz_discriminator, " +
+                  "    item_id, " +
+                  "    family_item_id, " +
+                  "    visibility) " +
+                  "values (238, 'aaaa', 'bbbb', 0)," +
+                  "       (0, 'cccc', 'dddd', 0)," +
+                  "       (1, 'eeee', '_5VetVWTeEd-Q8aOqWJPEIQ', 0)");
+
+        s.execute("insert into lab_resource_operatingsystem " +
+                  "values ('aaaa', 'cccc')");
+
+
+        s.execute("insert into operating_system_software_install " +
+                  "values ('cccc', 'eeee')");
+
+        s.execute("insert into family " +
+                  "values ('dddd', '_5ZDlwWTeEd-Q8aOqWJPEIQ')," +
+                  "       ('bbbb', '_5nN9mmTeEd-Q8aOqWJPEIQ')");
+
+        ResultSet rs = s.executeQuery(
+            "select distinct t1.ITEM_ID, t1.state_id, t1.JZ_DISCRIMINATOR" +
+            "    from " +
+            "((((((select * from ABSTRACT_INSTANCE z1 " +
+            "      where z1.JZ_DISCRIMINATOR = 238) t1 " +
+            "      left outer join LAB_RESOURCE_OPERATINGSYSTEM j1 " +
+            "          on (t1.ITEM_ID = j1.JZ_PARENT_ID)) " +
+            "     left outer join ABSTRACT_INSTANCE t2" +
+            "         on (j1.ITEM_ID = t2.ITEM_ID)) " +
+            "    left outer join OPERATING_SYSTEM_SOFTWARE_INSTALL j2" +
+            "        on (t2.ITEM_ID = j2.JZ_PARENT_ID))" +
+            "   left outer join ABSTRACT_INSTANCE t3 on " +
+            "       (j2.ITEM_ID = t3.ITEM_ID) " +
+            "  inner join FAMILY t5 on (t2.FAMILY_ITEM_ID = t5.ITEM_ID)) " +
+            " inner join FAMILY t7 on (t1.FAMILY_ITEM_ID = t7.ITEM_ID)) " +
+            "where (t3.FAMILY_ITEM_ID IN('_5VetVWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t5.ROOT_ITEM_ID = '_5ZDlwWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t7.ROOT_ITEM_ID ='_5nN9mmTeEd-Q8aOqWJPEIQ') and " +
+            "      (t1.VISIBILITY = 0))");
+
+        JDBC.assertFullResultSet(
+            rs,
+            new String[][]{{"aaaa", null, "238"}});
+
+        // Now, some subqueries instead of a base table t3, since our
+        // difficulty lay in binding t3.FAMILY_ITEM_ID in the where clause
+        // correctly. Subqueries still broke in the first patch for DERBY-4679.
+
+        // Select subquery variant, cf tCorr
+        rs = s.executeQuery(
+            "select distinct t1.ITEM_ID, t1.state_id, t1.JZ_DISCRIMINATOR " +
+            "    from " +
+            "((((((select * from ABSTRACT_INSTANCE z1 " +
+            "      where z1.JZ_DISCRIMINATOR = 238) t1 " +
+            "      left outer join LAB_RESOURCE_OPERATINGSYSTEM j1 " +
+            "          on (t1.ITEM_ID = j1.JZ_PARENT_ID)) " +
+            "     left outer join ABSTRACT_INSTANCE t2 " +
+            "         on (j1.ITEM_ID = t2.ITEM_ID)) " +
+            "    left outer join OPERATING_SYSTEM_SOFTWARE_INSTALL j2" +
+            "        on (t2.ITEM_ID = j2.JZ_PARENT_ID))" +
+            "   left outer join (select * from ABSTRACT_INSTANCE) tCorr " +
+            "       on (j2.ITEM_ID = tCorr.ITEM_ID) " +
+            "  inner join FAMILY t5 on (t2.FAMILY_ITEM_ID = t5.ITEM_ID)) " +
+            " inner join FAMILY t7 on (t1.FAMILY_ITEM_ID = t7.ITEM_ID)) " +
+            "where (tCorr.FAMILY_ITEM_ID IN('_5VetVWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t5.ROOT_ITEM_ID = '_5ZDlwWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t7.ROOT_ITEM_ID ='_5nN9mmTeEd-Q8aOqWJPEIQ') and " +
+            "      (t1.VISIBILITY = 0))");
+        JDBC.assertFullResultSet(
+            rs,
+            new String[][]{{"aaaa", null, "238"}});
+
+        // values subquery variant, cf tCorr
+        rs = s.executeQuery(
+            "select distinct t1.ITEM_ID, t1.state_id, t1.JZ_DISCRIMINATOR " +
+            "    from " +
+            "((((((select * from ABSTRACT_INSTANCE z1 " +
+            "      where z1.JZ_DISCRIMINATOR = 238) t1 " +
+            "      left outer join LAB_RESOURCE_OPERATINGSYSTEM j1 " +
+            "          on (t1.ITEM_ID = j1.JZ_PARENT_ID)) " +
+            "     left outer join ABSTRACT_INSTANCE t2 " +
+            "         on (j1.ITEM_ID = t2.ITEM_ID)) " +
+            "    left outer join OPERATING_SYSTEM_SOFTWARE_INSTALL j2 " +
+            "        on (t2.ITEM_ID = j2.JZ_PARENT_ID))" +
+            "   left outer join " +
+            "       (values (238, 'aaaa', 'bbbb', 0)," +
+            "       (0, 'cccc', 'dddd', 0)," +
+            "       (1, 'eeee', '_5VetVWTeEd-Q8aOqWJPEIQ', 0)) " +
+            "       tCorr(jz_discriminator,item_id,family_item_id,visibility)" +
+            "       on (j2.ITEM_ID = tCorr.ITEM_ID) " +
+            "  inner join FAMILY t5 on (t2.FAMILY_ITEM_ID = t5.ITEM_ID)) " +
+            " inner join FAMILY t7 on (t1.FAMILY_ITEM_ID = t7.ITEM_ID)) " +
+            "where (tCorr.FAMILY_ITEM_ID IN('_5VetVWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t5.ROOT_ITEM_ID = '_5ZDlwWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t7.ROOT_ITEM_ID ='_5nN9mmTeEd-Q8aOqWJPEIQ') and " +
+            "      (t1.VISIBILITY = 0))");
+        JDBC.assertFullResultSet(
+            rs,
+            new String[][]{{"aaaa", null, "238"}});
+
+
+        s.executeUpdate("create view tView as select * from ABSTRACT_INSTANCE");
+
+        // view subquery variant, cf tCorr
+        rs = s.executeQuery(
+            "select distinct t1.ITEM_ID, t1.state_id, t1.JZ_DISCRIMINATOR " +
+            "    from " +
+            "((((((select * from ABSTRACT_INSTANCE z1 " +
+            "      where z1.JZ_DISCRIMINATOR = 238) t1 " +
+            "      left outer join LAB_RESOURCE_OPERATINGSYSTEM j1 " +
+            "          on (t1.ITEM_ID = j1.JZ_PARENT_ID)) " +
+            "     left outer join ABSTRACT_INSTANCE t2 " +
+            "         on (j1.ITEM_ID = t2.ITEM_ID)) " +
+            "    left outer join OPERATING_SYSTEM_SOFTWARE_INSTALL j2 " +
+            "        on (t2.ITEM_ID = j2.JZ_PARENT_ID))" +
+            "   left outer join tView on (j2.ITEM_ID = tView.ITEM_ID) " +
+            "  inner join FAMILY t5 on (t2.FAMILY_ITEM_ID = t5.ITEM_ID)) " +
+            " inner join FAMILY t7 on (t1.FAMILY_ITEM_ID = t7.ITEM_ID)) " +
+            "where (tView.FAMILY_ITEM_ID IN('_5VetVWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t5.ROOT_ITEM_ID = '_5ZDlwWTeEd-Q8aOqWJPEIQ') and " +
+            "      (t7.ROOT_ITEM_ID ='_5nN9mmTeEd-Q8aOqWJPEIQ') and " +
+            "      (t1.VISIBILITY = 0))");
+        JDBC.assertFullResultSet(
+            rs,
+            new String[][]{{"aaaa", null, "238"}});
+
+        rollback();
+    }
+
 }



Mime
View raw message