diff options
author | Ocke Janssen <oj@openoffice.org> | 2001-01-09 12:11:07 +0000 |
---|---|---|
committer | Ocke Janssen <oj@openoffice.org> | 2001-01-09 12:11:07 +0000 |
commit | f970ce8e0dc24d0220c96ff0802d21c3834490cf (patch) | |
tree | 5b76172b8bbe1fed1269804ea4ef9acaf2d62ccd | |
parent | e724c719baca9e90248dce0b67c64f36bb60de5c (diff) |
parser changed for table names
-rw-r--r-- | connectivity/inc/connectivity/sqliterator.hxx | 7 | ||||
-rw-r--r-- | connectivity/inc/connectivity/sqlnode.hxx | 12 | ||||
-rw-r--r-- | connectivity/source/parse/sqlbison.y | 128 | ||||
-rw-r--r-- | connectivity/source/parse/sqliterator.cxx | 70 | ||||
-rw-r--r-- | connectivity/source/parse/sqlnode.cxx | 45 |
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; +} +// ----------------------------------------------------------------------------- + + |