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
}
}