summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOcke Janssen <oj@openoffice.org>2001-01-09 12:11:07 +0000
committerOcke Janssen <oj@openoffice.org>2001-01-09 12:11:07 +0000
commitf970ce8e0dc24d0220c96ff0802d21c3834490cf (patch)
tree5b76172b8bbe1fed1269804ea4ef9acaf2d62ccd
parente724c719baca9e90248dce0b67c64f36bb60de5c (diff)
parser changed for table names
-rw-r--r--connectivity/inc/connectivity/sqliterator.hxx7
-rw-r--r--connectivity/inc/connectivity/sqlnode.hxx12
-rw-r--r--connectivity/source/parse/sqlbison.y128
-rw-r--r--connectivity/source/parse/sqliterator.cxx70
-rw-r--r--connectivity/source/parse/sqlnode.cxx45
5 files changed, 187 insertions, 75 deletions
diff --git a/connectivity/inc/connectivity/sqliterator.hxx b/connectivity/inc/connectivity/sqliterator.hxx
index 445e67818878..728645124e38 100644
--- a/connectivity/inc/connectivity/sqliterator.hxx
+++ b/connectivity/inc/connectivity/sqliterator.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: sqliterator.hxx,v $
*
- * $Revision: 1.4 $
+ * $Revision: 1.5 $
*
- * last change: $Author: oj $ $Date: 2000-11-03 13:25:37 $
+ * last change: $Author: oj $ $Date: 2001-01-09 13:11:07 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -319,6 +319,9 @@ namespace connectivity
// Ermittelt fuer eine Funktion, Spalten den zugehoeren TableRange,
// wenn nicht eindeutig, dann leer
sal_Bool getColumnTableRange(const OSQLParseNode* pNode, ::rtl::OUString &rTableRange) const;
+
+ // return true when the tableNode is a rule like catalog_name, schema_name or table_name
+ sal_Bool isTableNode(const OSQLParseNode* _pTableNode) const;
};
}
diff --git a/connectivity/inc/connectivity/sqlnode.hxx b/connectivity/inc/connectivity/sqlnode.hxx
index 79301a8ce369..ce642ce4fe19 100644
--- a/connectivity/inc/connectivity/sqlnode.hxx
+++ b/connectivity/inc/connectivity/sqlnode.hxx
@@ -2,9 +2,9 @@
*
* $RCSfile: sqlnode.hxx,v $
*
- * $Revision: 1.3 $
+ * $Revision: 1.4 $
*
- * last change: $Author: svesik $ $Date: 2000-11-22 16:47:35 $
+ * last change: $Author: oj $ $Date: 2001-01-09 13:11:07 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -162,6 +162,8 @@ namespace connectivity
table_exp,
table_ref_commalist,
table_ref,
+ catalog_name,
+ schema_name,
table_name,
opt_column_commalist,
column_commalist,
@@ -356,6 +358,12 @@ namespace connectivity
// makes the logic formula a little more smaller
static void compress(OSQLParseNode*& pSearchCondition);
+ // return the catalog, schema and tablename form this node
+ // _pTableNode must be a rule of that above or a SQL_TOKEN_NAME
+ static sal_Bool getTableComponents(const OSQLParseNode* _pTableNode,
+ ::com::sun::star::uno::Any &_rCatalog,
+ ::rtl::OUString &_rSchema,
+ ::rtl::OUString &_rTable);
protected:
// ParseNodeToStr konkateniert alle Token (Blaetter) des ParseNodes
diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y
index 5efb8ed5b602..9e718fd2062c 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.8 2000-11-29 10:41:38 oj Exp $
+// $Header: /zpool/svn/migration/cvs_rep_09_09_08/code/connectivity/source/parse/sqlbison.y,v 1.9 2001-01-09 13:07:48 oj Exp $
//
// Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
//
@@ -9,7 +9,7 @@
// OJ
//
// Last change:
-// $Author: oj $ $Date: 2000-11-29 10:41:38 $ $Revision: 1.8 $
+// $Author: oj $ $Date: 2001-01-09 13:07:48 $ $Revision: 1.9 $
//
// Description:
//
@@ -228,7 +228,8 @@ using namespace connectivity;
%type <pParseNode> all query_primary as not for_length upper_lower comparison column_val cross_union /*opt_schema_element_list*/
%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> op_odbc_call_parameter odbc_parameter_commalist odbc_parameter
+%type <pParseNode> catalog_name schema_name table_node
%%
/* Parse Tree an OSQLParser zurueckliefern
@@ -322,7 +323,7 @@ schema_element:
;
base_table_def:
- SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_name '(' base_table_element_commalist ')'
+ SQL_TOKEN_CREATE SQL_TOKEN_TABLE table_node '(' base_table_element_commalist ')'
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -405,11 +406,11 @@ column_def_opt:
$$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
$$->append($3);
$$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
- | SQL_TOKEN_REFERENCES table_name
+ | SQL_TOKEN_REFERENCES table_node
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);}
- | SQL_TOKEN_REFERENCES table_name '(' column_commalist ')'
+ | SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -425,7 +426,7 @@ table_constraint_def:
$$->append($2 = newNode("(", SQL_NODE_PUNCTUATION));
$$->append($3);
$$->append($4 = newNode(")", SQL_NODE_PUNCTUATION));}
- | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_name
+ | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -434,7 +435,7 @@ table_constraint_def:
$$->append($5 = newNode(")", SQL_NODE_PUNCTUATION));
$$->append($6);
$$->append($7);}
- | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_name '(' column_commalist ')'
+ | SQL_TOKEN_FOREIGN SQL_TOKEN_KEY '(' column_commalist ')' SQL_TOKEN_REFERENCES table_node '(' column_commalist ')'
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -472,7 +473,7 @@ column_commalist:
;
view_def:
- SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_name opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option
+ SQL_TOKEN_CREATE SQL_TOKEN_VIEW table_node opt_column_commalist SQL_TOKEN_AS select_statement opt_with_check_option
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -502,7 +503,7 @@ opt_column_commalist:
;
privilege_def:
- SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_name SQL_TOKEN_TO grantee_commalist
+ SQL_TOKEN_GRANT privileges SQL_TOKEN_ON table_node SQL_TOKEN_TO grantee_commalist
opt_with_grant_option
{$$ = SQL_NEW_RULE;
$$->append($1);
@@ -679,7 +680,7 @@ commit_statement:
;
/*
delete_statement_positioned:
- SQL_TOKEN_DELETE SQL_TOKEN_FROM table_name SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
+ SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -691,7 +692,7 @@ delete_statement_positioned:
;
*/
delete_statement_searched:
- SQL_TOKEN_DELETE SQL_TOKEN_FROM table_name opt_where_clause
+ SQL_TOKEN_DELETE SQL_TOKEN_FROM table_node opt_where_clause
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -709,7 +710,7 @@ fetch_statement:
;
insert_statement:
- SQL_TOKEN_INSERT SQL_TOKEN_INTO table_name opt_column_commalist values_or_query_spec
+ SQL_TOKEN_INSERT SQL_TOKEN_INTO table_node opt_column_commalist values_or_query_spec
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -791,7 +792,7 @@ opt_all_distinct:
;
/*
update_statement_positioned:
- SQL_TOKEN_UPDATE table_name SQL_TOKEN_SET assignment_commalist
+ SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist
SQL_TOKEN_WHERE SQL_TOKEN_CURRENT SQL_TOKEN_OF cursor
{$$ = SQL_NEW_RULE;
$$->append($1);
@@ -826,7 +827,7 @@ update_source:
| SQL_TOKEN_DEFAULT
;
update_statement_searched:
- SQL_TOKEN_UPDATE table_name SQL_TOKEN_SET assignment_commalist opt_where_clause
+ SQL_TOKEN_UPDATE table_node SQL_TOKEN_SET assignment_commalist opt_where_clause
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2);
@@ -925,12 +926,12 @@ as:
}
;
table_ref:
- table_name
+ table_node
{
$$ = SQL_NEW_RULE;
$$->append($1);
}
- | table_name as range_variable op_column_commalist
+ | table_node as range_variable op_column_commalist
{
$$ = SQL_NEW_RULE;
$$->append($1);
@@ -1506,14 +1507,15 @@ scalar_exp_commalist:
}
;
select_sublist:
- table_name '.' '*'
+/* table_node '.' '*'
{
$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
$$->append($3 = newNode("*", SQL_NODE_PUNCTUATION));
- }
- | derived_column
+ }
+*/
+ derived_column
;
@@ -1777,7 +1779,7 @@ op_parameter:
}
;
odbc_call_spec:
- op_parameter SQL_TOKEN_CALL table_name op_odbc_call_parameter
+ op_parameter SQL_TOKEN_CALL table_node op_odbc_call_parameter
{
$$ = SQL_NEW_RULE;
$$->append($1);
@@ -2027,7 +2029,7 @@ cast_operand:
| SQL_TOKEN_NULL
;
cast_target:
- table_name
+ table_node
| data_type
;
cast_spec:
@@ -2441,7 +2443,7 @@ char_primary:
}
;
collate_clause:
- SQL_TOKEN_COLLATE table_name
+ SQL_TOKEN_COLLATE table_node
{
$$ = SQL_NEW_RULE;
$$->append($1);
@@ -2597,7 +2599,7 @@ fold:
}
;
form_conversion:
- SQL_TOKEN_CONVERT '(' string_value_exp SQL_TOKEN_USING table_name ')'
+ SQL_TOKEN_CONVERT '(' string_value_exp SQL_TOKEN_USING table_node ')'
{
$$ = SQL_NEW_RULE;
$$->append($1);
@@ -2609,7 +2611,7 @@ form_conversion:
}
;
char_translation:
- SQL_TOKEN_TRANSLATE '(' string_value_exp SQL_TOKEN_USING table_name ')'
+ SQL_TOKEN_TRANSLATE '(' string_value_exp SQL_TOKEN_USING table_node ')'
{
$$ = SQL_NEW_RULE;
$$->append($1);
@@ -2662,12 +2664,43 @@ derived_column:
$$->append($2);
}
;
-/* Tabellenname */
+/* Tabellenname */
+table_node:
+ catalog_name
+ | schema_name
+ | table_name
+;
+catalog_name:
+ SQL_TOKEN_NAME '.' schema_name
+ {
+ $$ = SQL_NEW_RULE;
+ $$->append($1);
+ $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
+ $$->append($3);
+ }
+ | SQL_TOKEN_NAME ':' schema_name
+ {
+ $$ = SQL_NEW_RULE;
+ $$->append($1);
+ $$->append($2 = newNode(":", SQL_NODE_PUNCTUATION));
+ $$->append($3);
+ }
+;
+schema_name:
+ SQL_TOKEN_NAME '.' table_name
+ {
+ $$ = SQL_NEW_RULE;
+ $$->append($1);
+ $$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
+ $$->append($3);
+ }
+;
+
table_name:
SQL_TOKEN_NAME
{$$ = SQL_NEW_RULE;
$$->append($1);}
- | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME %prec SQL_TOKEN_NAME
+/* | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME %prec SQL_TOKEN_NAME
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
@@ -2693,17 +2726,18 @@ table_name:
$$->append($3);
$$->append($4 = newNode(".", SQL_NODE_PUNCTUATION));
$$->append($5);}
-*/ ;
+*/ ;
+/* Columns */
column_ref:
column
{$$ = SQL_NEW_RULE;
$$->append($1);}
- | SQL_TOKEN_NAME '.' column_val %prec '.'
+ | table_node '.' column_val %prec '.'
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
$$->append($3);}
- | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
+/* | SQL_TOKEN_NAME '.' SQL_TOKEN_NAME '.' column_val %prec '.'
{$$ = SQL_NEW_RULE;
$$->append($1);
$$->append($2 = newNode(".", SQL_NODE_PUNCTUATION));
@@ -3294,9 +3328,8 @@ OSQLParseNode* OSQLParser::predicateTree(::rtl::OUString& rErrorMessage, const :
// get the field type
m_xField->getPropertyValue(FIELD_STR_TYPE) >>= nType;
}
- catch(Exception&)
- {
- OSL_ENSHURE(0,"OSQLParser::predicateTree throws an Exception!");
+ catch ( ... )
+ {
}
if (m_nFormatKey && m_xFormatter.is())
@@ -3462,7 +3495,11 @@ sal_uInt32 OSQLParser::RuleID(OSQLParseNode::Rule eRule)
case OSQLParseNode::table_exp:
s_nRuleIDs[eRule] = StrToRuleID("table_exp"); break;
case OSQLParseNode::table_ref:
- s_nRuleIDs[eRule] = StrToRuleID("table_ref"); break;
+ s_nRuleIDs[eRule] = StrToRuleID("table_ref"); break;
+ case OSQLParseNode::catalog_name:
+ s_nRuleIDs[eRule] = StrToRuleID("catalog_name"); break;
+ case OSQLParseNode::schema_name:
+ s_nRuleIDs[eRule] = StrToRuleID("schema_name"); break;
case OSQLParseNode::table_name:
s_nRuleIDs[eRule] = StrToRuleID("table_name"); break;
case OSQLParseNode::opt_column_commalist:
@@ -3632,7 +3669,6 @@ sal_uInt32 OSQLParser::RuleID(OSQLParseNode::Rule eRule)
}
catch(Exception&)
{
- OSL_ENSHURE(0,"OSQLParser::stringToDouble throws an Exception!");
}
}
return aValue;
@@ -3669,9 +3705,8 @@ sal_Int16 OSQLParser::buildNode_STR_NUM(OSQLParseNode*& pAppend,OSQLParseNode*&
m_nFormatKey, rtl::OUString::createFromAscii("Decimals"));
aValue >>= nScale;
}
- catch(Exception&)
- {
- OSL_ENSHURE(0,"OSQLParser::buildNode_STR_NUM throws an Exception!");
+ catch ( ... )
+ {
}
pComp->append(new OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING));
@@ -3764,7 +3799,7 @@ sal_Int16 OSQLParser::buildLikeRule(OSQLParseNode*& pAppend, OSQLParseNode*& pLi
aValue >>= nType;
}
}
- catch(Exception&)
+ catch ( ... )
{
return nErg;
}
@@ -3798,9 +3833,8 @@ sal_Int16 OSQLParser::buildLikeRule(OSQLParseNode*& pAppend, OSQLParseNode*& pLi
m_nFormatKey, rtl::OUString::createFromAscii("Decimals"));
aValue >>= nScale;
}
- catch(Exception&)
- {
- OSL_ENSHURE(0,"OSQLParser::SQL_NODE_APPROXNUM throws an Exception!");
+ catch ( ... )
+ {
}
pAppend->append(new OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING));
@@ -3879,7 +3913,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode*
aValue >>= nType;
}
}
- catch(Exception&)
+ catch ( ... )
{
return nErg;
}
@@ -3920,7 +3954,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode*
double fValue = m_xFormatter->convertStringToNumber(m_nFormatKey, pLiteral->getTokenValue().getStr());
nErg = buildNode_Date(fValue, nType, pAppend,pLiteral,pCompare);
}
- catch(Exception&)
+ catch ( ... )
{
try
{
@@ -3940,7 +3974,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode*
}
}
- catch(Exception&)
+ catch ( ... )
{
nErg = -1;
m_sErrorMessage = m_pContext->getErrorMessage(OParseContext::ERROR_INVALID_DATE_COMPARE);
@@ -3969,7 +4003,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode*
double fValue = m_xFormatter->convertStringToNumber(m_nFormatKey, pLiteral->getTokenValue().getStr());
nErg = buildNode_Date(fValue, nType, pAppend,pLiteral,pCompare);
}
- catch(Exception&)
+ catch ( ... )
{
try
{
@@ -3988,7 +4022,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode*
m_sErrorMessage = m_pContext->getErrorMessage(OParseContext::ERROR_INVALID_DATE_COMPARE);
}
}
- catch(Exception&)
+ catch ( ... )
{
nErg = -1;
m_sErrorMessage = m_pContext->getErrorMessage(OParseContext::ERROR_INVALID_DATE_COMPARE);
diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx
index 0e182caada95..d17550d47407 100644
--- a/connectivity/source/parse/sqliterator.cxx
+++ b/connectivity/source/parse/sqliterator.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: sqliterator.cxx,v $
*
- * $Revision: 1.11 $
+ * $Revision: 1.12 $
*
- * last change: $Author: oj $ $Date: 2001-01-04 10:59:52 $
+ * last change: $Author: oj $ $Date: 2001-01-09 13:07:48 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -209,26 +209,37 @@ void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableNam
OSL_ENSHURE(pTableName != NULL,"OSQLParseTreeIterator::traverseOneTableName: pTableName == NULL");
- ::rtl::OUString aTableName;
+ Any aCatalog;
+ ::rtl::OUString aSchema,aTableName,aComposedName;
::rtl::OUString aTableRange(rTableRange);
// Tabellenname abholen
- pTableName->parseNodeToStr(aTableName,m_xDatabaseMetaData,NULL,sal_False,sal_False);
- // Wenn keine Range Variable angegeben, dann den Tabellennamen verwenden.
+ OSQLParseNode::getTableComponents(pTableName,aCatalog,aSchema,aTableName);
+
+ // create the composed name like DOMAIN.USER.TABLE1
+ ::dbtools::composeTableName(m_xDatabaseMetaData,
+ aCatalog.hasValue() ? ::comphelper::getString(aCatalog) : ::rtl::OUString(),
+ aSchema,
+ aTableName,
+ aComposedName,
+ sal_False);
+ // if there is no alias for the table name assign the orignal name to it
if (!aTableRange.getLength())
- aTableRange = aTableName;
+ aTableRange = aComposedName;
- if(aTableName.getLength())
+ if(aComposedName.getLength())
{
try
{
- if(!m_xTables->hasByName(aTableName)) // name not in XNameAccess
+ if(!m_xTables->hasByName(aComposedName)) // name not in XNameAccess
{
+ // exists the name in the metadata ?!
+ if(!aSchema.getLength())
+ aSchema = ::rtl::OUString::createFromAscii("%");
- const ::rtl::OUString sAll = ::rtl::OUString::createFromAscii("%");
Sequence< ::rtl::OUString > aSeq;
- Reference< XResultSet> xRes = m_xDatabaseMetaData->getTables(Any(),sAll,aTableName,aSeq);
- aTableName = ::rtl::OUString(); // now clear the name to avoid reassignment
+ Reference< XResultSet> xRes = m_xDatabaseMetaData->getTables(aCatalog,aSchema,aTableName,aSeq);
+ aComposedName = ::rtl::OUString(); // now clear the name to avoid reassignment
if(xRes.is() && xRes->next())
{
::rtl::OUString sCatalog, sSchema, sName;
@@ -236,12 +247,12 @@ void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableNam
::dbtools::composeTableName(m_xDatabaseMetaData, xCurrentRow->getString(1),
xCurrentRow->getString(2),
xCurrentRow->getString(3),
- aTableName,
+ aComposedName,
sal_False);
}
}
- if(m_xTables->hasByName(aTableName)) // the name can be changed before
- m_xTables->getByName(aTableName) >>= m_aTables[aTableRange];
+ if(m_xTables->hasByName(aComposedName)) // the name can be changed before
+ m_xTables->getByName(aComposedName) >>= m_aTables[aTableRange];
}
catch(Exception&)
@@ -258,16 +269,20 @@ OSQLParseNode * OSQLParseTreeIterator::getQualified_join(OSQLParseNode *pTableRe
aTableRange = ::rtl::OUString();
OSQLParseNode *pNode = getTableRef(pTableRef->getChild(0),aTableRange);
- if(pNode)
+ if(isTableNode(pNode))
traverseOneTableName(pNode,aTableRange);
+ else
+ OSL_ENSURE(0,"To tableNode found!");
sal_uInt32 nPos = 4;
if(SQL_ISRULE(pTableRef,cross_union) || pTableRef->getChild(1)->getTokenID() != SQL_TOKEN_NATURAL)
nPos = 3;
pNode = getTableRef(pTableRef->getChild(nPos),aTableRange);
- if(pNode)
+ if(isTableNode(pNode))
traverseOneTableName(pNode,aTableRange);
+ else
+ OSL_ENSURE(0,"To tableNode found!");
return pNode;
}
//-----------------------------------------------------------------------------
@@ -285,7 +300,7 @@ OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rt
else
{
// Tabellennamen gefunden
- if(!SQL_ISRULE(pTableName,table_name))
+ if(!isTableNode(pTableName))
pTableName = pTableRef->getChild(0);
aTableRange = ::rtl::OUString();
if(pTableRef->count() == 4)
@@ -340,16 +355,16 @@ void OSQLParseTreeIterator::getSelect_statement(OSQLParseNode *pSelect)
{ // from clause durchlaufen
aTableRange = ::rtl::OUString();
- if (SQL_ISRULE(pTableRefCommalist->getChild(i),table_name))
+ if (isTableNode(pTableRefCommalist->getChild(i)))
{
pTableName = pTableRefCommalist->getChild(i);
- traverseOneTableName(pTableName,aTableRange);// Keine Range Variable
+ traverseOneTableName(pTableName,aTableRange);// aTableRange will be set inside to the tablename
}
else if (SQL_ISRULE(pTableRefCommalist->getChild(i),table_ref))
{
// Tabellenreferenz kann aus Tabellennamen, Tabellennamen (+),'('joined_table')'(+) bestehen
pTableName = pTableRefCommalist->getChild(i)->getChild(0);
- if (SQL_ISRULE(pTableName,table_name))
+ if(isTableNode(pTableName))
{ // Tabellennamen gefunden
if(pTableRefCommalist->getChild(i)->count() == 4) // Tabellenrange an Pos 2
aTableRange = pTableRefCommalist->getChild(i)->getChild(2)->getTokenValue();
@@ -534,14 +549,18 @@ void OSQLParseTreeIterator::traverseSelectColumnNames(const OSQLParseNode* pSele
}
else if (SQL_ISRULE(pSelectNode->getChild(2),scalar_exp_commalist))
{
- // SELECT column(,column) oder SELECT COUNT(*) ...
+ // SELECT column[,column] oder SELECT COUNT(*) ...
OSQLParseNode * pSelection = pSelectNode->getChild(2);
for (sal_uInt32 i = 0; i < pSelection->count(); i++)
{
OSQLParseNode *pColumnRef = pSelection->getChild(i);
- if (SQL_ISRULE(pColumnRef,select_sublist))
+ //if (SQL_ISRULE(pColumnRef,select_sublist))
+ if (SQL_ISRULE(pColumnRef,derived_column) &&
+ SQL_ISRULE(pColumnRef->getChild(0),column_ref) &&
+ pColumnRef->getChild(0)->count() == 3 &&
+ SQL_ISPUNCTUATION(pColumnRef->getChild(0)->getChild(2),"*"))
{
// alle Spalten der Tabelle
::rtl::OUString aTableRange;
@@ -1448,5 +1467,12 @@ const OSQLParseNode* OSQLParseTreeIterator::getHavingTree() const
pHavingClause = NULL;
return pHavingClause;
}
+// -----------------------------------------------------------------------------
+sal_Bool OSQLParseTreeIterator::isTableNode(const OSQLParseNode* _pTableNode) const
+{
+ return _pTableNode && (SQL_ISRULE(_pTableNode,catalog_name) ||
+ SQL_ISRULE(_pTableNode,schema_name) ||
+ SQL_ISRULE(_pTableNode,table_name));
+}
diff --git a/connectivity/source/parse/sqlnode.cxx b/connectivity/source/parse/sqlnode.cxx
index 3a3405551bc3..5164e1e4843a 100644
--- a/connectivity/source/parse/sqlnode.cxx
+++ b/connectivity/source/parse/sqlnode.cxx
@@ -2,9 +2,9 @@
*
* $RCSfile: sqlnode.cxx,v $
*
- * $Revision: 1.7 $
+ * $Revision: 1.8 $
*
- * last change: $Author: svesik $ $Date: 2000-11-22 16:51:52 $
+ * last change: $Author: oj $ $Date: 2001-01-09 13:07:48 $
*
* The Contents of this file are made available subject to the terms of
* either of the following licenses
@@ -1399,5 +1399,46 @@ OSQLParseNode* OSQLParseNode::replace (OSQLParseNode* pOldSubNode, OSQLParseNode
::std::replace(m_aChilds.begin(), m_aChilds.end(), pOldSubNode, pNewSubNode);
return pOldSubNode;
}
+// -----------------------------------------------------------------------------
+sal_Bool OSQLParseNode::getTableComponents(const OSQLParseNode* _pTableNode,
+ ::com::sun::star::uno::Any &_rCatalog,
+ ::rtl::OUString &_rSchema,
+ ::rtl::OUString &_rTable)
+{
+ OSL_ENSURE(_pTableNode,"Wrong use of getTableComponents! _pTableNode is not allowed to be null!");
+ if(_pTableNode)
+ {
+ const OSQLParseNode* pTableNode = _pTableNode;
+ // clear the parameter given
+ _rCatalog = Any();
+ _rSchema = _rTable = ::rtl::OUString();
+ // see rule catalog_name: in sqlbison.y
+ if (SQL_ISRULE(pTableNode,catalog_name))
+ {
+ OSL_ENSURE(pTableNode->getChild(0) && pTableNode->getChild(0)->isToken(),"Invalid parsenode!");
+ _rCatalog <<= pTableNode->getChild(0)->getTokenValue();
+ pTableNode = pTableNode->getChild(2);
+ }
+ // check if we have schema_name rule
+ if(SQL_ISRULE(pTableNode,schema_name))
+ {
+ _rSchema = pTableNode->getChild(0)->getTokenValue();
+ pTableNode = pTableNode->getChild(2);
+ }
+ // check if we have table_name rule
+ if(SQL_ISRULE(pTableNode,table_name))
+ {
+ _rTable = pTableNode->getChild(0)->getTokenValue();
+ }
+ else
+ {
+ OSL_ENSURE(0,"Error in parse tree!");
+ }
+ }
+ return _rTable.getLength() != 0;
+}
+// -----------------------------------------------------------------------------
+
+