Author: shawkins
Date: 2011-06-27 23:47:29 -0400 (Mon, 27 Jun 2011)
New Revision: 3280
Added:
trunk/api/src/main/java/org/teiid/PolicyDecider.java
trunk/build/kits/jboss-container/teiid-docs/licenses/MPL-1.0.html
trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRolePolicyDecider.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DefaultAuthorizationValidator.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocumentWrapper.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/NodeWrapper.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/StreamingUtils.java
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
trunk/metadata/DATATYPES.INDEX
Removed:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRoleAuthorizationValidator.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/NodeTestUtil.java
Modified:
trunk/api/src/main/java/org/teiid/CommandContext.java
trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
trunk/build/kits/jboss-container/teiid-releasenotes.html
trunk/client/src/main/java/org/teiid/adminapi/DataPolicy.java
trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java
trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java
trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java
trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java
trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
trunk/common-core/src/main/java/org/teiid/core/TeiidException.java
trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java
trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java
trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapQueryExecution.java
trunk/console/src/main/resources/META-INF/rhq-plugin.xml
trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml
trunk/documentation/developer-guide/src/main/docbook/en-US/content/security.xml
trunk/documentation/reference/src/main/docbook/en-US/content/architecture.xml
trunk/documentation/reference/src/main/docbook/en-US/content/dataroles.xml
trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
trunk/documentation/reference/src/main/docbook/en-US/content/system_schema.xml
trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
trunk/engine/pom.xml
trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidator.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java
trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCachedResults.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestGroupingNode.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestJoinNode.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestUnionAllNode.java
trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
trunk/metadata/src/main/resources/System.vdb
trunk/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java
trunk/runtime/src/main/java/org/teiid/deployers/PgCatalogMetadataStore.java
trunk/runtime/src/main/java/org/teiid/odbc/ODBCServerRemoteImpl.java
trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
trunk/runtime/src/test/java/org/teiid/deployers/TestCompositeVDB.java
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractMMQueryTestCase.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractQueryTest.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDymamicImportedMetaData.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestVDBMerge.java
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMatViews.java
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestSystemVirtualModel.java
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestVirtualDocWithVirtualProc.java
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedureColumns.expected
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedures.expected
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProceduresWithEscape.expected
trunk/test-integration/common/src/test/resources/TestODBCSchema/test_PG_ATTRIBUTE.expected
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedureColumns.expected
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedures.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected
trunk/test-integration/db/src/test/java/org/teiid/dynamicvdb/TestVDBLessExecution.java
Log:
forward merge from 7.4.1
Modified: trunk/api/src/main/java/org/teiid/CommandContext.java
===================================================================
--- trunk/api/src/main/java/org/teiid/CommandContext.java 2011-06-28 03:27:07 UTC (rev
3279)
+++ trunk/api/src/main/java/org/teiid/CommandContext.java 2011-06-28 03:47:29 UTC (rev
3280)
@@ -23,12 +23,15 @@
package org.teiid;
import java.io.Serializable;
+import java.util.Map;
import java.util.Properties;
import java.util.TimeZone;
import javax.security.auth.Subject;
+import org.teiid.adminapi.DataPolicy;
import org.teiid.adminapi.Session;
+import org.teiid.adminapi.VDB;
/**
* Context information for the currently executing command.
@@ -117,5 +120,17 @@
* @return
*/
String getRequestId();
+
+ /**
+ * Get the user's data policies, never null
+ * @return
+ */
+ Map<String, DataPolicy> getAllowedDataPolicies();
+
+ /**
+ * Get the current vdb
+ * @return
+ */
+ VDB getVdb();
}
Copied: trunk/api/src/main/java/org/teiid/PolicyDecider.java (from rev 3275,
branches/7.4.x/api/src/main/java/org/teiid/PolicyDecider.java)
===================================================================
--- trunk/api/src/main/java/org/teiid/PolicyDecider.java (rev 0)
+++ trunk/api/src/main/java/org/teiid/PolicyDecider.java 2011-06-28 03:47:29 UTC (rev
3280)
@@ -0,0 +1,79 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid;
+
+import java.util.Set;
+
+import org.teiid.adminapi.DataPolicy.Context;
+import org.teiid.adminapi.DataPolicy.PermissionType;
+
+/**
+ * A policy decider that reports authorization decisions for further action.
+ * A decider may be called many times for a single user command. Typically there will be
1 call for every
+ * command/subquery/temp table access/function call.
+ */
+public interface PolicyDecider {
+
+ /**
+ * Called by the system hasRole function to determine role membership.
+ * @param roleName
+ * @param context
+ * @return true if the user has the given role name, otherwise false
+ */
+ boolean hasRole(String roleName, CommandContext context);
+
+ /**
+ * Returns the set of resources not allowed to be accessed by the current user.
+ * Resource names are given based upon the FQNs (NOTE these are non-SQL names -
identifiers are not quoted).
+ * @param action
+ * @param resources
+ * @param context in which the action is performed.
+ * For example you can have a context of {@link Context#UPDATE} for a {@link
PermissionType#READ} for columns used in an UPDATE condition.
+ * @param commandContext
+ * @return the set of inaccessible resources, never null
+ */
+ Set<String> getInaccessibleResources(PermissionType action,
+ Set<String> resources, Context context,
+ CommandContext commandContext);
+
+ /**
+ * Checks if the given temp table is accessible. Typically as long as temp tables can
be created, all operations are allowed.
+ * Resource names are given based upon the FQNs (NOTE these are non-SQL names -
identifiers are not quoted).
+ * @param action
+ * @param resource
+ * @param context in which the action is performed.
+ * For example you can have a context of {@link Context#UPDATE} for a {@link
PermissionType#READ} for columns used in an UPDATE condition.
+ * @param commandContext
+ * @return true if the access is allowed, otherwise false
+ */
+ boolean isTempAccessable(PermissionType action, String resource,
+ Context context, CommandContext commandContext);
+
+ /**
+ * Determines if an authorization check should proceed
+ * @param commandContext
+ * @return
+ */
+ boolean validateCommand(CommandContext commandContext);
+
+}
Modified: trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml
===================================================================
--- trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/build/kits/jboss-container/deploy/teiid/teiid-jboss-beans.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -25,15 +25,15 @@
<!-- The max row count of a batch from a connector. Should be even multiple of
processorBatchSize. (default 1024) -->
<property name="connectorBatchSize">1024</property>
<!--
- The number of batch columns to allow in buffer memory. -1 means to
automatically calculate a value (default -1).
+ The approximate amount of buffer memory in kilobytes allowable for a single
processing operation (sort, grouping, etc.) regardless of existing memory commitments. -1
means to automatically calculate a value (default -1).
See the admin guide for more.
-->
- <property name="maxReserveBatchColumns">-1</property>
+ <property name="maxReserveKb">-1</property>
<!--
- The number of batch columns guaranteed to a processing operation. -1 means to
automatically calculate a value (default -1).
+ The approximate amount of memory in kilobytes allowed to be held by the
buffer manager. -1 means to automatically calculate a value (default -1).
See the admin guide for more.
-->
- <property name="maxProcessingBatchesColumns">-1</property>
+ <property name="maxProcessingKb">-1</property>
<!-- Max File size in MB (default 2GB)-->
<property name="maxFileSize">2048</property>
<!-- Max storage space, in MB, to be used for buffer files (default 50G)
-->
@@ -101,7 +101,7 @@
<property name="cacheFactory"><inject
bean="CacheFactory"/></property>
<property name="resultsetCacheConfig"><inject
bean="ResultsetCacheConfig"/></property>
<property name="preparedPlanCacheConfig"><inject
bean="PreparedPlanCacheConfig"/></property>
-
+ <property name="authorizationValidator"><inject
bean="AuthorizationValidator"/></property>
<!-- Process pool maximum thread count. (default 64) -->
<property name="maxThreads">64</property>
<!-- Max active plans (default 20). Increase this value on highly concurrent
systems - but ensure that the underlying pools can handle the increased load without
timeouts. -->
@@ -117,12 +117,6 @@
<property name="maxRowsFetchSize">20480</property>
<!-- The max lob chunk size in KB transferred each time when processing blobs,
clobs (100KB default) -->
<property name="lobChunkSizeInKB">100</property>
- <!-- Turn on role checking based upon the data roles defined in VDBs. (default
true) -->
- <property name="useDataRoles">true</property>
- <!-- Sets whether temporary table usage is allowed by default with data roles
enabled. If false, the user must have a role that grants creates temporary table rights to
use temporary tables. (default true) -->
- <property
name="allowCreateTemporaryTablesByDefault">true</property>
- <!-- Sets whether functions may be called by default with data roles enabled.
If false, a specific permission must exist to call the function. (default true) -->
- <property
name="allowFunctionCallsByDefault">true</property>
<!-- Long running query threshold, after which a alert can be generated by
tooling if configured-->
<property name="queryThresholdInSecs">600</property>
<!-- Maximum rows allowed from a source query. -1 indicates no limit. (default
-1)-->
@@ -136,6 +130,24 @@
<!-- Set to true for the engine to detect local change events. Should be
disabled if using external change data capture tools. (default true) -->
<property name="detectingChangeEvents">true</property>
</bean>
+
+ <!-- An authorization validator that by default uses data role information stored
in VDBs -->
+ <bean name="AuthorizationValidator"
class="org.teiid.dqp.internal.process.DefaultAuthorizationValidator">
+ <!-- Turn on authorization checking (default true) -->
+ <property name="enabled">true</property>
+ <!-- The policy decider to use. (default AuthorizationValidator).
+ This instance may be changed to another org.teiid.PolicyDecider if needed.
+ -->
+ <property name="policyDecider"><inject
bean="PolicyDecider"/></property>
+ </bean>
+
+ <!-- A policy decider that uses data role information stored in VDBs -->
+ <bean name="PolicyDecider"
class="org.teiid.dqp.internal.process.DataRolePolicyDecider">
+ <!-- Sets whether temporary table usage is allowed by default with data roles
enabled. If false, the user must have a role that grants creates temporary table rights to
use temporary tables. (default true) -->
+ <property
name="allowCreateTemporaryTablesByDefault">true</property>
+ <!-- Sets whether functions may be called by default with data roles enabled.
If false, a specific permission must exist to call the function. (default true) -->
+ <property
name="allowFunctionCallsByDefault">true</property>
+ </bean>
<!-- JDBC Socket connection properties (SSL see below) -->
<bean name="JdbcSocketConfiguration"
class="org.teiid.transport.SocketConfiguration">
Copied: trunk/build/kits/jboss-container/teiid-docs/licenses/MPL-1.0.html (from rev 3275,
branches/7.4.x/build/kits/jboss-container/teiid-docs/licenses/MPL-1.0.html)
===================================================================
--- trunk/build/kits/jboss-container/teiid-docs/licenses/MPL-1.0.html
(rev 0)
+++ trunk/build/kits/jboss-container/teiid-docs/licenses/MPL-1.0.html 2011-06-28 03:47:29
UTC (rev 3280)
@@ -0,0 +1,421 @@
+<html><head>
+<meta http-equiv="content-type" content="text/html;
charset=UTF-8"><title>Mozilla Public License version 1.0</title>
+</head><body link="#0000ee" text="#000000"
vlink="#551a8b" alink="#ff0000" bgcolor="#ffffff">
+
+<p align="CENTER">
+ <font size="+2"><b>MOZILLA PUBLIC
LICENSE</b></font><br>
+ <b>Version 1.0</b>
+</p>
+
+<p></p><hr width="20%"><p>
+
+</p><p><b>1. Definitions.</b>
+</p><ul>
+
+ <b>1.1. ``Contributor''</b> means each entity that creates or
contributes
+ to the creation of Modifications.
+
+ <p><b>1.2. ``Contributor Version''</b> means the
combination of the
+ Original Code, prior Modifications used by a Contributor, and the
+ Modifications made by that particular Contributor.
+
+ </p><p><b>1.3. ``Covered Code''</b> means the
Original Code or Modifications
+ or the combination of the Original Code and Modifications, in each case
+ including portions thereof<b>.</b>
+
+ </p><p><b>1.4. ``Electronic Distribution
Mechanism''</b> means a mechanism
+ generally accepted in the software development community for the
+ electronic transfer of data.
+
+ </p><p><b>1.5. ``Executable''</b> means Covered Code
in any form other than
+ Source Code.
+
+ </p><p><b>1.6. ``Initial Developer''</b> means the
individual or entity
+ identified as the Initial Developer in the Source Code notice required by
+ <b>Exhibit A</b>.
+
+ </p><p><b>1.7. ``Larger Work''</b> means a work which
combines Covered Code
+ or portions thereof with code not governed by the terms of this License.
+
+ </p><p><b>1.8. ``License''</b> means this document.
+
+ </p><p><b>1.9. ``Modifications''</b> means any
addition to or deletion from
+ the substance or structure of either the Original Code or any previous
+ Modifications. When Covered Code is released as a series of files, a
+ Modification is:
+
+ </p><ul>
+
+ <p><b>A.</b> Any addition to or deletion from the contents of a file
+ containing Original Code or previous Modifications.
+
+ </p><p><b>B.</b> Any new file that contains any part of the
Original
+ Code or previous Modifications.
+
+ </p></ul>
+
+ <p><b>1.10. ``Original Code''</b> means Source Code of
computer software
+ code which is described in the Source Code notice required by <b>Exhibit
+ A</b> as Original Code, and which, at the time of its release under this
+ License is not already Covered Code governed by this License.
+
+ </p><p><b>1.11. ``Source Code''</b> means the
preferred form of the Covered
+ Code for making modifications to it, including all modules it contains,
+ plus any associated interface definition files, scripts used to control
+ compilation and installation of an Executable, or a list of source code
+ differential comparisons against either the Original Code or another well
+ known, available Covered Code of the Contributor's choice. The Source
+ Code can be in a compressed or archival form, provided the appropriate
+ decompression or de-archiving software is widely available for no charge.
+
+ </p><p><b>1.12. ``You''</b> means an individual or a
legal entity exercising
+ rights under, and complying with all of the terms of, this License or a
+ future version of this License issued under Section 6.1. For legal
+ entities, ``You'' includes any entity which controls, is controlled by,
+ or is under common control with You. For purposes of this definition,
+ ``control'' means (a) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or otherwise,
+ or (b) ownership of fifty percent (50%) or more of the outstanding shares
+ or beneficial ownership of such entity.
+
+</p></ul>
+<b>2. Source Code License.</b>
+<ul>
+
+ <b>2.1. The Initial Developer Grant.</b>
+
+ <br>The Initial Developer hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+
+ <ul>
+
+ <p><b>(a)</b> to use, reproduce, modify, display, perform, sublicense
+ and distribute the Original Code (or portions thereof) with or
+ without Modifications, or as part of a Larger Work; and
+
+ </p><p><b>(b)</b> under patents now or hereafter owned or
controlled by
+ Initial Developer, to make, have made, use and sell (``Utilize'') the
+ Original Code (or portions thereof), but solely to the extent that
+ any such patent is reasonably necessary to enable You to Utilize the
+ Original Code (or portions thereof) and not to any greater extent
+ that may be necessary to Utilize further Modifications or
+ combinations.
+ </p></ul>
+
+ <p><b>2.2. Contributor Grant.</b>
+
+ <br>Each Contributor hereby grants You a world-wide, royalty-free,
+ non-exclusive license, subject to third party intellectual property
+ claims:
+
+ </p><ul>
+
+ <p><b>(a)</b> to use, reproduce, modify, display, perform,
sublicense and
+ distribute the Modifications created by such Contributor (or portions
+ thereof) either on an unmodified basis, with other Modifications, as
+ Covered Code or as part of a Larger Work; and
+
+ </p><p><b>(b)</b> under patents now or hereafter owned or
controlled by
+ Contributor, to Utilize the Contributor Version (or portions thereof),
+ but solely to the extent that any such patent is reasonably necessary to
+ enable You to Utilize the Contributor Version (or portions thereof), and
+ not to any greater extent that may be necessary to Utilize further
+ Modifications or combinations.
+
+ </p></ul>
+
+</ul>
+<b>3. Distribution Obligations.</b>
+<ul>
+
+ <b>3.1. Application of License.</b>
+
+ <br>The Modifications which You create or to which You contribute are
+ governed by the terms of this License, including without limitation
+ Section <b>2.2</b>. The Source Code version of Covered Code may be
+ distributed only under the terms of this License or a future version of
+ this License released under Section <b>6.1</b>, and You must include a
+ copy of this License with every copy of the Source Code You
+ distribute. You may not offer or impose any terms on any Source Code
+ version that alters or restricts the applicable version of this License
+ or the recipients' rights hereunder. However, You may include an
+ additional document offering the additional rights described in Section
+ <b>3.5</b>.
+
+ <p><b>3.2. Availability of Source Code.</b>
+
+ <br>Any Modification which You create or to which You contribute must be
+ made available in Source Code form under the terms of this License either
+ on the same media as an Executable version or via an accepted Electronic
+ Distribution Mechanism to anyone to whom you made an Executable version
+ available; and if made available via Electronic Distribution Mechanism,
+ must remain available for at least twelve (12) months after the date it
+ initially became available, or at least six (6) months after a subsequent
+ version of that particular Modification has been made available to such
+ recipients. You are responsible for ensuring that the Source Code version
+ remains available even if the Electronic Distribution Mechanism is
+ maintained by a third party.
+
+ </p><p><b>3.3. Description of Modifications.</b>
+
+ <br>You must cause all Covered Code to which you contribute to contain a
+ file documenting the changes You made to create that Covered Code and the
+ date of any change. You must include a prominent statement that the
+ Modification is derived, directly or indirectly, from Original Code
+ provided by the Initial Developer and including the name of the Initial
+ Developer in (a) the Source Code, and (b) in any notice in an Executable
+ version or related documentation in which You describe the origin or
+ ownership of the Covered Code.
+
+ </p><p><b>3.4. Intellectual Property Matters</b>
+ </p><ul>
+
+ <p><b>(a) Third Party Claims</b>.
+
+ <br>If You have knowledge that a party claims an intellectual
+ property right in particular functionality or code (or its
+ utilization under this License), you must include a text file with
+ the source code distribution titled ``LEGAL'' which describes the
+ claim and the party making the claim in sufficient detail that a
+ recipient will know whom to contact. If you obtain such knowledge
+ after You make Your Modification available as described in Section
+ <b>3.2</b>, You shall promptly modify the LEGAL file in all copies
+ You make available thereafter and shall take other steps (such as
+ notifying appropriate mailing lists or newsgroups) reasonably
+ calculated to inform those who received the Covered Code that new
+ knowledge has been obtained.
+
+ </p><p><b>(b) Contributor APIs</b>.
+
+ <br>If Your Modification is an application programming interface and
+ You own or control patents which are reasonably necessary to
+ implement that API, you must also include this information in the
+ LEGAL file.
+
+ </p></ul>
+
+ <p><b>3.5. Required Notices.</b>
+
+ <br>You must duplicate the notice in <b>Exhibit A</b> in each file
of the
+ Source Code, and this License in any documentation for the Source Code,
+ where You describe recipients' rights relating to Covered Code. If You
+ created one or more Modification(s), You may add your name as a
+ Contributor to the notice described in <b>Exhibit A</b>. If it is not
+ possible to put such notice in a particular Source Code file due to its
+ structure, then you must include such notice in a location (such as a
+ relevant directory file) where a user would be likely to look for such a
+ notice. You may choose to offer, and to charge a fee for, warranty,
+ support, indemnity or liability obligations to one or more recipients of
+ Covered Code. However, You may do so only on Your own behalf, and not on
+ behalf of the Initial Developer or any Contributor. You must make it
+ absolutely clear than any such warranty, support, indemnity or liability
+ obligation is offered by You alone, and You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of warranty, support,
+ indemnity or liability terms You offer.
+
+ </p><p><b>3.6. Distribution of Executable Versions.</b>
+
+ <br>You may distribute Covered Code in Executable form only if the
+ requirements of Section <b>3.1-3.5</b> have been met for that Covered
+ Code, and if You include a notice stating that the Source Code version of
+ the Covered Code is available under the terms of this License, including
+ a description of how and where You have fulfilled the obligations of
+ Section <b>3.2</b>. The notice must be conspicuously included in any
+ notice in an Executable version, related documentation or collateral in
+ which You describe recipients' rights relating to the Covered Code. You
+ may distribute the Executable version of Covered Code under a license of
+ Your choice, which may contain terms different from this License,
+ provided that You are in compliance with the terms of this License and
+ that the license for the Executable version does not attempt to limit or
+ alter the recipient's rights in the Source Code version from the rights
+ set forth in this License. If You distribute the Executable version under
+ a different license You must make it absolutely clear that any terms
+ which differ from this License are offered by You alone, not by the
+ Initial Developer or any Contributor. You hereby agree to indemnify the
+ Initial Developer and every Contributor for any liability incurred by the
+ Initial Developer or such Contributor as a result of any such terms You
+ offer.
+
+ </p><p><b>3.7. Larger Works.</b>
+
+ <br>You may create a Larger Work by combining Covered Code with other
+ code not governed by the terms of this License and distribute the Larger
+ Work as a single product. In such a case, You must make sure the
+ requirements of this License are fulfilled for the Covered Code.
+
+</p></ul>
+<b>4. Inability to Comply Due to Statute or Regulation.</b>
+<ul>
+
+ <p>If it is impossible for You to comply with any of the terms of this
+ License with respect to some or all of the Covered Code due to statute or
+ regulation then You must: (a) comply with the terms of this License to
+ the maximum extent possible; and (b) describe the limitations and the
+ code they affect. Such description must be included in the LEGAL file
+ described in Section <b>3.4</b> and must be included with all
+ distributions of the Source Code. Except to the extent prohibited by
+ statute or regulation, such description must be sufficiently detailed for
+ a recipient of ordinary skill
+ to be able to understand it.
+
+</p></ul>
+<b>5. Application of this License.</b>
+<ul>
+
+ This License applies to code to which the Initial Developer has attached
+ the notice in <b>Exhibit A</b>, and to related Covered Code.
+
+</ul>
+<b>6. Versions of the License.</b>
+<ul>
+
+ <b>6.1. New Versions</b>.
+
+ <br>Netscape Communications Corporation (``Netscape'') may publish
+ revised and/or new versions of the License from time to time. Each
+ version will be given a distinguishing version number.
+
+ <p><b>6.2. Effect of New Versions</b>.
+
+ <br>Once Covered Code has been published under a particular version of
+ the License, You may always continue to use it under the terms of that
+ version. You may also choose to use such Covered Code under the terms of
+ any subsequent version of the License published by Netscape. No one other
+ than Netscape has the right to modify the terms applicable to Covered
+ Code created under this License.
+
+ </p><p><b>6.3. Derivative Works</b>.
+
+ <br>If you create or use a modified version of this License (which you
+ may only do in order to apply it to code which is not already Covered
+ Code governed by this License), you must (a) rename Your license so that
+ the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'',
``Netscape'', ``NPL''
+ or any confusingly similar phrase do not appear anywhere in your license
+ and (b) otherwise make it clear that your version of the license contains
+ terms which differ from the Mozilla Public License and Netscape Public
+ License. (Filling in the name of the Initial Developer, Original Code or
+ Contributor in the notice described in <b>Exhibit A</b> shall not of
+ themselves be deemed to be modifications of this License.)
+
+</p></ul>
+<b>7. DISCLAIMER OF WARRANTY.</b>
+<ul>
+
+ COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
+ WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
+ WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS,
+ MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
+ RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH
+ YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE
+ INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY
+ NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY
+ CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE
+ IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
+
+</ul>
+<b>8. TERMINATION.</b>
+<ul>
+
+ This License and the rights granted hereunder will terminate
+ automatically if You fail to comply with terms herein and fail to cure
+ such breach within 30 days of becoming aware of the breach. All
+ sublicenses to the Covered Code which are properly granted shall survive
+ any termination of this License. Provisions which, by their nature, must
+ remain in effect beyond the termination of this License shall survive.
+
+</ul>
+<b>9. LIMITATION OF LIABILITY.</b>
+<ul>
+
+ UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING
+ NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY
+ OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF
+ ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY
+ INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER
+ INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK
+ STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER
+ COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED
+ OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL
+ NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH
+ PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH
+ LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION
+ OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION
+ MAY NOT APPLY TO YOU.
+
+</ul>
+<b>10. U.S. GOVERNMENT END USERS.</b>
+<ul>
+
+ The Covered Code is a ``commercial item,'' as that term is defined in 48
+ C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software''
+ and ``commercial computer software documentation,'' as such terms are
+ used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212
+ and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all
+ U.S. Government End Users acquire Covered Code with only those rights set
+ forth herein.
+
+</ul>
+<b>11. MISCELLANEOUS.</b>
+<ul>
+
+ This License represents the complete agreement concerning subject matter
+ hereof. If any provision of this License is held to be unenforceable,
+ such provision shall be reformed only to the extent necessary to make it
+ enforceable. This License shall be governed by California law provisions
+ (except to the extent applicable law, if any, provides otherwise),
+ excluding its conflict-of-law provisions. With respect to disputes in
+ which at least one party is a citizen of, or an entity chartered or
+ registered to do business in, the United States of America: (a) unless
+ otherwise agreed in writing, all disputes relating to this License
+ (excepting any dispute relating to intellectual property rights) shall be
+ subject to final and binding arbitration, with the losing party paying
+ all costs of arbitration; (b) any arbitration relating to this Agreement
+ shall be held in Santa Clara County, California, under the auspices of
+ JAMS/EndDispute; and (c) any litigation relating to this Agreement shall
+ be subject to the jurisdiction of the Federal Courts of the Northern
+ District of California, with venue lying in Santa Clara County,
+ California, with the losing party responsible for costs, including
+ without limitation, court costs and reasonable attorneys fees and
+ expenses. The application of the United Nations Convention on Contracts
+ for the International Sale of Goods is expressly excluded. Any law or
+ regulation which provides that the language of a contract shall be
+ construed against the drafter shall not apply to this License.
+
+</ul>
+<b>12. RESPONSIBILITY FOR CLAIMS.</b>
+<ul>
+
+ Except in cases where another Contributor has failed to comply with
+ Section <b>3.4</b>, You are responsible for damages arising, directly or
+ indirectly, out of Your utilization of rights under this License, based
+ on the number of copies of Covered Code you made available, the revenues
+ you received from utilizing such rights, and other relevant factors. You
+ agree to work with affected parties to distribute responsibility on an
+ equitable basis.
+
+</ul>
+<b>EXHIBIT A.</b>
+<ul>
+
+ ``The contents of this file are subject to the Mozilla Public License
+ Version 1.0 (the "License"); you may not use this file except in
+ compliance with the License. You may obtain a copy of the License at
+
http://www.mozilla.org/MPL/
+
+ <p>Software distributed under the License is distributed on an "AS
IS"
+ basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ License for the specific language governing rights and limitations under
+ the License.
+
+ </p><p>The Original Code is ______________________________________.
+
+ </p><p>The Initial Developer of the Original Code is
+ ________________________. Portions created by ______________________ are
+ Copyright (C) ______ _______________________. All Rights Reserved.
+
+ </p><p>Contributor(s): ______________________________________.''
+
+</p></ul>
+</body></html>
\ No newline at end of file
Modified: trunk/build/kits/jboss-container/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-06-28 03:27:07 UTC (rev
3279)
+++ trunk/build/kits/jboss-container/teiid-releasenotes.html 2011-06-28 03:47:29 UTC (rev
3280)
@@ -30,6 +30,9 @@
<LI><B>MAKEIND Hint</B> - The MAKEIND hint can be used to indicate
that the other side of the join should be made dependent.
<LI><B>ODBC SSL</B> - added support for SSL encrypted ODBC
connections.
<LI><B>Reauthentication Statement</B> - SET SESSION AUTHORIZATION can
now be used to perform a reauthentication via JDBC or ODBC.
+ <LI><B>Pluggable Authorization</B> - an alternative PolicyDecider can
be defined in the teiid-jboss-beans.xml file to customize authorization decisions.
+ <LI><B>Streaming XQuery</B> - in situations where document projection
applies if the XMLQUERY/XMLTABLE path expressions meet certain conditions, then the
incoming document will not only be projected, but the independent subtrees will be
processed without loading the entire document. This allows for nearly arbitrarily large
XML documents to be processed. See the Reference for more.
+ <LI><B>Logging Procedures</B> - added SYSADMIN.isLoggable and
SYSADMIN.logMsg to aid in debugging procedure logic.
<LI><B>ANSI OFFSET/FETCH FIRST</B> - instead of the limit clause, a
standard OFFSET and/or FETCH FIRST/NEXT clause can be used to limit results.
</UL>
<h2><a name="Compatibility">Compatibility
Issues</a></h2>
@@ -105,6 +108,12 @@
See the <a href="teiid-docs/teiid_admin_guide.pdf">Admin Guide</a>
for more on configuration and installation.
+<h4>from 7.4</h4>
+<ul>
+ <LI>The configuration for authorization has been moved off of the
RuntimeEngineDeployer bean and onto separate AuthorizationValidator and PolicyDecider
beans.
+ <LI>The configuration for the buffer manager has been simplified to refer to
memory sizes in KB, rather than batch columns.
+</ul>
+
<h4>from 7.3</h4>
<ul>
<LI>The default value for the JDBC dynamic vdb importer setting
importer.useFullSchemaName is now true, which matches the expected behavior from the
documentation.
@@ -159,7 +168,8 @@
<li>TEIID-1008 - Most versions of Oracle and MySQL do not support deeply nested
correlated references. There is currently no workaround for this issue.
<li>For compatibility with the 7.0 release if a stored procedure parameter list
begins with identifier=, then it will be parsed as a named parameter invocation even if
the intent was to use a comparison predicate
as the first parameter value. The workaround is to use nesting parens, e.g. call
proc((identifier=value), ...), which clarifies that this is positional value. This
workaround will not be needed in later releases.
- <li><a
url="https://issues.jboss.org/browse/TEIID-1511">TEIID-1511&... - When
a VDB is deployed and undeployed a socket is left open, which may lead to "too manay
open files". Check the defect comments for details.
+ <li><a
url="https://issues.jboss.org/browse/TEIID-1511">TEIID-1511&... - When
a VDB is deployed and undeployed a socket is left open, which may lead to "too manay
open files". Check the defect comments for details.
+ <li>TEIID-1648 - Teradata lobs can only be consistently read from an embedded
client (with the default option to use the calling thread) and in single threaded mode
(transactional or userRequestSourceConcurrency=1). Usage of Teradata lobs under any other
configuration is unlikely to work.
</ul>
<h4>from 7.0</h4>
<ul>
@@ -175,6 +185,11 @@
<h2><a name="LibraryUpdates">Thirdparty Library
Updates</a></h2>
The following components have been updated:
+
+<h4>From 7.4</h4>
+<ul>
+ <li>nux 1.6, and xom 1.2 were added.
+</ul>
<h4>From 7.1</h4>
<ul>
<li>json-simple 1.1 was added.
Modified: trunk/client/src/main/java/org/teiid/adminapi/DataPolicy.java
===================================================================
--- trunk/client/src/main/java/org/teiid/adminapi/DataPolicy.java 2011-06-28 03:27:07 UTC
(rev 3279)
+++ trunk/client/src/main/java/org/teiid/adminapi/DataPolicy.java 2011-06-28 03:47:29 UTC
(rev 3280)
@@ -25,8 +25,20 @@
public interface DataPolicy {
- public enum PermissionType {CREATE, READ, UPDATE, DELETE, ALTER, EXECUTE};
+ public enum Context {
+ CREATE,
+ DROP,
+ QUERY,
+ INSERT,
+ UPDATE,
+ DELETE,
+ FUNCTION,
+ ALTER,
+ STORED_PROCEDURE;
+ }
+ public enum PermissionType {CREATE, READ, UPDATE, DELETE, ALTER, EXECUTE, DROP};
+
/**
* Get the Name of the Data Policy
* @return
Modified: trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java 2011-06-28 03:27:07 UTC (rev
3279)
+++ trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java 2011-06-28 03:47:29 UTC (rev
3280)
@@ -82,6 +82,8 @@
* conforms to the subclass DataDirect uses for SocketExceptions.
*/
public static final String CONNECTION_EXCEPTION_STALE_CONNECTION = "08S01";
//$NON-NLS-1$
+
+ public static final String QUERY_CANCELED = "57014"; //$NON-NLS-1$
// Class 28 - invalid authorization specification
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/SQLStates.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/SQLStates.java:3220-3275
Modified: trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java 2011-06-28 03:27:07 UTC
(rev 3279)
+++ trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java 2011-06-28 03:47:29 UTC
(rev 3280)
@@ -149,7 +149,7 @@
private Serializable payload;
/** List of INSERT, UPDATE, DELETE AND SELECT INTO commands */
- private List batchedUpdates;
+ private List<String> batchedUpdates;
/** Array of update counts as returned by executeBatch() */
protected int[] updateCounts;
@@ -200,7 +200,7 @@
String queryTimeoutStr =
this.execProps.getProperty(ExecutionProperties.QUERYTIMEOUT);
if(queryTimeoutStr != null) {
try {
- this.queryTimeoutMS = Integer.parseInt(fetchSizeStr)*1000;
+ this.queryTimeoutMS = Integer.parseInt(queryTimeoutStr)*1000;
} catch(Exception e) {
// silently failover to default
}
@@ -240,26 +240,18 @@
this.batchedUpdates = null;
this.updateCounts = null;
this.outParamIndexMap.clear();
+ this.commandStatus = State.RUNNING;
}
- /**
- * Adds sql to this statement object's current list of commands.
- * @param sql statement to be added to the batch
- */
public void addBatch(String sql) throws SQLException {
//Check to see the statement is closed and throw an exception
checkStatement();
if (batchedUpdates == null) {
- batchedUpdates = new ArrayList();
+ batchedUpdates = new ArrayList<String>();
}
batchedUpdates.add(sql);
}
- /**
- * This method can be used by one thread to cancel a statement that is being
- * executed by another thread.
- * @throws SQLException should never occur.
- */
public void cancel() throws SQLException {
/* Defect 19848 - Mark the statement cancelled before sending the CANCEL
request.
* Otherwise, it's possible get into a race where the server response is
quicker
@@ -271,10 +263,6 @@
cancelRequest();
}
- /**
- * Warning could be schema validation errors or partial results warnings.
- * @throws SQLException should never occur.
- */
public void clearWarnings() throws SQLException {
//Check to see the statement is closed and throw an exception
checkStatement();
@@ -283,22 +271,12 @@
serverWarnings = null;
}
- /**
- * Makes the set of commands in the current batch empty.
- *
- * @throws SQLException if a database access error occurs or the
- * driver does not support batch statements
- */
public void clearBatch() throws SQLException {
- batchedUpdates.clear();
+ if (batchedUpdates != null) {
+ batchedUpdates.clear();
+ }
}
- /**
- * In many cases, it is desirable to immediately release a Statements's database
- * and JDBC resources instead of waiting for this to happen when it is automatically
- * closed; the close method provides this immediate release.
- * @throws SQLException should never occur.
- */
public void close() throws SQLException {
if ( isClosed ) {
return;
@@ -345,7 +323,7 @@
if (batchedUpdates == null || batchedUpdates.isEmpty()) {
return new int[0];
}
- String[] commands = (String[])batchedUpdates.toArray(new
String[batchedUpdates.size()]);
+ String[] commands = batchedUpdates.toArray(new String[batchedUpdates.size()]);
executeSql(commands, true, ResultsMode.UPDATECOUNT, true);
return updateCounts;
}
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/StatementImpl.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/main/java/org/teiid/jdbc/StatementImpl.java:3149-3217
+
/branches/7.4.x/client/src/main/java/org/teiid/jdbc/StatementImpl.java:3149-3217,3220-3275
Modified: trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java 2011-06-28 03:47:29
UTC (rev 3280)
@@ -32,6 +32,7 @@
import org.teiid.client.ProcedureErrorInstructionException;
import org.teiid.client.security.InvalidSessionException;
import org.teiid.client.security.LogonException;
+import org.teiid.client.util.ExceptionUtil;
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.TeiidException;
import org.teiid.core.TeiidRuntimeException;
@@ -102,10 +103,13 @@
return new TeiidSQLException((SQLException) exception, message, true);
}
String sqlState = SQLStates.DEFAULT;
-
- exception = findRootException(exception);
-
- sqlState = determineSQLState(exception, sqlState);
+ TeiidException te = ExceptionUtil.getExceptionOfType(exception, TeiidException.class);
+ if (te != null && te.getCode() != null) {
+ sqlState = te.getCode();
+ } else {
+ exception = findRootException(exception);
+ sqlState = determineSQLState(exception, sqlState);
+ }
return new TeiidSQLException(origException, message, sqlState);
}
Property changes on: trunk/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/main/java/org/teiid/jdbc/TeiidSQLException.java:3220-3275
Modified: trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java
===================================================================
--- trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java 2011-06-28 03:47:29
UTC (rev 3280)
@@ -22,6 +22,8 @@
package org.teiid.jdbc;
+import static org.junit.Assert.*;
+
import java.io.IOException;
import java.net.ConnectException;
import java.net.MalformedURLException;
@@ -31,23 +33,21 @@
import java.net.UnknownHostException;
import java.sql.SQLException;
-import junit.framework.TestCase;
-
+import org.junit.Test;
import org.teiid.client.ProcedureErrorInstructionException;
-import org.teiid.core.TeiidProcessingException;
import org.teiid.core.TeiidException;
-import org.teiid.core.TeiidException;
+import org.teiid.core.TeiidProcessingException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.net.CommunicationException;
import org.teiid.net.ConnectionException;
-public class TestSQLException extends TestCase {
+public class TestSQLException {
/*
* Test method for 'com.metamatrix.jdbc.MMSQLException.MMSQLException()'
*/
- public void testMMSQLException() {
+ @Test public void testMMSQLException() {
TeiidSQLException e = new TeiidSQLException();
String sqlState = e.getSQLState();
Throwable cause = e.getCause();
@@ -82,7 +82,7 @@
* Tests various simple exceptions to see if the expected SQLState is
* returend.
*/
- public void testCreateThrowable_01() {
+ @Test public void testCreateThrowable_01() {
testCreateThrowable(new CommunicationException(
"A test MM Communication Exception"), //$NON-NLS-1$
SQLStates.CONNECTION_EXCEPTION_STALE_CONNECTION);
@@ -133,7 +133,7 @@
* Tests various nested exceptions to see if the expected SQLState is
* returend.
*/
- public void testCreateThrowable_02() {
+ @Test public void testCreateThrowable_02() {
testCreateThrowable(
new CommunicationException(new ConnectException(
"A test java.net.ConnectException"), //$NON-NLS-1$
@@ -150,7 +150,7 @@
SQLStates.CONNECTION_EXCEPTION_STALE_CONNECTION);
}
- public void testCreateThrowable3() {
+ @Test public void testCreateThrowable3() {
TeiidSQLException e = testCreateThrowable(
new TeiidException(
new TeiidRuntimeException(
@@ -180,31 +180,15 @@
Throwable nestedException = e.getCause();
SQLException nextException = e.getNextException();
- assertTrue("Expected MMSQLException.getSQLState() to return \""
//$NON-NLS-1$
- + esqlState + "\" but got \"" + sqlState + "\"
instead.", //$NON-NLS-1$ //$NON-NLS-2$
- sqlState.compareTo(esqlState) == 0);
- assertTrue("Expected MMSQLException.getCause() to return [" //$NON-NLS-1$
- + (ecause != null ? ecause.getClass().getName() : "<null>")
//$NON-NLS-1$
- + "] but got [" //$NON-NLS-1$
- + (cause != null ? cause.getClass().getName() : "<unknown>")
//$NON-NLS-1$
- + "] instead.", cause == ecause); //$NON-NLS-1$
- assertTrue(
- "Expected MMSQLException.getErrorCode() to return [0] but got ["
//$NON-NLS-1$
- + errorCode + "] instead.", errorCode == 0); //$NON-NLS-1$
- assertTrue("Expected MMSQLException.getNestedException() to return ["
//$NON-NLS-1$
- + (ecause != null ? ecause.getClass().getName() : "<null>")
//$NON-NLS-1$
- + "] but got [" //$NON-NLS-1$
- + (nestedException != null ? nestedException.getClass()
- .getName() : "<unknown>") + "] instead.", //$NON-NLS-1$
//$NON-NLS-2$
- nestedException == ecause);
- assertTrue(
- "Expected MMSQLException.getNextException() to return <null> but got a
SQLException with message \"" //$NON-NLS-1$
- + (nextException != null ? nextException.getMessage()
- : "") + "\" instead.", nextException == null);
//$NON-NLS-1$ //$NON-NLS-2$
+ assertEquals(esqlState, sqlState);
+ assertEquals(ecause, cause);
+ assertEquals(0, errorCode);
+ assertEquals(nestedException, ecause);
+ assertNull(nextException);
return e;
}
- public void testCreate() {
+ @Test public void testCreate() {
TeiidSQLException exception = TeiidSQLException.create(new Exception());
assertEquals(exception.getMessage(), Exception.class.getName());
@@ -214,7 +198,7 @@
assertEquals(exception, TeiidSQLException.create(exception));
}
- public void testCreateFromSQLException() {
+ @Test public void testCreateFromSQLException() {
SQLException sqlexception = new SQLException("foo", "21");
//$NON-NLS-1$ //$NON-NLS-2$
SQLException nested = new SQLException("bar"); //$NON-NLS-1$
@@ -230,5 +214,15 @@
assertEquals(exception.getNextException().getMessage(),
sqlexception.getMessage());
assertEquals(exception.getNextException().getNextException().getMessage(),
nested.getMessage());
}
+
+ @Test public void testCodeAsSQLState() {
+ TeiidException sqlexception = new TeiidException("foo",
"21"); //$NON-NLS-1$ //$NON-NLS-2$
+
+ String message = "top level message"; //$NON-NLS-1$
+
+ TeiidSQLException exception = TeiidSQLException.create(sqlexception, message);
+
+ assertEquals(sqlexception.getCode(), exception.getSQLState());
+ }
}
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestSQLException.java
___________________________________________________________________
Added: svn:mergeinfo
+ /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestSQLException.java:3220-3275
Modified: trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
===================================================================
--- trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java 2011-06-28 03:27:07 UTC
(rev 3279)
+++ trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java 2011-06-28 03:47:29 UTC
(rev 3280)
@@ -50,6 +50,7 @@
results.getResultsReceiver().receiveResults(rm);
Mockito.stub(conn.getDQP()).toReturn(dqp);
StatementImpl statement = new StatementImpl(conn, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
+ statement.clearBatch(); //previously caused npe
statement.addBatch("delete from table"); //$NON-NLS-1$
statement.addBatch("delete from table1"); //$NON-NLS-1$
assertTrue(Arrays.equals(new int[] {1, 2}, statement.executeBatch()));
@@ -129,6 +130,19 @@
statement.submitExecute("select 'hello world'");
Thread.sleep(100);
Mockito.verify(dqp).cancelRequest(0);
+ statement.setQueryTimeoutMS(1);
+ statement.submitExecute("select 'hello world'");
+ Thread.sleep(100);
+ Mockito.verify(dqp, Mockito.times(2)).cancelRequest(0);
}
+ @Test public void testTimeoutProperty() throws Exception {
+ ConnectionImpl conn = Mockito.mock(ConnectionImpl.class);
+ Properties p = new Properties();
+ p.setProperty(ExecutionProperties.QUERYTIMEOUT, "2");
+ Mockito.stub(conn.getExecutionProperties()).toReturn(p);
+ StatementImpl statement = new StatementImpl(conn, ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY);
+ assertEquals(2, statement.getQueryTimeout());
+ }
+
}
Property changes on: trunk/client/src/test/java/org/teiid/jdbc/TestStatement.java
___________________________________________________________________
Modified: svn:mergeinfo
- /branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestStatement.java:3149-3217
+
/branches/7.4.x/client/src/test/java/org/teiid/jdbc/TestStatement.java:3149-3217,3220-3275
Modified: trunk/common-core/src/main/java/org/teiid/core/TeiidException.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/TeiidException.java 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/common-core/src/main/java/org/teiid/core/TeiidException.java 2011-06-28 03:47:29
UTC (rev 3280)
@@ -58,7 +58,7 @@
public TeiidException(Throwable e, String message) {
super(message, e);
- setCode(e);
+ setCode(getCode(e));
}
public TeiidException(Throwable e, String errorCode, String message) {
@@ -82,14 +82,15 @@
this.originalType = originalType;
}
- private void setCode(Throwable e) {
+ static String getCode(Throwable e) {
if (e instanceof TeiidException) {
- this.code = (((TeiidException) e).getCode());
+ return (((TeiidException) e).getCode());
} else if (e instanceof TeiidRuntimeException) {
- this.code = ((TeiidRuntimeException) e).getCode();
+ return ((TeiidRuntimeException) e).getCode();
} else if (e instanceof SQLException) {
- this.code = Integer.toString(((SQLException)e).getErrorCode());
+ return ((SQLException)e).getSQLState();
}
+ return null;
}
public String getMessage() {
Property changes on: trunk/common-core/src/main/java/org/teiid/core/TeiidException.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidException.java:3220-3275
Modified: trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -22,10 +22,6 @@
package org.teiid.core;
-import java.io.PrintStream;
-import java.io.PrintWriter;
-import java.sql.SQLException;
-
import org.teiid.core.util.ExceptionUtil;
@@ -40,26 +36,9 @@
public class TeiidRuntimeException extends RuntimeException {
public static final long serialVersionUID = -4035276728007979320L;
- private static final String EMPTY_STRING = ""; //$NON-NLS-1$
public static final String CAUSED_BY_STRING =
CorePlugin.Util.getString("RuntimeException.Caused_by"); //$NON-NLS-1$
//############################################################################################################################
- //# Static Methods
#
-
//############################################################################################################################
-
- /**
- * Utility method to get the name of a class, without package information.
- *
- * @param cls The class to get the name of
- * @return The name of the class, without package info
- */
- public static String getClassShortName( Class cls ) {
- if ( cls == null ) return EMPTY_STRING;
- String className = cls.getName();
- return className.substring( className.lastIndexOf('.')+1 );
- }
-
-
//############################################################################################################################
//# Variables
#
//############################################################################################################################
@@ -86,19 +65,6 @@
super(message);
}
- /**
- * Construct an instance with the specified error code and message. If the message
is actually a key, the actual message will
- * be retrieved from a resource bundle using the key, and the specified parameters
will be substituted for placeholders within
- * the message.
- * @param code The error code
- * @param message The error message or a resource bundle key
- */
- public TeiidRuntimeException(final int code, final String message) {
- super(message);
- // The following setCode call should be executed after setting the message
- setCode(code);
- }
-
public TeiidRuntimeException(final String code, final String message) {
super(message);
// The following setCode call should be executed after setting the message
@@ -125,23 +91,10 @@
*/
public TeiidRuntimeException(final Throwable e, final String message) {
super(message, e);
- setCode(e);
+ setCode(TeiidException.getCode(e));
}
/**
- * Construct an instance with the linked exception, error code, and error message
specified. If the message is actually a
- * key, the error message will be retrieved from a resource bundle using the key.
- * @param e The exception to chain to this exception
- * @param code The error code
- * @param message The error message or a resource bundle key
- */
- public TeiidRuntimeException(final Throwable e, final int code, final String message)
{
- super(message, e);
- // The following setCode call should be executed after setting the message
- setCode(code);
- }
-
- /**
* Construct an instance with the linked exception, error code, and error message
specified. If the specified
* exception is a {@link TeiidException} or a MetaMatrixRuntimeException, the code
will
* be set to the exception's code.
@@ -164,6 +117,7 @@
* Get the exception which is linked to this exception.
*
* @return The linked exception
+ * @deprecated use {@link #getCause()} instead
*/
public Throwable getChild() {
return this.getCause();
@@ -175,47 +129,13 @@
* @return The error code
*/
public String getCode() {
- if (code == null) {
- return "0"; //$NON-NLS-1$
- }
return this.code;
}
- public int getIntCode() {
- if (code == null) {
- return 0;
- }
- try {
- return Integer.parseInt(code);
- } catch (NumberFormatException e) {
-
- }
- return 0;
- }
-
- /**
- * Set the error code.
- *
- * @param code The error code
- */
- private void setCode( int code ) {
- this.code = Integer.toString(code);
- }
-
private void setCode( String code ) {
this.code = code;
}
- private void setCode(Throwable e) {
- if (e instanceof TeiidException) {
- this.code = (((TeiidException) e).getCode());
- } else if (e instanceof TeiidRuntimeException) {
- this.code = ((TeiidRuntimeException) e).getCode();
- } else if (e instanceof SQLException) {
- this.code = Integer.toString(((SQLException)e).getErrorCode());
- }
- }
-
/**
* Returns a string representation of this class.
*
@@ -225,12 +145,4 @@
return ExceptionUtil.getLinkedMessages(this);
}
- public void superPrintStackTrace(PrintStream output) {
- super.printStackTrace(output);
- }
-
- public void superPrintStackTrace(PrintWriter output) {
- super.printStackTrace(output);
- }
-
}
Property changes on:
trunk/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/common-core/src/main/java/org/teiid/core/TeiidRuntimeException.java:3220-3275
Modified:
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java
===================================================================
---
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -63,16 +63,16 @@
public void testMetaMatrixRuntimeExceptionWithNullThrowable() {
final TeiidRuntimeException err = new TeiidRuntimeException((Throwable)null);
- assertNull(err.getChild());
- assertEquals("0", err.getCode()); //$NON-NLS-1$
+ assertNull(err.getCause());
+ assertNull(err.getCode());
assertNull(err.getMessage());
}
public void testMetaMatrixRuntimeExceptionWithMessage() {
final TeiidRuntimeException err = new TeiidRuntimeException("Test");
//$NON-NLS-1$
- assertNull(err.getChild());
- assertEquals("0", err.getCode()); //$NON-NLS-1$
+ assertNull(err.getCause());
+ assertNull(err.getCode());
assertEquals("Test", err.getMessage()); //$NON-NLS-1$
}
@@ -80,7 +80,7 @@
public void testMetaMatrixRuntimeExceptionWithCodeAndMessage() {
final String code = "1234"; //$NON-NLS-1$
final TeiidRuntimeException err = new TeiidRuntimeException(code,
"Test"); //$NON-NLS-1$
- assertNull(err.getChild());
+ assertNull(err.getCause());
assertEquals(code, err.getCode());
assertEquals("Test", err.getMessage()); //$NON-NLS-1$
@@ -90,7 +90,7 @@
final String code = "1234"; //$NON-NLS-1$
final TeiidRuntimeException child = new TeiidRuntimeException(code,
"Child"); //$NON-NLS-1$
final TeiidRuntimeException err = new TeiidRuntimeException(child,
"Test"); //$NON-NLS-1$
- assertSame(child, err.getChild());
+ assertSame(child, err.getCause());
assertEquals(code, err.getCode());
assertEquals("Test", err.getMessage()); //$NON-NLS-1$
@@ -100,7 +100,7 @@
final String code = "1234"; //$NON-NLS-1$
final TeiidRuntimeException child = new TeiidRuntimeException(code,
"Child"); //$NON-NLS-1$
final TeiidRuntimeException err = new TeiidRuntimeException(child,
"Code", "Test"); //$NON-NLS-1$ //$NON-NLS-2$
- assertSame(child, err.getChild());
+ assertSame(child, err.getCause());
assertEquals("Code", err.getCode()); //$NON-NLS-1$
assertEquals("Test", err.getMessage()); //$NON-NLS-1$
Property changes on:
trunk/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/common-core/src/test/java/org/teiid/core/TestMetaMatrixRuntimeException.java:3220-3275
Modified:
trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java
===================================================================
---
trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/connectors/translator-file/src/main/java/org/teiid/translator/file/FileExecutionFactory.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -46,6 +46,8 @@
import org.teiid.core.util.ObjectConverterUtil;
import org.teiid.core.util.ReaderInputStream;
import org.teiid.language.Call;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.Procedure;
import org.teiid.metadata.ProcedureParameter;
@@ -79,6 +81,7 @@
@Override
public void execute() throws TranslatorException {
files =
FileConnection.Util.getFiles((String)command.getArguments().get(0).getArgumentValue().getValue(),
fc);
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Getting", files != null ?
files.length : 0, "file(s)"); //$NON-NLS-1$ //$NON-NLS-2$
String name = command.getProcedureName();
if (name.equalsIgnoreCase(GETTEXTFILES)) {
isText = true;
@@ -104,6 +107,7 @@
}
ArrayList<Object> result = new ArrayList<Object>(2);
final File file = files[index++];
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Getting", file);
//$NON-NLS-1$
FileInputStreamFactory isf = new FileInputStreamFactory(file);
isf.setLength(file.length());
Object value = null;
@@ -156,6 +160,7 @@
if (file == null || filePath == null) {
throw new TranslatorException(UTIL.getString("non_null")); //$NON-NLS-1$
}
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, "Saving", filePath);
//$NON-NLS-1$
InputStream is = null;
try {
if (file instanceof SQLXML) {
Modified:
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java
===================================================================
---
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -85,6 +85,7 @@
private boolean widenUnsingedTypes = true;
private boolean quoteNameInSource = true;
private boolean useProcedureSpecificName;
+ private boolean useCatalogName = true;
private Set<String> unsignedTypes = new HashSet<String>();
private String quoteString;
@@ -422,14 +423,12 @@
if (schemaName != null && schemaName.length() > 0) {
fullName = (quoted?quoteName(schemaName):schemaName) +
AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
}
- if (catalogName != null && catalogName.length() > 0) {
+ if (useCatalogName && catalogName != null && catalogName.length() >
0) {
fullName = (quoted?quoteName(catalogName):catalogName) +
AbstractMetadataRecord.NAME_DELIM_CHAR + fullName;
}
return fullName;
}
-
-
public void setTableNamePattern(String tableNamePattern) {
this.tableNamePattern = tableNamePattern;
}
@@ -483,4 +482,8 @@
this.useProcedureSpecificName = useProcedureSpecificName;
}
+ public void setUseCatalogName(boolean useCatalog) {
+ this.useCatalogName = useCatalog;
+ }
+
}
Modified:
trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapQueryExecution.java
===================================================================
---
trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapQueryExecution.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/connectors/translator-olap/src/main/java/org/teiid/translator/olap/OlapQueryExecution.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -54,9 +54,9 @@
protected OlapExecutionFactory executionFactory;
private OlapStatement stmt;
private CellSet cellSet;
- private CellSetAxis cols;
+ private CellSetAxis columnsAxis;
private int colWidth;
- private ListIterator<Position> iterator;
+ private ListIterator<Position> rowPositionIterator;
public OlapQueryExecution(Command command, OlapConnection connection, ExecutionContext
context, OlapExecutionFactory executionFactory) {
this.command = command;
@@ -74,10 +74,10 @@
stmt = this.connection.createStatement();
cellSet = stmt.executeOlapQuery(mdxQuery);
- CellSetAxis rows = this.cellSet.getAxes().get(Axis.ROWS.axisOrdinal());
- iterator = rows.iterator();
- cols = cellSet.getAxes().get(Axis.COLUMNS.axisOrdinal());
- colWidth = rows.getAxisMetaData().getHierarchies().size() +
this.cols.getPositions().size();
+ CellSetAxis rowAxis = this.cellSet.getAxes().get(Axis.ROWS.axisOrdinal());
+ rowPositionIterator = rowAxis.iterator();
+ columnsAxis = cellSet.getAxes().get(Axis.COLUMNS.axisOrdinal());
+ colWidth = rowAxis.getAxisMetaData().getHierarchies().size() +
this.columnsAxis.getPositions().size();
} catch (SQLException e) {
throw new TranslatorException(e);
}
@@ -109,22 +109,22 @@
@Override
public List<?> next() throws TranslatorException {
- if (!iterator.hasNext()) {
+ if (!rowPositionIterator.hasNext()) {
return null;
}
- Position nextRow = iterator.next();
+ Position rowPosition = rowPositionIterator.next();
Object[] result = new Object[colWidth];
int i = 0;
// add in rows axis
- List<Member> members = nextRow.getMembers();
+ List<Member> members = rowPosition.getMembers();
for (Member member:members) {
- String columnName = member.getHierarchy().getName();
+ String columnName = member.getName();
result[i++] = columnName;
}
// add col axis
- for (Position colPos : cols) {
- Cell cell = cellSet.getCell(colPos, nextRow);
+ for (Position colPos : columnsAxis) {
+ Cell cell = cellSet.getCell(colPos, rowPosition);
result[i++] = cell.getValue();
}
ArrayList<Object[]> results = new ArrayList<Object[]>();
Modified: trunk/console/src/main/resources/META-INF/rhq-plugin.xml
===================================================================
--- trunk/console/src/main/resources/META-INF/rhq-plugin.xml 2011-06-28 03:27:07 UTC (rev
3279)
+++ trunk/console/src/main/resources/META-INF/rhq-plugin.xml 2011-06-28 03:47:29 UTC (rev
3280)
@@ -387,16 +387,16 @@
displayName="Connector Batch Size"
description="The max row count of a batch from a connector. Should be even
multiple of processorBatchSize. (default 1024)"
required="false" readOnly="false" />
- <c:simple-property name="BufferService.maxProcessingBatchesColumns"
- displayName="Max Processing Batches Columns"
- description="The number of batch columns guarenteed to a processing operation.
Set this value lower if the workload typically processes larger numbers of concurrent
queries with large intermediate results from operations such as sorting, grouping, etc.
(default 128)"
+ <c:simple-property name="BufferService.maxProcessingKb"
+ displayName="Max Processing Memory"
+ description="The approximate amount of buffer memory in kilobytes allowable for
a single processing operation (sort, grouping, etc.) regardless of existing memory
commitments. -1 means to automatically calculate a value (default -1)."
required="false" readOnly="false" />
<c:simple-property name="BufferService.maxFileSize"
displayName="Max File Size"
description="Max file size for buffer files (default 2GB)"
required="false" readOnly="false" />
- <c:simple-property name="BufferService.maxReserveBatchColumns"
- displayName="Max Reserve Batch Columns"
- description="The number of batch columns to allow in memory (default 16384).
This value should be set lower or higher depending on the available memory to Teiid in the
VM. 16384 is considered a good default for a dedicated 32-bit VM running Teiid with a 1
gig heap."
+ <c:simple-property name="BufferService.maxReserveKb"
+ displayName="Max Reserve Memory"
+ description="The approximate amount of memory in kilobytes allowed to be held
by the buffer manager. -1 means to automatically calculate a value (default -1)."
required="false" readOnly="false" />
</c:group>
<c:group name="JdbcSocketConfiguration" displayName="Jdbc Socket
Configuration Properties" hiddenByDefault="false">
Modified: trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml
===================================================================
---
trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/admin-guide/src/main/docbook/en-US/content/performance.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -18,12 +18,10 @@
accessing the Teiid server simultaneously.
</para>
<para>
- The <code>maxReserveBatchColumns</code>
- setting determines the total size of batches that can be held by the BufferManager in
memory.
- This number does not include persistent batches held by soft (such as
+ The <code>maxReserveKb</code>
+ setting determines the total size in kilobytes of batches that can be held by the
BufferManager in memory.
+ This number does not account for persistent batches held by soft (such as
index pages) or weak references.
- The value is treated internally as an approximation of bytes using the conversion
- <code>maxReserveBatchColumns</code> *
<code>processorBatchSize</code> * (64bytes per column value).
The default value of -1 will auto-calculate a typical max based upon the max heap
available to the VM.
The auto-calculated value assumes a 64bit architecture and will limit buffer usage to
50% of the first
gigabyte of memory beyond the first 300 megabytes (which are assumed for use by the AS
and other Teiid purposes)
@@ -39,22 +37,21 @@
</para>
<note>
<para>Memory consumption can be significantly more or less than the nominal
target
- depending upon actual column values and whether value caching is enabled.
Large strings, bigintegers, bigdecimals, or values typed as object can exceed their
default size estimate.
- If an out of memory errors occur, then set a lower the
maxReserveBatchColumns value.
+ depending upon actual column values and whether value caching is enabled.
Large non built-in type objects can exceed their default size estimate.
+ If an out of memory errors occur, then set a lower the maxReserveKb value.
Also note that source lob values are held by memory references that are not cleared when a
batch is persisted.
+ With heavy lob usage you should ensure that buffers of other memory
associated with lob references are appropiately sized.
</para>
</note>
<para>
- The <code>maxProcessingBatchesColumns</code>
- setting determines the total size of batches that can be used by active plans
regardless of the memory held based on <code>maxReserveBatchColumns</code>.
- The value is treated internally as an approximation of bytes using the conversion
- <code>maxProcessingBatchesColumns</code> *
<code>processorBatchSize</code> * (64bytes per column value).
+ The <code>maxProcessingKb</code>
+ setting determines the total size in kilobytes of batches that can be used by active
plans regardless of the memory held based on <code>maxReserveKb</code>.
The default value of -1 will auto-calculate a typical max based upon the max heap
available to the VM and max active plans.
The auto-calculated value assumes a 64bit architecture and will limit processing batch
usage to 10% of memory
beyond the first 300 megabytes (which are assumed for use by the AS and other Teiid
purposes).
</para>
<para>
- In systems where large intermediate results are normal (scrolling cursors or sorting
over millions of rows) you can consider increasing the
<code>maxProcessingBatchColumns</code> and decreasing
- the <code>maxReserveBatchColumns</code> so that each request has access to
an effectively smaller buffer space.
+ In systems where large intermediate results are normal (scrolling cursors or sorting
over millions of rows) you can consider increasing the
<code>maxProcessingKb</code> and decreasing
+ the <code>maxReserveKb</code> so that each request has access to an
effectively smaller buffer space.
</para>
<para>
Each intermediate result buffer, temporary LOB, and temporary table
Modified: trunk/documentation/developer-guide/src/main/docbook/en-US/content/security.xml
===================================================================
---
trunk/documentation/developer-guide/src/main/docbook/en-US/content/security.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/developer-guide/src/main/docbook/en-US/content/security.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,6 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd">
-<chapter id="custom_login_modules">
+<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
+<!ENTITY % CustomDTD SYSTEM "../../../../../../docbook/custom.dtd">
+%CustomDTD;
+]>
+<chapter>
+<title>Custom Security</title>
+<section id="custom_login_modules">
<title>Login Modules</title>
<para>The Teiid system provides a range of built-in and extensible security
features to enable the
secure access of data. For details about how to configure the available security
features check out
@@ -92,4 +97,27 @@
<para>If you are extending one of the built-in LoginModules, refer to
<ulink
url="http://community.jboss.org/docs/DOC-9466"/>.</para>
</section>
+</section>
+<section>
+ <title>Custom Authorization</title>
+ <para>In situations where Teiid's built-in role mechanism is not sufficient, a
custom
+ <code>org.teiid.PolicyDecider</code> can be installed via the
&jboss-beans; configuration file under the "AuthorizationValidator" bean.
+ <example>
+ <title>Example Configuration Snippet</title>
+ <programlisting role="XML" language="XML"><![CDATA[
+ <bean name="AuthorizationValidator"
class="org.teiid.dqp.internal.process.DefaultAuthorizationValidator">
+ <property name="enabled">true</property>
+ <property name="policyDecider"><inject
bean="PolicyDecider"/></property>
+ </bean>
+
+ <bean name="PolicyDecider"
class="com.company.CustomPolicyDecider">
+ <property name="someProperty">some value</property>
+ </bean>]]>
+ </programlisting>
+ </example>
+ Your custom <code>PolicyDecider</code> should be installed in a jar that is
made available to the same classloader as Teiid, typically the profile lib directory.
+ A <code>PolicyDecider</code> may be consulted many times for a single user
command, but it is only called to make decisions based upon resources that
+ appear in user queries. Any further access of resources through views or stored
procedures, just as with data roles, is not checked against a
<code>PolicyDecider.</code>
+ </para>
+</section>
</chapter>
\ No newline at end of file
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/architecture.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/architecture.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/architecture.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -131,7 +131,9 @@
specified timeout period, a ‘cancel’ command is issued to the
server for the request and no results are returned to the
client. The cancel command is issued by the JDBC API without the
- client’s intervention.</para>
+ client’s intervention. See the Client Developers Guide for more on setting
+ statement timeouts via the connection property "QUERYTIMEOUT" and see
the Java JDBC API for setting
+ the query timeout via <code>java.sql.Statement.setQueryTimeout</code>
method.</para>
</section>
</section>
<section>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/dataroles.xml
===================================================================
--- trunk/documentation/reference/src/main/docbook/en-US/content/dataroles.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/documentation/reference/src/main/docbook/en-US/content/dataroles.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -168,4 +168,8 @@
<para>The <code>hasRole</code> system function will return true if
the current user has the given data role.
The <code>hasRole</code> function can be used in procedure or view
definitions to allow for a more dynamic application of security - which allows for things
such as value masking or row level security.</para>
</section>
+ <section>
+ <title>Customizing</title>
+ <para>See the Developer's Guide Custom Security Chapter for details on using
an alternative authorization scheme.</para>
+ </section>
</chapter>
\ No newline at end of file
Modified:
trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/federated_planning.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -377,6 +377,41 @@
</listitem>
</itemizedlist>
</section>
+ <section id="xquery_optimization">
+ <title>XQuery Optimization</title>
+ <para>A technique known as document projection is used to reduce the memory
footprint of the context item document.
+ Document projection loads only the parts of the document needed by the
relevant XQuery and path expressions.
+ Since document projection analysis uses all relevant path expressions, even
1 expression that could potentially use many nodes, e.g. //x rather than /a/b/x will cause
a larger memory footprint.
+ With the relevant content removed the entire document will still be loaded
into memory for processing.
+ Document projection will only be used when there is a context item (unnamed
PASSING clause item) passed to XMLTABLE/XMLQUERY. A named variable will not have document
projection performed.
+ In some cases the expressions used may be too complex for the optimizer to
use document projection. You should check the SHOWPLAN DEBUG full plan output to see if
the appropriate optimization has been performed.</para>
+ <para>With additional restrictions, simple context path expressions allow the
processor to evaluate document subtrees independently - without loading the full document
in memory.
+ A simple context path expression can be of the form
"[/][ns:]root/[ns1:]elem/...", where a namespace prefix or element name can also
be the * wild card. As with normal XQuery processing if namespace prefixes are used in
the XQuery expression, they should be declared using the XMLNAMESPACES
clause.</para>
+ <example>
+ <title>Streaming Eligible XMLQUERY</title>
+ <programlisting>XMLQUERY('/*:root/*:child' PASSING
doc)</programlisting>
+ <para>Rather than loading the entire doc in-memory as a DOM tree, each
child element will be independently added to the result.</para>
+ </example>
+ <example>
+ <title>Streaming Ineligible XMLQUERY</title>
+ <programlisting>XMLQUERY('//child' PASSING
doc)</programlisting>
+ <para>The use of the descendent axis prevents the streaming optimization,
but document projection can still be performed.</para>
+ </example>
+ <para>When using XMLTABLE, the COLUMN PATH expressions have additional
restrictions.
+ They are allowed to reference any part of the element subtree formed by the context
expression and they may use any attribute value from their direct parentage.
+ Any path expression where it is possible to reference a non-direct ancestor or
sibling of the current context item prevent streaming from being used.
+ </para>
+ <example>
+ <title>Streaming Eligible XMLTABLE</title>
+ <programlisting>XMLTABLE('/*:root/*:child' PASSING doc COLUMNS
fullchild XML PATH '.', parent_attr string PATH '../@attr', child_val
integer)</programlisting>
+ <para>The context XQuery and the column path expression allow the streaming
optimization, rather than loading the entire doc in-memory as a DOM tree, each child
element will be independently added to the result.</para>
+ </example>
+ <example>
+ <title>Streaming Ineligible XMLTABLE</title>
+ <programlisting>XMLTABLE('/*:root/*:child' PASSING doc COLUMNS
sibling_attr string PATH '../other_child/@attr')</programlisting>
+ <para>The reference of an element outside of the child subtree in the
sibling_attr path prevents the streaming optimization from being used, but document
projection can still be performed.</para>
+ </example>
+ </section>
<section>
<title>Federated Failure Modes</title>
<section>
Modified:
trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/scalar_functions.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -2036,9 +2036,7 @@
<para>xquery in string. Return value is xml.</para>
<para>XMLQUERY is part of the SQL/XML 2006
specification.</para>
<para>See also <link
linkend="xmltable">XMLTABLE</link></para>
- <note><para>A technique known as document projection is used to
reduce the memory footprint of the context item document.
- Only the parts of the document needed by the XQuery path expressions will be
loaded into memory. Since document projection analysis uses all relevant path
expressions, even 1 expression that could potentially use many nodes, e.g. //x rather than
/a/b/x will cause a larger memory footprint.</para></note>
-
+ <note><para>See also <xref
linkend="xquery_optimization"/></para></note>
</section>
<section id="xmlserialize">
<title>XMLSERIALIZE</title>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/sql_support.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -108,6 +108,12 @@
resulting names are unambiguous in the context of the command.
Different forms of qualification can be mixed in the same query.
</para>
+ <section>
+ <title>Reserved Words</title>
+ <para>Teiid's reserved words include the standard SQL 2003 Foundation,
SQL/MED, and SQL/XML reserved words, as well as Teiid specific words such as BIGINTEGER,
BIGDECIMAL, or MAKEDEP.
+ See the <xref linkend="grammar"/> TOKENS section for all reserved
words. They will appear as 'SMALLINT: "smallint"' where the quoted
string is the actual lexical form.
+ </para>
+ </section>
</section>
<section>
<title>Expressions</title>
@@ -832,6 +838,7 @@
<para>See XMLELEMENT for the definition of NSP - <link
linkend="xmlnamespaces">XMLNAMESPACES</link>.</para>
<para>See XMLQUERY for the definition of <link
linkend="passing">PASSING</link>.</para>
<para>See also <link
linkend="xmlquery">XMLQUERY</link></para>
+ <note><para>See also <xref
linkend="xquery_optimization"/></para></note>
<itemizedlist>
<para>Parameters</para>
<listitem>
@@ -843,10 +850,21 @@
</para>
</listitem>
<listitem>
- <para>If COLUMNS is not specified, then that is the same as having the
COLUMNS clause: "COLUMNS OBJECT_VALUE XML PATH '.'", which returns the
entire item as an XML value. Each non-ordinality column specifies a type and optionally a
PATH and a DEFAULT expression.
- If PATH is not specified, then the path will be the same as the column name. A
FOR ORDINALITY column is typed as integer and will return the 1-based item number as its
value.
+ <para>If COLUMNS is not specified, then that is the same as having the
COLUMNS clause: "COLUMNS OBJECT_VALUE XML PATH '.'", which returns the
entire item as an XML value.
</para>
</listitem>
+ <listitem>
+ <para>A FOR ORDINALITY column is typed as integer and will return the
1-based item number as its value.
+ </para>
+ </listitem>
+ <listitem>
+ <para>Each non-ordinality column specifies a type and optionally a PATH
and a DEFAULT expression.
+ </para>
+ </listitem>
+ <listitem>
+ <para>If PATH is not specified, then the path will be the same as the
column name.
+ </para>
+ </listitem>
</itemizedlist>
<itemizedlist>
<para>Syntax Rules:
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/system_schema.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/system_schema.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/system_schema.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1807,6 +1807,32 @@
<para><synopsis>SYS.getXMLSchemas(document in string) returns schema
string</synopsis></para>
</section>
<section>
+ <title>SYSADMIN.logMsg</title>
+ <para>Log a message to the underlying logging system.</para>
+ <para><synopsis>SYSADMIN.logMsg(logged RETURN boolean, level IN
string, context IN string, msg IN object)</synopsis></para>
+ <para>Returns true if the message was logged. level can be one of the
log4j levels: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE. level defaults to
'DEBUG' and context defaults to 'org.teiid.PROCESSOR'</para>
+ <example lang="sql">
+ <title>Example logMsg</title>
+ <programlisting>CALL SYSADMIN.logMsg(msg=>'some debug',
context=>'org.something')</programlisting>
+ <para>This will log the message 'some debug' at the default level
DEBUG to the context org.something.</para>
+ </example>
+ </section>
+ <section>
+ <title>SYSADMIN.isLoggable</title>
+ <para>Tests if logging is enabled at the given level and
context.</para>
+ <para><synopsis>SYSADMIN.isLoggable(loggable RETURN boolean, level IN
string, context IN string)</synopsis></para>
+ <para>Returns true if logging is enabled. level can be one of the log4j
levels: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE. level defaults to 'DEBUG'
and context defaults to 'org.teiid.PROCESSOR'</para>
+ <example lang="sql">
+ <title>Example isLoggable</title>
+ <programlisting>IF ((CALL
SYSADMIN.isLoggable(context=>'org.something'))
+BEGIN
+ DECLARE STRING msg;
+ // logic to build the message ...
+ CALL SYSADMIN.logMsg(msg=>msg, context=>'org.something')
+END</programlisting>
+ </example>
+ </section>
+ <section>
<title>SYSADMIN.refreshMatView</title>
<para>Returns integer RowsUpdated. -1 indicates a load is in progress,
otherwise the cardinality of the table is returned. See the Caching Guide for
more.</para>
<para><synopsis>SYSADMIN.refreshMatView(RowsUpdated return integer,
ViewName in string, Invalidate in boolean)</synopsis></para>
Modified: trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml
===================================================================
---
trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/documentation/reference/src/main/docbook/en-US/content/translators.xml 2011-06-28
03:47:29 UTC (rev 3280)
@@ -166,36 +166,37 @@
</tgroup>
</table>
- <para>There are file importer settings, but it does provide metadata
for dynamic vdbs.</para>
-
<section>
<title>Usage</title>
<para>
- Retrieve all files as BLOBs with the given extension at the given path.
+ Retrieve all files as BLOBs with an optional extension at the given
path.
</para>
<programlisting>call
getFiles('path/*.ext')</programlisting>
<para>
+ If the extension path is specified, then it will filter all of the file
in the directory referenced by the base path.
If the extension pattern is not specified and the path is a directory,
- then all files in the directory will be returned. If the path or
filename
+ then all files in the directory will be returned. Otherwise the single
file referenced will be returned. If the path
doesn't exist, then no results will be returned.
</para>
<para>
- Retrieve all files as CLOBs with the given extension at the given path.
+ Retrieve all files as CLOB(s) with the an optional extension at the given
path.
</para>
<programlisting>call
getTextFiles('path/*.ext')</programlisting>
<para>
- Save the CLOB, BLOB, or XML file to given path
+ All the same files a getFiles will be retrieved, the only difference is
that
+ the results will be CLOB values using the encoding execution property as
the character set.
</para>
- <programlisting>call saveFile('path',
value)</programlisting>
<para>
- See the database metadata for full descriptions of the getFiles,
- getTextFiles, and saveFile procedures.
+ Save the CLOB, BLOB, or XML value to given path
</para>
+ <programlisting>call saveFile('path',
value)</programlisting>
+
+ <para>The path should reference a new file location or an existing
file to overwrite completely.</para>
</section>
<section>
@@ -467,6 +468,12 @@
<entry>true will allow the import of overloaded procedures
(which will normally result in a duplicate procedure error) by using the unique procedure
specific name as the Teiid name. This option will only work with JDBC 4.0 compatable
drivers that report specific names.</entry>
<entry>false</entry>
</row>
+ <row>
+ <entry>useCatalogName</entry>
+ <entry>true will use any non-null/non-empty catalog name as
part of the name in source, e.g. "catalog"."table"."column",
and in the Teiid runtime name if useFullSchemaName is true.
+ false will not use the catalog name in either the name in source
or the Teiid runtime name. Should be set to false for sources that do not fully support a
catalog concept, but return a non-null catalog name in their metadata - such as
HSQL.</entry>
+ <entry>true</entry>
+ </row>
</tbody>
</tgroup>
</table>
Modified: trunk/engine/pom.xml
===================================================================
--- trunk/engine/pom.xml 2011-06-28 03:27:07 UTC (rev 3279)
+++ trunk/engine/pom.xml 2011-06-28 03:47:29 UTC (rev 3280)
@@ -91,7 +91,19 @@
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>nux</groupId>
+ <artifactId>nux</artifactId>
+ <version>1.6</version>
+ </dependency>
+ <dependency>
+ <groupId>xom</groupId>
+ <artifactId>xom</artifactId>
+ <version>1.2</version>
+ </dependency>
+
</dependencies>
</project>
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -67,8 +67,8 @@
public static int DEFAULT_CONNECTOR_BATCH_SIZE = 1024;
public static int DEFAULT_PROCESSOR_BATCH_SIZE = 512;
- public static int DEFAULT_MAX_PROCESSING_BATCHES = -1;
- public static int DEFAULT_RESERVE_BUFFERS = -1;
+ public static int DEFAULT_MAX_PROCESSING_KB = -1;
+ public static int DEFAULT_RESERVE_BUFFER_KB = -1;
/**
* Get the batch size to use during query processing.
Property changes on:
trunk/engine/src/main/java/org/teiid/common/buffer/BufferManager.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/BufferManager.java:3220-3275
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java 2011-06-28 03:47:29
UTC (rev 3280)
@@ -156,6 +156,10 @@
this.types = types;
}
+ public String[] getDataTypes() {
+ return types;
+ }
+
public boolean containsRow(int row) {
return rowOffset <= row && getEndRow() >= row;
}
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBatch.java:3220-3275
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -365,4 +365,8 @@
return prefersMemory;
}
+ public String[] getTypes() {
+ return types;
+ }
+
}
Property changes on: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java:3149-3217
+
/branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java:3149-3217,3220-3275
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/common/buffer/impl/BufferManagerImpl.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -33,6 +33,7 @@
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
@@ -64,6 +65,7 @@
import org.teiid.dqp.internal.process.DQPConfiguration;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.query.QueryPlugin;
import org.teiid.query.processor.relational.ListNestedSortComparator;
import org.teiid.query.sql.symbol.Expression;
@@ -87,25 +89,24 @@
*/
public class BufferManagerImpl implements BufferManager, StorageManager {
- public static final double KB_PER_VALUE = 64d/1024;
private static final int IO_BUFFER_SIZE = 1 << 14;
private static final int COMPACTION_THRESHOLD = 1 << 25; //start checking at 32
megs
private final class BatchManagerImpl implements BatchManager {
private final String id;
- private final int columnCount;
private volatile FileStore store;
private Map<Long, long[]> physicalMapping = new ConcurrentHashMap<Long,
long[]>();
private ReadWriteLock compactionLock = new ReentrantReadWriteLock();
private AtomicLong unusedSpace = new AtomicLong();
private int[] lobIndexes;
+ private SizeUtility sizeUtility;
- private BatchManagerImpl(String newID, int columnCount, int[] lobIndexes) {
+ private BatchManagerImpl(String newID, int[] lobIndexes) {
this.id = newID;
- this.columnCount = columnCount;
this.store = createFileStore(id);
this.store.setCleanupReference(this);
this.lobIndexes = lobIndexes;
+ this.sizeUtility = new SizeUtility();
}
public FileStore createStorage(String prefix) {
@@ -185,7 +186,7 @@
ManagedBatchImpl removeBatch(int row) {
ManagedBatchImpl result = batches.remove(row);
if (result != null) {
- activeBatchColumnCount -= result.batchManager.columnCount;
+ activeBatchKB -= result.sizeEstimate;
}
return result;
}
@@ -200,17 +201,19 @@
private BatchManagerImpl batchManager;
private long id;
private LobManager lobManager;
+ private int sizeEstimate;
public ManagedBatchImpl(TupleBatch batch, BatchManagerImpl manager, boolean softCache)
{
this.softCache = softCache;
id = batchAdded.incrementAndGet();
- LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Add batch to
BufferManager", id); //$NON-NLS-1$
this.activeBatch = batch;
this.beginRow = batch.getBeginRow();
this.batchManager = manager;
if (this.batchManager.lobIndexes != null) {
this.lobManager = new LobManager();
}
+ sizeEstimate = (int) Math.max(1, manager.sizeUtility.getBatchSize(batch) / 1024);
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Add batch to
BufferManager", id, "with size estimate", sizeEstimate); //$NON-NLS-1$
//$NON-NLS-2$
}
@Override
@@ -225,7 +228,7 @@
if (batch == null) {
return; //already removed
}
- activeBatchColumnCount += batchManager.columnCount;
+ activeBatchKB += sizeEstimate;
TupleBufferInfo tbi = null;
if (update) {
tbi = activeBatches.remove(batchManager.id);
@@ -287,6 +290,7 @@
try {
this.batchManager.compactionLock.readLock().lock();
long[] info = batchManager.physicalMapping.get(this.id);
+ Assertion.isNotNull(info, "Invalid batch " + id); //$NON-NLS-1$
ObjectInputStream ois = new ObjectInputStream(new
BufferedInputStream(batchManager.store.createInputStream(info[0]), IO_BUFFER_SIZE));
batch = new TupleBatch();
batch.setDataTypes(types);
@@ -341,7 +345,7 @@
}
if (softCache) {
this.batchReference = new SoftReference<TupleBatch>(batch);
- } else {
+ } else if (useWeakReferences) {
this.batchReference = new WeakReference<TupleBatch>(batch);
}
}
@@ -385,22 +389,21 @@
private int connectorBatchSize = BufferManager.DEFAULT_CONNECTOR_BATCH_SIZE;
private int processorBatchSize = BufferManager.DEFAULT_PROCESSOR_BATCH_SIZE;
//set to acceptable defaults for testing
- private int maxProcessingBatches = 128;
- private int maxReserveBatchColumns = 16384;
- private int maxProcessingKB;
- private int maxReserveBatchKB;
+ private int maxProcessingKB = 1 << 11;
+ private Integer maxProcessingKBOrig;
+ private int maxReserveKB = 1 << 25;
private volatile int reserveBatchKB;
private int maxActivePlans = DQPConfiguration.DEFAULT_MAX_ACTIVE_PLANS; //used as a
hint to set the reserveBatchKB
+ private boolean useWeakReferences = true;
private ReentrantLock lock = new ReentrantLock(true);
private Condition batchesFreed = lock.newCondition();
- private volatile int activeBatchColumnCount = 0;
+ private volatile int activeBatchKB = 0;
private Map<String, TupleBufferInfo> activeBatches = new
LinkedHashMap<String, TupleBufferInfo>();
private Map<String, TupleReference> tupleBufferMap = new
ConcurrentHashMap<String, TupleReference>();
private ReferenceQueue<TupleBuffer> tupleBufferQueue = new
ReferenceQueue<TupleBuffer>();
-
private StorageManager diskMgr;
private AtomicLong tsId = new AtomicLong();
@@ -431,10 +434,6 @@
return maxProcessingKB;
}
- public void setMaxProcessingBatchColumns(int maxProcessingBatches) {
- this.maxProcessingBatches = maxProcessingBatches;
- }
-
/**
* Get processor batch size
* @return Number of rows in a processor batch
@@ -480,17 +479,19 @@
TupleSourceType tupleSourceType) {
final String newID = String.valueOf(this.tsId.getAndIncrement());
int[] lobIndexes = LobManager.getLobIndexes(elements);
- BatchManager batchManager = new BatchManagerImpl(newID, elements.size(),
lobIndexes);
+ BatchManager batchManager = new BatchManagerImpl(newID, lobIndexes);
TupleBuffer tupleBuffer = new TupleBuffer(batchManager, newID, elements,
lobIndexes, getProcessorBatchSize());
- LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Creating
TupleBuffer:", newID, "of type ", tupleSourceType); //$NON-NLS-1$
//$NON-NLS-2$
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR,
MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Creating
TupleBuffer:", newID, elements, Arrays.toString(tupleBuffer.getTypes()), "of
type", tupleSourceType); //$NON-NLS-1$ //$NON-NLS-2$
+ }
return tupleBuffer;
}
public STree createSTree(final List elements, String groupName, int keyLength) {
String newID = String.valueOf(this.tsId.getAndIncrement());
int[] lobIndexes = LobManager.getLobIndexes(elements);
- BatchManager bm = new BatchManagerImpl(newID, elements.size(), lobIndexes);
- BatchManager keyManager = new
BatchManagerImpl(String.valueOf(this.tsId.getAndIncrement()), keyLength, null);
+ BatchManager bm = new BatchManagerImpl(newID, lobIndexes);
+ BatchManager keyManager = new
BatchManagerImpl(String.valueOf(this.tsId.getAndIncrement()), null);
int[] compareIndexes = new int[keyLength];
for (int i = 1; i < compareIndexes.length; i++) {
compareIndexes[i] = i;
@@ -509,27 +510,35 @@
this.maxActivePlans = maxActivePlans;
}
+ public void setMaxProcessingKB(int maxProcessingKB) {
+ this.maxProcessingKB = maxProcessingKB;
+ }
+
+ public void setMaxReserveKB(int maxReserveBatchKB) {
+ this.maxReserveKB = maxReserveBatchKB;
+ }
+
@Override
public void initialize() throws TeiidComponentException {
int maxMemory = (int)Math.min(Runtime.getRuntime().maxMemory() / 1024,
Integer.MAX_VALUE);
maxMemory -= 300 * 1024; //assume 300 megs of overhead for the AS/system stuff
- if (maxReserveBatchColumns < 0) {
- this.maxReserveBatchKB = 0;
+ if (maxReserveKB < 0) {
+ this.maxReserveKB = 0;
int one_gig = 1024 * 1024;
if (maxMemory > one_gig) {
//assume 75% of the memory over the first gig
- this.maxReserveBatchKB += (int)Math.max(0, (maxMemory - one_gig) * .75);
+ this.maxReserveKB += (int)Math.max(0, (maxMemory - one_gig) * .75);
}
- this.maxReserveBatchKB += Math.max(0, Math.min(one_gig, maxMemory) * .5);
- } else {
- this.maxReserveBatchKB = Math.max(0, (int)Math.min(maxReserveBatchColumns *
KB_PER_VALUE * processorBatchSize, Integer.MAX_VALUE));
+ this.maxReserveKB += Math.max(0, Math.min(one_gig, maxMemory) * .5);
}
- this.reserveBatchKB = this.maxReserveBatchKB;
- if (this.maxProcessingBatches < 0) {
- this.maxProcessingKB = Math.max((int)Math.min(128 * KB_PER_VALUE * processorBatchSize,
Integer.MAX_VALUE), (int)(.1 * maxMemory)/maxActivePlans);
- } else {
- this.maxProcessingKB = Math.max(0, (int)Math.min(Math.ceil(maxProcessingBatches *
KB_PER_VALUE * processorBatchSize), Integer.MAX_VALUE));
+ this.reserveBatchKB = this.maxReserveKB;
+ if (this.maxProcessingKBOrig == null) {
+ //store the config value so that we can be reinitialized (this is not a clean
approach)
+ this.maxProcessingKBOrig = this.maxProcessingKB;
}
+ if (this.maxProcessingKBOrig < 0) {
+ this.maxProcessingKB = Math.max(Math.min(8 * processorBatchSize, Integer.MAX_VALUE),
(int)(.1 * maxMemory)/maxActivePlans);
+ }
}
@Override
@@ -537,6 +546,9 @@
if (count < 1) {
return;
}
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR,
MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Releasing buffer
space", count); //$NON-NLS-1$
+ }
lock.lock();
try {
this.reserveBatchKB += count;
@@ -548,11 +560,14 @@
@Override
public int reserveBuffers(int count, BufferReserveMode mode) {
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR,
MessageLevel.TRACE)) {
+ LogManager.logTrace(LogConstants.CTX_BUFFER_MGR, "Reserving buffer
space", count, mode); //$NON-NLS-1$
+ }
lock.lock();
try {
if (mode == BufferReserveMode.WAIT) {
//don't wait for more than is available
- int waitCount = Math.min(count, this.maxReserveBatchKB);
+ int waitCount = Math.min(count, this.maxReserveKB);
while (waitCount > 0 && waitCount > this.reserveBatchKB) {
try {
batchesFreed.await(100, TimeUnit.MILLISECONDS);
@@ -576,13 +591,13 @@
}
void persistBatchReferences() {
- if (activeBatchColumnCount == 0 || activeBatchColumnCount <= reserveBatchKB) {
- int memoryCount = activeBatchColumnCount + maxReserveBatchColumns - reserveBatchKB;
+ if (activeBatchKB == 0 || activeBatchKB <= reserveBatchKB) {
+ int memoryCount = activeBatchKB + maxReserveKB - reserveBatchKB;
if (DataTypeManager.isValueCacheEnabled()) {
- if (memoryCount < maxReserveBatchColumns / 8) {
+ if (memoryCount < maxReserveKB / 8) {
DataTypeManager.setValueCacheEnabled(false);
}
- } else if (memoryCount > maxReserveBatchColumns / 4) {
+ } else if (memoryCount > maxReserveKB / 4) {
DataTypeManager.setValueCacheEnabled(true);
}
return;
@@ -590,7 +605,7 @@
while (true) {
ManagedBatchImpl mb = null;
synchronized (activeBatches) {
- if (activeBatchColumnCount == 0 || activeBatchColumnCount * 5 < reserveBatchKB *
4) {
+ if (activeBatchKB == 0 || activeBatchKB < reserveBatchKB * .8) {
break;
}
Iterator<TupleBufferInfo> iter = activeBatches.values().iterator();
@@ -624,43 +639,12 @@
//this includes alignment, row/array, and reference overhead
for (Expression element : elements) {
Class<?> type = element.getType();
- if (type == DataTypeManager.DefaultDataClasses.STRING) {
- total += isValueCacheEnabled?100:256; //assumes an "average" string length
of approximately 100 chars
- } else if (type == DataTypeManager.DefaultDataClasses.DATE
- || type == DataTypeManager.DefaultDataClasses.TIME
- || type == DataTypeManager.DefaultDataClasses.TIMESTAMP) {
- total += isValueCacheEnabled?20:28;
- } else if (type == DataTypeManager.DefaultDataClasses.LONG
- || type == DataTypeManager.DefaultDataClasses.DOUBLE) {
- total += isValueCacheEnabled?12:16;
- } else if (type == DataTypeManager.DefaultDataClasses.INTEGER
- || type == DataTypeManager.DefaultDataClasses.FLOAT) {
- total += isValueCacheEnabled?6:12;
- } else if (type == DataTypeManager.DefaultDataClasses.CHAR
- || type == DataTypeManager.DefaultDataClasses.SHORT) {
- total += isValueCacheEnabled?4:10;
- } else if (type == DataTypeManager.DefaultDataClasses.OBJECT) {
- total += 1024;
- } else if (type == DataTypeManager.DefaultDataClasses.NULL) {
- //it's free
- } else if (type == DataTypeManager.DefaultDataClasses.BYTE) {
- total += 2; //always value cached
- } else if (type == DataTypeManager.DefaultDataClasses.BOOLEAN) {
- total += 1; //always value cached
- } else {
- total += 512; //assumes buffer overhead in the case of lobs
- //however the account for lobs is misleading as the lob
- //references are not actually removed from memory
- }
+ total += SizeUtility.getSize(isValueCacheEnabled, type);
}
total += 8*elements.size() + 36; // column list / row overhead
total *= processorBatchSize;
return Math.max(1, total / 1024);
}
-
- public void setMaxReserveBatchColumns(int maxReserve) {
- this.maxReserveBatchColumns = maxReserve;
- }
public void shutdown() {
}
@@ -698,4 +682,9 @@
id = referent.getId();
}
}
+
+ public void setUseWeakReferences(boolean useWeakReferences) {
+ this.useWeakReferences = useWeakReferences;
+ }
+
}
Copied: trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java (from rev
3275, branches/7.4.x/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java)
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java
(rev 0)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/impl/SizeUtility.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,205 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer.impl;
+
+import java.lang.reflect.Array;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.teiid.common.buffer.TupleBatch;
+import org.teiid.core.types.DataTypeManager;
+
+
+/**
+ * Utility methods to determine the size of Java objects, particularly with
+ * respect to the Teiid runtime types.
+ *
+ * The sizes are loosely based on expected heap size and are generally optimistic.
+ * Actual object allocation efficiency can be quite poor.
+ */
+public final class SizeUtility {
+ public static final int REFERENCE_SIZE = 8;
+
+ private long bigIntegerEstimate;
+ private long bigDecimalEstimate;
+
+ public SizeUtility() {
+ boolean isValueCacheEnabled = DataTypeManager.isValueCacheEnabled();
+ bigIntegerEstimate = getSize(isValueCacheEnabled,
DataTypeManager.DefaultDataClasses.BIG_INTEGER);
+ bigDecimalEstimate = getSize(isValueCacheEnabled,
DataTypeManager.DefaultDataClasses.BIG_DECIMAL);
+ }
+
+ public long getBatchSize(TupleBatch data) {
+ return getBatchSize(DataTypeManager.isValueCacheEnabled(), data);
+ }
+
+ private long getBatchSize(boolean accountForValueCache, TupleBatch data) {
+ int colLength = data.getDataTypes().length;
+ int rowLength = data.getRowCount();
+
+ // Array overhead for row array
+ long size = 16 + alignMemory(rowLength * REFERENCE_SIZE);
+ // array overhead for all the columns ( 8 object overhead + 4 ref + 4 int)
+ size += (rowLength * (48 + alignMemory(colLength * REFERENCE_SIZE)));
+ for (int col = 0; col < colLength; col++) {
+ Class<?> type =
DataTypeManager.getDataTypeClass(data.getDataTypes()[col]);
+
+ if (type == DataTypeManager.DefaultDataClasses.STRING
+ || type == DataTypeManager.DefaultDataClasses.OBJECT
+ || type == DataTypeManager.DefaultDataClasses.BIG_INTEGER
+ || type == DataTypeManager.DefaultDataClasses.BIG_DECIMAL) {
+ int estRow = 0;
+ for (int row = 0; row < rowLength; row++) {
+ boolean updateEst = row == estRow;
+ size += getSize(data.getTuples().get(row).get(col), updateEst,
accountForValueCache);
+ if (updateEst) {
+ estRow = estRow * 2 + 1;
+ }
+ }
+ } else {
+ size += getSize(accountForValueCache, type) * rowLength;
+ }
+ }
+ return size;
+ }
+
+ static int getSize(boolean isValueCacheEnabled,
+ Class<?> type) {
+ if (type == DataTypeManager.DefaultDataClasses.STRING) {
+ return isValueCacheEnabled?100:256; //assumes an "average" string length of
approximately 100 chars
+ } else if (type == DataTypeManager.DefaultDataClasses.DATE
+ || type == DataTypeManager.DefaultDataClasses.TIME
+ || type == DataTypeManager.DefaultDataClasses.TIMESTAMP) {
+ return isValueCacheEnabled?20:28;
+ } else if (type == DataTypeManager.DefaultDataClasses.LONG
+ || type == DataTypeManager.DefaultDataClasses.DOUBLE) {
+ return isValueCacheEnabled?12:16;
+ } else if (type == DataTypeManager.DefaultDataClasses.INTEGER
+ || type == DataTypeManager.DefaultDataClasses.FLOAT) {
+ return isValueCacheEnabled?6:12;
+ } else if (type == DataTypeManager.DefaultDataClasses.CHAR
+ || type == DataTypeManager.DefaultDataClasses.SHORT) {
+ return isValueCacheEnabled?4:10;
+ } else if (type == DataTypeManager.DefaultDataClasses.OBJECT) {
+ return 1024;
+ } else if (type == DataTypeManager.DefaultDataClasses.NULL) {
+ return 0; //it's free
+ } else if (type == DataTypeManager.DefaultDataClasses.BYTE
+ || type == DataTypeManager.DefaultDataClasses.BOOLEAN) {
+ return 1; //should always be value cached, but there's a small chance it's
not
+ } else if (type == DataTypeManager.DefaultDataClasses.BIG_INTEGER){
+ return isValueCacheEnabled?75:100;
+ } else if (type == DataTypeManager.DefaultDataClasses.BIG_DECIMAL) {
+ return isValueCacheEnabled?150:200;
+ }
+ return 512; //assumes buffer overhead in the case of lobs
+ //however the account for lobs is misleading as the lob
+ //references are not actually removed from memory
+ }
+
+ /**
+ * Get size of object
+ * @return Size in bytes
+ */
+ protected long getSize(Object obj, boolean updateEstimate, boolean
accountForValueCache) {
+ if(obj == null) {
+ return 0;
+ }
+
+ Class<?> type = DataTypeManager.determineDataTypeClass(obj);
+ if(type == DataTypeManager.DefaultDataClasses.STRING) {
+ int length = ((String)obj).length();
+ if (length > 0) {
+ return alignMemory(40 + (2 * length));
+ }
+ return 40;
+ } else if(obj instanceof Iterable<?>) {
+ Iterable<?> i = (Iterable<?>)obj;
+ long total = 16;
+ for (Object object : i) {
+ total += getSize(object, true, false) + REFERENCE_SIZE;
+ }
+ return total;
+ } else if(type == DataTypeManager.DefaultDataClasses.BIG_DECIMAL) {
+ if (!updateEstimate) {
+ return bigDecimalEstimate;
+ }
+ int bitLength = ((BigDecimal)obj).unscaledValue().bitLength();
+ //TODO: this does not account for the possibility of a cached string
+ long result = 88 + alignMemory(4 + (bitLength >> 3));
+ if (updateEstimate) {
+ bigDecimalEstimate = (bigDecimalEstimate + result)/2;
+ }
+ return result;
+ } else if(type == DataTypeManager.DefaultDataClasses.BIG_INTEGER) {
+ if (!updateEstimate) {
+ return bigIntegerEstimate;
+ }
+ int bitLength = ((BigInteger)obj).bitLength();
+ long result = 40 + alignMemory(4 + (bitLength >> 3));
+ if (updateEstimate) {
+ bigIntegerEstimate = (bigIntegerEstimate + result)/2;
+ }
+ return result;
+ } else if(obj.getClass().isArray()) {
+ Class<?> componentType = obj.getClass().getComponentType();
+ if (!componentType.isPrimitive()) {
+ Object[] rows = (Object[]) obj;
+ long total = 16 + alignMemory(rows.length * REFERENCE_SIZE); // Array
overhead
+ for(int i=0; i<rows.length; i++) {
+ total += getSize(rows[i], true, false);
+ }
+ return total;
+ }
+ int length = Array.getLength(obj);
+ int primitiveSize = 8;
+ if (componentType == boolean.class) {
+ primitiveSize = 4;
+ } else if (componentType == byte.class) {
+ primitiveSize = 1;
+ } else if (componentType == short.class) {
+ primitiveSize = 2;
+ } else if (componentType == int.class || componentType == float.class) {
+ primitiveSize = 4;
+ }
+ return alignMemory(length * primitiveSize) + 16;
+ }
+ return getSize(accountForValueCache, type);
+ }
+
+ /**
+ * Most current VMs have memory alignment that places objects into heap space that is
a multiple of 8 Bytes.
+ * This utility method helps with calculating the aligned size of an object.
+ * @param numBytes
+ * @return
+ * @since 4.2
+ */
+ private static long alignMemory(long numBytes) {
+ long remainder = numBytes % 8;
+ if (remainder != 0) {
+ numBytes += (8 - remainder);
+ }
+ return numBytes;
+ }
+
+}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidationVisitor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -28,16 +28,17 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.teiid.CommandContext;
+import org.teiid.PolicyDecider;
import org.teiid.adminapi.DataPolicy;
+import org.teiid.adminapi.DataPolicy.Context;
import org.teiid.adminapi.DataPolicy.PermissionType;
-import org.teiid.adminapi.impl.DataPolicyMetadata;
import org.teiid.api.exception.query.QueryMetadataException;
import org.teiid.core.CoreConstants;
import org.teiid.core.TeiidComponentException;
@@ -74,44 +75,19 @@
public class AuthorizationValidationVisitor extends AbstractValidationVisitor {
- public enum Context {
- CREATE,
- DROP,
- QUERY,
- INSERT,
- UPDATE,
- DELETE,
- FUNCTION,
- ALTER,
- STORED_PROCEDURE;
- }
-
- private HashMap<String, DataPolicy> allowedPolicies;
- private boolean allowCreateTemporaryTablesDefault = true;
- private boolean allowFunctionCallsByDefault = true;
private CommandContext commandContext;
+ private PolicyDecider decider;
- public AuthorizationValidationVisitor(HashMap<String, DataPolicy> policies,
CommandContext commandContext) {
- this.allowedPolicies = policies;
+ public AuthorizationValidationVisitor(PolicyDecider decider, CommandContext
commandContext) {
+ this.decider = decider;
this.commandContext = commandContext;
}
-
- public void setAllowCreateTemporaryTablesDefault(
- boolean allowCreateTemporaryTablesDefault) {
- this.allowCreateTemporaryTablesDefault = allowCreateTemporaryTablesDefault;
- }
-
- public void setAllowFunctionCallsByDefault(boolean allowFunctionCallsDefault) {
- this.allowFunctionCallsByDefault = allowFunctionCallsDefault;
- }
// ############### Visitor methods for language objects ##################
@Override
public void visit(Create obj) {
- Set<String> resources = Collections.singleton(obj.getTable().getName());
- Collection<GroupSymbol> symbols = Arrays.asList(obj.getTable());
- validateTemp(resources, symbols, Context.CREATE);
+ validateTemp(PermissionType.CREATE, obj.getTable(), Context.CREATE);
}
@Override
@@ -129,30 +105,18 @@
validateEntitlements(Arrays.asList(obj.getTarget()),
DataPolicy.PermissionType.ALTER, Context.ALTER);
}
- private void validateTemp(Set<String> resources,
- Collection<GroupSymbol> symbols, Context context) {
+ private void validateTemp(DataPolicy.PermissionType action, GroupSymbol symbol, Context
context) {
+ String resource = symbol.getNonCorrelationName();
+ Set<String> resources = Collections.singleton(resource);
logRequest(resources, context);
- boolean allowed = false;
- for(DataPolicy p:this.allowedPolicies.values()) {
- DataPolicyMetadata policy = (DataPolicyMetadata)p;
-
- if (policy.isAllowCreateTemporaryTables() == null) {
- if (allowCreateTemporaryTablesDefault) {
- allowed = true;
- break;
- }
- } else if (policy.isAllowCreateTemporaryTables()) {
- allowed = true;
- break;
- }
- }
+ boolean allowed = decider.isTempAccessable(action, resource, context,
commandContext);
logResult(resources, context, allowed);
if (!allowed) {
handleValidationError(
QueryPlugin.Util.getString("ERR.018.005.0095",
commandContext.getUserName(), "CREATE_TEMPORARY_TABLES"), //$NON-NLS-1$
//$NON-NLS-2$
- symbols);
+ Arrays.asList(symbol));
}
}
@@ -166,9 +130,7 @@
@Override
public void visit(Drop obj) {
- Set<String> resources = Collections.singleton(obj.getTable().getName());
- Collection<GroupSymbol> symbols = Arrays.asList(obj.getTable());
- validateTemp(resources, symbols, Context.CREATE);
+ validateTemp(PermissionType.DROP, obj.getTable(), Context.DROP);
}
public void visit(Delete obj) {
@@ -205,7 +167,7 @@
} catch (TeiidProcessingException e) {
handleException(e, obj);
}
- } else if (!allowFunctionCallsByDefault) {
+ } else {
String schema = obj.getFunctionDescriptor().getSchema();
if (schema != null && !isSystemSchema(schema)) {
Map<String, Function> map = new HashMap<String, Function>();
@@ -221,14 +183,13 @@
* Validate insert entitlements
*/
protected void validateEntitlements(Insert obj) {
+ List<LanguageObject> insert = new LinkedList<LanguageObject>();
+ insert.add(obj.getGroup());
+ insert.addAll(obj.getVariables());
validateEntitlements(
- obj.getVariables(),
+ insert,
DataPolicy.PermissionType.CREATE,
Context.INSERT);
-
- if (obj.getGroup().isTempTable()) {
- validateTemp(Collections.singleton(obj.getGroup().getNonCorrelationName()),
Arrays.asList(obj.getGroup()), Context.INSERT);
- }
}
/**
@@ -248,7 +209,10 @@
// The variables from the changes must be checked for UPDATE entitlement
// validateEntitlements on all the variables used in the update.
- validateEntitlements(obj.getChangeList().getClauseMap().keySet(),
DataPolicy.PermissionType.UPDATE, Context.UPDATE);
+ List<LanguageObject> updated = new LinkedList<LanguageObject>();
+ updated.add(obj.getGroup());
+ updated.addAll(obj.getChangeList().getClauseMap().keySet());
+ validateEntitlements(updated, DataPolicy.PermissionType.UPDATE, Context.UPDATE);
}
/**
@@ -275,12 +239,10 @@
Into intoObj = obj.getInto();
if ( intoObj != null ) {
GroupSymbol intoGroup = intoObj.getGroup();
- if (intoGroup.isTempTable()) {
- validateTemp(Collections.singleton(intoGroup.getNonCorrelationName()),
Arrays.asList(intoGroup), Context.INSERT);
- }
- List<ElementSymbol> intoElements = null;
+ Collection<LanguageObject> intoElements = new
LinkedList<LanguageObject>();
+ intoElements.add(intoGroup);
try {
- intoElements = ResolverUtil.resolveElementsInGroup(intoGroup,
getMetadata());
+ intoElements.addAll(ResolverUtil.resolveElementsInGroup(intoGroup,
getMetadata()));
} catch (QueryMetadataException err) {
handleException(err, intoGroup);
} catch (TeiidComponentException err) {
@@ -292,7 +254,7 @@
}
// Validate this query's entitlements
- Collection entitledObjects = GroupCollectorVisitor.getGroups(obj, true);
+ Collection<LanguageObject> entitledObjects = new
ArrayList<LanguageObject>(GroupCollectorVisitor.getGroupsIgnoreInlineViews(obj,
true));
if (!isXMLCommand(obj)) {
entitledObjects.addAll(ElementCollectorVisitor.getElements(obj, true));
}
@@ -319,7 +281,7 @@
* @param auditContext The {@link AuthorizationService} to use when resource auditing
is done.
*/
protected void validateEntitlements(Collection<? extends LanguageObject>
symbols, DataPolicy.PermissionType actionCode, Context auditContext) {
- Map<String, LanguageObject> nameToSymbolMap = new HashMap<String,
LanguageObject>();
+ Map<String, LanguageObject> nameToSymbolMap = new LinkedHashMap<String,
LanguageObject>();
for (LanguageObject symbol : symbols) {
try {
String fullName = null;
@@ -333,6 +295,9 @@
GroupSymbol group = (GroupSymbol)symbol;
metadataID = group.getMetadataID();
if (metadataID instanceof TempMetadataID &&
!group.isProcedure()) {
+ if (group.isTempTable()) {
+ validateTemp(actionCode, group, auditContext);
+ }
continue;
}
}
@@ -380,27 +345,12 @@
}
/**
- * Out of resources specified, return the subset for which the specified not have
authorization to access.
+ * Out of the resources specified, return the subset for which the specified not have
authorization to access.
*/
public Set<String> getInaccessibleResources(DataPolicy.PermissionType action,
Set<String> resources, Context context) {
logRequest(resources, context);
- HashSet<String> results = new HashSet<String>(resources);
-
- for(DataPolicy p:this.allowedPolicies.values()) {
- DataPolicyMetadata policy = (DataPolicyMetadata)p;
-
- if (results.isEmpty()) {
- break;
- }
-
- Iterator<String> i = results.iterator();
- while (i.hasNext()) {
- if (policy.allows(i.next(), action)) {
- i.remove();
- }
- }
- }
+ Set<String> results = decider.getInaccessibleResources(action, resources,
context, commandContext);
logResult(resources, context, results.isEmpty());
return results;
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidator.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidator.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/AuthorizationValidator.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -33,8 +33,11 @@
*/
public interface AuthorizationValidator {
- void validate(Command command, QueryMetadataInterface metadata,
- DQPWorkContext workContext, CommandContext commandContext) throws
QueryValidatorException, TeiidComponentException;
+ void validate(Command command, QueryMetadataInterface metadata, CommandContext
commandContext) throws QueryValidatorException, TeiidComponentException;
- boolean hasRole(String roleName, DQPWorkContext workContext);
+ boolean hasRole(String roleName, CommandContext commandContext);
+
+ boolean isEnabled();
+
+ void setEnabled(boolean enabled);
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -125,18 +125,19 @@
@Override
public synchronized boolean restore(Cache cache, BufferManager bufferManager) {
- try {
- if (this.results == null) {
- if (this.hasLobs) {
- return false;
- }
+ if (this.results == null) {
+ if (this.hasLobs) {
+ return false; //the lob store is local only and not distributed
+ }
+ TupleBuffer buffer = null;
+ try {
List<ElementSymbol> schema = new ArrayList<ElementSymbol>(types.length);
for (String type : types) {
ElementSymbol es = new ElementSymbol("x"); //$NON-NLS-1$
es.setType(DataTypeManager.getDataTypeClass(type));
schema.add(es);
}
- TupleBuffer buffer = bufferManager.createTupleBuffer(schema, "cached",
TupleSourceType.FINAL); //$NON-NLS-1$
+ buffer = bufferManager.createTupleBuffer(schema, "cached",
TupleSourceType.FINAL); //$NON-NLS-1$
buffer.setBatchSize(this.batchSize);
if (this.hint != null) {
buffer.setPrefersMemory(this.hint.getPrefersMemory());
@@ -144,20 +145,26 @@
for (int row = 1; row <= this.rowCount; row+=this.batchSize) {
TupleBatch batch = (TupleBatch)cache.get(uuid+","+row); //$NON-NLS-1$
- if (batch != null) {
- buffer.addTupleBatch(batch, true);
- }
+ if (batch == null) {
+ LogManager.logInfo(LogConstants.CTX_DQP,
QueryPlugin.Util.getString("not_found_cache")); //$NON-NLS-1$
+ buffer.remove();
+ return false;
+ }
+ buffer.addTupleBatch(batch, true);
}
this.results = buffer;
bufferManager.addTupleBuffer(this.results);
this.results.close();
+ this.accessInfo.restore();
+ } catch (TeiidException e) {
+ LogManager.logWarning(LogConstants.CTX_DQP, e,
QueryPlugin.Util.getString("unexpected_exception_restoring_results"));
//$NON-NLS-1$
+ if (buffer != null) {
+ buffer.remove();
+ }
+ return false;
}
- this.accessInfo.restore();
- return true;
- } catch (TeiidException e) {
- LogManager.logDetail(LogConstants.CTX_DQP, e,
QueryPlugin.Util.getString("not_found_cache")); //$NON-NLS-1$
}
- return false;
+ return true;
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPConfiguration.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -135,40 +135,15 @@
*/
@ManagementProperty(description="Turn on role checking based upon the data roles
defined in VDBs. (default true)")
public boolean getUseDataRoles() {
- return useDataRoles;
+ return this.authorizationValidator != null &&
this.authorizationValidator.isEnabled();
}
public void setUseDataRoles(boolean useEntitlements) {
- this.useDataRoles = useEntitlements;
+ if (this.authorizationValidator != null) {
+ this.authorizationValidator.setEnabled(useEntitlements);
+ }
}
- /**
- * Whether temporary table usage is enabled by default.
- * @return <code>true</code> if temporary table usage is enabled by
default.
- */
- @ManagementProperty(description="Sets whether temporary table usage is allowed
by default with data roles enabled. If false, the user must have a role that grants
creates temporary table rights to use temporary tables. (default true)")
- public boolean isAllowCreateTemporaryTablesByDefault() {
- return allowCreateTemporaryTablesByDefault;
- }
-
- public void setAllowCreateTemporaryTablesByDefault(
- boolean allowCreateTemporaryTablesByDefault) {
- this.allowCreateTemporaryTablesByDefault = allowCreateTemporaryTablesByDefault;
- }
-
- /**
- * Whether functions are callable by default
- * @return <code>true</code> if function usage is enabled by default.
- */
- @ManagementProperty(description="Sets whether functions may be called by default
with data roles enabled. If false, a specific permission must exist to call the function.
(default true)")
- public boolean isAllowFunctionCallsByDefault() {
- return allowFunctionCallsByDefault;
- }
-
- public void setAllowFunctionCallsByDefault(boolean allowFunctionCallsDefault) {
- this.allowFunctionCallsByDefault = allowFunctionCallsDefault;
- }
-
@ManagementProperty(description="Long running query threshold, after which a alert
can be generated by tooling if configured")
public int getQueryThresholdInSecs() {
return queryThresholdInSecs;
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPCore.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -673,9 +673,6 @@
public void start(DQPConfiguration config) {
this.config = config;
this.authorizationValidator = config.getAuthorizationValidator();
- if (this.authorizationValidator == null) {
- this.authorizationValidator = new
DataRoleAuthorizationValidator(config.getUseDataRoles(),
config.isAllowCreateTemporaryTablesByDefault(), config.isAllowFunctionCallsByDefault());
- }
this.chunkSize = config.getLobChunkSizeInKB() * 1024;
//get buffer manager
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -217,6 +217,10 @@
}
return this.policies;
}
+
+ public void setPolicies(HashMap<String, DataPolicy> policies) {
+ this.policies = policies;
+ }
private boolean matchesPrincipal(Set<String> userRoles, DataPolicy policy) {
if (policy.isAnyAuthenticated()) {
Property changes on:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DQPWorkContext.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Deleted:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRoleAuthorizationValidator.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRoleAuthorizationValidator.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRoleAuthorizationValidator.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,65 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.dqp.internal.process;
-
-import org.teiid.api.exception.query.QueryValidatorException;
-import org.teiid.core.TeiidComponentException;
-import org.teiid.query.metadata.QueryMetadataInterface;
-import org.teiid.query.sql.lang.Command;
-import org.teiid.query.util.CommandContext;
-
-/**
- * The default Teiid authorization validator
- */
-public class DataRoleAuthorizationValidator implements AuthorizationValidator {
-
- private boolean useEntitlements;
- private boolean allowCreateTemporaryTablesByDefault;
- private boolean allowFunctionCallsByDefault;
-
- public DataRoleAuthorizationValidator(boolean useEntitlements,
- boolean allowCreateTemporaryTablesByDefault, boolean allowFunctionCallsByDefault) {
- this.useEntitlements = useEntitlements;
- this.allowCreateTemporaryTablesByDefault = allowCreateTemporaryTablesByDefault;
- this.allowFunctionCallsByDefault = allowFunctionCallsByDefault;
- }
-
- @Override
- public void validate(Command command, QueryMetadataInterface metadata, DQPWorkContext
workContext, CommandContext commandContext) throws QueryValidatorException,
TeiidComponentException {
- if (useEntitlements && !workContext.getVDB().getDataPolicies().isEmpty()) {
- AuthorizationValidationVisitor visitor = new
AuthorizationValidationVisitor(workContext.getAllowedDataPolicies(), commandContext);
- visitor.setAllowCreateTemporaryTablesDefault(allowCreateTemporaryTablesByDefault);
- visitor.setAllowFunctionCallsByDefault(allowFunctionCallsByDefault);
- Request.validateWithVisitor(visitor, metadata, command);
- }
- }
-
- @Override
- public boolean hasRole(String roleName, DQPWorkContext workContext) {
- if (!useEntitlements) {
- return true;
- }
- return workContext.getAllowedDataPolicies().containsKey(roleName);
- }
-
-}
Copied:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRolePolicyDecider.java (from
rev 3275,
branches/7.4.x/engine/src/main/java/org/teiid/dqp/internal/process/DataRolePolicyDecider.java)
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRolePolicyDecider.java
(rev 0)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataRolePolicyDecider.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,76 @@
+package org.teiid.dqp.internal.process;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+import org.teiid.CommandContext;
+import org.teiid.PolicyDecider;
+import org.teiid.adminapi.DataPolicy;
+import org.teiid.adminapi.DataPolicy.Context;
+import org.teiid.adminapi.DataPolicy.PermissionType;
+import org.teiid.adminapi.impl.DataPolicyMetadata;
+
+public class DataRolePolicyDecider implements PolicyDecider {
+
+ private boolean allowCreateTemporaryTablesByDefault = true;
+ private boolean allowFunctionCallsByDefault = true;
+
+ @Override
+ public Set<String> getInaccessibleResources(PermissionType action,
+ Set<String> resources, Context context, CommandContext commandContext) {
+ if (action == PermissionType.EXECUTE && context == Context.FUNCTION &&
allowFunctionCallsByDefault) {
+ return Collections.emptySet();
+ }
+ LinkedHashSet<String> results = new LinkedHashSet<String>(resources);
+ for(DataPolicy p:commandContext.getAllowedDataPolicies().values()) {
+ DataPolicyMetadata policy = (DataPolicyMetadata)p;
+
+ if (results.isEmpty()) {
+ break;
+ }
+
+ Iterator<String> i = results.iterator();
+ while (i.hasNext()) {
+ if (policy.allows(i.next(), action)) {
+ i.remove();
+ }
+ }
+ }
+ return results;
+ }
+
+ @Override
+ public boolean hasRole(String roleName, CommandContext context) {
+ return context.getAllowedDataPolicies().containsKey(roleName);
+ }
+
+ @Override
+ public boolean isTempAccessable(PermissionType action, String resource,
+ Context context, CommandContext commandContext) {
+ for(DataPolicy p:commandContext.getAllowedDataPolicies().values()) {
+ DataPolicyMetadata policy = (DataPolicyMetadata)p;
+
+ if (policy.isAllowCreateTemporaryTables() != null) {
+ return policy.isAllowCreateTemporaryTables();
+ }
+ }
+ return allowCreateTemporaryTablesByDefault;
+ }
+
+ public void setAllowCreateTemporaryTablesByDefault(
+ boolean allowCreateTemporaryTablesByDefault) {
+ this.allowCreateTemporaryTablesByDefault = allowCreateTemporaryTablesByDefault;
+ }
+
+ public void setAllowFunctionCallsByDefault(boolean allowFunctionCallsDefault) {
+ this.allowFunctionCallsByDefault = allowFunctionCallsDefault;
+ }
+
+ @Override
+ public boolean validateCommand(CommandContext commandContext) {
+ return !commandContext.getVdb().getDataPolicies().isEmpty();
+ }
+
+}
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -33,6 +33,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
+import java.util.TreeMap;
import javax.sql.rowset.serial.SerialClob;
@@ -60,6 +61,8 @@
import org.teiid.dqp.message.RequestID;
import org.teiid.dqp.service.BufferService;
import org.teiid.events.EventDistributor;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.metadata.AbstractMetadataRecord;
import org.teiid.metadata.Column;
import org.teiid.metadata.ColumnStats;
@@ -120,13 +123,34 @@
private enum SystemAdminProcs {
SETTABLESTATS,
SETCOLUMNSTATS,
- SETPROPERTY
+ SETPROPERTY,
+ LOGMSG,
+ ISLOGGABLE
}
private enum SystemProcs {
GETXMLSCHEMAS
}
+ private static final TreeMap<String, Integer> levelMap = new TreeMap<String,
Integer>(String.CASE_INSENSITIVE_ORDER);
+ static {
+ levelMap.put("OFF", MessageLevel.NONE); //$NON-NLS-1$
+ levelMap.put("FATAL", MessageLevel.CRITICAL); //$NON-NLS-1$
+ levelMap.put("ERROR", MessageLevel.ERROR); //$NON-NLS-1$
+ levelMap.put("WARN", MessageLevel.WARNING); //$NON-NLS-1$
+ levelMap.put("INFO", MessageLevel.INFO); //$NON-NLS-1$
+ levelMap.put("DEBUG", MessageLevel.DETAIL); //$NON-NLS-1$
+ levelMap.put("TRACE", MessageLevel.TRACE); //$NON-NLS-1$
+ }
+
+ public static int getLevel(String level) throws TeiidProcessingException {
+ Integer intLevel = levelMap.get(level);
+ if (intLevel == null) {
+ throw new
TeiidProcessingException(QueryPlugin.Util.getString("FunctionMethods.unknown_level",
level, levelMap.keySet())); //$NON-NLS-1$
+ }
+ return intLevel;
+ }
+
// Resources
private DQPCore requestMgr;
private BufferService bufferService;
@@ -361,6 +385,26 @@
if (StringUtil.startsWithIgnoreCase(proc.getProcedureCallableName(),
CoreConstants.SYSTEM_ADMIN_MODEL)) {
final SystemAdminProcs sysProc =
SystemAdminProcs.valueOf(proc.getProcedureCallableName().substring(CoreConstants.SYSTEM_ADMIN_MODEL.length()
+ 1).toUpperCase());
switch (sysProc) {
+ case LOGMSG:
+ case ISLOGGABLE:
+ String level = (String)((Constant)proc.getParameter(2).getExpression()).getValue();
+ String logContext =
(String)((Constant)proc.getParameter(3).getExpression()).getValue();
+ Object message = null;
+ if (sysProc == SystemAdminProcs.LOGMSG) {
+ message = ((Constant)proc.getParameter(4).getExpression()).getValue();
+ }
+ int msgLevel = getLevel(level);
+ boolean logged = false;
+ if (LogManager.isMessageToBeRecorded(logContext, msgLevel)) {
+ if (message != null) {
+ LogManager.log(msgLevel, logContext, message);
+ }
+ logged = true;
+ }
+ if (proc.returnParameters()) {
+ rows.add(Arrays.asList(logged));
+ }
+ return new CollectionTupleSource(rows.iterator());
case SETPROPERTY:
try {
String uuid = (String)((Constant)proc.getParameter(2).getExpression()).getValue();
@@ -385,10 +429,12 @@
if (eventDistributor != null) {
eventDistributor.setProperty(vdbName, vdbVersion, uuid, key, strVal);
}
- if (result == null) {
- rows.add(Arrays.asList((Clob)null));
- } else {
- rows.add(Arrays.asList(new ClobType(new SerialClob(result.toCharArray()))));
+ if (proc.returnParameters()) {
+ if (result == null) {
+ rows.add(Arrays.asList((Clob)null));
+ } else {
+ rows.add(Arrays.asList(new ClobType(new SerialClob(result.toCharArray()))));
+ }
}
return new CollectionTupleSource(rows.iterator());
} catch (SQLException e) {
Property changes on:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
___________________________________________________________________
Deleted: svn:mergeinfo
-
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierTupleSource.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -57,8 +57,6 @@
import org.teiid.dqp.message.AtomicRequestMessage;
import org.teiid.dqp.message.AtomicResultsMessage;
import org.teiid.events.EventDistributor;
-import org.teiid.logging.LogConstants;
-import org.teiid.logging.LogManager;
import org.teiid.metadata.Table;
import org.teiid.query.function.source.XMLSystemFunctions;
import org.teiid.query.processor.relational.RelationalNodeUtil;
Copied:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DefaultAuthorizationValidator.java
(from rev 3275,
branches/7.4.x/engine/src/main/java/org/teiid/dqp/internal/process/DefaultAuthorizationValidator.java)
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DefaultAuthorizationValidator.java
(rev 0)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DefaultAuthorizationValidator.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,77 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.dqp.internal.process;
+
+import org.teiid.PolicyDecider;
+import org.teiid.api.exception.query.QueryValidatorException;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.query.metadata.QueryMetadataInterface;
+import org.teiid.query.sql.lang.Command;
+import org.teiid.query.util.CommandContext;
+
+/**
+ * The default Teiid authorization validator
+ */
+public class DefaultAuthorizationValidator implements AuthorizationValidator {
+
+ private boolean enabled = true;
+ private PolicyDecider policyDecider;
+
+ public DefaultAuthorizationValidator() {
+ }
+
+ @Override
+ public void validate(Command command, QueryMetadataInterface metadata, CommandContext
commandContext) throws QueryValidatorException, TeiidComponentException {
+ if (enabled && policyDecider.validateCommand(commandContext)) {
+ AuthorizationValidationVisitor visitor = new
AuthorizationValidationVisitor(this.policyDecider, commandContext);
+ Request.validateWithVisitor(visitor, metadata, command);
+ }
+ }
+
+ @Override
+ public boolean hasRole(String roleName, CommandContext commandContext) {
+ if (!enabled) {
+ return true;
+ }
+ return this.policyDecider.hasRole(roleName, commandContext);
+ }
+
+ public void setPolicyDecider(PolicyDecider policyDecider) {
+ this.policyDecider = policyDecider;
+ }
+
+ public PolicyDecider getPolicyDecider() {
+ return policyDecider;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return enabled;
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -254,6 +254,7 @@
context.setSubject(workContext.getSubject());
this.context.setSession(workContext.getSession());
this.context.setRequestId(this.requestId);
+ this.context.setDQPWorkContext(this.workContext);
}
@Override
@@ -262,7 +263,10 @@
if (!DATA_ROLE.equalsIgnoreCase(roleType)) {
return false;
}
- return authorizationValidator.hasRole(roleName, workContext);
+ if (this.authorizationValidator == null) {
+ return true;
+ }
+ return authorizationValidator.hasRole(roleName, context);
}
public void setUserRequestConcurrency(int userRequestConcurrency) {
@@ -465,7 +469,9 @@
protected void validateAccess(Command command) throws QueryValidatorException,
TeiidComponentException {
createCommandContext(command);
- this.authorizationValidator.validate(command, metadata, workContext, context);
+ if (this.authorizationValidator != null) {
+ this.authorizationValidator.validate(command, metadata, context);
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -58,6 +58,7 @@
import org.teiid.dqp.service.TransactionContext;
import org.teiid.dqp.service.TransactionService;
import org.teiid.dqp.service.TransactionContext.Scope;
+import org.teiid.jdbc.SQLStates;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
@@ -223,7 +224,7 @@
state = ProcessingState.PROCESSING;
processNew();
if (isCanceled) {
- this.processingException = new
TeiidProcessingException(QueryPlugin.Util.getString("QueryProcessor.request_cancelled",
this.requestID)); //$NON-NLS-1$
+ this.processingException = new
TeiidProcessingException(SQLStates.QUERY_CANCELED,
QueryPlugin.Util.getString("QueryProcessor.request_cancelled", this.requestID));
//$NON-NLS-1$
state = ProcessingState.CLOSE;
}
}
@@ -292,10 +293,12 @@
}
private void suspend() {
- try {
- this.transactionService.suspend(this.transactionContext);
- } catch (XATransactionException e) {
- LogManager.logDetail(LogConstants.CTX_DQP, e, "Error suspending active
transaction"); //$NON-NLS-1$
+ if (this.transactionState == TransactionState.ACTIVE &&
this.transactionContext.getTransaction() != null) {
+ try {
+ this.transactionService.suspend(this.transactionContext);
+ } catch (XATransactionException e) {
+ LogManager.logDetail(LogConstants.CTX_DQP, e, "Error suspending active
transaction"); //$NON-NLS-1$
+ }
}
}
@@ -442,15 +445,17 @@
doneProducingBatches();
}
addToCache();
- add = sendResultsIfNeeded(batch);
- if (!added) {
- super.flushBatchDirect(batch, add);
- //restrict the buffer size for forward only results
- if (add && !processor.hasFinalBuffer()
- && !batch.getTerminationFlag()
- && this.getTupleBuffer().getManagedRowCount() >= 20 *
this.getTupleBuffer().getBatchSize()) {
- //requestMore will trigger more processing
- throw BlockedException.block(requestID, "Blocking due to full results
buffer."); //$NON-NLS-1$
+ synchronized (lobStreams) {
+ add = sendResultsIfNeeded(batch);
+ if (!added) {
+ super.flushBatchDirect(batch, add);
+ //restrict the buffer size for forward only results
+ if (add && !processor.hasFinalBuffer()
+ && !batch.getTerminationFlag()
+ && this.getTupleBuffer().getManagedRowCount() >= 20 *
this.getTupleBuffer().getBatchSize()) {
+ //requestMore will trigger more processing
+ throw BlockedException.block(requestID, "Blocking due to full results
buffer."); //$NON-NLS-1$
+ }
}
}
}
@@ -626,10 +631,24 @@
}
LogManager.logDetail(LogConstants.CTX_DQP, processingException, "Sending error to
client", requestID); //$NON-NLS-1$
ResultsMessage response = new ResultsMessage(requestMsg);
- response.setException(processingException);
+ Throwable exception = this.processingException;
+ if (isCanceled) {
+ exception = addCancelCode(exception);
+ }
+ response.setException(exception);
setAnalysisRecords(response);
receiver.receiveResults(response);
}
+
+ private Throwable addCancelCode(Throwable exception) {
+ if (exception instanceof TeiidException) {
+ TeiidException te = (TeiidException)exception;
+ if (SQLStates.QUERY_CANCELED.equals(te.getCode())) {
+ return exception;
+ }
+ }
+ return new TeiidProcessingException(exception, SQLStates.QUERY_CANCELED,
exception.getMessage());
+ }
@Override
protected boolean shouldPause() {
@@ -651,10 +670,10 @@
public void processLobChunkRequest(String id, int streamRequestId,
ResultsReceiver<LobChunk> chunckReceiver) {
LobWorkItem workItem = null;
synchronized (lobStreams) {
- workItem = this.lobStreams.get(new Integer(streamRequestId));
+ workItem = this.lobStreams.get(streamRequestId);
if (workItem == null) {
workItem = new LobWorkItem(this, dqpCore, id, streamRequestId);
- lobStreams.put(new Integer(streamRequestId), workItem);
+ lobStreams.put(streamRequestId, workItem);
}
}
workItem.setResultsReceiver(chunckReceiver);
@@ -666,7 +685,7 @@
}
public void removeLobStream(int streamRequestId) {
- this.lobStreams.remove(new Integer(streamRequestId));
+ this.lobStreams.remove(streamRequestId);
}
public boolean requestCancel() throws TeiidComponentException {
Modified: trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2011-06-28 03:27:07 UTC
(rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2011-06-28 03:47:29 UTC
(rev 3280)
@@ -42,6 +42,10 @@
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import javax.xml.transform.stream.StreamResult;
+
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.query.QueryResult;
import net.sf.saxon.trans.XPathException;
import org.teiid.api.exception.query.ExpressionEvaluationException;
@@ -50,6 +54,7 @@
import org.teiid.core.ComponentNotFoundException;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.types.BlobType;
import org.teiid.core.types.ClobImpl;
import org.teiid.core.types.ClobType;
@@ -68,6 +73,7 @@
import org.teiid.query.function.FunctionDescriptor;
import org.teiid.query.function.FunctionLibrary;
import org.teiid.query.function.source.XMLSystemFunctions;
+import org.teiid.query.function.source.XMLSystemFunctions.XmlConcat;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.lang.AbstractSetCriteria;
@@ -113,11 +119,37 @@
import org.teiid.query.util.CommandContext;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression.Result;
+import org.teiid.query.xquery.saxon.SaxonXQueryExpression.RowProcessor;
import org.teiid.translator.WSConnection.Util;
public class Evaluator {
- private final class SequenceReader extends Reader {
+ private final class XMLQueryRowProcessor implements RowProcessor {
+ XmlConcat concat; //just used to get a writer
+ Type type;
+ private javax.xml.transform.Result result;
+
+ private XMLQueryRowProcessor() throws TeiidProcessingException {
+ concat = new XmlConcat(context.getBufferManager());
+ result = new StreamResult(concat.getWriter());
+ }
+
+ @Override
+ public void processRow(NodeInfo row) {
+ if (type == null) {
+ type = SaxonXQueryExpression.getType(row);
+ } else {
+ type = Type.CONTENT;
+ }
+ try {
+ QueryResult.serialize(row, result, SaxonXQueryExpression.DEFAULT_OUTPUT_PROPERTIES);
+ } catch (XPathException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
+ }
+
+ private final class SequenceReader extends Reader {
private LinkedList<Reader> readers;
private Reader current = null;
@@ -759,13 +791,33 @@
private Object evaluateXMLQuery(List<?> tuple, XMLQuery xmlQuery)
throws BlockedException, TeiidComponentException,
FunctionExecutionException {
- boolean emptyOnEmpty = true;
- if (xmlQuery.getEmptyOnEmpty() != null) {
- emptyOnEmpty = xmlQuery.getEmptyOnEmpty();
- }
+ boolean emptyOnEmpty = xmlQuery.getEmptyOnEmpty() == null ||
xmlQuery.getEmptyOnEmpty();
Result result = null;
try {
- result = evaluateXQuery(xmlQuery.getXQueryExpression(), xmlQuery.getPassing(),
tuple);
+ XMLQueryRowProcessor rp = null;
+ if (xmlQuery.getXQueryExpression().isStreaming()) {
+ rp = new XMLQueryRowProcessor();
+ }
+ try {
+ result = evaluateXQuery(xmlQuery.getXQueryExpression(), xmlQuery.getPassing(), tuple,
rp);
+ } catch (TeiidRuntimeException e) {
+ if (e.getCause() instanceof XPathException) {
+ throw (XPathException)e.getCause();
+ }
+ throw e;
+ }
+ if (rp != null) {
+ XMLType.Type type = rp.type;
+ if (type == null) {
+ if (!emptyOnEmpty) {
+ return null;
+ }
+ type = Type.CONTENT;
+ }
+ XMLType val = rp.concat.close();
+ val.setType(rp.type);
+ return val;
+ }
return xmlQuery.getXQueryExpression().createXMLType(result.iter,
this.context.getBufferManager(), emptyOnEmpty);
} catch (TeiidProcessingException e) {
throw new FunctionExecutionException(e,
QueryPlugin.Util.getString("Evaluator.xmlquery", e.getMessage()));
//$NON-NLS-1$
@@ -859,7 +911,7 @@
}
}
- public Result evaluateXQuery(SaxonXQueryExpression xquery, List<DerivedColumn>
cols, List<?> tuple)
+ public Result evaluateXQuery(SaxonXQueryExpression xquery, List<DerivedColumn>
cols, List<?> tuple, RowProcessor processor)
throws BlockedException, TeiidComponentException, TeiidProcessingException {
HashMap<String, Object> parameters = new HashMap<String, Object>();
Object contextItem = null;
@@ -871,7 +923,7 @@
parameters.put(passing.getAlias(), value);
}
}
- return xquery.evaluateXQuery(contextItem, parameters);
+ return xquery.evaluateXQuery(contextItem, parameters, processor, context);
}
private Evaluator.NameValuePair<Object>[] getNameValuePairs(List<?> tuple,
List<DerivedColumn> args, boolean xmlNames)
Modified:
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/function/source/XMLSystemFunctions.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -401,6 +401,7 @@
private Writer writer;
private FileStoreInputStreamFactory fsisf;
private FileStore fs;
+ private Type type;
public XmlConcat(BufferManager bm) throws TeiidProcessingException {
fs = bm.createFileStore("xml"); //$NON-NLS-1$
@@ -417,6 +418,13 @@
}
public void addValue(Object object) throws TeiidProcessingException {
+ if (type == null) {
+ if (object instanceof XMLType) {
+ type = ((XMLType)object).getType();
+ }
+ } else {
+ type = Type.CONTENT;
+ }
try {
convertValue(writer, eventWriter, eventFactory, object);
} catch (IOException e) {
@@ -431,6 +439,10 @@
}
}
+ public Writer getWriter() {
+ return writer;
+ }
+
public XMLType close() throws TeiidProcessingException {
try {
eventWriter.flush();
@@ -443,7 +455,11 @@
throw new TeiidProcessingException(e);
}
XMLType result = new XMLType(new SQLXMLImpl(fsisf));
- result.setType(Type.CONTENT);
+ if (type == null) {
+ result.setType(Type.CONTENT);
+ } else {
+ result.setType(type);
+ }
return result;
}
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -78,7 +78,7 @@
*/
public class TransformationMetadata extends BasicQueryMetadata implements Serializable {
- private final class LiveQueryNode extends QueryNode {
+ private static final class LiveQueryNode extends QueryNode {
Procedure p;
private LiveQueryNode(Procedure p) {
super(null);
@@ -89,7 +89,19 @@
return p.getQueryPlan();
}
}
+
+ private static final class LiveTableQueryNode extends QueryNode {
+ Table t;
+ private LiveTableQueryNode(Table t) {
+ super(null);
+ this.t = t;
+ }
+ public String getQuery() {
+ return t.getSelectTransformation();
+ }
+ }
+
private final class VirtualFileInputStreamFactory extends
InputStreamFactory {
private final VirtualFile f;
@@ -463,8 +475,7 @@
if (!tableRecord.isVirtual()) {
throw new
QueryMetadataException(QueryPlugin.Util.getString("TransformationMetadata.QueryPlan_could_not_be_found_for_physical_group__6")+tableRecord.getFullName());
//$NON-NLS-1$
}
- String transQuery = tableRecord.getSelectTransformation();
- QueryNode queryNode = new QueryNode(transQuery);
+ LiveTableQueryNode queryNode = new LiveTableQueryNode(tableRecord);
// get any bindings and add them onto the query node
List bindings = tableRecord.getBindings();
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RuleAssignOutputElements.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -162,6 +162,14 @@
assignOutputElements(root.getLastChild(), outputElements, metadata, capFinder,
rules, analysisRecord, context);
break;
case NodeConstants.Types.SOURCE: {
+ if (outputElements.isEmpty()) {
+ //we cannot completely filter an implicit grouping (this is a corner case)
+ PlanNode grouping = NodeEditor.findNodePreOrder(root.getFirstChild(),
NodeConstants.Types.GROUP, NodeConstants.Types.SOURCE | NodeConstants.Types.JOIN);
+ if (grouping != null &&
!grouping.hasCollectionProperty(NodeConstants.Info.GROUP_COLS)) {
+ SymbolMap symbolMap = (SymbolMap)
root.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ outputElements.add(symbolMap.getKeys().get(0).clone());
+ }
+ }
outputElements = (List<SingleElementSymbol>)determineSourceOutput(root,
outputElements, metadata, capFinder);
root.setProperty(NodeConstants.Info.OUTPUT_COLS, outputElements);
List<SingleElementSymbol> childElements = filterVirtualElements(root,
outputElements, metadata);
Modified:
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/rules/RulePushAggregates.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -119,7 +119,7 @@
PlanNode setOp = child.getFirstChild();
try {
- pushGroupNodeOverUnion(plan, metadata, capFinder, groupNode, child,
groupingExpressions, setOp, context);
+ pushGroupNodeOverUnion(plan, metadata, capFinder, groupNode, child,
groupingExpressions, setOp, context, analysisRecord);
} catch (QueryResolverException e) {
throw new TeiidComponentException(e);
}
@@ -175,16 +175,35 @@
*/
private void pushGroupNodeOverUnion(PlanNode plan,
QueryMetadataInterface metadata, CapabilitiesFinder capFinder,
- PlanNode groupNode, PlanNode child,
- List<SingleElementSymbol> groupingExpressions, PlanNode setOp, CommandContext
context)
+ PlanNode groupNode, PlanNode unionSourceParent,
+ List<SingleElementSymbol> groupingExpressions, PlanNode setOp, CommandContext
context, AnalysisRecord record)
throws TeiidComponentException, QueryMetadataException,
QueryPlannerException, QueryResolverException {
- if (setOp == null || setOp.getType() != NodeConstants.Types.SET_OP ||
setOp.getProperty(NodeConstants.Info.SET_OPERATION) != Operation.UNION) {
- return; //must not be a union
+ if (setOp == null) {
+ return;
}
+ PlanNode intermediateView = null;
+ if (setOp.getType() != NodeConstants.Types.SET_OP) {
+ if (setOp.getType() != NodeConstants.Types.PROJECT) {
+ return;
+ }
+ intermediateView = unionSourceParent;
+ unionSourceParent = setOp.getFirstChild();
+ if (unionSourceParent == null || unionSourceParent.getType() !=
NodeConstants.Types.SOURCE || unionSourceParent.getFirstChild() == null
+ || unionSourceParent.getFirstChild().getType() != NodeConstants.Types.SET_OP ||
unionSourceParent.getFirstChild().getProperty(NodeConstants.Info.SET_OPERATION) !=
Operation.UNION) {
+ return; //not an eligible union
+ }
+ setOp = unionSourceParent.getFirstChild();
+ if (groupingExpressions == null) {
+ return; //shouldn't happen - the view should have been removed
+ }
+ }
+ if (setOp.getProperty(NodeConstants.Info.SET_OPERATION) != Operation.UNION) {
+ return;
+ }
LinkedHashSet<AggregateSymbol> aggregates = collectAggregates(groupNode);
- Map<ElementSymbol, List<Set<Constant>>> partitionInfo =
(Map<ElementSymbol,
List<Set<Constant>>>)child.getProperty(Info.PARTITION_INFO);
+ Map<ElementSymbol, List<Set<Constant>>> partitionInfo =
(Map<ElementSymbol,
List<Set<Constant>>>)unionSourceParent.getProperty(Info.PARTITION_INFO);
//check to see if any aggregate is dependent upon cardinality
boolean cardinalityDependent =
AggregateSymbol.areAggregatesCardinalityDependent(aggregates);
@@ -192,11 +211,34 @@
LinkedList<PlanNode> unionChildren = new LinkedList<PlanNode>();
findUnionChildren(unionChildren, cardinalityDependent, setOp);
- SymbolMap parentMap = (SymbolMap)child.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ SymbolMap parentMap =
(SymbolMap)unionSourceParent.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ List<ElementSymbol> virtualElements = parentMap.getKeys();
+ GroupSymbol virtualGroup = unionSourceParent.getGroups().iterator().next();
+ List<SingleElementSymbol> actualGroupingExpressions = groupingExpressions;
+ if (intermediateView != null) {
+ actualGroupingExpressions = new
ArrayList<SingleElementSymbol>(groupingExpressions.size());
+ SymbolMap viewMap =
(SymbolMap)intermediateView.getProperty(NodeConstants.Info.SYMBOL_MAP);
+ for (SingleElementSymbol ses : groupingExpressions) {
+ Expression ex = viewMap.getMappedExpression((ElementSymbol)ses);
+ SingleElementSymbol newCol = null;
+ if (ex instanceof SingleElementSymbol) {
+ newCol = (SingleElementSymbol)ex;
+ } else {
+ newCol = new ExpressionSymbol("grouping", ex); //$NON-NLS-1$
+ }
+ actualGroupingExpressions.add(newCol);
+ }
+ }
+
//partitioned union
- if (partitionInfo != null && !Collections.disjoint(partitionInfo.keySet(),
groupingExpressions)) {
- decomposeGroupBy(groupNode, child, groupingExpressions, aggregates, unionChildren,
parentMap, context, metadata, capFinder);
+ if (partitionInfo != null && !Collections.disjoint(partitionInfo.keySet(),
actualGroupingExpressions)) {
+ if (intermediateView != null) {
+ parentMap = pushGroupByView(plan, metadata, capFinder, unionSourceParent,
+ setOp, intermediateView, cardinalityDependent,
+ unionChildren, virtualElements, virtualGroup);
+ }
+ decomposeGroupBy(groupNode, unionSourceParent, groupingExpressions, aggregates,
unionChildren, parentMap, metadata, capFinder, intermediateView != null);
return;
}
@@ -218,15 +260,15 @@
return;
}
- List<ElementSymbol> virtualElements = parentMap.getKeys();
List<SingleElementSymbol> copy = new
ArrayList<SingleElementSymbol>(aggregates);
aggregates.clear();
Map<AggregateSymbol, Expression> aggMap = buildAggregateMap(copy, metadata,
aggregates);
boolean shouldPushdown = false;
List<Boolean> pushdownList = new ArrayList<Boolean>(unionChildren.size());
+
for (PlanNode planNode : unionChildren) {
- boolean pushdown = canPushGroupByToUnionChild(metadata, capFinder,
groupingExpressions, aggregates, planNode);
+ boolean pushdown = canPushGroupByToUnionChild(metadata, capFinder,
actualGroupingExpressions, aggregates, planNode, record);
pushdownList.add(pushdown);
shouldPushdown |= pushdown;
}
@@ -235,17 +277,70 @@
return;
}
+ if (intermediateView != null) {
+ parentMap = pushGroupByView(plan, metadata, capFinder, unionSourceParent,
+ setOp, intermediateView, cardinalityDependent,
+ unionChildren, virtualElements, virtualGroup);
+ virtualElements = parentMap.getKeys();
+ virtualGroup = unionSourceParent.getGroups().iterator().next();
+ }
+
Iterator<Boolean> pushdownIterator = pushdownList.iterator();
for (PlanNode planNode : unionChildren) {
- addView(plan, planNode, pushdownIterator.next(), groupingExpressions, aggregates,
virtualElements, metadata, capFinder);
+ addView(plan, planNode, pushdownIterator.next(), new GroupSymbol("X"),
groupingExpressions, aggregates, virtualElements, metadata, capFinder, null);
//$NON-NLS-1$
}
//update the parent plan with the staged aggregates and the new projected symbols
- List<SingleElementSymbol> projectedViewSymbols =
(List<SingleElementSymbol>)NodeEditor.findNodePreOrder(child,
NodeConstants.Types.PROJECT).getProperty(NodeConstants.Info.PROJECT_COLS);
- List<ElementSymbol> updatedVirturalElement = new
ArrayList<ElementSymbol>(virtualElements);
+ List<SingleElementSymbol> projectedViewSymbols =
(List<SingleElementSymbol>)NodeEditor.findNodePreOrder(unionSourceParent,
NodeConstants.Types.PROJECT).getProperty(NodeConstants.Info.PROJECT_COLS);
//hack to introduce aggregate symbols to the parent view TODO: this should change the
metadata properly.
- GroupSymbol virtualGroup = child.getGroups().iterator().next();
+ SymbolMap newParentMap = modifyUnionSourceParent(unionSourceParent, virtualGroup,
projectedViewSymbols, virtualElements);
+ Map<AggregateSymbol, ElementSymbol> projectedMap = new
HashMap<AggregateSymbol, ElementSymbol>();
+ Iterator<AggregateSymbol> aggIter = aggregates.iterator();
+ for (ElementSymbol projectedViewSymbol :
newParentMap.getKeys().subList(projectedViewSymbols.size() - aggregates.size(),
projectedViewSymbols.size())) {
+ projectedMap.put(aggIter.next(), projectedViewSymbol);
+ }
+ for (Expression expr : aggMap.values()) {
+ ExpressionMappingVisitor.mapExpressions(expr, projectedMap);
+ }
+ mapExpressions(groupNode.getParent(), aggMap, metadata);
+ }
+
+ private SymbolMap pushGroupByView(PlanNode plan,
+ QueryMetadataInterface metadata, CapabilitiesFinder capFinder,
+ PlanNode unionSourceParent, PlanNode setOp,
+ PlanNode intermediateView, boolean cardinalityDependent,
+ LinkedList<PlanNode> unionChildren,
+ List<ElementSymbol> virtualElements, GroupSymbol virtualGroup)
+ throws TeiidComponentException, QueryPlannerException,
+ QueryResolverException {
+ //perform view pushing
+ /*
+ * TODO: this introduces yet another potentially unneeded view, but cannot be removed
by the normal merge virtual logic
+ * due to an intervening access node
+ */
+ PlanNode intermediateProject = intermediateView.getFirstChild();
+ List<SingleElementSymbol> projectedViewSymbols =
(List<SingleElementSymbol>)intermediateProject.getProperty(NodeConstants.Info.PROJECT_COLS);
+ for (PlanNode planNode : unionChildren) {
+ addView(plan, planNode, false, virtualGroup.clone(), null, Collections.EMPTY_SET,
virtualElements, metadata, capFinder, LanguageObject.Util.deepClone(projectedViewSymbols,
SingleElementSymbol.class));
+ }
+ unionChildren.clear();
+ findUnionChildren(unionChildren, cardinalityDependent, setOp);
+ virtualGroup = intermediateView.getGroups().iterator().next();
+ unionSourceParent.getGroups().clear();
+ unionSourceParent.addGroup(virtualGroup);
+ projectedViewSymbols =
(List<SingleElementSymbol>)NodeEditor.findNodePreOrder(unionSourceParent,
NodeConstants.Types.PROJECT).getProperty(NodeConstants.Info.PROJECT_COLS);
+ SymbolMap parentMap = modifyUnionSourceParent(unionSourceParent, virtualGroup,
projectedViewSymbols, Collections.EMPTY_LIST);
+ //remove the old view
+ NodeEditor.removeChildNode(intermediateView, intermediateProject);
+ NodeEditor.removeChildNode(intermediateView.getParent(), intermediateView);
+ return parentMap;
+ }
+
+ private SymbolMap modifyUnionSourceParent(PlanNode unionSourceParent,
+ GroupSymbol virtualGroup,
+ List<SingleElementSymbol> projectedViewSymbols, List<ElementSymbol>
baseVirtualElements) {
+ List<ElementSymbol> updatedVirturalElement = new
ArrayList<ElementSymbol>(baseVirtualElements);
for (int i = updatedVirturalElement.size(); i < projectedViewSymbols.size(); i++) {
SingleElementSymbol symbol = projectedViewSymbols.get(i);
String name = symbol.getShortName();
@@ -257,22 +352,15 @@
updatedVirturalElement.add(virtualElement);
}
SymbolMap newParentMap = SymbolMap.createSymbolMap(updatedVirturalElement,
projectedViewSymbols);
- child.setProperty(NodeConstants.Info.SYMBOL_MAP, newParentMap);
- Map<AggregateSymbol, ElementSymbol> projectedMap = new
HashMap<AggregateSymbol, ElementSymbol>();
- Iterator<AggregateSymbol> aggIter = aggregates.iterator();
- for (ElementSymbol projectedViewSymbol :
newParentMap.getKeys().subList(projectedViewSymbols.size() - aggregates.size(),
projectedViewSymbols.size())) {
- projectedMap.put(aggIter.next(), projectedViewSymbol);
- }
- for (Expression expr : aggMap.values()) {
- ExpressionMappingVisitor.mapExpressions(expr, projectedMap);
- }
- mapExpressions(groupNode.getParent(), aggMap, metadata);
+ unionSourceParent.setProperty(NodeConstants.Info.SYMBOL_MAP, newParentMap);
+ return newParentMap;
}
private void decomposeGroupBy(PlanNode groupNode, PlanNode sourceNode,
List<SingleElementSymbol> groupingExpressions,
LinkedHashSet<AggregateSymbol> aggregates,
- LinkedList<PlanNode> unionChildren, SymbolMap parentMap, CommandContext context,
QueryMetadataInterface metadata, CapabilitiesFinder capFinder) throws
QueryPlannerException, QueryMetadataException, TeiidComponentException {
+ LinkedList<PlanNode> unionChildren, SymbolMap parentMap, QueryMetadataInterface
metadata,
+ CapabilitiesFinder capFinder, boolean hadIntermediateView) throws
QueryPlannerException, QueryMetadataException, TeiidComponentException {
// remove the group node
groupNode.getParent().replaceChild(groupNode, groupNode.getFirstChild());
GroupSymbol group = sourceNode.getGroups().iterator().next().clone();
@@ -302,6 +390,10 @@
groupClone.addAsParent(projectPlanNode);
+ if (hadIntermediateView) {
+ //drill down to the possible access node
+ planNode = planNode.getFirstChild().getFirstChild();
+ }
if (planNode.getType() == NodeConstants.Types.ACCESS) {
//TODO: temporarily remove the access node so that the inline view could be
removed if possible
while (RuleRaiseAccess.raiseAccessNode(planNode, planNode, metadata, capFinder,
true, null) != null) {
@@ -319,7 +411,7 @@
private boolean canPushGroupByToUnionChild(QueryMetadataInterface metadata,
CapabilitiesFinder capFinder,
List<SingleElementSymbol> groupingExpressions,
- LinkedHashSet<AggregateSymbol> aggregates, PlanNode planNode)
+ LinkedHashSet<AggregateSymbol> aggregates, PlanNode planNode, AnalysisRecord
record)
throws QueryMetadataException, TeiidComponentException {
if (planNode.getType() != NodeConstants.Types.ACCESS) {
return false;
@@ -334,8 +426,16 @@
return false;
}
}
- if ((groupingExpressions == null || groupingExpressions.isEmpty()) &&
!CapabilitiesUtil.supports(Capability.QUERY_AGGREGATES_COUNT_STAR, modelId, metadata,
capFinder)) {
- return false;
+ if ((groupingExpressions == null || groupingExpressions.isEmpty())) {
+ if (!CapabilitiesUtil.supports(Capability.QUERY_AGGREGATES_COUNT_STAR, modelId,
metadata, capFinder)) {
+ return false;
+ }
+ } else {
+ for (SingleElementSymbol ses : groupingExpressions) {
+ if(! CriteriaCapabilityValidatorVisitor.canPushLanguageObject(ses, modelId, metadata,
capFinder, record)) {
+ return false;
+ }
+ }
}
//TODO: check to see if we are distinct
return true;
@@ -366,11 +466,14 @@
return null;
}
- public void addView(PlanNode root, PlanNode unionSource, boolean pushdown,
List<SingleElementSymbol> groupingExpressions,
+ public void addView(PlanNode root, PlanNode unionSource, boolean pushdown, GroupSymbol
group, List<SingleElementSymbol> groupingExpressions,
Set<AggregateSymbol> aggregates, List<ElementSymbol> virtualElements,
- QueryMetadataInterface metadata, CapabilitiesFinder capFinder)
+ QueryMetadataInterface metadata, CapabilitiesFinder capFinder,
List<SingleElementSymbol> actualProject)
throws TeiidComponentException, QueryPlannerException, QueryResolverException {
- PlanNode originalNode = unionSource;
+ PlanNode accessNode = null;
+ if (pushdown) {
+ accessNode = NodeEditor.findNodePreOrder(unionSource, NodeConstants.Types.ACCESS);
+ }
//branches other than the first need to have their projected column names updated
PlanNode sortNode = NodeEditor.findNodePreOrder(unionSource, NodeConstants.Types.SORT,
NodeConstants.Types.SOURCE);
List<SingleElementSymbol> sortOrder = null;
@@ -394,8 +497,6 @@
updateSymbolName(projectCols, i, virtualElem, projectedSymbol);
}
}
- GroupSymbol group = new GroupSymbol("X"); //$NON-NLS-1$
-
PlanNode intermediateView = createView(group, virtualElements, unionSource, metadata);
SymbolMap symbolMap = (SymbolMap)intermediateView.getProperty(Info.SYMBOL_MAP);
unionSource = intermediateView;
@@ -445,25 +546,26 @@
unionSource = projectPlanNode;
//create proper names for the aggregate symbols
- Select select = new Select(projectedViewSymbols);
+ Select select = null;
+ if (actualProject == null) {
+ select = new Select(projectedViewSymbols);
+ } else {
+ select = new Select(actualProject);
+ }
QueryRewriter.makeSelectUnique(select, false);
projectedViewSymbols = select.getProjectedSymbols();
projectPlanNode.setProperty(NodeConstants.Info.PROJECT_COLS,
projectedViewSymbols);
projectPlanNode.addGroup(group);
if (pushdown) {
- while (RuleRaiseAccess.raiseAccessNode(root, originalNode, metadata, capFinder,
true, null) != null) {
+ while (RuleRaiseAccess.raiseAccessNode(root, accessNode, metadata, capFinder,
true, null) != null) {
//continue to raise
}
}
}
static PlanNode createView(GroupSymbol group, List<? extends SingleElementSymbol>
virtualElements, PlanNode child, QueryMetadataInterface metadata) throws
TeiidComponentException {
- PlanNode intermediateView = NodeFactory.getNewNode(NodeConstants.Types.SOURCE);
SymbolMap symbolMap = createSymbolMap(group, virtualElements, child, metadata);
- intermediateView.setProperty(NodeConstants.Info.SYMBOL_MAP, symbolMap);
- child.addAsParent(intermediateView);
- intermediateView.addGroup(group);
- return intermediateView;
+ return RuleDecomposeJoin.createSource(group, child, symbolMap);
}
private static SymbolMap createSymbolMap(GroupSymbol group,
Modified: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -34,6 +34,7 @@
import org.teiid.core.TeiidProcessingException;
import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.util.Assertion;
+import org.teiid.jdbc.SQLStates;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
@@ -130,7 +131,7 @@
while(currentTime < context.getTimeSliceEnd() || context.isNonBlocking()) {
if (requestCanceled) {
- throw new
TeiidProcessingException(QueryPlugin.Util.getString("QueryProcessor.request_cancelled",
getProcessID())); //$NON-NLS-1$
+ throw new TeiidProcessingException(SQLStates.QUERY_CANCELED,
QueryPlugin.Util.getString("QueryProcessor.request_cancelled", getProcessID()));
//$NON-NLS-1$
}
if (currentTime > context.getTimeoutEnd()) {
throw new TeiidProcessingException("Query timed out");
//$NON-NLS-1$
Property changes on:
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java:3220-3275
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -45,6 +45,7 @@
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.rewriter.QueryRewriter;
import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.OrderByItem;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.symbol.Constant;
@@ -204,6 +205,14 @@
}
if (!shouldProject) {
this.projection = new Object[0];
+ } else if (query.getOrderBy() != null) {
+ for (OrderByItem item : query.getOrderBy().getOrderByItems()) {
+ Integer index = uniqueSymbols.get(SymbolMap.getExpression(item.getSymbol()));
+ if (index != null) {
+ item.setExpressionPosition(index);
+ item.setSymbol((SingleElementSymbol) select.getSymbols().get(index));
+ }
+ }
}
}
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -218,7 +218,7 @@
OrderByItem item = iterator.next();
orderIndecies[iterator.previousIndex()] =
collectExpression(item.getSymbol());
element = new
ElementSymbol(String.valueOf(iterator.previousIndex()));
- element.setType(inputType);
+ element.setType(item.getSymbol().getType());
schema.add(element);
OrderByItem newItem = item.clone();
newItem.setSymbol(element);
@@ -286,7 +286,7 @@
@Override
protected List updateTuple(List tuple) throws ExpressionEvaluationException,
BlockedException, TeiidComponentException {
int columns = collectedExpressions.size();
- List exprTuple = new ArrayList(columns);
+ List<Object> exprTuple = new ArrayList<Object>(columns);
for(int col = 0; col<columns; col++) {
// The following call may throw BlockedException, but all state to this
point
// is saved in class variables so we can start over on building this
tuple
@@ -335,7 +335,7 @@
} else if(! sameGroup(currentGroupTuple, lastRow)) {
// Close old group
- List row = new ArrayList(functions.length);
+ List<Object> row = new ArrayList<Object>(functions.length);
for(int i=0; i<functions.length; i++) {
row.add( functions[i].getResult() );
functions[i].reset();
Modified:
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -29,6 +29,7 @@
import java.util.Map;
import net.sf.saxon.om.Item;
+import net.sf.saxon.om.NodeInfo;
import net.sf.saxon.om.SequenceIterator;
import net.sf.saxon.sxpath.XPathDynamicContext;
import net.sf.saxon.sxpath.XPathExpression;
@@ -42,8 +43,12 @@
import org.teiid.api.exception.query.ExpressionEvaluationException;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.TupleBatch;
+import org.teiid.common.buffer.TupleBuffer;
+import org.teiid.common.buffer.BufferManager.TupleSourceType;
import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidException;
import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.TeiidRuntimeException;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.XMLType;
import org.teiid.query.QueryPlugin;
@@ -51,11 +56,15 @@
import org.teiid.query.sql.lang.XMLTable;
import org.teiid.query.sql.lang.XMLTable.XMLColumn;
import org.teiid.query.xquery.saxon.SaxonXQueryExpression.Result;
+import org.teiid.query.xquery.saxon.SaxonXQueryExpression.RowProcessor;
/**
* Handles xml table processing.
+ *
+ * When streaming the results will be fully built and stored in a buffer
+ * before being returned
*/
-public class XMLTableNode extends SubqueryAwareRelationalNode {
+public class XMLTableNode extends SubqueryAwareRelationalNode implements RowProcessor {
private static Map<Class<?>, BuiltInAtomicType> typeMapping = new
HashMap<Class<?>, BuiltInAtomicType>();
@@ -74,6 +83,10 @@
private int rowCount = 0;
private Item item;
+ private TupleBuffer buffer;
+ private int outputRow = 1;
+ private boolean usingOutput;
+
public XMLTableNode(int nodeID) {
super(nodeID);
}
@@ -81,6 +94,10 @@
@Override
public void closeDirect() {
super.closeDirect();
+ if(this.buffer != null) {
+ this.buffer.remove();
+ this.buffer = null;
+ }
reset();
}
@@ -93,6 +110,9 @@
}
item = null;
rowCount = 0;
+ outputRow = 1;
+ usingOutput = false;
+ this.buffer = null;
}
public void setTable(XMLTable table) {
@@ -116,31 +136,62 @@
protected TupleBatch nextBatchDirect() throws BlockedException,
TeiidComponentException, TeiidProcessingException {
- if (result == null) {
- setReferenceValues(this.table);
- result =
getEvaluator(Collections.emptyMap()).evaluateXQuery(this.table.getXQueryExpression(),
this.table.getPassing(), null);
+ evaluate();
+
+ if (this.table.getXQueryExpression().isStreaming()) {
+ TupleBatch batch = this.buffer.getBatch(outputRow);
+ outputRow = batch.getEndRow() + 1;
+ return batch;
}
while (!isBatchFull() && !isLastBatch()) {
- processRow();
+ if (item == null) {
+ try {
+ item = result.iter.next();
+ } catch (XPathException e) {
+ throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("XMLTableNode.error", e.getMessage()));
//$NON-NLS-1$
+ }
+ rowCount++;
+ if (item == null) {
+ terminateBatches();
+ break;
+ }
+ }
+ addBatchRow(processRow());
}
return pullBatch();
}
- private void processRow() throws ExpressionEvaluationException, BlockedException,
- TeiidComponentException, TeiidProcessingException {
- if (item == null) {
+ private void evaluate() throws TeiidComponentException,
+ ExpressionEvaluationException, BlockedException,
+ TeiidProcessingException {
+ if (result == null) {
+ if (this.buffer == null && this.table.getXQueryExpression().isStreaming()) {
+ this.buffer = this.getBufferManager().createTupleBuffer(getOutputElements(),
getConnectionID(), TupleSourceType.PROCESSOR);
+ }
+ setReferenceValues(this.table);
try {
- item = result.iter.next();
- } catch (XPathException e) {
- throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("XMLTableNode.error", e.getMessage()));
//$NON-NLS-1$
+ result =
getEvaluator(Collections.emptyMap()).evaluateXQuery(this.table.getXQueryExpression(),
this.table.getPassing(), null, this);
+ if (this.buffer != null) {
+ this.buffer.close();
+ if (!usingOutput) {
+ this.buffer.setForwardOnly(true);
+ }
+ }
+ } catch (TeiidRuntimeException e) {
+ if (e.getCause() instanceof TeiidComponentException) {
+ throw (TeiidComponentException)e.getCause();
+ }
+ if (e.getCause() instanceof TeiidProcessingException) {
+ throw (TeiidProcessingException)e.getCause();
+ }
+ throw e;
}
- rowCount++;
- if (item == null) {
- terminateBatches();
- return;
- }
}
+ }
+
+ private List<?> processRow() throws ExpressionEvaluationException,
BlockedException,
+ TeiidComponentException, TeiidProcessingException {
List<Object> tuple = new ArrayList<Object>(projectedColumns.size());
for (XMLColumn proColumn : projectedColumns) {
if (proColumn.isOrdinal()) {
@@ -167,8 +218,10 @@
if (pathIter.next() != null) {
throw new
TeiidProcessingException(QueryPlugin.Util.getString("XMLTableName.multi_value",
proColumn.getName())); //$NON-NLS-1$
}
- Object value = Value.convertToJava(colItem);
- if (value instanceof Item) {
+ Object value = colItem;
+ if (value instanceof AtomicValue) {
+ value = Value.convertToJava(colItem);
+ } else if (value instanceof Item) {
Item i = (Item)value;
BuiltInAtomicType bat = typeMapping.get(proColumn.getSymbol().getType());
if (bat != null) {
@@ -190,7 +243,37 @@
}
}
item = null;
- addBatchRow(tuple);
+ return tuple;
}
+
+ @Override
+ public boolean hasFinalBuffer() {
+ return this.table.getXQueryExpression().isStreaming();
+ }
+
+ @Override
+ public TupleBuffer getFinalBuffer() throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ evaluate();
+ usingOutput = true;
+ TupleBuffer finalBuffer = this.buffer;
+ this.buffer = null;
+ close();
+ return finalBuffer;
+ }
+
+ @Override
+ public void processRow(NodeInfo row) {
+ this.item = row;
+ rowCount++;
+ if (rowCount % 100 == 0) {
+ System.out.println(System.currentTimeMillis() + " " + rowCount);
+ }
+ try {
+ this.buffer.addTuple(processRow());
+ } catch (TeiidException e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/resolver/command/UpdateProcedureResolver.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -194,7 +194,7 @@
switch (param.getParameterType()) {
case ParameterInfo.OUT:
case ParameterInfo.RETURN_VALUE:
- if (!isAssignable(metadata, param)) {
+ if (param.getExpression() != null &&
!isAssignable(metadata, param)) {
throw new
QueryResolverException(QueryPlugin.Util.getString("UpdateProcedureResolver.only_variables",
param.getExpression())); //$NON-NLS-1$
}
sp.setCallableStatement(true);
Modified: trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/rewriter/QueryRewriter.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -2357,16 +2357,6 @@
expression.setAggregateFunction(Type.MAX);
}
}
- if ((expression.getAggregateFunction() == Type.MAX ||
expression.getAggregateFunction() == Type.MIN)
- && EvaluatableVisitor.willBecomeConstant(expression.getExpression())) {
- try {
- return new ExpressionSymbol(expression.getName(), ResolverUtil
- .convertExpression(expression.getExpression(),DataTypeManager.getDataTypeName(expression.getType()),
metadata));
- } catch (QueryResolverException e) {
- //should not happen, so throw as a runtime
- throw new TeiidRuntimeException(e);
- }
- }
return expression;
}
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -315,7 +315,7 @@
String matTableName = metadata.getFullName(matTableId);
LogManager.logDetail(LogConstants.CTX_MATVIEWS, "processing refreshmatview
for", matViewName); //$NON-NLS-1$
MatTableInfo info = globalStore.getMatTableInfo(matTableName);
- boolean invalidate =
Boolean.TRUE.equals(((Constant)proc.getParameter(1).getExpression()).getValue());
+ boolean invalidate =
Boolean.TRUE.equals(((Constant)proc.getParameter(2).getExpression()).getValue());
if (invalidate) {
touchTable(context, matTableName, false);
}
@@ -325,7 +325,7 @@
}
GroupSymbol matTable = new GroupSymbol(matTableName);
matTable.setMetadataID(matTableId);
- int rowCount = loadGlobalTable(context, matTable, matTableName, globalStore, info,
null);
+ int rowCount = loadGlobalTable(context, matTable, matTableName, globalStore, info,
null, false);
return CollectionTupleSource.createUpdateCountTupleSource(rowCount);
} else if (StringUtil.endsWithIgnoreCase(proc.getProcedureCallableName(),
REFRESHMATVIEWROW)) {
Object groupID = validateMatView(metadata, proc);
@@ -415,11 +415,13 @@
key.vdb = new VDBKey(context.getVdbName(), context.getVdbVersion());
MatTableEntry entry = this.tables.get(key);
- boolean firstload = !info.isValid();
+ boolean notValid = !info.isValid();
if (entry != null && entry.lastUpdate > info.getUpdateTime()
- && info.getState() != MatState.LOADING) {
- //remote load
- info.setState(MatState.NEEDS_LOADING, firstload?false:entry.valid, null);
+ && info.getState() != MatState.LOADING
+ //TODO: use extension metadata or a config parameter to make this skew
configurable
+ && !(!notValid && entry.valid && info.getState() ==
MatState.LOADED && entry.lastUpdate < info.getUpdateTime() + 30000)) {
+ //trigger a remote load due to the cache being more up to date than the local copy
+ info.setState(MatState.NEEDS_LOADING, notValid?false:entry.valid, null);
loadTime = entry.lastUpdate;
}
}
@@ -427,7 +429,7 @@
if (load) {
if (!info.isValid()) {
//blocking load
- loadGlobalTable(context, group, tableName, globalStore, info, loadTime);
+ loadGlobalTable(context, group, tableName, globalStore, info, loadTime, true);
} else {
loadAsynch(context, group, tableName, globalStore, info, loadTime);
}
@@ -468,7 +470,7 @@
Callable<Integer> toCall = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
- return loadGlobalTable(context, group, tableName, globalStore, info, loadTime);
+ return loadGlobalTable(context, group, tableName, globalStore, info, loadTime,
true);
}
};
FutureTask<Integer> task = new FutureTask<Integer>(toCall);
@@ -477,7 +479,7 @@
private int loadGlobalTable(CommandContext context,
GroupSymbol group, final String tableName,
- TempTableStore globalStore, MatTableInfo info, Long loadTime)
+ TempTableStore globalStore, MatTableInfo info, Long loadTime, boolean useCache)
throws TeiidComponentException, TeiidProcessingException {
LogManager.logInfo(LogConstants.CTX_MATVIEWS,
QueryPlugin.Util.getString("TempTableDataManager.loading", tableName));
//$NON-NLS-1$
QueryMetadataInterface metadata = context.getMetadata();
@@ -511,9 +513,11 @@
if (distributedCache != null) {
cid = new CacheID(new ParseInfo(), fullName, context.getVdbName(),
context.getVdbVersion(), context.getConnectionID(), context.getUserName());
- CachedResults cr = this.distributedCache.get(cid);
- if (cr != null) {
- ts = cr.getResults().createIndexedTupleSource();
+ if (useCache) {
+ CachedResults cr = this.distributedCache.get(cid);
+ if (cr != null) {
+ ts = cr.getResults().createIndexedTupleSource();
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -26,6 +26,7 @@
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
+import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
@@ -33,11 +34,14 @@
import javax.security.auth.Subject;
+import org.teiid.adminapi.DataPolicy;
import org.teiid.adminapi.Session;
+import org.teiid.adminapi.VDB;
import org.teiid.api.exception.query.QueryProcessingException;
import org.teiid.common.buffer.BufferManager;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.util.ArgCheck;
+import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.internal.process.PreparedPlan;
import org.teiid.dqp.internal.process.SessionAwareCache;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
@@ -120,9 +124,11 @@
private Subject subject;
private HashSet<Object> dataObjects;
- public Session session;
+ private Session session;
- public RequestID requestId;
+ private RequestID requestId;
+
+ private DQPWorkContext dqpWorkContext;
}
private GlobalState globalState = new GlobalState();
@@ -591,4 +597,22 @@
this.globalState.requestId = requestId;
}
+ public void setDQPWorkContext(DQPWorkContext workContext) {
+ this.globalState.dqpWorkContext = workContext;
+ }
+
+ @Override
+ public Map<String, DataPolicy> getAllowedDataPolicies() {
+ return this.globalState.dqpWorkContext.getAllowedDataPolicies();
+ }
+
+ @Override
+ public VDB getVdb() {
+ return this.globalState.dqpWorkContext.getVDB();
+ }
+
+ public DQPWorkContext getDQPWorkContext() {
+ return this.globalState.dqpWorkContext;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidationVisitor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -789,8 +789,8 @@
}
protected void validateInsert(Insert obj) {
- Collection vars = obj.getVariables();
- Iterator varIter = vars.iterator();
+ Collection<ElementSymbol> vars = obj.getVariables();
+ Iterator<ElementSymbol> varIter = vars.iterator();
Collection values = obj.getValues();
Iterator valIter = values.iterator();
GroupSymbol insertGroup = obj.getGroup();
@@ -798,9 +798,7 @@
try {
// Validate that all elements in variable list are updatable
- Iterator elementIter = vars.iterator();
- while(elementIter.hasNext()) {
- ElementSymbol insertElem = (ElementSymbol) elementIter.next();
+ for (ElementSymbol insertElem : vars) {
if(! getMetadata().elementSupports(insertElem.getMetadataID(),
SupportConstants.Element.UPDATE)) {
handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0052",
insertElem), insertElem); //$NON-NLS-1$
}
@@ -825,7 +823,7 @@
// if any of the value present in the insert are null
while(valIter.hasNext() && varIter.hasNext()) {
Expression nextValue = (Expression) valIter.next();
- ElementSymbol nextVar = (ElementSymbol) varIter.next();
+ ElementSymbol nextVar = varIter.next();
if (!(nextValue instanceof Constant) &&
getMetadata().isMultiSourceElement(nextVar.getMetadataID())) {
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.multisource_constant",
nextVar), nextVar); //$NON-NLS-1$
Copied: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocumentWrapper.java (from
rev 3275,
branches/7.4.x/engine/src/main/java/org/teiid/query/xquery/saxon/DocumentWrapper.java)
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocumentWrapper.java
(rev 0)
+++
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/DocumentWrapper.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,268 @@
+package org.teiid.query.xquery.saxon;
+
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import net.sf.saxon.Configuration;
+import net.sf.saxon.om.DocumentInfo;
+import net.sf.saxon.om.NamePool;
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.type.Type;
+import nu.xom.Attribute;
+import nu.xom.Document;
+import nu.xom.Element;
+import nu.xom.Node;
+
+/**
+ * The root node of an XPath tree. (Or equivalently, the tree itself).
+ * <P>
+ * This class is used not only for a document, but also for the root
+ * of a document-less tree fragment.
+ *
+ * @author Michael H. Kay
+ * @author Wolfgang Hoschek (ported net.sf.saxon.jdom to XOM)
+ * @author Steve Hawkins (Ported to Saxon 9.1 for Teiid)
+ */
+
+public class DocumentWrapper extends NodeWrapper implements DocumentInfo {
+
+ protected Configuration config;
+
+ protected String baseURI;
+
+ protected int documentNumber;
+
+ private HashMap idIndex;
+
+ /**
+ * Create a Saxon wrapper for a XOM root node
+ *
+ * @param root
+ * The XOM root node
+ * @param baseURI
+ * The base URI for all the nodes in the tree
+ * @param config
+ * The configuration which defines the name pool used for all
+ * names in this tree
+ */
+ public DocumentWrapper(Node root, String baseURI, Configuration config) {
+ super(root, null, 0);
+ if (root.getParent() != null)
+ throw new IllegalArgumentException("root node must not have a parent
node");
+ this.baseURI = baseURI;
+ this.docWrapper = this;
+ setConfiguration(config);
+ }
+
+ /**
+ * Wrap a node in the XOM document.
+ *
+ * @param node
+ * The node to be wrapped. This must be a node in the same
+ * document (the system does not check for this).
+ * @return the wrapping NodeInfo object
+ */
+
+ public NodeInfo wrap(Node node) {
+ if (node == this.node) {
+ return this;
+ }
+ return makeWrapper(node, this);
+ }
+
+ /**
+ * Set the configuration, which defines the name pool used for all names in
+ * this document. This is always called after a new document has been
+ * created. The implementation must register the name pool with the
+ * document, so that it can be retrieved using getNamePool(). It must also
+ * call NamePool.allocateDocumentNumber(), and return the relevant document
+ * number when getDocumentNumber() is subsequently called.
+ *
+ * @param config
+ * The configuration to be used
+ */
+
+ public void setConfiguration(Configuration config) {
+ this.config = config;
+ this.documentNumber = allocateDocumentNumber(config);
+ }
+
+ /**
+ * Get the configuration previously set using setConfiguration
+ */
+
+ public Configuration getConfiguration() {
+ return config;
+ }
+
+ /**
+ * Get the name pool used for the names in this document
+ *
+ * @return the name pool in which all the names used in this document are
+ * registered
+ */
+
+ public NamePool getNamePool() {
+ return config.getNamePool();
+ }
+
+ /**
+ * Get the unique document number for this document (the number is unique
+ * for all documents within a NamePool)
+ *
+ * @return the unique number identifying this document within the name pool
+ */
+
+ public int getDocumentNumber() {
+ return documentNumber;
+ }
+
+ /**
+ * Get the element with a given ID, if any
+ *
+ * @param id
+ * the required ID value
+ * @return the element with the given ID, or null if there is no such ID
+ * present (or if the parser has not notified attributes as being of
+ * type ID).
+ */
+
+ public NodeInfo selectID(String id) {
+ if (idIndex == null) {
+ Element elem;
+ switch (nodeKind) {
+ case Type.DOCUMENT :
+ elem = ((Document) node).getRootElement();
+ break;
+ case Type.ELEMENT :
+ elem = (Element) node;
+ break;
+ default:
+ return null;
+ }
+ idIndex = new HashMap(50);
+ buildIDIndex(elem);
+ }
+ return (NodeInfo) idIndex.get(id);
+ }
+
+
+ private void buildIDIndex(Element elem) {
+ // walk the tree in reverse document order, to satisfy the XPath 1.0 rule
+ // that says if an ID appears twice, the first one wins
+ for (int i=elem.getChildCount(); --i >= 0 ; ) {
+ Node child = elem.getChild(i);
+ if (child instanceof Element) {
+ buildIDIndex((Element)child);
+ }
+ }
+ for (int i=elem.getAttributeCount(); --i >= 0 ; ) {
+ Attribute att = elem.getAttribute(i);
+ if (att.getType() == Attribute.Type.ID) {
+ idIndex.put(att.getValue(), wrap(elem));
+ }
+ }
+ }
+
+ /**
+ * Get the unparsed entity with a given name
+ *
+ * @param name
+ * the name of the entity
+ * @return null: XOM does not provide access to unparsed entities
+ * @return if the entity exists, return an array of two Strings, the first
+ * holding the system ID of the entity, the second holding the
+ * public ID if there is one, or null if not. If the entity does not
+ * exist, return null.
+ */
+
+ public String[] getUnparsedEntity(String name) {
+ return null;
+ }
+
+ private static final Method saxon85Method = findAllocateDocumentNumberMethod85();
+
+ // work-around for incompatibility introduced in saxon-8.5.1
+ private int allocateDocumentNumber(Configuration config) {
+ if (saxon85Method == null) {
+ try { // saxon >= 8.5.1
+ return allocateDocumentNumber851(config);
+ } catch (Throwable t) {
+ throw new RuntimeException(t);
+ }
+ }
+
+ // saxon < 8.5.1
+ try {
+ // return config.getNamePool().allocateDocumentNumber(this);
+ Object result = saxon85Method.invoke(config.getNamePool(), new Object[] {this});
+ return ((Integer) result).intValue();
+ } catch (Throwable t) {
+ throw new RuntimeException(t);
+ }
+
+ }
+
+ // saxon >= 8.5.1
+ private int allocateDocumentNumber851(Configuration config) {
+ return config.getDocumentNumberAllocator().allocateDocumentNumber();
+ }
+
+ private static Method findAllocateDocumentNumberMethod85() {
+ try {
+ return NamePool.class.getMethod("allocateDocumentNumber", new Class[]
{NodeInfo.class});
+ } catch (Throwable t) {
+ return null;
+ }
+ }
+
+ @Override
+ public Iterator getUnparsedEntityNames() {
+ return Collections.EMPTY_LIST.iterator();
+ }
+
+ @Override
+ public int getColumnNumber() {
+ return -1;
+ }
+
+ @Override
+ public boolean isId() {
+ return false;
+ }
+
+ @Override
+ public boolean isIdref() {
+ return false;
+ }
+
+ @Override
+ public boolean isNilled() {
+ return false;
+ }
+
+}
+
+//
+// The contents of this file are subject to the Mozilla Public License Version
+// 1.0 (the "License");
+// you may not use this file except in compliance with the License. You may
+// obtain a copy of the
+// License at
http://www.mozilla.org/MPL/
+//
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied.
+// See the License for the specific language governing rights and limitations
+// under the License.
+//
+// The Original Code is: all this file.
+//
+// The Initial Developer of the Original Code is Michael Kay
+//
+// Portions created by (your name) are Copyright (C) (your legal entity). All
+// Rights Reserved.
+//
+// Contributor(s): none.
+//
Copied: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/NodeWrapper.java (from rev
3275, branches/7.4.x/engine/src/main/java/org/teiid/query/xquery/saxon/NodeWrapper.java)
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/NodeWrapper.java
(rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/NodeWrapper.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,1387 @@
+package org.teiid.query.xquery.saxon;
+
+import net.sf.saxon.Configuration;
+import net.sf.saxon.event.Receiver;
+import net.sf.saxon.om.Axis;
+import net.sf.saxon.om.AxisIterator;
+import net.sf.saxon.om.AxisIteratorImpl;
+import net.sf.saxon.om.DocumentInfo;
+import net.sf.saxon.om.EmptyIterator;
+import net.sf.saxon.om.FastStringBuffer;
+import net.sf.saxon.om.Item;
+import net.sf.saxon.om.NamePool;
+import net.sf.saxon.om.NamespaceIterator;
+import net.sf.saxon.om.Navigator;
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.om.SequenceIterator;
+import net.sf.saxon.om.SiblingCountingNode;
+import net.sf.saxon.om.SingleNodeIterator;
+import net.sf.saxon.om.SingletonIterator;
+import net.sf.saxon.om.StandardNames;
+import net.sf.saxon.om.VirtualNode;
+import net.sf.saxon.pattern.AnyNodeTest;
+import net.sf.saxon.pattern.NameTest;
+import net.sf.saxon.pattern.NodeKindTest;
+import net.sf.saxon.pattern.NodeTest;
+import net.sf.saxon.trans.XPathException;
+import net.sf.saxon.type.Type;
+import net.sf.saxon.value.AtomicValue;
+import net.sf.saxon.value.StringValue;
+import net.sf.saxon.value.UntypedAtomicValue;
+import net.sf.saxon.value.Value;
+import nu.xom.Attribute;
+import nu.xom.Comment;
+import nu.xom.DocType;
+import nu.xom.Document;
+import nu.xom.Element;
+import nu.xom.Node;
+import nu.xom.ParentNode;
+import nu.xom.ProcessingInstruction;
+import nu.xom.Text;
+
+/**
+ * A node in the XML parse tree representing an XML element, character content,
+ * or attribute.
+ * <P>
+ * This is the implementation of the NodeInfo interface used as a wrapper for
+ * XOM nodes.
+ *
+ * @author Michael H. Kay
+ * @author Wolfgang Hoschek (ported net.sf.saxon.jdom to XOM)
+ * @author Steve Hawkins (Ported to Saxon 9.1 for Teiid and fixed a bug with the buffer
usage in getDeclaredNamespaces)
+ */
+
+public class NodeWrapper implements NodeInfo, VirtualNode, SiblingCountingNode {
+
+ protected Node node;
+
+ protected short nodeKind;
+
+ private NodeWrapper parent; // null means unknown
+
+ protected DocumentWrapper docWrapper;
+
+ protected int index; // -1 means unknown
+
+ /**
+ * This constructor is protected: nodes should be created using the wrap
+ * factory method on the DocumentWrapper class
+ *
+ * @param node
+ * The XOM node to be wrapped
+ * @param parent
+ * The NodeWrapper that wraps the parent of this node
+ * @param index
+ * Position of this node among its siblings
+ */
+ protected NodeWrapper(Node node, NodeWrapper parent, int index) {
+ short kind;
+ if (node instanceof Element) {
+ kind = Type.ELEMENT;
+ } else if (node instanceof Text) {
+ kind = Type.TEXT;
+ } else if (node instanceof Attribute) {
+ kind = Type.ATTRIBUTE;
+ } else if (node instanceof Comment) {
+ kind = Type.COMMENT;
+ } else if (node instanceof ProcessingInstruction) {
+ kind = Type.PROCESSING_INSTRUCTION;
+ } else if (node instanceof Document) {
+ kind = Type.DOCUMENT;
+ } else {
+ throwIllegalNode(node); // moved out of fast path to enable better inlining
+ return; // keep compiler happy
+ }
+ this.nodeKind = kind;
+ this.node = node;
+ this.parent = parent;
+ this.index = index;
+ }
+
+ /**
+ * Factory method to wrap a XOM node with a wrapper that implements the
+ * Saxon NodeInfo interface.
+ *
+ * @param node
+ * The XOM node
+ * @param docWrapper
+ * The wrapper for the Document containing this node
+ * @return The new wrapper for the supplied node
+ */
+ protected final NodeWrapper makeWrapper(Node node, DocumentWrapper docWrapper) {
+ return makeWrapper(node, docWrapper, null, -1);
+ }
+
+ /**
+ * Factory method to wrap a XOM node with a wrapper that implements the
+ * Saxon NodeInfo interface.
+ *
+ * @param node
+ * The XOM node
+ * @param docWrapper
+ * The wrapper for the Document containing this node
+ * @param parent
+ * The wrapper for the parent of the XOM node
+ * @param index
+ * The position of this node relative to its siblings
+ * @return The new wrapper for the supplied node
+ */
+
+ protected final NodeWrapper makeWrapper(Node node, DocumentWrapper docWrapper,
+ NodeWrapper parent, int index) {
+
+ if (node == docWrapper.node) return docWrapper;
+ NodeWrapper wrapper = new NodeWrapper(node, parent, index);
+ wrapper.docWrapper = docWrapper;
+ return wrapper;
+ }
+
+ private static void throwIllegalNode(Node node) {
+ String str = node == null ?
+ "NULL" :
+ node.getClass() + " instance " + node.toString();
+ throw new IllegalArgumentException("Bad node type in XOM! " + str);
+ }
+
+ /**
+ * Get the configuration
+ */
+
+ public Configuration getConfiguration() {
+ return docWrapper.getConfiguration();
+ }
+
+ /**
+ * Get the underlying XOM node, to implement the VirtualNode interface
+ */
+
+ public Object getUnderlyingNode() {
+ return node;
+ }
+
+ /**
+ * Get the name pool for this node
+ *
+ * @return the NamePool
+ */
+
+ public NamePool getNamePool() {
+ return docWrapper.getNamePool();
+ }
+
+ /**
+ * Return the type of node.
+ *
+ * @return one of the values Node.ELEMENT, Node.TEXT, Node.ATTRIBUTE, etc.
+ */
+
+ public int getNodeKind() {
+ return nodeKind;
+ }
+
+ /**
+ * Get the typed value of the item
+ */
+
+ public SequenceIterator getTypedValue() {
+ return SingletonIterator.makeIterator((AtomicValue)atomize());
+ }
+
+ /**
+ * Get the typed value. The result of this method will always be consistent
+ * with the method {@link net.sf.saxon.om.Item#getTypedValue()}. However,
+ * this method is often more convenient and may be more efficient,
+ * especially in the common case where the value is expected to be a
+ * singleton.
+ *
+ * @return the typed value. If requireSingleton is set to true, the result
+ * will always be an AtomicValue. In other cases it may be a Value
+ * representing a sequence whose items are atomic values.
+ * @since 8.5
+ */
+
+ public Value atomize() {
+ switch (getNodeKind()) {
+ case Type.COMMENT:
+ case Type.PROCESSING_INSTRUCTION:
+ return new StringValue(getStringValueCS());
+ default:
+ return new UntypedAtomicValue(getStringValueCS());
+ }
+ }
+
+ /**
+ * Get the type annotation of this node, if any. Returns -1 for kinds of
+ * nodes that have no annotation, and for elements annotated as untyped, and
+ * attributes annotated as untypedAtomic.
+ *
+ * @return the type annotation of the node.
+ * @see net.sf.saxon.type.Type
+ */
+
+ public int getTypeAnnotation() {
+ if (getNodeKind() == Type.ATTRIBUTE) {
+ return StandardNames.XS_UNTYPED_ATOMIC;
+ }
+ return StandardNames.XS_UNTYPED;
+ }
+
+ /**
+ * Determine whether this is the same node as another node. <br />
+ * Note: a.isSameNode(b) if and only if generateId(a)==generateId(b)
+ *
+ * @return true if this Node object and the supplied Node object represent
+ * the same node in the tree.
+ */
+
+ public boolean isSameNodeInfo(NodeInfo other) {
+ if (other instanceof NodeWrapper) {
+ return node == ((NodeWrapper) other).node; // In XOM equality means identity
+ }
+ return false;
+ }
+
+ /**
+ * The equals() method compares nodes for identity. It is defined to give the same
result
+ * as isSameNodeInfo().
+ *
+ * @param other the node to be compared with this node
+ * @return true if this NodeInfo object and the supplied NodeInfo object represent
+ * the same node in the tree.
+ * @since 8.7 Previously, the effect of the equals() method was not defined. Callers
+ * should therefore be aware that third party implementations of the NodeInfo
interface may
+ * not implement the correct semantics. It is safer to use isSameNodeInfo()
for this reason.
+ * The equals() method has been defined because it is useful in contexts such
as a Java Set or HashMap.
+ */
+
+ public boolean equals(Object other) {
+ if (other instanceof NodeInfo) {
+ return isSameNodeInfo((NodeInfo)other);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * The hashCode() method obeys the contract for hashCode(): that is, if two objects
are equal
+ * (represent the same node) then they must have the same hashCode()
+ * @since 8.7 Previously, the effect of the equals() and hashCode() methods was not
defined. Callers
+ * should therefore be aware that third party implementations of the NodeInfo
interface may
+ * not implement the correct semantics.
+ */
+
+ public int hashCode() {
+ return node.hashCode();
+ }
+
+ /**
+ * Get the System ID for the node.
+ *
+ * @return the System Identifier of the entity in the source document
+ * containing the node, or null if not known. Note this is not the
+ * same as the base URI: the base URI can be modified by xml:base,
+ * but the system ID cannot.
+ */
+
+ public String getSystemId() {
+ return docWrapper.baseURI;
+ }
+
+ public void setSystemId(String uri) {
+ docWrapper.baseURI = uri;
+ }
+
+ /**
+ * Get the Base URI for the node, that is, the URI used for resolving a
+ * relative URI contained in the node.
+ */
+
+ public String getBaseURI() {
+ return node.getBaseURI();
+ }
+
+ /**
+ * Get line number
+ *
+ * @return the line number of the node in its original source document; or
+ * -1 if not available
+ */
+
+ public int getLineNumber() {
+ return -1;
+ }
+
+ /**
+ * Determine the relative position of this node and another node, in
+ * document order. The other node will always be in the same document.
+ *
+ * @param other
+ * The other node, whose position is to be compared with this
+ * node
+ * @return -1 if this node precedes the other node, +1 if it follows the
+ * other node, or 0 if they are the same node. (In this case,
+ * isSameNode() will always return true, and the two nodes will
+ * produce the same result for generateId())
+ */
+
+ public int compareOrder(NodeInfo other) {
+ if (other instanceof NodeWrapper) {
+ return compareOrderFast(node,((NodeWrapper) other).node);
+// }
+// if (other instanceof SiblingCountingNode) {
+// return Navigator.compareOrder(this, (SiblingCountingNode) other);
+ } else {
+ // it must be a namespace node
+ return -other.compareOrder(this);
+ }
+ }
+
+ private static int compareOrderFast(Node first, Node second) {
+ /*
+ * Unfortunately we do not have a sequence number for each node at hand;
+ * this would allow to turn the comparison into a simple sequence number
+ * subtraction. Walking the entire tree and batch-generating sequence
+ * numbers on the fly is no good option either. However, this rewritten
+ * implementation turns out to be more than fast enough.
+ */
+
+ // assert first != null && second != null
+ // assert first and second MUST NOT be namespace nodes
+ if (first == second) return 0;
+
+ ParentNode firstParent = first.getParent();
+ ParentNode secondParent = second.getParent();
+ if (firstParent == null) {
+ if (secondParent != null) return -1; // first node is the root
+ // both nodes are parentless, use arbitrary but fixed order:
+ return first.hashCode() - second.hashCode();
+ }
+
+ if (secondParent == null) return +1; // second node is the root
+
+ // do they have the same parent (common case)?
+ if (firstParent == secondParent) {
+ int i1 = firstParent.indexOf(first);
+ int i2 = firstParent.indexOf(second);
+
+ // note that attributes and namespaces are not children
+ // of their own parent (i = -1).
+ // attribute (if any) comes before child
+ if (i1 != -1) return (i2 != -1) ? i1 - i2 : +1;
+ if (i2 != -1) return -1;
+
+ // assert: i1 == -1 && i2 == -1
+ // i.e. both nodes are attributes
+ Element elem = (Element) firstParent;
+ for (int i = elem.getAttributeCount(); --i >= 0;) {
+ Attribute attr = elem.getAttribute(i);
+ if (attr == second) return -1;
+ if (attr == first) return +1;
+ }
+ throw new IllegalStateException("should be unreachable");
+ }
+
+ // find the depths of both nodes in the tree
+ int depth1 = 0;
+ int depth2 = 0;
+ Node p1 = first;
+ Node p2 = second;
+ while (p1 != null) {
+ depth1++;
+ p1 = p1.getParent();
+ if (p1 == second) return +1;
+ }
+ while (p2 != null) {
+ depth2++;
+ p2 = p2.getParent();
+ if (p2 == first) return -1;
+ }
+
+ // move up one branch of the tree so we have two nodes on the same level
+ p1 = first;
+ while (depth1 > depth2) {
+ p1 = p1.getParent();
+ depth1--;
+ }
+ p2 = second;
+ while (depth2 > depth1) {
+ p2 = p2.getParent();
+ depth2--;
+ }
+
+ // now move up both branches in sync until we find a common parent
+ while (true) {
+ firstParent = p1.getParent();
+ secondParent = p2.getParent();
+ if (firstParent == null || secondParent == null) {
+ // both nodes are documentless, use arbitrary but fixed order
+ // based on their root elements
+ return p1.hashCode() - p2.hashCode();
+ // throw new NullPointerException("XOM tree compare - internal error");
+ }
+ if (firstParent == secondParent) {
+ return firstParent.indexOf(p1) - firstParent.indexOf(p2);
+ }
+ p1 = firstParent;
+ p2 = secondParent;
+ }
+ }
+
+ /**
+ * Return the string value of the node. The interpretation of this depends
+ * on the type of node. For an element it is the accumulated character
+ * content of the element, including descendant elements.
+ *
+ * @return the string value of the node
+ */
+
+ public String getStringValue() {
+ return node.getValue();
+ }
+
+ /**
+ * Get the value of the item as a CharSequence. This is in some cases more efficient
than
+ * the version of the method that returns a String.
+ */
+
+ public CharSequence getStringValueCS() {
+ return node.getValue();
+ }
+
+ /**
+ * Get name code. The name code is a coded form of the node name: two nodes
+ * with the same name code have the same namespace URI, the same local name,
+ * and the same prefix. By masking the name code with &0xfffff, you get a
+ * fingerprint: two nodes with the same fingerprint have the same local name
+ * and namespace URI.
+ *
+ * @see net.sf.saxon.om.NamePool#allocate allocate
+ */
+
+ public int getNameCode() {
+ switch (nodeKind) {
+ case Type.ELEMENT:
+ case Type.ATTRIBUTE:
+ case Type.PROCESSING_INSTRUCTION:
+ return docWrapper.getNamePool().allocate(getPrefix(), getURI(),
+ getLocalPart());
+ default:
+ return -1;
+ }
+ }
+
+ /**
+ * Get fingerprint. The fingerprint is a coded form of the expanded name of
+ * the node: two nodes with the same name code have the same namespace URI
+ * and the same local name. A fingerprint of -1 should be returned for a
+ * node with no name.
+ */
+
+ public int getFingerprint() {
+ int nc = getNameCode();
+ if (nc == -1) return -1;
+ return nc & 0xfffff;
+ }
+
+ /**
+ * Get the local part of the name of this node. This is the name after the
+ * ":" if any.
+ *
+ * @return the local part of the name. For an unnamed node, returns "".
+ */
+
+ public String getLocalPart() {
+ switch (nodeKind) {
+ case Type.ELEMENT:
+ return ((Element) node).getLocalName();
+ case Type.ATTRIBUTE:
+ return ((Attribute) node).getLocalName();
+ case Type.PROCESSING_INSTRUCTION:
+ return ((ProcessingInstruction) node).getTarget();
+ default:
+ return "";
+ }
+ }
+
+ /**
+ * Get the prefix of the name of the node. This is defined only for elements and
attributes.
+ * If the node has no prefix, or for other kinds of node, return a zero-length
string.
+ * @return The prefix of the name of the node.
+ */
+
+ public String getPrefix() {
+ switch (nodeKind) {
+ case Type.ELEMENT:
+ return ((Element) node).getNamespacePrefix();
+ case Type.ATTRIBUTE:
+ return ((Attribute) node).getNamespacePrefix();
+ default:
+ return "";
+ }
+ }
+
+ /**
+ * Get the URI part of the name of this node. This is the URI corresponding
+ * to the prefix, or the URI of the default namespace if appropriate.
+ *
+ * @return The URI of the namespace of this node. For an unnamed node, or
+ * for a node with an empty prefix, return an empty string.
+ */
+
+ public String getURI() {
+ switch (nodeKind) {
+ case Type.ELEMENT:
+ return ((Element) node).getNamespaceURI();
+ case Type.ATTRIBUTE:
+ return ((Attribute) node).getNamespaceURI();
+ default:
+ return "";
+ }
+ }
+
+ /**
+ * Get the display name of this node. For elements and attributes this is
+ * [prefix:]localname. For unnamed nodes, it is an empty string.
+ *
+ * @return The display name of this node. For a node with no name, return an
+ * empty string.
+ */
+
+ public String getDisplayName() {
+ switch (nodeKind) {
+ case Type.ELEMENT:
+ return ((Element) node).getQualifiedName();
+ case Type.ATTRIBUTE:
+ return ((Attribute) node).getQualifiedName();
+ case Type.PROCESSING_INSTRUCTION:
+ return ((ProcessingInstruction) node).getTarget();
+ default:
+ return "";
+ }
+ }
+
+ /**
+ * Get the NodeInfo object representing the parent of this node
+ */
+
+ public NodeInfo getParent() {
+ if (parent == null) {
+ ParentNode p = node.getParent();
+ if (p != null) parent = makeWrapper(p, docWrapper);
+ }
+ return parent;
+ }
+
+ /**
+ * Get the index position of this node among its siblings (starting from 0)
+ */
+
+ public int getSiblingPosition() {
+ if (index != -1) return index;
+ switch (nodeKind) {
+ case Type.ATTRIBUTE: {
+ Attribute att = (Attribute) node;
+ Element p = (Element) att.getParent();
+ if (p == null) return 0;
+ for (int i=p.getAttributeCount(); --i >= 0;) {
+ if (p.getAttribute(i) == att) {
+ index = i;
+ return i;
+ }
+ }
+ throw new IllegalStateException("XOM node not linked to parent node");
+ }
+
+ default: {
+ ParentNode p = node.getParent();
+ int i = (p == null ? 0 : p.indexOf(node));
+ if (i == -1) throw new IllegalStateException("XOM node not linked to parent
node");
+ index = i;
+ return index;
+ }
+ }
+ }
+
+ /**
+ * Return an iteration over the nodes reached by the given axis from this
+ * node
+ *
+ * @param axisNumber
+ * the axis to be used
+ * @return a SequenceIterator that scans the nodes reached by the axis in
+ * turn.
+ */
+
+ public AxisIterator iterateAxis(byte axisNumber) {
+ return iterateAxis(axisNumber, AnyNodeTest.getInstance());
+ }
+
+ /**
+ * Return an iteration over the nodes reached by the given axis from this
+ * node
+ *
+ * @param axisNumber
+ * the axis to be used
+ * @param nodeTest
+ * A pattern to be matched by the returned nodes
+ * @return a SequenceIterator that scans the nodes reached by the axis in
+ * turn.
+ */
+
+ public AxisIterator iterateAxis(byte axisNumber, NodeTest nodeTest) {
+ // for clarifications, see the W3C specs or:
+ //
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/h...
+ switch (axisNumber) {
+ case Axis.ANCESTOR:
+ return new AncestorAxisIterator(this, false, nodeTest);
+
+ case Axis.ANCESTOR_OR_SELF:
+ return new AncestorAxisIterator(this, true, nodeTest);
+
+ case Axis.ATTRIBUTE:
+ if (nodeKind != Type.ELEMENT || ((Element) node).getAttributeCount() == 0) {
+ return EmptyIterator.getInstance();
+ } else {
+ return new AttributeAxisIterator(this, nodeTest);
+ }
+
+ case Axis.CHILD:
+ if (hasChildNodes()) {
+ return new ChildAxisIterator(this, true, true, nodeTest);
+ } else {
+ return EmptyIterator.getInstance();
+ }
+
+ case Axis.DESCENDANT:
+ if (hasChildNodes()) {
+ return new DescendantAxisIterator(this, false, false, nodeTest);
+ } else {
+ return EmptyIterator.getInstance();
+ }
+
+ case Axis.DESCENDANT_OR_SELF:
+ if (hasChildNodes()) {
+ return new DescendantAxisIterator(this, true, false, nodeTest);
+ } else {
+ return filteredSingleton(this, nodeTest);
+ }
+
+ case Axis.FOLLOWING:
+ if (getParent() == null) {
+ return EmptyIterator.getInstance();
+ } else {
+ return new DescendantAxisIterator(this, false, true, nodeTest);
+ }
+
+ case Axis.FOLLOWING_SIBLING:
+ if (nodeKind == Type.ATTRIBUTE || getParent() == null) {
+ return EmptyIterator.getInstance();
+ } else {
+ return new ChildAxisIterator(this, false, true, nodeTest);
+ }
+
+ case Axis.NAMESPACE:
+ if (nodeKind == Type.ELEMENT) {
+ return NamespaceIterator.makeIterator(this, nodeTest);
+ } else {
+ return EmptyIterator.getInstance();
+ }
+
+ case Axis.PARENT:
+ if (getParent() == null) {
+ return EmptyIterator.getInstance();
+ } else {
+ return filteredSingleton(getParent(), nodeTest);
+ }
+
+ case Axis.PRECEDING:
+ return new PrecedingAxisIterator(this, false, nodeTest);
+// return new Navigator.AxisFilter(
+// new Navigator.PrecedingEnumeration(this, false), nodeTest);
+
+ case Axis.PRECEDING_SIBLING:
+ if (nodeKind == Type.ATTRIBUTE || getParent() == null) {
+ return EmptyIterator.getInstance();
+ } else {
+ return new ChildAxisIterator(this, false, false, nodeTest);
+ }
+
+ case Axis.SELF:
+ return filteredSingleton(this, nodeTest);
+
+ case Axis.PRECEDING_OR_ANCESTOR:
+ // This axis is used internally by saxon for the xsl:number implementation,
+ // it returns the union of the preceding axis and the ancestor axis.
+ return new PrecedingAxisIterator(this, true, nodeTest);
+// return new Navigator.AxisFilter(new Navigator.PrecedingEnumeration(
+// this, true), nodeTest);
+
+ default:
+ throw new IllegalArgumentException("Unknown axis number " + axisNumber);
+ }
+ }
+
+// private static AxisIterator makeSingleIterator(NodeWrapper wrapper, NodeTest nodeTest)
{
+// if (nodeTest == AnyNodeTest.getInstance() || nodeTest.matches(wrapper))
+// return SingletonIterator.makeIterator(wrapper);
+// else
+// return EmptyIterator.getInstance();
+// }
+
+ /**
+ * Get the value of a given attribute of this node
+ *
+ * @param fingerprint
+ * The fingerprint of the attribute name
+ * @return the attribute value if it exists or null if not
+ */
+
+ public String getAttributeValue(int fingerprint) {
+ if (nodeKind == Type.ELEMENT) {
+ NamePool pool = docWrapper.getNamePool();
+ String localName = pool.getLocalName(fingerprint);
+ String uri = pool.getURI(fingerprint);
+ Attribute att = ((Element) node).getAttribute(localName, uri);
+ if (att != null) return att.getValue();
+ }
+ return null;
+ }
+
+ /**
+ * Get the root node of the tree containing this node
+ *
+ * @return the NodeInfo representing the top-level ancestor of this node.
+ * This will not necessarily be a document node
+ */
+
+ public NodeInfo getRoot() {
+ return docWrapper;
+ }
+
+ /**
+ * Get the root node, if it is a document node.
+ *
+ * @return the DocumentInfo representing the containing document.
+ */
+
+ public DocumentInfo getDocumentRoot() {
+ if (docWrapper.node instanceof Document) {
+ return docWrapper;
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Determine whether the node has any children. <br />
+ * Note: the result is equivalent to <br />
+ * getEnumeration(Axis.CHILD, AnyNodeTest.getInstance()).hasNext()
+ */
+
+ public boolean hasChildNodes() {
+ return node.getChildCount() > 0;
+ }
+
+ /**
+ * Get a character string that uniquely identifies this node. Note:
+ * a.isSameNode(b) if and only if generateId(a)==generateId(b)
+ *
+ * @param buffer a buffer to contain a string that uniquely identifies this node, across
all documents
+ */
+
+ public void generateId(FastStringBuffer buffer) {
+ Navigator.appendSequentialKey(this, buffer, true);
+ //buffer.append(Navigator.getSequentialKey(this));
+ }
+
+ /**
+ * Get the document number of the document containing this node. For a
+ * free-standing orphan node, just return the hashcode.
+ */
+
+ public int getDocumentNumber() {
+ return docWrapper.getDocumentNumber();
+ }
+
+ /**
+ * Copy this node to a given outputter (deep copy)
+ */
+
+ public void copy(Receiver out, int whichNamespaces,
+ boolean copyAnnotations, int locationId) throws XPathException {
+ Navigator.copy(this, out, docWrapper.getNamePool(), whichNamespaces,
+ copyAnnotations, locationId);
+ }
+
+ /**
+ * Get all namespace undeclarations and undeclarations defined on this element.
+ *
+ * @param buffer If this is non-null, and the result array fits in this buffer, then
the result
+ * may overwrite the contents of this array, to avoid the cost of
allocating a new array on the heap.
+ * @return An array of integers representing the namespace declarations and
undeclarations present on
+ * this element. For a node other than an element, return null. Otherwise,
the returned array is a
+ * sequence of namespace codes, whose meaning may be interpreted by reference
to the name pool. The
+ * top half word of each namespace code represents the prefix, the bottom
half represents the URI.
+ * If the bottom half is zero, then this is a namespace undeclaration rather
than a declaration.
+ * The XML namespace is never included in the list. If the supplied array is
larger than required,
+ * then the first unused entry will be set to -1.
+ * <p/>
+ * <p>For a node other than an element, the method returns
null.</p>
+ */
+
+ public int[] getDeclaredNamespaces(int[] buffer) {
+ if (node instanceof Element) {
+ Element elem = (Element)node;
+ int size = elem.getNamespaceDeclarationCount();
+ if (size == 0) {
+ return EMPTY_NAMESPACE_LIST;
+ }
+ int[] result = (buffer != null && size <= buffer.length ? buffer :
new int[size]);
+ NamePool pool = getNamePool();
+ for (int i=0; i < size; i++) {
+ String prefix = elem.getNamespacePrefix(i);
+ String uri = elem.getNamespaceURI(prefix);
+ result[i] = pool.allocateNamespaceCode(prefix, uri);
+ }
+ if (size < result.length) {
+ result[size] = -1;
+ }
+ return result;
+ } else {
+ return null;
+ }
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////
+ // Axis enumeration classes
+ ///////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * Handles the ancestor axis in a rather direct manner.
+ */
+ private final class AncestorAxisIterator extends AxisIteratorImpl {
+
+ private NodeWrapper start;
+ private boolean includeSelf;
+
+ private NodeTest nodeTest;
+
+ public AncestorAxisIterator(NodeWrapper start, boolean includeSelf, NodeTest test) {
+ // use lazy instead of eager materialization (performance)
+ this.start = start;
+ if (test == AnyNodeTest.getInstance()) test = null;
+ this.nodeTest = test;
+ if (!includeSelf) this.current = start;
+ this.includeSelf = includeSelf;
+ this.position = 0;
+ }
+
+ public Item next() {
+ NodeInfo curr;
+ do { // until we find a match
+ curr = advance();
+ }
+ while (curr != null && nodeTest != null && (!
nodeTest.matches(curr)));
+
+ if (curr != null) position++;
+ current = curr;
+ return curr;
+ }
+
+ private NodeInfo advance() {
+ if (current == null)
+ current = start;
+ else
+ current = current.getParent();
+
+ return current;
+ }
+
+ public Item current() {
+ return current;
+ }
+
+ public SequenceIterator getAnother() {
+ return new AncestorAxisIterator(start, includeSelf, nodeTest);
+ }
+
+ public int getProperties() {
+ return 0;
+ }
+
+ } // end of class AncestorAxisIterator
+
+ /**
+ * Handles the attribute axis in a rather direct manner.
+ */
+ private final class AttributeAxisIterator extends AxisIteratorImpl {
+
+ private NodeWrapper start;
+
+ private int cursor;
+
+ private NodeTest nodeTest;
+
+ public AttributeAxisIterator(NodeWrapper start, NodeTest test) {
+ // use lazy instead of eager materialization (performance)
+ this.start = start;
+ if (test == AnyNodeTest.getInstance()) test = null;
+ this.nodeTest = test;
+ this.position = 0;
+ this.cursor = 0;
+ }
+
+ public Item next() {
+ NodeInfo curr;
+ do { // until we find a match
+ curr = advance();
+ }
+ while (curr != null && nodeTest != null && (!
nodeTest.matches(curr)));
+
+ if (curr != null) position++;
+ current = curr;
+ return curr;
+ }
+
+ private NodeInfo advance() {
+ Element elem = (Element) start.node;
+ if (cursor == elem.getAttributeCount()) return null;
+ NodeInfo curr = makeWrapper(elem.getAttribute(cursor), docWrapper, start, cursor);
+ cursor++;
+ return curr;
+ }
+
+ public Item current() {
+ return current;
+ }
+
+ public SequenceIterator getAnother() {
+ return new AttributeAxisIterator(start, nodeTest);
+ }
+
+ public int getProperties() {
+ return 0;
+ }
+
+ } // end of class AttributeAxisIterator
+
+ /**
+ * The class ChildAxisIterator handles not only the child axis, but also the
+ * following-sibling and preceding-sibling axes. It can also iterate the
+ * children of the start node in reverse order, something that is needed to
+ * support the preceding and preceding-or-ancestor axes (the latter being
+ * used by xsl:number)
+ */
+ private final class ChildAxisIterator extends AxisIteratorImpl {
+
+ private NodeWrapper start;
+ private NodeWrapper commonParent;
+ private int ix;
+ private boolean downwards; // iterate children of start node (not siblings)
+ private boolean forwards; // iterate in document order (not reverse order)
+
+ private ParentNode par;
+ private int cursor;
+
+ private NodeTest nodeTest;
+
+ private ChildAxisIterator(NodeWrapper start, boolean downwards, boolean forwards,
NodeTest test) {
+ this.start = start;
+ this.downwards = downwards;
+ this.forwards = forwards;
+
+ if (test == AnyNodeTest.getInstance()) test = null;
+ this.nodeTest = test;
+ this.position = 0;
+
+ if (downwards)
+ commonParent = start;
+ else
+ commonParent = (NodeWrapper) start.getParent();
+
+ par = (ParentNode) commonParent.node;
+ if (downwards) {
+ ix = (forwards ? 0 : par.getChildCount());
+ } else {
+ // find the start node among the list of siblings
+// ix = start.getSiblingPosition();
+ ix = par.indexOf(start.node);
+ if (forwards) ix++;
+ }
+ cursor = ix;
+ if (!downwards && !forwards) ix--;
+ }
+
+ public Item next() {
+ NodeInfo curr;
+ do { // until we find a match
+ curr = advance();
+ }
+ while (curr != null && nodeTest != null && (!
nodeTest.matches(curr)));
+
+ if (curr != null) position++;
+ current = curr;
+ return curr;
+ }
+
+ private NodeInfo advance() {
+ Node nextChild;
+ do {
+ if (forwards) {
+ if (cursor == par.getChildCount()) return null;
+ nextChild = par.getChild(cursor++);
+ } else { // backwards
+ if (cursor == 0) return null;
+ nextChild = par.getChild(--cursor);
+ }
+ } while (nextChild instanceof DocType);
+ // DocType is not an XPath node; can occur for /child::node()
+
+ NodeInfo curr = makeWrapper(nextChild, docWrapper, commonParent, ix);
+ ix += (forwards ? 1 : -1);
+ return curr;
+ }
+
+ public Item current() {
+ return current;
+ }
+
+ public SequenceIterator getAnother() {
+ return new ChildAxisIterator(start, downwards, forwards, nodeTest);
+ }
+
+ public int getProperties() {
+ return 0;
+ }
+ }
+
+ /**
+ * A bit of a misnomer; efficiently takes care of descendants,
+ * descentants-or-self as well as "following" axis.
+ * "includeSelf" must be false for the following axis.
+ * Uses simple and effective O(1) backtracking via indexOf().
+ */
+ private final class DescendantAxisIterator extends AxisIteratorImpl {
+
+ private NodeWrapper start;
+ private boolean includeSelf;
+ private boolean following;
+
+ private Node anchor; // so we know where to stop the scan
+ private Node currNode;
+ private boolean moveToNextSibling;
+
+ private NodeTest nodeTest;
+
+ private String testLocalName;
+ private String testURI;
+
+ public DescendantAxisIterator(NodeWrapper start, boolean includeSelf, boolean
following, NodeTest test) {
+ this.start = start;
+ this.includeSelf = includeSelf;
+ this.following = following;
+ this.moveToNextSibling = following;
+
+ if (!following) anchor = start.node;
+ if (!includeSelf) currNode = start.node;
+
+ if (test == AnyNodeTest.getInstance()) { // performance hack
+ test = null; // mark as AnyNodeTest
+ }
+ else if (test instanceof NameTest) {
+ NameTest nt = (NameTest) test;
+ if (nt.getPrimitiveType() == Type.ELEMENT) { // performance hack
+ // mark as element name test
+ NamePool pool = getNamePool();
+ this.testLocalName = pool.getLocalName(nt.getFingerprint());
+ this.testURI = pool.getURI(nt.getFingerprint());
+ }
+ }
+ else if (test instanceof NodeKindTest) {
+ if (test.getPrimitiveType() == Type.ELEMENT) { // performance hack
+ // mark as element type test
+ this.testLocalName = "";
+ this.testURI = null;
+ }
+ }
+ this.nodeTest = test;
+ this.position = 0;
+ }
+
+ public Item next() {
+ NodeInfo curr;
+ do { // until we find a match
+ curr = advance();
+ }
+ while (curr != null && nodeTest != null && (!
nodeTest.matches(curr)));
+
+ if (curr != null) position++;
+ current = curr;
+ return curr;
+ }
+
+ // might look expensive at first glance - but it's not
+ private NodeInfo advance() {
+ if (currNode == null) { // if includeSelf
+ currNode = start.node;
+ return start;
+ }
+
+ int i;
+ do {
+ i = 0;
+ Node p = currNode;
+
+ if (p.getChildCount() == 0 || moveToNextSibling) { // move to next sibling
+
+ moveToNextSibling = false; // do it just once
+ while (true) {
+ // if we've reached the root we're done scanning
+ p = currNode.getParent();
+ if (p == null) return null;
+
+ // Note: correct even if currNode is an attribute.
+ // Performance is particularly good with the O(1) patch
+ // for XOM's ParentNode.indexOf()
+ i = currNode.getParent().indexOf(currNode) + 1;
+
+ if (i < p.getChildCount()) {
+ break; // break out of while(true) loop; move to next sibling
+ }
+ else { // reached last sibling; move up
+ currNode = p;
+ // if we've come all the way back to the start anchor we're done
+ if (p == anchor) return null;
+ }
+ }
+ }
+ currNode = p.getChild(i);
+ } while (!conforms(currNode));
+
+ // note the null here: makeNodeWrapper(parent, ...) is fast, so it
+ // doesn't really matter that we don't keep a link to it.
+ // In fact, it makes objects more short lived, easing pressure on
+ // the VM allocator and collector for tenured heaps.
+ return makeWrapper(currNode, docWrapper, null, i);
+ }
+
+ // avoids NodeWrapper allocation when there's clearly a mismatch (common case)
+ private boolean conforms(Node node) {
+ if (this.testLocalName != null) { // element test?
+ if (!(node instanceof Element)) return false;
+ if (this.testURI == null) return true; // pure element type test
+
+ // element name test
+ Element elem = (Element) node;
+ return this.testLocalName.equals(elem.getLocalName()) &&
+ this.testURI.equals(elem.getNamespaceURI());
+ }
+ else { // DocType is not an XPath node; can occur for /descendants::node()
+ return !(node instanceof DocType);
+ }
+ }
+
+ public Item current() {
+ return current;
+ }
+
+ public SequenceIterator getAnother() {
+ return new DescendantAxisIterator(start, includeSelf, following, nodeTest);
+ }
+
+ public int getProperties() {
+ return 0;
+ }
+ }
+
+ /**
+ * Efficiently takes care of preceding axis and Saxon internal preceding-or-ancestor
axis.
+ * Uses simple and effective O(1) backtracking via indexOf().
+ * Implemented along similar lines as DescendantAxisIterator.
+ */
+ private final class PrecedingAxisIterator extends AxisIteratorImpl {
+
+ private NodeWrapper start;
+ private boolean includeAncestors;
+
+ private Node currNode;
+ private ParentNode nextAncestor; // next ancestors to skip if !includeAncestors
+
+ private NodeTest nodeTest;
+
+ private String testLocalName;
+ private String testURI;
+
+ public PrecedingAxisIterator(NodeWrapper start, boolean includeAncestors, NodeTest
test) {
+ this.start = start;
+ this.includeAncestors = includeAncestors;
+ this.currNode = start.node;
+ if (includeAncestors)
+ nextAncestor = null;
+ else
+ nextAncestor = start.node.getParent();
+
+ if (test == AnyNodeTest.getInstance()) { // performance hack
+ test = null; // mark as AnyNodeTest
+ }
+ else if (test instanceof NameTest) {
+ NameTest nt = (NameTest) test;
+ if (nt.getPrimitiveType() == Type.ELEMENT) { // performance hack
+ // mark as element name test
+ NamePool pool = getNamePool();
+ this.testLocalName = pool.getLocalName(nt.getFingerprint());
+ this.testURI = pool.getURI(nt.getFingerprint());
+ }
+ }
+ else if (test instanceof NodeKindTest) {
+ if (test.getPrimitiveType() == Type.ELEMENT) { // performance hack
+ // mark as element type test
+ this.testLocalName = "";
+ this.testURI = null;
+ }
+ }
+ this.nodeTest = test;
+ this.position = 0;
+ }
+
+ public Item next() {
+ NodeInfo curr;
+ do { // until we find a match
+ curr = advance();
+ }
+ while (curr != null && nodeTest != null && (!
nodeTest.matches(curr)));
+
+ if (curr != null) position++;
+ current = curr;
+ return curr;
+ }
+
+ // might look expensive at first glance - but it's not
+ private NodeInfo advance() {
+ int i;
+ do {
+ Node p;
+
+ while (true) {
+ // if we've reached the root we're done scanning
+// System.out.println("p="+p);
+ p = currNode.getParent();
+ if (p == null) return null;
+
+ // Note: correct even if currNode is an attribute.
+ // Performance is particularly good with the O(1) patch
+ // for XOM's ParentNode.indexOf()
+ i = currNode.getParent().indexOf(currNode) - 1;
+
+ if (i >= 0) { // move to next sibling's last descendant node
+ p = p.getChild(i); // move to next sibling
+ int j;
+ while ((j = p.getChildCount()-1) >= 0) { // move to last descendant node
+ p = p.getChild(j);
+ i = j;
+ }
+ break; // break out of while(true) loop
+ }
+ else { // there are no more siblings; move up
+ // if !includeAncestors skip the ancestors of the start node
+ // assert p != null
+ if (p != nextAncestor) break; // break out of while(true) loop
+
+ nextAncestor = nextAncestor.getParent();
+ currNode = p;
+ }
+ }
+ currNode = p;
+
+ } while (!conforms(currNode));
+
+ // note the null here: makeNodeWrapper(parent, ...) is fast, so it
+ // doesn't really matter that we don't keep a link to it.
+ // In fact, it makes objects more short lived, easing pressure on
+ // the VM allocator and collector for tenured heaps.
+ return makeWrapper(currNode, docWrapper, null, i);
+ }
+
+ // avoids NodeWrapper allocation when there's clearly a mismatch (common case)
+ // same as for DescendantAxisIterator
+ private boolean conforms(Node node) {
+ if (this.testLocalName != null) { // element test?
+ if (!(node instanceof Element)) return false;
+ if (this.testURI == null) return true; // pure element type test
+
+ // element name test
+ Element elem = (Element) node;
+ return this.testLocalName.equals(elem.getLocalName()) &&
+ this.testURI.equals(elem.getNamespaceURI());
+ }
+ else { // DocType is not an XPath node
+ return !(node instanceof DocType);
+ }
+ }
+
+ public Item current() {
+ return current;
+ }
+
+ public SequenceIterator getAnother() {
+ return new PrecedingAxisIterator(start, includeAncestors, nodeTest);
+ }
+
+ public int getProperties() {
+ return 0;
+ }
+ }
+
+ private static AxisIterator filteredSingleton(NodeInfo node, NodeTest nodeTest) {
+// return Navigator.filteredSingleton(node, nodeTest); // saxon >= 8.7
+ if (node != null && (nodeTest == AnyNodeTest.getInstance() ||
nodeTest.matches(node))) {
+ return SingleNodeIterator.makeIterator(node);
+ } else {
+ return EmptyIterator.getInstance();
+ }
+ }
+
+ @Override
+ public int getColumnNumber() {
+ return -1;
+ }
+
+ @Override
+ public boolean isId() {
+ return false;
+ }
+
+ @Override
+ public boolean isIdref() {
+ return false;
+ }
+
+ @Override
+ public boolean isNilled() {
+ return false;
+ }
+
+}
+
+//
+// The contents of this file are subject to the Mozilla Public License Version
+// 1.0 (the "License");
+// you may not use this file except in compliance with the License. You may
+// obtain a copy of the
+// License at
http://www.mozilla.org/MPL/
+//
+// Software distributed under the License is distributed on an "AS IS" basis,
+// WITHOUT WARRANTY OF ANY KIND, either express or implied.
+// See the License for the specific language governing rights and limitations
+// under the License.
+//
+// The Original Code is: all this file.
+//
+// The Initial Developer of the Original Code is Michael Kay, with extensive
+// rewriting by Wolfgang Hoschek
+//
+// Portions created by (your name) are Copyright (C) (your legal entity). All
+// Rights Reserved.
+//
+// Contributor(s): none.
+//
Modified: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/PathMapFilter.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -184,5 +184,13 @@
super.endElement();
}
}
+
+ @Override
+ public void startContent() throws XPathException {
+ MatchContext context = matchContext.getLast();
+ if (context.matchedElement) {
+ super.startContent();
+ }
+ }
}
\ No newline at end of file
Modified:
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java
===================================================================
---
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/main/java/org/teiid/query/xquery/saxon/SaxonXQueryExpression.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -23,9 +23,11 @@
package org.teiid.query.xquery.saxon;
import java.io.IOException;
+import java.io.InputStream;
import java.io.Writer;
import java.sql.SQLXML;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
@@ -61,6 +63,7 @@
import net.sf.saxon.query.DynamicQueryContext;
import net.sf.saxon.query.QueryResult;
import net.sf.saxon.query.StaticQueryContext;
+import net.sf.saxon.query.XQueryExpression;
import net.sf.saxon.sxpath.IndependentContext;
import net.sf.saxon.sxpath.XPathEvaluator;
import net.sf.saxon.sxpath.XPathExpression;
@@ -69,6 +72,12 @@
import net.sf.saxon.type.ItemType;
import net.sf.saxon.type.TypeHierarchy;
import net.sf.saxon.value.SequenceType;
+import nu.xom.Builder;
+import nu.xom.Element;
+import nu.xom.Nodes;
+import nu.xom.ParsingException;
+import nux.xom.xquery.StreamingPathFilter;
+import nux.xom.xquery.StreamingTransform;
import org.teiid.api.exception.query.QueryResolverException;
import org.teiid.common.buffer.BufferManager;
@@ -80,6 +89,9 @@
import org.teiid.core.types.XMLTranslator;
import org.teiid.core.types.XMLType;
import org.teiid.core.types.XMLType.Type;
+import org.teiid.logging.LogConstants;
+import org.teiid.logging.LogManager;
+import org.teiid.logging.MessageLevel;
import org.teiid.query.QueryPlugin;
import org.teiid.query.analysis.AnalysisRecord;
import org.teiid.query.function.source.XMLSystemFunctions;
@@ -88,11 +100,34 @@
import org.teiid.query.sql.symbol.DerivedColumn;
import org.teiid.query.sql.symbol.XMLNamespaces;
import org.teiid.query.sql.symbol.XMLNamespaces.NamespaceItem;
+import org.teiid.query.util.CommandContext;
import org.teiid.translator.WSConnection.Util;
@SuppressWarnings("serial")
public class SaxonXQueryExpression {
+ public static final Properties DEFAULT_OUTPUT_PROPERTIES = new Properties();
+ {
+ DEFAULT_OUTPUT_PROPERTIES.setProperty(OutputKeys.METHOD, "xml");
//$NON-NLS-1$
+ //props.setProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ DEFAULT_OUTPUT_PROPERTIES.setProperty(OutputKeys.OMIT_XML_DECLARATION,
"yes"); //$NON-NLS-1$
+ }
+
+ private static Nodes NONE = new Nodes();
+ private static InputStream FAKE_IS = new InputStream() {
+
+ @Override
+ public int read() throws IOException {
+ return 0;
+ }
+ };
+
+ public interface RowProcessor {
+
+ void processRow(NodeInfo row);
+
+ }
+
public static class Result {
public SequenceIterator iter;
public List<Source> sources = new LinkedList<Source>();
@@ -147,16 +182,20 @@
}
};
- private net.sf.saxon.query.XQueryExpression xQuery;
+ private XQueryExpression xQuery;
+ private String xQueryString;
+ private Map<String, String> namespaceMap = new HashMap<String, String>();
private Configuration config = new Configuration();
private PathMapRoot contextRoot;
+ private StreamingPathFilter streamingPathFilter;
public SaxonXQueryExpression(String xQueryString, XMLNamespaces namespaces,
List<DerivedColumn> passing, List<XMLTable.XMLColumn> columns)
throws QueryResolverException {
config.setErrorListener(ERROR_LISTENER);
+ this.xQueryString = xQueryString;
StaticQueryContext context = new StaticQueryContext(config);
IndependentContext ic = new IndependentContext(config);
-
+ namespaceMap.put("", ""); //$NON-NLS-1$ //$NON-NLS-2$
if (namespaces != null) {
for (NamespaceItem item : namespaces.getNamespaceItems()) {
if (item.getPrefix() == null) {
@@ -166,10 +205,12 @@
} else {
context.setDefaultElementNamespace(item.getUri());
ic.setDefaultElementNamespace(item.getUri());
+ namespaceMap.put("", item.getUri()); //$NON-NLS-1$
}
} else {
context.declareNamespace(item.getPrefix(), item.getUri());
ic.declareNamespace(item.getPrefix(), item.getUri());
+ namespaceMap.put(item.getPrefix(), item.getUri());
}
}
}
@@ -211,6 +252,13 @@
}
public void useDocumentProjection(List<XMLTable.XMLColumn> columns, AnalysisRecord
record) {
+ try {
+ streamingPathFilter = StreamingUtils.getStreamingPathFilter(xQueryString,
namespaceMap);
+ } catch (IllegalArgumentException e) {
+ if (record.recordDebug()) {
+ record.println("Document streaming will not be used: " + e.getMessage());
//$NON-NLS-1$
+ }
+ }
this.contextRoot = null;
PathMap map = this.xQuery.getPathMap();
PathMapRoot parentRoot;
@@ -246,8 +294,8 @@
return;
}
} else {
- for (Iterator iter = finalNodes.iterator(); iter.hasNext(); ) {
- PathMapNode subNode = (PathMapNode)iter.next();
+ for (Iterator<PathMapNode> iter = finalNodes.iterator(); iter.hasNext(); ) {
+ PathMapNode subNode = iter.next();
subNode.createArc(new AxisExpression(Axis.DESCENDANT_OR_SELF,
AnyNodeTest.getInstance()));
}
}
@@ -265,6 +313,24 @@
}
this.contextRoot = parentRoot;
}
+
+ public static final boolean[] isValidAncestorAxis =
+ {
+ false, // ANCESTOR
+ false, // ANCESTOR_OR_SELF;
+ true, // ATTRIBUTE;
+ false, // CHILD;
+ false, // DESCENDANT;
+ false, // DESCENDANT_OR_SELF;
+ false, // FOLLOWING;
+ false, // FOLLOWING_SIBLING;
+ true, // NAMESPACE;
+ true, // PARENT;
+ false, // PRECEDING;
+ false, // PRECEDING_SIBLING;
+ true, // SELF;
+ false, // PRECEDING_OR_ANCESTOR;
+ };
private PathMapRoot projectColumns(PathMapRoot parentRoot,
List<XMLTable.XMLColumn> columns, PathMapNode finalNode, AnalysisRecord record) {
for (XMLColumn xmlColumn : columns) {
@@ -293,6 +359,9 @@
continue;
}
for (PathMapArc arc : subContextRoot.getArcs()) {
+ if (streamingPathFilter != null && !validateColumnForStreaming(record,
xmlColumn, arc)) {
+ streamingPathFilter = null;
+ }
finalNode.createArc(arc.getStep(), arc.getTarget());
}
HashSet<PathMapNode> subFinalNodes = new HashSet<PathMapNode>();
@@ -319,6 +388,54 @@
return newMap.reduceToDownwardsAxes(newRoot);
}
+ private boolean validateColumnForStreaming(AnalysisRecord record,
+ XMLColumn xmlColumn, PathMapArc arc) {
+ boolean ancestor = false;
+ LinkedList<PathMapArc> arcStack = new LinkedList<PathMapArc>();
+ arcStack.add(arc);
+ while (!arcStack.isEmpty()) {
+ PathMapArc current = arcStack.removeFirst();
+ byte axis = current.getStep().getAxis();
+ if (ancestor) {
+ if (current.getTarget().isReturnable()) {
+ if (axis != Axis.NAMESPACE && axis != Axis.ATTRIBUTE) {
+ if (record.recordDebug()) {
+ record.println("Document streaming will not be used, since the column path
contains an invalid reverse axis " + xmlColumn.getPath()); //$NON-NLS-1$
+ }
+ return false;
+ }
+ }
+ if (!isValidAncestorAxis[axis]) {
+ if (record.recordDebug()) {
+ record.println("Document streaming will not be used, since the column path
contains an invalid reverse axis " + xmlColumn.getPath()); //$NON-NLS-1$
+ }
+ return false;
+ }
+ } else if (!Axis.isSubtreeAxis[axis]) {
+ if (axis == Axis.PARENT
+ || axis == Axis.ANCESTOR
+ || axis == Axis.ANCESTOR_OR_SELF) {
+ if (current.getTarget().isReturnable()) {
+ if (record.recordDebug()) {
+ record.println("Document streaming will not be used, since the column path
contains an invalid reverse axis " + xmlColumn.getPath()); //$NON-NLS-1$
+ }
+ return false;
+ }
+ ancestor = true;
+ } else {
+ if (record.recordDebug()) {
+ record.println("Document streaming will not be used, since the column path may
not reference an ancestor or subtree " + xmlColumn.getPath()); //$NON-NLS-1$
+ }
+ return false;
+ }
+ }
+ for (PathMapArc pathMapArc : current.getTarget().getArcs()) {
+ arcStack.add(pathMapArc);
+ }
+ }
+ return true;
+ }
+
private void addReturnedArcs(XMLColumn xmlColumn, PathMapNode subNode) {
if (xmlColumn.getSymbol().getType() == DataTypeManager.DefaultDataClasses.XML) {
subNode.createArc(new AxisExpression(Axis.DESCENDANT_OR_SELF,
AnyNodeTest.getInstance()));
@@ -371,7 +488,7 @@
}
}
- public Result evaluateXQuery(Object context, Map<String, Object>
parameterValues) throws TeiidProcessingException {
+ public Result evaluateXQuery(Object context, Map<String, Object>
parameterValues, final RowProcessor processor, CommandContext commandContext) throws
TeiidProcessingException {
DynamicQueryContext dynamicContext = new DynamicQueryContext(config);
Result result = new Result();
@@ -399,6 +516,39 @@
AugmentedSource sourceInput =
AugmentedSource.makeAugmentedSource(source);
sourceInput.addFilter(filter);
source = sourceInput;
+
+ //use streamable processing instead
+ if (streamingPathFilter != null && processor != null) {
+ if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP,
MessageLevel.DETAIL)) {
+ LogManager.logDetail(LogConstants.CTX_DQP, "Using stream
processing for evaluation of", this.xQueryString); //$NON-NLS-1$
+ }
+ //set to non-blocking in case default expression evaluation blocks
+ boolean isNonBlocking = commandContext.isNonBlocking();
+ commandContext.setNonBlocking(true);
+
+ final StreamingTransform myTransform = new StreamingTransform() {
+ public Nodes transform(Element elem) {
+ processor.processRow(StreamingUtils.wrap(elem, config));
+ return NONE;
+ }
+ };
+
+ Builder builder = new Builder(new SaxonReader(config, sourceInput), false,
+ streamingPathFilter.createNodeFactory(null, myTransform));
+ try {
+ //the builder is hard wired to parse the source, but the api will throw an
exception if the stream is null
+ builder.build(FAKE_IS);
+ return result;
+ } catch (ParsingException e) {
+ throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("SaxonXQueryExpression.bad_context")); //$NON-NLS-1$
+ } catch (IOException e) {
+ throw new TeiidProcessingException(e,
QueryPlugin.Util.getString("SaxonXQueryExpression.bad_context")); //$NON-NLS-1$
+ } finally {
+ if (!isNonBlocking) {
+ commandContext.setNonBlocking(false);
+ }
+ }
+ }
}
DocumentInfo doc;
try {
@@ -429,17 +579,7 @@
XMLType.Type type = Type.CONTENT;
if (item instanceof NodeInfo) {
NodeInfo info = (NodeInfo)item;
- switch (info.getNodeKind()) {
- case net.sf.saxon.type.Type.DOCUMENT:
- type = Type.DOCUMENT;
- break;
- case net.sf.saxon.type.Type.ELEMENT:
- type = Type.ELEMENT;
- break;
- case net.sf.saxon.type.Type.TEXT:
- type = Type.TEXT;
- break;
- }
+ type = getType(info);
}
Item next = iter.next();
if (next != null) {
@@ -450,17 +590,29 @@
@Override
public void translate(Writer writer) throws TransformerException,
IOException {
- Properties props = new Properties();
- props.setProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
- //props.setProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
- props.setProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
//$NON-NLS-1$
- QueryResult.serializeSequence(iter.getAnother(), config, writer, props);
+ QueryResult.serializeSequence(iter.getAnother(), config, writer,
DEFAULT_OUTPUT_PROPERTIES);
}
});
XMLType value = new XMLType(xml);
value.setType(type);
return value;
}
+
+ public static XMLType.Type getType(NodeInfo info) {
+ switch (info.getNodeKind()) {
+ case net.sf.saxon.type.Type.DOCUMENT:
+ return Type.DOCUMENT;
+ case net.sf.saxon.type.Type.ELEMENT:
+ return Type.ELEMENT;
+ case net.sf.saxon.type.Type.TEXT:
+ return Type.TEXT;
+ case net.sf.saxon.type.Type.COMMENT:
+ return Type.COMMENT;
+ case net.sf.saxon.type.Type.PROCESSING_INSTRUCTION:
+ return Type.PI;
+ }
+ return Type.CONTENT;
+ }
public Configuration getConfig() {
return config;
@@ -477,5 +629,9 @@
showArcs(sb, node, level + 1);
}
}
+
+ public boolean isStreaming() {
+ return streamingPathFilter != null;
+ }
}
Copied: trunk/engine/src/main/java/org/teiid/query/xquery/saxon/StreamingUtils.java (from
rev 3275,
branches/7.4.x/engine/src/main/java/org/teiid/query/xquery/saxon/StreamingUtils.java)
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/xquery/saxon/StreamingUtils.java
(rev 0)
+++ trunk/engine/src/main/java/org/teiid/query/xquery/saxon/StreamingUtils.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,322 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.query.xquery.saxon;
+
+import java.io.IOException;
+import java.util.Map;
+
+import net.sf.saxon.AugmentedSource;
+import net.sf.saxon.Configuration;
+import net.sf.saxon.event.ContentHandlerProxy;
+import net.sf.saxon.event.PipelineConfiguration;
+import net.sf.saxon.event.ProxyReceiver;
+import net.sf.saxon.event.Receiver;
+import net.sf.saxon.om.Name11Checker;
+import net.sf.saxon.om.NodeInfo;
+import net.sf.saxon.trans.XPathException;
+import nu.xom.DocType;
+import nu.xom.Node;
+import nux.xom.xquery.StreamingPathFilter;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.DTDHandler;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotRecognizedException;
+import org.xml.sax.SAXNotSupportedException;
+import org.xml.sax.XMLReader;
+import org.xml.sax.ext.LexicalHandler;
+
+final class StreamingUtils {
+ /**
+ * Converts a xom node into something readable by Saxon
+ * @param node
+ * @param config
+ * @return
+ */
+ static NodeInfo wrap(Node node, Configuration config) {
+ if (node == null)
+ throw new IllegalArgumentException("node must not be null"); //$NON-NLS-1$
+ if (node instanceof DocType)
+ throw new IllegalArgumentException("DocType can't be queried by
XQuery/XPath"); //$NON-NLS-1$
+
+ Node root = node;
+ while (root.getParent() != null) {
+ root = root.getParent();
+ }
+
+ DocumentWrapper docWrapper = new DocumentWrapper(root, root.getBaseURI(), config);
+
+ return docWrapper.wrap(node);
+ }
+
+ /**
+ * Pre-parser that adds validation and handles a default name space
+ *
+ * TODO: add support for more general paths including node tests
+ * this could be done as a secondary expression applied to the
+ * context item
+ *
+ * @param locationPath
+ * @param prefixMap
+ * @return
+ */
+ public static StreamingPathFilter getStreamingPathFilter(String locationPath,
Map<String, String> prefixMap) {
+ if (locationPath.indexOf("//") >= 0) //$NON-NLS-1$
+ throw new IllegalArgumentException("DESCENDANT axis is not supported");
//$NON-NLS-1$
+
+ String path = locationPath.trim();
+ if (path.startsWith("/")) path = path.substring(1); //$NON-NLS-1$
+ if (path.endsWith("/")) path = path.substring(0, path.length() - 1);
//$NON-NLS-1$
+ path = path.trim();
+ String[] localNames = path.split("/"); //$NON-NLS-1$
+
+ if (localNames.length == 1) {
+ throw new IllegalArgumentException(locationPath + " refers to only the root
element"); //$NON-NLS-1$
+ }
+
+ String fixedPath = ""; //$NON-NLS-1$
+
+ // parse prefix:localName pairs and resolve prefixes to namespaceURIs
+ for (int i = 0; i < localNames.length; i++) {
+ fixedPath += "/"; //$NON-NLS-1$
+ int k = localNames[i].indexOf(':');
+ if (k >= 0 && localNames[i].indexOf(':', k+1) >= 0)
+ throw new IllegalArgumentException(
+ "QName must not contain more than one colon: " //$NON-NLS-1$
+ + "qname='" + localNames[i] + "', path='" + path +
"'"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ if (k <= 0) {
+ fixedPath += " :"; //$NON-NLS-1$
+ } else {
+ String prefix = localNames[i].substring(0, k).trim();
+ if (k >= localNames[i].length() - 1)
+ throw new IllegalArgumentException(
+ "Missing localName for prefix: " + "prefix='" //$NON-NLS-1$
//$NON-NLS-2$
+ + prefix + "', path='" + path + "', prefixes=" +
prefixMap); //$NON-NLS-1$ //$NON-NLS-2$
+ fixedPath += prefix + ":"; //$NON-NLS-1$
+ } // end if
+
+ localNames[i] = localNames[i].substring(k + 1).trim();
+ if (!localNames[i].equals("*") &&
!Name11Checker.getInstance().isValidNCName(localNames[i])) { //$NON-NLS-1$
+ throw new IllegalArgumentException(localNames[i] + " is not a valid local
name."); //$NON-NLS-1$
+ }
+ fixedPath += localNames[i];
+ }
+ return new StreamingPathFilter(fixedPath, prefixMap);
+ }
+
+}
+
+/**
+ * An {@link XMLReader} designed to bridge between the Saxon document projection logic
and the XOM/NUX streaming logic.
+ */
+final class SaxonReader implements XMLReader {
+
+ private ContentHandler handler;
+ private LexicalHandler lexicalHandler;
+
+ private Configuration config;
+ private AugmentedSource source;
+
+ public SaxonReader(Configuration config, AugmentedSource source) {
+ this.config = config;
+ this.source = source;
+ }
+
+ @Override
+ public void setProperty(String name, Object value)
+ throws SAXNotRecognizedException, SAXNotSupportedException {
+ if ("http://xml.org/sax/properties/lexical-handler".equals(name)) {
//$NON-NLS-1$
+ this.lexicalHandler = (LexicalHandler) value;
+ }
+ }
+
+ @Override
+ public void setFeature(String name, boolean value)
+ throws SAXNotRecognizedException, SAXNotSupportedException {
+ }
+
+ @Override
+ public void setErrorHandler(ErrorHandler handler) {
+ throw new UnsupportedOperationException();
+
+ }
+
+ @Override
+ public void setEntityResolver(EntityResolver resolver) {
+ throw new UnsupportedOperationException();
+
+ }
+
+ @Override
+ public void setDTDHandler(DTDHandler handler) {
+
+ }
+
+ @Override
+ public void setContentHandler(ContentHandler handler) {
+ this.handler = handler;
+ }
+
+ @Override
+ public void parse(String systemId) throws IOException, SAXException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void parse(InputSource input) throws IOException, SAXException {
+ ContentHandlerProxy chp = new ContentHandlerProxy();
+ chp.setLexicalHandler(lexicalHandler);
+ chp.setUnderlyingContentHandler(handler);
+ this.source.addFilter(new ContentHandlerProxyReceiver(chp));
+ try {
+ config.buildDocument(source);
+ } catch (XPathException e) {
+ throw new SAXException(e);
+ }
+ }
+
+ @Override
+ public Object getProperty(String name) throws SAXNotRecognizedException,
+ SAXNotSupportedException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean getFeature(String name) throws SAXNotRecognizedException,
+ SAXNotSupportedException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ErrorHandler getErrorHandler() {
+ return null;
+ }
+
+ @Override
+ public EntityResolver getEntityResolver() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public DTDHandler getDTDHandler() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public ContentHandler getContentHandler() {
+ return this.handler;
+ }
+
+}
+
+/**
+ * Adapts the {@link ContentHandlerProxy} to be a {@link ProxyReceiver}
+ */
+final class ContentHandlerProxyReceiver extends ProxyReceiver {
+
+ private Receiver reciever;
+
+ public ContentHandlerProxyReceiver(Receiver reciever) {
+ this.reciever = reciever;
+ }
+
+ public void attribute(int nameCode, int typeCode, CharSequence value,
+ int locationId, int properties) throws XPathException {
+ reciever.attribute(nameCode, typeCode, value, locationId,
+ properties);
+ }
+
+ public void characters(CharSequence chars, int locationId,
+ int properties) throws XPathException {
+ reciever.characters(chars, locationId, properties);
+ }
+
+ public void close() throws XPathException {
+ reciever.close();
+ }
+
+ public void comment(CharSequence content, int locationId, int properties)
+ throws XPathException {
+ reciever.comment(content, locationId, properties);
+ }
+
+ public void endDocument() throws XPathException {
+ reciever.endDocument();
+ }
+
+ public void endElement() throws XPathException {
+ reciever.endElement();
+ }
+
+ public PipelineConfiguration getPipelineConfiguration() {
+ return reciever.getPipelineConfiguration();
+ }
+
+ public String getSystemId() {
+ return reciever.getSystemId();
+ }
+
+ public void namespace(int namespaceCode, int properties)
+ throws XPathException {
+ reciever.namespace(namespaceCode, properties);
+ }
+
+ public void open() throws XPathException {
+ reciever.open();
+ }
+
+ public void processingInstruction(String name, CharSequence data,
+ int locationId, int properties) throws XPathException {
+ reciever.processingInstruction(name, data, locationId, properties);
+ }
+
+ public void setPipelineConfiguration(PipelineConfiguration config) {
+ reciever.setPipelineConfiguration(config);
+ }
+
+ public void setSystemId(String systemId) {
+ reciever.setSystemId(systemId);
+ }
+
+ public void setUnparsedEntity(String name, String systemID,
+ String publicID) throws XPathException {
+ reciever.setUnparsedEntity(name, systemID, publicID);
+ }
+
+ public void startContent() throws XPathException {
+ reciever.startContent();
+ }
+
+ public void startDocument(int properties) throws XPathException {
+ reciever.startDocument(properties);
+ }
+
+ public void startElement(int nameCode, int typeCode, int locationId,
+ int properties) throws XPathException {
+ reciever.startElement(nameCode, typeCode, locationId, properties);
+ }
+
+}
\ No newline at end of file
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2011-06-28 03:47:29
UTC (rev 3280)
@@ -901,7 +901,8 @@
datasource_not_found=Data Source {0} not accessible.
RequestWorkItem.cache_nondeterministic=Caching command "{0}" at a session
level, but less deterministic functions were evaluated.
-not_found_cache=Failed to restore results
+not_found_cache=Failed to restore results, since batch entries were missing. The entry
will be re-populated.
+unexpected_exception_restoring_results=Failed to restore results. The entry will be
re-populated.
failed_to_cache=Failed to store the result set contents to disk.
failed_to_unwrap_connection=Failed to unwrap the source connection.
connection_factory_not_found=Failed to find the Connection Factory with JNDI name {0}.
Please check the name or deploy the Connection Factory with specified name.
@@ -913,6 +914,7 @@
MultiSource.out_procedure=The multisource plan must execute a procedure returning
parameter values exactly 1: {0}
FunctionMethods.not_array_value=Expected a java.sql.Array, or java array type, but got:
{0}
+FunctionMethods.unknown_level=Unknown log level: {0}, expected one of {1}
FunctionMethods.array_index=Array index out of range: {0}
ArrayTableNode.conversion_error=Could not convert value for column: {0}
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/common/buffer/BufferManagerFactory.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -58,16 +58,35 @@
}
public static BufferManagerImpl createBufferManager() {
- BufferManagerImpl bufferMgr = new BufferManagerImpl();
- try {
- bufferMgr.initialize();
+ return initBufferManager(new BufferManagerImpl());
+ }
+
+ public static BufferManagerImpl getTestBufferManager(long bytesAvailable, int
procBatchSize, int connectorBatchSize) {
+ BufferManagerImpl bufferManager = new BufferManagerImpl();
+ bufferManager.setProcessorBatchSize(procBatchSize);
+ bufferManager.setConnectorBatchSize(connectorBatchSize);
+ bufferManager.setMaxProcessingKB((int) (bytesAvailable/1024));
+ bufferManager.setMaxReserveKB((int) (bytesAvailable/1024));
+ return initBufferManager(bufferManager);
+ }
+
+ public static BufferManagerImpl getTestBufferManager(long bytesAvailable, int
procBatchSize) {
+ BufferManagerImpl bufferManager = new BufferManagerImpl();
+ bufferManager.setProcessorBatchSize(procBatchSize);
+ bufferManager.setMaxProcessingKB((int) (bytesAvailable/1024));
+ bufferManager.setMaxReserveKB((int) (bytesAvailable/1024));
+ return initBufferManager(bufferManager);
+ }
+
+ public static BufferManagerImpl initBufferManager(BufferManagerImpl bufferManager) {
+ try {
+ bufferManager.initialize();
} catch (TeiidComponentException e) {
throw new RuntimeException(e);
}
-
- // Add unmanaged memory storage manager
- bufferMgr.setStorageManager(new MemoryStorageManager());
- return bufferMgr;
+
+ bufferManager.setStorageManager(new MemoryStorageManager());
+ return bufferManager;
}
}
Copied: trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java (from
rev 3275,
branches/7.4.x/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java)
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java
(rev 0)
+++
trunk/engine/src/test/java/org/teiid/common/buffer/impl/TestSizeUtility.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -0,0 +1,185 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * See the COPYRIGHT.txt file distributed with this work for information
+ * regarding copyright ownership. Some portions may be licensed
+ * to Red Hat, Inc. under one or more contributor license agreements.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301 USA.
+ */
+
+package org.teiid.common.buffer.impl;
+
+import static org.junit.Assert.*;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import org.teiid.common.buffer.TupleBatch;
+
+public class TestSizeUtility {
+
+ public void helpTestGetStaticSize(Object obj, long expectedSize) {
+ helpTestGetSize(obj, expectedSize);
+ }
+
+ public void helpTestGetSize(Object obj, long expectedSize) {
+ long actualSize = new SizeUtility().getSize(obj, true, false);
+ assertEquals("Got unexpected size: ", expectedSize, actualSize);
//$NON-NLS-1$
+ }
+
+ @Test public void testGetSizeChar() {
+ helpTestGetStaticSize(new Character('a'), 10);
+ }
+
+ @Test public void testGetSizeBoolean() {
+ helpTestGetStaticSize(Boolean.TRUE, 1);
+ }
+
+ @Test public void testGetSizeByte() {
+ helpTestGetStaticSize(new Byte((byte)0), 1);
+ }
+
+ @Test public void testGetSizeShort() {
+ helpTestGetStaticSize(new Short((short)0), 10);
+ }
+
+ @Test public void testGetSizeInteger() {
+ helpTestGetStaticSize(new Integer(0), 12);
+ }
+
+ @Test public void testGetSizeLong() {
+ helpTestGetStaticSize(new Long(0l), 16);
+ }
+
+ @Test public void testGetSizeFloat() {
+ helpTestGetStaticSize(new Float(0), 12);
+ }
+
+ @Test public void testGetSizeDouble() {
+ helpTestGetStaticSize(new Double(0), 16);
+ }
+
+ @Test public void testGetSizeTimestamp() {
+ helpTestGetStaticSize(new Timestamp(12301803), 28);
+ }
+
+ @Test public void testGetSizeDate() {
+ helpTestGetStaticSize(new Date(12301803), 28);
+ }
+
+ @Test public void testGetSizeTime() {
+ helpTestGetStaticSize(new Time(12301803), 28);
+ }
+
+ @Test public void testGetSizeEmptyString() {
+ helpTestGetSize("", 40); //$NON-NLS-1$
+ }
+
+ @Test public void testGetSizeShortString() {
+ helpTestGetSize("abcdefghij", 64); //$NON-NLS-1$
+ }
+
+ public void XtestGetSizeLongString() {
+ // There is no clear way of figuring out the actual size of a string that is
created
+ // from a StringBuffer because the buffer can sometimes be twice as big as the
actual length of the string
+ // Since the data comin from the connector is not created this way, this test is
an inaccurate setup
+ int size = 10000;
+ StringBuffer str = new StringBuffer();
+ for(int i=0; i<size; i++) {
+ str.append("a"); //$NON-NLS-1$
+ }
+ helpTestGetSize(str.toString(), size+3);
+ }
+
+ @Test public void testGetSizeRow1() {
+ List<Object> row = new ArrayList<Object>(1);
+ row.add(new Integer(0));
+ helpTestGetStaticSize(row, 36);
+ }
+
+ @Test public void testGetSizeRow2() {
+ List<Object> row = new ArrayList<Object>(4);
+ row.add(new Integer(0));
+ row.add(new Integer(101));
+ row.add(Boolean.TRUE);
+ row.add(new Double(1091203.00));
+ helpTestGetStaticSize(row, 89);
+ }
+
+ @Test public void testGetSizeRows1() {
+ helpTestGetStaticSize(new List[] { }, 16);
+ }
+
+ @Test public void testGetSizeRows2() {
+ List<Object> row1 = new ArrayList<Object>(2);
+ row1.add(new Integer(0));
+ row1.add(new Integer(100));
+
+ List<Object> row2 = new ArrayList<Object>(2);
+ row2.add(new Integer(0));
+ row2.add(new Integer(100));
+
+ helpTestGetStaticSize(new List[] { row1, row2 }, 144);
+ }
+
+ @Test public void testGetSizeBigInteger() {
+ BigInteger b = BigInteger.ONE;
+
+ helpTestGetStaticSize(b, 48);
+ }
+
+ @Test public void testGetSizeBigDecimal() {
+ BigDecimal bd = new BigDecimal("1.0"); //$NON-NLS-1$
+
+ helpTestGetStaticSize(bd, 96);
+ }
+
+ @Test public void testGetSizeByteArray() {
+ byte[] bytes = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
+ helpTestGetSize(bytes, 32);
+ }
+
+ @Test public void testResultSet() {
+ List<?>[] expected = new List[] {
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(3) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(0),
Boolean.FALSE, new Double(2.0), "a", new Integer(3) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(3),
Boolean.TRUE, new Double(7.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(3),
Boolean.TRUE, new Double(7.0), "a", new Integer(0) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "a", new Integer(3),
Boolean.TRUE, new Double(7.0), "a", new Integer(3) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "b", new Integer(2),
Boolean.FALSE, new Double(0.0), "b", new Integer(2) }), //$NON-NLS-1$
//$NON-NLS-2$
+ Arrays.asList(new Object[] { "c", new Integer(1),
Boolean.FALSE, new Double(0.0), "c", new Integer(1) }) //$NON-NLS-1$
//$NON-NLS-2$
+ };
+
+ String[] types = {"string", "integer", "boolean",
"double", "string", "integer"};
//$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$ //$NON-NLS-5$//$NON-NLS-6$
+
+ TupleBatch tb = new TupleBatch(1, expected);
+ tb.setDataTypes(types);
+ long actualSize = new SizeUtility().getBatchSize(tb);
+ assertEquals("Got unexpected size: ", 2667, actualSize); //$NON-NLS-1$
+ }
+
+}
\ No newline at end of file
Modified:
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestAuthorizationValidationVisitor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -29,8 +29,7 @@
import java.util.HashSet;
import java.util.Set;
-import org.junit.BeforeClass;
-import org.junit.Ignore;
+import org.junit.Before;
import org.junit.Test;
import org.teiid.adminapi.DataPolicy;
import org.teiid.adminapi.DataPolicy.PermissionType;
@@ -40,7 +39,6 @@
import org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData;
import org.teiid.api.exception.query.QueryParserException;
import org.teiid.api.exception.query.QueryResolverException;
-import org.teiid.api.exception.query.QueryValidatorException;
import org.teiid.core.TeiidComponentException;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.parser.QueryParser;
@@ -58,10 +56,12 @@
public class TestAuthorizationValidationVisitor {
public static final String CONN_ID = "connID"; //$NON-NLS-1$
- private static CommandContext context = new CommandContext();
+ private CommandContext context;
- @BeforeClass public static void oneTimeSetup() {
+ @Before public void setup() {
+ context = new CommandContext();
context.setSession(new SessionMetadata());
+ context.setDQPWorkContext(new DQPWorkContext());
}
PermissionMetaData addResource(PermissionType type, boolean flag, String resource) {
@@ -179,9 +179,10 @@
HashMap<String, DataPolicy> policies = new HashMap<String,
DataPolicy>();
policies.put(policy.getName(), policy);
-
- AuthorizationValidationVisitor visitor = new
AuthorizationValidationVisitor(policies, context); //$NON-NLS-1$
- visitor.setAllowFunctionCallsByDefault(false);
+ this.context.getDQPWorkContext().setPolicies(policies);
+ DataRolePolicyDecider dataRolePolicyDecider = new DataRolePolicyDecider();
+ dataRolePolicyDecider.setAllowFunctionCallsByDefault(false);
+ AuthorizationValidationVisitor visitor = new
AuthorizationValidationVisitor(dataRolePolicyDecider, context); //$NON-NLS-1$
ValidatorReport report = Validator.validate(command, metadata, visitor);
if(report.hasItems()) {
ValidatorFailure firstFailure = report.getItems().iterator().next();
@@ -289,11 +290,11 @@
}
@Test public void testSelectIntoTarget_e1_NotAccessible() throws Exception {
- helpTest(exampleAuthSvc2(), "SELECT e1, e2, e3, e4 INTO pm2.g2 FROM
pm2.g1", RealMetadataFactory.example1Cached(), new String[]
{"pm2.g2.e2","pm2.g2.e4","pm2.g2.e3"},
RealMetadataFactory.example1VDB()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
//$NON-NLS-4$
+ helpTest(exampleAuthSvc2(), "SELECT e1, e2, e3, e4 INTO pm2.g2 FROM
pm2.g1", RealMetadataFactory.example1Cached(), new String[] {"pm2.g2",
"pm2.g2.e2","pm2.g2.e4","pm2.g2.e3"},
RealMetadataFactory.example1VDB()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
//$NON-NLS-4$
}
@Test public void testSelectIntoTarget_e1e2_NotAccessible() throws Exception {
- helpTest(exampleAuthSvc2(), "SELECT e1, e2, e3, e4 INTO pm3.g2 FROM
pm2.g1", RealMetadataFactory.example1Cached(), new String[] {"pm3.g2.e4",
"pm3.g2.e3"},RealMetadataFactory.example1VDB()); //$NON-NLS-1$ //$NON-NLS-2$
//$NON-NLS-3$
+ helpTest(exampleAuthSvc2(), "SELECT e1, e2, e3, e4 INTO pm3.g2 FROM
pm2.g1", RealMetadataFactory.example1Cached(), new String[] {"pm3.g2",
"pm3.g2.e4", "pm3.g2.e3"},RealMetadataFactory.example1VDB());
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
@Test public void testTempTableSelectInto() throws Exception {
@@ -326,28 +327,4 @@
helpTest(examplePolicyBQT(), "alter trigger on SmallA_2589 INSTEAD OF UPDATE
enabled", RealMetadataFactory.exampleBQTCached(), new String[] {},
RealMetadataFactory.exampleBQTVDB()); //$NON-NLS-1$ //$NON-NLS-2$
}
- private void helpTestLookupVisibility(boolean visible) throws QueryParserException,
QueryValidatorException, TeiidComponentException {
- VDBMetaData vdb = RealMetadataFactory.example1VDB();
- vdb.getModel("pm1").setVisible(visible); //$NON-NLS-1$
- AuthorizationValidationVisitor mvvv = new AuthorizationValidationVisitor(new
HashMap<String, DataPolicy>(), context); //$NON-NLS-1$
- String sql = "select lookup('pm1.g1', 'e1', 'e2',
1)"; //$NON-NLS-1$
- Command command = QueryParser.getQueryParser().parseCommand(sql);
- Request.validateWithVisitor(mvvv, RealMetadataFactory.example1Cached(), command);
- }
-
- @Ignore("visibility no longer ristricts access")
- @Test public void testLookupVisibility() throws Exception {
- helpTestLookupVisibility(true);
- }
-
- @Ignore("visibility no longer ristricts access")
- @Test public void testLookupVisibilityFails() throws Exception {
- try {
- helpTestLookupVisibility(false);
- fail("expected exception"); //$NON-NLS-1$
- } catch (QueryValidatorException e) {
- assertEquals("Group does not exist: pm1.g1", e.getMessage()); //$NON-NLS-1$
- }
- }
-
}
Modified:
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCachedResults.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCachedResults.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestCachedResults.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -92,7 +92,7 @@
RealMetadataFactory.buildWorkContext(RealMetadataFactory.exampleBQT());
- cachedResults.restore(cache, bm);
+ assertTrue(cachedResults.restore(cache, bm));
// since restored, simulate a async cache flush
cache.clear();
@@ -106,5 +106,10 @@
assertArrayEquals(tb.getBatch(1).getAllTuples(), cachedTb.getBatch(1).getAllTuples());
assertArrayEquals(tb.getBatch(9).getAllTuples(), cachedTb.getBatch(9).getAllTuples());
assertTrue(ts - cachedResults.getAccessInfo().getCreationTime() <= 5000);
+
+ //ensure that an incomplete load fails
+ cache.remove(results.getId()+","+1); //$NON-NLS-1$
+ cachedResults = UnitTestUtil.helpSerialize(results);
+ assertFalse(cachedResults.restore(cache, bm));
}
}
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -41,9 +41,13 @@
import org.teiid.client.RequestMessage;
import org.teiid.client.ResultsMessage;
import org.teiid.client.RequestMessage.StatementType;
+import org.teiid.client.lob.LobChunk;
+import org.teiid.client.util.ResultsFuture;
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.common.buffer.impl.BufferManagerImpl;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.types.BlobType;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.FakeTransactionService;
import org.teiid.dqp.internal.process.AbstractWorkItem.ThreadState;
@@ -57,7 +61,41 @@
@SuppressWarnings("nls")
public class TestDQPCore {
- private DQPCore core;
+ private final class LobThread extends Thread {
+ BlobType bt;
+ private final RequestMessage reqMsg;
+ volatile ResultsFuture<LobChunk> chunkFuture;
+ protected DQPWorkContext workContext;
+
+ private LobThread(RequestMessage reqMsg) {
+ this.reqMsg = reqMsg;
+ }
+
+ @Override
+ public void run() {
+ synchronized (this) {
+ while (workContext == null) {
+ try {
+ this.wait();
+ } catch (InterruptedException e) {
+ }
+ }
+ }
+ workContext.runInContext(new Runnable() {
+
+ @Override
+ public void run() {
+ try {
+ chunkFuture = core.requestNextLobChunk(1, reqMsg.getExecutionId(),
bt.getReferenceStreamId());
+ } catch (TeiidProcessingException e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+ }
+
+ private DQPCore core;
private DQPConfiguration config;
private AutoGenDataService agds;
@@ -411,6 +449,34 @@
assertEquals(1, this.core.getRsCache().getCacheHitCount());
}
+ @Test public void testLobConcurrency() throws Exception {
+ RequestMessage reqMsg = exampleRequestMessage("select to_bytes(stringkey,
'utf-8') FROM BQT1.SmallA");
+ reqMsg.setTxnAutoWrapMode(RequestMessage.TXN_WRAP_OFF);
+ agds.setSleep(100);
+ ResultsFuture<ResultsMessage> message =
core.executeRequest(reqMsg.getExecutionId(), reqMsg);
+ final LobThread t = new LobThread(reqMsg);
+ t.start();
+ message.addCompletionListener(new
ResultsFuture.CompletionListener<ResultsMessage>() {
+ @Override
+ public void onCompletion(ResultsFuture<ResultsMessage> future) {
+ try {
+ final BlobType bt = (BlobType)future.get().getResults()[0].get(0);
+ t.bt = bt;
+ t.workContext = DQPWorkContext.getWorkContext();
+ synchronized (t) {
+ t.notify();
+ }
+ Thread.sleep(100); //give the Thread a chance to run
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ });
+ message.get();
+ t.join();
+ assertNotNull(t.chunkFuture.get().getBytes());
+ }
+
public void helpTestVisibilityFails(String sql) throws Exception {
RequestMessage reqMsg = exampleRequestMessage(sql);
reqMsg.setTxnAutoWrapMode(RequestMessage.TXN_WRAP_OFF);
Modified:
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -242,7 +242,9 @@
serverRequest.initialize(request,
BufferManagerFactory.getStandaloneBufferManager(), null, new FakeTransactionService(),
null, workContext, prepPlanCache);
serverRequest.setMetadata(capFinder, metadata, null);
- serverRequest.setAuthorizationValidator(new DataRoleAuthorizationValidator(false,
true, true));
+ DefaultAuthorizationValidator drav = new DefaultAuthorizationValidator();
+ drav.setEnabled(false);
+ serverRequest.setAuthorizationValidator(drav);
serverRequest.processRequest();
assertNotNull(serverRequest.processPlan);
Modified: trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestRequest.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -82,7 +82,12 @@
request.initialize(message, BufferManagerFactory.getStandaloneBufferManager(),
null,new FakeTransactionService(), TEMP_TABLE_STORE, workContext, null);
request.initMetadata();
- request.setAuthorizationValidator(new DataRoleAuthorizationValidator(true, true,
true));
+ DefaultAuthorizationValidator drav = new DefaultAuthorizationValidator();
+ DataRolePolicyDecider drpd = new DataRolePolicyDecider();
+ drpd.setAllowCreateTemporaryTablesByDefault(true);
+ drpd.setAllowFunctionCallsByDefault(true);
+ drav.setPolicyDecider(drpd);
+ request.setAuthorizationValidator(drav);
request.validateAccess(command);
}
@@ -136,7 +141,9 @@
request.initialize(message, Mockito.mock(BufferManager.class),
new FakeDataManager(), new FakeTransactionService(), TEMP_TABLE_STORE, workContext,
null);
- request.setAuthorizationValidator(new DataRoleAuthorizationValidator(false, true,
true));
+ DefaultAuthorizationValidator drav = new DefaultAuthorizationValidator();
+ drav.setEnabled(false);
+ request.setAuthorizationValidator(drav);
request.processRequest();
return request;
}
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -898,6 +898,64 @@
}
/**
+ * pushdown won't happen since searched case is not supported
+ */
+ @Test public void testPushDownOverUnionGroupingExpression() throws Exception {
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = getAggregateCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_SEARCHED_CASE, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+ capFinder.addCapabilities("pm2", getAggregateCapabilities());
//$NON-NLS-1$
+
+ ProcessorPlan plan = TestOptimizer.helpPlan("select max(e2), case when e1 is
null then 0 else 1 end from (select e1, e2 from pm1.g1 union all select e1, e2 from
pm2.g2) z group by case when e1 is null then 0 else 1 end",
RealMetadataFactory.example1Cached(), null, capFinder, //$NON-NLS-1$
+ new String[]{"SELECT v_1.c_0, MAX(v_1.c_1) FROM (SELECT CASE WHEN
v_0.c_0 IS NULL THEN 0 ELSE 1 END AS c_0, v_0.c_1 FROM (SELECT g_0.e1 AS c_0, g_0.e2 AS
c_1 FROM pm1.g1 AS g_0) AS v_0) AS v_1 GROUP BY v_1.c_0", //$NON-NLS-1$
+ "SELECT g_0.e1, g_0.e2 FROM pm2.g2 AS g_0"},
ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ TestOptimizer.checkNodeTypes(plan, new int[] {
+ 2, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 0, // DependentProject
+ 0, // DupRemove
+ 1, // Grouping
+ 0, // NestedLoopJoinStrategy
+ 0, // MergeJoinStrategy
+ 0, // Null
+ 0, // PlanExecution
+ 3, // Project
+ 0, // Select
+ 0, // Sort
+ 1 // UnionAll
+ });
+ }
+
+ @Test public void testPushDownOverUnionGroupingExpressionPartitioned() throws
Exception {
+ FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder();
+ BasicSourceCapabilities caps = getAggregateCapabilities();
+ caps.setCapabilitySupport(Capability.QUERY_SEARCHED_CASE, true);
+ capFinder.addCapabilities("pm1", caps); //$NON-NLS-1$
+
+ ProcessorPlan plan = TestOptimizer.helpPlan("select max(e2), case when e1 is
null then 0 else 1 end from (select e1, e2, 1 as part from pm1.g1 union all select e1, e2,
2 as part from pm1.g2) z group by case when e1 is null then 0 else 1 end, part",
RealMetadataFactory.example1Cached(), null, capFinder, //$NON-NLS-1$
+ new String[]{"SELECT MAX(v_1.c_2), v_1.c_0 FROM (SELECT CASE WHEN
v_0.c_0 IS NULL THEN 0 ELSE 1 END AS c_0, v_0.c_1, v_0.c_2 FROM (SELECT g_0.e1 AS c_0, 2
AS c_1, g_0.e2 AS c_2 FROM pm1.g2 AS g_0) AS v_0) AS v_1 GROUP BY v_1.c_0, v_1.c_1",
+ "SELECT MAX(v_1.c_2), v_1.c_0 FROM (SELECT CASE WHEN v_0.c_0 IS NULL THEN 0
ELSE 1 END AS c_0, v_0.c_1, v_0.c_2 FROM (SELECT g_0.e1 AS c_0, 1 AS c_1, g_0.e2 AS c_2
FROM pm1.g1 AS g_0) AS v_0) AS v_1 GROUP BY v_1.c_0, v_1.c_1"},
ComparisonMode.EXACT_COMMAND_STRING); //$NON-NLS-1$
+ TestOptimizer.checkNodeTypes(plan, new int[] {
+ 2, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 0, // DependentProject
+ 0, // DupRemove
+ 0, // Grouping
+ 0, // NestedLoopJoinStrategy
+ 0, // MergeJoinStrategy
+ 0, // Null
+ 0, // PlanExecution
+ 1, // Project
+ 0, // Select
+ 0, // Sort
+ 1 // UnionAll
+ });
+ }
+
+ /**
* Ensures that we do not raise criteria over a group by
* TODO: check if the criteria only depends on grouping columns
*/
Property changes on:
trunk/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestAggregatePushdown.java:3149-3217,3220-3275
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -793,9 +793,9 @@
TransformationMetadata metadata = RealMetadataFactory.exampleBQT();
RealMetadataFactory.setCardinality("bqt1.smalla", 1000, metadata);
//$NON-NLS-1$
RealMetadataFactory.setCardinality("bqt2.smalla", 10000, metadata);
//$NON-NLS-1$
- Column fmo = (Column)metadata.getElementID("bqt1.smalla.intnum");
+ Column fmo = metadata.getElementID("bqt1.smalla.intnum");
fmo.setDistinctValues(1000);
- Column floatnum =
(Column)metadata.getElementID("bqt1.smalla.floatnum");
+ Column floatnum = metadata.getElementID("bqt1.smalla.floatnum");
floatnum.setDistinctValues(800);
ProcessorPlan plan = TestOptimizer.helpPlan(
Property changes on:
trunk/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestDependentJoins.java:3149-3217,3220-3275
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -2122,7 +2122,7 @@
"SELECT MAX(sa.datevalue) FROM bqt1.smalla AS sb " + //$NON-NLS-1$
"WHERE (sb.intkey = sa.intkey) AND (sa.stringkey = sb.stringkey)
))"; //$NON-NLS-1$
- String sqlOut = "SELECT g_0.intkey FROM bqt1.smalla AS g_0 WHERE (g_0.intkey
= 46) AND (g_0.stringkey = '46') AND (g_0.datevalue = (SELECT g_0.datevalue FROM
bqt1.smalla AS g_1 WHERE (g_1.intkey = g_0.intkey) AND (g_1.stringkey =
g_0.stringkey)))"; //$NON-NLS-1$
+ String sqlOut = "SELECT g_0.intkey FROM bqt1.smalla AS g_0 WHERE (g_0.intkey
= 46) AND (g_0.stringkey = '46') AND (g_0.datevalue = (SELECT MAX(g_0.datevalue)
FROM bqt1.smalla AS g_1 WHERE (g_1.intkey = g_0.intkey) AND (g_1.stringkey =
g_0.stringkey)))"; //$NON-NLS-1$
ProcessorPlan plan = helpPlan(sqlIn,
RealMetadataFactory.exampleBQTCached(),
@@ -6587,6 +6587,26 @@
null, null, false); //$NON-NLS-1$
}
+ @Test public void testUnnamedAggInView() throws Exception {
+ MetadataStore metadataStore = new MetadataStore();
+
+ Schema bqt1 = RealMetadataFactory.createPhysicalModel("BQT1",
metadataStore); //$NON-NLS-1$
+ Schema vqt = RealMetadataFactory.createVirtualModel("VQT",
metadataStore); //$NON-NLS-1$
+
+ Table bqt1SmallA = RealMetadataFactory.createPhysicalGroup("SmallA",
bqt1); //$NON-NLS-1$
+ RealMetadataFactory.createElement("col", bqt1SmallA,
DataTypeManager.DefaultDataTypes.STRING);
+
+ Table agg3 = RealMetadataFactory.createVirtualGroup("Agg3", vqt, new
QueryNode("select count(*) from smalla"));
+ RealMetadataFactory.createElement("count", agg3,
DataTypeManager.DefaultDataTypes.INTEGER);
+
+ TransformationMetadata metadata =
RealMetadataFactory.createTransformationMetadata(metadataStore, "x");
+ BasicSourceCapabilities bac = getTypicalCapabilities();
+ bac.setCapabilitySupport(Capability.QUERY_FROM_INLINE_VIEWS, true);
+ bac.setCapabilitySupport(Capability.QUERY_AGGREGATES_COUNT_STAR, true);
+ bac.setCapabilitySupport(Capability.QUERY_GROUP_BY, true);
+ helpPlan("select count(*) from agg3", metadata, new String[]
{"SELECT COUNT(*) FROM (SELECT COUNT(*) AS c_0 FROM BQT1.SmallA AS g_0) AS
v_0"}, new DefaultCapabilitiesFinder(bac), ComparisonMode.EXACT_COMMAND_STRING);
+ }
+
public static final boolean DEBUG = false;
}
Property changes on:
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptimizer.java:3149-3217,3220-3275
Modified: trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -347,7 +347,7 @@
}
/**
- * Union should prevent the removal from happening
+ * Union all should not prevent the removal from happening
*/
@Test public void testOptionalJoinWithUnion() {
ProcessorPlan plan = TestOptimizer.helpPlan("select pm1.g2.e4 from /*
optional */ pm1.g1 inner join pm1.g2 on pm1.g1.e1 = pm1.g2.e1 union all select
convert(pm1.g2.e2, double) from /* optional */ pm1.g1 inner join pm1.g2 on pm1.g1.e1 =
pm1.g2.e1", RealMetadataFactory.example1Cached(), //$NON-NLS-1$
@@ -371,6 +371,31 @@
});
}
+ /**
+ * The first branch should have the join removed, but not the second branch
+ */
+ @Test public void testOptionalJoinWithUnion1() {
+ ProcessorPlan plan = TestOptimizer.helpPlan("select e4 from (select e4, e2
from (select pm1.g2.e4, pm1.g1.e2 from /* optional */ pm1.g1 inner join pm1.g2 on
pm1.g1.e1 = pm1.g2.e1) as x union all select e4, e2 from (select convert(pm2.g1.e2,
double) as e4, pm2.g2.e2 from /* optional */ pm2.g1 inner join pm2.g2 on pm2.g1.e1 =
pm2.g2.e1) as x) as y", RealMetadataFactory.example1Cached(), //$NON-NLS-1$
+ new String[] {"SELECT pm1.g2.e4 FROM pm1.g2", "SELECT g_0.e2
FROM pm2.g1 AS g_0, pm2.g2 AS g_1 WHERE g_0.e1 = g_1.e1"} ); //$NON-NLS-1$
//$NON-NLS-2$
+
+ TestOptimizer.checkNodeTypes(plan, new int[] {
+ 2, // Access
+ 0, // DependentAccess
+ 0, // DependentSelect
+ 0, // DependentProject
+ 0, // DupRemove
+ 0, // Grouping
+ 0, // Join
+ 0, // MergeJoin
+ 0, // Null
+ 0, // PlanExecution
+ 1, // Project
+ 0, // Select
+ 0, // Sort
+ 1 // UnionAll
+ });
+ }
+
@Test public void testOptionalJoinWithCompoundCriteria() {
ProcessorPlan plan = TestOptimizer.helpPlan("SELECT length(z) FROM /*
optional */ pm1.g1 inner join (select e2 as y, e3 || 'x' as z from pm1.g1 ORDER BY
z) AS x on pm1.g1.e2=x.y and concat(x.y, x.z) = '1'",
RealMetadataFactory.example1Cached(), //$NON-NLS-1$
new String[] {"SELECT e3 FROM pm1.g1"} ); //$NON-NLS-1$
Property changes on:
trunk/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/optimizer/TestOptionalJoins.java:3149-3217,3220-3275
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -31,6 +31,8 @@
import java.util.List;
import org.junit.Test;
+import org.teiid.common.buffer.BufferManagerFactory;
+import org.teiid.common.buffer.impl.BufferManagerImpl;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.optimizer.TestAggregatePushdown;
import org.teiid.query.optimizer.TestOptimizer;
@@ -38,6 +40,7 @@
import org.teiid.query.optimizer.capabilities.FakeCapabilitiesFinder;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.unittest.RealMetadataFactory;
+import org.teiid.query.util.CommandContext;
import org.teiid.translator.SourceSystemFunctions;
@SuppressWarnings({"nls", "unchecked"})
@@ -372,5 +375,29 @@
// Run query
helpProcess(plan, dataManager, expected);
}
+
+ @Test public void testArrayAggOrderByPersistence() throws Exception {
+ // Create query
+ String sql = "SELECT array_agg(e2 order by e1) from pm1.g1 group by e3";
//$NON-NLS-1$
+ // Create expected results
+ List[] expected = new List[] {
+ Arrays.asList((Object)new Integer[] {1, 0, 0, 2}),
+ Arrays.asList((Object)new Integer[] {3, 1}),
+ };
+
+ // Construct data manager with data
+ FakeDataManager dataManager = new FakeDataManager();
+ sampleData1(dataManager);
+
+ // Plan query
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached());
+ CommandContext cc = TestProcessor.createCommandContext();
+ BufferManagerImpl impl = BufferManagerFactory.getTestBufferManager(0, 2);
+ impl.setUseWeakReferences(false);
+ cc.setBufferManager(impl);
+ // Run query
+ helpProcess(plan, cc, dataManager, expected);
+ }
+
}
Property changes on:
trunk/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestAggregateProcessing.java:3149-3217,3220-3275
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -320,7 +320,7 @@
List record = ts.nextTuple();
//handle xml
- if(record.size() == 1){
+ if(record.size() == 1 && expectedResults[i].size() == 1){
Object cellValue = record.get(0);
if(cellValue instanceof XMLType){
XMLType id = (XMLType)cellValue;
@@ -329,6 +329,9 @@
compareDocuments((String)expectedResults[i].get(0), actualDoc);
continue;
}
+ } else if (cellValue instanceof Object[]) {
+ assertArrayEquals((Object[])expectedResults[i].get(0),
(Object[])cellValue);
+ continue;
}
}
@@ -7530,7 +7533,6 @@
helpProcess(plan, dataManager, expected);
}
-
@Test public void testDupSelect() throws Exception {
String sql = "select e1, e1 from pm1.g1";
@@ -7555,5 +7557,18 @@
helpProcess(plan, dataManager, new List[] {Arrays.asList(1, 2)});
}
+ @Test public void testDupSelectWithOrderBy() throws Exception {
+ String sql = "select e1 as a, e1 as b from pm1.g1 order by b";
+
+ HardcodedDataManager dataManager = new HardcodedDataManager();
+
+ //note that the command is referencing c_0
+ dataManager.addData("SELECT g_0.e1 AS c_0 FROM pm1.g1 AS g_0 ORDER BY
c_0", new List[] {Arrays.asList(1)});
+
+ ProcessorPlan plan = helpGetPlan(sql, RealMetadataFactory.example1Cached(),
TestOptimizer.getGenericFinder());
+
+ helpProcess(plan, dataManager, new List[] {Arrays.asList(1, 1)});
+ }
+
private static final boolean DEBUG = false;
}
Property changes on:
trunk/engine/src/test/java/org/teiid/query/processor/TestProcessor.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestProcessor.java:3149-3217,3220-3275
Modified: trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -271,7 +271,27 @@
process(sql, expected);
}
+
+ @Test public void testXmlQueryEmptyNullString() throws Exception {
+ String sql = "select xmlquery('/a/b' passing xmlparse(document
'<x/>') null on empty)"; //$NON-NLS-1$
+
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList((String)null)
+ };
+ process(sql, expected);
+ }
+
+ @Test public void testXmlQueryStreaming() throws Exception {
+ String sql = "select xmlquery('/a/b' passing xmlparse(document
'<a><b x=''1''/><b
x=''2''/></a>') null on empty)"; //$NON-NLS-1$
+
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList("<b x=\"1\"/><b
x=\"2\"/>")
+ };
+
+ process(sql, expected);
+ }
+
@Test public void testXmlNameEscaping() throws Exception {
String sql = "select xmlforest(\"xml\") from (select 1 as
\"xml\") x"; //$NON-NLS-1$
@@ -371,6 +391,27 @@
process(sql, expected);
}
+ @Test public void testXmlTableStreamingParentAttributes() throws Exception {
+ String sql = "select * from xmltable('/a/b' passing
xmlparse(document '<a
x=''1''><b>foo</b></a>') columns y string path
'.', x integer path '../@x') as x"; //$NON-NLS-1$
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList("foo", 1),
+ };
+ process(sql, expected);
+ }
+
+ /**
+ * Highlights that the PathMapFilter needs to be selective in calling startContent
+ * @throws Exception
+ */
+ @Test public void testXmlStreamingError() throws Exception {
+ String sql = "select * from xmltable('/a/a' passing
xmlparse(document
'<a><a>2000-01-01T01:01:00.2-06:00<a></a></a></a>')
columns x timestamp path 'xs:dateTime(./text())') as x"; //$NON-NLS-1$
+ Timestamp ts = TimestampUtil.createTimestamp(100, 0, 1, 1, 1, 0, 200000000);
+ List<?>[] expected = new List<?>[] {
+ Arrays.asList(ts),
+ };
+ process(sql, expected);
+ }
+
@Test public void testXmlTableSubquery() throws Exception {
String sql = "select * from xmltable('/a/b' passing
convert('<a><b>first</b><b
x=\"attr\">c</b></a>', xml) columns x string path
'@x', val string path '/.') as x where val = (select max(e1) from pm1.g1
as x)";
Property changes on:
trunk/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java
___________________________________________________________________
Modified: svn:mergeinfo
-
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java:3149-3217
+
/branches/7.4.x/engine/src/test/java/org/teiid/query/processor/TestSQLXMLProcessing.java:3149-3217,3220-3275
Deleted:
trunk/engine/src/test/java/org/teiid/query/processor/relational/NodeTestUtil.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/NodeTestUtil.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/NodeTestUtil.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,73 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source.
- * See the COPYRIGHT.txt file distributed with this work for information
- * regarding copyright ownership. Some portions may be licensed
- * to Red Hat, Inc. under one or more contributor license agreements.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA.
- */
-
-package org.teiid.query.processor.relational;
-
-import org.teiid.common.buffer.BufferManager;
-import org.teiid.common.buffer.StorageManager;
-import org.teiid.common.buffer.impl.BufferManagerImpl;
-import org.teiid.common.buffer.impl.MemoryStorageManager;
-import org.teiid.core.TeiidComponentException;
-
-/**
- * @since 4.2
- */
-public class NodeTestUtil {
-
- static BufferManager getTestBufferManager(long bytesAvailable, int procBatchSize, int
connectorBatchSize) {
- BufferManagerImpl bufferManager = new BufferManagerImpl();
- bufferManager.setProcessorBatchSize(procBatchSize);
- bufferManager.setConnectorBatchSize(connectorBatchSize);
-
bufferManager.setMaxProcessingBatchColumns((int)(bytesAvailable/procBatchSize/BufferManagerImpl.KB_PER_VALUE/1024));
-
bufferManager.setMaxReserveBatchColumns((int)(bytesAvailable/procBatchSize/BufferManagerImpl.KB_PER_VALUE/1024));
- // Get the properties for BufferManager
- return createBufferManager(bufferManager);
- }
-
- static BufferManager getTestBufferManager(long bytesAvailable, int procBatchSize) {
- BufferManagerImpl bufferManager = new BufferManagerImpl();
- bufferManager.setProcessorBatchSize(procBatchSize);
-
bufferManager.setMaxProcessingBatchColumns((int)(bytesAvailable/procBatchSize/BufferManagerImpl.KB_PER_VALUE/1024));
-
bufferManager.setMaxReserveBatchColumns((int)(bytesAvailable/procBatchSize/BufferManagerImpl.KB_PER_VALUE/1024));
- // Get the properties for BufferManager
- return createBufferManager(bufferManager);
- }
-
- static BufferManager createBufferManager(BufferManagerImpl bufferManager) {
- try {
- bufferManager.initialize();
- } catch (TeiidComponentException e) {
- throw new RuntimeException(e);
- }
-
- // Add storage managers
-
- bufferManager.setStorageManager(createFakeDatabaseStorageManager());
- return bufferManager;
- }
-
-
- private static StorageManager createFakeDatabaseStorageManager() {
- return new MemoryStorageManager();
- }
-
-}
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestGroupingNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestGroupingNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestGroupingNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -53,7 +53,7 @@
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.query.util.CommandContext;
-
+@SuppressWarnings("unchecked")
public class TestGroupingNode {
public static FakeTupleSource createTupleSource1() {
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestJoinNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestJoinNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestJoinNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -34,6 +34,7 @@
import org.junit.Test;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.common.buffer.TupleBatch;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
@@ -231,7 +232,7 @@
}
public void helpTestJoinDirect(List[] expectedResults, int batchSize, int
processingBytes) throws TeiidComponentException, TeiidProcessingException {
- BufferManager mgr = NodeTestUtil.getTestBufferManager(processingBytes,
batchSize);
+ BufferManager mgr = BufferManagerFactory.getTestBufferManager(processingBytes,
batchSize);
CommandContext context = new CommandContext("pid", "test",
null, null, 1); //$NON-NLS-1$ //$NON-NLS-2$
join.addChild(leftNode);
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestProjectIntoNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -32,6 +32,7 @@
import org.teiid.api.exception.query.ExpressionEvaluationException;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.common.buffer.TupleBatch;
import org.teiid.common.buffer.TupleSource;
import org.teiid.core.TeiidComponentException;
@@ -80,7 +81,7 @@
CommandContext context = new CommandContext();
context.setProcessorID("processorID"); //$NON-NLS-1$
- BufferManager bm = NodeTestUtil.getTestBufferManager(tupleBatchSize,
tupleBatchSize);
+ BufferManager bm = BufferManagerFactory.getTestBufferManager(tupleBatchSize,
tupleBatchSize);
ProcessorDataManager dataManager = new FakePDM(tupleBatchSize);
child.initialize(context, bm, dataManager);
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestSortNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -52,7 +52,7 @@
public static final int BATCH_SIZE = 100;
private void helpTestSort(List elements, List[] data, List sortElements, List
sortTypes, List[] expected, Mode mode) throws TeiidComponentException,
TeiidProcessingException {
- BufferManager mgr = NodeTestUtil.getTestBufferManager(100, BATCH_SIZE,
BATCH_SIZE);
+ BufferManager mgr = BufferManagerFactory.getTestBufferManager(100, BATCH_SIZE,
BATCH_SIZE);
CommandContext context = new CommandContext ("pid", "test",
null, null, 1); //$NON-NLS-1$ //$NON-NLS-2$
BlockingFakeRelationalNode dataNode = new BlockingFakeRelationalNode(2, data);
Modified:
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestUnionAllNode.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestUnionAllNode.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/processor/relational/TestUnionAllNode.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -31,6 +31,7 @@
import org.junit.Test;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.BufferManagerFactory;
import org.teiid.common.buffer.TupleBatch;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
@@ -45,7 +46,7 @@
public class TestUnionAllNode {
public void helpTestUnion(RelationalNode[] children, RelationalNode union, List[]
expected) throws TeiidComponentException, TeiidProcessingException {
- BufferManager mgr = NodeTestUtil.getTestBufferManager(1, 2);
+ BufferManager mgr = BufferManagerFactory.getTestBufferManager(1, 2);
CommandContext context = new CommandContext("pid", "test",
null, null, 1); //$NON-NLS-1$ //$NON-NLS-2$
FakeDataManager fdm = new FakeDataManager();
for(int i=0; i<children.length; i++) {
Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -173,13 +173,13 @@
AssignmentStatement assStmt = (AssignmentStatement)block.getStatements().get(1);
assertEquals(ProcedureReservedWords.VARIABLES,
assStmt.getVariable().getGroupSymbol().getCanonicalName());
- assertEquals(ProcedureReservedWords.VARIABLES,
((ElementSymbol)assStmt.getValue()).getGroupSymbol().getCanonicalName());
+ assertEquals(ProcedureReservedWords.VARIABLES,
((ElementSymbol)assStmt.getExpression()).getGroupSymbol().getCanonicalName());
Block inner = ((LoopStatement)block.getStatements().get(2)).getBlock();
assStmt = (AssignmentStatement)inner.getStatements().get(0);
- ElementSymbol value = ElementCollectorVisitor.getElements(assStmt.getValue(),
false).iterator().next();
+ ElementSymbol value =
ElementCollectorVisitor.getElements(assStmt.getExpression(), false).iterator().next();
assertEquals("LOOPCURSOR", value.getGroupSymbol().getCanonicalName());
//$NON-NLS-1$
}
@@ -1038,6 +1038,16 @@
TestResolver.helpResolve(procedure, RealMetadataFactory.example1Cached());
}
+ // addresses Cases 5474.
+ @Test public void testProcWithReturn() throws Exception {
+ String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
+ procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
+ procedure = procedure + "call sptest9(1);\n"; //$NON-NLS-1$
+ procedure = procedure + "END\n"; //$NON-NLS-1$
+
+ TestResolver.helpResolve(procedure, RealMetadataFactory.exampleBQTCached());
+ }
+
@Test public void testIssue174102() throws Exception {
String procedure = "CREATE VIRTUAL PROCEDURE \n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -2086,7 +2086,7 @@
}
@Test public void testRewiteEvaluatableAggregate() {
- helpTestRewriteCommand("select pm1.g1.e1, max(1) from pm1.g1",
"SELECT pm1.g1.e1, 1 FROM pm1.g1"); //$NON-NLS-1$ //$NON-NLS-2$
+ helpTestRewriteCommand("select max(1) from pm1.g1", "SELECT MAX(1)
FROM pm1.g1"); //$NON-NLS-1$ //$NON-NLS-2$
}
@Test public void testRewriteFromUnixTime() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java
===================================================================
---
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/engine/src/test/java/org/teiid/query/unittest/RealMetadataFactory.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1104,14 +1104,14 @@
sq15.setResultSet(rs18);
QueryNode sq16n1 = new QueryNode("CREATE VIRTUAL PROCEDURE BEGIN INSERT INTO
pm1.g1 ( e1, e2 ) VALUES( 1, 2 ); END"); //$NON-NLS-1$ //$NON-NLS-2$
- Procedure sq16 = createVirtualProcedure("sq16", pm1, null, sq16n1);
//$NON-NLS-1$
+ createVirtualProcedure("sq16", pm1, null, sq16n1); //$NON-NLS-1$
ColumnSet<Procedure> rs19 = createResultSet("pm1.rs19", new
String[] { "xml" }, new String[] { DataTypeManager.DefaultDataTypes.STRING });
//$NON-NLS-1$ //$NON-NLS-2$
QueryNode sq17n1 = new QueryNode("CREATE VIRTUAL PROCEDURE BEGIN SELECT *
FROM xmltest.doc1; END"); //$NON-NLS-1$ //$NON-NLS-2$
Procedure sq17 = createVirtualProcedure("sq17", pm1, null, sq17n1);
//$NON-NLS-1$
sq17.setResultSet(rs19);
- Procedure sp3 = createStoredProcedure("sp3", pm1, null); //$NON-NLS-1$
//$NON-NLS-2$
+ createStoredProcedure("sp3", pm1, null); //$NON-NLS-1$ //$NON-NLS-2$
ColumnSet<Procedure> rs20 = createResultSet("pm1.rs20", new String[] {
"xml" }, new String[] { DataTypeManager.DefaultDataTypes.STRING });
//$NON-NLS-1$ //$NON-NLS-2$
QueryNode sq18n1 = new QueryNode("CREATE VIRTUAL PROCEDURE BEGIN SELECT *
FROM xmltest.doc1; END"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1130,7 +1130,7 @@
sp4.setResultSet(rs22);
// no params or result set at all
- Procedure sp5 = createStoredProcedure("sp5", pm1, new
ArrayList<ProcedureParameter>()); //$NON-NLS-1$ //$NON-NLS-2$
+ createStoredProcedure("sp5", pm1, new
ArrayList<ProcedureParameter>()); //$NON-NLS-1$ //$NON-NLS-2$
//virtual stored procedures
ColumnSet<Procedure> vsprs1 = vsprs1(); //$NON-NLS-1$ //$NON-NLS-2$
Copied: trunk/metadata/DATATYPES.INDEX (from rev 3275,
branches/7.4.x/metadata/DATATYPES.INDEX)
===================================================================
(Binary files differ)
Modified: trunk/metadata/src/main/resources/System.vdb
===================================================================
(Binary files differ)
Modified: trunk/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java 2011-06-28 03:27:07
UTC (rev 3279)
+++ trunk/runtime/src/main/java/org/teiid/deployers/CompositeVDB.java 2011-06-28 03:47:29
UTC (rev 3280)
@@ -146,17 +146,19 @@
newMergedVDB.setConnectionType(this.vdb.getConnectionType());
ConnectorManagerRepository mergedRepo = new ConnectorManagerRepository();
mergedRepo.getConnectorManagers().putAll(this.cmr.getConnectorManagers());
- for (CompositeVDB child:this.children.values()) {
-
- // add models
- for (Model m:child.getVDB().getModels()) {
- newMergedVDB.addModel((ModelMetaData)m);
+ if (this.children != null) {
+ for (CompositeVDB child:this.children.values()) {
+
+ // add models
+ for (Model m:child.getVDB().getModels()) {
+ newMergedVDB.addModel((ModelMetaData)m);
+ }
+
+ for (DataPolicy p:child.getVDB().getDataPolicies()) {
+ newMergedVDB.addDataPolicy((DataPolicyMetadata)p);
+ }
+ mergedRepo.getConnectorManagers().putAll(child.cmr.getConnectorManagers());
}
-
- for (DataPolicy p:child.getVDB().getDataPolicies()) {
- newMergedVDB.addDataPolicy((DataPolicyMetadata)p);
- }
- mergedRepo.getConnectorManagers().putAll(child.cmr.getConnectorManagers());
}
newMergedVDB.addAttchment(ConnectorManagerRepository.class, mergedRepo);
return newMergedVDB;
Modified: trunk/runtime/src/main/java/org/teiid/deployers/PgCatalogMetadataStore.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/PgCatalogMetadataStore.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/runtime/src/main/java/org/teiid/deployers/PgCatalogMetadataStore.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -160,7 +160,8 @@
"pt.oid as atttypid," + //$NON-NLS-1$
"pt.typlen as attlen, " + //$NON-NLS-1$
"convert(t1.Position, short) as attnum, " + //$NON-NLS-1$
- "t1.Length as atttypmod, " + //$NON-NLS-1$
+ "(CASE WHEN (t1.DataType = 'bigdecimal' OR t1.DataType =
'biginteger' OR t1.DataType = 'float' OR t1.DataType='double')
THEN (4+(65536*t1.Precision)+t1.Scale) " + //$NON-NLS-1$
+ "ELSE (4+t1.Length) END) as atttypmod, " + //$NON-NLS-1$
"CASE WHEN (t1.NullType = 'No Nulls') THEN true ELSE false END as
attnotnull, " + //$NON-NLS-1$
"false as attisdropped, " + //$NON-NLS-1$
"false as atthasdef " + //$NON-NLS-1$
@@ -312,10 +313,10 @@
String transformation = "SELECT t1.OID as oid, t1.Name as proname, (SELECT (CASE
WHEN count(pp.Type)>0 THEN true else false END) as x FROM ProcedureParams pp WHERE
pp.ProcedureName = t1.Name AND pp.SchemaName = t1.SchemaName and
pp.Type='ResultSet') as proretset, " + //$NON-NLS-1$
"CASE WHEN (SELECT count(dt.oid) FROM ProcedureParams pp, matpg_datatype dt WHERE
pp.ProcedureName = t1.Name AND pp.SchemaName = t1.SchemaName AND pp.Type IN
('ReturnValue', 'ResultSet') AND dt.Name = pp.DataType) IS NULL THEN
(select oid from pg_type WHERE typname = 'void') WHEN (SELECT count(dt.oid) FROM
ProcedureParams pp, matpg_datatype dt WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type = 'ResultSet' AND dt.Name = pp.DataType) IS NOT NULL
THEN (select oid from pg_type WHERE typname = 'record') ELSE (SELECT dt.oid FROM
ProcedureParams pp, matpg_datatype dt WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type = 'ReturnValue' AND dt.Name = pp.DataType) END as
prorettype, " + //$NON-NLS-1$
"convert((SELECT count(*) FROM ProcedureParams pp WHERE pp.ProcedureName = t1.Name
AND pp.SchemaName = t1.SchemaName AND pp.Type IN ('In', 'InOut')), short)
as pronargs, " + //$NON-NLS-1$
- "(select "+textAggStmt("y.oid","y.type, y.position"
)+" FROM ("+paramTable("'ResultSet','ReturnValue',
'Out'")+") as y) as proargtypes, " +//$NON-NLS-1$ //$NON-NLS-2$
//$NON-NLS-3$
- "(select "+textAggStmt("y.name", "y.type,
y.position")+" FROM (SELECT pp.Name as name, pp.position as position, pp.Type as
type FROM ProcedureParams pp WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type NOT IN ('ReturnValue' )) as y) as proargnames, " +
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- "(select case WHEN count(distinct(y.type)) = 1 THEN null ELSE
"+textAggStmt("CASE WHEN (y.type ='In') THEN 'i' WHEN (y.type =
'Out') THEN 'o' WHEN (y.type = 'InOut') THEN 'b' WHEN
(y.type = 'ResultSet') THEN 't' END",
"y.type,y.position")+" END FROM (SELECT pp.Type as type, pp.Position as
position FROM ProcedureParams pp WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type NOT IN ('ReturnValue')) as y) as proargmodes, " +
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- "(select case WHEN count(distinct(y.oid)) = 1 THEN null ELSE
"+textAggStmt("y.oid", "y.type, y.position")+" END FROM
("+paramTable("'ReturnValue'")+") as y) as proallargtypes,
" + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ "(select "+arrayAgg("y.oid","y.type, y.position" )+"
FROM ("+paramTable("'ResultSet','ReturnValue',
'Out'")+") as y) as proargtypes, " +//$NON-NLS-1$ //$NON-NLS-2$
//$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$
+ "(select "+arrayAgg("y.name", "y.type,
y.position")+" FROM (SELECT pp.Name as name, pp.position as position, pp.Type as
type FROM ProcedureParams pp WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type NOT IN ('ReturnValue' )) as y) as proargnames, " +
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ "(select case WHEN count(distinct(y.type)) = 1 THEN null ELSE
"+arrayAgg("CASE WHEN (y.type ='In') THEN 'i' WHEN (y.type =
'Out') THEN 'o' WHEN (y.type = 'InOut') THEN 'b' WHEN
(y.type = 'ResultSet') THEN 't' END",
"y.type,y.position")+" END FROM (SELECT pp.Type as type, pp.Position as
position FROM ProcedureParams pp WHERE pp.ProcedureName = t1.Name AND pp.SchemaName =
t1.SchemaName AND pp.Type NOT IN ('ReturnValue')) as y) as proargmodes, " +
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ "(select case WHEN count(distinct(y.oid)) = 1 THEN null ELSE
"+arrayAgg("y.oid", "y.type, y.position")+" END FROM
("+paramTable("'ReturnValue'")+") as y) as proallargtypes,
" + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
//$NON-NLS-6$
"(SELECT OID FROM SYS.Schemas WHERE Name = t1.SchemaName) as pronamespace " +
//$NON-NLS-1$
"FROM SYS.Procedures as t1";//$NON-NLS-1$
@@ -330,7 +331,7 @@
}
- private String textAggStmt(String select, String orderby) {
+ private String arrayAgg(String select, String orderby) {
return "array_agg("+select+" ORDER BY "+orderby+")";
//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
Modified: trunk/runtime/src/main/java/org/teiid/odbc/ODBCServerRemoteImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/odbc/ODBCServerRemoteImpl.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/runtime/src/main/java/org/teiid/odbc/ODBCServerRemoteImpl.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -477,7 +477,12 @@
}
else {
try {
+ // The response is a ParameterDescription message describing the parameters needed by
the statement,
this.client.sendParameterDescription(query.stmt.getParameterMetaData(),
query.paramType);
+
+ // followed by a RowDescription message describing the rows that will be returned
when the statement
+ // is eventually executed (or a NoData message if the statement will not return
rows).
+ this.client.sendResultSetDescription(query.stmt.getMetaData(), query.stmt);
} catch (SQLException e) {
errorOccurred(e);
}
Modified: trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/runtime/src/main/java/org/teiid/services/BufferServiceImpl.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -62,8 +62,8 @@
private int connectorBatchSize = BufferManager.DEFAULT_CONNECTOR_BATCH_SIZE;
private int maxOpenFiles = FileStorageManager.DEFAULT_MAX_OPEN_FILES;
private long maxFileSize = FileStorageManager.DEFAULT_MAX_FILESIZE; // 2GB
- private int maxProcessingBatchesColumns =
BufferManager.DEFAULT_MAX_PROCESSING_BATCHES;
- private int maxReserveBatchColumns = BufferManager.DEFAULT_RESERVE_BUFFERS;
+ private int maxProcessingKb = BufferManager.DEFAULT_MAX_PROCESSING_KB;
+ private int maxReserveKb = BufferManager.DEFAULT_RESERVE_BUFFER_KB;
private long maxBufferSpace = FileStorageManager.DEFAULT_MAX_BUFFERSPACE;
private FileStorageManager fsm;
@@ -86,8 +86,8 @@
this.bufferMgr = new BufferManagerImpl();
this.bufferMgr.setConnectorBatchSize(Integer.valueOf(connectorBatchSize));
this.bufferMgr.setProcessorBatchSize(Integer.valueOf(processorBatchSize));
- this.bufferMgr.setMaxReserveBatchColumns(this.maxReserveBatchColumns);
-
this.bufferMgr.setMaxProcessingBatchColumns(this.maxProcessingBatchesColumns);
+ this.bufferMgr.setMaxReserveKB(this.maxReserveKb);
+ this.bufferMgr.setMaxProcessingKB(this.maxProcessingKb);
this.bufferMgr.initialize();
@@ -167,14 +167,6 @@
this.maxFileSize = maxFileSize;
}
- public void setMaxReserveBatchColumns(int value) {
- this.maxReserveBatchColumns = value;
- }
-
- public void setMaxProcessingBatchesColumns(int value) {
- this.maxProcessingBatchesColumns = value;
- }
-
@ManagementProperty(description="Max file size, in MB, for buffer files (default
2GB)")
public long getMaxFileSize() {
return maxFileSize;
@@ -185,20 +177,24 @@
this.maxOpenFiles = maxOpenFiles;
}
- @ManagementProperty(description="The number of batch columns guarenteed to a
processing operation. Set this value lower if the workload typically" +
- "processes larger numbers of concurrent queries with large intermediate
results from operations such as sorting, " +
- "grouping, etc. (default 128)")
- public int getMaxProcessingBatchesColumns() {
- return maxProcessingBatchesColumns;
+ @ManagementProperty(description="The approximate amount of buffer memory in
kilobytes allowable for a single processing operation (sort, grouping, etc.) regardless of
existing memory commitments. -1 means to automatically calculate a value (default
-1).")
+ public int getMaxProcessingKb() {
+ return maxProcessingKb;
}
- @ManagementProperty(description="The number of batch columns to allow in memory
(default 16384). " +
- "This value should be set lower or higher depending on the available memory to
Teiid in the VM. " +
- "16384 is considered a good default for a dedicated 32-bit VM running Teiid
with a 1 gig heap.")
- public int getMaxReserveBatchColumns() {
- return maxReserveBatchColumns;
+ @ManagementProperty(description="The approximate amount of memory in kilobytes
allowed to be held by the buffer manager. -1 means to automatically calculate a value
(default -1)")
+ public int getMaxReservedKb() {
+ return maxReserveKb;
}
+ public void setMaxProcessingKb(int maxProcessingKb) {
+ this.maxProcessingKb = maxProcessingKb;
+ }
+
+ public void setMaxReserveKb(int maxReserveKb) {
+ this.maxReserveKb = maxReserveKb;
+ }
+
@ManagementProperty(description="Max file storage space, in MB, to be used for
buffer files (default 50G)")
public long getMaxBufferSpace() {
return maxBufferSpace;
Modified: trunk/runtime/src/test/java/org/teiid/deployers/TestCompositeVDB.java
===================================================================
--- trunk/runtime/src/test/java/org/teiid/deployers/TestCompositeVDB.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/runtime/src/test/java/org/teiid/deployers/TestCompositeVDB.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -21,6 +21,8 @@
*/
package org.teiid.deployers;
+import static org.junit.Assert.*;
+
import java.util.ArrayList;
import java.util.List;
@@ -40,12 +42,20 @@
import org.teiid.query.sql.lang.Command;
import org.teiid.query.unittest.RealMetadataFactory;
import org.teiid.translator.ExecutionFactory;
+import org.teiid.vdb.runtime.VDBKey;
@SuppressWarnings("nls")
public class TestCompositeVDB {
public static TransformationMetadata createTransformationMetadata(MetadataStore
metadataStore, String vdbName) throws Exception {
- VDBMetaData vdbMetaData = new VDBMetaData();
+ CompositeVDB cvdb = createCompositeVDB(metadataStore, vdbName);
+ VDBMetaData vdb = cvdb.getVDB();
+ return vdb.getAttachment(TransformationMetadata.class);
+ }
+
+ private static CompositeVDB createCompositeVDB(MetadataStore metadataStore,
+ String vdbName) {
+ VDBMetaData vdbMetaData = new VDBMetaData();
vdbMetaData.setName(vdbName); //$NON-NLS-1$
vdbMetaData.setVersion(1);
for (Schema schema : metadataStore.getSchemas().values()) {
@@ -59,8 +69,7 @@
cmr.addConnectorManager("source2", getConnectorManager("bqt2",
"FakeTranslator2", "FakeConnection2", getFuncsTwo()));
CompositeVDB cvdb = new CompositeVDB(vdbMetaData, metaGroup, null, null,
RealMetadataFactory.SFM.getSystemFunctions(),cmr);
- VDBMetaData vdb = cvdb.getVDB();
- return vdb.getAttachment(TransformationMetadata.class);
+ return cvdb;
}
private static ConnectorManager getConnectorManager(String modelName, String
translatorName, String connectionName, List<FunctionMethod> funcs) {
@@ -103,7 +112,7 @@
private void helpResolve(String sql) throws Exception {
- TransformationMetadata metadata =
createTransformationMetadata(RealMetadataFactory.exampleBQTStore(), "bqt");
+ TransformationMetadata metadata =
createTransformationMetadata(RealMetadataFactory.exampleBQTCached().getMetadataStore(),
"bqt");
Command command = QueryParser.getQueryParser().parseCommand(sql);
QueryResolver.resolveCommand(command, metadata);
}
@@ -138,4 +147,10 @@
helpResolve("SELECT duplicate_func(BQT1.SmallA.INTKEY) FROM BQT1.SmallA");
}
+ @Test public void testRemoveChild() throws Exception {
+ CompositeVDB vdb = createCompositeVDB(RealMetadataFactory.exampleBQTStore(),
"bqt");
+ vdb.removeChild(new VDBKey("foo", 1));
+ assertNotNull(vdb.getVDB());
+ }
+
}
Modified:
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java
===================================================================
---
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/runtime/src/test/java/org/teiid/dqp/service/buffer/TestLocalBufferService.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -91,7 +91,7 @@
svc.start();
BufferManager mgr = svc.getBufferManager();
- assertEquals(16261, mgr.getSchemaSize(schema));
+ assertEquals(13141, mgr.getSchemaSize(schema));
}
}
Modified:
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractMMQueryTestCase.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractMMQueryTestCase.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractMMQueryTestCase.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -80,7 +80,7 @@
}
- protected void helpTest(String query, String[] expected, String vdb, String props,
String urlProperties) {
+ protected void helpTest(String query, String[] expected, String vdb, String props,
String urlProperties) throws SQLException {
getConnection(vdb, props, urlProperties);
executeAndAssertResults(query, expected);
closeConnection();
Modified:
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractQueryTest.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractQueryTest.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/jdbc/AbstractQueryTest.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -86,11 +86,11 @@
return this.internalConnection;
}
- public boolean execute(String sql) {
+ public boolean execute(String sql) throws SQLException {
return execute(sql, new Object[] {});
}
- public boolean execute(String sql, Object[] params) {
+ public boolean execute(String sql, Object[] params) throws SQLException {
closeResultSet();
closeStatement();
this.updateCount = -1;
@@ -122,7 +122,7 @@
} catch (SQLException e) {
this.internalException = e;
if (!exceptionExpected()) {
- throw new RuntimeException(e);
+ throw e;
}
}
return false;
@@ -465,7 +465,7 @@
}
- protected void executeAndAssertResults(String query, String[] expected) {
+ protected void executeAndAssertResults(String query, String[] expected) throws
SQLException {
execute(query);
if (expected != null) {
assertResults(expected);
Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java 2011-06-28
03:27:07 UTC (rev 3279)
+++ trunk/test-integration/common/src/test/java/org/teiid/jdbc/FakeServer.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -22,7 +22,9 @@
package org.teiid.jdbc;
import java.io.File;
+import java.util.Collection;
import java.util.LinkedHashMap;
+import java.util.Map;
import java.util.Properties;
import org.jboss.deployers.spi.DeploymentException;
@@ -37,6 +39,7 @@
import org.teiid.client.DQP;
import org.teiid.client.security.ILogon;
import org.teiid.deployers.MetadataStoreGroup;
+import org.teiid.deployers.UDFMetaData;
import org.teiid.deployers.VDBRepository;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
@@ -44,6 +47,7 @@
import org.teiid.dqp.internal.process.DQPConfiguration;
import org.teiid.dqp.internal.process.DQPCore;
import org.teiid.dqp.service.FakeBufferService;
+import org.teiid.metadata.FunctionMethod;
import org.teiid.metadata.MetadataRepository;
import org.teiid.metadata.MetadataStore;
import org.teiid.metadata.Schema;
@@ -61,7 +65,7 @@
import org.teiid.transport.LocalServerConnection;
import org.teiid.transport.LogonImpl;
-@SuppressWarnings("nls")
+@SuppressWarnings({"nls", "serial"})
public class FakeServer extends ClientServiceRegistryImpl implements ConnectionProfile {
SessionServiceImpl sessionService = new SessionServiceImpl();
@@ -97,7 +101,12 @@
});
config.setResultsetCacheConfig(new CacheConfiguration(Policy.LRU, 60, 250,
"resultsetcache")); //$NON-NLS-1$
- this.dqp.setCacheFactory(new DefaultCacheFactory());
+ this.dqp.setCacheFactory(new DefaultCacheFactory() {
+ @Override
+ public boolean isReplicated() {
+ return true; //pretend to be replicated for matview tests
+ }
+ });
this.dqp.start(config);
this.sessionService.setDqp(this.dqp);
@@ -121,18 +130,25 @@
public void setUseCallingThread(boolean useCallingThread) {
this.useCallingThread = useCallingThread;
}
+
+ public void deployVDB(String vdbName, String vdbPath) throws Exception {
+ deployVDB(vdbName, vdbPath, null);
+ }
- public void deployVDB(String vdbName, String vdbPath) throws Exception {
-
+ public void deployVDB(String vdbName, String vdbPath, Map<String,
Collection<FunctionMethod>> udfs) throws Exception {
IndexMetadataFactory imf = VDBMetadataFactory.loadMetadata(new
File(vdbPath).toURI().toURL());
MetadataStore metadata = imf.getMetadataStore(repo.getSystemStore().getDatatypes());
LinkedHashMap<String, Resource> entries = imf.getEntriesPlusVisibilities();
-
- deployVDB(vdbName, metadata, entries);
+ deployVDB(vdbName, metadata, entries, udfs);
}
+
+ public void deployVDB(String vdbName, MetadataStore metadata,
+ LinkedHashMap<String, Resource> entries) {
+ deployVDB(vdbName, metadata, entries, null);
+ }
public void deployVDB(String vdbName, MetadataStore metadata,
- LinkedHashMap<String, Resource> entries) {
+ LinkedHashMap<String, Resource> entries, Map<String,
Collection<FunctionMethod>> udfs) {
VDBMetaData vdbMetaData = new VDBMetaData();
vdbMetaData.setName(vdbName);
vdbMetaData.setStatus(VDB.Status.ACTIVE);
@@ -152,7 +168,14 @@
try {
MetadataStoreGroup stores = new MetadataStoreGroup();
stores.addStore(metadata);
- this.repo.addVDB(vdbMetaData, stores, entries, null, cmr);
+ UDFMetaData udfMetaData = null;
+ if (udfs != null) {
+ udfMetaData = new UDFMetaData();
+ for (Map.Entry<String, Collection<FunctionMethod>> entry :
udfs.entrySet()) {
+ udfMetaData.addFunctions(entry.getKey(), entry.getValue());
+ }
+ }
+ this.repo.addVDB(vdbMetaData, stores, entries, udfMetaData, cmr);
this.repo.finishDeployment(vdbName, 1);
} catch (DeploymentException e) {
throw new RuntimeException(e);
Modified:
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDymamicImportedMetaData.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDymamicImportedMetaData.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestDymamicImportedMetaData.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -74,7 +74,7 @@
assertEquals(1, p.getResultSet().getColumns().size());
}
- @Test public void testDuplicatException() throws Exception {
+ @Test public void testDuplicateException() throws Exception {
FakeServer server = new FakeServer();
MetadataFactory mf = createMetadataFactory("x", new Properties());
MetadataFactory mf1 = createMetadataFactory("y", new Properties());
@@ -93,8 +93,9 @@
Properties importProperties = new Properties();
- getMetadata(importProperties, conn);
-
assertNotNull(mf.getMetadataStore().getSchemas().get("X").getTables().get("DUP"));
+ mf = getMetadata(importProperties, conn);
+ Table t =
mf.getMetadataStore().getSchemas().get("TEST").getTables().get("TEST.X.DUP");
+ assertEquals("\"test\".\"x\".\"dup\"",
t.getNameInSource());
importProperties.setProperty("importer.useFullSchemaName",
Boolean.FALSE.toString());
try {
@@ -104,5 +105,25 @@
}
}
+
+ @Test public void testUseCatalog() throws Exception {
+ FakeServer server = new FakeServer();
+ MetadataFactory mf = createMetadataFactory("x", new Properties());
+
+ Table dup = mf.addTable("dup");
+
+ mf.addColumn("x", DataTypeManager.DefaultDataTypes.STRING, dup);
+
+ MetadataStore ms = mf.getMetadataStore();
+
+ server.deployVDB("test", ms, new LinkedHashMap<String,
Resource>());
+ Connection conn = server.createConnection("jdbc:teiid:test");
//$NON-NLS-1$
+
+ Properties importProperties = new Properties();
+ importProperties.setProperty("importer.useCatalogName",
Boolean.FALSE.toString());
+ mf = getMetadata(importProperties, conn);
+ Table t =
mf.getMetadataStore().getSchemas().get("TEST").getTables().get("X.DUP");
+ assertEquals("\"x\".\"dup\"", t.getNameInSource());
+ }
}
Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestVDBMerge.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestVDBMerge.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestVDBMerge.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,5 +1,7 @@
package org.teiid.jdbc;
+import java.sql.SQLException;
+
import org.junit.Test;
import org.teiid.core.util.UnitTestUtil;
@@ -66,7 +68,7 @@
executeTest("select * from tables where schemaname
='PartsSupplier'", expected); //$NON-NLS-1$
}
- private void executeTest(String sql, String[] expected){
+ private void executeTest(String sql, String[] expected) throws SQLException{
execute(sql);
if (expected != null) {
assertResults(expected);
Modified:
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMatViews.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMatViews.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMatViews.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -28,15 +28,22 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
-import org.teiid.adminapi.impl.VDBMetaData;
+import org.teiid.core.TeiidRuntimeException;
+import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.UnitTestUtil;
import org.teiid.jdbc.FakeServer;
import org.teiid.jdbc.TeiidSQLException;
-import org.teiid.metadata.Table;
-import org.teiid.query.metadata.TransformationMetadata;
+import org.teiid.metadata.FunctionMethod;
+import org.teiid.metadata.FunctionParameter;
+import org.teiid.metadata.FunctionMethod.Determinism;
+import org.teiid.metadata.FunctionMethod.PushDown;
@SuppressWarnings("nls")
public class TestMatViews {
@@ -44,13 +51,33 @@
private static final String MATVIEWS = "matviews";
private Connection conn;
private FakeServer server;
+
+ private static int count = 0;
+
+ public static int pause() throws InterruptedException {
+ synchronized (TestMatViews.class) {
+ count++;
+ TestMatViews.class.notify();
+ while (count < 2) {
+ TestMatViews.class.wait();
+ }
+ }
+ return 1;
+ }
@Before public void setUp() throws Exception {
server = new FakeServer();
- server.deployVDB(MATVIEWS, UnitTestUtil.getTestDataPath() +
"/matviews.vdb");
+ HashMap<String, Collection<FunctionMethod>> udfs = new
HashMap<String, Collection<FunctionMethod>>();
+ udfs.put("funcs", Arrays.asList(new FunctionMethod("pause",
null, null, PushDown.CANNOT_PUSHDOWN, TestMatViews.class.getName(), "pause",
null, new FunctionParameter("return", DataTypeManager.DefaultDataTypes.INTEGER),
false, Determinism.NONDETERMINISTIC)));
+ server.deployVDB(MATVIEWS, UnitTestUtil.getTestDataPath() +
"/matviews.vdb", udfs);
conn = server.createConnection("jdbc:teiid:matviews");
}
+ @After public void tearDown() throws Exception {
+ server.stop();
+ conn.close();
+ }
+
@Test public void testSystemMatViewsWithImplicitLoad() throws Exception {
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("select * from MatViews order by name");
@@ -80,6 +107,34 @@
@Test public void testSystemMatViewsWithExplicitRefresh() throws Exception {
Statement s = conn.createStatement();
+ ResultSet rs = s.executeQuery("select * from (call
refreshMatView('TEST.RANDOMVIEW', false)) p");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ rs = s.executeQuery("select * from MatViews where name =
'RandomView'");
+ assertTrue(rs.next());
+ assertEquals("LOADED", rs.getString("loadstate"));
+ assertEquals(true, rs.getBoolean("valid"));
+ rs = s.executeQuery("select x from TEST.RANDOMVIEW");
+ assertTrue(rs.next());
+ double key = rs.getDouble(1);
+
+ rs = s.executeQuery("select * from (call refreshMatView('TEST.RANDOMVIEW',
false)) p");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ rs = s.executeQuery("select * from MatViews where name =
'RandomView'");
+ assertTrue(rs.next());
+ assertEquals("LOADED", rs.getString("loadstate"));
+ assertEquals(true, rs.getBoolean("valid"));
+ rs = s.executeQuery("select x from TEST.RANDOMVIEW");
+ assertTrue(rs.next());
+ double key1 = rs.getDouble(1);
+
+ //ensure that invalidate with distributed caching works
+ assertTrue(key1 != key);
+ }
+
+ @Test public void testSystemManViewsWithExplictRefreshAndInvalidate() throws Exception
{
+ Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("select * from (call
refreshMatView('TEST.MATVIEW', false)) p");
assertTrue(rs.next());
assertEquals(1, rs.getInt(1));
@@ -87,6 +142,42 @@
assertTrue(rs.next());
assertEquals("LOADED", rs.getString("loadstate"));
assertEquals(true, rs.getBoolean("valid"));
+
+ count = 0;
+ s.execute("alter view TEST.MATVIEW as select pause() as x");
+ Thread t = new Thread() {
+ public void run() {
+ try {
+ Statement s1 = conn.createStatement();
+ ResultSet rs = s1.executeQuery("select * from (call
refreshMatView('TEST.MATVIEW', true)) p");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ } catch (Exception e) {
+ throw new TeiidRuntimeException(e);
+ }
+ }
+ };
+ t.start();
+ synchronized (TestMatViews.class) {
+ while (count < 1) {
+ TestMatViews.class.wait();
+ }
+ }
+ rs = s.executeQuery("select * from MatViews where name =
'MatView'");
+ assertTrue(rs.next());
+ assertEquals("NEEDS_LOADING", rs.getString("loadstate"));
+ assertEquals(false, rs.getBoolean("valid"));
+
+ synchronized (TestMatViews.class) {
+ count++;
+ TestMatViews.class.notify();
+ }
+ t.join();
+
+ rs = s.executeQuery("select * from MatViews where name =
'MatView'");
+ assertTrue(rs.next());
+ assertEquals("LOADED", rs.getString("loadstate"));
+ assertEquals(true, rs.getBoolean("valid"));
}
@Test(expected=TeiidSQLException.class) public void testSystemMatViewsInvalidView()
throws Exception {
@@ -99,14 +190,27 @@
s.execute("call refreshMatView('foo', false)");
}
+ @Test(expected=TeiidSQLException.class) public void
testSystemMatViewsWithRowRefreshNotAllowed() throws Exception {
+ Statement s = conn.createStatement();
+ s.execute("alter view test.randomview as select rand() as x, rand() as y");
+ ResultSet rs = s.executeQuery("select * from (call
refreshMatView('TEST.RANDOMVIEW', false)) p");
+ assertTrue(rs.next());
+ assertEquals(1, rs.getInt(1));
+ rs = s.executeQuery("select * from MatViews where name =
'RandomView'");
+ assertTrue(rs.next());
+ assertEquals("LOADED", rs.getString("loadstate"));
+ assertEquals(true, rs.getBoolean("valid"));
+ rs = s.executeQuery("select x from TEST.RANDOMVIEW");
+ assertTrue(rs.next());
+ double key = rs.getDouble(1);
+
+ rs = s.executeQuery("select * from (call
refreshMatViewRow('TEST.RANDOMVIEW', "+key+")) p");
+ }
+
@Test public void testSystemMatViewsWithRowRefresh() throws Exception {
- //TOOD: remove this. it's a workaround for TEIIDDES-549
- VDBMetaData vdb = server.getVDB(MATVIEWS);
- TransformationMetadata tm = vdb.getAttachment(TransformationMetadata.class);
- Table t = tm.getGroupID("TEST.RANDOMVIEW");
- t.setSelectTransformation("/*+ cache(updatable) */ " +
t.getSelectTransformation());
+ Statement s = conn.createStatement();
- Statement s = conn.createStatement();
+ s.execute("alter view test.randomview as /*+ cache(updatable) */ select rand() as
x, rand() as y");
//prior to load refresh of a single row returns -1
ResultSet rs = s.executeQuery("select * from (call
refreshMatViewRow('TEST.RANDOMVIEW', 0)) p");
assertTrue(rs.next());
Modified:
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestMetadataUpdates.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -67,7 +67,7 @@
public String answer(InvocationOnMock invocation) throws Throwable {
Procedure t = (Procedure)invocation.getArguments()[2];
if (t.getName().equals("proc")) {
- return "create virtual procedure begin select '2011'; end";
+ return "create virtual procedure begin select '2011'; if ((call
isLoggable())) call logMsg(msg=>'hello'); end";
}
return null;
}
Modified:
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestSystemVirtualModel.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestSystemVirtualModel.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestSystemVirtualModel.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -83,7 +83,7 @@
checkResult("testProcedures", "select* from SYS.Procedures order by
Name"); //$NON-NLS-1$ //$NON-NLS-2$
}
- @Test public void testProperties() {
+ @Test public void testProperties() throws Exception {
String[] expected = {
"Name[string] Value[string] UID[string] OID[integer] ClobValue[clob]",
"pg_type:oid 30 mmuid:ffa4ac73-b549-470e-931f-dc36330cb8c4 1 30",
"pg_type:oid 1009 mmuid:d9f36bdc-7b25-4af0-b9f5-a96aac6d3094 2 1009",
@@ -94,7 +94,7 @@
executeAndAssertResults("select* from SYS.Properties", expected);
//$NON-NLS-1$
}
- @Test public void testVirtualDatabase() {
+ @Test public void testVirtualDatabase() throws Exception {
String[] expected = { "Name[string] Version[string] ",
"PartsSupplier 1", //$NON-NLS-1$ //$NON-NLS-2$
@@ -116,7 +116,7 @@
checkResult("testColumns", "select* from SYS.Columns order by
Name"); //$NON-NLS-1$ //$NON-NLS-2$
}
- @Test public void testTableType() {
+ @Test public void testTableType() throws Exception {
String[] expected = { "Type[string] ", "Table", }; //$NON-NLS-1$
//$NON-NLS-2$
executeAndAssertResults(
@@ -128,7 +128,7 @@
checkResult("testTableIsSystem", "select Name from SYS.Tables where
IsSystem = 'false' order by Name"); //$NON-NLS-1$ //$NON-NLS-2$
}
- @Test public void testDefect12064() {
+ @Test public void testDefect12064() throws Exception {
String[] expected = {
"KeyName[string] RefKeyUID[string] ", //$NON-NLS-1$
"PK_PARTS null", //$NON-NLS-1$
@@ -174,4 +174,12 @@
oidCount = getRowCount();
assertEquals(uidCount, oidCount);
}
+
+ @Test public void testLogMsg() throws Exception {
+ execute("call logMsg(level=>'DEBUG',
context=>'org.teiid.foo', msg=>'hello world')"); //$NON-NLS-1$
+ }
+
+ @Test(expected=SQLException.class) public void testLogMsg1() throws Exception {
+ execute("call logMsg(level=>'foo', context=>'org.teiid.foo',
msg=>'hello world')"); //$NON-NLS-1$
+ }
}
Modified:
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestVirtualDocWithVirtualProc.java
===================================================================
---
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestVirtualDocWithVirtualProc.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestVirtualDocWithVirtualProc.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -55,7 +55,7 @@
closeConnection();
}
- @Test public void testDefect15241() {
+ @Test public void testDefect15241() throws Exception {
String sql = "SELECT SchemaName, Name, Description FROM SYS.Tables WHERE Name =
'yyyTestDocument'"; //$NON-NLS-1$
@@ -67,7 +67,7 @@
executeAndAssertResults(sql, expected);
}
- @Test public void testDefect15241a() {
+ @Test public void testDefect15241a() throws Exception {
String sql = "SELECT TableName, Name, Description FROM SYS.Columns WHERE Name =
'IntKey'"; //$NON-NLS-1$
String[] expected ={
"TableName[string] Name[string] Description[string]", //$NON-NLS-1$
@@ -83,7 +83,7 @@
executeAndAssertResults(sql, expected);
}
- @Test public void testDefect15241b() {
+ @Test public void testDefect15241b() throws Exception {
String sql = "SELECT p.Name, p.Value, UID FROM SYS.Properties p";
//$NON-NLS-1$
String[] expected ={
Modified:
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedureColumns.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedureColumns.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedureColumns.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -43,6 +43,13 @@
QT_Ora9DS SP
sp_rows_between
ObjectValue 3
2000 object 2147483647 2048 0 10
1 <null>
<null> <null>
<null>
<null>
17 YES
sp_rows_between
QT_Ora9DS SYS
getXMLSchemas
document 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
getXMLSchemas
QT_Ora9DS SYS
getXMLSchemas
schema 3
2009 xml 2147483647 2147483647 0 10
1 <null>
<null> <null>
<null>
<null>
1 YES
getXMLSchemas
+QT_Ora9DS SYSADMIN
isLoggable
level 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
isLoggable
+QT_Ora9DS SYSADMIN
isLoggable
context 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
isLoggable
+QT_Ora9DS SYSADMIN
isLoggable
loggable 5
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
isLoggable
+QT_Ora9DS SYSADMIN
logMsg
level 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
logMsg
+QT_Ora9DS SYSADMIN
logMsg
context 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
logMsg
+QT_Ora9DS SYSADMIN
logMsg
msg 1
2000 object 2147483647 2147483647 0 10
0 <null>
<null> <null>
<null>
<null>
4 NO
logMsg
+QT_Ora9DS SYSADMIN
logMsg
logged 5
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
logMsg
QT_Ora9DS SYSADMIN
refreshMatView
ViewName 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
refreshMatView
QT_Ora9DS SYSADMIN
refreshMatView
Invalidate 1
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
refreshMatView
QT_Ora9DS SYSADMIN
refreshMatView
RowsUpdated 5
4 integer 10 10 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
refreshMatView
@@ -61,7 +68,7 @@
QT_Ora9DS SYSADMIN
setProperty
OldValue 5
2005 clob 2147483647 2097152 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
setProperty
QT_Ora9DS SYSADMIN
setTableStats
tableName 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
setTableStats
QT_Ora9DS SYSADMIN
setTableStats
cardinality 1
4 integer 10 10 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
setTableStats
-Row Count : 61
+Row Count : 68
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 QT_Ora9DS java.lang.String PROCEDURE_CAT
string SYS ProcedureParams 255 255 0
false false false false 0 true
true false false
SchemaName 12 QT_Ora9DS java.lang.String PROCEDURE_SCHEM
string SYS ProcedureParams 255 255 0
false true false true 1
false true true true
Modified:
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedures.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedures.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProcedures.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -5,12 +5,14 @@
QT_Ora9DS SP
sp_count_rows_between
<null>
<null> <null>
<null>
1 sp_count_rows_between
QT_Ora9DS SP
sp_rows_between
<null>
<null> <null>
<null>
2 sp_rows_between
QT_Ora9DS SYS
getXMLSchemas
<null>
<null> <null>
<null>
2 getXMLSchemas
+QT_Ora9DS SYSADMIN
isLoggable
<null>
<null> <null>
<null>
1 isLoggable
+QT_Ora9DS SYSADMIN
logMsg
<null>
<null> <null>
<null>
1 logMsg
QT_Ora9DS SYSADMIN
refreshMatView
<null>
<null> <null>
<null>
1 refreshMatView
QT_Ora9DS SYSADMIN
refreshMatViewRow
<null>
<null> <null>
<null>
1 refreshMatViewRow
QT_Ora9DS SYSADMIN
setColumnStats
<null>
<null> <null>
<null>
1 setColumnStats
QT_Ora9DS SYSADMIN
setProperty
<null>
<null> <null>
<null>
1 setProperty
QT_Ora9DS SYSADMIN
setTableStats
<null>
<null> <null>
<null>
1 setTableStats
-Row Count : 10
+Row Count : 12
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 QT_Ora9DS java.lang.String PROCEDURE_CAT
string SYS Procedures 255 255 0
false false false false 0 true
true false false
SchemaName 12 QT_Ora9DS java.lang.String PROCEDURE_SCHEM
string SYS Procedures 255 255 0
false true false true 1 false
true true true
Modified:
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProceduresWithEscape.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProceduresWithEscape.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestMMDatabaseMetaData/testGetProceduresWithEscape.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -5,12 +5,14 @@
QT_Ora9DS SP
sp_count_rows_between
<null>
<null> <null>
<null>
1 sp_count_rows_between
QT_Ora9DS SP
sp_rows_between
<null>
<null> <null>
<null>
2 sp_rows_between
QT_Ora9DS SYS
getXMLSchemas
<null>
<null> <null>
<null>
2 getXMLSchemas
+QT_Ora9DS SYSADMIN
isLoggable
<null>
<null> <null>
<null>
1 isLoggable
+QT_Ora9DS SYSADMIN
logMsg
<null>
<null> <null>
<null>
1 logMsg
QT_Ora9DS SYSADMIN
refreshMatView
<null>
<null> <null>
<null>
1 refreshMatView
QT_Ora9DS SYSADMIN
refreshMatViewRow
<null>
<null> <null>
<null>
1 refreshMatViewRow
QT_Ora9DS SYSADMIN
setColumnStats
<null>
<null> <null>
<null>
1 setColumnStats
QT_Ora9DS SYSADMIN
setProperty
<null>
<null> <null>
<null>
1 setProperty
QT_Ora9DS SYSADMIN
setTableStats
<null>
<null> <null>
<null>
1 setTableStats
-Row Count : 10
+Row Count : 12
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 QT_Ora9DS java.lang.String PROCEDURE_CAT
string SYS Procedures 255 255 0
false false false false 0 true
true false false
SchemaName 12 QT_Ora9DS java.lang.String PROCEDURE_SCHEM
string SYS Procedures 255 255 0
false true false true 1 false
true true true
Modified:
trunk/test-integration/common/src/test/resources/TestODBCSchema/test_PG_ATTRIBUTE.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestODBCSchema/test_PG_ATTRIBUTE.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestODBCSchema/test_PG_ATTRIBUTE.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,257 +1,257 @@
integer integer string
integer short short integer boolean boolean boolean
oid attrelid attname
atttypid attlen attnum atttypmod attnotnull attisdropped atthasdef
-1 1 PART_ID
1043 -1 1 4 true false false
-2 1 PART_NAME
1043 -1 2 255 false false false
-3 1 PART_COLOR
1043 -1 3 30 false false false
-4 1 PART_WEIGHT
1043 -1 4 255 false false false
-5 2 SHIPPER_ID
21 2 1 0 true false false
-6 2 SHIPPER_NAME
1043 -1 2 30 false false false
-7 3 STATUS_ID
21 2 1 0 true false false
-8 3 STATUS_NAME
1043 -1 2 30 false false false
-9 4 SUPPLIER_ID
1043 -1 1 10 true false false
-10 4 PART_ID
1043 -1 2 4 true false false
-11 4 QUANTITY
21 2 3 0 false false false
-12 4 SHIPPER_ID
21 2 4 0 false false false
-13 5 SUPPLIER_ID
1043 -1 1 10 true false false
-14 5 SUPPLIER_NAME
1043 -1 2 30 false false false
-15 5 SUPPLIER_STATUS
21 2 3 0 false false false
-16 5 SUPPLIER_CITY
1043 -1 4 30 false false false
-17 5 SUPPLIER_STATE
1043 -1 5 2 false false false
-18 6 VDBName
1043 -1 1 255 true false false
-19 6 SchemaName
1043 -1 2 255 true false false
-20 6 Name
1043 -1 3 255 true false false
-21 6 TargetSchemaName
1043 -1 4 255 false false false
-22 6 TargetName
1043 -1 5 4000 false false false
-23 6 Valid
16 1 6 0 false false false
-24 6 LoadState
1043 -1 7 255 false false false
-25 6 Updated
1114 8 8 0 false false false
-26 6 Cardinality
23 4 9 10 false false false
-27 7 resourcePath
1043 -1 1 255 false false false
-28 7 contents
14939 -1 2 0 false false false
-29 8 VDBName
1043 -1 1 255 true false false
-30 8 SchemaName
1043 -1 2 255 false false false
-31 8 TableName
1043 -1 3 255 true false false
-32 8 Name
1043 -1 4 255 true false false
-33 8 Position
23 4 5 10 true false false
-34 8 NameInSource
1043 -1 6 255 false false false
-35 8 DataType
1043 -1 7 100 true false false
-36 8 Scale
23 4 8 10 true false false
-37 8 Length
23 4 9 10 true false false
-38 8 IsLengthFixed
16 1 10 1 true false false
-39 8 SupportsSelect
16 1 11 1 true false false
-40 8 SupportsUpdates
16 1 12 1 true false false
-41 8 IsCaseSensitive
16 1 13 1 true false false
-42 8 IsSigned
16 1 14 1 true false false
-43 8 IsCurrency
16 1 15 1 true false false
-44 8 IsAutoIncremented
16 1 16 1 true false false
-45 8 NullType
1043 -1 17 20 true false false
-46 8 MinRange
1043 -1 18 50 false false false
-47 8 MaxRange
1043 -1 19 50 false false false
-48 8 DistinctCount
23 4 20 10 false false false
-49 8 NullCount
23 4 21 10 false false false
-50 8 SearchType
1043 -1 22 20 true false false
-51 8 Format
1043 -1 23 255 false false false
-52 8 DefaultValue
1043 -1 24 255 false false false
-53 8 JavaClass
1043 -1 25 500 true false false
-54 8 Precision
23 4 26 10 true false false
-55 8 CharOctetLength
23 4 27 10 false false false
-56 8 Radix
23 4 28 10 true false false
-57 8 UID
1043 -1 29 50 true false false
-58 8 Description
1043 -1 30 255 false false false
-59 8 OID
23 4 31 10 true false false
-60 9 Name
1043 -1 1 100 true false false
-61 9 IsStandard
16 1 2 1 false false false
-62 9 IsPhysical
16 1 3 1 false false false
-63 9 TypeName
1043 -1 4 100 true false false
-64 9 JavaClass
1043 -1 5 500 true false false
-65 9 Scale
23 4 6 10 false false false
-66 9 TypeLength
23 4 7 10 true false false
-67 9 NullType
1043 -1 8 20 true false false
-68 9 IsSigned
16 1 9 1 true false false
-69 9 IsAutoIncremented
16 1 10 1 true false false
-70 9 IsCaseSensitive
16 1 11 1 true false false
-71 9 Precision
23 4 12 10 true false false
-72 9 Radix
23 4 13 10 false false false
-73 9 SearchType
1043 -1 14 20 true false false
-74 9 UID
1043 -1 15 50 true false false
-75 9 RuntimeType
1043 -1 16 64 false false false
-76 9 BaseType
1043 -1 17 64 false false false
-77 9 Description
1043 -1 18 255 false false false
-78 9 OID
23 4 19 10 true false false
-79 10 VDBName
1043 -1 1 255 true false false
-80 10 SchemaName
1043 -1 2 255 false false false
-81 10 TableName
1043 -1 3 2048 true false false
-82 10 Name
1043 -1 4 255 true false false
-83 10 KeyName
1043 -1 5 255 false false false
-84 10 KeyType
1043 -1 6 20 true false false
-85 10 RefKeyUID
1043 -1 7 50 false false false
-86 10 UID
1043 -1 8 50 true false false
-87 10 Position
23 4 9 10 false false false
-88 10 OID
23 4 10 10 true false false
-89 11 VDBName
1043 -1 1 255 true false false
-90 11 SchemaName
1043 -1 2 255 false false false
-91 11 TableName
1043 -1 3 2048 true false false
-92 11 Name
1043 -1 4 255 true false false
-93 11 Description
1043 -1 5 255 false false false
-94 11 NameInSource
1043 -1 6 255 false false false
-95 11 Type
1043 -1 7 20 true false false
-96 11 IsIndexed
16 1 8 1 true false false
-97 11 RefKeyUID
1043 -1 9 50 false false false
-98 11 UID
1043 -1 10 50 true false false
-99 11 OID
23 4 11 10 true false false
-100 12 VDBName
1043 -1 1 255 true false false
-101 12 SchemaName
1043 -1 2 255 false false false
-102 12 ProcedureName
1043 -1 3 255 true false false
-103 12 Name
1043 -1 4 255 true false false
-104 12 DataType
1043 -1 5 25 true false false
-105 12 Position
23 4 6 10 true false false
-106 12 Type
1043 -1 7 100 true false false
-107 12 Optional
16 1 8 1 true false false
-108 12 Precision
23 4 9 10 true false false
-109 12 TypeLength
23 4 10 10 true false false
-110 12 Scale
23 4 11 10 true false false
-111 12 Radix
23 4 12 10 true false false
-112 12 NullType
1043 -1 13 10 true false false
-113 12 UID
1043 -1 14 50 false false false
-114 12 Description
1043 -1 15 255 false false false
-115 12 OID
23 4 16 10 true false false
-116 13 VDBName
1043 -1 1 255 true false false
-117 13 SchemaName
1043 -1 2 255 false false false
-118 13 Name
1043 -1 3 255 true false false
-119 13 NameInSource
1043 -1 4 255 false false false
-120 13 ReturnsResults
16 1 5 1 true false false
-121 13 UID
1043 -1 6 50 true false false
-122 13 Description
1043 -1 7 255 false false false
-123 13 OID
23 4 8 10 true false false
-124 14 Name
1043 -1 1 255 true false false
-125 14 Value
1043 -1 2 255 true false false
-126 14 UID
1043 -1 3 50 true false false
-127 14 OID
23 4 4 10 true false false
-128 14 ClobValue
14939 -1 5 2097152 false false false
-129 15 PKTABLE_CAT
1043 -1 1 255 false false false
-130 15 PKTABLE_SCHEM
1043 -1 2 255 false false false
-131 15 PKTABLE_NAME
1043 -1 3 255 false false false
-132 15 PKCOLUMN_NAME
1043 -1 4 255 false false false
-133 15 FKTABLE_CAT
1043 -1 5 255 false false false
-134 15 FKTABLE_SCHEM
1043 -1 6 255 false false false
-135 15 FKTABLE_NAME
1043 -1 7 255 false false false
-136 15 FKCOLUMN_NAME
1043 -1 8 255 false false false
-137 15 KEY_SEQ
21 2 9 5 false false false
-138 15 UPDATE_RULE
23 4 10 10 false false false
-139 15 DELETE_RULE
23 4 11 10 false false false
-140 15 FK_NAME
1043 -1 12 255 false false false
-141 15 PK_NAME
1043 -1 13 255 false false false
-142 15 DEFERRABILITY
23 4 14 10 false false false
-143 16 VDBName
1043 -1 1 255 false false false
-144 16 Name
1043 -1 2 255 false false false
-145 16 IsPhysical
16 1 3 1 true false false
-146 16 UID
1043 -1 4 50 true false false
-147 16 Description
1043 -1 5 255 false false false
-148 16 PrimaryMetamodelURI
1043 -1 6 255 true false false
-149 16 OID
23 4 7 10 true false false
-150 17 VDBName
1043 -1 1 255 false false false
-151 17 SchemaName
1043 -1 2 255 false false false
-152 17 Name
1043 -1 3 255 true false false
-153 17 Type
1043 -1 4 20 true false false
-154 17 NameInSource
1043 -1 5 255 false false false
-155 17 IsPhysical
16 1 6 1 true false false
-156 17 SupportsUpdates
16 1 7 1 true false false
-157 17 UID
1043 -1 8 50 true false false
-158 17 Cardinality
23 4 9 10 true false false
-159 17 Description
1043 -1 10 255 false false false
-160 17 IsSystem
16 1 11 1 false false false
-161 17 IsMaterialized
16 1 12 0 true false false
-162 17 OID
23 4 13 10 true false false
-163 18 Name
1043 -1 1 255 true false false
-164 18 Version
1043 -1 2 50 true false false
-165 19 oid
23 4 1 0 false false false
-166 19 nspname
1043 -1 2 0 false false false
-167 20 oid
23 4 1 0 false false false
-168 20 relname
1043 -1 2 0 false false false
-169 20 relnamespace
23 4 3 0 false false false
-170 20 relkind
1042 1 4 0 false false false
-171 20 relam
23 4 5 0 false false false
-172 20 reltuples
700 4 6 0 false false false
-173 20 relpages
23 4 7 0 false false false
-174 20 relhasrules
16 1 8 0 false false false
-175 20 relhasoids
16 1 9 0 false false false
-176 21 oid
23 4 1 0 false false false
-177 21 attrelid
23 4 2 0 false false false
-178 21 attname
1043 -1 3 0 false false false
-179 21 atttypid
23 4 4 0 false false false
-180 21 attlen
21 2 5 0 false false false
-181 21 attnum
21 2 6 0 false false false
-182 21 atttypmod
23 4 7 0 false false false
-183 21 attnotnull
16 1 8 0 false false false
-184 21 attisdropped
16 1 9 0 false false false
-185 21 atthasdef
16 1 10 0 false false false
-186 22 oid
23 4 1 0 false false false
-187 22 typname
1043 -1 2 0 false false false
-188 22 typnamespace
23 4 3 0 false false false
-189 22 typlen
21 2 4 0 false false false
-190 22 typtype
1042 1 5 0 false false false
-191 22 typbasetype
23 4 6 0 false false false
-192 22 typtypmod
23 4 7 0 false false false
-193 22 typrelid
23 4 8 0 false false false
-194 22 typelem
23 4 9 0 false false false
-195 23 oid
23 4 1 0 false false false
-196 23 indexrelid
23 4 2 0 false false false
-197 23 indrelid
23 4 3 0 false false false
-198 23 indisclustered
16 1 4 0 false false false
-199 23 indisunique
16 1 5 0 false false false
-200 23 indisprimary
16 1 6 0 false false false
-201 23 indexprs
1043 -1 7 0 false false false
-202 23 indkey
1043 -1 8 0 false false false
-203 24 oid
23 4 1 0 false false false
-204 24 amname
1043 -1 2 0 false false false
-205 25 oid
23 4 1 0 false false false
-206 25 proname
1043 -1 2 0 false false false
-207 25 proretset
16 1 3 0 false false false
-208 25 prorettype
23 4 4 0 false false false
-209 25 pronargs
21 2 5 0 false false false
-210 25 proargtypes
<null> <null> 6 0 false false false
-211 25 proargnames
<null> <null> 7 0 false false false
-212 25 proargmodes
<null> <null> 8 0 false false false
-213 25 proallargtypes
<null> <null> 9 0 false false false
-214 25 pronamespace
23 4 10 0 false false false
-215 26 oid
23 4 1 0 false false false
-216 26 tgconstrrelid
23 4 2 0 false false false
-217 26 tgfoid
23 4 3 0 false false false
-218 26 tgargs
23 4 4 0 false false false
-219 26 tgnargs
23 4 5 0 false false false
-220 26 tgdeferrable
16 1 6 0 false false false
-221 26 tginitdeferred
16 1 7 0 false false false
-222 26 tgconstrname
1043 -1 8 0 false false false
-223 26 tgrelid
23 4 9 0 false false false
-224 27 adrelid
23 4 1 0 false false false
-225 27 adnum
23 4 2 0 false false false
-226 27 adbin
1043 -1 3 0 false false false
-227 27 adsrc
1043 -1 4 0 false false false
-228 28 oid
23 4 1 0 false false false
-229 28 datname
1043 -1 2 0 false false false
-230 28 encoding
23 4 3 0 false false false
-231 28 datlastsysoid
23 4 4 0 false false false
-232 28 datallowconn
1042 1 5 0 false false false
-233 28 datconfig
<null> <null> 6 0 false false false
-234 28 datacl
<null> <null> 7 0 false false false
-235 28 datdba
23 4 8 0 false false false
-236 28 dattablespace
23 4 9 0 false false false
-237 29 oid
23 4 1 0 false false false
-238 29 usename
1043 -1 2 0 false false false
-239 29 usecreatedb
16 1 3 0 false false false
-240 29 usesuper
16 1 4 0 false false false
-241 30 attrelid
23 4 1 0 false false false
-242 30 attnum
21 2 2 0 false false false
-243 30 attname
1043 -1 3 0 false false false
-244 30 relname
1043 -1 4 0 false false false
-245 30 nspname
1043 -1 5 0 false false false
-246 30 autoinc
16 1 6 0 false false false
-247 30 typoid
23 4 7 0 false false false
-248 31 oid
23 4 1 0 false false false
-249 31 typname
1043 -1 2 0 false false false
-250 31 name
1043 -1 3 0 false false false
-251 31 uid
1043 -1 4 0 false false false
-252 31 typlen
21 2 5 0 false false false
+1 1 PART_ID
1043 -1 1 8 true false false
+2 1 PART_NAME
1043 -1 2 259 false false false
+3 1 PART_COLOR
1043 -1 3 34 false false false
+4 1 PART_WEIGHT
1043 -1 4 259 false false false
+5 2 SHIPPER_ID
21 2 1 4 true false false
+6 2 SHIPPER_NAME
1043 -1 2 34 false false false
+7 3 STATUS_ID
21 2 1 4 true false false
+8 3 STATUS_NAME
1043 -1 2 34 false false false
+9 4 SUPPLIER_ID
1043 -1 1 14 true false false
+10 4 PART_ID
1043 -1 2 8 true false false
+11 4 QUANTITY
21 2 3 4 false false false
+12 4 SHIPPER_ID
21 2 4 4 false false false
+13 5 SUPPLIER_ID
1043 -1 1 14 true false false
+14 5 SUPPLIER_NAME
1043 -1 2 34 false false false
+15 5 SUPPLIER_STATUS
21 2 3 4 false false false
+16 5 SUPPLIER_CITY
1043 -1 4 34 false false false
+17 5 SUPPLIER_STATE
1043 -1 5 6 false false false
+18 6 VDBName
1043 -1 1 259 true false false
+19 6 SchemaName
1043 -1 2 259 true false false
+20 6 Name
1043 -1 3 259 true false false
+21 6 TargetSchemaName
1043 -1 4 259 false false false
+22 6 TargetName
1043 -1 5 4004 false false false
+23 6 Valid
16 1 6 4 false false false
+24 6 LoadState
1043 -1 7 259 false false false
+25 6 Updated
1114 8 8 4 false false false
+26 6 Cardinality
23 4 9 14 false false false
+27 7 resourcePath
1043 -1 1 259 false false false
+28 7 contents
14939 -1 2 4 false false false
+29 8 VDBName
1043 -1 1 259 true false false
+30 8 SchemaName
1043 -1 2 259 false false false
+31 8 TableName
1043 -1 3 259 true false false
+32 8 Name
1043 -1 4 259 true false false
+33 8 Position
23 4 5 14 true false false
+34 8 NameInSource
1043 -1 6 259 false false false
+35 8 DataType
1043 -1 7 104 true false false
+36 8 Scale
23 4 8 14 true false false
+37 8 Length
23 4 9 14 true false false
+38 8 IsLengthFixed
16 1 10 5 true false false
+39 8 SupportsSelect
16 1 11 5 true false false
+40 8 SupportsUpdates
16 1 12 5 true false false
+41 8 IsCaseSensitive
16 1 13 5 true false false
+42 8 IsSigned
16 1 14 5 true false false
+43 8 IsCurrency
16 1 15 5 true false false
+44 8 IsAutoIncremented
16 1 16 5 true false false
+45 8 NullType
1043 -1 17 24 true false false
+46 8 MinRange
1043 -1 18 54 false false false
+47 8 MaxRange
1043 -1 19 54 false false false
+48 8 DistinctCount
23 4 20 14 false false false
+49 8 NullCount
23 4 21 14 false false false
+50 8 SearchType
1043 -1 22 24 true false false
+51 8 Format
1043 -1 23 259 false false false
+52 8 DefaultValue
1043 -1 24 259 false false false
+53 8 JavaClass
1043 -1 25 504 true false false
+54 8 Precision
23 4 26 14 true false false
+55 8 CharOctetLength
23 4 27 14 false false false
+56 8 Radix
23 4 28 14 true false false
+57 8 UID
1043 -1 29 54 true false false
+58 8 Description
1043 -1 30 259 false false false
+59 8 OID
23 4 31 14 true false false
+60 9 Name
1043 -1 1 104 true false false
+61 9 IsStandard
16 1 2 5 false false false
+62 9 IsPhysical
16 1 3 5 false false false
+63 9 TypeName
1043 -1 4 104 true false false
+64 9 JavaClass
1043 -1 5 504 true false false
+65 9 Scale
23 4 6 14 false false false
+66 9 TypeLength
23 4 7 14 true false false
+67 9 NullType
1043 -1 8 24 true false false
+68 9 IsSigned
16 1 9 5 true false false
+69 9 IsAutoIncremented
16 1 10 5 true false false
+70 9 IsCaseSensitive
16 1 11 5 true false false
+71 9 Precision
23 4 12 14 true false false
+72 9 Radix
23 4 13 14 false false false
+73 9 SearchType
1043 -1 14 24 true false false
+74 9 UID
1043 -1 15 54 true false false
+75 9 RuntimeType
1043 -1 16 68 false false false
+76 9 BaseType
1043 -1 17 68 false false false
+77 9 Description
1043 -1 18 259 false false false
+78 9 OID
23 4 19 14 true false false
+79 10 VDBName
1043 -1 1 259 true false false
+80 10 SchemaName
1043 -1 2 259 false false false
+81 10 TableName
1043 -1 3 2052 true false false
+82 10 Name
1043 -1 4 259 true false false
+83 10 KeyName
1043 -1 5 259 false false false
+84 10 KeyType
1043 -1 6 24 true false false
+85 10 RefKeyUID
1043 -1 7 54 false false false
+86 10 UID
1043 -1 8 54 true false false
+87 10 Position
23 4 9 14 false false false
+88 10 OID
23 4 10 14 true false false
+89 11 VDBName
1043 -1 1 259 true false false
+90 11 SchemaName
1043 -1 2 259 false false false
+91 11 TableName
1043 -1 3 2052 true false false
+92 11 Name
1043 -1 4 259 true false false
+93 11 Description
1043 -1 5 259 false false false
+94 11 NameInSource
1043 -1 6 259 false false false
+95 11 Type
1043 -1 7 24 true false false
+96 11 IsIndexed
16 1 8 5 true false false
+97 11 RefKeyUID
1043 -1 9 54 false false false
+98 11 UID
1043 -1 10 54 true false false
+99 11 OID
23 4 11 14 true false false
+100 12 VDBName
1043 -1 1 259 true false false
+101 12 SchemaName
1043 -1 2 259 false false false
+102 12 ProcedureName
1043 -1 3 259 true false false
+103 12 Name
1043 -1 4 259 true false false
+104 12 DataType
1043 -1 5 29 true false false
+105 12 Position
23 4 6 14 true false false
+106 12 Type
1043 -1 7 104 true false false
+107 12 Optional
16 1 8 5 true false false
+108 12 Precision
23 4 9 14 true false false
+109 12 TypeLength
23 4 10 14 true false false
+110 12 Scale
23 4 11 14 true false false
+111 12 Radix
23 4 12 14 true false false
+112 12 NullType
1043 -1 13 14 true false false
+113 12 UID
1043 -1 14 54 false false false
+114 12 Description
1043 -1 15 259 false false false
+115 12 OID
23 4 16 14 true false false
+116 13 VDBName
1043 -1 1 259 true false false
+117 13 SchemaName
1043 -1 2 259 false false false
+118 13 Name
1043 -1 3 259 true false false
+119 13 NameInSource
1043 -1 4 259 false false false
+120 13 ReturnsResults
16 1 5 5 true false false
+121 13 UID
1043 -1 6 54 true false false
+122 13 Description
1043 -1 7 259 false false false
+123 13 OID
23 4 8 14 true false false
+124 14 Name
1043 -1 1 259 true false false
+125 14 Value
1043 -1 2 259 true false false
+126 14 UID
1043 -1 3 54 true false false
+127 14 OID
23 4 4 14 true false false
+128 14 ClobValue
14939 -1 5 2097156 false false false
+129 15 PKTABLE_CAT
1043 -1 1 259 false false false
+130 15 PKTABLE_SCHEM
1043 -1 2 259 false false false
+131 15 PKTABLE_NAME
1043 -1 3 259 false false false
+132 15 PKCOLUMN_NAME
1043 -1 4 259 false false false
+133 15 FKTABLE_CAT
1043 -1 5 259 false false false
+134 15 FKTABLE_SCHEM
1043 -1 6 259 false false false
+135 15 FKTABLE_NAME
1043 -1 7 259 false false false
+136 15 FKCOLUMN_NAME
1043 -1 8 259 false false false
+137 15 KEY_SEQ
21 2 9 9 false false false
+138 15 UPDATE_RULE
23 4 10 14 false false false
+139 15 DELETE_RULE
23 4 11 14 false false false
+140 15 FK_NAME
1043 -1 12 259 false false false
+141 15 PK_NAME
1043 -1 13 259 false false false
+142 15 DEFERRABILITY
23 4 14 14 false false false
+143 16 VDBName
1043 -1 1 259 false false false
+144 16 Name
1043 -1 2 259 false false false
+145 16 IsPhysical
16 1 3 5 true false false
+146 16 UID
1043 -1 4 54 true false false
+147 16 Description
1043 -1 5 259 false false false
+148 16 PrimaryMetamodelURI
1043 -1 6 259 true false false
+149 16 OID
23 4 7 14 true false false
+150 17 VDBName
1043 -1 1 259 false false false
+151 17 SchemaName
1043 -1 2 259 false false false
+152 17 Name
1043 -1 3 259 true false false
+153 17 Type
1043 -1 4 24 true false false
+154 17 NameInSource
1043 -1 5 259 false false false
+155 17 IsPhysical
16 1 6 5 true false false
+156 17 SupportsUpdates
16 1 7 5 true false false
+157 17 UID
1043 -1 8 54 true false false
+158 17 Cardinality
23 4 9 14 true false false
+159 17 Description
1043 -1 10 259 false false false
+160 17 IsSystem
16 1 11 5 false false false
+161 17 IsMaterialized
16 1 12 4 true false false
+162 17 OID
23 4 13 14 true false false
+163 18 Name
1043 -1 1 259 true false false
+164 18 Version
1043 -1 2 54 true false false
+165 19 oid
23 4 1 4 false false false
+166 19 nspname
1043 -1 2 4 false false false
+167 20 oid
23 4 1 4 false false false
+168 20 relname
1043 -1 2 4 false false false
+169 20 relnamespace
23 4 3 4 false false false
+170 20 relkind
1042 1 4 4 false false false
+171 20 relam
23 4 5 4 false false false
+172 20 reltuples
700 4 6 4 false false false
+173 20 relpages
23 4 7 4 false false false
+174 20 relhasrules
16 1 8 4 false false false
+175 20 relhasoids
16 1 9 4 false false false
+176 21 oid
23 4 1 4 false false false
+177 21 attrelid
23 4 2 4 false false false
+178 21 attname
1043 -1 3 4 false false false
+179 21 atttypid
23 4 4 4 false false false
+180 21 attlen
21 2 5 4 false false false
+181 21 attnum
21 2 6 4 false false false
+182 21 atttypmod
23 4 7 4 false false false
+183 21 attnotnull
16 1 8 4 false false false
+184 21 attisdropped
16 1 9 4 false false false
+185 21 atthasdef
16 1 10 4 false false false
+186 22 oid
23 4 1 4 false false false
+187 22 typname
1043 -1 2 4 false false false
+188 22 typnamespace
23 4 3 4 false false false
+189 22 typlen
21 2 4 4 false false false
+190 22 typtype
1042 1 5 4 false false false
+191 22 typbasetype
23 4 6 4 false false false
+192 22 typtypmod
23 4 7 4 false false false
+193 22 typrelid
23 4 8 4 false false false
+194 22 typelem
23 4 9 4 false false false
+195 23 oid
23 4 1 4 false false false
+196 23 indexrelid
23 4 2 4 false false false
+197 23 indrelid
23 4 3 4 false false false
+198 23 indisclustered
16 1 4 4 false false false
+199 23 indisunique
16 1 5 4 false false false
+200 23 indisprimary
16 1 6 4 false false false
+201 23 indexprs
1043 -1 7 4 false false false
+202 23 indkey
1043 -1 8 4 false false false
+203 24 oid
23 4 1 4 false false false
+204 24 amname
1043 -1 2 4 false false false
+205 25 oid
23 4 1 4 false false false
+206 25 proname
1043 -1 2 4 false false false
+207 25 proretset
16 1 3 4 false false false
+208 25 prorettype
23 4 4 4 false false false
+209 25 pronargs
21 2 5 4 false false false
+210 25 proargtypes
<null> <null> 6 4 false false false
+211 25 proargnames
<null> <null> 7 4 false false false
+212 25 proargmodes
<null> <null> 8 4 false false false
+213 25 proallargtypes
<null> <null> 9 4 false false false
+214 25 pronamespace
23 4 10 4 false false false
+215 26 oid
23 4 1 4 false false false
+216 26 tgconstrrelid
23 4 2 4 false false false
+217 26 tgfoid
23 4 3 4 false false false
+218 26 tgargs
23 4 4 4 false false false
+219 26 tgnargs
23 4 5 4 false false false
+220 26 tgdeferrable
16 1 6 4 false false false
+221 26 tginitdeferred
16 1 7 4 false false false
+222 26 tgconstrname
1043 -1 8 4 false false false
+223 26 tgrelid
23 4 9 4 false false false
+224 27 adrelid
23 4 1 4 false false false
+225 27 adnum
23 4 2 4 false false false
+226 27 adbin
1043 -1 3 4 false false false
+227 27 adsrc
1043 -1 4 4 false false false
+228 28 oid
23 4 1 4 false false false
+229 28 datname
1043 -1 2 4 false false false
+230 28 encoding
23 4 3 4 false false false
+231 28 datlastsysoid
23 4 4 4 false false false
+232 28 datallowconn
1042 1 5 4 false false false
+233 28 datconfig
<null> <null> 6 4 false false false
+234 28 datacl
<null> <null> 7 4 false false false
+235 28 datdba
23 4 8 4 false false false
+236 28 dattablespace
23 4 9 4 false false false
+237 29 oid
23 4 1 4 false false false
+238 29 usename
1043 -1 2 4 false false false
+239 29 usecreatedb
16 1 3 4 false false false
+240 29 usesuper
16 1 4 4 false false false
+241 30 attrelid
23 4 1 4 false false false
+242 30 attnum
21 2 2 4 false false false
+243 30 attname
1043 -1 3 4 false false false
+244 30 relname
1043 -1 4 4 false false false
+245 30 nspname
1043 -1 5 4 false false false
+246 30 autoinc
16 1 6 4 false false false
+247 30 typoid
23 4 7 4 false false false
+248 31 oid
23 4 1 4 false false false
+249 31 typname
1043 -1 2 4 false false false
+250 31 name
1043 -1 3 4 false false false
+251 31 uid
1043 -1 4 4 false false false
+252 31 typlen
21 2 5 4 false false false
Row Count : 252
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
oid 4 PartsSupplier java.lang.Integer oid integer
pg_catalog pg_attribute 11 10 0
false false false false 2 true
true false false
Modified:
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedureColumns.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedureColumns.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedureColumns.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -2,6 +2,13 @@
VDBName SchemaName
ProcedureName
Name
COLUMN_TYPE DATA_TYPE DataType PRECISION LENGTH SCALE
Radix NULLABLE Description
COLUMN_DEF SQL_DATA_TYPE
SQL_DATETIME_SUB
CHAR_OCTET_LENGTH
Position IS_NULLABLE
ProcedureName
PartsSupplier SYS
getXMLSchemas
document 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
getXMLSchemas
PartsSupplier SYS
getXMLSchemas
schema 3
2009 xml 2147483647 2147483647 0 10
1 <null>
<null> <null>
<null>
<null>
1 YES
getXMLSchemas
+PartsSupplier SYSADMIN
isLoggable
level 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
isLoggable
+PartsSupplier SYSADMIN
isLoggable
context 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
isLoggable
+PartsSupplier SYSADMIN
isLoggable
loggable 5
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
isLoggable
+PartsSupplier SYSADMIN
logMsg
level 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
logMsg
+PartsSupplier SYSADMIN
logMsg
context 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
logMsg
+PartsSupplier SYSADMIN
logMsg
msg 1
2000 object 2147483647 2147483647 0 10
0 <null>
<null> <null>
<null>
<null>
4 NO
logMsg
+PartsSupplier SYSADMIN
logMsg
logged 5
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
logMsg
PartsSupplier SYSADMIN
refreshMatView
ViewName 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
refreshMatView
PartsSupplier SYSADMIN
refreshMatView
Invalidate 1
-7 boolean 1 1 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
refreshMatView
PartsSupplier SYSADMIN
refreshMatView
RowsUpdated 5
4 integer 10 10 0 10
0 <null>
<null> <null>
<null>
<null>
3 NO
refreshMatView
@@ -20,7 +27,7 @@
PartsSupplier SYSADMIN
setProperty
OldValue 5
2005 clob 2147483647 2097152 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
setProperty
PartsSupplier SYSADMIN
setTableStats
tableName 1
12 string 4000 4000 0 10
0 <null>
<null> <null>
<null>
<null>
1 NO
setTableStats
PartsSupplier SYSADMIN
setTableStats
cardinality 1
4 integer 10 10 0 10
0 <null>
<null> <null>
<null>
<null>
2 NO
setTableStats
-Row Count : 20
+Row Count : 27
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 PartsSupplier java.lang.String PROCEDURE_CAT
string SYS ProcedureParams 255 255 0
false false false false 0 true
true false false
SchemaName 12 PartsSupplier java.lang.String PROCEDURE_SCHEM
string SYS ProcedureParams 255 255 0
false true false true 1
false true true true
Modified:
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedures.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedures.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestPartsDatabaseMetadata/testProcedures.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,12 +1,14 @@
string string
string
string
string string
string
short string
VDBName SchemaName
Name
RESERVED_1
RESERVED_2 RESERVED_3
Description
PROCEDURE_TYPE Name
PartsSupplier SYS
getXMLSchemas
<null>
<null> <null>
<null>
2 getXMLSchemas
+PartsSupplier SYSADMIN
isLoggable
<null>
<null> <null>
<null>
1 isLoggable
+PartsSupplier SYSADMIN
logMsg
<null>
<null> <null>
<null>
1 logMsg
PartsSupplier SYSADMIN
refreshMatView
<null>
<null> <null>
<null>
1 refreshMatView
PartsSupplier SYSADMIN
refreshMatViewRow
<null>
<null> <null>
<null>
1 refreshMatViewRow
PartsSupplier SYSADMIN
setColumnStats
<null>
<null> <null>
<null>
1 setColumnStats
PartsSupplier SYSADMIN
setProperty
<null>
<null> <null>
<null>
1 setProperty
PartsSupplier SYSADMIN
setTableStats
<null>
<null> <null>
<null>
1 setTableStats
-Row Count : 6
+Row Count : 8
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 PartsSupplier java.lang.String PROCEDURE_CAT
string SYS Procedures 255 255 0
false false false false 0 true
true false false
SchemaName 12 PartsSupplier java.lang.String PROCEDURE_SCHEM
string SYS Procedures 255 255 0
false true false true 1 false
true true true
Modified:
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,26 +1,33 @@
string string
string
string
string integer string
boolean integer integer integer integer string
string string
integer
VDBName SchemaName
ProcedureName
Name
DataType Position Type
Optional Precision TypeLength Scale Radix NullType
UID Description
OID
-PartsSupplier SYSADMIN
refreshMatView
Invalidate
boolean 2 In
false 0 0 0 10 No Nulls
mmuuid:5736cfd3-750f-42d8-b083-102061e11c60 <null>
5
-PartsSupplier SYSADMIN
refreshMatViewRow
Key
object 2 In
false 0 0 0 10 No Nulls
mmuuid:7af5a63b-1b91-4d1e-912e-846a7e84c579 <null>
2
-PartsSupplier SYSADMIN
setProperty
Name
string 3 In
false 0 0 0 10 No Nulls
mmuuid:ea92812c-1516-4c75-b5d3-c531fdbd8475 <null>
15
-PartsSupplier SYSADMIN
setProperty
OldValue
clob 1 ReturnValue
false 0 2097152 0 10 No Nulls
mmuuid:48034d50-dd11-4653-aeae-b0d8d3d55656 <null>
13
-PartsSupplier SYSADMIN
refreshMatViewRow
RowsUpdated
integer 3 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:05a6a9be-c014-4d06-bcac-746cee4f118b <null>
3
-PartsSupplier SYSADMIN
refreshMatView
RowsUpdated
integer 3 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:d07a6a75-aa12-4dac-8eab-b2acdbaaffd8 <null>
6
-PartsSupplier SYSADMIN
setProperty
UID
string 2 In
false 0 50 0 10 No Nulls
mmuuid:d377510e-2ec5-445e-bdf0-59c7c0380962 <null>
14
-PartsSupplier SYSADMIN
setProperty
Value
clob 4 In
false 0 2097152 0 10 Nullable
mmuuid:ac5beeb8-2d0d-48ff-a533-4237d53b67e8 <null>
16
-PartsSupplier SYSADMIN
refreshMatViewRow
ViewName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:ba635c44-a052-496d-9c35-ca010c0ebebe <null>
1
-PartsSupplier SYSADMIN
refreshMatView
ViewName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:e0c28e00-d987-48e4-8c60-5f637f10bf33 <null>
4
-PartsSupplier SYSADMIN
setTableStats
cardinality
integer 2 In
false 0 0 0 10 No Nulls
mmuuid:0aba7849-7fd3-4bc6-a3d3-dfe433bc67a4 <null>
18
-PartsSupplier SYSADMIN
setColumnStats
columnName
string 2 In
false 0 0 0 10 No Nulls
mmuuid:76553706-632f-4e60-8489-9d0361f58541 <null>
8
-PartsSupplier SYSADMIN
setColumnStats
distinctCount
integer 3 In
false 0 0 0 10 Nullable
mmuuid:2c61976e-abb5-4c74-bdae-278681b82aa3 <null>
9
-PartsSupplier SYS
getXMLSchemas
document
string 1 In
false 0 0 0 10 No Nulls
mmuuid:85b88af5-f0b8-401f-b35a-ccee56155492 <null>
19
-PartsSupplier SYSADMIN
setColumnStats
max
string 5 In
false 0 0 0 10 Nullable
mmuuid:8f42e701-3609-413d-8c10-77e32cd816f2 <null>
11
-PartsSupplier SYSADMIN
setColumnStats
min
string 6 In
false 0 0 0 10 Nullable
mmuuid:4511ea3f-f2d2-4abf-b363-afb5186bc2d2 <null>
12
-PartsSupplier SYSADMIN
setColumnStats
nullCount
integer 4 In
false 0 0 0 10 Nullable
mmuuid:44b8c83c-9fcd-4bd2-a730-76e401205536 <null>
10
-PartsSupplier SYS
getXMLSchemas
schema xml
1 ResultSet
false 0 0 0 10 Nullable
mmuuid:003980bb-38bb-41ad-b8c2-c87ca47aa554 <null>
20
-PartsSupplier SYSADMIN
setColumnStats
tableName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:4dcab018-ca4a-467b-96cc-7f28734c840e <null>
7
-PartsSupplier SYSADMIN
setTableStats
tableName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:28d8ad4a-e091-4934-afd9-7d27310bd370 <null>
17
-Row Count : 20
+PartsSupplier SYSADMIN
refreshMatView
Invalidate
boolean 2 In
false 0 0 0 10 No Nulls
mmuuid:5736cfd3-750f-42d8-b083-102061e11c60 <null>
12
+PartsSupplier SYSADMIN
refreshMatViewRow
Key
object 2 In
false 0 0 0 10 No Nulls
mmuuid:7af5a63b-1b91-4d1e-912e-846a7e84c579 <null>
9
+PartsSupplier SYSADMIN
setProperty
Name
string 3 In
false 0 0 0 10 No Nulls
mmuuid:ea92812c-1516-4c75-b5d3-c531fdbd8475 <null>
22
+PartsSupplier SYSADMIN
setProperty
OldValue
clob 1 ReturnValue
false 0 2097152 0 10 No Nulls
mmuuid:48034d50-dd11-4653-aeae-b0d8d3d55656 <null>
20
+PartsSupplier SYSADMIN
refreshMatViewRow
RowsUpdated
integer 3 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:05a6a9be-c014-4d06-bcac-746cee4f118b <null>
10
+PartsSupplier SYSADMIN
refreshMatView
RowsUpdated
integer 3 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:d07a6a75-aa12-4dac-8eab-b2acdbaaffd8 <null>
13
+PartsSupplier SYSADMIN
setProperty
UID
string 2 In
false 0 50 0 10 No Nulls
mmuuid:d377510e-2ec5-445e-bdf0-59c7c0380962 <null>
21
+PartsSupplier SYSADMIN
setProperty
Value
clob 4 In
false 0 2097152 0 10 Nullable
mmuuid:ac5beeb8-2d0d-48ff-a533-4237d53b67e8 <null>
23
+PartsSupplier SYSADMIN
refreshMatViewRow
ViewName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:ba635c44-a052-496d-9c35-ca010c0ebebe <null>
8
+PartsSupplier SYSADMIN
refreshMatView
ViewName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:e0c28e00-d987-48e4-8c60-5f637f10bf33 <null>
11
+PartsSupplier SYSADMIN
setTableStats
cardinality
integer 2 In
false 0 0 0 10 No Nulls
mmuuid:0aba7849-7fd3-4bc6-a3d3-dfe433bc67a4 <null>
25
+PartsSupplier SYSADMIN
setColumnStats
columnName
string 2 In
false 0 0 0 10 No Nulls
mmuuid:76553706-632f-4e60-8489-9d0361f58541 <null>
15
+PartsSupplier SYSADMIN
isLoggable
context
string 3 In
false 0 0 0 10 No Nulls
mmuuid:d62e3ceb-8e58-4c22-96b7-d76ee923e180 <null>
3
+PartsSupplier SYSADMIN
logMsg
context
string 3 In
false 0 0 0 10 No Nulls
mmuuid:c3f22b88-7f80-4ae3-8e60-6953722b8c38 <null>
6
+PartsSupplier SYSADMIN
setColumnStats
distinctCount
integer 3 In
false 0 0 0 10 Nullable
mmuuid:2c61976e-abb5-4c74-bdae-278681b82aa3 <null>
16
+PartsSupplier SYS
getXMLSchemas
document
string 1 In
false 0 0 0 10 No Nulls
mmuuid:85b88af5-f0b8-401f-b35a-ccee56155492 <null>
26
+PartsSupplier SYSADMIN
isLoggable
level
string 2 In
false 0 0 0 10 No Nulls
mmuuid:995ab23a-3fd8-4ce0-aedd-6dcf99a65be1 <null>
2
+PartsSupplier SYSADMIN
logMsg
level
string 2 In
false 0 0 0 10 No Nulls
mmuuid:ce0fd267-0038-49d5-ab1c-d8166d556b72 <null>
5
+PartsSupplier SYSADMIN
isLoggable
loggable
boolean 1 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:589773e4-2f8c-4972-ac0d-d694e317f154 <null>
1
+PartsSupplier SYSADMIN
logMsg
logged
boolean 1 ReturnValue
false 0 0 0 10 No Nulls
mmuuid:3086a5d9-ae1a-4c99-a649-ad9b8d3db8da <null>
4
+PartsSupplier SYSADMIN
setColumnStats
max
string 5 In
false 0 0 0 10 Nullable
mmuuid:8f42e701-3609-413d-8c10-77e32cd816f2 <null>
18
+PartsSupplier SYSADMIN
setColumnStats
min
string 6 In
false 0 0 0 10 Nullable
mmuuid:4511ea3f-f2d2-4abf-b363-afb5186bc2d2 <null>
19
+PartsSupplier SYSADMIN
logMsg
msg
object 4 In
false 0 0 0 10 No Nulls
mmuuid:81b921cc-9417-4655-898b-3d587ad3af16 <null>
7
+PartsSupplier SYSADMIN
setColumnStats
nullCount
integer 4 In
false 0 0 0 10 Nullable
mmuuid:44b8c83c-9fcd-4bd2-a730-76e401205536 <null>
17
+PartsSupplier SYS
getXMLSchemas
schema xml
1 ResultSet
false 0 0 0 10 Nullable
mmuuid:003980bb-38bb-41ad-b8c2-c87ca47aa554 <null>
27
+PartsSupplier SYSADMIN
setColumnStats
tableName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:4dcab018-ca4a-467b-96cc-7f28734c840e <null>
14
+PartsSupplier SYSADMIN
setTableStats
tableName
string 1 In
false 0 0 0 10 No Nulls
mmuuid:28d8ad4a-e091-4934-afd9-7d27310bd370 <null>
24
+Row Count : 27
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 PartsSupplier java.lang.String VDBName string
SYS ProcedureParams 255 255 0
false false false false 0 true
true false false
SchemaName 12 PartsSupplier java.lang.String SchemaName string
SYS ProcedureParams 255 255 0
false true false true 1 false
true true true
Property changes on:
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedureParams.expected:3220-3275
Modified:
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected
===================================================================
---
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected 2011-06-28
03:47:29 UTC (rev 3280)
@@ -1,12 +1,14 @@
string string
string
string
boolean string string
integer
VDBName SchemaName
Name
NameInSource
ReturnsResults UID Description
OID
-PartsSupplier SYS
getXMLSchemas
<null>
true mmuuid:68497bd9-30f5-461b-bf13-6b26aeb2fc4f <null>
6
-PartsSupplier SYSADMIN
refreshMatView
<null>
false mmuuid:52178344-dca8-4c76-8549-00a4515c7044 <null>
2
-PartsSupplier SYSADMIN
refreshMatViewRow
<null>
false mmuuid:1674912b-af56-465a-a1b9-d1de8b761f10 <null>
1
-PartsSupplier SYSADMIN
setColumnStats
<null>
false mmuuid:49c367be-918f-43be-8b9e-99e275179859 <null>
3
-PartsSupplier SYSADMIN
setProperty
<null>
false mmuuid:8db9b08e-3d6e-415a-9ceb-3fef726f424c <null>
4
-PartsSupplier SYSADMIN
setTableStats
<null>
false mmuuid:6d167c35-04d1-41f6-83ff-888c39423823 <null>
5
-Row Count : 6
+PartsSupplier SYS
getXMLSchemas
<null>
true mmuuid:68497bd9-30f5-461b-bf13-6b26aeb2fc4f <null>
8
+PartsSupplier SYSADMIN
isLoggable
<null>
false mmuuid:36769e93-4cc3-417b-853e-5ee5e6653d01 <null>
1
+PartsSupplier SYSADMIN
logMsg
<null>
false mmuuid:9a754e95-853b-40b2-a085-56d57f45953d <null>
2
+PartsSupplier SYSADMIN
refreshMatView
<null>
false mmuuid:52178344-dca8-4c76-8549-00a4515c7044 <null>
4
+PartsSupplier SYSADMIN
refreshMatViewRow
<null>
false mmuuid:1674912b-af56-465a-a1b9-d1de8b761f10 <null>
3
+PartsSupplier SYSADMIN
setColumnStats
<null>
false mmuuid:49c367be-918f-43be-8b9e-99e275179859 <null>
5
+PartsSupplier SYSADMIN
setProperty
<null>
false mmuuid:8db9b08e-3d6e-415a-9ceb-3fef726f424c <null>
6
+PartsSupplier SYSADMIN
setTableStats
<null>
false mmuuid:6d167c35-04d1-41f6-83ff-888c39423823 <null>
7
+Row Count : 8
getColumnName getColumnType getCatalogName getColumnClassName getColumnLabel
getColumnTypeName getSchemaName getTableName getColumnDisplaySize getPrecision
getScale isAutoIncrement isCaseSensitive isCurrency isDefinitelyWritable isNullable
isReadOnly isSearchable isSigned isWritable
VDBName 12 PartsSupplier java.lang.String VDBName string
SYS Procedures 255 255 0
false false false false 0 true
true false false
SchemaName 12 PartsSupplier java.lang.String SchemaName string
SYS Procedures 255 255 0
false true false true 1 false
true true true
Property changes on:
trunk/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected
___________________________________________________________________
Added: svn:mergeinfo
+
/branches/7.4.x/test-integration/common/src/test/resources/TestSystemVirtualModel/testProcedures.expected:3220-3275
Modified:
trunk/test-integration/db/src/test/java/org/teiid/dynamicvdb/TestVDBLessExecution.java
===================================================================
---
trunk/test-integration/db/src/test/java/org/teiid/dynamicvdb/TestVDBLessExecution.java 2011-06-28
03:27:07 UTC (rev 3279)
+++
trunk/test-integration/db/src/test/java/org/teiid/dynamicvdb/TestVDBLessExecution.java 2011-06-28
03:47:29 UTC (rev 3280)
@@ -40,7 +40,7 @@
private static final String DQP_PROP_FILE = UnitTestUtil.getTestDataPath() +
"/vdbless/dqp.properties;user=test"; //$NON-NLS-1$
private static final String VDB = "VDBLess"; //$NON-NLS-1$
- @Test public void testExecution() {
+ @Test public void testExecution() throws Exception {
getConnection(VDB, DQP_PROP_FILE);
executeAndAssertResults("select * from Example", new String[] {
//$NON-NLS-1$
"TRADEID[string] NOTIONAL[integer]", //$NON-NLS-1$
@@ -51,7 +51,7 @@
closeConnection();
}
- @Test public void testIntegrationExecution() {
+ @Test public void testIntegrationExecution() throws Exception {
getConnection(VDB, DQP_PROP_FILE);
executeAndAssertResults("select * from Example, Smalla where notional =
intkey", new String[] { //$NON-NLS-1$
"TRADEID[string] NOTIONAL[integer] INTKEY[integer] STRINGKEY[string]
INTNUM[integer] STRINGNUM[string] FLOATNUM[float] LONGNUM[long]
DOUBLENUM[double] BYTENUM[short] DATEVALUE[date] TIMEVALUE[time]
TIMESTAMPVALUE[timestamp] BOOLEANVALUE[short] CHARVALUE[string] SHORTVALUE[short]
BIGINTEGERVALUE[long] BIGDECIMALVALUE[bigdecimal] OBJECTVALUE[string]",
//$NON-NLS-1$
@@ -64,7 +64,7 @@
/**
* We have no results to assert here since derby does not provide procedure resultset
columns in their metadata.
*/
- @Test public void testProcedureExecution() {
+ @Test public void testProcedureExecution() throws Exception {
getConnection(VDB, DQP_PROP_FILE);
execute("exec Derby.SQLUDTS(null, null, null, null, null)");
//$NON-NLS-1$
closeConnection();