Return-Path: X-Original-To: apmail-db-derby-commits-archive@www.apache.org Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id F215417796 for ; Tue, 14 Oct 2014 20:53:43 +0000 (UTC) Received: (qmail 16523 invoked by uid 500); 14 Oct 2014 20:53:43 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 16499 invoked by uid 500); 14 Oct 2014 20:53:43 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 16490 invoked by uid 99); 14 Oct 2014 20:53:43 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 14 Oct 2014 20:53:43 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 14 Oct 2014 20:53:17 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 2AA29238888F; Tue, 14 Oct 2014 20:53:15 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1631882 - in /db/derby/code/branches/10.10/java: testing/org/apache/derbyTesting/functionTests/tests/lang/ tools/org/apache/derby/impl/tools/planexporter/ tools/org/apache/derby/tools/ Date: Tue, 14 Oct 2014 20:53:15 -0000 To: derby-commits@db.apache.org From: myrnavl@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20141014205315.2AA29238888F@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: myrnavl Date: Tue Oct 14 20:53:14 2014 New Revision: 1631882 URL: http://svn.apache.org/r1631882 Log: DERBY-6629; Restrict privileged operation in CreateXMLFile revert revision 1631551 Modified: db/derby/code/branches/10.10/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XplainStatisticsTest.java db/derby/code/branches/10.10/java/tools/org/apache/derby/impl/tools/planexporter/CreateXMLFile.java db/derby/code/branches/10.10/java/tools/org/apache/derby/tools/PlanExporter.java Modified: db/derby/code/branches/10.10/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XplainStatisticsTest.java URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.10/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XplainStatisticsTest.java?rev=1631882&r1=1631881&r2=1631882&view=diff ============================================================================== --- db/derby/code/branches/10.10/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XplainStatisticsTest.java (original) +++ db/derby/code/branches/10.10/java/testing/org/apache/derbyTesting/functionTests/tests/lang/XplainStatisticsTest.java Tue Oct 14 20:53:14 2014 @@ -21,14 +21,11 @@ package org.apache.derbyTesting.functionTests.tests.lang; -import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; -import java.io.PrintStream; import java.net.MalformedURLException; import java.security.AccessController; -import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -50,7 +47,7 @@ import junit.framework.Test; import junit.framework.TestSuite; import org.apache.derby.impl.tools.planexporter.AccessDatabase; -import org.apache.derby.tools.PlanExporter; +import org.apache.derby.impl.tools.planexporter.CreateXMLFile; import org.apache.derbyTesting.junit.BaseJDBCTestCase; import org.apache.derbyTesting.junit.CleanDatabaseTestSetup; import org.apache.derbyTesting.junit.JDBC; @@ -74,7 +71,7 @@ import org.w3c.dom.NodeList; * * FIXME -- some general to-do items that I don't want to forget: * - should resultSetNumber be its own column in sysxplain_resultsets? - * - need MORE tests of xplain-only mode + * - need tests of xplain-only mode * - need a test of external sorting/merging * - need to cross-check the result set types, and verify that they're * all tested at least once @@ -523,26 +520,12 @@ public class XplainStatisticsTest extend s.execute("call syscs_util.syscs_set_statistics_timing(1)"); } - private static void enableXplainOnlyMode(Statement s) - throws SQLException - { - s.execute("call syscs_util.syscs_set_xplain_mode(1)"); - } - - private static void clearXplainOnlyMode(Statement s) - throws SQLException - { - s.execute("call syscs_util.syscs_set_xplain_mode(0)"); - } - /** * * @param s - * @param exportPlan whether or not the PlanExporter tool should be used - * to export the plan of the recorded statements * @throws Exception */ - private static void disableXplainStyle(Statement s, boolean exportPlan) + private static void disableXplainStyle(Statement s) throws Exception { s.execute("call SYSCS_UTIL.SYSCS_SET_RUNTIMESTATISTICS(0)"); @@ -551,23 +534,31 @@ public class XplainStatisticsTest extend * Added by DERBY-4587 to test the generation of XML files * from PlanExporter tool. */ - if (exportPlan) { - String dbUrl = s.getConnection().getMetaData().getURL(); - - ResultSet rs = s.executeQuery( - "select stmt_id from XPLTEST.sysxplain_statements"); - while (rs.next()) { - String stmt_id = rs.getString(1); - String output = invokePlanExporterTool( - dbUrl, "XPLTEST", stmt_id, "-xml", - SupportFilesSetup.getReadWriteFileName(stmt_id + ".xml")); - - // Expect the plan exporter tool to print nothing on success. - assertEquals("Unexpected output from PlanExporter", "", output); - } - } + String stmt_id=""; + ResultSet rs; + AccessDatabase access; - s.execute("call syscs_util.syscs_set_xplain_schema('')"); + rs = s.executeQuery( + "select stmt_id from XPLTEST.sysxplain_statements"); + while (rs.next()) + { + stmt_id = rs.getString(1); + access = + new AccessDatabase(s.getConnection(), "XPLTEST", stmt_id); + if(access.initializeDataArray()){ + access.createXMLFragment(); + access.markTheDepth(); + + CreateXMLFile xml_file = new CreateXMLFile(access); + xml_file.writeTheXMLFile( + access.statement(), + access.time(), + access.getData(), + SupportFilesSetup.getReadWriteURL(stmt_id + ".xml") + .getPath(), + null); + } + } } private static void verifyXplainUnset(Statement s) @@ -596,53 +587,6 @@ public class XplainStatisticsTest extend rs.close(); } - /** - * Invoke the PlanExporter tool. - * - * @param args the command line arguments to pass to the tool - * @return the output printed by the tool (typically an empty string - * on successful execution) - */ - private static String invokePlanExporterTool( - String arg1, String arg2, String arg3, String arg4, String arg5) { - final PrintStream out = System.out; - final PrintStream err = System.err; - - ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); - final PrintStream testOutput = new PrintStream(byteOut); - - // Redirect System.out and System.err so that the output - // can be captured. -// System.setOut(testOutput); -// System.setErr(testOutput); - ByteArrayOutputStream serverOutputBOS = new ByteArrayOutputStream(); - final PrintStream serverOutputOut = new PrintStream( serverOutputBOS); - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - System.setOut(new PrintStream(testOutput)); - System.setErr(new PrintStream(testOutput)); - return null; - } - }); - - try { - String args[] = {arg1, arg2, arg3, arg4, arg5}; - PlanExporter.main(args); - } finally { - // Restore the original out streams - AccessController.doPrivileged(new PrivilegedAction() { - public Object run() { - System.setOut(out); - System.setErr(err); - return null; - } - }); - } - - testOutput.flush(); - return byteOut.toString(); - } - // Can be used internally when diagnosing failed tests. // private void dumpResultSets(Statement s) @@ -680,32 +624,6 @@ public class XplainStatisticsTest extend rs.close(); } - private void dumpStatements(Statement s) - throws SQLException - { - ResultSet rs; - rs = s.executeQuery("select * from xpltest.sysxplain_statements"); - while (rs.next()) - { - System.out.println( - rs.getString("stmt_id")+","+ - rs.getString("stmt_name")+","+ - rs.getString("stmt_type")+","+ - rs.getString("stmt_text")+","+ - rs.getString("jvm_id")+","+ - rs.getString("os_identifier")+","+ - rs.getString("xplain_mode")+","+ - rs.getString("xplain_time")+","+ - rs.getString("xplain_thread_id")+","+ - rs.getString("transaction_id")+","+ - rs.getString("session_id")+","+ - rs.getString("database_name")+","+ - rs.getString("drda_id")+","+ - rs.getString("timing_id")); - } - rs.close(); - } - /** * Added by DERBY-4587 * Returns the stmt_id for this particular statement @@ -848,29 +766,24 @@ public class XplainStatisticsTest extend public void testPlanExporterIllegalFileAccess() throws Exception { - // Make sure there is a statement with recorded statistics. - Statement s = createStatement(); - enableXplainStyle(s); - JDBC.assertDrainResults(s.executeQuery("values 1")); - disableXplainStyle(s, true); - - // Get the id of the statement. - ResultSet rs = s.executeQuery( - "select stmt_id from XPLTEST.sysxplain_statements"); - assertTrue("no statements", rs.next()); - String stmt_id = rs.getString("stmt_id"); - JDBC.assertEmpty(rs); - - // Try to write the plan to a file that the tool does not have - // permission to write to. - String output = invokePlanExporterTool( - getConnection().getMetaData().getURL(), "XPLTEST", - stmt_id, "-xml", "/illegal.xml"); - - // The plan exporter tool should fail with a permission error. - if (!output.contains("java.security.AccessControlException")) { - fail("Unexpected output from PlanExporter: " + output); - } + AccessDatabase access = + new AccessDatabase(getConnection(), "NoSuchSchema", "nostmt"); + CreateXMLFile xml_file = new CreateXMLFile(access); + try + { + xml_file.writeTheXMLFile("nostmt", "notime", null, + "/illegal.xml", null); + fail("Expected exception for illegal file access"); + } + catch (java.security.AccessControlException ace) + { + // Expected this exception to be thrown + } + catch (Exception e) + { + e.printStackTrace(); + fail(e.getMessage()); + } } /** @@ -915,18 +828,21 @@ public class XplainStatisticsTest extend rs.close(); // Create the XML file. This used to result in a syntax error. - String output = invokePlanExporterTool( - getConnection().getMetaData().getURL(), - schema, - stmtId, - "-xml", - SupportFilesSetup.getReadWriteFileName(stmtId + ".xml")); - - // Expect empty output on successful execution of the tool. - assertEquals("Unexpected output from PlanExporter", "", output); + AccessDatabase access = + new AccessDatabase(getConnection(), schema, stmtId); + assertTrue(access.initializeDataArray()); + access.createXMLFragment(); + access.markTheDepth(); + CreateXMLFile create = new CreateXMLFile(access); + create.writeTheXMLFile( + access.statement(), + access.time(), + access.getData(), + SupportFilesSetup.getReadWriteURL(stmtId + ".xml").getPath(), + null); // If we have the required libraries for parsing XML files, verify - // that the XML file contains valid data. + // that the output contains valid data. if (XML.classpathMeetsXMLReqs()) { assertEquals(query, readStatement(stmtId)); } @@ -1008,7 +924,7 @@ public class XplainStatisticsTest extend new String[][] { {"Belize"}, {"Costa Rica"}, {"El Salvador"}, {"Guatemala"}, {"Honduras"}, {"Nicaragua"} } ); - disableXplainStyle(s, true); + disableXplainStyle(s); // The statement should have been executed as a PROJECTION // wrapped around a TABLESCAN. The TABLESCAN should have had @@ -1129,300 +1045,6 @@ public class XplainStatisticsTest extend } } - private String getStmtIDByName(Statement s, String sName) - throws SQLException - { - ResultSet rs; - String stmt_id = "?"; - rs = s.executeQuery( - "select stmt_id from XPLTEST.sysxplain_statements "+ - "where stmt_name='"+sName+"'"); - if( rs.next() ) - { - stmt_id = rs.getString(1); - //System.out.println("Found statemnt id " + stmt_id); - } - rs.close(); - return stmt_id; - } - public void testSimpleXplainOnly() throws Exception - { - Statement s = createStatement(); - - enableXplainStyle(s); - enableXplainOnlyMode(s); - s.setCursorName("1"); - JDBC.assertEmpty(s.executeQuery( - "SELECT country from countries "+ - "WHERE region = 'Central America'" )); - clearXplainOnlyMode(s); - disableXplainStyle(s, true); - - // dumpStatements(s); - // dumpResultSets(s); - // There should be 1 statement captured with stmt_id='1'. - // It should have a PROJECTION and a TABLESCAN; the TABLESCAN should be - // on the COUNTRIES table. - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_statements"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_statements "+ - "where stmt_name='1'"), "1"); - String stmt_id = getStmtIDByName( s, "1" ); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"'"), "2"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and op_identifier='PROJECTION'"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and op_identifier='TABLESCAN'"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select op_details from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and op_identifier='TABLESCAN'"), - "T: COUNTRIES"); - - enableXplainStyle(s); - enableXplainOnlyMode(s); - s.setCursorName("2"); - JDBC.assertEmpty(s.executeQuery( - "select sql_text from syscs_diag.transaction_table " + - "where status != 'IDLE'" )); - clearXplainOnlyMode(s); - disableXplainStyle(s, true); - - //dumpStatements(s); - //dumpResultSets(s); - - // This statement should have three result sets: - // - PROJECTION (select sql_text) - // - PROJECT-FILTER (where status != IDLE) - // - VTI (syscs_diag.transaction_table) - // - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_statements"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_statements "+ - "where stmt_name='2'"), "1"); - stmt_id = getStmtIDByName( s, "2" ); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and op_identifier='PROJECTION'"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and "+ - " op_identifier='PROJECT-FILTER'"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets "+ - "where stmt_id='"+stmt_id+"' and op_identifier='VTI'"), "1"); - - String selectStatement = - "select region, count(country) from app.countries group by region"; - enableXplainStyle(s); - enableXplainOnlyMode(s); - s.setCursorName("3"); - JDBC.assertEmpty(s.executeQuery(selectStatement)); - - clearXplainOnlyMode(s); - disableXplainStyle(s, true); - //dumpStatements(s); - //dumpResultSets(s); - - // This statement is executed as a PROJECTION with a child GROUPBY - // with a child PROJECTION with a child TABLESCAN. The TABLESCAN - // has a corresponding SCAN_PROPS row, the GROUPBY has a - // corresponding SORT_PROPS row. But since we're XPLAIN-ONLY, none - // of the actual processing did anything. - // - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets"), "4"); - JDBC.assertFullResultSet(s.executeQuery( - "select op_identifier from xpltest.sysxplain_resultsets " + - "order by op_identifier"), - new String[][] { - {"GROUPBY"},{"PROJECTION"},{"PROJECTION"},{"TABLESCAN"} } ); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where scan_rs_id is not null"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where sort_rs_id is not null"), "1"); - JDBC.assertFullResultSet(s.executeQuery( - "select s.stmt_text, rs.op_identifier," + - " srt.no_input_rows, srt.no_output_rows " + - " from xpltest.sysxplain_sort_props srt, " + - " xpltest.sysxplain_resultsets rs, " + - " xpltest.sysxplain_statements s " + - " where rs.stmt_id = s.stmt_id and " + - " rs.sort_rs_id = srt.sort_rs_id"), - new String[][] { - {selectStatement, "GROUPBY", "0", "0"} } ); - - JDBC.assertUnorderedResultSet(s.executeQuery( - "select srt.sort_type, srt.no_input_rows, " + - " srt.no_output_rows, srt.no_merge_runs, " + - " srt.merge_run_details, srt.eliminate_duplicates, " + - " srt.in_sort_order, srt.distinct_aggregate " + - "from xpltest.sysxplain_sort_props srt " + - "join xpltest.sysxplain_resultsets rs " + - "on srt.sort_rs_id = rs.sort_rs_id " + - "where rs.op_identifier='GROUPBY'"), - new String[][] { - {"IN","0","0",null, null, null,"N","N"} } ); - } - - public void testXplainOnlyExecutePrepared() throws Exception - { - Statement s = createStatement(); - - String selectStatement = - "select region, count(country) from app.countries group by region"; - PreparedStatement ps = prepareStatement( selectStatement ); - enableXplainStyle(s); - enableXplainOnlyMode(s); - JDBC.assertEmpty(ps.executeQuery()); - clearXplainOnlyMode(s); - disableXplainStyle(s, true); - //dumpStatements(s); - //dumpResultSets(s); - - // This statement is executed as a PROJECTION with a child GROUPBY - // with a child PROJECTION with a child TABLESCAN. The TABLESCAN - // has a corresponding SCAN_PROPS row, the GROUPBY has a - // corresponding SORT_PROPS row. But since we're XPLAIN-ONLY, none - // of the actual processing did anything. - // - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets"), "4"); - JDBC.assertFullResultSet(s.executeQuery( - "select op_identifier from xpltest.sysxplain_resultsets " + - "order by op_identifier"), - new String[][] { - {"GROUPBY"},{"PROJECTION"},{"PROJECTION"},{"TABLESCAN"} } ); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where scan_rs_id is not null"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where sort_rs_id is not null"), "1"); - JDBC.assertFullResultSet(s.executeQuery( - "select s.stmt_text, rs.op_identifier," + - " srt.no_input_rows, srt.no_output_rows " + - " from xpltest.sysxplain_sort_props srt, " + - " xpltest.sysxplain_resultsets rs, " + - " xpltest.sysxplain_statements s " + - " where rs.stmt_id = s.stmt_id and " + - " rs.sort_rs_id = srt.sort_rs_id"), - new String[][] { - {selectStatement, "GROUPBY", "0", "0"} } ); - - JDBC.assertUnorderedResultSet(s.executeQuery( - "select srt.sort_type, srt.no_input_rows, " + - " srt.no_output_rows, srt.no_merge_runs, " + - " srt.merge_run_details, srt.eliminate_duplicates, " + - " srt.in_sort_order, srt.distinct_aggregate " + - "from xpltest.sysxplain_sort_props srt " + - "join xpltest.sysxplain_resultsets rs " + - "on srt.sort_rs_id = rs.sort_rs_id " + - "where rs.op_identifier='GROUPBY'"), - new String[][] { - {"IN","0","0",null, null, null,"N","N"} } ); - - - // Since now we're not in XplainOnly mode, the prepared statement - // returns the expected normal result set. - - JDBC.assertUnorderedResultSet(ps.executeQuery(), - new String[][] { - {"Africa", "19"}, {"Asia", "15"}, - {"Australia and New Zealand", "2"}, {"Caribbean", "10"}, - {"Central America", "6"}, {"Central Asia", "4"}, - {"Europe", "29"}, {"Middle East", "7"}, - {"North Africa", "5"}, {"North America", "3"}, - {"Pacific Islands", "3"}, {"South America", "11"} } ); - - // And then back to empty again: - enableXplainStyle(s); - enableXplainOnlyMode(s); - JDBC.assertEmpty(ps.executeQuery()); - clearXplainOnlyMode(s); - disableXplainStyle(s, true); - - // Verify that statistics were collected. - JDBC.assertDrainResults( - s.executeQuery("select * from xpltest.sysxplain_statements"), - 1); - } - - public void testXplainOnlyPrepared() throws Exception - { - Statement s = createStatement(); - - String selectStatement = - "select region, count(country) from app.countries group by region"; - - // Try preparing the statement while we're in xplain-only mode, then - // execute it normally. - - enableXplainStyle(s); - enableXplainOnlyMode(s); - PreparedStatement ps2 = prepareStatement( selectStatement ); - clearXplainOnlyMode(s); - JDBC.assertUnorderedResultSet(ps2.executeQuery(), - new String[][] { - {"Africa", "19"}, {"Asia", "15"}, - {"Australia and New Zealand", "2"}, {"Caribbean", "10"}, - {"Central America", "6"}, {"Central Asia", "4"}, - {"Europe", "29"}, {"Middle East", "7"}, - {"North Africa", "5"}, {"North America", "3"}, - {"Pacific Islands", "3"}, {"South America", "11"} } ); - disableXplainStyle(s, true); - //dumpStatements(s); - //dumpResultSets(s); - - // This statement is executed as a PROJECTION with a child GROUPBY - // with a child PROJECTION with a child TABLESCAN. The TABLESCAN - // has a corresponding SCAN_PROPS row, the GROUPBY has a - // corresponding SORT_PROPS row. But since we're XPLAIN-ONLY, none - // of the actual processing did anything. - // - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets"), "4"); - JDBC.assertFullResultSet(s.executeQuery( - "select op_identifier from xpltest.sysxplain_resultsets " + - "order by op_identifier"), - new String[][] { - {"GROUPBY"},{"PROJECTION"},{"PROJECTION"},{"TABLESCAN"} } ); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where scan_rs_id is not null"), "1"); - JDBC.assertSingleValueResultSet(s.executeQuery( - "select count(*) from xpltest.sysxplain_resultsets " + - "where sort_rs_id is not null"), "1"); - JDBC.assertFullResultSet(s.executeQuery( - "select s.stmt_text, rs.op_identifier," + - " srt.no_input_rows, srt.no_output_rows " + - " from xpltest.sysxplain_sort_props srt, " + - " xpltest.sysxplain_resultsets rs, " + - " xpltest.sysxplain_statements s " + - " where rs.stmt_id = s.stmt_id and " + - " rs.sort_rs_id = srt.sort_rs_id"), - new String[][] { - {selectStatement, "GROUPBY", "114", "12"} } ); - - JDBC.assertUnorderedResultSet(s.executeQuery( - "select srt.sort_type, srt.no_input_rows, " + - " srt.no_output_rows, srt.no_merge_runs, " + - " srt.merge_run_details, srt.eliminate_duplicates, " + - " srt.in_sort_order, srt.distinct_aggregate " + - "from xpltest.sysxplain_sort_props srt " + - "join xpltest.sysxplain_resultsets rs " + - "on srt.sort_rs_id = rs.sort_rs_id " + - "where rs.op_identifier='GROUPBY'"), - new String[][] { - {"IN","114","12",null, null, null,"N","N"} } ); - } /** @@ -1618,7 +1240,7 @@ public class XplainStatisticsTest extend JDBC.assertUnorderedResultSet(s.executeQuery(selectStatement), new String[][] { {"AA1112"}, {"AA1114"}, {"AA1116"} } ); - disableXplainStyle(s, true); + disableXplainStyle(s); // This query should have been executed as a PROJECTION whose child // is a ROWIDSCAN whose child is an INDEXSCAN. The INDEXSCAN should @@ -1713,7 +1335,7 @@ public class XplainStatisticsTest extend "SELECT region from countries where country = 'Cameroon'"; JDBC.assertSingleValueResultSet(s.executeQuery(selectStatement), "Africa"); - disableXplainStyle(s, true); + disableXplainStyle(s); JDBC.assertUnorderedResultSet(s.executeQuery( "select op_identifier from xpltest.sysxplain_resultsets"), new String[][] { @@ -1788,7 +1410,7 @@ public class XplainStatisticsTest extend {"North Africa", "5"}, {"North America", "3"}, {"Pacific Islands", "3"}, {"South America", "11"} } ); - disableXplainStyle(s, true); + disableXplainStyle(s); // This statement is executed as a PROJECTION with a child GROUPBY // with a child PROJECTION with a child TABLESCAN. The TABLESCAN @@ -1887,7 +1509,7 @@ public class XplainStatisticsTest extend // Execute the statement and throw away the results. We just want // to look at the statistics. s.executeQuery(selectStatement).close(); - disableXplainStyle(s, true); + disableXplainStyle(s); JDBC.assertSingleValueResultSet(s.executeQuery( "select count(*) from xpltest.sysxplain_sort_props"), "1"); @@ -1951,7 +1573,7 @@ public class XplainStatisticsTest extend String selectStatement = "select count(distinct region) from countries"; JDBC.assertSingleValueResultSet(s.executeQuery(selectStatement), "12"); - disableXplainStyle(s, true); + disableXplainStyle(s); // The above statement results in the query execution: // PROJECTION(AGGREGATION(PROJECTION(TABLESCAN))) @@ -2013,7 +1635,7 @@ public class XplainStatisticsTest extend "insert into AIRLINES values " + "('AA','Amazonian Airways',0.18,0.03,0.5,1.5,20,10,5)"; int numRows = s.executeUpdate(insertStatement); - disableXplainStyle(s, true); + disableXplainStyle(s); assertEquals("Failed to insert into AIRLINES", 1, numRows); JDBC.assertUnorderedResultSet(s.executeQuery( "select stmt_type, stmt_text " + @@ -2106,7 +1728,7 @@ public class XplainStatisticsTest extend enableXplainStyle(s); numRows = s.executeUpdate(updateStatement); assertEquals("Failed to update AIRLINES", 1, numRows); - disableXplainStyle(s, true); + disableXplainStyle(s); JDBC.assertUnorderedResultSet(s.executeQuery( "select stmt_type, stmt_text " + " from xpltest.sysxplain_statements"), @@ -2263,7 +1885,7 @@ public class XplainStatisticsTest extend enableXplainStyle(s); numRows = s.executeUpdate(deleteStatement); assertEquals("Failed to delete from AIRLINES", 1, numRows); - disableXplainStyle(s, true); + disableXplainStyle(s); JDBC.assertUnorderedResultSet(s.executeQuery( "select stmt_type, stmt_text " + " from xpltest.sysxplain_statements"), @@ -2335,7 +1957,7 @@ public class XplainStatisticsTest extend String selectStatement = "select region from countries order by country"; s.executeQuery(selectStatement).close(); // Discard the results - disableXplainStyle(s, true); + disableXplainStyle(s); // The above statement results in the query execution: // PROJECTION(SORT(PROJECTION(TABLESCAN))) @@ -2417,7 +2039,7 @@ public class XplainStatisticsTest extend " union " + "select country from countries where region = 'Africa'"; s.executeQuery(selectStatement).close(); // Discard the results - disableXplainStyle(s, true); + disableXplainStyle(s); // The above statement results in the query execution: // SORT(UNION(PROJECTION(TABLESCAN),PROJECTION(TABLESCAN))) @@ -2521,11 +2143,7 @@ public class XplainStatisticsTest extend String ddlStatement = "create table t1 (a int, b char(10), c timestamp)"; s.executeUpdate(ddlStatement); - - // Don't run the PlanExporter tool on this statement. There is no - // result set graph recorded for DDL statements, so the PlanExporter - // tool will complain. - disableXplainStyle(s, false); + disableXplainStyle(s); JDBC.assertUnorderedResultSet(s.executeQuery( "select stmt_type, stmt_text " + @@ -2546,7 +2164,7 @@ public class XplainStatisticsTest extend String selectStatement = "select max(country_iso_code) from countries"; s.executeQuery(selectStatement).close(); - disableXplainStyle(s, true); + disableXplainStyle(s); // The above query is executed as // PROJECTION(AGGREGATION(PROJECTION(LASTINDEXKEYSCAN))) @@ -2661,7 +2279,7 @@ public class XplainStatisticsTest extend {"ABQ",null},{"OKC",null},{"AKL",null},{"HNL",null}, {"AKL",null},{"NRT",null} }); - disableXplainStyle(s, true); + disableXplainStyle(s); // We should get a Nested Loop Outer Join which reads 10 rows // from the left (SEEN_ROWS), constructs 10 EMPTY_RIGHT_ROWS, @@ -2756,7 +2374,7 @@ public class XplainStatisticsTest extend enableXplainStyle(s); for (int i = 0; i < searches.length; i++) s.executeQuery(searches[i]).close(); - disableXplainStyle(s, true); + disableXplainStyle(s); ResultSet rs = s.executeQuery( "select s.stmt_text, sp.start_position, sp.stop_position " + @@ -2829,7 +2447,7 @@ public class XplainStatisticsTest extend String selectStatement = "select x from t"; JDBC.assertUnorderedResultSet(s.executeQuery(selectStatement), new String[][] { {"1"},{"2"},{"4"} }); - disableXplainStyle(s, true); + disableXplainStyle(s); // There should be a CONSTRAINTSCAN result set with a SCAN PROPS // which indicates that we visited 1 deleted row while scanning @@ -2902,7 +2520,7 @@ public class XplainStatisticsTest extend Statement s = createStatement(); enableXplainStyle(s); JDBC.assertEmpty(s.executeQuery(sql)); - disableXplainStyle(s, true); + disableXplainStyle(s); // Now, see if we find the query among the recorded statements. PreparedStatement ps = prepareStatement( @@ -2953,7 +2571,7 @@ public class XplainStatisticsTest extend enableXplainStyle(s); JDBC.assertEmpty(s.executeQuery(queryText)); - disableXplainStyle(s, true); + disableXplainStyle(s); ResultSet rs = s.executeQuery( "SELECT STMT_ID, STMT_TEXT FROM XPLTEST.SYSXPLAIN_STATEMENTS"); @@ -2989,7 +2607,7 @@ public class XplainStatisticsTest extend enableXplainStyle(s); JDBC.assertEmpty(s.executeQuery(queryText)); - disableXplainStyle(s, true); + disableXplainStyle(s); ResultSet rs = s.executeQuery( "SELECT STMT_ID, STMT_TEXT FROM XPLTEST.SYSXPLAIN_STATEMENTS"); Modified: db/derby/code/branches/10.10/java/tools/org/apache/derby/impl/tools/planexporter/CreateXMLFile.java URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.10/java/tools/org/apache/derby/impl/tools/planexporter/CreateXMLFile.java?rev=1631882&r1=1631881&r2=1631882&view=diff ============================================================================== --- db/derby/code/branches/10.10/java/tools/org/apache/derby/impl/tools/planexporter/CreateXMLFile.java (original) +++ db/derby/code/branches/10.10/java/tools/org/apache/derby/impl/tools/planexporter/CreateXMLFile.java Tue Oct 14 20:53:14 2014 @@ -21,8 +21,14 @@ package org.apache.derby.impl.tools.planexporter; +import java.io.BufferedWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.Writer; +import java.security.AccessController; +import java.security.PrivilegedActionException; +import java.security.PrivilegedExceptionAction; /** * This class is to create the final xml file, that will be used @@ -40,12 +46,15 @@ public class CreateXMLFile { /** * @param stmt statement executed * @param time time which the statement was executed - * @param out where to write the XML file + * @param data large xml data string array + * @param file_name name of the file to be written * @param xsl_sheet_name name of the style sheet + * @throws PrivilegedActionException * @throws IOException + * @throws PrivilegedActionException */ public void writeTheXMLFile(String stmt, String time, - Writer out, String xsl_sheet_name) + TreeNode[] data, final String file_name, String xsl_sheet_name) throws IOException { String defaultXML = "\n"; @@ -59,6 +68,20 @@ public class CreateXMLFile { String childTagStart = "
\n"; String childTagEnd = "
\n"; + FileOutputStream fos; + try { + fos = (FileOutputStream) AccessController.doPrivileged( + new PrivilegedExceptionAction() { + public Object run() throws IOException { + return new FileOutputStream(file_name); + } + }); + } catch (PrivilegedActionException pae) { + throw (IOException) pae.getCause(); + } + + Writer out = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")); + out.write(defaultXML); out.write(embedXSL); @@ -83,5 +106,6 @@ public class CreateXMLFile { out.write(childTagEnd); out.write(parentTagEnd); + out.close(); } } Modified: db/derby/code/branches/10.10/java/tools/org/apache/derby/tools/PlanExporter.java URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.10/java/tools/org/apache/derby/tools/PlanExporter.java?rev=1631882&r1=1631881&r2=1631882&view=diff ============================================================================== --- db/derby/code/branches/10.10/java/tools/org/apache/derby/tools/PlanExporter.java (original) +++ db/derby/code/branches/10.10/java/tools/org/apache/derby/tools/PlanExporter.java Tue Oct 14 20:53:14 2014 @@ -22,13 +22,7 @@ package org.apache.derby.tools; import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import org.apache.derby.impl.tools.planexporter.AccessDatabase; import org.apache.derby.impl.tools.planexporter.CreateHTMLFile; import org.apache.derby.impl.tools.planexporter.CreateXMLFile; @@ -231,33 +225,22 @@ public class PlanExporter { * @param stmt statement executed * @param time time which the statement was executed * @param xsl name of the style sheet - * @throws IOException if an error occurs when writing the XML file + * @throws Exception */ private static void generateXML(AccessDatabase access, - String arg, String stmt, String time, String xsl) - throws IOException { + String arg, String stmt, String time, String xsl) throws Exception{ CreateXMLFile xmlFile = new CreateXMLFile(access); - final String fileName = arg.toUpperCase().endsWith(".XML") - ? arg : (arg + ".xml"); - - Writer out; - try { - out = (Writer) AccessController.doPrivileged( - new PrivilegedExceptionAction() { - public Object run() throws IOException { - return new OutputStreamWriter( - new FileOutputStream(fileName), "UTF-8"); - } - }); - } catch (PrivilegedActionException pae) { - throw (IOException) pae.getCause(); + if(arg.toUpperCase().endsWith(".XML")){ + xmlFile.writeTheXMLFile(stmt, time, + access.getData(), + arg, xsl); } - - try { - xmlFile.writeTheXMLFile(stmt, time, out, xsl); - } finally { - out.close(); + else{ + xmlFile.writeTheXMLFile(stmt, time, + access.getData(), + arg.concat(".xml"), + xsl); } }