diff options
-rw-r--r-- | connectivity/inc/connectivity/PColumn.hxx | 8 | ||||
-rw-r--r-- | connectivity/inc/connectivity/sqlparse.hxx | 6 | ||||
-rw-r--r-- | connectivity/source/parse/sqlbison.y | 112 | ||||
-rw-r--r-- | connectivity/source/parse/sqlflex.l | 7 | ||||
-rw-r--r-- | connectivity/source/parse/sqliterator.cxx | 113 |
5 files changed, 186 insertions, 60 deletions
diff --git a/connectivity/inc/connectivity/PColumn.hxx b/connectivity/inc/connectivity/PColumn.hxx index 1e6dcafca5ab..2b5c31e20dd6 100644 --- a/connectivity/inc/connectivity/PColumn.hxx +++ b/connectivity/inc/connectivity/PColumn.hxx @@ -2,9 +2,9 @@ * * $RCSfile: PColumn.hxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: oj $ $Date: 2001-04-30 10:13:36 $ + * last change: $Author: oj $ $Date: 2001-09-27 06:12:33 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -58,6 +58,8 @@ * * ************************************************************************/ +#ifndef _CONNECTIVITY_PCOLUMN_HXX_ +#define _CONNECTIVITY_PCOLUMN_HXX_ #ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_ #include "connectivity/sdbcx/VColumn.hxx" @@ -112,3 +114,5 @@ namespace connectivity } } +#endif //_CONNECTIVITY_PCOLUMN_HXX_ + diff --git a/connectivity/inc/connectivity/sqlparse.hxx b/connectivity/inc/connectivity/sqlparse.hxx index 5e4fac4ae42d..fbb7ae9338e5 100644 --- a/connectivity/inc/connectivity/sqlparse.hxx +++ b/connectivity/inc/connectivity/sqlparse.hxx @@ -2,9 +2,9 @@ * * $RCSfile: sqlparse.hxx,v $ * - * $Revision: 1.9 $ + * $Revision: 1.10 $ * - * last change: $Author: oj $ $Date: 2001-07-25 06:14:12 $ + * last change: $Author: oj $ $Date: 2001-09-27 06:12:33 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -248,6 +248,8 @@ namespace connectivity // RuleId mit enum, wesentlich effizienter static sal_uInt32 RuleID(OSQLParseNode::Rule eRule); + // compares the _sFunctionName with all known function names and return the DataType of the return value + static sal_Int32 getFunctionReturnType(const ::rtl::OUString& _sFunctionName, const OParseContext* pContext = NULL); diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y index 425fd33a2b3f..cb9dddc9b363 100644 --- a/connectivity/source/parse/sqlbison.y +++ b/connectivity/source/parse/sqlbison.y @@ -1,7 +1,7 @@ %{ //-------------------------------------------------------------------------- // -// $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/connectivity/source/parse/sqlbison.y,v 1.31 2001-08-24 06:07:23 oj Exp $ +// $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/connectivity/source/parse/sqlbison.y,v 1.32 2001-09-27 06:12:35 oj Exp $ // // Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. // @@ -9,7 +9,7 @@ // OJ // // Last change: -// $Author: oj $ $Date: 2001-08-24 06:07:23 $ $Revision: 1.31 $ +// $Author: oj $ $Date: 2001-09-27 06:12:35 $ $Revision: 1.32 $ // // Description: // @@ -184,8 +184,25 @@ using namespace connectivity; %token <pParseNode> SQL_TOKEN_WHERE SQL_TOKEN_WITH SQL_TOKEN_WORK SQL_TOKEN_YEAR SQL_TOKEN_ZONE /* ODBC KEYWORDS */ -%token <pParseNode> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ - +%token <pParseNode> SQL_TOKEN_CALL SQL_TOKEN_D SQL_TOKEN_FN SQL_TOKEN_T SQL_TOKEN_TS SQL_TOKEN_OJ
+/* string functions */
+%token <pParseNode> SQL_TOKEN_ASCII SQL_TOKEN_BIT_LENGTH SQL_TOKEN_CHAR SQL_TOKEN_CHAR_LENGTH SQL_TOKEN_CHARACTER_LENGTH
+%token <pParseNode> SQL_TOKEN_CONCAT
+%token <pParseNode> SQL_TOKEN_DIFFERENCE SQL_TOKEN_INSERT SQL_TOKEN_LCASE SQL_TOKEN_LEFT SQL_TOKEN_LENGTH SQL_TOKEN_LOCATE
+%token <pParseNode> SQL_TOKEN_LOCATE_2 SQL_TOKEN_LTRIM SQL_TOKEN_OCTET_LENGTH SQL_TOKEN_POSITION SQL_TOKEN_REPEAT SQL_TOKEN_REPLACE
+%token <pParseNode> SQL_TOKEN_RIGHT SQL_TOKEN_RTRIM SQL_TOKEN_SOUNDEX SQL_TOKEN_SPACE SQL_TOKEN_SUBSTRING SQL_TOKEN_UCASE
+
+/* time and date functions */
+%token <pParseNode> SQL_TOKEN_CURRENT_DATE SQL_TOKEN_CURRENT_TIME SQL_TOKEN_CURRENT_TIMESTAMP SQL_TOKEN_CURDATE SQL_TOKEN_CURTIME
+%token <pParseNode> SQL_TOKEN_DAYNAME SQL_TOKEN_DAYOFMONTH SQL_TOKEN_DAYOFWEEK SQL_TOKEN_DAYOFYEAR SQL_TOKEN_EXTRACT
+%token <pParseNode> SQL_TOKEN_HOUR SQL_TOKEN_MINUTE SQL_TOKEN_MONTH SQL_TOKEN_MONTHNAME SQL_TOKEN_NOW SQL_TOKEN_QUARTER
+%token <pParseNode> SQL_TOKEN_SECOND SQL_TOKEN_TIMESTAMPADD SQL_TOKEN_TIMESTAMPDIFF SQL_TOKEN_WEEK SQL_TOKEN_YEAR +
+/* numeric functions */
+%token <pParseNode> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING
+%token <pParseNode> SQL_TOKEN_COS SQL_TOKEN_COT SQL_TOKEN_DEGREES SQL_TOKEN_EXP SQL_TOKEN_FLOOR SQL_TOKEN_LOGF
+%token <pParseNode> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND
+%token <pParseNode> SQL_TOKEN_ROUND SQL_TOKEN_SIGN SQL_TOKEN_SIN SQL_TOKEN_SQRT SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE
%token <pParseNode> SQL_TOKEN_INVALIDSYMBOL @@ -229,7 +246,7 @@ using namespace connectivity; %type <pParseNode> /*op_authorization op_schema*/ nil_fkt schema_element base_table_def base_table_element base_table_element_commalist %type <pParseNode> column_def odbc_fct_spec odbc_call_spec odbc_fct_type op_parameter union_statement %type <pParseNode> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter -%type <pParseNode> catalog_name schema_name table_node +%type <pParseNode> catalog_name schema_name table_node numeric_function string_function function_name date_function %% /* Parse Tree an OSQLParser zurueckliefern @@ -1011,8 +1028,6 @@ boolean_primary: ; subroutine: { - if(!xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - YYERROR; } ; boolean_test: @@ -1761,7 +1776,7 @@ set_fct_spec: $$->append($2); $$->append($3 = newNode("}", SQL_NODE_PUNCTUATION)); } - | SQL_TOKEN_NAME '(' value_exp_commalist ')' + | function_name '(' value_exp_commalist ')' { $$ = SQL_NEW_RULE; $$->append($1); @@ -1769,6 +1784,87 @@ set_fct_spec: $$->append($3); $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); } + ;
+function_name:
+ string_function
+ | date_function
+ | numeric_function
+ | SQL_TOKEN_NAME
+ ;
+string_function:
+ SQL_TOKEN_ASCII
+ | SQL_TOKEN_BIT_LENGTH
+ | SQL_TOKEN_CHAR
+ | SQL_TOKEN_CHAR_LENGTH
+ | SQL_TOKEN_CHARACTER_LENGTH
+ | SQL_TOKEN_CONCAT
+ | SQL_TOKEN_DIFFERENCE
+ | SQL_TOKEN_INSERT
+ | SQL_TOKEN_LCASE
+ | SQL_TOKEN_LEFT
+ | SQL_TOKEN_LENGTH
+ | SQL_TOKEN_LOCATE
+ | SQL_TOKEN_LOCATE_2
+ | SQL_TOKEN_LTRIM
+ | SQL_TOKEN_OCTET_LENGTH
+ | SQL_TOKEN_POSITION
+ | SQL_TOKEN_REPEAT
+ | SQL_TOKEN_REPLACE
+ | SQL_TOKEN_RIGHT
+ | SQL_TOKEN_RTRIM
+ | SQL_TOKEN_SOUNDEX
+ | SQL_TOKEN_SPACE
+ | SQL_TOKEN_SUBSTRING
+ | SQL_TOKEN_UCASE
+ ;
+date_function:
+ SQL_TOKEN_CURRENT_DATE
+ | SQL_TOKEN_CURRENT_TIME
+ | SQL_TOKEN_CURRENT_TIMESTAMP
+ | SQL_TOKEN_CURDATE
+ | SQL_TOKEN_CURTIME
+ | SQL_TOKEN_DAYNAME
+ | SQL_TOKEN_DAYOFMONTH
+ | SQL_TOKEN_DAYOFWEEK
+ | SQL_TOKEN_DAYOFYEAR
+ | SQL_TOKEN_EXTRACT
+ | SQL_TOKEN_HOUR
+ | SQL_TOKEN_MINUTE
+ | SQL_TOKEN_MONTH
+ | SQL_TOKEN_MONTHNAME
+ | SQL_TOKEN_NOW
+ | SQL_TOKEN_QUARTER
+ | SQL_TOKEN_SECOND
+ | SQL_TOKEN_TIMESTAMPADD
+ | SQL_TOKEN_TIMESTAMPDIFF
+ | SQL_TOKEN_WEEK
+ | SQL_TOKEN_YEAR
+ ;
+numeric_function:
+ SQL_TOKEN_ABS
+ | SQL_TOKEN_ACOS
+ | SQL_TOKEN_ASIN
+ | SQL_TOKEN_ATAN
+ | SQL_TOKEN_ATAN2
+ | SQL_TOKEN_CEILING
+ | SQL_TOKEN_COS
+ | SQL_TOKEN_COT
+ | SQL_TOKEN_DEGREES
+ | SQL_TOKEN_EXP
+ | SQL_TOKEN_FLOOR
+ | SQL_TOKEN_LOGF
+ | SQL_TOKEN_LOG10
+ | SQL_TOKEN_MOD
+ | SQL_TOKEN_PI
+ | SQL_TOKEN_POWER
+ | SQL_TOKEN_RADIANS
+ | SQL_TOKEN_RAND
+ | SQL_TOKEN_ROUND
+ | SQL_TOKEN_SIGN
+ | SQL_TOKEN_SIN
+ | SQL_TOKEN_SQRT
+ | SQL_TOKEN_TAN
+ | SQL_TOKEN_TRUNCATE
; op_parameter: {$$ = SQL_NEW_RULE;} diff --git a/connectivity/source/parse/sqlflex.l b/connectivity/source/parse/sqlflex.l index ed0a527d33d5..6fb8437633af 100644 --- a/connectivity/source/parse/sqlflex.l +++ b/connectivity/source/parse/sqlflex.l @@ -2,7 +2,7 @@ //-------------------------------------------------------------------------- // -// $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/connectivity/source/parse/sqlflex.l,v 1.13 2001-08-14 13:23:51 oj Exp $ +// $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/connectivity/source/parse/sqlflex.l,v 1.14 2001-09-27 06:12:35 oj Exp $ // // Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. // @@ -10,7 +10,7 @@ // OJ // // Last change: -// $Author: oj $ $Date: 2001-08-14 13:23:51 $ $Revision: 1.13 $ +// $Author: oj $ $Date: 2001-09-27 06:12:35 $ $Revision: 1.14 $ // // Description: // @@ -112,7 +112,8 @@ OSQLScanner* xxx_pGLOBAL_SQLSCAN = NULL; [Aa][Nn][Dd] {SQL_NEW_KEYWORD(SQL_TOKEN_AND); return SQL_TOKEN_AND; } [Aa][Nn][Yy] {SQL_NEW_KEYWORD(SQL_TOKEN_ANY); return SQL_TOKEN_ANY; } [Aa][Ss] {SQL_NEW_KEYWORD(SQL_TOKEN_AS); return SQL_TOKEN_AS; } -[Aa][Ss][Cc] {SQL_NEW_KEYWORD(SQL_TOKEN_ASC); return SQL_TOKEN_ASC; } +[Aa][Ss][Cc] {SQL_NEW_KEYWORD(SQL_TOKEN_ASC); return SQL_TOKEN_ASC; }
+[Aa][Ss][Cc][Ii][Ii] {SQL_NEW_KEYWORD(SQL_TOKEN_ASC); return SQL_TOKEN_ASCII; } [Aa][Tt] {SQL_NEW_KEYWORD(SQL_TOKEN_AT); return SQL_TOKEN_AT; } [Aa][Uu][Tt][Hh][Oo][Rr][Ii][Zz][Aa][Tt][Ii][Oo][Nn] {SQL_NEW_KEYWORD(SQL_TOKEN_AUTHORIZATION); return SQL_TOKEN_AUTHORIZATION; } [Aa][Vv][Gg] {SQL_NEW_KEYWORD(SQL_TOKEN_AVG); return SQL_TOKEN_AVG; } diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx index 67a4711af6e2..26afea39b9d4 100644 --- a/connectivity/source/parse/sqliterator.cxx +++ b/connectivity/source/parse/sqliterator.cxx @@ -2,9 +2,9 @@ * * $RCSfile: sqliterator.cxx,v $ * - * $Revision: 1.26 $ + * $Revision: 1.27 $ * - * last change: $Author: oj $ $Date: 2001-08-24 06:07:23 $ + * last change: $Author: oj $ $Date: 2001-09-27 06:12:35 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -1036,57 +1036,80 @@ void OSQLParseTreeIterator::traverseOnePredicate( OSL_ASSERT("OSQLParseTreeIterator: Fehler im Parse Tree"); } // found a parameter - OSQLColumns::const_iterator aIter = ::connectivity::find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aColumnName,m_aCaseEqual); - if(aIter != m_aSelectColumns->end()) - { - OParseColumn* pNewColumn = new OParseColumn(*aIter,m_aCaseEqual.isCaseSensitive()); - pNewColumn->setName(rValue); - pNewColumn->setRealName(rValue); - m_aParameters->push_back(pNewColumn); + if(SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec)) + {// found a function as column_ref + ::rtl::OUString sFunctionName; + pColumnRef->getChild(0)->parseNodeToStr(sFunctionName,m_xDatabaseMetaData,NULL,sal_False,sal_False); + sal_Int32 nType = ::connectivity::OSQLParser::getFunctionReturnType(sFunctionName,m_pParser ? &m_pParser->getContext() : NULL); + + OParseColumn* pColumn = new OParseColumn( rValue , + ::rtl::OUString(), + ::rtl::OUString(), + ColumnValue::NULLABLE_UNKNOWN, + 0, + 0, + nType, + sal_False, + sal_False, + m_aCaseEqual.isCaseSensitive()); + pColumn->setFunction(sal_True); + pColumn->setRealName(rValue); + m_aParameters->push_back(pColumn); } - else if(aColumnName.getLength())// search in the tables for the right one + else { - OSQLTables::const_iterator aTableIter = m_aTables.end(); - if(aTableRange.getLength()) - aTableIter = m_aTables.find(aTableRange); - if(aTableIter == m_aTables.end()) - aTableIter = m_aTables.begin(); - - for(;aTableIter != m_aTables.end();++aTableIter) + OSQLColumns::const_iterator aIter = ::connectivity::find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aColumnName,m_aCaseEqual); + if(aIter != m_aSelectColumns->end()) + { + OParseColumn* pNewColumn = new OParseColumn(*aIter,m_aCaseEqual.isCaseSensitive()); + pNewColumn->setName(rValue); + pNewColumn->setRealName(rValue); + m_aParameters->push_back(pNewColumn); + } + else if(aColumnName.getLength())// search in the tables for the right one { - if(aTableIter->second.is()) + OSQLTables::const_iterator aTableIter = m_aTables.end(); + if(aTableRange.getLength()) + aTableIter = m_aTables.find(aTableRange); + if(aTableIter == m_aTables.end()) + aTableIter = m_aTables.begin(); + + for(;aTableIter != m_aTables.end();++aTableIter) { - Reference<XNameAccess> xColumns = aTableIter->second->getColumns(); - if(xColumns.is() && xColumns->hasByName(aColumnName)) + if(aTableIter->second.is()) { - Reference<XPropertySet> xColumn; - xColumns->getByName(aColumnName) >>= xColumn; - OParseColumn* pNewColumn = new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive()); - pNewColumn->setName(rValue); - pNewColumn->setRealName(rValue); - m_aParameters->push_back(pNewColumn); - break; + Reference<XNameAccess> xColumns = aTableIter->second->getColumns(); + if(xColumns.is() && xColumns->hasByName(aColumnName)) + { + Reference<XPropertySet> xColumn; + xColumns->getByName(aColumnName) >>= xColumn; + OParseColumn* pNewColumn = new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive()); + pNewColumn->setName(rValue); + pNewColumn->setRealName(rValue); + m_aParameters->push_back(pNewColumn); + break; + } } } } - } - else - { - ::rtl::OUString aNewColName(getUniqueColumnName(rValue)); - - OParseColumn* pColumn = new OParseColumn(aNewColName, - ::rtl::OUString(), - ::rtl::OUString(), - ColumnValue::NULLABLE_UNKNOWN, - 0, - 0, - DataType::VARCHAR, - sal_False, - sal_False, - m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers()); - pColumn->setName(rValue); - pColumn->setRealName(rValue); - m_aParameters->push_back(pColumn); + else + { + ::rtl::OUString aNewColName(getUniqueColumnName(rValue)); + + OParseColumn* pColumn = new OParseColumn(aNewColName, + ::rtl::OUString(), + ::rtl::OUString(), + ColumnValue::NULLABLE_UNKNOWN, + 0, + 0, + DataType::VARCHAR, + sal_False, + sal_False, + m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers()); + pColumn->setName(rValue); + pColumn->setRealName(rValue); + m_aParameters->push_back(pColumn); + } } } else if (SQL_ISRULE(pParseNode,column_ref))// Column-Name (und TableRange): |