From: <asf...@us...> - 2010-06-20 03:09:31
|
Revision: 51272 http://firebird.svn.sourceforge.net/firebird/?rev=51272&view=rev Author: asfernandes Date: 2010-06-20 03:09:25 +0000 (Sun, 20 Jun 2010) Log Message: ----------- Fixed CORE-3047 - Wrong logic is used to resolve EXECUTE BLOCK parameters collations Modified Paths: -------------- firebird/trunk/src/dsql/ddl.cpp firebird/trunk/src/dsql/dsql.cpp Modified: firebird/trunk/src/dsql/ddl.cpp =================================================================== --- firebird/trunk/src/dsql/ddl.cpp 2010-06-18 16:48:33 UTC (rev 51271) +++ firebird/trunk/src/dsql/ddl.cpp 2010-06-20 03:09:25 UTC (rev 51272) @@ -77,6 +77,7 @@ #include "../dsql/dsql.h" #include "../dsql/node.h" #include "../jrd/ibase.h" +#include "../jrd/Attachment.h" #include "../jrd/intl.h" #include "../jrd/intl_classes.h" #include "../jrd/jrd.h" @@ -333,6 +334,8 @@ return; } + dsqlScratch->getStatement()->setDdlNode(node); + if (node->nod_type != nod_class_stmtnode) dsqlScratch->appendUChar(isc_dyn_version_1); @@ -561,8 +564,25 @@ { // Attach the database default character set, if not otherwise specified - const dsql_str* dfl_charset = METD_get_default_charset(dsqlScratch->getTransaction()); + const dsql_str* dfl_charset = NULL; + if (dsqlScratch->getStatement()->getDdlNode() || + (dsqlScratch->flags & ( + DsqlCompilerScratch::FLAG_FUNCTION | DsqlCompilerScratch::FLAG_PROCEDURE | + DsqlCompilerScratch::FLAG_TRIGGER))) + { + dfl_charset = METD_get_default_charset(dsqlScratch->getTransaction()); + } + else + { + USHORT charSet = dsqlScratch->getAttachment()->dbb_attachment->att_charset; + if (charSet != CS_NONE) + { + MetaName charSetName = METD_get_charset_name(dsqlScratch->getTransaction(), charSet); + dfl_charset = MAKE_string(charSetName.c_str(), charSetName.length()); + } + } + if (dfl_charset) field->fld_character_set = (dsql_nod*) dfl_charset; else @@ -2029,12 +2049,13 @@ DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - const dsql_str* coll_name = (dsql_str*) statement->getDdlNode()->nod_arg[e_def_coll_name]; - const dsql_str* coll_for = (dsql_str*) statement->getDdlNode()->nod_arg[e_def_coll_for]; - const dsql_nod* coll_from = statement->getDdlNode()->nod_arg[e_def_coll_from]; - const dsql_nod* coll_attributes = statement->getDdlNode()->nod_arg[e_def_coll_attributes]; + const dsql_nod* ddlNode = statement->getDdlNode(); + const dsql_str* coll_name = (dsql_str*) ddlNode->nod_arg[e_def_coll_name]; + const dsql_str* coll_for = (dsql_str*) ddlNode->nod_arg[e_def_coll_for]; + const dsql_nod* coll_from = ddlNode->nod_arg[e_def_coll_from]; + const dsql_nod* coll_attributes = ddlNode->nod_arg[e_def_coll_attributes]; const dsql_nod* coll_specific_attributes = - PASS1_node(dsqlScratch, statement->getDdlNode()->nod_arg[e_def_coll_specific_attributes]); + PASS1_node(dsqlScratch, ddlNode->nod_arg[e_def_coll_specific_attributes]); const dsql_intlsym* resolved_charset = METD_get_charset(dsqlScratch->getTransaction(), (USHORT) strlen(coll_for->str_data), @@ -3614,9 +3635,6 @@ **************************************/ const dsql_str* string; - DsqlCompiledStatement* statement = dsqlScratch->getStatement(); - statement->setDdlNode(node); - switch (node->nod_type) { case nod_def_domain: Modified: firebird/trunk/src/dsql/dsql.cpp =================================================================== --- firebird/trunk/src/dsql/dsql.cpp 2010-06-18 16:48:33 UTC (rev 51271) +++ firebird/trunk/src/dsql/dsql.cpp 2010-06-20 03:09:25 UTC (rev 51272) @@ -2539,7 +2539,7 @@ if (!node) { - // CVC: Apparently, dsql_ypparse won't return if the command is incomplete, + // CVC: Apparently, Parser::parse won't return if the command is incomplete, // because yyerror() will call ERRD_post(). // This may be a special case, but we don't know about positions here. ERRD_post(Arg::Gds(isc_sqlerr) << Arg::Num(-104) << This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |