Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 12042 invoked from network); 20 Jan 2005 19:22:36 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur-2.apache.org with SMTP; 20 Jan 2005 19:22:36 -0000 Received: (qmail 10658 invoked by uid 500); 20 Jan 2005 19:22:19 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 10595 invoked by uid 500); 20 Jan 2005 19:22:19 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: list-post: List-Id: Reply-To: "Derby Development" Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 10551 invoked by uid 99); 20 Jan 2005 19:22:18 -0000 X-ASF-Spam-Status: No, hits=0.1 required=10.0 tests=FORGED_RCVD_HELO X-Spam-Check-By: apache.org Received-SPF: neutral (hermes.apache.org: local policy) Received: from e33.co.us.ibm.com (HELO e33.co.us.ibm.com) (32.97.110.131) by apache.org (qpsmtpd/0.28) with ESMTP; Thu, 20 Jan 2005 11:22:16 -0800 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e33.co.us.ibm.com (8.12.10/8.12.9) with ESMTP id j0KJMDCO440000 for ; Thu, 20 Jan 2005 14:22:13 -0500 Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d03relay04.boulder.ibm.com (8.12.10/NCO/VER6.6) with ESMTP id j0KJMCJl321600 for ; Thu, 20 Jan 2005 12:22:13 -0700 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id j0KJMC7B002695 for ; Thu, 20 Jan 2005 12:22:12 -0700 Received: from debrunners.com (IBM-KT5II609ZW0.usca.ibm.com [9.72.133.60]) by d03av04.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id j0KJMCOx002658 for ; Thu, 20 Jan 2005 12:22:12 -0700 Message-ID: <41F004C2.8060000@debrunners.com> Date: Thu, 20 Jan 2005 11:21:38 -0800 From: Daniel John Debrunner User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4.1) Gecko/20031008 X-Accept-Language: en-us, en MIME-Version: 1.0 To: derby-dev Subject: [PATCH] Cleanup of special function nodes X-Enigmail-Version: 0.76.8.0 X-Enigmail-Supports: pgp-inline, pgp-mime Content-Type: multipart/mixed; boundary="------------010002020802060109080203" X-Virus-Checked: Checked X-Spam-Rating: minotaur-2.apache.org 1.6.2 0/1000/N This is a multi-part message in MIME format. --------------010002020802060109080203 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 I'll apply this patch by next Monday if there are no objections. This patch replaces two compile time query tree nodes CurrentUserNode.java and CurrentIsolationNode.java with a single node SpecialFunctionNode.java. The driving force behind this is footprint, the Java class file format imposes a penalty for multiple classes as String constants such as method names, signatures and class names are repeated in each class. E.g. if each class has a toString() method then each class will have the constants 'java/lang/String', 'toString' etc. In addition the jar file format has a per-class overhead. Thus moving common functionality into a single class can reduce footprint. In this case the classes CurrentUserNode (3801 bytes) and CurrentIsolation (2757) are replaced with a single class SpecialFunctionNode (4208). The downside to moving functionality into single classes is that typically more conditional code (if or switch statements) have to be executed at runtime, and thus performance can degrade. Thus a decision to consolidate should depend on the situation. The general rule of thumb has been that additional conditional logic at SQL compile time is not an issue, but is an issue at SQL execution time. Obviously in the case of SQL execution time it depends on how frequently the piece of code is likely to be executed by a typical application. Another consideration is how much visual complexity is added by combining classes, if the code is easier to understand in multiple classes then it should remain so. I saw this opportunity to consolidate classes when chaging IDENITY_VALUE_LOCAL to use Long instead of BigDecimal for the JSR 169 preperation work. That function was implemented in CurrentUserNode.java which seemed misleading, and then I saw that node implemented other non-user releated functions. Looking around in the other Nodes I saw a pattern of special functions with near identical nodes. A blatent example was CurrentIsolationNode where it was obviously copied from CurrentUserNode as most of the comments still indicated CurrentUserNode. Thus I created SpecialFunctionNode and made it have correct up to date comments. It handles Special SQL functions which seem to have a pattern of being implemented as a method call in LanguageConnectionContext, though I believe other functions could be added here which are implemented as method calls in Activation. Basically a SQL special function returns state of the connection (session) or of the statement. Other Nodes I think could be consolidated into SpecialFunctionNodes are: GetCurrentConnectionNode - though this functionality should be removed, it has been replaced by the standard jdbc:default:connection. There is only one internal use of it at the moment. CurrentDatetimeOperatorNode - a little more involved, as some setup state manipulation has to be added. Hope this the type of explaination that shahbaz chaudhary was looking for. Dan. svn status outpur M java\engine\org\apache\derby\impl\sql\compile\NodeFactoryImpl.java M java\engine\org\apache\derby\impl\sql\compile\C_NodeNames.java M java\engine\org\apache\derby\impl\sql\compile\ColumnDefinitionNode.java M java\engine\org\apache\derby\impl\sql\compile\sqlgrammar.jj M java\engine\org\apache\derby\iapi\sql\compile\C_NodeTypes.java A java\engine\org\apache\derby\impl\sql\compile\SpecialFunctionNode.java D java\engine\org\apache\derby\impl\sql\compile\CurrentIsolationNode.java D java\engine\org\apache\derby\impl\sql\compile\CurrentUserNode.java -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.5 (MingW32) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFB8ATBIv0S4qsbfuQRAnPyAJsEsNy9xpnK3GBJVkCwaceho9WragCfXf+S JToMu3+IEFk3zNGdmA06U4k= =qRdp -----END PGP SIGNATURE----- --------------010002020802060109080203 Content-Type: text/plain; name="special_function.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="special_function.txt" Index: java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/NodeFactoryImpl.java (working copy) @@ -197,9 +197,6 @@ case C_NodeTypes.GROUP_BY_LIST: return C_NodeNames.GROUP_BY_LIST_NAME; - case C_NodeTypes.CURRENT_ISOLATION_NODE: - return C_NodeNames.CURRENT_ISOLATION_NAME; - case C_NodeTypes.ORDER_BY_LIST: return C_NodeNames.ORDER_BY_LIST_NAME; @@ -420,8 +417,14 @@ case C_NodeTypes.CURRENT_DATETIME_OPERATOR_NODE: return C_NodeNames.CURRENT_DATETIME_OPERATOR_NODE_NAME; + case C_NodeTypes.USER_NODE: case C_NodeTypes.CURRENT_USER_NODE: - return C_NodeNames.CURRENT_USER_NODE_NAME; + case C_NodeTypes.SESSION_USER_NODE: + case C_NodeTypes.SYSTEM_USER_NODE: + case C_NodeTypes.CURRENT_ISOLATION_NODE: + case C_NodeTypes.IDENTITY_VAL_NODE: + case C_NodeTypes.CURRENT_SCHEMA_NODE: + return C_NodeNames.SPECIAL_FUNCTION_NODE_NAME; case C_NodeTypes.IS_NODE: return C_NodeNames.IS_NODE_NAME; Index: java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/C_NodeNames.java (working copy) @@ -94,13 +94,11 @@ static final String CURRENT_DATETIME_OPERATOR_NODE_NAME = "org.apache.derby.impl.sql.compile.CurrentDatetimeOperatorNode"; - static final String CURRENT_ISOLATION_NAME = "org.apache.derby.impl.sql.compile.CurrentIsolationNode"; - static final String CURRENT_OF_NODE_NAME = "org.apache.derby.impl.sql.compile.CurrentOfNode"; static final String CURRENT_ROW_LOCATION_NODE_NAME = "org.apache.derby.impl.sql.compile.CurrentRowLocationNode"; - static final String CURRENT_USER_NODE_NAME = "org.apache.derby.impl.sql.compile.CurrentUserNode"; + static final String SPECIAL_FUNCTION_NODE_NAME = "org.apache.derby.impl.sql.compile.SpecialFunctionNode"; static final String CURSOR_NODE_NAME = "org.apache.derby.impl.sql.compile.CursorNode"; Index: java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java (working copy) @@ -611,24 +611,27 @@ (colType == StoredFormatIds.VARCHAR_TYPE_ID) || (colType == StoredFormatIds.LONGVARCHAR_TYPE_ID)); - if (defaultNode instanceof CurrentUserNode) { + if (defaultNode instanceof SpecialFunctionNode) { - defaultText = defaultText.toLowerCase(java.util.Locale.ENGLISH); - if (defaultText.indexOf("user") != -1) + switch (defaultNode.getNodeType()) + { + case C_NodeTypes.USER_NODE: + case C_NodeTypes.CURRENT_USER_NODE: + case C_NodeTypes.SESSION_USER_NODE: + case C_NodeTypes.SYSTEM_USER_NODE: // DB2 enforces min length of 8. // Note also: any size under 30 gives a warning in DB2. return (charCol && (columnDesc.getMaximumWidth() >= DB2Limit.MIN_COL_LENGTH_FOR_CURRENT_USER)); - if ((defaultText.indexOf("schema") != -1) || - (defaultText.indexOf("sqlid") != -1)) + case C_NodeTypes.CURRENT_SCHEMA_NODE: // DB2 enforces min length of 128. return (charCol && (columnDesc.getMaximumWidth() >= DB2Limit.MIN_COL_LENGTH_FOR_CURRENT_SCHEMA)); - - // else, function not allowed. - return false; - + default: + // else, function not allowed. + return false; + } } } Index: java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj (working copy) @@ -92,7 +92,6 @@ import org.apache.derby.impl.sql.compile.ValueNode; import org.apache.derby.impl.sql.compile.ValueNodeList; import org.apache.derby.impl.sql.compile.GroupByColumn; -import org.apache.derby.impl.sql.compile.CurrentUserNode; import org.apache.derby.impl.sql.compile.CurrentDatetimeOperatorNode; import org.apache.derby.impl.sql.compile.CreateStatementNode; import org.apache.derby.impl.sql.compile.AlterTableNode; @@ -5511,8 +5510,7 @@ { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.IDENTITY_VAL), + C_NodeTypes.IDENTITY_VAL_NODE, getContextManager()); } } @@ -5742,8 +5740,7 @@ ( | ) { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.SCHEMA), + C_NodeTypes.CURRENT_SCHEMA_NODE, getContextManager()); } | @@ -6170,8 +6167,7 @@ { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.USER), + C_NodeTypes.USER_NODE, getContextManager()); } | @@ -6179,15 +6175,13 @@ { return (ValueNode) nodeFactory.getNode( C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.CURRENT_USER), getContextManager()); } | { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.SESSION_USER), + C_NodeTypes.SESSION_USER_NODE, getContextManager()); } } @@ -9210,16 +9204,14 @@ ( | ) { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.SCHEMA), + C_NodeTypes.CURRENT_SCHEMA_NODE, getContextManager()); } | { return (ValueNode) nodeFactory.getNode( - C_NodeTypes.CURRENT_USER_NODE, - ReuseFactory.getInteger(CurrentUserNode.USER), + C_NodeTypes.USER_NODE, getContextManager()); } | Index: java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java =================================================================== --- java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java (revision 125645) +++ java/engine/org/apache/derby/iapi/sql/compile/C_NodeTypes.java (working copy) @@ -34,8 +34,8 @@ static final int CURRENT_ROW_LOCATION_NODE = 2; static final int GROUP_BY_LIST = 3; static final int CURRENT_ISOLATION_NODE = 4; - // 5 available; - // 6 available + static final int IDENTITY_VAL_NODE = 5; + static final int CURRENT_SCHEMA_NODE = 6; static final int ORDER_BY_LIST = 7; static final int PREDICATE_LIST = 8; static final int RESULT_COLUMN_LIST = 9; @@ -137,8 +137,8 @@ // 106 is available static final int VIRTUAL_COLUMN_NODE = 107; static final int CURRENT_DATETIME_OPERATOR_NODE = 108; - static final int CURRENT_USER_NODE = 109; - // 110 is available + static final int CURRENT_USER_NODE = 109; // special function CURRENT_USER + static final int USER_NODE = 110; // // special function USER static final int IS_NODE = 111; static final int LOCK_TABLE_NODE = 112; // 113 @@ -153,8 +153,8 @@ static final int NORMALIZE_RESULT_SET_NODE = 122; static final int SCROLL_INSENSITIVE_RESULT_SET_NODE = 123; static final int DISTINCT_NODE = 124; - // 125 available - // 126 available + static final int SESSION_USER_NODE = 125; // // special function SESSION_USER + static final int SYSTEM_USER_NODE = 126; // // special function SYSTEM_USER static final int TRIM_OPERATOR_NODE = 127; // 128 is available static final int SELECT_NODE = 129; Index: java/engine/org/apache/derby/impl/sql/compile/SpecialFunctionNode.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/SpecialFunctionNode.java (revision 0) +++ java/engine/org/apache/derby/impl/sql/compile/SpecialFunctionNode.java (revision 0) @@ -0,0 +1,224 @@ +/* + + Derby - Class org.apache.derby.impl.sql.compile.SpecialFunctionNode + + Copyright 1999, 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + */ + +package org.apache.derby.impl.sql.compile; + +import org.apache.derby.iapi.sql.compile.CompilerContext; + +import org.apache.derby.iapi.types.DataTypeDescriptor; + +import org.apache.derby.iapi.services.compiler.MethodBuilder; +import org.apache.derby.iapi.services.compiler.LocalField; + +import org.apache.derby.iapi.services.sanity.SanityManager; + +import org.apache.derby.iapi.store.access.Qualifier; + +import org.apache.derby.impl.sql.compile.ExpressionClassBuilder; + +import java.lang.reflect.Modifier; + +import org.apache.derby.iapi.error.StandardException; +import org.apache.derby.iapi.reference.ClassName; +import org.apache.derby.iapi.services.classfile.VMOpcode; +import org.apache.derby.iapi.sql.compile.C_NodeTypes; + + +import java.sql.Types; + +import java.util.Vector; + +/** + SpecialFunctionNode handles system SQL functions. + A function value is either obtained by a method + call off the LanguageConnectionContext or Activation. + LanguageConnectionContext functions are state related to the connection. + Activation functions are those related to the statement execution. + + Each SQL function takes no arguments and returns a SQLvalue. +

