summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--connectivity/inc/connectivity/PColumn.hxx8
-rw-r--r--connectivity/inc/connectivity/sqlparse.hxx6
-rw-r--r--connectivity/source/parse/sqlbison.y112
-rw-r--r--connectivity/source/parse/sqlflex.l7
-rw-r--r--connectivity/source/parse/sqliterator.cxx113
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):