teiid SVN: r4242 - in trunk: api/src/main/java/org/teiid/metadata and 18 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-16 21:00:58 -0400 (Mon, 16 Jul 2012)
New Revision: 4242
Modified:
trunk/api/src/main/java/org/teiid/language/SQLConstants.java
trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java
trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java
trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java
trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java
trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java
trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java
trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java
trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
trunk/engine/src/main/resources/org/teiid/query/i18n.properties
trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java
trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java
trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.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/validator/TestValidator.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java
trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java
Log:
TEIID-2103 various metadata updates and additional validations
Modified: trunk/api/src/main/java/org/teiid/language/SQLConstants.java
===================================================================
--- trunk/api/src/main/java/org/teiid/language/SQLConstants.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/api/src/main/java/org/teiid/language/SQLConstants.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -118,6 +118,7 @@
public static final String DISABLED = "DISABLED"; //$NON-NLS-1$
public static final String TRIM = "TRIM"; //$NON-NLS-1$
+ public static final String RESULT = "RESULT"; //$NON-NLS-1$
}
public interface Reserved {
@@ -293,6 +294,7 @@
public static final String OUTER = "OUTER"; //$NON-NLS-1$
public static final String OUTPUT = "OUTPUT"; //$NON-NLS-1$
public static final String OPTION = "OPTION"; //$NON-NLS-1$
+ public static final String OPTIONS = "OPTIONS"; //$NON-NLS-1$
public static final String OVER = "OVER"; //$NON-NLS-1$
public static final String OVERLAPS = "OVERLAPS"; //$NON-NLS-1$
public static final String PARAMETER = "PARAMETER"; //$NON-NLS-1$
Modified: trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java
===================================================================
--- trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/api/src/main/java/org/teiid/metadata/ProcedureParameter.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -23,17 +23,15 @@
package org.teiid.metadata;
/**
- * ProcedureParameterRecordImpl
+ * Represents a procedure parameter
*/
public class ProcedureParameter extends BaseColumn {
private static final long serialVersionUID = 3484281155208939073L;
public enum Type {
- Unknown,
In,
InOut,
- Result,
Out,
ReturnValue
}
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 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/connectors/translator-jdbc/src/main/java/org/teiid/translator/jdbc/JDBCMetdataProcessor.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -43,15 +43,15 @@
import org.teiid.logging.LogManager;
import org.teiid.metadata.AbstractMetadataRecord;
import org.teiid.metadata.BaseColumn;
-import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.metadata.Column;
import org.teiid.metadata.DuplicateRecordException;
import org.teiid.metadata.ForeignKey;
import org.teiid.metadata.KeyRecord;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.Procedure;
+import org.teiid.metadata.Table;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.metadata.ProcedureParameter.Type;
-import org.teiid.metadata.Table;
import org.teiid.translator.TranslatorException;
import org.teiid.translator.TypeFacility;
@@ -175,12 +175,26 @@
BaseColumn record = null;
int precision = columns.getInt(8);
String runtimeType = getRuntimeType(sqlType, typeName, precision);
- if (columnType == DatabaseMetaData.procedureColumnResult) {
+ switch (columnType) {
+ case DatabaseMetaData.procedureColumnResult:
Column column = metadataFactory.addProcedureResultSetColumn(columnName, runtimeType, procedure);
record = column;
column.setNativeType(typeName);
- } else {
- record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.values()[columnType], procedure);
+ break;
+ case DatabaseMetaData.procedureColumnIn:
+ record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.In, procedure);
+ break;
+ case DatabaseMetaData.procedureColumnInOut:
+ record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.InOut, procedure);
+ break;
+ case DatabaseMetaData.procedureColumnOut:
+ record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.Out, procedure);
+ break;
+ case DatabaseMetaData.procedureColumnReturn:
+ record = metadataFactory.addProcedureParameter(columnName, runtimeType, Type.ReturnValue, procedure);
+ break;
+ default:
+ continue; //shouldn't happen
}
record.setPrecision(columns.getInt(8));
record.setLength(columns.getInt(9));
Modified: trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/QueryPlugin.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -526,5 +526,7 @@
TEIID31103,
TEIID31104, //recursion limit hit
TEIID31105, //warning
+ TEIID31106, //duplicate param name
+ TEIID31107, //too many result params
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/SystemFunctionManager.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -27,7 +27,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.metadata.FunctionMetadataValidator;
import org.teiid.query.function.source.SystemSource;
-import org.teiid.query.report.ActivityReport;
+import org.teiid.query.validator.ValidatorReport;
public class SystemFunctionManager {
@@ -42,7 +42,7 @@
SystemSource systemSource = new SystemSource(this.allowEnvFunction);
// Validate the system source - should never fail
- ActivityReport report = new ActivityReport("Function Validation"); //$NON-NLS-1$
+ ValidatorReport report = new ValidatorReport("Function Validation"); //$NON-NLS-1$
Collection functionMethods = systemSource.getFunctionMethods();
FunctionMetadataValidator.validateFunctionMethods(functionMethods,report);
if(report.hasItems()) {
Modified: trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/metadata/FunctionMetadataValidator.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -31,7 +31,7 @@
import org.teiid.metadata.FunctionParameter;
import org.teiid.metadata.FunctionMethod.PushDown;
import org.teiid.query.QueryPlugin;
-import org.teiid.query.report.ActivityReport;
+import org.teiid.query.validator.ValidatorReport;
/**
@@ -56,7 +56,7 @@
* @param methods Collection of {@link FunctionMethod} objects
* @param report Report to store validation errors
*/
- public static final void validateFunctionMethods(Collection<FunctionMethod> methods, ActivityReport report) {
+ public static final void validateFunctionMethods(Collection<FunctionMethod> methods, ValidatorReport report) {
if(methods != null) {
for (FunctionMethod method : methods) {
validateFunctionMethod(method, report);
@@ -77,7 +77,7 @@
* @param method The method to validate
* @param report The report to update during validation
*/
- public static final void validateFunctionMethod(FunctionMethod method, ActivityReport report) {
+ public static final void validateFunctionMethod(FunctionMethod method, ValidatorReport report) {
if(method == null) {
updateReport(report, method, QueryPlugin.Util.getString("ERR.015.001.0052", "FunctionMethod")); //$NON-NLS-1$ //$NON-NLS-2$
return; // can't validate
@@ -111,7 +111,7 @@
* @param method The function method
* @param message The message about the validation failure
*/
- private static final void updateReport(ActivityReport report, FunctionMethod method, String message) {
+ private static final void updateReport(ValidatorReport report, FunctionMethod method, String message) {
report.addItem(new InvalidFunctionItem(method, message));
}
Modified: trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/function/metadata/InvalidFunctionItem.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -23,14 +23,16 @@
package org.teiid.query.function.metadata;
import org.teiid.metadata.FunctionMethod;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorFailure;
/**
* This is a specialized report item for reporting invalid function methods during
* function metadata validation. It is overrides ReportItem and adds an additional
* attribute with the method reference for the invalid method.
*/
-public class InvalidFunctionItem extends ReportItem {
+public class InvalidFunctionItem extends ValidatorFailure {
+
+ private static final long serialVersionUID = 5679334286895174700L;
/**
* Report item type
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/DDLConstants.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -26,15 +26,7 @@
public static final String JAVA_CLASS = "JAVA_CLASS";//$NON-NLS-1$
public static final String DETERMINISM = "DETERMINISM";//$NON-NLS-1$
public static final String CATEGORY = "CATEGORY";//$NON-NLS-1$
- public static final String FUNCTION2 = "FUNCTION";//$NON-NLS-1$
- public static final String OUT = "OUT";//$NON-NLS-1$
- public static final String INOUT = "INOUT";//$NON-NLS-1$
- public static final String IN = "IN";//$NON-NLS-1$
public static final String UPDATECOUNT = "UPDATECOUNT";//$NON-NLS-1$
- public static final String RETURNS = "RETURNS";//$NON-NLS-1$
- public static final String PROCEDURE2 = "PROCEDURE";//$NON-NLS-1$
- public static final String FOREIGN = "FOREIGN";//$NON-NLS-1$
- public static final String VIRTUAL = "VIRTUAL";//$NON-NLS-1$
public static final String DISTINCT_VALUES = "DISTINCT_VALUES";//$NON-NLS-1$
public static final String NULL_VALUE_COUNT = "NULL_VALUE_COUNT";//$NON-NLS-1$
public static final String RADIX = "RADIX";//$NON-NLS-1$
@@ -48,13 +40,10 @@
public static final String SIGNED = "SIGNED";//$NON-NLS-1$
public static final String SELECTABLE = "SELECTABLE";//$NON-NLS-1$
public static final String CASE_SENSITIVE = "CASE_SENSITIVE";//$NON-NLS-1$
- public static final String DEFAULT = "DEFAULT";//$NON-NLS-1$
public static final String AUTO_INCREMENT = "AUTO_INCREMENT";//$NON-NLS-1$
public static final String NOT_NULL = "NOT NULL";//$NON-NLS-1$
- public static final String REFERENCES = "REFERENCES";//$NON-NLS-1$
public static final String FOREIGN_KEY = "FOREIGN KEY";//$NON-NLS-1$
public static final String INDEX = "INDEX";//$NON-NLS-1$
- public static final String UNIQUE = "UNIQUE";//$NON-NLS-1$
public static final String PRIMARY_KEY = "PRIMARY KEY";//$NON-NLS-1$
public static final String ACCESSPATTERN = "ACCESSPATTERN";//$NON-NLS-1$
public static final String NAMEINSOURCE = "NAMEINSOURCE";//$NON-NLS-1$
@@ -66,12 +55,5 @@
public static final String MATERIALIZED = "MATERIALIZED";//$NON-NLS-1$
public static final String INSTEAD_OF = "INSTEAD OF";//$NON-NLS-1$
public static final String CREATE_TRIGGER_ON = "CREATE TRIGGER ON";//$NON-NLS-1$
- public static final String DELETE = "DELETE";//$NON-NLS-1$
- public static final String UPDATE = "UPDATE";//$NON-NLS-1$
- public static final String INSERT = "INSERT";//$NON-NLS-1$
- public static final String OPTIONS2 = "OPTIONS";//$NON-NLS-1$
- public static final String CONSTRAINT = "CONSTRAINT";//$NON-NLS-1$
- public static final String VIEW = "VIEW";//$NON-NLS-1$
public static final String FOREIGN_TABLE = "FOREIGN TABLE";//$NON-NLS-1$
- public static final String CREATE = "CREATE";//$NON-NLS-1$
}
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/DDLStringVisitor.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -21,32 +21,22 @@
*/
package org.teiid.query.metadata;
-import static org.teiid.language.SQLConstants.Tokens.COMMA;
-import static org.teiid.language.SQLConstants.Tokens.LPAREN;
-import static org.teiid.language.SQLConstants.Tokens.RPAREN;
-import static org.teiid.language.SQLConstants.Tokens.SPACE;
-import static org.teiid.language.SQLConstants.Tokens.TICK;
+import static org.teiid.language.SQLConstants.NonReserved.*;
+import static org.teiid.language.SQLConstants.Reserved.*;
+import static org.teiid.language.SQLConstants.Tokens.*;
import static org.teiid.query.metadata.DDLConstants.*;
import java.util.EnumSet;
import java.util.List;
+import java.util.regex.Pattern;
import org.teiid.adminapi.Admin.SchemaObjectType;
import org.teiid.language.SQLConstants;
-import org.teiid.metadata.AbstractMetadataRecord;
+import org.teiid.language.SQLConstants.NonReserved;
+import org.teiid.metadata.*;
import org.teiid.metadata.BaseColumn.NullType;
-import org.teiid.metadata.Column;
-import org.teiid.metadata.ColumnSet;
-import org.teiid.metadata.ForeignKey;
-import org.teiid.metadata.FunctionMethod;
import org.teiid.metadata.FunctionMethod.Determinism;
-import org.teiid.metadata.FunctionParameter;
-import org.teiid.metadata.KeyRecord;
-import org.teiid.metadata.Procedure;
-import org.teiid.metadata.ProcedureParameter;
import org.teiid.metadata.ProcedureParameter.Type;
-import org.teiid.metadata.Schema;
-import org.teiid.metadata.Table;
public class DDLStringVisitor {
private static final String TAB = "\t"; //$NON-NLS-1$
@@ -56,7 +46,7 @@
private boolean includeTables = true;
private boolean includeProcedures = true;
private boolean includeFunctions = true;
- private String filter;
+ private Pattern filter;
public static String getDDLString(Schema schema, EnumSet<SchemaObjectType> types, String regexPattern) {
DDLStringVisitor visitor = new DDLStringVisitor(types, regexPattern);
@@ -70,7 +60,9 @@
this.includeProcedures = types.contains(SchemaObjectType.PROCEDURES);
this.includeFunctions = types.contains(SchemaObjectType.FUNCTIONS);
}
- this.filter = regexPattern;
+ if (regexPattern != null) {
+ this.filter = Pattern.compile(regexPattern);
+ }
}
private void visit(Schema schema) {
@@ -117,7 +109,7 @@
}
private void visit(Table table) {
- if (this.filter != null && !table.getName().matches(this.filter)) {
+ if (this.filter != null && !filter.matcher(table.getName()).matches()) {
return;
}
@@ -159,7 +151,7 @@
// options
String options = buildTableOptions(table);
if (!options.isEmpty()) {
- buffer.append(SPACE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+ buffer.append(SPACE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
}
if (table.isVirtual()) {
@@ -194,13 +186,13 @@
addCommonOptions(options, table);
if (table.isMaterialized()) {
- addOption(options, MATERIALIZED, String.valueOf(table.isMaterialized()));
+ addOption(options, MATERIALIZED, table.isMaterialized());
if (table.getMaterializedTable() != null) {
addOption(options, MATERIALIZED_TABLE, table.getMaterializedTable().getName());
}
}
if (table.supportsUpdate()) {
- addOption(options, UPDATABLE, String.valueOf(table.supportsUpdate()));
+ addOption(options, UPDATABLE, table.supportsUpdate());
}
if (table.getCardinality() != -1) {
addOption(options, CARDINALITY, table.getCardinality());
@@ -299,58 +291,44 @@
return options.toString();
}
- private void addColumns(StringBuilder options, List<Column> columns, boolean includeType) {
- options.append(LPAREN);
+ private void addColumns(StringBuilder builder, List<Column> columns, boolean includeType) {
+ builder.append(LPAREN);
boolean first = true;
for (Column c:columns) {
if (first) {
first = false;
}
else {
- options.append(COMMA).append(SPACE);
+ builder.append(COMMA).append(SPACE);
}
- options.append(c.getName());
+ appendColumn(builder, c, true, includeType);
if (includeType) {
- options.append(SPACE).append(c.getDatatype().getName());
+ appendColumnOptions(builder, c);
}
}
- options.append(RPAREN);
+ builder.append(RPAREN);
}
-
- private void addNames(StringBuilder options, List<String> columns) {
+
+ private void addNames(StringBuilder builder, List<String> columns) {
if (columns != null) {
- options.append(LPAREN);
+ builder.append(LPAREN);
boolean first = true;
for (String c:columns) {
if (first) {
first = false;
}
else {
- options.append(COMMA).append(SPACE);
+ builder.append(COMMA).append(SPACE);
}
- options.append(c);
+ builder.append(c);
}
- options.append(RPAREN);
+ builder.append(RPAREN);
}
}
private void visit(Column column, Table table) {
- buffer.append(NEWLINE).append(TAB).append(column.getName()).append(SPACE).append(column.getDatatype().getName());
- if (column.getLength() != 0) {
- buffer.append(LPAREN).append(column.getLength()).append(RPAREN);
- }
- else if (column.getPrecision() != 0){
- buffer.append(LPAREN).append(column.getPrecision());
- if (column.getScale() != 0) {
- buffer.append(COMMA).append(column.getScale());
- }
- buffer.append(RPAREN);
- }
- if (column.getNullType() != null) {
- if (column.getNullType() == NullType.No_Nulls) {
- buffer.append(SPACE).append(NOT_NULL);
- }
- }
+ buffer.append(NEWLINE).append(TAB);
+ appendColumn(buffer, column, true, true);
if (column.isAutoIncremented()) {
buffer.append(SPACE).append(AUTO_INCREMENT);
@@ -387,32 +365,63 @@
}
// options
- String options = buildColumnOptions(column, table);
- if (!options.isEmpty()) {
- buffer.append(SPACE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+ appendColumnOptions(buffer, column);
+ }
+
+ private void appendColumn(StringBuilder builder, BaseColumn column, boolean includeName, boolean includeType) {
+ if (includeName) {
+ builder.append(column.getName());
}
+ if (includeType) {
+ builder.append(SPACE).append(column.getDatatype().getName());
+ if (column.getLength() != 0) {
+ builder.append(LPAREN).append(column.getLength()).append(RPAREN);
+ }
+ else if (column.getPrecision() != 0){
+ builder.append(LPAREN).append(column.getPrecision());
+ if (column.getScale() != 0) {
+ builder.append(COMMA).append(column.getScale());
+ }
+ builder.append(RPAREN);
+ }
+ if (column.getNullType() == NullType.No_Nulls) {
+ builder.append(SPACE).append(NOT_NULL);
+ }
+ }
}
- private String buildColumnOptions(Column column, Table table) {
+ private void appendColumnOptions(StringBuilder builder, BaseColumn column) {
StringBuilder options = new StringBuilder();
addCommonOptions(options, column);
+ // 10 is default assumed
+ if (column.getRadix() != column.getDatatype().getRadix()) {
+ addOption(options, RADIX, column.getRadix());
+ }
+
+ if (column instanceof Column) {
+ buildColumnOptions((Column)column, options);
+ }
+ if (options.length() != 0) {
+ builder.append(SPACE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+ }
+ }
+
+ private void buildColumnOptions(Column column,
+ StringBuilder options) {
if (!column.isSelectable()) {
- addOption(options, SELECTABLE, String.valueOf(column.isSelectable()));
+ addOption(options, SELECTABLE, column.isSelectable());
}
// if table is already updatable, then columns are implicitly updatable.
- if (table.supportsUpdate() && !column.isUpdatable()) {
- addOption(options, UPDATABLE, String.valueOf(column.isUpdatable()));
+ if (!column.isUpdatable() && column.getParent() instanceof Table && ((Table)column.getParent()).supportsUpdate()) {
+ addOption(options, UPDATABLE, column.isUpdatable());
}
-
-
if (column.isCurrency()) {
- addOption(options, CURRENCY, String.valueOf(column.isCurrency()));
+ addOption(options, CURRENCY, column.isCurrency());
}
- /* - designer uses this on all non-numeric just verbose, commenting for now
// only record if not default
if (column.isCaseSensitive() && !column.getDatatype().isCaseSensitive()) {
addOption(options, CASE_SENSITIVE, String.valueOf(column.isCaseSensitive()));
@@ -420,7 +429,7 @@
if (column.isSigned() && !column.getDatatype().isSigned()) {
addOption(options, SIGNED, String.valueOf(column.isSigned()));
- } *
+ }
if (column.isFixedLength()) {
addOption(options, FIXED_LENGTH, String.valueOf(column.isFixedLength()));
}
@@ -428,11 +437,6 @@
if (column.getCharOctetLength() != 0 && column.getLength() != column.getCharOctetLength()) {
addOption(options, CHAR_OCTET_LENGTH, column.getCharOctetLength());
}
- // 10 is default assumed
- if (column.getRadix() != 0 && column.getRadix() != 10) {
- addOption(options, RADIX, column.getRadix());
- }
- */
// by default the search type is default data type search, so avoid it.
if (column.getSearchType() != null && !column.getSearchType().equals(column.getDatatype().getSearchType())) {
@@ -447,8 +451,7 @@
addOption(options, MAX_VALUE, column.getMaximumValue());
}
- // only set native type on the foreign tables, on view the data type is type
- if (table.isPhysical() && column.getNativeType() != null) {
+ if (column.getNativeType() != null) {
addOption(options, NATIVE_TYPE, column.getNativeType());
}
@@ -465,10 +468,9 @@
addOption(options, key, column.getProperty(key, false));
}
}
- return options.toString();
}
- private void addOption(StringBuilder sb, String key, String value) {
+ private void addOption(StringBuilder sb, String key, Object value) {
if (sb.length() != 0) {
sb.append(COMMA).append(SPACE);
}
@@ -483,7 +485,7 @@
}
private void visit(Procedure procedure) {
- if (this.filter != null && !procedure.getName().matches(this.filter)) {
+ if (this.filter != null && !filter.matcher(procedure.getName()).matches()) {
return;
}
@@ -494,7 +496,7 @@
else {
buffer.append(FOREIGN);
}
- buffer.append(SPACE).append(PROCEDURE2).append(SPACE).append(procedure.getName());
+ buffer.append(SPACE).append(PROCEDURE).append(SPACE).append(procedure.getName());
buffer.append(LPAREN);
boolean first = true;
@@ -512,19 +514,28 @@
}
buffer.append(RPAREN);
- buffer.append(SPACE).append(RETURNS).append(SPACE);
- buildProcedureReturn(procedure.getResultSet(), procedure.getParameters());
+ if (procedure.getResultSet() != null) {
+ buffer.append(SPACE).append(RETURNS).append(SPACE).append(TABLE).append(SPACE);
+ addColumns(buffer, procedure.getResultSet().getColumns(), true);
+ }
+ for (ProcedureParameter pp: procedure.getParameters()) {
+ if (pp.getType().equals(Type.ReturnValue)) {
+ buffer.append(SPACE).append(RETURNS).append(SPACE);
+ appendColumn(buffer, pp, false, true);
+ break;
+ }
+ }
//options
String options = buildProcedureOptions(procedure);
if (!options.isEmpty()) {
- buffer.append(NEWLINE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+ buffer.append(NEWLINE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
}
//block
if (procedure.isVirtual()) {
buffer.append(NEWLINE).append(SQLConstants.Reserved.AS).append(NEWLINE);
String plan = procedure.getQueryPlan();
- buffer.append(plan.substring("CREATE VIRTUAL PROCEDURE BEGIN ".length(), plan.length()-"END".length())); //$NON-NLS-1$ //$NON-NLS-2$
+ buffer.append(plan);
}
}
@@ -546,35 +557,22 @@
return options.toString();
}
- private void buildProcedureReturn(ColumnSet<Procedure> resultSet, List<ProcedureParameter> parameters) {
- if (resultSet != null) {
- addColumns(buffer, resultSet.getColumns(), true);
- }
- else {
- if (parameters != null) {
- for (ProcedureParameter pp: parameters) {
- if (pp.getType().equals(Type.ReturnValue)) {
- buffer.append(pp.getDatatype().getName());
- }
- }
- }
- }
-
- }
-
private void visit(ProcedureParameter param) {
Type type = param.getType();
- if (type == Type.In || type == Type.InOut || type == Type.Out) {
- String typeStr = null;
- if (type == Type.In) typeStr = IN;
- if (type == Type.InOut) typeStr = INOUT;
- if (type == Type.Out) typeStr = OUT;
- buffer.append(typeStr).append(SPACE).append(param.getName()).append(SPACE).append(param.getDatatype().getName());
+ String typeStr = type.name().toUpperCase();
+ if (type == Type.ReturnValue) {
+ typeStr = Type.Out.name().toUpperCase();
}
+ buffer.append(typeStr).append(SPACE);
+ appendColumn(buffer, param, true, true);
+ if (type == Type.ReturnValue) {
+ buffer.append(SPACE).append(NonReserved.RESULT);
+ }
+ appendColumnOptions(buffer, param);
}
private void visit(FunctionMethod function) {
- if (this.filter != null && !function.getName().matches(this.filter)) {
+ if (this.filter != null && !filter.matcher(function.getName()).matches()) {
return;
}
buffer.append(CREATE).append(SPACE);
@@ -584,7 +582,7 @@
else {
buffer.append(VIRTUAL);
}
- buffer.append(SPACE).append(FUNCTION2).append(SPACE).append(function.getName());
+ buffer.append(SPACE).append(FUNCTION).append(SPACE).append(function.getName());
buffer.append(LPAREN);
boolean first = true;
@@ -605,7 +603,7 @@
//options
String options = buildFunctionOptions(function);
if (!options.isEmpty()) {
- buffer.append(NEWLINE).append(OPTIONS2).append(SPACE).append(LPAREN).append(options).append(RPAREN);
+ buffer.append(NEWLINE).append(OPTIONS).append(SPACE).append(LPAREN).append(options).append(RPAREN);
}
buffer.append(SQLConstants.Tokens.SEMICOLON);
}
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/MetadataValidator.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -22,7 +22,9 @@
package org.teiid.query.metadata;
import java.util.Collection;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
import java.util.UUID;
import org.teiid.adminapi.impl.ModelMetaData;
@@ -115,7 +117,21 @@
}
}
+ Set<String> names = new HashSet<String>();
for (Procedure p:schema.getProcedures().values()) {
+ boolean hasReturn = false;
+ names.clear();
+ for (ProcedureParameter param : p.getParameters()) {
+ if (param.getType() == ProcedureParameter.Type.ReturnValue) {
+ if (hasReturn) {
+ metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31107, p.getFullName()));
+ }
+ hasReturn = true;
+ }
+ if (!names.add(param.getName())) {
+ metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31106, p.getFullName(), param.getName()));
+ }
+ }
if (p.isVirtual() && model.isSource()) {
metadataValidator.log(report, model, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31076, p.getName(), model.getName()));
}
@@ -186,7 +202,7 @@
try {
if (record instanceof Procedure) {
Procedure p = (Procedure)record;
- Command command = QueryParser.getQueryParser().parseCommand(p.getQueryPlan());
+ Command command = QueryParser.getQueryParser().parseProcedure(p.getQueryPlan(), false);
QueryResolver.resolveCommand(command, new GroupSymbol(p.getFullName()), Command.TYPE_STORED_PROCEDURE, metadata);
resolverReport = Validator.validate(command, metadata);
} else if (record instanceof Table) {
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/NativeMetadataRepository.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -28,8 +28,7 @@
import org.teiid.metadata.Table;
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.report.ActivityReport;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorReport;
import org.teiid.resource.spi.WrappedConnection;
import org.teiid.translator.ExecutionFactory;
import org.teiid.translator.TranslatorException;
@@ -74,7 +73,7 @@
throw new TranslatorException(QueryPlugin.Event.TEIID30580, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30580, t.getFullName()));
}
}
- ActivityReport<ReportItem> report = new ActivityReport<ReportItem>("Translator metadata load " + schema.getName()); //$NON-NLS-1$
+ ValidatorReport report = new ValidatorReport("Translator metadata load " + schema.getName()); //$NON-NLS-1$
FunctionMetadataValidator.validateFunctionMethods(schema.getFunctions().values(),report);
if(report.hasItems()) {
throw new TranslatorException(QueryPlugin.Util.getString("ERR.015.001.0005", report)); //$NON-NLS-1$
Modified: trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/parser/QueryParser.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -102,9 +102,12 @@
return parseCommand(sql, new ParseInfo());
}
- public Command parseUpdateProcedure(String sql) throws QueryParserException {
+ public Command parseProcedure(String sql, boolean update) throws QueryParserException {
try{
- Command result = getSqlParser(sql).updateProcedure(new ParseInfo());
+ if (update) {
+ return getSqlParser(sql).forEachRowTriggerAction(new ParseInfo());
+ }
+ Command result = getSqlParser(sql).procedureBodyCommand(new ParseInfo());
result.setCacheHint(SQLParserUtil.getQueryCacheOption(sql));
return result;
} catch(ParseException pe) {
Modified: trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/parser/SQLParserUtil.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -35,6 +35,7 @@
import org.teiid.core.util.StringUtil;
import org.teiid.language.SQLConstants.Reserved;
import org.teiid.metadata.AbstractMetadataRecord;
+import org.teiid.metadata.BaseColumn;
import org.teiid.metadata.Column;
import org.teiid.metadata.FunctionMethod;
import org.teiid.metadata.FunctionParameter;
@@ -43,8 +44,10 @@
import org.teiid.metadata.ProcedureParameter;
import org.teiid.metadata.Table;
import org.teiid.metadata.Column.SearchType;
+import org.teiid.metadata.ProcedureParameter.Type;
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.FunctionMethods;
+import org.teiid.query.metadata.DDLConstants;
import org.teiid.query.sql.lang.*;
import org.teiid.query.sql.lang.ExistsCriteria.SubqueryHint;
import org.teiid.query.sql.proc.Block;
@@ -354,93 +357,99 @@
return new Block(stmt);
}
- void setColumnOptions(Column c){
+ void setColumnOptions(BaseColumn c){
Map<String, String> props = c.getProperties();
setCommonProperties(c, props);
+
+ String v = props.remove(DDLConstants.RADIX);
+ if (v != null) {
+ c.setRadix(Integer.parseInt(v));
+ }
- String v = props.remove("CASE_SENSITIVE"); //$NON-NLS-1$
+ if (c instanceof Column) {
+ setColumnOptions((Column)c, props);
+ }
+ }
+
+ private void setColumnOptions(Column c, Map<String, String> props) {
+ String v = props.remove(DDLConstants.CASE_SENSITIVE);
if (v != null) {
c.setCaseSensitive(isTrue(v));
}
- v = props.remove("SELECTABLE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.SELECTABLE);
if (v != null) {
c.setSelectable(isTrue(v));
}
- v = props.remove("UPDATABLE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.UPDATABLE);
if (v != null) {
c.setUpdatable(isTrue(v));
}
- v = props.remove("SIGNED"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.SIGNED);
if (v != null) {
c.setSigned(isTrue(v));
}
- v = props.remove("CURRENCY"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.CURRENCY);
if (v != null) {
c.setSigned(isTrue(v));
}
- v = props.remove("FIXED_LENGTH"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.FIXED_LENGTH);
if (v != null) {
c.setFixedLength(isTrue(v));
}
- v = props.remove("SEARCHABLE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.SEARCHABLE);
if (v != null) {
c.setSearchType(SearchType.valueOf(v.toUpperCase()));
}
- v = props.remove("MIN_VALUE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.MIN_VALUE);
if (v != null) {
c.setMinimumValue(v);
}
- v = props.remove("MAX_VALUE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.MAX_VALUE);
if (v != null) {
c.setMaximumValue(v);
}
- v = props.remove("CHAR_OCTET_LENGTH"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.CHAR_OCTET_LENGTH);
if (v != null) {
c.setCharOctetLength(Integer.parseInt(v));
}
- v = props.remove("NATIVE_TYPE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.NATIVE_TYPE);
if (v != null) {
c.setNativeType(v);
}
- v = props.remove("RADIX"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.NULL_VALUE_COUNT);
if (v != null) {
- c.setRadix(Integer.parseInt(v));
- }
-
- v = props.remove("NULL_VALUE_COUNT"); //$NON-NLS-1$
- if (v != null) {
c.setNullValues(Integer.parseInt(v));
}
- v = props.remove("DISTINCT_VALUES"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.DISTINCT_VALUES);
if (v != null) {
c.setDistinctValues(Integer.parseInt(v));
}
}
void setCommonProperties(AbstractMetadataRecord c, Map<String, String> props) {
- String v = props.remove("UUID"); //$NON-NLS-1$
+ String v = props.remove(DDLConstants.UUID);
if (v != null) {
c.setUUID(v);
}
- v = props.remove("ANNOTATION"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.ANNOTATION);
if (v != null) {
c.setAnnotation(v);
}
- v = props.remove("NAMEINSOURCE"); //$NON-NLS-1$
+ v = props.remove(DDLConstants.NAMEINSOURCE);
if (v != null) {
c.setNameInSource(v);
}
@@ -450,24 +459,24 @@
Map<String, String> props = table.getProperties();
setCommonProperties(table, props);
- String value = props.remove("MATERIALIZED"); //$NON-NLS-1$
+ String value = props.remove(DDLConstants.MATERIALIZED);
if (value != null) {
table.setMaterialized(isTrue(value));
}
- value = props.remove("MATERIALIZED_TABLE"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.MATERIALIZED_TABLE);
if (value != null) {
Table mattable = new Table();
mattable.setName(value);
table.setMaterializedTable(mattable);
}
- value = props.remove("UPDATABLE"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.UPDATABLE);
if (value != null) {
table.setSupportsUpdate(isTrue(value));
}
- value = props.remove("CARDINALITY"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.CARDINALITY);
if (value != null) {
table.setCardinality(Integer.parseInt(value));
}
@@ -481,24 +490,22 @@
ArrayList<FunctionParameter> ins = new ArrayList<FunctionParameter>();
for (ProcedureParameter pp:proc.getParameters()) {
- if (pp.getType() != ProcedureParameter.Type.In) {
+ if (pp.getType() == ProcedureParameter.Type.InOut || pp.getType() == ProcedureParameter.Type.Out) {
throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_in", proc.getName())); //$NON-NLS-1$
}
- FunctionParameter fp = new FunctionParameter(pp.getName(), pp.getDatatype().getName());
- fp.setVarArg(pp.isVarArg());
- ins.add(fp);
+ FunctionParameter fp = new FunctionParameter(pp.getName(), pp.getDatatype().getName(), pp.getAnnotation());
+ if (pp.getType() == ProcedureParameter.Type.In) {
+ fp.setVarArg(pp.isVarArg());
+ ins.add(fp);
+ } else {
+ method.setOutputParameter(fp);
+ }
}
method.setInputParameters(ins);
- List<Column> returnCols = proc.getResultSet().getColumns();
- if (returnCols != null && !returnCols.isEmpty()) {
- if (returnCols.size() > 1) {
- throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_return", proc.getName())); //$NON-NLS-1$
- }
- Column c = returnCols.get(0);
- FunctionParameter fp = new FunctionParameter(c.getName(), c.getDatatype().getName());
- method.setOutputParameter(fp);
+ if (proc.getResultSet() != null || method.getOutputParameter() == null) {
+ throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_return", proc.getName())); //$NON-NLS-1$
}
method.setAnnotation(proc.getAnnotation());
@@ -507,18 +514,18 @@
Map<String, String> props = proc.getProperties();
- String value = props.remove("CATEGORY"); //$NON-NLS-1$
+ String value = props.remove(DDLConstants.CATEGORY);
method.setCategory(value);
- value = props.remove("DETERMINISM"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.DETERMINISM);
if (value != null) {
method.setDeterminism(FunctionMethod.Determinism.valueOf(value.toUpperCase()));
}
- value = props.remove("JAVA_CLASS"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.JAVA_CLASS);
method.setInvocationClass(value);
- value = props.remove("JAVA_METHOD"); //$NON-NLS-1$
+ value = props.remove(DDLConstants.JAVA_METHOD);
method.setInvocationMethod(value);
for (String key:props.keySet()) {
@@ -568,21 +575,43 @@
}
}
- void addProcReturnColumn(MetadataFactory factory, Procedure proc, String name, ParsedDataType type) throws ParseException{
+ BaseColumn addProcColumn(MetadataFactory factory, Procedure proc, String name, ParsedDataType type, boolean rs) throws ParseException{
try {
- Column column = factory.addProcedureResultSetColumn(name, type.type, proc);
- if (type.length != null){
- column.setLength(type.length);
+ name = validateElementName(name);
+ BaseColumn column = null;
+ if (rs) {
+ column = factory.addProcedureResultSetColumn(name, type.type, proc);
+ } else {
+ boolean added = false;
+ for (ProcedureParameter pp : proc.getParameters()) {
+ if (pp.getType() == Type.ReturnValue) {
+ added = true;
+ if (pp.getDatatype() != factory.getDataTypes().get(type.type)) {
+ throw new ParseException(QueryPlugin.Util.getString("SQLParser.proc_type_conflict", proc.getName(), pp.getDatatype(), type.type)); //$NON-NLS-1$
+ }
+ }
+ }
+ if (!added) {
+ column = factory.addProcedureParameter(name, type.type, ProcedureParameter.Type.ReturnValue, proc);
+ }
}
- if (type.scale != null){
- column.setScale(type.scale);
- }
- if (type.precision != null){
- column.setPrecision(type.precision);
- }
+ setTypeInfo(type, column);
+ return column;
} catch (TranslatorException e){
throw new ParseException(e.getMessage());
}
+ }
+
+ void setTypeInfo(ParsedDataType type, BaseColumn column) {
+ if (type.length != null){
+ column.setLength(type.length);
+ }
+ if (type.scale != null){
+ column.setScale(type.scale);
+ }
+ if (type.precision != null){
+ column.setPrecision(type.precision);
+ }
}
static String resolvePropertyKey(MetadataFactory factory, String key) {
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/ProcedureContainerResolver.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -49,6 +49,7 @@
import org.teiid.query.sql.lang.GroupContext;
import org.teiid.query.sql.lang.ProcedureContainer;
import org.teiid.query.sql.lang.SPParameter;
+import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.proc.CreateProcedureCommand;
import org.teiid.query.sql.proc.TriggerAction;
import org.teiid.query.sql.symbol.ElementSymbol;
@@ -93,7 +94,7 @@
QueryParser parser = QueryParser.getQueryParser();
try {
- subCommand = parser.parseUpdateProcedure(plan);
+ subCommand = parser.parseProcedure(plan, !(procCommand instanceof StoredProcedure));
} catch(QueryParserException e) {
throw new QueryResolverException(QueryPlugin.Event.TEIID30060, e, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30060, group, procCommand.getClass().getSimpleName()));
}
Modified: trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/java/org/teiid/query/validator/ValidatorReport.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -38,6 +38,10 @@
public ValidatorReport() {
super(VALIDATOR_REPORT);
}
+
+ public ValidatorReport(String name) {
+ super(name);
+ }
public void collectInvalidObjects(Collection<LanguageObject> invalidObjects) {
for (ValidatorFailure failure : getItems()) {
Modified: trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj
===================================================================
--- trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/javacc/org/teiid/query/parser/SQLParser.jj 2012-07-17 01:00:58 UTC (rev 4242)
@@ -487,8 +487,9 @@
Command command = null;
}
{
- (LOOKAHEAD(2) command = updateProcedure(info) |
- command = userCommand(info)
+ (LOOKAHEAD (2) command = createProcedure(info) |
+ command = forEachRowTriggerAction(info) |
+ command = userCommand(info)
)
[<SEMICOLON>]
<EOF>
@@ -497,19 +498,6 @@
}
}
-Command updateProcedure(ParseInfo info) :
-{
- Command command = null;
-}
-{
- (command = createProcedure(info) |
- command = forEachRowTriggerAction(info))
- <EOF>
- {
- return command;
- }
-}
-
Command createTrigger(ParseInfo info) :
{
String target = null;
@@ -1079,6 +1067,21 @@
}
}
+CreateProcedureCommand procedureBodyCommand(ParseInfo info) :
+{
+ CreateProcedureCommand procCmd =
+ new CreateProcedureCommand();
+ Statement stmt = null;
+}
+{
+ [LOOKAHEAD(2) <CREATE> [<VIRTUAL>] <PROCEDURE>]
+ stmt = statement(info)
+ {
+ procCmd.setBlock(asBlock(stmt));
+ return procCmd;
+ }
+}
+
/**
* Parse error statement
* @throws ParseException if parsing failed
@@ -4116,7 +4119,8 @@
String procName = null;
CreateProcedureCommand procCmd = new CreateProcedureCommand();
Statement stmt = null;
- ParsedDataType returnDataType = null;
+ ParsedDataType returnDataType = null;
+ Token comment = null;
}
{
<CREATE> [<VIRTUAL> | <FOREIGN> {virtual = false;}] (<PROCEDURE> | <FUNCTION> {function = true;})
@@ -4135,35 +4139,32 @@
(<COMMA> procedureParameter(factory, proc))*
<RPAREN>
- <RETURNS> (procedureReturn(factory, proc) | returnDataType = parseDataType())
-
+ [<RETURNS> (([<TABLE>] <LPAREN>
+ procedureRsColumn(factory, proc)
+ (<COMMA> procedureRsColumn(factory, proc))*
+ <RPAREN>)
+ |
+ returnDataType = parseDataType())
+ ]
[ optionsClause(proc, factory)
{
setProcedureOptions(proc);
}
]
- [<AS>
+ [<AS> { comment = getToken(1).specialToken; }
stmt = statement(info)])
{
proc.setVirtual(virtual);
proc.setFunction(function);
if (stmt != null){
- proc.setQueryPlan("CREATE VIRTUAL PROCEDURE "+asBlock(stmt).toString());
+ if (function || !virtual) {
+ throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_def", procName));
+ }
+ proc.setQueryPlan((comment != null?comment.image+" ":"") + stmt.toString());
}
- if (!function) {
- if (virtual && stmt == null){
- throw new ParseException(QueryPlugin.Util.getString("SQLParser.virtual_proc_def", procName));
- }
- if (!virtual && stmt != null){
- throw new ParseException(QueryPlugin.Util.getString("SQLParser.foreign_proc_def", procName));
- }
- } else if (stmt != null) {
- throw new ParseException(QueryPlugin.Util.getString("SQLParser.function_def", procName));
- }
-
if (returnDataType != null){
- addProcReturnColumn(factory, proc, "return", returnDataType);
+ addProcColumn(factory, proc, "return", returnDataType, false);
}
if (function) {
replaceProcedureWithFunction(factory, proc);
@@ -4185,44 +4186,55 @@
|(<INOUT> {ppType = ProcedureParameter.Type.InOut;}))]
name = id()
type = parseDataType()
+ [nonReserved("RESULT")
+ {
+ if (ppType != ProcedureParameter.Type.Out) {
+ throw new ParseException(QueryPlugin.Util.getString("SQLParser.param_out", proc.getName(), name));
+ }
+ ppType = ProcedureParameter.Type.ReturnValue;
+ }
+ ]
{
try {
- param = factory.addProcedureParameter(name, type.type, ppType, proc);
- if (type.length != null){
- param.setLength(type.length);
- }
- if (type.scale != null){
- param.setScale(type.scale);
- }
- if (type.precision != null){
- param.setPrecision(type.precision);
- }
+ param = factory.addProcedureParameter(validateElementName(name), type.type, ppType, proc);
+ setTypeInfo(type, param);
} catch (TranslatorException e){
throw new ParseException(e.getMessage());
}
- }
+ }
+ [optionsClause(param, factory)
+ {
+ setColumnOptions(param);
+ }
+ ]
}
-void procedureReturn(MetadataFactory factory, Procedure proc) :
+void procedureRsColumn(MetadataFactory factory, Procedure proc) :
{
String name = null;
+}
+{
+ name = id()
+ procedureColumn(factory, proc, name, true)
+}
+
+void procedureColumn(MetadataFactory factory, Procedure proc, String name, boolean rs) :
+{
ParsedDataType type = null;
+ boolean notNull = false;
+ BaseColumn column = null;
}
{
- <LPAREN>
- name = id()
type = parseDataType()
{
- addProcReturnColumn(factory, proc, name, type);
+ column = addProcColumn(factory, proc, name, type, rs);
}
- (<COMMA>
- name = id()
- type = parseDataType()
- {
- addProcReturnColumn(factory, proc, name, type);
- }
- )*
- <RPAREN>
+ [<NOT> <NULL> { notNull = true; }]
+ [optionsClause(column, factory)
+ {
+ setColumnOptions(column);
+ }
+ ]
}
void createTable(MetadataFactory factory) :
@@ -4231,6 +4243,7 @@
String tableName = null;
boolean view = false;
Command query = null;
+ Token comment = null;
}
{
<CREATE> (<FOREIGN> <TABLE> | [<VIRTUAL>] nonReserved("VIEW") {view = true;})
@@ -4259,14 +4272,14 @@
setTableOptions(table);
}
]
- [<AS> query = queryExpression(new ParseInfo())]
+ [<AS> { comment = getToken(1).specialToken; } query = queryExpression(new ParseInfo())]
{
- if (view){
- if (query == null) {
- throw new ParseException(QueryPlugin.Util.getString("SQLParser.view_def", tableName));
+ if (query != null){
+ if (!view) {
+ throw new ParseException(QueryPlugin.Util.getString("SQLParser.view_def", tableName));
}
- table.setSelectTransformation(query.toString());
- }
+ table.setSelectTransformation((comment != null?comment.image+" ":"") + query.toString());
+ }
if (!table.supportsUpdate() && table.getColumns() != null) {
for (Column c : table.getColumns()) {
c.setUpdatable(false);
@@ -4419,15 +4432,7 @@
try{
column = factory.addColumn(validateElementName(element), type.type, table);
column.setUpdatable(true);
- if (type.length != null){
- column.setLength(type.length);
- }
- if (type.scale != null){
- column.setScale(type.scale);
- }
- if (type.precision != null){
- column.setPrecision(type.precision);
- }
+ setTypeInfo(type, column);
columnName.add(element);
}catch(TranslatorException e){
throw new ParseException(e.getMessage());
Modified: trunk/engine/src/main/resources/org/teiid/query/i18n.properties
===================================================================
--- trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/main/resources/org/teiid/query/i18n.properties 2012-07-17 01:00:58 UTC (rev 4242)
@@ -257,14 +257,12 @@
SQLParser.Invalid_short_name=Invalid simple identifier format: [{0}]
SQLParser.expected_non_reserved=Expected non-reserved word {0}, but was {1}.
SQLParser.invalid_window=Cannot window a non-aggregate expression {0}.
-SQLParser.virtual_proc_def=Virtual procedure {0} must define the procedure after an ''AS'' keyword.
-SQLParser.foreign_proc_def=Foreign procedure {0} must not define a procedure body.
-SQLParser.function_def=Function {0} must not define a function body.
-SQLParser.view_def=Virtual view {0} must be defined with a query expression.
+SQLParser.function_def=Function or foreign procedure {0} cannot define a body.
+SQLParser.view_def=Foreign table {0} cannot be defined by a query expression.
SQLParser.pk_exists=Primary Key is already defined on {0}
SQLParser.no_column=Column name {0} not found on table {1}
-SQLParser.function_return=Function {0} is not valid. Functions can only return a single parameter.
-SQLParser.function_in=Functions {0} is not valid. Functions can only support 'In' parameters.
+SQLParser.function_return=Function {0} is not valid. Functions can not support result set return parameters, and must have a scalar return parameter.
+SQLParser.function_in=Functions {0} is not valid. Functions can only support 'In/RESULT' parameters.
SystemSource.array_length_desc=Get the length of the given array value
SystemSource.array_param1=Array
SystemSource.array_length_result=The array length
@@ -993,7 +991,7 @@
TEIID31076=Virtual procedure {0} is only allowed to be defined on VIRTUAL model; {1} is defined as PHYSICAL model.
TEIID31077=Source Stored procedure {0} is only allowed to be defined on PHYSICAL model; {1} is defined as VIRTUAL model.
TEIID31078=Pushdown function {0} must be defined on PHYSICAL model; {1} is VIRTUAL model.
-TEIID31079=View {0} did not define transformation after "AS select ..."
+TEIID31079=View {0} is not defined by a query expression.
TEIID31080=View {0} validation error: {1}
TEIID31081=Virtual Procedure {0} did not specify any statements as procedure block in model {0}
TEIID31082={0}.{1} is now "incomplete", because model "{2}" can not retrieve metadata. Please deploy the necessary DataSources.
@@ -1025,4 +1023,9 @@
TEIID31103=There are different sources with the name {0} in {1}.{2}
TEIID31104=Recursion limit of {0} reached.
-TEIID31105=Returing warning to client: {0}
\ No newline at end of file
+TEIID31105=Returing warning to client: {0}
+TEIID31106=Duplicate parameter {1} defined on {0}
+TEIID31107=Procedure {0} can only have 1 RESULT/return value
+
+SQLParser.proc_type_conflict=Result type {1} conflicts with return type {2} for procedure {0}
+SQLParser.param_out=Procedure {0} RESULT param {1} must be of type OUT.
\ No newline at end of file
Modified: trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/function/metadata/TestSystemSource.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -22,29 +22,17 @@
package org.teiid.query.function.metadata;
-import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.function.source.*;
-import org.teiid.query.report.*;
+import static org.junit.Assert.*;
-import junit.framework.*;
+import org.junit.Test;
+import org.teiid.query.function.source.SystemSource;
+import org.teiid.query.validator.ValidatorReport;
-public class TestSystemSource extends TestCase {
+public class TestSystemSource {
- // ################################## FRAMEWORK ################################
-
- public TestSystemSource(String name) {
- super(name);
- }
-
- // ################################## TEST HELPERS ################################
-
-
-
- // ################################## ACTUAL TESTS ################################
-
- public void testValidate() {
+ @Test public void testValidate() {
SystemSource source = new SystemSource(false);
- ActivityReport report = new ActivityReport("Test Report"); //$NON-NLS-1$
+ ValidatorReport report = new ValidatorReport("Test Report"); //$NON-NLS-1$
FunctionMetadataValidator.validateFunctionMethods(source.getFunctionMethods(), report);
if(report.hasItems()) {
Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/metadata/TestDDLStringVisitor.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -21,7 +21,7 @@
*/
package org.teiid.query.metadata;
-import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.HashMap;
@@ -29,11 +29,11 @@
import java.util.Properties;
import org.junit.Test;
-import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.metadata.Column;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.Schema;
import org.teiid.metadata.Table;
+import org.teiid.metadata.BaseColumn.NullType;
import org.teiid.query.parser.ParseException;
import org.teiid.query.parser.TestDDLParser;
@@ -168,9 +168,9 @@
"AS\n" +
"SELECT * FROM PM1.G1;\n" +
"\n" +
- "CREATE VIRTUAL PROCEDURE FOO(IN P1 integer) RETURNS (e1 integer, e2 string)\n" +
+ "CREATE VIRTUAL PROCEDURE FOO(IN P1 integer) RETURNS TABLE (e1 integer, e2 string)\n" +
"AS\n" +
- "SELECT * FROM PM1.G1;\n";
+ "SELECT * FROM PM1.G1;";
helpTest(ddl, expected);
}
@@ -217,7 +217,7 @@
"RETURNS (r1 varchar, r2 decimal)" +
"OPTIONS(RANDOM 'any', UUID 'uuid', NAMEINSOURCE 'nis', ANNOTATION 'desc', UPDATECOUNT '2');";
- String expected = "CREATE FOREIGN PROCEDURE myProc(OUT p1 boolean, IN p2 string, INOUT p3 bigdecimal) RETURNS (r1 string, r2 bigdecimal)\n" +
+ String expected = "CREATE FOREIGN PROCEDURE myProc(OUT p1 boolean, IN p2 string, INOUT p3 bigdecimal) RETURNS TABLE (r1 string, r2 bigdecimal)\n" +
"OPTIONS (UUID 'uuid', ANNOTATION 'desc', NAMEINSOURCE 'nis', UPDATECOUNT 2, RANDOM 'any')";
helpTest(ddl, expected);
}
Modified: trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/metadata/TestMetadataValidator.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -56,7 +56,7 @@
this.vdb.addAttchment(TransformationMetadata.class, metadata);
}
- private ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData vdb, MetadataStore store, String ddl) throws Exception {
+ private static ModelMetaData buildModel(String modelName, boolean physical, VDBMetaData vdb, MetadataStore store, String ddl) throws Exception {
ModelMetaData model = new ModelMetaData();
model.setName(modelName);
model.setModelType(physical?Model.Type.PHYSICAL:Model.Type.VIRTUAL);
@@ -130,6 +130,22 @@
assertTrue(printError(report), report.hasItems());
}
+ @Test public void testProcWithMultipleReturn() throws Exception {
+ String ddl = "create foreign procedure x (out param1 string result, out param2 string result); ";
+ buildModel("pm1", true, this.vdb, this.store,ddl);
+ buildTransformationMetadata();
+ ValidatorReport report = new MetadataValidator().validate(vdb, store);
+ assertTrue(printError(report), report.hasItems());
+ }
+
+ @Test public void testProcWithDuplicateParam() throws Exception {
+ String ddl = "create foreign procedure x (out param1 string, out param1 string); ";
+ buildModel("pm1", true, this.vdb, this.store,ddl);
+ buildTransformationMetadata();
+ ValidatorReport report = new MetadataValidator().validate(vdb, store);
+ assertTrue(printError(report), report.hasItems());
+ }
+
@Test public void testProcMetadata() throws Exception {
String ddl = "create virtual procedure proc1(IN e1 varchar) RETURNS (e1 integer, e2 varchar(12)) AS begin create local temporary table x (e1 integer, e2 varchar); select * from x; end;" +
"create virtual procedure proc2(IN e1 varchar) RETURNS (e1 integer, e2 varchar(12)) AS select x.* from (exec proc1('a')) as X; ";
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestDDLParser.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -317,8 +317,8 @@
}
@Test(expected=ParseException.class)
- public void testViewWithoutPlan() throws Exception {
- String ddl = "CREATE View G1( e1 integer, e2 varchar)";
+ public void testTableWithPlan() throws Exception {
+ String ddl = "CREATE foreign table G1 as select 1";
MetadataStore mds = new MetadataStore();
MetadataFactory mf = new MetadataFactory(null, 1, "model", getDataTypes(), new Properties(), null);
parser.parseDDL(mf,ddl);
@@ -347,7 +347,7 @@
Map<String, Procedure> procedureMap = s.getProcedures();
Procedure p = procedureMap.get("FOO");
assertNotNull(p);
- assertEquals("CREATE VIRTUAL PROCEDURE BEGIN\nSELECT * FROM PM1.G1;\nEND", p.getQueryPlan());
+ assertEquals("SELECT * FROM PM1.G1;", p.getQueryPlan());
}
@@ -490,7 +490,7 @@
assertTrue( fm.getInputParameters().get(0).isVarArg());
}
- @Test(expected=ParseException.class) public void testInvalidProcedurenBody() throws Exception {
+ @Test(expected=ParseException.class) public void testInvalidProcedureBody() throws Exception {
String ddl = "CREATE FOREIGN PROCEDURE SourceFunc(flag boolean) RETURNS varchar AS SELECT 'a';";
Schema s = helpParse(ddl, "model").getSchema();
@@ -504,7 +504,7 @@
String ddl = "CREATE VIRTUAL PROCEDURE myProc(OUT p1 boolean, p2 varchar, INOUT p3 decimal) " +
"RETURNS (r1 varchar, r2 decimal) " +
"OPTIONS(RANDOM 'any', UUID 'uuid', NAMEINSOURCE 'nis', ANNOTATION 'desc', UPDATECOUNT '2') " +
- "AS BEGIN select * from foo; END";
+ "AS /*+ cache */ BEGIN select * from foo; END";
Schema s = helpParse(ddl, "model").getSchema();
@@ -541,7 +541,7 @@
assertEquals(2, proc.getUpdateCount());
assertEquals("any", proc.getProperties().get("RANDOM"));
- assertEquals("CREATE VIRTUAL PROCEDURE BEGIN\nSELECT * FROM foo;\nEND", proc.getQueryPlan());
+ assertEquals("/*+ cache */ BEGIN\nSELECT * FROM foo;\nEND", proc.getQueryPlan());
}
Modified: trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/parser/TestParseAlter.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -53,7 +53,7 @@
AlterTrigger alterTrigger = new AlterTrigger();
alterTrigger.setTarget(new GroupSymbol("x"));
alterTrigger.setEvent(TriggerEvent.UPDATE);
- alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
+ alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseProcedure("for each row begin end", true));
helpTest("alter trigger on x instead of update as for each row begin end", "ALTER TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN ATOMIC\nEND", alterTrigger);
}
@@ -70,7 +70,7 @@
alterTrigger.setCreate(true);
alterTrigger.setTarget(new GroupSymbol("x"));
alterTrigger.setEvent(TriggerEvent.UPDATE);
- alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseUpdateProcedure("for each row begin end"));
+ alterTrigger.setDefinition((TriggerAction) QueryParser.getQueryParser().parseProcedure("for each row begin end", true));
helpTest("create trigger on x instead of update as for each row begin end", "CREATE TRIGGER ON x INSTEAD OF UPDATE AS\nFOR EACH ROW\nBEGIN ATOMIC\nEND", alterTrigger);
}
Modified: trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/resolver/TestProcedureResolving.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -46,6 +46,7 @@
import org.teiid.query.sql.proc.CommandStatement;
import org.teiid.query.sql.proc.CreateProcedureCommand;
import org.teiid.query.sql.proc.LoopStatement;
+import org.teiid.query.sql.proc.TriggerAction;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.visitor.CommandCollectorVisitor;
@@ -75,7 +76,7 @@
}
@Test public void testDefect13029_CorrectlySetUpdateProcedureTempGroupIDs() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\nDECLARE string var1;") //$NON-NLS-1$
.append("\nvar1 = '';") //$NON-NLS-1$
@@ -109,19 +110,19 @@
assertNull(tempIDs.get("LOOPCURSOR2")); //$NON-NLS-1$
}
- private CreateProcedureCommand helpResolveUpdateProcedure(String procedure, String userUpdateStr, Table.TriggerEvent procedureType) throws QueryParserException, QueryResolverException, TeiidComponentException {
+ private TriggerAction helpResolveUpdateProcedure(String procedure, String userUpdateStr, Table.TriggerEvent procedureType) throws QueryParserException, QueryResolverException, TeiidComponentException {
QueryMetadataInterface metadata = RealMetadataFactory.exampleUpdateProc(procedureType, procedure);
- return resolveProcedure(userUpdateStr, metadata);
+ return (TriggerAction) resolveProcedure(userUpdateStr, metadata);
}
- private CreateProcedureCommand resolveProcedure(String userUpdateStr,
+ private Command resolveProcedure(String userUpdateStr,
QueryMetadataInterface metadata) throws QueryParserException,
QueryResolverException, TeiidComponentException,
QueryMetadataException {
ProcedureContainer userCommand = (ProcedureContainer)QueryParser.getQueryParser().parseCommand(userUpdateStr);
QueryResolver.resolveCommand(userCommand, metadata);
metadata = new TempMetadataAdapter(metadata, userCommand.getTemporaryMetadata());
- return (CreateProcedureCommand)QueryResolver.expandCommand(userCommand, metadata, null);
+ return QueryResolver.expandCommand(userCommand, metadata, null);
}
private void helpResolveException(String userUpdateStr, QueryMetadataInterface metadata, String msg) throws QueryParserException, TeiidComponentException {
@@ -133,7 +134,7 @@
}
}
- private CreateProcedureCommand helpResolve(String userUpdateStr, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
+ private Command helpResolve(String userUpdateStr, QueryMetadataInterface metadata) throws QueryParserException, QueryResolverException, TeiidComponentException {
return resolveProcedure(userUpdateStr, metadata);
}
@@ -141,7 +142,7 @@
* Constants will now auto resolve if they are consistently representable in the target type
*/
@Test public void testDefect23257() throws Exception{
- CreateProcedureCommand command = helpResolve("EXEC pm6.vsp59()", RealMetadataFactory.example1Cached()); //$NON-NLS-1$
+ CreateProcedureCommand command = (CreateProcedureCommand) helpResolve("EXEC pm6.vsp59()", RealMetadataFactory.example1Cached()); //$NON-NLS-1$
CommandStatement cs = (CommandStatement)command.getBlock().getStatements().get(1);
@@ -151,7 +152,7 @@
}
@Test public void testProcedureScoping() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
//note that this declare takes presedense over the proc INPUTS.e1 and CHANGING.e1 variables
.append("\n declare integer e1 = 1;") //$NON-NLS-1$
@@ -165,7 +166,7 @@
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
- CreateProcedureCommand command = helpResolveUpdateProcedure(proc.toString(), userUpdateStr,
+ TriggerAction command = helpResolveUpdateProcedure(proc.toString(), userUpdateStr,
Table.TriggerEvent.UPDATE);
Block block = command.getBlock();
@@ -186,7 +187,7 @@
// variable resolution, variable used in if statement, variable compared against
// different datatype element
@Test public void testCreateUpdateProcedure4() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1);\n"; //$NON-NLS-1$
@@ -201,7 +202,7 @@
// variable resolution, variable used in if statement, invalid operation on variable
@Test public void testCreateUpdateProcedure5() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = var1 + var1;\n"; //$NON-NLS-1$
@@ -217,7 +218,7 @@
// variable resolution, variables declared in different blocks local variables
// should not override
@Test public void testCreateUpdateProcedure6() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -236,7 +237,7 @@
// variable resolution, variables declared in different blocks local variables
// inner block using outer block variables
@Test public void testCreateUpdateProcedure7() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -255,7 +256,7 @@
// variable resolution, variables declared in different blocks local variables
// outer block cannot use inner block variables
@Test public void testCreateUpdateProcedure8() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -275,7 +276,7 @@
// variable resolution, variables declared in different blocks local variables
// should override, outer block variables still valid afetr inner block is declared
@Test public void testCreateUpdateProcedure9() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -294,7 +295,7 @@
// using declare variable that has parts
@Test public void testCreateUpdateProcedure24() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var2.var1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -307,7 +308,7 @@
// using declare variable is qualified
@Test public void testCreateUpdateProcedure26() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer VARIABLES.var1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -320,7 +321,7 @@
// using declare variable is qualified but has more parts
@Test public void testCreateUpdateProcedure27() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer VARIABLES.var1.var2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -333,7 +334,7 @@
// using a variable that has not been declared in an assignment stmt
@Test public void testCreateUpdateProcedure28() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "var1 = Select pm1.g1.e2 from pm1.g1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -346,7 +347,7 @@
// using a variable that has not been declared in an assignment stmt
@Test public void testCreateUpdateProcedure29() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "var1 = 1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -359,7 +360,7 @@
// using invalid function in assignment expr
@Test public void testCreateUpdateProcedure30() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "Declare integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = 'x' + ROWS_UPDATED;\n"; //$NON-NLS-1$
@@ -373,7 +374,7 @@
// using invalid function in assignment expr
@Test public void testCreateUpdateProcedure31() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "Declare integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = 'x' + ROWS_UPDATED;\n"; //$NON-NLS-1$
@@ -387,7 +388,7 @@
// using a variable being used inside a subcomand
@Test public void testCreateUpdateProcedure32() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "Declare integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "Select var1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -403,7 +404,7 @@
// should override, outer block variables still valid afetr inner block is declared
// fails as variable being compared against incorrect type
@Test public void testCreateUpdateProcedure33() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -422,7 +423,7 @@
// physical elements used on criteria of the if statement
@Test public void testCreateUpdateProcedure34() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -439,7 +440,7 @@
// physical elements used on criteria of the if statement
@Test public void testCreateUpdateProcedure36() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -456,7 +457,7 @@
// physical elements used on criteria of the if statement
@Test public void testCreateUpdateProcedure39() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(pm1.g1.e2 =1 and var1=1)\n"; //$NON-NLS-1$
@@ -474,7 +475,7 @@
// resolving AssignmentStatement, variable type and assigned type
// do not match and no implicit conversion available
@Test public void testCreateUpdateProcedure53() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = INPUTS.e4;"; //$NON-NLS-1$
@@ -490,7 +491,7 @@
// resolving AssignmentStatement, variable type and assigned type
// do not match, but implicit conversion available
@Test public void testCreateUpdateProcedure54() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE string var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = 1+1;"; //$NON-NLS-1$
@@ -504,7 +505,7 @@
@Test public void testDefect14912_CreateUpdateProcedure57_FunctionWithElementParamInAssignmentStatement() {
// Tests that the function params are resolved before the function for assignment statements
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE string var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = badFunction(badElement);"; //$NON-NLS-1$
@@ -519,7 +520,7 @@
// addresses Cases 4624. Before change to UpdateProcedureResolver,
// this case failed with assertion exception.
@Test public void testCase4624() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE boolean var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = {b'false'};\n"; //$NON-NLS-1$
@@ -581,7 +582,7 @@
//baseline test to ensure that a declare assignment cannot contain the declared variable
@Test public void testDeclareStatement() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer VARIABLES.var1 = VARIABLES.var1;\n"; //$NON-NLS-1$
procedure = procedure + "ROWS_UPDATED =0;\n"; //$NON-NLS-1$
@@ -595,7 +596,7 @@
@Test public void testDynamicIntoInProc() throws Exception {
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
- StringBuffer procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("execute string 'SELECT e1, e2, e3, e4 FROM pm1.g2' as e1 string, e2 string, e3 string, e4 string INTO #myTempTable;\n") //$NON-NLS-1$
.append("select e1 from #myTempTable;\n") //$NON-NLS-1$
@@ -607,7 +608,7 @@
@Test public void testDynamicStatement() throws Exception {
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
- StringBuffer procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("execute string 'SELECT e1, e2, e3, e4 FROM pm1.g2';\n") //$NON-NLS-1$
.append("END\n"); //$NON-NLS-1$
@@ -618,7 +619,7 @@
@Test public void testDynamicStatementType() {
String userUpdateStr = "UPDATE vm1.g1 SET e1='x'"; //$NON-NLS-1$
- StringBuffer procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("DECLARE object VARIABLES.X = null;\n") //$NON-NLS-1$
.append("execute string VARIABLES.X;\n") //$NON-NLS-1$
@@ -629,7 +630,7 @@
// variable resolution
@Test public void testCreateUpdateProcedure1() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = Select pm1.g1.e2 from pm1.g1;\n"; //$NON-NLS-1$
@@ -644,7 +645,7 @@
// variable resolution, variable used in if statement
@Test public void testCreateUpdateProcedure3() throws Exception {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "if(var1 =1)\n"; //$NON-NLS-1$
@@ -659,7 +660,7 @@
}
@Test public void testSelectIntoInProc() throws Exception {
- StringBuffer procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2;\n") //$NON-NLS-1$
.append("END\n"); //$NON-NLS-1$
@@ -669,7 +670,7 @@
helpResolveUpdateProcedure(procedure.toString(), userUpdateStr,
Table.TriggerEvent.UPDATE);
- procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n") //$NON-NLS-1$
.append("END\n"); //$NON-NLS-1$
@@ -678,7 +679,7 @@
}
@Test public void testSelectIntoInProcNoFrom() throws Exception {
- StringBuffer procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ StringBuffer procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("SELECT 'a', 19, {b'true'}, 13.999 INTO pm1.g1;\n") //$NON-NLS-1$
.append("END\n"); //$NON-NLS-1$
@@ -688,7 +689,7 @@
helpResolveUpdateProcedure(procedure.toString(), userUpdateStr,
Table.TriggerEvent.UPDATE);
- procedure = new StringBuffer("CREATE PROCEDURE ") //$NON-NLS-1$
+ procedure = new StringBuffer("FOR EACH ROW ") //$NON-NLS-1$
.append("BEGIN\n") //$NON-NLS-1$
.append("SELECT 'a', 19, {b'true'}, 13.999 INTO #myTempTable;\n") //$NON-NLS-1$
.append("END\n"); //$NON-NLS-1$
@@ -698,7 +699,7 @@
// validating INPUT element assigned
@Test public void testAssignInput() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "INPUTS.e1 = Select pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -713,7 +714,7 @@
// validating CHANGING element assigned
@Test public void testAssignChanging() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "CHANGING.e1 = Select pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -728,7 +729,7 @@
// variables cannot be used among insert elements
@Test public void testVariableInInsert() {
- String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "Insert into pm1.g1 (pm1.g1.e2, var1) values (1, 2);\n"; //$NON-NLS-1$
@@ -743,7 +744,7 @@
// variables cannot be used among insert elements
@Test public void testVariableInInsert2() {
- String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "Insert into pm1.g1 (pm1.g1.e2, INPUTS.x) values (1, 2);\n"; //$NON-NLS-1$
@@ -758,7 +759,7 @@
//should resolve first to the table's column
@Test public void testVariableInInsert3() throws Exception {
- String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer e2;\n"; //$NON-NLS-1$
procedure = procedure + "Insert into pm1.g1 (e2) values (1);\n"; //$NON-NLS-1$
@@ -783,7 +784,7 @@
}
@Test public void testLoopRedefinition() {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n declare string var1;") //$NON-NLS-1$
.append("\n LOOP ON (SELECT pm1.g1.e1 FROM pm1.g1) AS loopCursor") //$NON-NLS-1$
@@ -802,7 +803,7 @@
}
@Test public void testTempGroupElementShouldNotBeResolable() {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n select 1 as a into #temp;") //$NON-NLS-1$
.append("\n select #temp.a from pm1.g1;") //$NON-NLS-1$
@@ -815,7 +816,7 @@
}
@Test public void testTempGroupElementShouldNotBeResolable1() {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n select 1 as a into #temp;") //$NON-NLS-1$
.append("\n insert into #temp (a) values (#temp.a);") //$NON-NLS-1$
@@ -828,7 +829,7 @@
}
@Test public void testProcedureCreate() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n create local temporary table t1 (e1 string);") //$NON-NLS-1$
.append("\n select e1 from t1;") //$NON-NLS-1$
@@ -845,7 +846,7 @@
* it is not ok to redefine the loopCursor
*/
@Test public void testProcedureCreate1() {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n LOOP ON (SELECT pm1.g1.e1 FROM pm1.g1) AS loopCursor") //$NON-NLS-1$
.append("\n BEGIN") //$NON-NLS-1$
@@ -859,7 +860,7 @@
}
@Test public void testProcedureCreateDrop() {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n drop table t1;") //$NON-NLS-1$
.append("\n create local temporary table t1 (e1 string);") //$NON-NLS-1$
@@ -871,7 +872,7 @@
}
@Test public void testProcedureCreateDrop1() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n create local temporary table t1 (e1 string);") //$NON-NLS-1$
.append("\n drop table t1;") //$NON-NLS-1$
@@ -883,7 +884,7 @@
}
@Test public void testCreateAfterImplicitTempTable() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE VIRTUAL PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n select e1 into #temp from pm1.g1;") //$NON-NLS-1$
.append("\n create local temporary table #temp (e1 string);") //$NON-NLS-1$
@@ -895,7 +896,7 @@
}
@Test public void testInsertAfterCreate() throws Exception {
- StringBuffer proc = new StringBuffer("CREATE PROCEDURE") //$NON-NLS-1$
+ StringBuffer proc = new StringBuffer("FOR EACH ROW") //$NON-NLS-1$
.append("\nBEGIN") //$NON-NLS-1$
.append("\n create local temporary table #temp (e1 string, e2 string);") //$NON-NLS-1$
.append("\n insert into #temp (e1) values ('a');") //$NON-NLS-1$
@@ -928,7 +929,7 @@
// variable resolution, variable compared against
// different datatype element for which there is no implicit transformation)
@Test public void testCreateUpdateProcedure2() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure += "BEGIN\n"; //$NON-NLS-1$
procedure += "DECLARE boolean var1;\n"; //$NON-NLS-1$
procedure += "ROWS_UPDATED = UPDATE pm1.g1 SET pm1.g1.e4 = convert(var1, string), pm1.g1.e1 = var1;\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 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/rewriter/TestQueryRewriter.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -1104,7 +1104,7 @@
@Test public void testRewriteWhile() throws Exception {
- String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "while (1 = 1)\n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1124,7 +1124,7 @@
@Test public void testRewriteWhile1() throws Exception {
- String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "while (1 = 0)\n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
@@ -1134,8 +1134,8 @@
String userQuery = "Insert into vm1.g1 (e1, e2) values ('String', 1)"; //$NON-NLS-1$
- String rewritProc = "CREATE VIRTUAL PROCEDURE\n"; //$NON-NLS-1$
- rewritProc = rewritProc + "BEGIN\n"; //$NON-NLS-1$
+ String rewritProc = "FOR EACH ROW\n"; //$NON-NLS-1$
+ rewritProc = rewritProc + "BEGIN ATOMIC\n"; //$NON-NLS-1$
rewritProc = rewritProc + "END"; //$NON-NLS-1$
String procReturned = this.getRewritenProcedure(procedure, userQuery,
@@ -1149,15 +1149,15 @@
*/
@Test public void testRewriteProcedureWithCount() throws Exception {
- String procedure = "CREATE PROCEDURE\n"; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW\n"; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "Select count(*) from pm1.g1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
String userQuery = "Insert into vm1.g1 (e1, e2) values ('String', 1)"; //$NON-NLS-1$
- String rewritProc = "CREATE VIRTUAL PROCEDURE\n"; //$NON-NLS-1$
- rewritProc = rewritProc + "BEGIN\n"; //$NON-NLS-1$
+ String rewritProc = "FOR EACH ROW\n"; //$NON-NLS-1$
+ rewritProc = rewritProc + "BEGIN ATOMIC\n"; //$NON-NLS-1$
rewritProc = rewritProc + "SELECT COUNT(*) FROM pm1.g1;\n"; //$NON-NLS-1$
rewritProc = rewritProc + "END"; //$NON-NLS-1$
Modified: trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/engine/src/test/java/org/teiid/query/validator/TestValidator.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -910,7 +910,7 @@
// valid variable declared
@Test public void testCreateUpdateProcedure4() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -924,7 +924,7 @@
// validating AssignmentStatement, more than one project symbol on the
// command
@Test public void testCreateUpdateProcedure11() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -939,7 +939,7 @@
// validating AssignmentStatement, more than one project symbol on the
// command
@Test public void testCreateUpdateProcedure12() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "var1 = Select pm1.g1.e2, pm1.g1.e1 from pm1.g1;\n"; //$NON-NLS-1$
@@ -953,7 +953,7 @@
// using aggregate function within a procedure - defect #8394
@Test public void testCreateUpdateProcedure31() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE string MaxTran;\n"; //$NON-NLS-1$
procedure = procedure + "MaxTran = SELECT MAX(e1) FROM pm1.g1;\n"; //$NON-NLS-1$
@@ -967,7 +967,7 @@
// assigning null values to known datatype variable
@Test public void testCreateUpdateProcedure32() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE string var;\n"; //$NON-NLS-1$
procedure = procedure + "var = null;\n"; //$NON-NLS-1$
@@ -980,7 +980,7 @@
}
@Test public void testDefect13643() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "DECLARE integer var1;\n"; //$NON-NLS-1$
procedure = procedure + "LOOP ON (SELECT * FROM pm1.g1) AS myCursor\n"; //$NON-NLS-1$
@@ -1019,7 +1019,7 @@
}
@Test public void testSelectIntoTempGroup() {
- String procedure = "CREATE VIRTUAL PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "SELECT COUNT(*) FROM #myTempTable;\n"; //$NON-NLS-1$
@@ -1035,7 +1035,7 @@
* Defect 24346
*/
@Test public void testInvalidSelectIntoTempGroup() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3, e4 INTO #myTempTable FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3 INTO #myTempTable FROM pm1.g2;\n"; //$NON-NLS-1$
@@ -1049,7 +1049,7 @@
}
@Test public void testInvalidSelectIntoTempGroup1() {
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "create local temporary table #myTempTable (e1 integer);\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1 INTO #myTempTable FROM pm1.g2;\n"; //$NON-NLS-1$
@@ -1066,7 +1066,7 @@
@Test public void testSelectIntoPhysicalGroup() {
helpValidate("SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] { }, RealMetadataFactory.example1Cached()); //$NON-NLS-1$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3, e4 INTO pm1.g1 FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1088,7 +1088,7 @@
@Test public void testInvalidSelectIntoTooManyElements() {
helpValidate("SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3, e4, 'val' INTO pm1.g1 FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1102,7 +1102,7 @@
@Test public void testInvalidSelectIntoTooFewElements() {
helpValidate("SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3 INTO pm1.g1 FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1116,7 +1116,7 @@
@Test public void testInvalidSelectIntoIncorrectTypes() {
helpValidate("SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2", new String[] {"SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, convert(e2, string), e3, e4 INTO pm1.g1 FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1134,7 +1134,7 @@
@Test public void testInvalidSelectIntoWithStar() {
helpValidate("SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1", new String[] {"SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1"}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$ //$NON-NLS-2$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT * INTO pm1.g1 FROM pm1.g2, pm1.g1;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
@@ -1148,7 +1148,7 @@
@Test public void testSelectIntoVirtualGroup() {
helpValidate("SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2", new String[] {}, RealMetadataFactory.example1Cached()); //$NON-NLS-1$
- String procedure = "CREATE PROCEDURE "; //$NON-NLS-1$
+ String procedure = "FOR EACH ROW "; //$NON-NLS-1$
procedure = procedure + "BEGIN\n"; //$NON-NLS-1$
procedure = procedure + "SELECT e1, e2, e3, e4 INTO vm1.g1 FROM pm1.g2;\n"; //$NON-NLS-1$
procedure = procedure + "END\n"; //$NON-NLS-1$
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/FileUDFMetaData.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -34,8 +34,7 @@
import org.teiid.query.QueryPlugin;
import org.teiid.query.function.metadata.FunctionMetadataReader;
import org.teiid.query.function.metadata.FunctionMetadataValidator;
-import org.teiid.query.report.ActivityReport;
-import org.teiid.query.report.ReportItem;
+import org.teiid.query.validator.ValidatorReport;
import org.teiid.runtime.RuntimePlugin;
public class FileUDFMetaData extends UDFMetaData {
@@ -59,7 +58,7 @@
throw new IOException(RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40075, name));
}
List<FunctionMethod> udfMethods = FunctionMetadataReader.loadFunctionMethods(file.openStream());
- ActivityReport<ReportItem> report = new ActivityReport<ReportItem>("UDF load"); //$NON-NLS-1$
+ ValidatorReport report = new ValidatorReport("UDF load"); //$NON-NLS-1$
FunctionMetadataValidator.validateFunctionMethods(udfMethods,report);
if(report.hasItems()) {
throw new IOException(QueryPlugin.Util.getString("ERR.015.001.0005", report)); //$NON-NLS-1$
Modified: trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java 2012-07-16 17:54:25 UTC (rev 4241)
+++ trunk/test-integration/common/src/test/java/org/teiid/systemmodel/TestODBCProceduresSchema.java 2012-07-17 01:00:58 UTC (rev 4242)
@@ -57,76 +57,61 @@
@Test public void test_Pg_Proc_alltypes() throws Exception {
execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='bigProcedure'"); //$NON-NLS-1$
- if (this.internalResultSet.next()) {
- assertEquals(1, this.internalResultSet.getInt(1)); //oid
- assertEquals("bigProcedure", this.internalResultSet.getString(2)); //proname
- assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
- assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
- assertEquals(14, this.internalResultSet.getInt(5)); //pronargs
- assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
- assertArrayEquals(new Object[] {"intNum","stringNum","floatNum","longNum","doubleNum","byteNum","dateValue","timeValue","timestampValue","booValue","charValue","shortNum","bigIntNum","bigdecimalNum","col","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
- assertArrayEquals(new Object[] {"i","i","i","i","i","i","i","i","i","i","i","i","i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
- assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700,1043,1700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
- assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
- }
- else {
- fail("no results");
- }
+ assertTrue(this.internalResultSet.next());
+ assertEquals(1, this.internalResultSet.getInt(1)); //oid
+ assertEquals("bigProcedure", this.internalResultSet.getString(2)); //proname
+ assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
+ assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
+ assertEquals(14, this.internalResultSet.getInt(5)); //pronargs
+ assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+ assertArrayEquals(new Object[] {"intNum","stringNum","floatNum","longNum","doubleNum","byteNum","dateValue","timeValue","timestampValue","booValue","charValue","shortNum","bigIntNum","bigdecimalNum","col","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+ assertArrayEquals(new Object[] {"i","i","i","i","i","i","i","i","i","i","i","i","i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+ assertArrayEquals(new Object[] {1700,1043,700,20,701,21,1082,1083,1114,16,1043,21,1700,1700,1043,1700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+ assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
}
@Test public void test_Pg_Proc_void() throws Exception {
execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='VoidProcedure'"); //$NON-NLS-1$
- if (this.internalResultSet.next()) {
- assertEquals(4, this.internalResultSet.getInt(1)); //oid
- assertEquals("VoidProcedure", this.internalResultSet.getString(2)); //proname
- assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
- assertEquals(2278, this.internalResultSet.getInt(4)); //prorettype
- assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
- assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
- assertArrayEquals(new Object[] {"intNum","stringNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
- assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
- assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
- assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
- }
- else {
- fail("no results");
- }
+ assertTrue(this.internalResultSet.next());
+ assertEquals(4, this.internalResultSet.getInt(1)); //oid
+ assertEquals("VoidProcedure", this.internalResultSet.getString(2)); //proname
+ assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
+ assertEquals(2278, this.internalResultSet.getInt(4)); //prorettype
+ assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
+ assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+ assertArrayEquals(new Object[] {"intNum","stringNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+ assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+ assertArrayEquals(new Object[] {1700,1043}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+ assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
}
@Test public void test_Pg_Proc_with_return() throws Exception {
execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='ProcedureWithReturn'"); //$NON-NLS-1$
- if (this.internalResultSet.next()) {
- assertEquals(3, this.internalResultSet.getInt(1)); //oid
- assertEquals("ProcedureWithReturn", this.internalResultSet.getString(2)); //proname
- assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
- assertEquals(20, this.internalResultSet.getInt(4)); //prorettype
- assertEquals(3, this.internalResultSet.getInt(5)); //pronargs
- assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
- assertArrayEquals(new Object[] {"intNum","stringNum","floatNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
- assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
- assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
- assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
- }
- else {
- fail("no results");
- }
+ assertTrue(this.internalResultSet.next());
+ assertEquals(3, this.internalResultSet.getInt(1)); //oid
+ assertEquals("ProcedureWithReturn", this.internalResultSet.getString(2)); //proname
+ assertEquals(false, this.internalResultSet.getBoolean(3)); //proretset
+ assertEquals(20, this.internalResultSet.getInt(4)); //prorettype
+ assertEquals(3, this.internalResultSet.getInt(5)); //pronargs
+ assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+ assertArrayEquals(new Object[] {"intNum","stringNum","floatNum"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+ assertArrayEquals(null, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+ assertArrayEquals(new Object[] {1700,1043,700}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+ assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
}
+
@Test public void test_Pg_Proc_with_return_table() throws Exception {
execute("select oid, proname, proretset,prorettype, pronargs, proargtypes, proargnames, proargmodes, proallargtypes, pronamespace FROM pg_proc where proname='ProcedureReturnTable'"); //$NON-NLS-1$
- if (this.internalResultSet.next()) {
- assertEquals(2, this.internalResultSet.getInt(1)); //oid
- assertEquals("ProcedureReturnTable", this.internalResultSet.getString(2)); //proname
- assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
- assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
- assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
- assertArrayEquals(new Object[] {1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
- assertArrayEquals(new Object[] {"intNum","bigDecimalNum","col1","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
- assertArrayEquals(new Object[] {"i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
- assertArrayEquals(new Object[] {1700,1700,1043,1114}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
- assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
- }
- else {
- fail("no results");
- }
+ assertTrue(this.internalResultSet.next());
+ assertEquals(2, this.internalResultSet.getInt(1)); //oid
+ assertEquals("ProcedureReturnTable", this.internalResultSet.getString(2)); //proname
+ assertEquals(true, this.internalResultSet.getBoolean(3)); //proretset
+ assertEquals(2249, this.internalResultSet.getInt(4)); //prorettype
+ assertEquals(2, this.internalResultSet.getInt(5)); //pronargs
+ assertArrayEquals(new Object[] {1700,1700}, (Object[])this.internalResultSet.getObject(6)); //proargtypes
+ assertArrayEquals(new Object[] {"intNum","bigDecimalNum","col1","col2"}, (Object[])this.internalResultSet.getObject(7)); //proargnames
+ assertArrayEquals(new Object[] {"i","i","t","t"}, (Object[])this.internalResultSet.getObject(8)); //proargmodes
+ assertArrayEquals(new Object[] {1700,1700,1043,1114}, (Object[])this.internalResultSet.getObject(9)); //proallargtypes
+ assertEquals(1, this.internalResultSet.getInt(10)); //pronamespace
}
}
12 years, 8 months
teiid SVN: r4241 - tags.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-16 13:54:25 -0400 (Mon, 16 Jul 2012)
New Revision: 4241
Added:
tags/teiid-7.7.1.GA/
Removed:
tags/Teiid-7.7.1.GA/
Log:
using lowercase
12 years, 8 months
teiid SVN: r4240 - tags.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-16 13:50:12 -0400 (Mon, 16 Jul 2012)
New Revision: 4240
Added:
tags/Teiid-7.7.1.GA/
Log:
adding GA tag
12 years, 8 months
teiid SVN: r4239 - in trunk: admin/src/test/java/org/teiid/adminapi/impl and 4 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-16 13:47:35 -0400 (Mon, 16 Jul 2012)
New Revision: 4239
Modified:
trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java
trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java
trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataParser.java
trunk/admin/src/test/java/org/teiid/adminapi/impl/TestModelMetaData.java
trunk/admin/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
trunk/jboss-integration/src/test/java/org/teiid/adminapi/jboss/TestAdminObjectBuilder.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
trunk/runtime/src/main/java/org/teiid/runtime/AbstractVDBDeployer.java
Log:
TEIID-2104 changing ValidationError to message, since it reflects a more generic purpose
Modified: trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -30,7 +30,7 @@
import java.util.List;
import org.teiid.adminapi.Model;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
public class ModelMetaData extends AdminObjectImpl implements Model {
@@ -44,8 +44,8 @@
protected String description;
protected String path;
protected Boolean visible = true;
- protected List<ValidationError> validationErrors;
- protected transient List<ValidationError> runtimeErrors;
+ protected List<Message> messages;
+ protected transient List<Message> runtimeMessages;
protected String schemaSourceType;
protected String schemaText;
@@ -166,18 +166,15 @@
}
public synchronized boolean hasErrors() {
- if (this.validationErrors == null && this.runtimeErrors == null) {
- return false;
- }
- if (this.validationErrors != null) {
- for (ValidationError error : this.validationErrors) {
+ if (this.messages != null) {
+ for (Message error : this.messages) {
if (error.getSeverity() == Severity.ERROR) {
return true;
}
}
}
- if (this.runtimeErrors != null) {
- for (ValidationError error : this.runtimeErrors) {
+ if (this.runtimeMessages != null) {
+ for (Message error : this.runtimeMessages) {
if (error.getSeverity() == Severity.ERROR) {
return true;
}
@@ -186,65 +183,65 @@
return false;
}
- public synchronized List<ValidationError> getErrors(){
- return getErrors(true);
+ public synchronized List<Message> getMessages(){
+ return getMessages(true);
}
- public synchronized List<ValidationError> getErrors(boolean includeRuntime){
- if (this.validationErrors == null && this.runtimeErrors == null) {
+ public synchronized List<Message> getMessages(boolean includeRuntime){
+ if (this.messages == null && this.runtimeMessages == null) {
return Collections.emptyList();
}
- List<ValidationError> list = new ArrayList<ValidationError>();
- if (this.validationErrors != null) {
- list.addAll(validationErrors);
+ List<Message> list = new ArrayList<Message>();
+ if (this.messages != null) {
+ list.addAll(messages);
}
- if (includeRuntime && this.runtimeErrors != null) {
- list.addAll(runtimeErrors);
+ if (includeRuntime && this.runtimeMessages != null) {
+ list.addAll(runtimeMessages);
}
return list;
}
- public ValidationError addError(String severity, String message) {
- ValidationError ve = new ValidationError(Severity.valueOf(severity), message);
- addError(ve);
+ public Message addMessage(String severity, String message) {
+ Message ve = new Message(Severity.valueOf(severity), message);
+ addMessage(ve);
return ve;
}
- public synchronized boolean hasRuntimeErrors(){
- return this.runtimeErrors != null && !this.runtimeErrors.isEmpty();
+ public synchronized boolean hasRuntimeMessages(){
+ return this.runtimeMessages != null && !this.runtimeMessages.isEmpty();
}
- public synchronized ValidationError addRuntimeError(String message) {
- return addRuntimeError(Severity.ERROR, message);
+ public synchronized Message addRuntimeError(String message) {
+ return addRuntimeMessage(Severity.ERROR, message);
}
- public synchronized ValidationError addRuntimeError(Severity severity, String message) {
- ValidationError ve = new ValidationError(severity, message);
- if (this.runtimeErrors == null) {
- this.runtimeErrors = new LinkedList<ValidationError>();
+ public synchronized Message addRuntimeMessage(Severity severity, String message) {
+ Message ve = new Message(severity, message);
+ if (this.runtimeMessages == null) {
+ this.runtimeMessages = new LinkedList<Message>();
}
- this.runtimeErrors.add(ve);
- if (this.runtimeErrors.size() > DEFAULT_ERROR_HISTORY) {
- this.runtimeErrors.remove(0);
+ this.runtimeMessages.add(ve);
+ if (this.runtimeMessages.size() > DEFAULT_ERROR_HISTORY) {
+ this.runtimeMessages.remove(0);
}
return ve;
}
- public synchronized ValidationError addError(ValidationError ve) {
- if (this.validationErrors == null) {
- this.validationErrors = new LinkedList<ValidationError>();
+ public synchronized Message addMessage(Message ve) {
+ if (this.messages == null) {
+ this.messages = new LinkedList<Message>();
}
- this.validationErrors.add(ve);
+ this.messages.add(ve);
return ve;
}
- public synchronized void clearRuntimeErrors() {
- if (runtimeErrors != null) {
- runtimeErrors = null;
+ public synchronized void clearRuntimeMessages() {
+ if (runtimeMessages != null) {
+ runtimeMessages = null;
}
}
- public static class ValidationError implements Serializable{
+ public static class Message implements Serializable{
private static final long serialVersionUID = 2044197069467559527L;
public enum Severity {ERROR, WARNING, INFO};
@@ -253,9 +250,9 @@
protected Severity severity;
protected String path;
- public ValidationError() {};
+ public Message() {};
- public ValidationError(Severity severity, String msg) {
+ public Message(Severity severity, String msg) {
this.severity = severity;
this.value = msg;
}
@@ -292,7 +289,7 @@
return false;
if (getClass() != obj.getClass())
return false;
- ValidationError other = (ValidationError) obj;
+ Message other = (Message) obj;
if (severity == null) {
if (other.severity != null)
return false;
@@ -326,9 +323,9 @@
@Override
public List<String> getValidityErrors() {
List<String> allErrors = new ArrayList<String>();
- List<ValidationError> errors = getErrors();
+ List<Message> errors = getMessages();
if (errors != null && !errors.isEmpty()) {
- for (ValidationError m:errors) {
+ for (Message m:errors) {
if (m.getSeverity() == Severity.ERROR) {
allErrors.add(m.getValue());
}
Modified: trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetaData.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -33,8 +33,8 @@
import org.teiid.adminapi.Model;
import org.teiid.adminapi.Translator;
import org.teiid.adminapi.VDB;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
public class VDBMetaData extends AdminObjectImpl implements VDB {
@@ -154,9 +154,9 @@
public List<String> getValidityErrors(){
List<String> allErrors = new ArrayList<String>();
for (ModelMetaData model:this.models.values()) {
- List<ValidationError> errors = model.getErrors();
+ List<Message> errors = model.getMessages();
if (errors != null && !errors.isEmpty()) {
- for (ValidationError m:errors) {
+ for (Message m:errors) {
if (m.getSeverity() == Severity.ERROR) {
allErrors.add(m.getValue());
}
Modified: trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataMapper.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -36,8 +36,8 @@
import org.teiid.adminapi.VDB.ConnectionType;
import org.teiid.adminapi.VDB.Status;
import org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
public class VDBMetadataMapper implements MetadataMapper<VDBMetaData> {
private static final String VDBNAME = "vdb-name"; //$NON-NLS-1$
@@ -298,10 +298,10 @@
}
}
- List<ValidationError> errors = model.getErrors();
+ List<Message> errors = model.getMessages();
if (errors != null && !errors.isEmpty()) {
ModelNode errorsNode = node.get(VALIDITY_ERRORS);
- for (ValidationError error:errors) {
+ for (Message error:errors) {
errorsNode.add(ValidationErrorMapper.INSTANCE.wrap(error, new ModelNode()));
}
}
@@ -359,9 +359,9 @@
if (node.get(VALIDITY_ERRORS).isDefined()) {
List<ModelNode> errorNodes = node.get(VALIDITY_ERRORS).asList();
for(ModelNode errorNode:errorNodes) {
- ValidationError error = ValidationErrorMapper.INSTANCE.unwrap(errorNode);
+ Message error = ValidationErrorMapper.INSTANCE.unwrap(errorNode);
if (error != null) {
- model.addError(error);
+ model.addMessage(error);
}
}
}
@@ -458,7 +458,7 @@
/**
* validation error mapper
*/
- public static class ValidationErrorMapper implements MetadataMapper<ValidationError>{
+ public static class ValidationErrorMapper implements MetadataMapper<Message>{
private static final String ERROR_PATH = "error-path"; //$NON-NLS-1$
private static final String SEVERITY = "severity"; //$NON-NLS-1$
private static final String MESSAGE = "message"; //$NON-NLS-1$
@@ -466,7 +466,7 @@
public static ValidationErrorMapper INSTANCE = new ValidationErrorMapper();
- public ModelNode wrap(ValidationError error, ModelNode node) {
+ public ModelNode wrap(Message error, ModelNode node) {
if (error == null) {
return null;
}
@@ -480,12 +480,12 @@
return node;
}
- public ValidationError unwrap(ModelNode node) {
+ public Message unwrap(ModelNode node) {
if (node == null) {
return null;
}
- ValidationError error = new ValidationError();
+ Message error = new Message();
if (node.has(ERROR_PATH)) {
error.setPath(node.get(ERROR_PATH).asString());
}
Modified: trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataParser.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataParser.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/main/java/org/teiid/adminapi/impl/VDBMetadataParser.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -49,8 +49,8 @@
import org.teiid.adminapi.Translator;
import org.teiid.adminapi.VDBImport;
import org.teiid.adminapi.impl.DataPolicyMetadata.PermissionMetaData;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
import org.teiid.core.types.XMLType;
import org.xml.sax.SAXException;
@@ -286,9 +286,9 @@
String msg = reader.getElementText();
String severity = validationProps.getProperty(Element.VALIDATION_SEVERITY_ATTR.getLocalName());
String path = validationProps.getProperty(Element.PATH.getLocalName());
- ValidationError ve = new ValidationError(Severity.valueOf(severity), msg);
+ Message ve = new Message(Severity.valueOf(severity), msg);
ve.setPath(path);
- model.addError(ve);
+ model.addMessage(ve);
break;
case METADATA:
Properties metdataProps = getAttributes(reader);
@@ -521,7 +521,7 @@
}
// model validation errors
- for (ValidationError ve:model.getErrors(false)) {
+ for (Message ve:model.getMessages(false)) {
writer.writeStartElement(Element.VALIDATION_ERROR.getLocalName());
writer.writeAttribute(Element.VALIDATION_SEVERITY_ATTR.getLocalName(), ve.getSeverity().name());
if (ve.getPath() != null) {
Modified: trunk/admin/src/test/java/org/teiid/adminapi/impl/TestModelMetaData.java
===================================================================
--- trunk/admin/src/test/java/org/teiid/adminapi/impl/TestModelMetaData.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/test/java/org/teiid/adminapi/impl/TestModelMetaData.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -60,10 +60,10 @@
public void testErrors() {
ModelMetaData m = new ModelMetaData();
- m.addError("ERROR", "I am Error");
- m.addError("WARNING", "I am warning");
+ m.addMessage("ERROR", "I am Error");
+ m.addMessage("WARNING", "I am warning");
- assertFalse(m.getErrors().isEmpty());
- assertEquals(1, m.getErrors().size());
+ assertFalse(m.getMessages().isEmpty());
+ assertEquals(1, m.getMessages().size());
}
}
Modified: trunk/admin/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java
===================================================================
--- trunk/admin/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/admin/src/test/java/org/teiid/adminapi/impl/TestVDBMetaData.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -151,7 +151,7 @@
modelOne.addProperty("model-prop", "model-value"); //$NON-NLS-1$ //$NON-NLS-2$
modelOne.addProperty("model-prop", "model-value-override"); //$NON-NLS-1$ //$NON-NLS-2$
modelOne.setVisible(false);
- modelOne.addError("ERROR", "There is an error in VDB"); //$NON-NLS-1$ //$NON-NLS-2$
+ modelOne.addMessage("ERROR", "There is an error in VDB"); //$NON-NLS-1$ //$NON-NLS-2$
modelOne.setDescription("model description");
vdb.addModel(modelOne);
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -55,7 +55,7 @@
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBMetadataParser;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
import org.teiid.common.buffer.BufferManager;
import org.teiid.core.TeiidException;
import org.teiid.deployers.CompositeVDB;
@@ -333,7 +333,7 @@
protected void loadMetadata(final VDBMetaData vdb, final ModelMetaData model, final ConnectorManagerRepository cmr, final MetadataRepository metadataRepo, final MetadataStore vdbMetadataStore, final AtomicInteger loadCount) {
String msg = IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50029,vdb.getName(), vdb.getVersion(), model.getName(), SimpleDateFormat.getInstance().format(new Date()));
- model.addRuntimeError(Severity.INFO, msg);
+ model.addRuntimeMessage(Severity.INFO, msg);
LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
Runnable job = new Runnable() {
Modified: trunk/jboss-integration/src/test/java/org/teiid/adminapi/jboss/TestAdminObjectBuilder.java
===================================================================
--- trunk/jboss-integration/src/test/java/org/teiid/adminapi/jboss/TestAdminObjectBuilder.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/jboss-integration/src/test/java/org/teiid/adminapi/jboss/TestAdminObjectBuilder.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -55,7 +55,7 @@
modelOne.addProperty("model-prop", "model-value");
modelOne.addProperty("model-prop", "model-value-override");
modelOne.setVisible(false);
- modelOne.addError("ERROR", "There is an error in VDB");
+ modelOne.addMessage("ERROR", "There is an error in VDB");
modelOne.setDescription("model description");
vdb.addModel(modelOne);
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -31,7 +31,7 @@
import org.teiid.adminapi.impl.SourceMappingMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
-import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
+import org.teiid.adminapi.impl.ModelMetaData.Message.Severity;
import org.teiid.core.TeiidException;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
@@ -131,7 +131,7 @@
ConnectorManagerRepository cmr = vdb.getAttachment(ConnectorManagerRepository.class);
boolean usesResourse = false;
for (ModelMetaData model:vdb.getModelMetaDatas().values()) {
- if (!model.hasRuntimeErrors()) {
+ if (!model.hasRuntimeMessages()) {
continue;
}
@@ -174,10 +174,10 @@
String status = cm.getStausMessage();
if (status != null && status.length() > 0) {
Severity severity = vdb.getStatus() == Status.LOADING?Severity.WARNING:Severity.ERROR;
- model.addRuntimeError(severity, status);
+ model.addRuntimeMessage(severity, status);
LogManager.logInfo(LogConstants.CTX_RUNTIME, status);
} else if (vdb.getStatus() != Status.LOADING){
- model.clearRuntimeErrors();
+ model.clearRuntimeMessages();
}
}
}
@@ -195,7 +195,7 @@
if (cm.getExecutionFactory().isSourceRequired()) {
String msg = RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40012, vdb.getName(), vdb.getVersion(), resourceName);
Severity severity = vdb.getStatus() == Status.LOADING?Severity.WARNING:Severity.ERROR;
- model.addRuntimeError(severity, msg);
+ model.addRuntimeMessage(severity, msg);
LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
}
}
Modified: trunk/runtime/src/main/java/org/teiid/runtime/AbstractVDBDeployer.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/runtime/AbstractVDBDeployer.java 2012-07-15 11:25:56 UTC (rev 4238)
+++ trunk/runtime/src/main/java/org/teiid/runtime/AbstractVDBDeployer.java 2012-07-16 17:47:35 UTC (rev 4239)
@@ -157,7 +157,7 @@
factory.mergeInto(vdbMetadataStore);
//TODO: this is not quite correct, the source may be missing
- model.clearRuntimeErrors();
+ model.clearRuntimeMessages();
if (loadCount.decrementAndGet() == 0) {
getVDBRepository().finishDeployment(vdb.getName(), vdb.getVersion());
12 years, 8 months
teiid SVN: r4238 - in trunk: admin/src/main/java/org/teiid/adminapi/impl and 7 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-15 07:25:56 -0400 (Sun, 15 Jul 2012)
New Revision: 4238
Modified:
trunk/admin/src/main/java/org/teiid/adminapi/Model.java
trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java
trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java
trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
trunk/runtime/src/main/java/org/teiid/runtime/RuntimePlugin.java
trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties
trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java
Log:
TEIID-2104 altering the use of runtime errors to make load problems more evident
Modified: trunk/admin/src/main/java/org/teiid/adminapi/Model.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/Model.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/admin/src/main/java/org/teiid/adminapi/Model.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -88,4 +88,10 @@
* @return
*/
String getSourceTranslatorName(String sourceName);
+
+ /**
+ * Shows any validity errors present in the model
+ * @return
+ */
+ List<String> getValidityErrors();
}
\ No newline at end of file
Modified: trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java
===================================================================
--- trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/admin/src/main/java/org/teiid/adminapi/impl/ModelMetaData.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -119,6 +119,10 @@
return new ArrayList<SourceMappingMetadata>(this.sources.values());
}
+ public LinkedHashMap<String, SourceMappingMetadata> getSources() {
+ return sources;
+ }
+
public SourceMappingMetadata getSourceMapping(String sourceName){
return this.sources.get(sourceName);
}
@@ -211,7 +215,11 @@
}
public synchronized ValidationError addRuntimeError(String message) {
- ValidationError ve = new ValidationError(Severity.ERROR, message);
+ return addRuntimeError(Severity.ERROR, message);
+ }
+
+ public synchronized ValidationError addRuntimeError(Severity severity, String message) {
+ ValidationError ve = new ValidationError(severity, message);
if (this.runtimeErrors == null) {
this.runtimeErrors = new LinkedList<ValidationError>();
}
@@ -220,7 +228,7 @@
this.runtimeErrors.remove(0);
}
return ve;
- }
+ }
public synchronized ValidationError addError(ValidationError ve) {
if (this.validationErrors == null) {
@@ -239,7 +247,7 @@
public static class ValidationError implements Serializable{
private static final long serialVersionUID = 2044197069467559527L;
- public enum Severity {ERROR, WARNING};
+ public enum Severity {ERROR, WARNING, INFO};
protected String value;
protected Severity severity;
@@ -315,4 +323,18 @@
this.schemaText = schemaText;
}
+ @Override
+ public List<String> getValidityErrors() {
+ List<String> allErrors = new ArrayList<String>();
+ List<ValidationError> errors = getErrors();
+ if (errors != null && !errors.isEmpty()) {
+ for (ValidationError m:errors) {
+ if (m.getSeverity() == Severity.ERROR) {
+ allErrors.add(m.getValue());
+ }
+ }
+ }
+ return allErrors;
+ }
+
}
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -836,7 +836,7 @@
* Implement to provide metadata to the metadata for use by the engine. This is the
* primary method of creating metadata for dynamic VDBs.
* @param metadataFactory
- * @param conn
+ * @param conn may be null if there was an error obtaining a connection
* @throws TranslatorException
*/
public void getMetadata(MetadataFactory metadataFactory, C conn) throws TranslatorException {
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorManager.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -33,10 +33,10 @@
import org.teiid.dqp.message.AtomicRequestID;
import org.teiid.dqp.message.AtomicRequestMessage;
import org.teiid.logging.CommandLogMessage;
-import org.teiid.logging.CommandLogMessage.Event;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
+import org.teiid.logging.CommandLogMessage.Event;
import org.teiid.metadata.FunctionMethod;
import org.teiid.query.QueryPlugin;
import org.teiid.query.optimizer.capabilities.BasicSourceCapabilities;
@@ -72,7 +72,7 @@
}
public String getStausMessage() {
- StringBuilder sb = new StringBuilder();
+ String msg = ""; //$NON-NLS-1$
ExecutionFactory<Object, Object> ef = getExecutionFactory();
if(ef != null) {
@@ -86,14 +86,14 @@
}
if (conn == null) {
- sb.append(QueryPlugin.Util.getString("datasource_not_found", this.connectionName)); //$NON-NLS-1$
+ msg = QueryPlugin.Util.getString("datasource_not_found", this.connectionName); //$NON-NLS-1$
}
}
}
else {
- sb.append(QueryPlugin.Util.getString("translator_not_found", this.translatorName)); //$NON-NLS-1$
+ msg = QueryPlugin.Util.getString("translator_not_found", this.translatorName); //$NON-NLS-1$
}
- return sb.toString();
+ return msg;
}
public List<FunctionMethod> getPushDownFunctions(){
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBDeployer.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -103,22 +103,22 @@
// make sure the translator defined exists in configuration; otherwise add as error
for (ModelMetaData model:deployment.getModelMetaDatas().values()) {
- if (model.isSource() && !model.getSourceNames().isEmpty()) {
- for (String source:model.getSourceNames()) {
-
- String translatorName = model.getSourceTranslatorName(source);
- if (deployment.isOverideTranslator(translatorName)) {
- VDBTranslatorMetaData parent = deployment.getTranslator(translatorName);
- translatorName = parent.getType();
- }
-
- Translator translator = this.translatorRepository.getTranslatorMetaData(translatorName);
- if ( translator == null) {
- String msg = IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50077, translatorName, deployment.getName(), deployment.getVersion());
- model.addRuntimeError(msg);
- LogManager.logWarning(LogConstants.CTX_RUNTIME, msg);
- }
+ if (!model.isSource() || model.getSourceNames().isEmpty()) {
+ continue;
+ }
+ for (String source:model.getSourceNames()) {
+
+ String translatorName = model.getSourceTranslatorName(source);
+ if (deployment.isOverideTranslator(translatorName)) {
+ VDBTranslatorMetaData parent = deployment.getTranslator(translatorName);
+ translatorName = parent.getType();
}
+
+ Translator translator = this.translatorRepository.getTranslatorMetaData(translatorName);
+ if ( translator == null) {
+ String msg = IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50077, translatorName, deployment.getName(), deployment.getVersion());
+ LogManager.logWarning(LogConstants.CTX_RUNTIME, msg);
+ }
}
}
@@ -256,6 +256,9 @@
// Need to make the data source service as dependency; otherwise dynamic vdbs will not work correctly.
String dsName = model.getSourceConnectionJndiName(sourceName);
+ if (dsName == null) {
+ continue;
+ }
final ContextNames.BindInfo bindInfo = ContextNames.bindInfoFor(getJndiName(dsName));
svcListener.dependentService(dsName, bindInfo.getBinderServiceName());
}
Modified: trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java
===================================================================
--- trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/jboss-integration/src/main/java/org/teiid/jboss/VDBService.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -24,7 +24,14 @@
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ServiceLoader;
+import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
@@ -34,7 +41,13 @@
import org.jboss.modules.ModuleIdentifier;
import org.jboss.modules.ModuleLoadException;
import org.jboss.modules.ModuleLoader;
-import org.jboss.msc.service.*;
+import org.jboss.msc.service.Service;
+import org.jboss.msc.service.ServiceBuilder;
+import org.jboss.msc.service.ServiceContainer;
+import org.jboss.msc.service.ServiceController;
+import org.jboss.msc.service.StartContext;
+import org.jboss.msc.service.StartException;
+import org.jboss.msc.service.StopContext;
import org.jboss.msc.value.InjectedValue;
import org.teiid.adminapi.AdminProcessingException;
import org.teiid.adminapi.Translator;
@@ -42,13 +55,21 @@
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBMetadataParser;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
+import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
import org.teiid.common.buffer.BufferManager;
import org.teiid.core.TeiidException;
-import org.teiid.deployers.*;
+import org.teiid.deployers.CompositeVDB;
+import org.teiid.deployers.RuntimeVDB;
+import org.teiid.deployers.TranslatorUtil;
+import org.teiid.deployers.UDFMetaData;
+import org.teiid.deployers.VDBLifeCycleListener;
+import org.teiid.deployers.VDBRepository;
+import org.teiid.deployers.VDBStatusChecker;
+import org.teiid.deployers.VirtualDatabaseException;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
+import org.teiid.dqp.internal.datamgr.TranslatorRepository;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository.ConnectorManagerException;
-import org.teiid.dqp.internal.datamgr.TranslatorRepository;
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.metadata.Datatype;
@@ -312,7 +333,7 @@
protected void loadMetadata(final VDBMetaData vdb, final ModelMetaData model, final ConnectorManagerRepository cmr, final MetadataRepository metadataRepo, final MetadataStore vdbMetadataStore, final AtomicInteger loadCount) {
String msg = IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50029,vdb.getName(), vdb.getVersion(), model.getName(), SimpleDateFormat.getInstance().format(new Date()));
- model.addRuntimeError(msg);
+ model.addRuntimeError(Severity.INFO, msg);
LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
Runnable job = new Runnable() {
@@ -321,7 +342,7 @@
boolean metadataLoaded = false;
boolean cached = false;
- List<String> errorMessages = new ArrayList<String>();
+ Exception ex = null;
final File cachedFile = getSerializer().buildModelFile(vdb, model.getName());
MetadataFactory factory = getSerializer().loadSafe(cachedFile, MetadataFactory.class);
@@ -357,34 +378,26 @@
metadataRepo.loadMetadata(factory, ef, cf);
metadataLoaded = true;
LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50030,vdb.getName(), vdb.getVersion(), model.getName(), SimpleDateFormat.getInstance().format(new Date())));
- } catch (TranslatorException e) {
- errorMessages.add(e.getMessage());
- LogManager.logInfo(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50036,vdb.getName(), vdb.getVersion(), model.getName(), e.getMessage()));
+ } catch (Exception e) {
+ ex = e;
}
}
synchronized (vdb) {
if (metadataLoaded) {
-
if (!cached) {
// cache the schema to disk
cacheMetadataStore(model, factory);
}
metadataLoaded(vdb, model, vdbMetadataStore, loadCount, factory);
- }
- else {
- for (String errorMsg:errorMessages) {
- model.addRuntimeError(errorMsg);
- LogManager.logWarning(LogConstants.CTX_RUNTIME, errorMsg);
- }
+ } else {
+ model.addRuntimeError(ex.getMessage());
+ LogManager.logWarning(LogConstants.CTX_RUNTIME, IntegrationPlugin.Util.gs(IntegrationPlugin.Event.TEIID50036,vdb.getName(), vdb.getVersion(), model.getName(), ex.getMessage()));
+ //defer the load to the status checker if/when a source is available/redeployed
+ model.addAttchment(Runnable.class, this);
}
}
-
- if (!metadataLoaded) {
- //defer the load to the status checker if/when a source is available/redeployed
- model.addAttchment(Runnable.class, this);
- }
}
};
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBRepository.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -338,8 +338,8 @@
if (cm != null) {
String msg = cm.getStausMessage();
if (msg != null && msg.length() > 0) {
- model.addRuntimeError(cm.getStausMessage());
- LogManager.logInfo(LogConstants.CTX_RUNTIME, cm.getStausMessage());
+ model.addRuntimeError(msg);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
}
}
}
Modified: trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/runtime/src/main/java/org/teiid/deployers/VDBStatusChecker.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -26,10 +26,12 @@
import java.util.concurrent.Executor;
import org.teiid.adminapi.AdminProcessingException;
-import org.teiid.adminapi.Model;
+import org.teiid.adminapi.VDB.Status;
import org.teiid.adminapi.impl.ModelMetaData;
+import org.teiid.adminapi.impl.SourceMappingMetadata;
import org.teiid.adminapi.impl.VDBMetaData;
import org.teiid.adminapi.impl.VDBTranslatorMetaData;
+import org.teiid.adminapi.impl.ModelMetaData.ValidationError.Severity;
import org.teiid.core.TeiidException;
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
@@ -44,26 +46,30 @@
private static final String JAVA_CONTEXT = "java:/"; //$NON-NLS-1$
private TranslatorRepository translatorRepository;
+ /**
+ * @param translatorName
+ */
public void translatorAdded(String translatorName) {
- resourceAdded(translatorName, true);
}
+ /**
+ * @param translatorName
+ */
public void translatorRemoved(String translatorName) {
- resourceRemoved(translatorName, true);
}
public void dataSourceAdded(String dataSourceName) {
if (dataSourceName.startsWith(JAVA_CONTEXT)) {
dataSourceName = dataSourceName.substring(5);
}
- resourceAdded(dataSourceName, false);
+ resourceAdded(dataSourceName);
}
public void dataSourceRemoved(String dataSourceName) {
if (dataSourceName.startsWith(JAVA_CONTEXT)) {
dataSourceName = dataSourceName.substring(5);
}
- resourceRemoved(dataSourceName, false);
+ resourceRemoved(dataSourceName);
}
public void dataSourceReplaced(String vdbName, int vdbVersion,
@@ -82,7 +88,7 @@
ExecutionFactory<Object, Object> ef = cm.getExecutionFactory();
boolean dsReplaced = false;
- if (!cm.getConnectionName().equals(dsName)){
+ if ((dsName != null && !dsName.equals(cm.getConnectionName())) || (dsName == null && cm.getConnectionName() != null)) {
LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40076, vdb.getName(), vdb.getVersion(), model.getSourceTranslatorName(sourceName), dsName));
cm = new ConnectorManager(translatorName, dsName);
cm.setExecutionFactory(ef);
@@ -111,97 +117,104 @@
}
if (dsReplaced) {
- resourceAdded(dsName, false);
+ ArrayList<Runnable> runnables = new ArrayList<Runnable>(1);
+ checkStatus(runnables, vdb, model, cm);
+ updateVDB(runnables, vdb);
}
}
}
- public void resourceAdded(String resourceName, boolean translator) {
+ public void resourceAdded(String resourceName) {
List<Runnable> runnables = new ArrayList<Runnable>();
for (VDBMetaData vdb:getVDBRepository().getVDBs()) {
synchronized (vdb) {
ConnectorManagerRepository cmr = vdb.getAttachment(ConnectorManagerRepository.class);
-
+ boolean usesResourse = false;
for (ModelMetaData model:vdb.getModelMetaDatas().values()) {
if (!model.hasRuntimeErrors()) {
continue;
}
- String sourceName = getSourceName(resourceName, model, translator);
+ String sourceName = getSourceName(resourceName, model);
if (sourceName == null) {
continue;
}
+ usesResourse = true;
ConnectorManager cm = cmr.getConnectorManager(sourceName);
- String status = cm.getStausMessage();
- if (status != null && status.length() > 0) {
- model.addRuntimeError(status);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, status);
- } else {
- //get the pending metadata load
- Runnable r = model.removeAttachment(Runnable.class);
- if (r != null) {
- runnables.add(r);
- } else {
- model.clearRuntimeErrors();
- }
- }
+ checkStatus(runnables, vdb, model, cm);
}
- boolean valid = !vdb.hasErrors();
-
- if (!runnables.isEmpty()) {
- //the task themselves will set the status on completion/failure
- for (Runnable runnable : runnables) {
- getExecutor().execute(runnable);
- }
- runnables.clear();
- } else if (valid) {
- LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40003,vdb.getName(), vdb.getVersion(), vdb.getStatus()));
+ if (usesResourse) {
+ updateVDB(runnables, vdb);
}
}
}
}
+
+ private void updateVDB(List<Runnable> runnables, VDBMetaData vdb) {
+ if (!runnables.isEmpty()) {
+ //the task themselves will set the status on completion/failure
+ for (Runnable runnable : runnables) {
+ getExecutor().execute(runnable);
+ }
+ runnables.clear();
+ } else if (vdb.hasErrors()) {
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40003,vdb.getName(), vdb.getVersion(), vdb.getStatus()));
+ }
+ }
+
+ private void checkStatus(List<Runnable> runnables, VDBMetaData vdb,
+ ModelMetaData model, ConnectorManager cm) {
+ //get the pending metadata load
+ Runnable r = model.removeAttachment(Runnable.class);
+ if (r != null) {
+ runnables.add(r);
+ } else {
+ String status = cm.getStausMessage();
+ if (status != null && status.length() > 0) {
+ Severity severity = vdb.getStatus() == Status.LOADING?Severity.WARNING:Severity.ERROR;
+ model.addRuntimeError(severity, status);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, status);
+ } else if (vdb.getStatus() != Status.LOADING){
+ model.clearRuntimeErrors();
+ }
+ }
+ }
- public void resourceRemoved(String resourceName, boolean translator) {
+ public void resourceRemoved(String resourceName) {
for (VDBMetaData vdb:getVDBRepository().getVDBs()) {
synchronized (vdb) {
- for (Model m:vdb.getModels()) {
- ModelMetaData model = (ModelMetaData)m;
-
- String sourceName = getSourceName(resourceName, model, translator);
- if (sourceName != null) {
- String msg = null;
- if (translator) {
- msg = RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40005, vdb.getName(), vdb.getVersion(), model.getSourceTranslatorName(sourceName));
- }
- else {
- msg = RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40012, vdb.getName(), vdb.getVersion(), resourceName);
- }
- model.addRuntimeError(msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
- LogManager.logInfo(LogConstants.CTX_RUNTIME, RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40003,vdb.getName(), vdb.getVersion(), vdb.getStatus()));
+ ConnectorManagerRepository cmr = vdb.getAttachment(ConnectorManagerRepository.class);
+ for (ModelMetaData model:vdb.getModelMetaDatas().values()) {
+ String sourceName = getSourceName(resourceName, model);
+ if (sourceName == null) {
+ continue;
}
+ ConnectorManager cm = cmr.getConnectorManager(sourceName);
+ if (cm.getExecutionFactory().isSourceRequired()) {
+ String msg = RuntimePlugin.Util.gs(RuntimePlugin.Event.TEIID40012, vdb.getName(), vdb.getVersion(), resourceName);
+ Severity severity = vdb.getStatus() == Status.LOADING?Severity.WARNING:Severity.ERROR;
+ model.addRuntimeError(severity, msg);
+ LogManager.logInfo(LogConstants.CTX_RUNTIME, msg);
+ }
}
}
}
}
- private String getSourceName(String translatorName, ModelMetaData model, boolean translator) {
- for (String sourceName:model.getSourceNames()) {
- if (translator) {
- if (translatorName.equals(model.getSourceTranslatorName(sourceName))) {
- return sourceName;
- }
- } else {
- String jndiName = model.getSourceConnectionJndiName(sourceName);
- if (jndiName.startsWith(JAVA_CONTEXT)) {
- jndiName = jndiName.substring(5);
- }
- if (translatorName.equals(jndiName)) {
- return sourceName;
- }
+ private String getSourceName(String factoryName, ModelMetaData model) {
+ for (SourceMappingMetadata source:model.getSources().values()) {
+ String jndiName = source.getConnectionJndiName();
+ if (jndiName == null) {
+ continue;
}
+ if (jndiName.startsWith(JAVA_CONTEXT)) {
+ jndiName = jndiName.substring(5);
+ }
+ if (factoryName.equals(jndiName)) {
+ return source.getName();
+ }
}
return null;
}
Modified: trunk/runtime/src/main/java/org/teiid/runtime/RuntimePlugin.java
===================================================================
--- trunk/runtime/src/main/java/org/teiid/runtime/RuntimePlugin.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/runtime/src/main/java/org/teiid/runtime/RuntimePlugin.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -35,7 +35,6 @@
TEIID40001, // undefined translator properties
TEIID40002, // failed to load ODBC metadata
TEIID40003, // VDB status
- TEIID40005, // datasource or translator not found
TEIID40007, // keep alive failed
TEIID40008, // expired session
TEIID40009, // terminate session
Modified: trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties
===================================================================
--- trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/runtime/src/main/resources/org/teiid/runtime/i18n.properties 2012-07-15 11:25:56 UTC (rev 4238)
@@ -47,7 +47,6 @@
TEIID40035=VDB with given name and version already exists! {0}.{1}
TEIID40021=System.vdb not found in classpath
-TEIID40005=For {0}.{1} VDB, Translator "{2}" not found.
TEIID40012=For {0}.{1} VDB, Data Source "{2}" not found.
TEIID40076=For {0}.{1} VDB, Data Source "{2}" replaced with "{3}"
TEIID40024={0} invalid type of class specified. Must be of type org.teiid.connector.api.Connector
Modified: trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java 2012-07-13 13:14:44 UTC (rev 4237)
+++ trunk/test-integration/common/src/test/java/org/teiid/arquillian/IntegrationTestDeployment.java 2012-07-15 11:25:56 UTC (rev 4238)
@@ -79,7 +79,11 @@
AdminUtil.createDataSource(admin, "Oracle11_PushDS", "h2", props);
admin.deploy("fake.jar",new FileInputStream(UnitTestUtil.getTestDataFile("fake.jar")));
- admin.deploy("chained-vdb.xml",new FileInputStream(UnitTestUtil.getTestDataFile("chained-vdb.xml")));
+ try {
+ admin.deploy("chained-vdb.xml",new FileInputStream(UnitTestUtil.getTestDataFile("chained-vdb.xml")));
+ } finally {
+ admin.undeploy("fake.jar");
+ }
}
@Test
12 years, 8 months
teiid SVN: r4237 - trunk/build/kits/jboss-as7/docs/teiid.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-13 09:14:44 -0400 (Fri, 13 Jul 2012)
New Revision: 4237
Modified:
trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
Log:
TEIID-2101 adding a KI
Modified: trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html
===================================================================
--- trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-13 13:09:56 UTC (rev 4236)
+++ trunk/build/kits/jboss-as7/docs/teiid/teiid-releasenotes.html 2012-07-13 13:14:44 UTC (rev 4237)
@@ -196,7 +196,8 @@
<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<a/> - 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 thread-count-for-source-concurrency=1). Usage of Teradata lobs under any other configuration is unlikely to work.
+ <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 thread-count-for-source-concurrency=1). Usage of Teradata lobs under any other configuration is unlikely to work.
+ <li>TEIID-2101 - Statement.setMaxRows is not used for cached result sets or when getting a result set from a CallableStatement procedure that returns parameters.
</ul>
<h4>from 7.0</h4>
<ul>
12 years, 8 months
teiid SVN: r4236 - in trunk: client/src/main/resources/org/teiid/jdbc and 3 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-13 09:09:56 -0400 (Fri, 13 Jul 2012)
New Revision: 4236
Modified:
trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java
trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java
trunk/client/src/main/resources/org/teiid/jdbc/i18n.properties
trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java
trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java
trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
Log:
TEIID-2100 adding getObject support and correcting misc. warnings
Modified: trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/client/src/main/java/org/teiid/jdbc/DataTypeTransformer.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -44,7 +44,6 @@
import org.teiid.core.types.BinaryType;
import org.teiid.core.types.DataTypeManager;
import org.teiid.core.types.TransformationException;
-import org.teiid.core.types.DataTypeManager.DefaultDataClasses;
import org.teiid.core.util.ReaderInputStream;
@@ -65,29 +64,69 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final BigDecimal getBigDecimal(Object value) throws SQLException {
- return transform(value, BigDecimal.class, "BigDecimal"); //$NON-NLS-1$
+ return transform(value, BigDecimal.class);
}
- private static final <T> T transform(Object value, Class<T> type, String typeName) throws SQLException {
- return transform(value, type, type, typeName);
- }
-
- private static final <T> T transform(Object value, Class<T> targetType, Class<?> runtimeType, String typeName) throws SQLException {
+ static final <T> T transform(Object value, Class<T> targetType) throws SQLException {
if (value == null || targetType.isAssignableFrom(value.getClass())) {
return targetType.cast(value);
}
+ if (targetType == byte[].class) {
+ if (value instanceof Blob) {
+ Blob blob = (Blob)value;
+ long length = blob.length();
+ if (length > Integer.MAX_VALUE) {
+ throw new TeiidSQLException(JDBCPlugin.Util.getString("DataTypeTransformer.blob_too_big")); //$NON-NLS-1$
+ }
+ return targetType.cast(blob.getBytes(1, (int)length));
+ } else if (value instanceof String) {
+ return targetType.cast(((String)value).getBytes());
+ } else if (value instanceof BinaryType) {
+ return targetType.cast(((BinaryType)value).getBytesDirect());
+ }
+ } else if (targetType == String.class) {
+ if (value instanceof SQLXML) {
+ return targetType.cast(((SQLXML)value).getString());
+ } else if (value instanceof Clob) {
+ Clob c = (Clob)value;
+ long length = c.length();
+ if (length == 0) {
+ //there is a bug in SerialClob with 0 length
+ return targetType.cast(""); //$NON-NLS-1$
+ }
+ return targetType.cast(c.getSubString(1, length>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)length));
+ }
+ }
try {
- return targetType.cast(DataTypeManager.transformValue(DataTypeManager.convertToRuntimeType(value), runtimeType));
+ return targetType.cast(DataTypeManager.transformValue(DataTypeManager.convertToRuntimeType(value), getRuntimeType(targetType)));
} catch (TransformationException e) {
String valueStr = value.toString();
if (valueStr.length() > 20) {
valueStr = valueStr.substring(0, 20) + "..."; //$NON-NLS-1$
}
- String msg = JDBCPlugin.Util.getString("DataTypeTransformer.Err_converting", valueStr, typeName); //$NON-NLS-1$
+ String msg = JDBCPlugin.Util.getString("DataTypeTransformer.Err_converting", valueStr, targetType.getSimpleName()); //$NON-NLS-1$
throw TeiidSQLException.create(e, msg);
}
}
+ static final <T> Class<?> getRuntimeType(Class<T> type) {
+ Class<?> runtimeType = type;
+ if (!DataTypeManager.getAllDataTypeClasses().contains(type)) {
+ if (type == Clob.class) {
+ runtimeType = DataTypeManager.DefaultDataClasses.CLOB;
+ } else if (type == Blob.class) {
+ runtimeType = DataTypeManager.DefaultDataClasses.BLOB;
+ } else if (type == SQLXML.class) {
+ runtimeType = DataTypeManager.DefaultDataClasses.XML;
+ } else if (type == byte[].class) {
+ runtimeType = DataTypeManager.DefaultDataClasses.VARBINARY;
+ } else {
+ runtimeType = DataTypeManager.DefaultDataClasses.OBJECT;
+ }
+ }
+ return runtimeType;
+ }
+
/**
* Gets an object value and transforms it into a boolean
* @param value, the object to be transformed
@@ -98,7 +137,7 @@
if (value == null) {
return false;
}
- return transform(value, Boolean.class, "Boolean"); //$NON-NLS-1$
+ return transform(value, Boolean.class);
}
/**
@@ -111,31 +150,15 @@
if (value == null) {
return 0;
}
- return transform(value, Byte.class, "Byte"); //$NON-NLS-1$
+ return transform(value, Byte.class);
}
static final byte[] getBytes(Object value) throws SQLException {
- if (value == null) {
- return null;
- } else if (value instanceof byte[]) {
- return (byte[])value;
- } else if (value instanceof Blob) {
- Blob blob = (Blob)value;
- long length = blob.length();
- if (length > Integer.MAX_VALUE) {
- throw new TeiidSQLException(JDBCPlugin.Util.getString("DataTypeTransformer.blob_too_big")); //$NON-NLS-1$
- }
- return blob.getBytes(1, (int)length);
- } else if (value instanceof String) {
- return ((String)value).getBytes();
- } else if (value instanceof BinaryType) {
- return ((BinaryType)value).getBytesDirect();
- }
- throw new TeiidSQLException(JDBCPlugin.Util.getString("DataTypeTransformer.cannot_get_bytes")); //$NON-NLS-1$
+ return transform(value, byte[].class);
}
static final Character getCharacter(Object value) throws SQLException {
- return transform(value, Character.class, "Character"); //$NON-NLS-1$
+ return transform(value, Character.class);
}
/**
@@ -146,7 +169,7 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final Date getDate(Object value) throws SQLException {
- return transform(value, Date.class, "Date"); //$NON-NLS-1$
+ return transform(value, Date.class);
}
/**
@@ -159,7 +182,7 @@
if (value == null) {
return 0;
}
- return transform(value, Double.class, "Double"); //$NON-NLS-1$
+ return transform(value, Double.class);
}
/**
@@ -172,7 +195,7 @@
if (value == null) {
return 0;
}
- return transform(value, Float.class, "Float"); //$NON-NLS-1$
+ return transform(value, Float.class);
}
/**
@@ -185,7 +208,7 @@
if (value == null) {
return 0;
}
- return transform(value, Integer.class, "Integer"); //$NON-NLS-1$
+ return transform(value, Integer.class);
}
/**
@@ -198,7 +221,7 @@
if (value == null) {
return 0;
}
- return transform(value, Long.class, "Long"); //$NON-NLS-1$
+ return transform(value, Long.class);
}
/**
@@ -211,7 +234,7 @@
if (value == null) {
return 0;
}
- return transform(value, Short.class, "Short"); //$NON-NLS-1$
+ return transform(value, Short.class);
}
/**
@@ -222,7 +245,7 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final Time getTime(Object value) throws SQLException {
- return transform(value, Time.class, "Time"); //$NON-NLS-1$
+ return transform(value, Time.class);
}
/**
@@ -233,22 +256,11 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final Timestamp getTimestamp(Object value) throws SQLException {
- return transform(value, Timestamp.class, "Timestamp"); //$NON-NLS-1$
+ return transform(value, Timestamp.class);
}
static final String getString(Object value) throws SQLException {
- if (value instanceof SQLXML) {
- return ((SQLXML)value).getString();
- } else if (value instanceof Clob) {
- Clob c = (Clob)value;
- long length = c.length();
- if (length == 0) {
- //there is a bug in SerialClob with 0 length
- return ""; //$NON-NLS-1$
- }
- return c.getSubString(1, length>Integer.MAX_VALUE?Integer.MAX_VALUE:(int)length);
- }
- return transform(value, String.class, "String"); //$NON-NLS-1$
+ return transform(value, String.class);
}
/**
@@ -259,7 +271,7 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final Blob getBlob(Object value) throws SQLException {
- return transform(value, Blob.class, DefaultDataClasses.BLOB, "Blob"); //$NON-NLS-1$
+ return transform(value, Blob.class);
}
/**
@@ -270,7 +282,7 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final Clob getClob(Object value) throws SQLException {
- return transform(value, Clob.class, DefaultDataClasses.CLOB, "Clob"); //$NON-NLS-1$
+ return transform(value, Clob.class);
}
/**
@@ -280,7 +292,7 @@
* @throws SQLException if failed to transform to the desired datatype
*/
static final SQLXML getSQLXML(Object value) throws SQLException {
- return transform(value, SQLXML.class, DefaultDataClasses.XML, "SQLXML"); //$NON-NLS-1$
+ return transform(value, SQLXML.class);
}
static final Reader getCharacterStream(Object value) throws SQLException {
@@ -321,6 +333,9 @@
if (clob == null) {
return null;
}
+ if (clob instanceof NClob) {
+ return (NClob)clob;
+ }
return (NClob) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] {NClob.class}, new InvocationHandler() {
@Override
Modified: trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java
===================================================================
--- trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/client/src/main/java/org/teiid/jdbc/ResultSetImpl.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -1667,11 +1667,12 @@
}
public <T> T getObject(int columnIndex, Class<T> type) throws SQLException {
- throw SqlUtil.createFeatureNotSupportedException();
+ return DataTypeTransformer.transform(getObject(columnIndex), type);
}
public <T> T getObject(String columnLabel, Class<T> type)
throws SQLException {
- throw SqlUtil.createFeatureNotSupportedException();
+ return DataTypeTransformer.transform(getObject(columnLabel), type);
}
+
}
Modified: trunk/client/src/main/resources/org/teiid/jdbc/i18n.properties
===================================================================
--- trunk/client/src/main/resources/org/teiid/jdbc/i18n.properties 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/client/src/main/resources/org/teiid/jdbc/i18n.properties 2012-07-13 13:09:56 UTC (rev 4236)
@@ -107,7 +107,6 @@
MMStatement.Bad_timeout_value=Invalid timeout value supplied. Valid range is greater than or equal to zero.
WarningUtil.Failures_occurred=Partial results failures occurred
DataTypeTransformer.blob_too_big=The blob value is too large for the max supported length of 2147483647 bytes
-DataTypeTransformer.cannot_get_bytes=Cannot convert this value to a byte array.
WrapperImpl.wrong_class=Wrapped object is not an instance of {0}
MMXAConnection.rolling_back=rolling back transaction.
MMXAConnection.rolling_back_error=Error while rolling back transaction.
Modified: trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java
===================================================================
--- trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/common-core/src/main/java/org/teiid/core/types/ClobType.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -31,6 +31,7 @@
import java.io.StringWriter;
import java.io.Writer;
import java.sql.Clob;
+import java.sql.NClob;
import java.sql.SQLException;
import org.teiid.core.CorePlugin;
@@ -44,7 +45,7 @@
* This is wrapper on top of a "clob" object, which implements the "java.sql.Clob"
* interface. This class also implements the Streamable interface
*/
-public final class ClobType extends Streamable<Clob> implements Clob, Sequencable, Comparable<ClobType> {
+public final class ClobType extends Streamable<Clob> implements Clob, NClob, Sequencable, Comparable<ClobType> {
private static final long serialVersionUID = 2753412502127824104L;
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TempMetadataAdapter.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -289,8 +289,11 @@
public QueryNode getVirtualPlan(Object groupID)
throws TeiidComponentException, QueryMetadataException {
- if (this.queryNodes != null && this.queryNodes.containsKey(groupID)) {
- return this.queryNodes.get(groupID);
+ if (this.queryNodes != null) {
+ QueryNode node = this.queryNodes.get(groupID);
+ if (node != null) {
+ return node;
+ }
}
if(groupID instanceof TempMetadataID && !(actualMetadata instanceof TempMetadataAdapter)) {
Modified: trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/engine/src/main/java/org/teiid/query/metadata/TransformationMetadata.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -487,10 +487,10 @@
LiveTableQueryNode queryNode = new LiveTableQueryNode(tableRecord);
// get any bindings and add them onto the query node
- List bindings = tableRecord.getBindings();
+ List<String> bindings = tableRecord.getBindings();
if(bindings != null) {
- for(Iterator bindIter = bindings.iterator();bindIter.hasNext();) {
- queryNode.addBinding((String)bindIter.next());
+ for(Iterator<String> bindIter = bindings.iterator();bindIter.hasNext();) {
+ queryNode.addBinding(bindIter.next());
}
}
@@ -624,16 +624,16 @@
return 0;
}
- public Collection getIndexesInGroup(final Object groupID) throws TeiidComponentException, QueryMetadataException {
+ public Collection<KeyRecord> getIndexesInGroup(final Object groupID) throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(Table.class, groupID);
return ((Table)groupID).getIndexes();
}
- public Collection getUniqueKeysInGroup(final Object groupID)
+ public Collection<KeyRecord> getUniqueKeysInGroup(final Object groupID)
throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(Table.class, groupID);
Table tableRecordImpl = (Table)groupID;
- ArrayList<ColumnSet> result = new ArrayList<ColumnSet>(tableRecordImpl.getUniqueKeys());
+ ArrayList<KeyRecord> result = new ArrayList<KeyRecord>(tableRecordImpl.getUniqueKeys());
if (tableRecordImpl.getPrimaryKey() != null) {
result.add(tableRecordImpl.getPrimaryKey());
}
@@ -645,7 +645,7 @@
return result;
}
- public Collection getForeignKeysInGroup(final Object groupID)
+ public Collection<ForeignKey> getForeignKeysInGroup(final Object groupID)
throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(Table.class, groupID);
return ((Table)groupID).getForeignKeys();
@@ -658,26 +658,26 @@
return fkRecord.getPrimaryKey();
}
- public Collection getAccessPatternsInGroup(final Object groupID)
+ public Collection<KeyRecord> getAccessPatternsInGroup(final Object groupID)
throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(Table.class, groupID);
return ((Table)groupID).getAccessPatterns();
}
- public List getElementIDsInIndex(final Object index) throws TeiidComponentException, QueryMetadataException {
+ public List<Column> getElementIDsInIndex(final Object index) throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(ColumnSet.class, index);
- return ((ColumnSet)index).getColumns();
+ return ((ColumnSet<?>)index).getColumns();
}
- public List getElementIDsInKey(final Object key) throws TeiidComponentException, QueryMetadataException {
+ public List<Column> getElementIDsInKey(final Object key) throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(ColumnSet.class, key);
- return ((ColumnSet)key).getColumns();
+ return ((ColumnSet<?>)key).getColumns();
}
- public List getElementIDsInAccessPattern(final Object accessPattern)
+ public List<Column> getElementIDsInAccessPattern(final Object accessPattern)
throws TeiidComponentException, QueryMetadataException {
ArgCheck.isInstanceOf(ColumnSet.class, accessPattern);
- return ((ColumnSet)accessPattern).getColumns();
+ return ((ColumnSet<?>)accessPattern).getColumns();
}
public boolean isXMLGroup(final Object groupID) throws TeiidComponentException, QueryMetadataException {
Modified: trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2012-07-13 13:03:44 UTC (rev 4235)
+++ trunk/engine/src/main/java/org/teiid/query/resolver/QueryResolver.java 2012-07-13 13:09:56 UTC (rev 4236)
@@ -424,7 +424,7 @@
QueryNode cachedNode = (QueryNode)qmi.getFromMetadataCache(virtualGroup.getMetadataID(), cacheString);
if (cachedNode == null) {
Command result = qnode.getCommand();
- List bindings = null;
+ List<String> bindings = null;
if (result == null) {
try {
result = QueryParser.getQueryParser().parseCommand(qnode.getQuery());
12 years, 8 months
teiid SVN: r4235 - in trunk: test-integration/common/src/test/java/org/teiid/jdbc and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-13 09:03:44 -0400 (Fri, 13 Jul 2012)
New Revision: 4235
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java
trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestResultsCache.java
Log:
TEIID-2098 ensuring maxrows does not cause invalid results with cache entries
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 2012-07-12 18:24:56 UTC (rev 4234)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/CachedResults.java 2012-07-13 13:03:44 UTC (rev 4235)
@@ -53,6 +53,7 @@
private CacheHint hint;
private String uuid;
private boolean hasLobs;
+ private int rowLimit;
private AccessInfo accessInfo = new AccessInfo();
@@ -125,4 +126,12 @@
return accessInfo;
}
+ public int getRowLimit() {
+ return rowLimit;
+ }
+
+ public void setRowLimit(int rowLimit) {
+ this.rowLimit = rowLimit;
+ }
+
}
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 2012-07-12 18:24:56 UTC (rev 4234)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-13 13:03:44 UTC (rev 4235)
@@ -379,14 +379,7 @@
sendResultsIfNeeded(null);
this.resultsBuffer = collector.collectTuples();
if (!doneProducingBatches) {
- doneProducingBatches();
- //TODO: we could perform more tracking to know what source lobs are in use
- if (this.resultsBuffer.getLobCount() == 0) {
- for (DataTierTupleSource connectorRequest : getConnectorRequests()) {
- connectorRequest.fullyCloseSource();
- }
- }
- addToCache();
+ done();
}
}
if (this.transactionState == TransactionState.ACTIVE) {
@@ -516,12 +509,14 @@
cachable = cacheId.setParameters(requestMsg.getParameterValues());
if (cachable) {
CachedResults cr = rsCache.get(cacheId);
- if (cr != null) {
+ //check that there are enough cached results
+ //TODO: possibly ignore max rows for caching
+ if (cr != null && (cr.getRowLimit() == 0 || (requestMsg.getRowLimit() != 0 && requestMsg.getRowLimit() <= cr.getRowLimit()))) {
this.resultsBuffer = cr.getResults();
request.initMetadata();
this.originalCommand = cr.getCommand(requestMsg.getCommandString(), request.metadata, pi);
if (!request.validateAccess(requestMsg.getCommands(), this.originalCommand, CommandType.CACHED)) {
- this.doneProducingBatches();
+ doneProducingBatches();
return;
}
LogManager.logDetail(LogConstants.CTX_DQP, requestID, "Cached result command to be modified, will not use the cached results", cacheId); //$NON-NLS-1$
@@ -551,8 +546,7 @@
super.flushBatchDirect(batch, add);
}
if (batch.getTerminationFlag()) {
- doneProducingBatches();
- addToCache();
+ done();
}
synchronized (lobStreams) {
if (resultsBuffer.isLobs()) {
@@ -618,6 +612,9 @@
CachedResults cr = new CachedResults();
cr.setCommand(originalCommand);
cr.setResults(resultsBuffer, processor.getProcessorPlan());
+ if (requestMsg.getRowLimit() > 0 && resultsBuffer.getRowCount() == requestMsg.getRowLimit()) {
+ cr.setRowLimit(resultsBuffer.getRowCount());
+ }
if (originalCommand.getCacheHint() != null) {
LogManager.logDetail(LogConstants.CTX_DQP, requestID, "Using cache hint", originalCommand.getCacheHint()); //$NON-NLS-1$
resultsBuffer.setPrefersMemory(originalCommand.getCacheHint().isPrefersMemory());
@@ -973,6 +970,17 @@
}
}
+ private void done() {
+ doneProducingBatches();
+ //TODO: we could perform more tracking to know what source lobs are in use
+ if (this.resultsBuffer.getLobCount() == 0) {
+ for (DataTierTupleSource connectorRequest : getConnectorRequests()) {
+ connectorRequest.fullyCloseSource();
+ }
+ }
+ addToCache();
+ }
+
private void doneProducingBatches() {
this.doneProducingBatches = true;
dqpCore.finishProcessing(this);
Modified: trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestResultsCache.java
===================================================================
--- trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestResultsCache.java 2012-07-12 18:24:56 UTC (rev 4234)
+++ trunk/test-integration/common/src/test/java/org/teiid/jdbc/TestResultsCache.java 2012-07-13 13:03:44 UTC (rev 4235)
@@ -26,9 +26,13 @@
import java.sql.Connection;
import java.sql.ResultSet;
+import java.sql.SQLException;
import java.sql.Statement;
+import org.junit.After;
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.teiid.core.util.UnitTestUtil;
@@ -37,13 +41,25 @@
public class TestResultsCache {
private Connection conn;
+ private static FakeServer server;
+
+ @BeforeClass public static void oneTimeSetup() throws Exception {
+ server = new FakeServer(true);
+ server.deployVDB("test", UnitTestUtil.getTestDataPath() + "/TestCase3473/test.vdb");
+ }
+ @AfterClass public static void oneTimeTeardown() {
+ server.stop();
+ }
+
@Before public void setUp() throws Exception {
- FakeServer server = new FakeServer(true);
- server.deployVDB("test", UnitTestUtil.getTestDataPath() + "/TestCase3473/test.vdb");
conn = server.createConnection("jdbc:teiid:test"); //$NON-NLS-1$ //$NON-NLS-2$
}
+ @After public void teardown() throws SQLException {
+ conn.close();
+ }
+
@Test public void testCacheHint() throws Exception {
Statement s = conn.createStatement();
s.execute("set showplan on");
@@ -56,6 +72,18 @@
assertFalse(rs.next());
}
+ @Test public void testCacheHintWithMaxRows() throws Exception {
+ Statement s = conn.createStatement();
+ s.setMaxRows(1);
+ ResultSet rs = s.executeQuery("/* cache */ select 1 union all select 2");
+ assertTrue(rs.next());
+ assertFalse(rs.next());
+ s.setMaxRows(2);
+ rs = s.executeQuery("/* cache */ select 1 union all select 2");
+ assertTrue(rs.next());
+ assertTrue(rs.next());
+ }
+
@Test public void testCacheHintTtl() throws Exception {
Statement s = conn.createStatement();
s.execute("set showplan on");
12 years, 8 months
teiid SVN: r4234 - in trunk/engine/src: test/java/org/teiid/dqp/internal/process and 1 other directory.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-12 14:24:56 -0400 (Thu, 12 Jul 2012)
New Revision: 4234
Modified:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.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/test/java/org/teiid/dqp/internal/process/TestDQPCore.java
Log:
TEIID-2098 ensuring maxrows is not misapplied to procedures
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 17:45:57 UTC (rev 4233)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 18:24:56 UTC (rev 4234)
@@ -300,4 +300,20 @@
context.setVariableContext(result);
}
+
+ @Override
+ public boolean isReturingParams() {
+ if (userCommand instanceof StoredProcedure) {
+ StoredProcedure sp = (StoredProcedure)userCommand;
+ if (sp.isCallableStatement() && sp.returnsResultSet()) {
+ for (SPParameter param : sp.getMapOfParameters().values()) {
+ int type = param.getParameterType();
+ if (type == SPParameter.INOUT || type == SPParameter.OUT || type == SPParameter.RETURN_VALUE) {
+ return true;
+ }
+ }
+ }
+ }
+ return false;
+ }
}
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 2012-07-12 17:45:57 UTC (rev 4233)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-07-12 18:24:56 UTC (rev 4234)
@@ -474,5 +474,9 @@
public void setExecutor(Executor executor) {
this.executor = executor;
}
+
+ public boolean isReturingParams() {
+ return false;
+ }
}
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 2012-07-12 17:45:57 UTC (rev 4233)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-12 18:24:56 UTC (rev 4234)
@@ -581,7 +581,9 @@
}
}
};
- if (!request.addedLimit && this.requestMsg.getRowLimit() > 0) {
+ if (!request.addedLimit && this.requestMsg.getRowLimit() > 0 && !request.isReturingParams()) {
+ //covers maxrows for commands that already have a limit, are prepared, or are a stored procedure
+ //TODO: allow max rows to have an effect for callablestatements with out params
this.collector.setRowLimit(this.requestMsg.getRowLimit());
}
this.resultsBuffer = collector.getTupleBuffer();
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 2012-07-12 17:45:57 UTC (rev 4233)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java 2012-07-12 18:24:56 UTC (rev 4234)
@@ -614,6 +614,22 @@
assertEquals(2, rm.getResultsList().size());
}
+ /**
+ * Ensure that the row limit is not misapplied.
+ * Note that it still could be applied in this example, but the
+ * resultset only returns a single row
+ */
+ @Test public void testProcedureMaxRows() throws Exception {
+ String sql = "{? = call TEIIDSP9(1, ?)}"; //$NON-NLS-1$
+ RequestMessage request = exampleRequestMessage(sql);
+ request.setRowLimit(1);
+ request.setStatementType(StatementType.CALLABLE);
+ ResultsMessage rm = execute("A", 1, request);
+
+ assertNull(rm.getException());
+ assertEquals(2, rm.getResultsList().size());
+ }
+
public void helpTestVisibilityFails(String sql) throws Exception {
RequestMessage reqMsg = exampleRequestMessage(sql);
reqMsg.setTxnAutoWrapMode(RequestMessage.TXN_WRAP_OFF);
12 years, 8 months
teiid SVN: r4233 - in trunk: api/src/main/java/org/teiid/translator and 16 other directories.
by teiid-commits@lists.jboss.org
Author: shawkins
Date: 2012-07-12 13:45:57 -0400 (Thu, 12 Jul 2012)
New Revision: 4233
Added:
trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
Modified:
trunk/api/src/main/java/org/teiid/CommandContext.java
trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java
trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java
trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.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/dqp/internal/process/SessionAwareCache.java
trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java
trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java
trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java
trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java
trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.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/test/java/org/teiid/common/buffer/TestTupleBuffer.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/service/AutoGenDataService.java
Log:
TEIID-2098 TEIID-1598 fixing several issues with maxRows and further refining connector caching logic
Modified: trunk/api/src/main/java/org/teiid/CommandContext.java
===================================================================
--- trunk/api/src/main/java/org/teiid/CommandContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/CommandContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -149,6 +149,7 @@
/**
* Get the number of times this command has been reused. Useful
* in continuous executions.
+ * @see #isContinuous()
* @return
*/
long getReuseCount();
@@ -166,4 +167,10 @@
*/
void addWarning(Exception ex);
+ /**
+ *
+ * @return true if this is a continuous query
+ */
+ boolean isContinuous();
+
}
Modified: trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/BaseDelegatingExecutionFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -433,4 +433,10 @@
public boolean supportsOnlyLiteralComparison() {
return delegate.supportsOnlyLiteralComparison();
}
+ @Override
+ public CacheDirective getCacheDirective(Command command,
+ ExecutionContext executionContext, RuntimeMetadata metadata)
+ throws TranslatorException {
+ return delegate.getCacheDirective(command, executionContext, metadata);
+ }
}
Modified: trunk/api/src/main/java/org/teiid/translator/CacheDirective.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/CacheDirective.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/CacheDirective.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -30,8 +30,9 @@
public class CacheDirective implements Serializable {
public enum Scope {
+ NONE,
+ SESSION,
USER,
- SESSION,
VDB
}
@@ -58,10 +59,18 @@
this.prefersMemory = prefersMemory;
}
+ /**
+ * Get the time to live in milliseconds
+ * @return
+ */
public Long getTtl() {
return ttl;
}
+ /**
+ * Set the time to live in milliseconds
+ * @param ttl
+ */
public void setTtl(Long ttl) {
this.ttl = ttl;
}
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -201,4 +201,10 @@
* @return
*/
CommandContext getCommandContext();
+
+ /**
+ * Get the {@link CacheDirective}
+ * @return
+ */
+ CacheDirective getCacheDirective();
}
Modified: trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java
===================================================================
--- trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/api/src/main/java/org/teiid/translator/ExecutionFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -46,6 +46,7 @@
import org.teiid.metadata.FunctionParameter;
import org.teiid.metadata.MetadataFactory;
import org.teiid.metadata.RuntimeMetadata;
+import org.teiid.translator.CacheDirective.Scope;
import org.teiid.translator.TypeFacility.RUNTIME_CODES;
import org.teiid.translator.TypeFacility.RUNTIME_NAMES;
@@ -986,4 +987,18 @@
return true;
}
+ /**
+ * Get the {@link CacheDirective} to control command caching.
+ * <p>Use {@link Scope#NONE} to indicate to the engine that no caching should be performed by the engine.</p>
+ * <p>If cache parameters on the {@link CacheDirective} will be changed by the {@link Execution}, then
+ * a new instance of a {@link CacheDirective} should be set each time.</p>
+ * @param command
+ * @param executionContext
+ * @param metadata
+ * @throws TranslatorException
+ */
+ public CacheDirective getCacheDirective(Command command, ExecutionContext executionContext, RuntimeMetadata metadata) throws TranslatorException {
+ return null;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/common/buffer/TupleBuffer.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -22,6 +22,7 @@
package org.teiid.common.buffer;
+import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
@@ -156,6 +157,9 @@
for (Long batch : this.batches.values()) {
this.manager.remove(batch);
}
+ if (this.lobManager != null) {
+ this.lobManager.remove();
+ }
this.batches.clear();
}
@@ -236,9 +240,6 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_BUFFER_MGR, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_BUFFER_MGR, "Removing TupleBuffer:", this.tupleSourceID); //$NON-NLS-1$
}
- if (this.lobManager != null) {
- this.lobManager.remove();
- }
this.batchBuffer = null;
purge();
this.manager.remove();
@@ -368,5 +369,40 @@
}
return this.lobManager.getLobCount();
}
+
+ public void truncateTo(int rowLimit) throws TeiidComponentException {
+ if (rowCount <= rowLimit) {
+ return;
+ }
+ //TODO this could be more efficient with handling the last batch
+ TupleBatch last = this.getBatch(rowLimit);
+ TupleBatch tb = last;
+ if (this.batchBuffer != null) {
+ this.batchBuffer.clear();
+ }
+ int begin = tb.getBeginRow();
+ do {
+ if (tb == null) {
+ tb = this.getBatch(begin);
+ }
+ Long id = this.batches.remove(begin);
+ if (id != null) {
+ this.manager.remove(id);
+ }
+ if (this.lobManager != null) {
+ for (List<?> tuple : tb.getTuples()) {
+ this.lobManager.updateReferences(tuple, ReferenceMode.REMOVE);
+ }
+ }
+ begin = tb.getEndRow() + 1;
+ tb = null;
+ } while (begin <= rowCount);
+ rowCount = last.getBeginRow() - 1;
+ Iterator<List<?>> iter = last.getTuples().iterator();
+ while (rowCount < rowLimit) {
+ addTuple(iter.next());
+ }
+ saveBatch(false);
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWork.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -25,6 +25,7 @@
import org.teiid.common.buffer.BlockedException;
import org.teiid.dqp.internal.process.RequestWorkItem;
import org.teiid.dqp.message.AtomicResultsMessage;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.TranslatorException;
@@ -46,5 +47,7 @@
boolean isDataAvailable();
boolean copyLobs();
+
+ CacheDirective getCacheDirective() throws TranslatorException;
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ConnectorWorkItem.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -40,7 +40,6 @@
import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.CommandLogMessage.Event;
-import org.teiid.metadata.RuntimeMetadata;
import org.teiid.query.QueryPlugin;
import org.teiid.query.metadata.QueryMetadataInterface;
import org.teiid.query.metadata.TempMetadataAdapter;
@@ -49,6 +48,7 @@
import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.resource.spi.WrappedConnection;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.DataNotAvailableException;
import org.teiid.translator.Execution;
import org.teiid.translator.ExecutionFactory;
@@ -65,7 +65,7 @@
private ConnectorManager manager;
private AtomicRequestMessage requestMsg;
private ExecutionFactory<Object, Object> connector;
- private QueryMetadataInterface queryMetadata;
+ private RuntimeMetadataImpl queryMetadata;
/* Created on new request */
private Object connection;
@@ -81,6 +81,7 @@
private boolean error;
private AtomicBoolean isCancelled = new AtomicBoolean();
+ private org.teiid.language.Command translatedCommand;
ConnectorWorkItem(AtomicRequestMessage message, ConnectorManager manager) {
this.id = message.getAtomicRequestID();
@@ -99,9 +100,13 @@
this.connector = manager.getExecutionFactory();
VDBMetaData vdb = requestMsg.getWorkContext().getVDB();
- this.queryMetadata = vdb.getAttachment(QueryMetadataInterface.class);
- this.queryMetadata = new TempMetadataAdapter(this.queryMetadata, new TempMetadataStore());
+ QueryMetadataInterface qmi = vdb.getAttachment(QueryMetadataInterface.class);
+ qmi = new TempMetadataAdapter(qmi, new TempMetadataStore());
+ this.queryMetadata = new RuntimeMetadataImpl(qmi);
this.securityContext.setTransactional(requestMsg.isTransactional());
+ LanguageBridgeFactory factory = new LanguageBridgeFactory(this.queryMetadata);
+ factory.setConvertIn(!this.connector.supportsInCriteria());
+ translatedCommand = factory.translate(message.getCommand());
}
@Override
@@ -154,12 +159,14 @@
} catch (Throwable e) {
LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
} finally {
- try {
- this.connector.closeConnection(connection, connectionFactory);
- } catch (Throwable e) {
- LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
+ if (this.connector.isSourceRequired() && this.connection != null) {
+ try {
+ this.connector.closeConnection(connection, connectionFactory);
+ } catch (Throwable e) {
+ LogManager.logError(LogConstants.CTX_CONNECTOR, e, e.getMessage());
+ }
+ LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
}
- LogManager.logDetail(LogConstants.CTX_CONNECTOR, new Object[] {this.id, "Closed connection"}); //$NON-NLS-1$
}
}
@@ -217,16 +224,12 @@
if (command instanceof StoredProcedure) {
this.expectedColumns = ((StoredProcedure)command).getResultSetColumns().size();
}
- LanguageBridgeFactory factory = new LanguageBridgeFactory(queryMetadata);
- factory.setConvertIn(!this.connector.supportsInCriteria());
- org.teiid.language.Command translatedCommand = factory.translate(command);
Execution exec = this.requestMsg.getCommandContext().getReusableExecution(this.securityContext.getPartIdentifier());
if (exec != null) {
((ReusableExecution)exec).reset(translatedCommand, this.securityContext, connection);
} else {
- RuntimeMetadata rmd = new RuntimeMetadataImpl(queryMetadata);
- exec = connector.createExecution(translatedCommand, this.securityContext, rmd, (unwrapped == null) ? this.connection:unwrapped);
+ exec = connector.createExecution(translatedCommand, this.securityContext, queryMetadata, (unwrapped == null) ? this.connection:unwrapped);
if (exec instanceof ReusableExecution<?>) {
this.requestMsg.getCommandContext().putReusableExecution(this.securityContext.getPartIdentifier(), (ReusableExecution<?>) exec);
}
@@ -388,5 +391,12 @@
public boolean copyLobs() {
return this.connector.isCopyLobs();
}
+
+ @Override
+ public CacheDirective getCacheDirective() throws TranslatorException {
+ CacheDirective cd = connector.getCacheDirective(this.translatedCommand, this.securityContext, this.queryMetadata);
+ this.securityContext.setCacheDirective(cd);
+ return cd;
+ }
}
\ No newline at end of file
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/ExecutionContextImpl.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -38,6 +38,7 @@
import org.teiid.dqp.internal.process.RequestWorkItem;
import org.teiid.dqp.message.RequestID;
import org.teiid.query.util.CommandContext;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.ExecutionContext;
@@ -63,6 +64,7 @@
private String generalHint;
private String hint;
private CommandContext commandContext;
+ private CacheDirective cacheDirective;
public ExecutionContextImpl(String vdbName, int vdbVersion, Serializable executionPayload,
String originalConnectionID, String connectorName, long requestId, String partId, String execCount) {
@@ -269,4 +271,13 @@
public int getVirtualDatabaseVersion() {
return getVdbVersion();
}
+
+ @Override
+ public CacheDirective getCacheDirective() {
+ return cacheDirective;
+ }
+
+ public void setCacheDirective(CacheDirective directive) {
+ this.cacheDirective = directive;
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/datamgr/LanguageBridgeFactory.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -139,6 +139,10 @@
}
}
+ public LanguageBridgeFactory(RuntimeMetadataImpl metadata) {
+ this.metadataFactory = metadata;
+ }
+
public void setConvertIn(boolean convertIn) {
this.convertIn = convertIn;
}
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/DataTierManagerImpl.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -56,9 +56,12 @@
import org.teiid.dqp.internal.datamgr.ConnectorManager;
import org.teiid.dqp.internal.datamgr.ConnectorManagerRepository;
import org.teiid.dqp.internal.datamgr.ConnectorWork;
+import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
+import org.teiid.dqp.internal.process.TupleSourceCache.CachableVisitor;
import org.teiid.dqp.message.AtomicRequestMessage;
import org.teiid.dqp.message.RequestID;
import org.teiid.events.EventDistributor;
+import org.teiid.logging.LogConstants;
import org.teiid.logging.LogManager;
import org.teiid.logging.MessageLevel;
import org.teiid.metadata.*;
@@ -67,6 +70,7 @@
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.metadata.TransformationMetadata;
import org.teiid.query.optimizer.relational.RelationalPlanner;
+import org.teiid.query.parser.ParseInfo;
import org.teiid.query.processor.CollectionTupleSource;
import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.processor.RegisterRequestParameter;
@@ -75,12 +79,16 @@
import org.teiid.query.sql.lang.SourceHint;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.UnaryFromClause;
+import org.teiid.query.sql.navigator.PreOrPostOrderNavigator;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.visitor.GroupCollectorVisitor;
import org.teiid.query.tempdata.GlobalTableStore;
import org.teiid.query.tempdata.GlobalTableStoreImpl.MatTableInfo;
import org.teiid.query.util.CommandContext;
+import org.teiid.translator.CacheDirective;
+import org.teiid.translator.TranslatorException;
+import org.teiid.translator.CacheDirective.Scope;
/**
* Full {@link ProcessorDataManager} implementation that
@@ -181,13 +189,51 @@
if (parameterObject.limit > 0) {
aqr.setFetchSize(Math.min(parameterObject.limit, aqr.getFetchSize()));
}
+ Collection<GroupSymbol> accessedGroups = null;
if (context.getDataObjects() != null) {
- for (GroupSymbol gs : GroupCollectorVisitor.getGroupsIgnoreInlineViews(command, false)) {
+ accessedGroups = GroupCollectorVisitor.getGroupsIgnoreInlineViews(command, false);
+ for (GroupSymbol gs : accessedGroups) {
context.accessedDataObject(gs.getMetadataID());
}
}
ConnectorManagerRepository cmr = workItem.getDqpWorkContext().getVDB().getAttachment(ConnectorManagerRepository.class);
- ConnectorWork work = cmr.getConnectorManager(aqr.getConnectorName()).registerRequest(aqr);
+ ConnectorManager connectorManager = cmr.getConnectorManager(aqr.getConnectorName());
+ ConnectorWork work = connectorManager.registerRequest(aqr);
+ CacheID cid = null;
+ CacheDirective cd = null;
+ if (workItem.getRsCache() != null && command.areResultsCachable()) {
+ CachableVisitor cv = new CachableVisitor();
+ PreOrPostOrderNavigator.doVisit(command, cv, PreOrPostOrderNavigator.PRE_ORDER, true);
+ if (cv.cacheable) {
+ try {
+ cd = work.getCacheDirective();
+ } catch (TranslatorException e) {
+ throw new TeiidProcessingException(QueryPlugin.Event.TEIID30504, e, aqr.getConnectorName() + ": " + e.getMessage()); //$NON-NLS-1$
+ }
+ if (cd != null) {
+ if (cd.getScope() == Scope.NONE) {
+ parameterObject.doNotCache = true;
+ } else {
+ String cmdString = command.toString();
+ if (cmdString.length() < 200000) { //TODO: this check won't be needed if keys aren't exclusively held in memory
+ cid = new CacheID(workItem.getDqpWorkContext(), ParseInfo.DEFAULT_INSTANCE, cmdString);
+ cid.setParameters(cv.parameters);
+ CachedResults cr = workItem.getRsCache().get(cid);
+ if (cr != null) {
+ parameterObject.doNotCache = true;
+ LogManager.logDetail(LogConstants.CTX_DQP, "Using cache entry for", cid); //$NON-NLS-1$
+ work.close();
+ return cr.getResults().createIndexedTupleSource();
+ }
+ }
+ }
+ } else {
+ LogManager.logTrace(LogConstants.CTX_DQP, aqr.getAtomicRequestID(), "no cache directive"); //$NON-NLS-1$
+ }
+ } else {
+ LogManager.logTrace(LogConstants.CTX_DQP, aqr.getAtomicRequestID(), "command not cachable"); //$NON-NLS-1$
+ }
+ }
work.setRequestWorkItem(workItem);
return new DataTierTupleSource(aqr, workItem, work, this, parameterObject.limit);
}
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/PreparedStatementRequest.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -128,7 +128,8 @@
* @throws TeiidProcessingException
* @see org.teiid.dqp.internal.process.Request#generatePlan()
*/
- protected void generatePlan() throws TeiidComponentException, TeiidProcessingException {
+ @Override
+ protected void generatePlan(boolean addLimit) throws TeiidComponentException, TeiidProcessingException {
String sqlQuery = requestMsg.getCommands()[0];
CacheID id = new CacheID(this.workContext, Request.createParseInfo(this.requestMsg), sqlQuery);
prepPlan = prepPlanCache.get(id);
@@ -151,21 +152,19 @@
//if prepared plan does not exist, create one
prepPlan = new PreparedPlan();
LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Query does not exist in cache: ", sqlQuery}); //$NON-NLS-1$
- super.generatePlan();
- if (!this.addedLimit) { //TODO: this is a little problematic
- prepPlan.setCommand(this.userCommand);
- // Defect 13751: Clone the plan in its current state (i.e. before processing) so that it can be used for later queries
- prepPlan.setPlan(processPlan.clone(), this.context);
- prepPlan.setAnalysisRecord(analysisRecord);
-
- Determinism determinismLevel = this.context.getDeterminismLevel();
- if (userCommand.getCacheHint() != null && userCommand.getCacheHint().getDeterminism() != null) {
- LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Cache hint modified the query determinism from ",this.context.getDeterminismLevel(), " to ", determinismLevel }); //$NON-NLS-1$ //$NON-NLS-2$
- determinismLevel = userCommand.getCacheHint().getDeterminism();
- }
-
- this.prepPlanCache.put(id, determinismLevel, prepPlan, userCommand.getCacheHint() != null?userCommand.getCacheHint().getTtl():null);
- }
+ super.generatePlan(false);
+ prepPlan.setCommand(this.userCommand);
+ // Defect 13751: Clone the plan in its current state (i.e. before processing) so that it can be used for later queries
+ prepPlan.setPlan(processPlan.clone(), this.context);
+ prepPlan.setAnalysisRecord(analysisRecord);
+
+ Determinism determinismLevel = this.context.getDeterminismLevel();
+ if (userCommand.getCacheHint() != null && userCommand.getCacheHint().getDeterminism() != null) {
+ LogManager.logTrace(LogConstants.CTX_DQP, new Object[] { "Cache hint modified the query determinism from ",this.context.getDeterminismLevel(), " to ", determinismLevel }); //$NON-NLS-1$ //$NON-NLS-2$
+ determinismLevel = userCommand.getCacheHint().getDeterminism();
+ }
+
+ this.prepPlanCache.put(id, determinismLevel, prepPlan, userCommand.getCacheHint() != null?userCommand.getCacheHint().getTtl():null);
}
if (requestMsg.isBatchedUpdate()) {
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/Request.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -373,7 +373,7 @@
* @throws TeiidComponentException
* @throws TeiidProcessingException
*/
- protected void generatePlan() throws TeiidComponentException, TeiidProcessingException {
+ protected void generatePlan(boolean addLimit) throws TeiidComponentException, TeiidProcessingException {
Command command = parseCommand();
List<Reference> references = ReferenceCollectorVisitor.getReferences(command);
@@ -404,7 +404,7 @@
* Adds a row limit to a query if Statement.setMaxRows has been called and the command
* doesn't already have a limit clause.
*/
- if (requestMsg.getRowLimit() > 0 && command instanceof QueryCommand) {
+ if (addLimit && requestMsg.getRowLimit() > 0 && command instanceof QueryCommand) {
QueryCommand query = (QueryCommand)command;
if (query.getLimit() == null) {
query.setLimit(new Limit(null, new Constant(new Integer(requestMsg.getRowLimit()), DataTypeManager.DefaultDataClasses.INTEGER)));
@@ -447,7 +447,7 @@
initMetadata();
- generatePlan();
+ generatePlan(true);
postProcessXML();
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/RequestWorkItem.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -581,6 +581,9 @@
}
}
};
+ if (!request.addedLimit && this.requestMsg.getRowLimit() > 0) {
+ this.collector.setRowLimit(this.requestMsg.getRowLimit());
+ }
this.resultsBuffer = collector.getTupleBuffer();
if (this.resultsBuffer == null) {
//This is just a dummy result it will get replaced by collector source
@@ -632,6 +635,10 @@
}
dqpCore.getRsCache().put(cid, determinismLevel, cr, originalCommand.getCacheHint() != null?originalCommand.getCacheHint().getTtl():null);
}
+
+ public SessionAwareCache<CachedResults> getRsCache() {
+ return dqpCore.getRsCache();
+ }
/**
* Send results if they have been requested. This should only be called from the processing thread.
Modified: trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/SessionAwareCache.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -38,7 +38,6 @@
import org.teiid.cache.DefaultCacheFactory;
import org.teiid.cache.CacheConfiguration.Policy;
import org.teiid.common.buffer.TupleBufferCache;
-import org.teiid.core.types.DataTypeManager;
import org.teiid.core.util.Assertion;
import org.teiid.core.util.EquivalenceUtil;
import org.teiid.core.util.HashCodeUtil;
@@ -261,7 +260,7 @@
*/
public boolean setParameters(List<?> parameters) {
if (parameters != null && !parameters.isEmpty()) {
- this.parameters = new ArrayList<Serializable>();
+ this.parameters = new ArrayList<Serializable>(parameters.size());
for (Object obj:parameters) {
if (obj == null) {
this.parameters.add(null);
@@ -270,11 +269,6 @@
if (!(obj instanceof Serializable)) {
return false;
}
-
- Class<?> type = DataTypeManager.determineDataTypeClass(obj);
- if (type == DataTypeManager.DefaultDataClasses.OBJECT) {
- return false;
- }
this.parameters.add((Serializable)obj);
}
}
Added: trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java (rev 0)
+++ trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -0,0 +1,167 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.teiid.common.buffer.BufferManager;
+import org.teiid.common.buffer.TupleBuffer;
+import org.teiid.common.buffer.TupleSource;
+import org.teiid.common.buffer.BufferManager.TupleSourceType;
+import org.teiid.core.TeiidComponentException;
+import org.teiid.core.TeiidProcessingException;
+import org.teiid.core.types.DataTypeManager;
+import org.teiid.query.processor.ProcessorDataManager;
+import org.teiid.query.processor.RegisterRequestParameter;
+import org.teiid.query.sql.LanguageVisitor;
+import org.teiid.query.sql.lang.Command;
+import org.teiid.query.sql.lang.DependentSetCriteria;
+import org.teiid.query.sql.symbol.Constant;
+import org.teiid.query.util.CommandContext;
+
+public class TupleSourceCache {
+
+ final static class CachableVisitor extends LanguageVisitor {
+ boolean cacheable = true;
+ List<Object> parameters;
+
+ @Override
+ public void visit(Constant c) {
+ if (c.isMultiValued()) {
+ notCachable();
+ } else if (DataTypeManager.isLOB(c.getType())) {
+ if (parameters == null) {
+ parameters = new ArrayList<Object>();
+ }
+ parameters.add(c.getValue());
+ }
+ }
+
+ private void notCachable() {
+ cacheable = false;
+ setAbort(true);
+ }
+
+ @Override
+ public void visit(DependentSetCriteria obj) {
+ notCachable();
+ }
+ }
+
+ private static class SharedState {
+ TupleBuffer tb;
+ TupleSource ts;
+ int id;
+ int expectedReaders;
+
+ private void remove() {
+ ts.closeSource();
+ tb.remove();
+ tb = null;
+ ts = null;
+ }
+ }
+
+ public abstract static class BufferedTupleSource implements TupleSource {
+ private int rowNumber = 1;
+ private TupleBuffer tb;
+ private TupleSource ts;
+
+ protected BufferedTupleSource(TupleBuffer tb, TupleSource ts) {
+ this.tb = tb;
+ this.ts = ts;
+ }
+
+ @Override
+ public List<?> nextTuple() throws TeiidComponentException,
+ TeiidProcessingException {
+ if (rowNumber <= tb.getRowCount()) {
+ return tb.getBatch(rowNumber).getTuple(rowNumber++);
+ }
+ if (tb.isFinal()) {
+ return null;
+ }
+ List<?> row = ts.nextTuple();
+ if (row == null) {
+ tb.setFinal(true);
+ } else {
+ tb.addTuple(row);
+ rowNumber++;
+ }
+ return row;
+ }
+
+ }
+
+ private class SharedTupleSource extends BufferedTupleSource {
+ private SharedState state;
+
+ public SharedTupleSource(SharedState state) {
+ super(state.tb, state.ts);
+ this.state = state;
+ }
+
+ @Override
+ public void closeSource() {
+ if (--state.expectedReaders == 0 && sharedStates != null && sharedStates.containsKey(state.id)) {
+ state.remove();
+ sharedStates.remove(state.id);
+ }
+ }
+ }
+
+ private Map<Integer, SharedState> sharedStates;
+
+ public void close() {
+ if (sharedStates != null) {
+ for (SharedState ss : sharedStates.values()) {
+ ss.remove();
+ }
+ sharedStates = null;
+ }
+ }
+
+ public TupleSource getSharedTupleSource(CommandContext context, Command command, String modelName, RegisterRequestParameter parameterObject, BufferManager bufferMgr, ProcessorDataManager pdm) throws TeiidComponentException, TeiidProcessingException {
+ if (sharedStates == null) {
+ sharedStates = new HashMap<Integer, SharedState>();
+ }
+ SharedState state = sharedStates.get(parameterObject.info.id);
+ if (state == null) {
+ state = new SharedState();
+ state.expectedReaders = parameterObject.info.sharingCount;
+ RegisterRequestParameter param = new RegisterRequestParameter(parameterObject.connectorBindingId, 0, -1);
+ state.ts = pdm.registerRequest(context, command, modelName, param);
+ if (param.doNotCache) {
+ return state.ts;
+ }
+ state.tb = bufferMgr.createTupleBuffer(command.getProjectedSymbols(), context.getConnectionId(), TupleSourceType.PROCESSOR);
+ state.id = parameterObject.info.id;
+ sharedStates.put(parameterObject.info.id, state);
+ }
+ return new SharedTupleSource(state);
+ }
+
+}
Property changes on: trunk/engine/src/main/java/org/teiid/dqp/internal/process/TupleSourceCache.java
___________________________________________________________________
Added: svn:mime-type
+ text/plain
Modified: trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/eval/Evaluator.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -229,13 +229,13 @@
public Boolean evaluate(CompoundCriteria criteria, List<?> tuple)
throws ExpressionEvaluationException, BlockedException, TeiidComponentException {
- List subCrits = criteria.getCriteria();
- Iterator subCritIter = subCrits.iterator();
+ List<Criteria> subCrits = criteria.getCriteria();
+ Iterator<Criteria> subCritIter = subCrits.iterator();
boolean and = criteria.getOperator() == CompoundCriteria.AND;
Boolean result = and?Boolean.TRUE:Boolean.FALSE;
while(subCritIter.hasNext()) {
- Criteria subCrit = (Criteria) subCritIter.next();
+ Criteria subCrit = subCritIter.next();
Boolean value = evaluateTVL(subCrit, tuple);
if (value == null) {
result = null;
Modified: trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/optimizer/relational/PlanToProcessConverter.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -28,6 +28,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
import org.teiid.api.exception.query.QueryMetadataException;
import org.teiid.api.exception.query.QueryPlannerException;
@@ -80,7 +81,7 @@
//state for detecting and reusing source queries
private Map<Command, AccessNode> sharedCommands = new HashMap<Command, AccessNode>();
- private int sharedId;
+ private static AtomicInteger sharedId = new AtomicInteger();
public static class SharedStateKey {
int id;
@@ -114,7 +115,6 @@
return processPlan;
} finally {
sharedCommands.clear();
- sharedId = 0;
}
}
@@ -538,7 +538,7 @@
} else {
if (other.info == null) {
other.info = new RegisterRequestParameter.SharedAccessInfo();
- other.info.id = sharedId++;
+ other.info.id = sharedId.getAndIncrement();
}
other.info.sharingCount++;
aNode.info = other.info;
Modified: trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/parser/ParseInfo.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -33,6 +33,11 @@
private static final boolean ANSI_QUOTED_DEFAULT = PropertiesUtils.getBooleanProperty(System.getProperties(), "org.teiid.ansiQuotedIdentifiers", true); //$NON-NLS-1$
public int referenceCount = 0;
+
+ public static final ParseInfo DEFAULT_INSTANCE = new ParseInfo();
+ static {
+ DEFAULT_INSTANCE.ansiQuotedIdentifiers = true;
+ }
// treat a double quoted variable as variable instead of string
public boolean ansiQuotedIdentifiers=ANSI_QUOTED_DEFAULT;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/BatchCollector.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -58,14 +58,17 @@
/**
* return the final tuple buffer or null if not available
+ * @param maxRows
* @return
* @throws TeiidProcessingException
* @throws TeiidComponentException
* @throws BlockedException
*/
- TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException;
+ TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException;
boolean hasFinalBuffer();
+
+ void close() throws TeiidComponentException;
}
public static class BatchProducerTupleSource implements TupleSource {
@@ -119,11 +122,14 @@
private boolean done = false;
private TupleBuffer buffer;
private boolean forwardOnly;
+ private int rowLimit = -1; //-1 means no_limit
+ private boolean hasFinalBuffer;
public BatchCollector(BatchProducer sourceNode, BufferManager bm, CommandContext context, boolean forwardOnly) throws TeiidComponentException {
this.sourceNode = sourceNode;
this.forwardOnly = forwardOnly;
- if (!this.sourceNode.hasFinalBuffer()) {
+ this.hasFinalBuffer = this.sourceNode.hasFinalBuffer();
+ if (!this.hasFinalBuffer) {
this.buffer = bm.createTupleBuffer(sourceNode.getOutputElements(), context.getConnectionId(), TupleSourceType.PROCESSOR);
this.buffer.setForwardOnly(forwardOnly);
}
@@ -132,9 +138,9 @@
public TupleBuffer collectTuples() throws TeiidComponentException, TeiidProcessingException {
TupleBatch batch = null;
while(!done) {
- if (this.sourceNode.hasFinalBuffer()) {
+ if (this.hasFinalBuffer) {
if (this.buffer == null) {
- TupleBuffer finalBuffer = this.sourceNode.getFinalBuffer();
+ TupleBuffer finalBuffer = this.sourceNode.getFinalBuffer(rowLimit);
Assertion.isNotNull(finalBuffer);
this.buffer = finalBuffer;
}
@@ -145,6 +151,17 @@
}
}
batch = sourceNode.nextBatch();
+
+ if (rowLimit > 0 && rowLimit <= batch.getEndRow()) {
+ if (!done) {
+ this.sourceNode.close();
+ }
+ if (rowLimit < batch.getEndRow()) {
+ List<List<?>> tuples = batch.getTuples().subList(0, rowLimit - batch.getBeginRow() + 1);
+ batch = new TupleBatch(batch.getBeginRow(), tuples);
+ }
+ batch.setTerminationFlag(true);
+ }
flushBatch(batch);
@@ -176,7 +193,7 @@
@SuppressWarnings("unused")
protected void flushBatchDirect(TupleBatch batch, boolean add) throws TeiidComponentException, TeiidProcessingException {
- if (!this.sourceNode.hasFinalBuffer()) {
+ if (!this.hasFinalBuffer) {
buffer.addTupleBatch(batch, add);
}
}
@@ -188,4 +205,8 @@
return buffer.getRowCount();
}
+ public void setRowLimit(int rowLimit) {
+ this.rowLimit = rowLimit;
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/ProcessorPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -149,7 +149,7 @@
* @throws TeiidComponentException
* @throws BlockedException
*/
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
return null;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/QueryProcessor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -22,35 +22,30 @@
package org.teiid.query.processor;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.TupleBatch;
import org.teiid.common.buffer.TupleBuffer;
-import org.teiid.common.buffer.TupleSource;
import org.teiid.common.buffer.BufferManager.BufferReserveMode;
-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.util.Assertion;
-import org.teiid.events.EventDistributor;
+import org.teiid.dqp.internal.process.TupleSourceCache;
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.BatchCollector.BatchProducer;
-import org.teiid.query.sql.lang.Command;
import org.teiid.query.util.CommandContext;
/**
* Driver for plan processing.
*/
-public class QueryProcessor implements BatchProducer, ProcessorDataManager {
+public class QueryProcessor implements BatchProducer {
public static class ExpiredTimeSliceException extends TeiidRuntimeException {
private static final long serialVersionUID = 4585044674826578060L;
@@ -62,56 +57,6 @@
QueryProcessor createQueryProcessor(String query, String recursionGroup, CommandContext commandContext, Object... params) throws TeiidProcessingException, TeiidComponentException;
}
- private class SharedState {
- TupleBuffer tb;
- TupleSource ts;
- int id;
- int expectedReaders;
-
- private void remove() {
- ts.closeSource();
- tb.remove();
- tb = null;
- ts = null;
- }
- }
-
- private final class BufferedTupleSource implements TupleSource {
- private int rowNumber = 1;
- private SharedState state;
-
- private BufferedTupleSource(SharedState state) {
- this.state = state;
- }
-
- @Override
- public List<?> nextTuple() throws TeiidComponentException,
- TeiidProcessingException {
- if (rowNumber <= state.tb.getRowCount()) {
- return state.tb.getBatch(rowNumber).getTuple(rowNumber++);
- }
- if (state.tb.isFinal()) {
- return null;
- }
- List<?> row = state.ts.nextTuple();
- if (row == null) {
- state.tb.setFinal(true);
- } else {
- this.state.tb.addTuple(row);
- rowNumber++;
- }
- return row;
- }
-
- @Override
- public void closeSource() {
- if (--state.expectedReaders == 0 && sharedStates != null && sharedStates.containsKey(state.id)) {
- state.remove();
- sharedStates.remove(state.id);
- }
- }
- }
-
private CommandContext context;
private ProcessorDataManager dataMgr;
private BufferManager bufferMgr;
@@ -123,11 +68,10 @@
private volatile boolean requestCanceled;
private static final int DEFAULT_WAIT = 50;
private boolean processorClosed;
+
private boolean continuous;
private int rowOffset = 1;
- Map<Integer, SharedState> sharedStates;
-
/**
* Construct a processor with all necessary information to process.
* @param plan The plan to process
@@ -138,6 +82,7 @@
*/
public QueryProcessor(ProcessorPlan plan, CommandContext context, BufferManager bufferMgr, final ProcessorDataManager dataMgr) {
this.context = context;
+ this.context.setTupleSourceCache(new TupleSourceCache());
this.dataMgr = dataMgr;
this.processPlan = plan;
this.bufferMgr = bufferMgr;
@@ -203,6 +148,7 @@
if (result.getTerminationFlag()) {
result.setTerminationFlag(false);
+ this.context.getTupleSourceCache().close();
this.processPlan.close();
this.processPlan.reset();
this.context.incrementReuseCount();
@@ -245,7 +191,7 @@
// initialize if necessary
if(!initialized) {
reserved = this.bufferMgr.reserveBuffers(this.bufferMgr.getSchemaSize(this.getOutputElements()), BufferReserveMode.FORCE);
- this.processPlan.initialize(context, this, bufferMgr);
+ this.processPlan.initialize(context, dataMgr, bufferMgr);
initialized = true;
}
@@ -266,12 +212,7 @@
if (LogManager.isMessageToBeRecorded(LogConstants.CTX_DQP, MessageLevel.DETAIL)) {
LogManager.logDetail(LogConstants.CTX_DQP, "QueryProcessor: closing processor"); //$NON-NLS-1$
}
- if (sharedStates != null) {
- for (SharedState ss : sharedStates.values()) {
- ss.remove();
- }
- sharedStates = null;
- }
+ this.context.getTupleSourceCache().close();
this.bufferMgr.releaseBuffers(reserved);
reserved = 0;
processorClosed = true;
@@ -309,12 +250,12 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
while (true) {
long wait = DEFAULT_WAIT;
try {
init();
- return this.processPlan.getFinalBuffer();
+ return this.processPlan.getFinalBuffer(maxRows);
} catch (BlockedException e) {
if (!this.context.isNonBlocking()) {
throw e;
@@ -345,41 +286,14 @@
public void setContinuous(boolean continuous) {
this.continuous = continuous;
+ if (this.continuous) {
+ this.context.setContinuous();
+ }
}
-
- @Override
- public Object lookupCodeValue(CommandContext ctx, String codeTableName,
- String returnElementName, String keyElementName, Object keyValue)
- throws BlockedException, TeiidComponentException,
- TeiidProcessingException {
- return dataMgr.lookupCodeValue(ctx, codeTableName, returnElementName, keyElementName, keyValue);
- }
@Override
- public EventDistributor getEventDistributor() {
- return dataMgr.getEventDistributor();
+ public void close() throws TeiidComponentException {
+ closeProcessing();
}
- @Override
- public TupleSource registerRequest(CommandContext ctx, Command command,
- String modelName, RegisterRequestParameter parameterObject)
- throws TeiidComponentException, TeiidProcessingException {
- if (parameterObject.info == null) {
- return dataMgr.registerRequest(ctx, command, modelName, parameterObject);
- }
- //begin handling of shared commands
- if (sharedStates == null) {
- sharedStates = new HashMap<Integer, SharedState>();
- }
- SharedState state = sharedStates.get(parameterObject.info.id);
- if (state == null) {
- state = new SharedState();
- state.expectedReaders = parameterObject.info.sharingCount;
- state.tb = QueryProcessor.this.bufferMgr.createTupleBuffer(command.getProjectedSymbols(), ctx.getConnectionId(), TupleSourceType.PROCESSOR);
- state.ts = dataMgr.registerRequest(ctx, command, modelName, new RegisterRequestParameter(parameterObject.connectorBindingId, 0, -1));
- state.id = parameterObject.info.id;
- sharedStates.put(parameterObject.info.id, state);
- }
- return new BufferedTupleSource(state);
- }
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/RegisterRequestParameter.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -33,6 +33,7 @@
public int nodeID = 0;
public int limit = -1;
public SharedAccessInfo info;
+ public boolean doNotCache;
public RegisterRequestParameter(String connectorBindingId, int nodeID,
int limit) {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/proc/ForEachRowPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -104,7 +104,8 @@
}
if (this.rowProcessor == null) {
rowProcedure.reset();
- this.rowProcessor = new QueryProcessor(rowProcedure, getContext(), this.bufferMgr, this.dataMgr);
+ CommandContext context = getContext().clone();
+ this.rowProcessor = new QueryProcessor(rowProcedure, context, this.bufferMgr, this.dataMgr);
for (Map.Entry<ElementSymbol, Expression> entry : this.params.entrySet()) {
Integer index = (Integer)this.lookupMap.get(entry.getValue());
if (index != null) {
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/AccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -411,22 +411,22 @@
public Object clone(){
AccessNode clonedNode = new AccessNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(AccessNode source, AccessNode target){
- super.copy(source, target);
- target.modelName = source.modelName;
- target.modelId = source.modelId;
- target.connectorBindingId = source.connectorBindingId;
- target.shouldEvaluate = source.shouldEvaluate;
- if (!source.shouldEvaluate) {
- target.projection = source.projection;
- target.originalSelect = source.originalSelect;
+ protected void copyTo(AccessNode target){
+ super.copyTo(target);
+ target.modelName = modelName;
+ target.modelId = modelId;
+ target.connectorBindingId = connectorBindingId;
+ target.shouldEvaluate = shouldEvaluate;
+ if (!shouldEvaluate) {
+ target.projection = projection;
+ target.originalSelect = originalSelect;
}
- target.command = source.command;
- target.info = source.info;
+ target.command = command;
+ target.info = info;
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ArrayTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -82,7 +82,7 @@
@Override
public ArrayTableNode clone() {
ArrayTableNode clone = new ArrayTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
return clone;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/BatchedUpdateNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -176,7 +176,7 @@
*/
public Object clone() {
BatchedUpdateNode clonedNode = new BatchedUpdateNode(getID(), updateCommands, contexts, shouldEvaluate, modelName);
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentAccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -105,7 +105,7 @@
clonedNode.maxSetSize = this.maxSetSize;
clonedNode.maxPredicates = this.maxPredicates;
clonedNode.pushdown = this.pushdown;
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureAccessNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -59,7 +59,7 @@
DependentProcedureAccessNode copy = new DependentProcedureAccessNode(getID(), inputCriteria,
inputReferences,
inputDefaults);
- copy(this, copy);
+ copyTo(copy);
return copy;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentProcedureExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -58,7 +58,7 @@
DependentProcedureExecutionNode copy = new DependentProcedureExecutionNode(getID(), (Criteria)inputCriteria.clone(),
inputReferences,
inputDefaults);
- copy(this, copy);
+ copyTo(copy);
return copy;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/DependentValueSource.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -24,6 +24,7 @@
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
@@ -47,12 +48,18 @@
ValueIteratorSource {
private TupleBuffer buffer;
+ private List<? extends Expression> schema;
private Map<Expression, Set<Object>> cachedSets;
private boolean unused; //TODO: use this value instead of the context
private boolean distinct;
+
+ public DependentValueSource(TupleBuffer tb) {
+ this(tb, tb.getSchema());
+ }
- public DependentValueSource(TupleBuffer tupleSourceID) {
- this.buffer = tupleSourceID;
+ public DependentValueSource(TupleBuffer tb, List<? extends Expression> schema) {
+ this.buffer = tb;
+ this.schema = schema;
}
public TupleBuffer getTupleBuffer() {
@@ -67,7 +74,7 @@
IndexedTupleSource its = buffer.createIndexedTupleSource();
int index = 0;
if (valueExpression != null) {
- index = buffer.getSchema().indexOf(valueExpression);
+ index = schema.indexOf(valueExpression);
Assertion.assertTrue(index != -1);
}
return new TupleSourceValueIterator(its, index);
@@ -85,10 +92,10 @@
IndexedTupleSource its = buffer.createIndexedTupleSource();
int index = 0;
if (valueExpression != null) {
- index = buffer.getSchema().indexOf(valueExpression);
+ index = schema.indexOf(valueExpression);
}
Assertion.assertTrue(index != -1);
- Class<?> type = ((Expression)buffer.getSchema().get(index)).getType();
+ Class<?> type = ((Expression)schema.get(index)).getType();
if (!DataTypeManager.isHashable(type)) {
result = new TreeSet<Object>(Constant.COMPARATOR);
} else {
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/GroupingNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -449,7 +449,7 @@
public Object clone(){
GroupingNode clonedNode = new GroupingNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.removeDuplicates = removeDuplicates;
clonedNode.outputMapping = outputMapping;
clonedNode.orderBy = orderBy;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/InsertPlanExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -92,13 +92,13 @@
public Object clone(){
InsertPlanExecutionNode clonedNode = new InsertPlanExecutionNode(super.getID(), this.metadata);
- copy(this, clonedNode);
+ copyTo(clonedNode);
return clonedNode;
}
- protected void copy(InsertPlanExecutionNode source, InsertPlanExecutionNode target) {
- target.references = source.references;
- super.copy(source, target);
+ protected void copyTo(InsertPlanExecutionNode target) {
+ target.references = references;
+ super.copyTo(target);
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/JoinNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -154,7 +154,7 @@
*/
public Object clone() {
JoinNode clonedNode = new JoinNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.joinType = this.joinType;
clonedNode.joinStrategy = this.joinStrategy.clone();
@@ -186,7 +186,8 @@
this.joinStrategy.loadLeft();
if (isDependent()) {
TupleBuffer buffer = this.joinStrategy.leftSource.getTupleBuffer();
- dvs = new DependentValueSource(buffer);
+ //the tuplebuffer may be from a lower node, so pass in the schema
+ dvs = new DependentValueSource(buffer, this.joinStrategy.leftSource.getSource().getElements());
dvs.setDistinct(this.joinStrategy.leftSource.isDistinct());
this.getContext().getVariableContext().setGlobalValue(this.dependentValueSource, dvs);
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/LimitNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -30,6 +30,7 @@
import org.teiid.client.plan.PlanNode;
import org.teiid.common.buffer.BlockedException;
import org.teiid.common.buffer.TupleBatch;
+import org.teiid.common.buffer.TupleBuffer;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.eval.Evaluator;
@@ -168,7 +169,7 @@
public Object clone() {
LimitNode node = new LimitNode(getID(), limitExpr, offsetExpr);
node.implicit = this.implicit;
- copy(this, node);
+ copyTo(node);
node.rowCounter = this.rowCounter;
return node;
}
@@ -188,5 +189,24 @@
public int getOffset() {
return offset;
}
+
+ @Override
+ public boolean hasFinalBuffer() {
+ //TODO: support offset
+ return offsetExpr == null && this.getChildren()[0].hasFinalBuffer();
+ }
+
+ @Override
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ if (maxRows >= 0) {
+ if (limit >= 0) {
+ maxRows = Math.min(maxRows, limit);
+ }
+ } else {
+ maxRows = limit;
+ }
+ return this.getChildren()[0].getFinalBuffer(maxRows);
+ }
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/NullNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,7 +49,7 @@
public Object clone(){
NullNode clonedNode = new NullNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/PlanExecutionNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -164,14 +164,13 @@
public Object clone(){
PlanExecutionNode clonedNode = new PlanExecutionNode();
- copy(this, clonedNode);
+ copyTo(clonedNode);
return clonedNode;
}
- protected void copy(PlanExecutionNode source,
- PlanExecutionNode target) {
- target.setProcessorPlan(source.plan.clone());
- super.copy(source, target);
+ protected void copyTo(PlanExecutionNode target) {
+ target.setProcessorPlan(plan.clone());
+ super.copyTo(target);
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectIntoNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -231,7 +231,7 @@
public Object clone(){
ProjectIntoNode clonedNode = new ProjectIntoNode();
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
clonedNode.intoGroup = intoGroup;
clonedNode.intoElements = intoElements;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/ProjectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -27,24 +27,22 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.teiid.api.exception.query.ExpressionEvaluationException;
import org.teiid.client.plan.PlanNode;
import org.teiid.common.buffer.BlockedException;
-import org.teiid.common.buffer.BufferManager;
import org.teiid.common.buffer.TupleBatch;
+import org.teiid.common.buffer.TupleBuffer;
import org.teiid.core.TeiidComponentException;
import org.teiid.core.TeiidProcessingException;
import org.teiid.query.analysis.AnalysisRecord;
-import org.teiid.query.processor.ProcessorDataManager;
import org.teiid.query.sql.LanguageObject;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.util.SymbolMap;
-import org.teiid.query.util.CommandContext;
public class ProjectNode extends SubqueryAwareRelationalNode {
@@ -52,7 +50,7 @@
private List<? extends Expression> selectSymbols;
// Derived element lookup map
- private Map elementMap;
+ private Map<Expression, Integer> elementMap;
private boolean needsProject = true;
private List<Expression> expressions;
private int[] projectionIndexes;
@@ -86,45 +84,37 @@
public void setSelectSymbols(List<? extends Expression> symbols) {
this.selectSymbols = symbols;
- }
-
- @Override
- public void initialize(CommandContext context, BufferManager bufferManager,
- ProcessorDataManager dataMgr) {
- super.initialize(context, bufferManager, dataMgr);
-
- // Do this lazily as the node may be reset and re-used and this info doesn't change
- if(elementMap != null) {
- return;
- }
- this.projectionIndexes = new int[this.selectSymbols.size()];
+ elementMap = Collections.emptyMap();
+ this.projectionIndexes = new int[this.selectSymbols.size()];
Arrays.fill(this.projectionIndexes, -1);
this.expressions = new ArrayList<Expression>(this.selectSymbols.size());
for (Expression ses : this.selectSymbols) {
this.expressions.add(SymbolMap.getExpression(ses));
}
- //in the case of select with no from, there is no child node
- //simply return at this point
- if(this.getChildren()[0] == null){
- elementMap = new HashMap();
- return;
- }
-
+ }
+
+ @Override
+ public void addChild(RelationalNode child) {
+ super.addChild(child);
+ init();
+ }
+
+ void init() {
+ List<? extends Expression> childElements = getChildren()[0].getElements();
// Create element lookup map for evaluating project expressions
- List childElements = this.getChildren()[0].getElements();
this.elementMap = createLookupMap(childElements);
// Check whether project needed at all - this occurs if:
// 1. outputMap == null (see previous block)
// 2. project elements are either elements or aggregate symbols (no processing required)
// 3. order of input values == order of output values
- needsProject = childElements.size() != getElements().size();
+ needsProject = childElements.size() != selectSymbols.size();
for(int i=0; i<selectSymbols.size(); i++) {
Expression symbol = selectSymbols.get(i);
if(symbol instanceof AliasSymbol) {
- Integer index = (Integer) elementMap.get(symbol);
+ Integer index = elementMap.get(symbol);
if(index != null && index.intValue() == i) {
projectionIndexes[i] = index;
continue;
@@ -132,7 +122,7 @@
symbol = ((AliasSymbol)symbol).getSymbol();
}
- Integer index = (Integer) elementMap.get(symbol);
+ Integer index = elementMap.get(symbol);
if(index == null || index.intValue() != i) {
// input / output element order is not the same
needsProject = true;
@@ -140,7 +130,7 @@
projectionIndexes[i] = index;
}
}
- }
+ }
public TupleBatch nextBatchDirect()
throws BlockedException, TeiidComponentException, TeiidProcessingException {
@@ -208,13 +198,17 @@
public Object clone(){
ProjectNode clonedNode = new ProjectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(ProjectNode source, ProjectNode target){
- super.copy(source, target);
+ protected void copyTo(ProjectNode target){
+ super.copyTo(target);
target.selectSymbols = this.selectSymbols;
+ target.needsProject = needsProject;
+ target.elementMap = elementMap;
+ target.expressions = expressions;
+ target.projectionIndexes = projectionIndexes;
}
public PlanNode getDescriptionProperties() {
@@ -228,4 +222,15 @@
return this.selectSymbols;
}
+ @Override
+ public boolean hasFinalBuffer() {
+ return !needsProject && this.getChildren()[0].hasFinalBuffer();
+ }
+
+ @Override
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
+ TeiidComponentException, TeiidProcessingException {
+ return this.getChildren()[0].getFinalBuffer(maxRows);
+ }
+
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -509,13 +509,13 @@
*/
public abstract Object clone();
- protected void copy(RelationalNode source, RelationalNode target){
- target.data = source.data;
+ protected void copyTo(RelationalNode target){
+ target.data = this.data;
- target.children = new RelationalNode[source.children.length];
- for(int i=0; i<source.children.length; i++) {
- if(source.children[i] != null) {
- target.children[i] = (RelationalNode)source.children[i].clone();
+ target.children = new RelationalNode[this.children.length];
+ for(int i=0; i<this.children.length; i++) {
+ if(this.children[i] != null) {
+ target.children[i] = (RelationalNode)this.children[i].clone();
target.children[i].setParent(target);
} else {
break;
@@ -619,7 +619,7 @@
* @throws TeiidComponentException
* @throws BlockedException
*/
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
return null;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/RelationalPlan.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -266,8 +266,8 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
- return root.getFinalBuffer();
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ return root.getFinalBuffer(maxRows);
}
@Override
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SelectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -130,16 +130,16 @@
public Object clone(){
SelectNode clonedNode = new SelectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
- protected void copy(SelectNode source, SelectNode target){
- super.copy(source, target);
+ protected void copyTo(SelectNode target){
+ super.copyTo(target);
target.criteria = criteria;
- target.elementMap = source.elementMap;
- target.projectionIndexes = source.projectionIndexes;
- target.projectedExpressions = source.projectedExpressions;
+ target.elementMap = elementMap;
+ target.projectionIndexes = projectionIndexes;
+ target.projectedExpressions = projectedExpressions;
}
public PlanNode getDescriptionProperties() {
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/SortNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,8 @@
private TupleBuffer output;
private TupleSource outputTs;
private boolean usingOutput;
+
+ private int rowLimit = -1;
private static final int SORT = 2;
private static final int OUTPUT = 3;
@@ -64,6 +66,7 @@
output = null;
outputTs = null;
usingOutput = false;
+ rowLimit = -1;
}
public void setSortElements(List<OrderByItem> items) {
@@ -100,6 +103,12 @@
if (this.outputTs == null) {
this.outputTs = this.output.createIndexedTupleSource();
}
+ if (rowLimit >= 0) {
+ this.output.truncateTo(rowLimit);
+ if (!this.output.isFinal() && this.output.getRowCount() == rowLimit) {
+ this.output.close();
+ }
+ }
this.phase = OUTPUT;
}
@@ -149,15 +158,15 @@
}
}
- protected void copy(SortNode source, SortNode target){
- super.copy(source, target);
- target.items = source.items;
- target.mode = source.mode;
+ protected void copyTo(SortNode target){
+ super.copyTo(target);
+ target.items = items;
+ target.mode = mode;
}
public Object clone(){
SortNode clonedNode = new SortNode(super.getID());
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
return clonedNode;
}
@@ -175,14 +184,16 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ public TupleBuffer getFinalBuffer(int maxRows) throws BlockedException, TeiidComponentException, TeiidProcessingException {
+ this.rowLimit = maxRows;
+ //TODO: push limiting into the sort logic
if (this.output == null) {
sortPhase();
}
usingOutput = true;
TupleBuffer result = this.output;
if (this.output.isFinal()) {
- this.output = null;
+ this.output = null;
close();
}
return result;
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/TextTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -162,7 +162,7 @@
@Override
public TextTableNode clone() {
TextTableNode clone = new TextTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
return clone;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/UnionAllNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -147,7 +147,7 @@
public Object clone(){
UnionAllNode clonedNode = new UnionAllNode(super.getID());
- super.copy(this, clonedNode);
+ super.copyTo(clonedNode);
return clonedNode;
}
Modified: trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/WindowFunctionProjectNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -145,7 +145,7 @@
public Object clone(){
WindowFunctionProjectNode clonedNode = new WindowFunctionProjectNode();
- this.copy(this, clonedNode);
+ this.copyTo(clonedNode);
clonedNode.windows = windows;
clonedNode.expressionIndexes = expressionIndexes;
clonedNode.passThrough = passThrough;
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/relational/XMLTableNode.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -80,7 +80,7 @@
typeMapping.put(DataTypeManager.DefaultDataClasses.DOUBLE, BuiltInAtomicType.DOUBLE);
}
- private static RuntimeException EARLY_TERMINATION = new RuntimeException();
+ private static TeiidRuntimeException EARLY_TERMINATION = new TeiidRuntimeException();
private XMLTable table;
private List<XMLColumn> projectedColumns;
@@ -102,6 +102,8 @@
private int outputRow = 1;
private boolean usingOutput;
+ private int rowLimit = -1;
+
public XMLTableNode(int nodeID) {
super(nodeID);
}
@@ -132,6 +134,7 @@
this.buffer = null;
this.state = State.BUILDING;
this.asynchException = null;
+ this.rowLimit = -1;
}
public void setTable(XMLTable table) {
@@ -145,7 +148,7 @@
@Override
public XMLTableNode clone() {
XMLTableNode clone = new XMLTableNode(getID());
- this.copy(this, clone);
+ this.copyTo(clone);
clone.setTable(table);
clone.setProjectedColumns(projectedColumns);
return clone;
@@ -215,21 +218,23 @@
public void run() {
try {
XQueryEvaluator.evaluateXQuery(table.getXQueryExpression(), contextItem, parameters, XMLTableNode.this, getContext());
- synchronized (XMLTableNode.this) {
- if (buffer != null) {
- buffer.close();
- }
- }
} catch (TeiidException e) {
asynchException = new TeiidRuntimeException(e);
} catch (TeiidRuntimeException e) {
- asynchException = e;
- } catch (RuntimeException e) {
if (e != EARLY_TERMINATION) {
- asynchException = new TeiidRuntimeException(e);
+ asynchException = e;
}
+ } catch (RuntimeException e) {
+ asynchException = new TeiidRuntimeException(e);
} finally {
synchronized (XMLTableNode.this) {
+ if (buffer != null) {
+ try {
+ buffer.close();
+ } catch (TeiidComponentException e) {
+ asynchException = new TeiidRuntimeException(e);
+ }
+ }
state = State.DONE;
XMLTableNode.this.notifyAll();
}
@@ -308,13 +313,14 @@
}
@Override
- public TupleBuffer getFinalBuffer() throws BlockedException,
+ public synchronized TupleBuffer getFinalBuffer(int maxRows) throws BlockedException,
TeiidComponentException, TeiidProcessingException {
+ this.rowLimit = maxRows;
evaluate(true);
usingOutput = true;
TupleBuffer finalBuffer = this.buffer;
if (!this.table.getXQueryExpression().isStreaming()) {
- close();
+ close();
}
return finalBuffer;
}
@@ -329,6 +335,9 @@
rowCount++;
try {
this.buffer.addTuple(processRow());
+ if (this.buffer.getRowCount() == rowLimit) {
+ throw EARLY_TERMINATION;
+ }
if (state == State.BUILDING && hasNextBatch()) {
this.state = State.AVAILABLE;
this.notifyAll();
Modified: trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/processor/xml/RelationalPlanExecutor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -90,9 +90,7 @@
private boolean executed;
private boolean doneLoading;
- public RelationalPlanExecutor (ResultSetInfo resultInfo, CommandContext context, ProcessorDataManager dataMgr, BufferManager bufferMgr)
- throws TeiidComponentException{
-
+ public RelationalPlanExecutor (ResultSetInfo resultInfo, CommandContext context, ProcessorDataManager dataMgr, BufferManager bufferMgr) {
this.resultInfo = resultInfo;
this.bufferMgr = bufferMgr;
this.dataManager = dataMgr;
Modified: trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/sql/visitor/SQLStringVisitor.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -1161,9 +1161,13 @@
constantParts = new String[] {"X'", obj.getValue().toString(), "'"}; //$NON-NLS-1$ //$NON-NLS-2$
}
if (constantParts == null) {
- String strValue = obj.getValue().toString();
- strValue = escapeStringValue(strValue, "'"); //$NON-NLS-1$
- constantParts = new String[] {"'", strValue, "'"}; //$NON-NLS-1$ //$NON-NLS-2$
+ if (DataTypeManager.isLOB(type)) {
+ constantParts = new String[] {"?"}; //$NON-NLS-1$
+ } else {
+ String strValue = obj.getValue().toString();
+ strValue = escapeStringValue(strValue, "'"); //$NON-NLS-1$
+ constantParts = new String[] {"'", strValue, "'"}; //$NON-NLS-1$ //$NON-NLS-2$
+ }
}
}
Modified: trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/tempdata/TempTableDataManager.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,7 @@
import org.teiid.dqp.internal.process.CachedResults;
import org.teiid.dqp.internal.process.DQPWorkContext;
import org.teiid.dqp.internal.process.SessionAwareCache;
+import org.teiid.dqp.internal.process.TupleSourceCache;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
import org.teiid.events.EventDistributor;
import org.teiid.language.SQLConstants;
@@ -124,6 +125,13 @@
RegisterRequestParameter parameterObject)
throws TeiidComponentException, TeiidProcessingException {
+ if (parameterObject.info != null) {
+ TupleSourceCache tsc = context.getTupleSourceCache();
+ if (tsc != null) {
+ return tsc.getSharedTupleSource(context, command, modelName, parameterObject, bufferManager, this);
+ }
+ }
+
TempTableStore tempTableStore = context.getTempTableStore();
if(tempTableStore != null) {
TupleSource result = registerRequest(context, modelName, command);
Modified: trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java
===================================================================
--- trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/main/java/org/teiid/query/util/CommandContext.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -45,6 +45,7 @@
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.TupleSourceCache;
import org.teiid.dqp.internal.process.SessionAwareCache.CacheID;
import org.teiid.dqp.message.RequestID;
import org.teiid.dqp.service.TransactionContext;
@@ -141,7 +142,7 @@
Set<CommandListener> commandListeners = null;
private LRUCache<String, DecimalFormat> decimalFormatCache;
private LRUCache<String, SimpleDateFormat> dateFormatCache;
- private AtomicLong reuseCount = new AtomicLong();
+ private AtomicLong reuseCount = null;
private ClassLoader classLoader;
private List<Exception> warnings = null;
@@ -155,6 +156,7 @@
private boolean nonBlocking;
private HashSet<Object> planningObjects;
private HashSet<Object> dataObjects = this.globalState.dataObjects;
+ private TupleSourceCache tupleSourceCache;
/**
* Construct a new context.
@@ -228,6 +230,7 @@
clone.recursionStack = new LinkedList<String>(this.recursionStack);
}
clone.setNonBlocking(this.nonBlocking);
+ clone.tupleSourceCache = this.tupleSourceCache;
return clone;
}
@@ -749,8 +752,20 @@
@Override
public long getReuseCount() {
+ if (globalState.reuseCount == null) {
+ return 0;
+ }
return globalState.reuseCount.get();
}
+
+ @Override
+ public boolean isContinuous() {
+ return globalState.reuseCount == null;
+ }
+
+ public void setContinuous() {
+ this.globalState.reuseCount = new AtomicLong();
+ }
@Override
public ClassLoader getVDBClassLoader() {
@@ -791,5 +806,13 @@
}
LogManager.logInfo(LogConstants.CTX_DQP, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31105, warning.getMessage()));
}
+
+ public TupleSourceCache getTupleSourceCache() {
+ return tupleSourceCache;
+ }
+
+ public void setTupleSourceCache(TupleSourceCache tupleSourceCache) {
+ this.tupleSourceCache = tupleSourceCache;
+ }
}
Modified: trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/common/buffer/TestTupleBuffer.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -60,6 +60,32 @@
assertEquals(2, batch.getBeginRow());
}
+ @Test public void testTruncate() throws Exception {
+ ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
+ x.setType(DataTypeManager.DefaultDataClasses.INTEGER);
+ List<ElementSymbol> schema = Arrays.asList(x);
+ TupleBuffer tb = BufferManagerFactory.getStandaloneBufferManager().createTupleBuffer(schema, "x", TupleSourceType.PROCESSOR); //$NON-NLS-1$
+ tb.setBatchSize(2);
+ for (int i = 0; i < 5; i++) {
+ tb.addTuple(Arrays.asList(1));
+ }
+ TupleBatch batch = tb.getBatch(1);
+ assertTrue(!batch.getTerminationFlag());
+ assertEquals(2, batch.getEndRow());
+ tb.close();
+ assertEquals(5, tb.getManagedRowCount());
+ tb.truncateTo(3);
+ assertEquals(3, tb.getManagedRowCount());
+ assertEquals(3, tb.getRowCount());
+ batch = tb.getBatch(3);
+ assertTrue(batch.getTerminationFlag());
+ tb.truncateTo(2);
+ assertEquals(2, tb.getManagedRowCount());
+ assertEquals(2, tb.getRowCount());
+ batch = tb.getBatch(2);
+ assertTrue(batch.getTerminationFlag());
+ }
+
@Test public void testLobHandling() throws Exception {
ElementSymbol x = new ElementSymbol("x"); //$NON-NLS-1$
x.setType(DataTypeManager.DefaultDataClasses.CLOB);
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestDQPCore.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -374,6 +374,7 @@
agds.sleep = 500;
agds.setUseIntCounter(true);
RequestMessage reqMsg = exampleRequestMessage(sql);
+ reqMsg.setRowLimit(11);
reqMsg.setCursorType(ResultSet.TYPE_FORWARD_ONLY);
DQPWorkContext.getWorkContext().getSession().setSessionId(sessionid);
DQPWorkContext.getWorkContext().getSession().setUserName(userName);
@@ -393,6 +394,8 @@
rm = message.get(500000, TimeUnit.MILLISECONDS);
assertNull(rm.getException());
assertEquals(5, rm.getResultsList().size());
+ assertEquals(7, rm.getFirstRow());
+ assertEquals(11, rm.getFinalRow());
}
@Test public void testSourceConcurrency() throws Exception {
@@ -603,6 +606,14 @@
}
}
+ @Test public void testXmlTableStreamingWithLimit() throws Exception {
+ String sql = "select * from xmltable('/a/b' passing xmlparse(document '<a x=''1''><b>foo</b><b>bar</b><b>zed</b></a>') columns y string path '.') as x limit 2"; //$NON-NLS-1$
+
+ ResultsMessage rm = execute("A", 1, exampleRequestMessage(sql));
+ assertNull(rm.getException());
+ assertEquals(2, rm.getResultsList().size());
+ }
+
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 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/internal/process/TestPreparedStatement.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -345,10 +345,7 @@
helpGetProcessorPlan(preparedSql, values, new SessionAwareCache<PreparedPlan>());
}
- /**
- * TODO: there may be other ways of handling this situation in the future
- */
- @Test public void testLimitNoCache() throws Exception {
+ @Test public void testLimit() throws Exception {
// Create query
String preparedSql = "SELECT pm1.g1.e1, e2, pm1.g1.e3 as a, e4 as b FROM pm1.g1 WHERE pm1.g1.e2=?"; //$NON-NLS-1$
@@ -360,7 +357,7 @@
helpGetProcessorPlan(preparedSql, values, new DefaultCapabilitiesFinder(), RealMetadataFactory.example1Cached(), planCache, SESSION_ID, false, true, RealMetadataFactory.example1VDB());
//make sure the plan wasn't reused
- assertEquals(0, planCache.getCacheHitCount());
+ assertEquals(1, planCache.getCacheHitCount());
}
@Test public void testUpdateProcedureCriteria() throws Exception {
Modified: trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java
===================================================================
--- trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java 2012-07-12 14:02:50 UTC (rev 4232)
+++ trunk/engine/src/test/java/org/teiid/dqp/service/AutoGenDataService.java 2012-07-12 17:45:57 UTC (rev 4233)
@@ -49,6 +49,7 @@
import org.teiid.query.optimizer.capabilities.SourceCapabilities;
import org.teiid.query.processor.relational.RelationalNodeUtil;
import org.teiid.query.sql.symbol.Expression;
+import org.teiid.translator.CacheDirective;
import org.teiid.translator.DataNotAvailableException;
import org.teiid.translator.TranslatorException;
@@ -179,6 +180,11 @@
public boolean copyLobs() {
return copyLobs;
}
+
+ @Override
+ public CacheDirective getCacheDirective() {
+ return null;
+ }
};
}
12 years, 8 months