+ Functions supported: +

    +
  • USER +
  • CURRENT_USER +
  • SESSION_USER +
  • SYSTEM_USER +
  • CURRENT SCHEMA +
  • CURRENT ISOLATION +
  • IDENTITY_VAL_LOCAL + +
+ + +

+ + This node is used rather than some use of MethodCallNode for + runtime performance. MethodCallNode does not provide a fast access + to the current language connection or activatation, since it is geared + towards user defined routines. + + +*/ +public class SpecialFunctionNode extends ValueNode +{ + /** + Name of SQL function + */ + String sqlName; + + /** + Java method name + */ + private String methodName; + + /** + Return type of Java method. + */ + private String methodType; + + /** + */ + //private boolean isActivationCall; + + /** + * Binding this special function means setting the result DataTypeServices. + * In this case, the result type is based on the operation requested. + * + * @param fromList The FROM list for the statement. This parameter + * is not used in this case. + * @param subqueryList The subquery list being built as we find + * SubqueryNodes. Not used in this case. + * @param aggregateVector The aggregate vector being built as we find + * AggregateNodes. Not used in this case. + * + * @return The new top of the expression tree. + * + * @exception StandardException Thrown on error + */ + public ValueNode bindExpression(FromList fromList, SubqueryList subqueryList, + Vector aggregateVector) + throws StandardException + { DataTypeDescriptor dtd; + int nodeType = getNodeType(); + switch (nodeType) + { + case C_NodeTypes.USER_NODE: + case C_NodeTypes.CURRENT_USER_NODE: + case C_NodeTypes.SESSION_USER_NODE: + case C_NodeTypes.SYSTEM_USER_NODE: + switch (nodeType) + { + case C_NodeTypes.USER_NODE: sqlName = "USER"; break; + case C_NodeTypes.CURRENT_USER_NODE: sqlName = "CURRENT_USER"; break; + case C_NodeTypes.SESSION_USER_NODE: sqlName = "SESSION_USER"; break; + case C_NodeTypes.SYSTEM_USER_NODE: sqlName = "SYSTEM_USER"; break; + } + methodName = "getAuthorizationId"; + methodType = "java.lang.String"; + dtd = DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.VARCHAR, false, 128); + break; + + case C_NodeTypes.CURRENT_SCHEMA_NODE: + sqlName = "CURRENT SCHEMA"; + methodName = "getCurrentSchemaName"; + methodType = "java.lang.String"; + dtd = DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.VARCHAR, false, 128); + break; + + case C_NodeTypes.IDENTITY_VAL_NODE: + sqlName = "IDENTITY_VAL_LOCAL"; + methodName = "getIdentityValue"; + methodType = "java.lang.Long"; + dtd = DataTypeDescriptor.getSQLDataTypeDescriptor("java.math.BigDecimal", 31, 0, true, 31); + break; + + case C_NodeTypes.CURRENT_ISOLATION_NODE: + sqlName = "CURRENT ISOLATION"; + methodName = "getCurrentIsolationLevelStr"; + methodType = "java.lang.String"; + dtd = DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.CHAR, 2); + break; + default: + if (SanityManager.DEBUG) + { + SanityManager.THROWASSERT("Invalid type for SpecialFunctionNode " + nodeType); + } + dtd = null; + break; + } + + checkReliability(sqlName, CompilerContext.USER_ILLEGAL ); + setType(dtd); + + return this; + } + + /** + * Return the variant type for the underlying expression. + All supported special functions are QUERY_INVARIANT + + * + * @return The variant type for the underlying expression. + */ + protected int getOrderableVariantType() + { + return Qualifier.QUERY_INVARIANT; + } + + /** + Generate an expression that returns a DataValueDescriptor and + calls a method off the language connection or the activation. + * + * @param acb The ExpressionClassBuilder for the class being built + * @param mb The method the code to place the code + * + * + * @exception StandardException Thrown on error + */ + public void generateExpression(ExpressionClassBuilder acb, + MethodBuilder mb) + throws StandardException + { + mb.pushThis(); + mb.callMethod(VMOpcode.INVOKEINTERFACE, ClassName.Activation, "getLanguageConnectionContext", + ClassName.LanguageConnectionContext, 0); + + mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, methodName, methodType, 0); + + String fieldType = getTypeCompiler().interfaceName(); + LocalField field = acb.newFieldDeclaration(Modifier.PRIVATE, fieldType); + + acb.generateDataValue(mb, getTypeCompiler(), field); + } + + /* + print the non-node subfields + */ + public String toString() { + if (SanityManager.DEBUG) + { + return super.toString()+ sqlName; + } + else + { + return ""; + } + } +} Index: java/engine/org/apache/derby/impl/sql/compile/CurrentIsolationNode.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/CurrentIsolationNode.java (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/CurrentIsolationNode.java (working copy) @@ -1,136 +0,0 @@ -/* - - Derby - Class org.apache.derby.impl.sql.compile.CurrentIsolationNode - - Copyright 2004 The Apache Software Foundation or its licensors, as applicable. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - */ - -package org.apache.derby.impl.sql.compile; - -import org.apache.derby.iapi.store.access.Qualifier; -import org.apache.derby.iapi.error.StandardException; -import org.apache.derby.iapi.types.DataTypeDescriptor; -import org.apache.derby.iapi.services.compiler.MethodBuilder; -import org.apache.derby.iapi.services.compiler.LocalField; - -import org.apache.derby.iapi.services.sanity.SanityManager; - -import org.apache.derby.iapi.services.classfile.VMOpcode; -import org.apache.derby.iapi.reference.ClassName; - -import org.apache.derby.impl.sql.compile.ExpressionClassBuilder; - -import java.lang.reflect.Modifier; - -import java.sql.Types; -import java.util.Vector; - -/** - * The CurrentIsolationNode is for the CURRENT ISOLATION special register - * - * @author Jack Klebanoff - */ -public class CurrentIsolationNode extends ValueNode -{ - - - /** - * Return the variant type for the underlying expression. - * The variant type can be: - * VARIANT - variant within a scan - * (method calls and non-static field access) - * SCAN_INVARIANT - invariant within a scan - * (column references from outer tables) - * QUERY_INVARIANT - invariant within the life of a query - * (constant expressions) - * - * @return The variant type for the underlying expression. - */ - protected int getOrderableVariantType() - { - // CurrentDate, Time, Timestamp are invariant for the life of the query - return Qualifier.QUERY_INVARIANT; - } - - // - // QueryTreeNode interface - // - - /** - * Binding this expression means setting the result DataTypeServices. - * In this case, the result type is based on the operation requested. - * - * @param fromList The FROM list for the statement. This parameter - * is not used in this case. - * @param subqueryList The subquery list being built as we find - * SubqueryNodes. Not used in this case. - * @param aggregateVector The aggregate vector being built as we find - * AggregateNodes. Not used in this case. - * - * @return The new top of the expression tree. - * - * @exception StandardException Thrown on error - */ - public ValueNode bindExpression(FromList fromList, SubqueryList subqueryList, - Vector aggregateVector) - throws StandardException - { - setType( DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.CHAR, 2)); - return this; - } - - /** - * CurrentDatetimeOperatorNode is used in expressions. - * The expression generated for it invokes a static method - * on a special Cloudscape type to get the system time and - * wrap it in the right java.sql type, and then wrap it - * into the right shape for an arbitrary value, i.e. a column - * holder. This is very similar to what constants do. - * - * @param acb The ExpressionClassBuilder for the class being built - * @param mb The method the code to place the code - * - * - * @exception StandardException Thrown on error - */ - public void generateExpression(ExpressionClassBuilder acb, - MethodBuilder mb) - throws StandardException - { - mb.pushThis(); - mb.callMethod(VMOpcode.INVOKEINTERFACE, ClassName.Activation, "getLanguageConnectionContext", - ClassName.LanguageConnectionContext, 0); - mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, "getCurrentIsolationLevelStr", "java.lang.String", 0); - String fieldType = getTypeCompiler().interfaceName(); - LocalField field = acb.newFieldDeclaration(Modifier.PRIVATE, fieldType); - - acb.generateDataValue(mb, getTypeCompiler(), field); - } // end of generateExpression - - - public String toString() - { - if (SanityManager.DEBUG) - { - return super.toString() + "\n"; - } - else - { - return ""; - } - } - -} Index: java/engine/org/apache/derby/impl/sql/compile/CurrentUserNode.java =================================================================== --- java/engine/org/apache/derby/impl/sql/compile/CurrentUserNode.java (revision 125645) +++ java/engine/org/apache/derby/impl/sql/compile/CurrentUserNode.java (working copy) @@ -1,210 +0,0 @@ -/* - - Derby - Class org.apache.derby.impl.sql.compile.CurrentUserNode - - Copyright 1999, 2004 The Apache Software Foundation or its licensors, as applicable. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - */ - -package org.apache.derby.impl.sql.compile; - -import org.apache.derby.iapi.sql.compile.CompilerContext; - -import org.apache.derby.iapi.sql.conn.LanguageConnectionContext; - -import org.apache.derby.iapi.sql.dictionary.DataDictionary; - -import org.apache.derby.iapi.types.DataTypeDescriptor; - -import org.apache.derby.iapi.services.compiler.MethodBuilder; -import org.apache.derby.iapi.services.compiler.LocalField; - -import org.apache.derby.iapi.services.sanity.SanityManager; - -import org.apache.derby.iapi.store.access.Qualifier; - -import org.apache.derby.impl.sql.compile.ExpressionClassBuilder; - -import java.lang.reflect.Modifier; - -import org.apache.derby.iapi.error.StandardException; -import org.apache.derby.iapi.reference.ClassName; -import org.apache.derby.iapi.services.classfile.VMOpcode; - - -import java.sql.Types; - -import java.util.Vector; - -/** - * The CurrentUser operator is for the builtin USER, CURRENT_USER, - * SESSION_USER, CURRENT SCHEMA AND IDENTITY_VAL_LOCAL() operations. - * - * @author jerry - */ -public class CurrentUserNode extends ValueNode -{ - - public static final int USER = 0; - public static final int CURRENT_USER = 1; - public static final int SESSION_USER = 2; - public static final int SYSTEM_USER = 3; - public static final int SCHEMA = 4; - public static final int IDENTITY_VAL = 5; - - private int whichType; - - public void init(Object whichType) - { - this.whichType = ((Integer) whichType).intValue(); - - if (SanityManager.DEBUG) - { - SanityManager.ASSERT(((this.whichType >= 0 && this.whichType <= 2) || - this.whichType == 4 || this.whichType == 5), - "whichType expected to be between 0 and 2 or 4 and 5"); - } - } - - // - // QueryTreeNode interface - // - - /** - * Binding this expression means setting the result DataTypeServices. - * In this case, the result type is based on the operation requested. - * - * @param fromList The FROM list for the statement. This parameter - * is not used in this case. - * @param subqueryList The subquery list being built as we find - * SubqueryNodes. Not used in this case. - * @param aggregateVector The aggregate vector being built as we find - * AggregateNodes. Not used in this case. - * - * @return The new top of the expression tree. - * - * @exception StandardException Thrown on error - */ - public ValueNode bindExpression(FromList fromList, SubqueryList subqueryList, - Vector aggregateVector) - throws StandardException - { - String errorString = null; - switch (whichType) - { - case USER: - errorString = "USER"; - break; - - case CURRENT_USER: - errorString = "CURRENT_USER"; - break; - - case SESSION_USER: - errorString = "SESSION_USER"; - break; - - case SYSTEM_USER: - errorString = "SYSTEM_USER"; - break; - - case SCHEMA: - errorString = "CURRENT SCHEMA"; - break; - - case IDENTITY_VAL: - errorString = "IDENTITY_VAL_LOCAL"; - break; - } - - if (whichType == SCHEMA) - checkReliability( errorString, CompilerContext.SCHEMA_ILLEGAL ); - else - checkReliability( errorString, CompilerContext.USER_ILLEGAL ); - - if (whichType == IDENTITY_VAL) - setType(DataTypeDescriptor.getSQLDataTypeDescriptor("java.math.BigDecimal", 31, 0, true, 31)); - else - setType(DataTypeDescriptor.getBuiltInDataTypeDescriptor(Types.VARCHAR, false, 128)); - - return this; - } - - /** - * Return the variant type for the underlying expression. - * The variant type can be: - * VARIANT - variant within a scan - * (method calls and non-static field access) - * SCAN_INVARIANT - invariant within a scan - * (column references from outer tables) - * QUERY_INVARIANT - invariant within the life of a query - * (constant expressions) - * - * @return The variant type for the underlying expression. - */ - protected int getOrderableVariantType() - { - // CurrentDate, Time, Timestamp are invariant for the life of the query - return Qualifier.QUERY_INVARIANT; - } - - /** - * CurrentDatetimeOperatorNode is used in expressions. - * The expression generated for it invokes a static method - * on a special Cloudscape type to get the system time and - * wrap it in the right java.sql type, and then wrap it - * into the right shape for an arbitrary value, i.e. a column - * holder. This is very similar to what constants do. - * - * @param acb The ExpressionClassBuilder for the class being built - * @param mb The method the code to place the code - * - * - * @exception StandardException Thrown on error - */ - public void generateExpression(ExpressionClassBuilder acb, - MethodBuilder mb) - throws StandardException - { - mb.pushThis(); - mb.callMethod(VMOpcode.INVOKEINTERFACE, ClassName.Activation, "getLanguageConnectionContext", - ClassName.LanguageConnectionContext, 0); - if (whichType == IDENTITY_VAL) - mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, "getIdentityValue", "java.lang.Long", 0); - else if (whichType == SCHEMA) - mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, "getCurrentSchemaName", "java.lang.String", 0); - else - mb.callMethod(VMOpcode.INVOKEINTERFACE, (String) null, "getAuthorizationId", "java.lang.String", 0); - - String fieldType = getTypeCompiler().interfaceName(); - LocalField field = acb.newFieldDeclaration(Modifier.PRIVATE, fieldType); - - acb.generateDataValue(mb, getTypeCompiler(), field); - } - - /* - print the non-node subfields - */ - public String toString() { - if (SanityManager.DEBUG) - { - return super.toString()+"whichType = "+whichType+"\n"; - } - else - { - return ""; - } - } -} --------------010002020802060109080203--