Skip to content

Commit b1fd7d8

Browse files
committed
Fix #8597 - Unable to restore database to Firebird 6.0 (with schemas) from ODS 13.1 if stored procedure/function has TYPE OF COLUMN parameter systemtable.systemcolumn.
1 parent affc1df commit b1fd7d8

File tree

3 files changed

+37
-33
lines changed

3 files changed

+37
-33
lines changed

src/jrd/Routine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ void Routine::parseMessages(thread_db* tdbb, CompilerScratch* csb, BlrReader blr
191191
csb->csb_schema = name.schema;
192192
csb->csb_blr_reader = blrReader;
193193

194-
csb->csb_blr_reader.parseHeader();
194+
PAR_getBlrVersionAndFlags(csb);
195195

196196
if (csb->csb_blr_reader.getByte() != blr_begin)
197197
status_exception::raise(Arg::Gds(isc_metadata_corrupt));

src/jrd/par.cpp

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ static NodeParseFunc blr_parsers[256] = {NULL};
7979

8080
static void par_error(BlrReader& blrReader, const Arg::StatusVector& v, bool isSyntaxError = true);
8181
static PlanNode* par_plan(thread_db*, CompilerScratch*);
82-
static void getBlrVersionAndFlags(CompilerScratch* csb);
8382
static void parseSubRoutines(thread_db* tdbb, CompilerScratch* csb);
8483
static void setNodeLineColumn(CompilerScratch* csb, DmlNode* node, ULONG blrOffset);
8584

@@ -186,7 +185,7 @@ DmlNode* PAR_blr(thread_db* tdbb, const MetaName* schema, jrd_rel* relation, con
186185

187186
csb->csb_blr_reader = BlrReader(blr, blr_length);
188187

189-
getBlrVersionAndFlags(csb);
188+
PAR_getBlrVersionAndFlags(csb);
190189

191190
csb->csb_node = PAR_parse_node(tdbb, csb);
192191

@@ -239,7 +238,7 @@ BoolExprNode* PAR_validation_blr(thread_db* tdbb, const MetaName* schema, jrd_re
239238

240239
csb->csb_blr_reader = BlrReader(blr, blr_length);
241240

242-
getBlrVersionAndFlags(csb);
241+
PAR_getBlrVersionAndFlags(csb);
243242

244243
if (csb->csb_blr_reader.peekByte() == blr_stmt_expr)
245244
{
@@ -621,6 +620,38 @@ ValueExprNode* PAR_gen_field(thread_db* tdbb, StreamType stream, USHORT id, bool
621620
}
622621

623622

623+
// Get the BLR version from the CSB stream and complain if it's unknown.
624+
void PAR_getBlrVersionAndFlags(CompilerScratch* csb)
625+
{
626+
BlrReader::Flags flags;
627+
const SSHORT version = csb->csb_blr_reader.parseHeader(&flags);
628+
629+
switch (version)
630+
{
631+
case blr_version4:
632+
csb->blrVersion = 4;
633+
break;
634+
635+
case blr_version5:
636+
csb->blrVersion = 5;
637+
break;
638+
639+
//case blr_version6:
640+
// csb->blrVersion = 6;
641+
// break;
642+
643+
default:
644+
PAR_error(csb,
645+
Arg::Gds(isc_metadata_corrupt) <<
646+
Arg::Gds(isc_wroblrver2) <<
647+
Arg::Num(blr_version4) << Arg::Num(blr_version5/*6*/) << Arg::Num(version));
648+
}
649+
650+
if (flags.searchSystemSchema)
651+
csb->csb_g_flags |= csb_search_system_schema;
652+
}
653+
654+
624655
ValueExprNode* PAR_make_field(thread_db* tdbb, CompilerScratch* csb, USHORT context,
625656
const MetaName& base_field)
626657
{
@@ -726,7 +757,7 @@ CompilerScratch* PAR_parse(thread_db* tdbb, const UCHAR* blr, ULONG blr_length,
726757
csb->csb_schema = SYSTEM_SCHEMA;
727758
}
728759

729-
getBlrVersionAndFlags(csb);
760+
PAR_getBlrVersionAndFlags(csb);
730761

731762
if (dbginfo_length > 0)
732763
DBG_parse_debug_info(dbginfo_length, dbginfo, *csb->csb_dbg_info);
@@ -1663,34 +1694,6 @@ void PAR_warning(const Arg::StatusVector& v)
16631694
}
16641695

16651696

1666-
// Get the BLR version from the CSB stream and complain if it's unknown.
1667-
static void getBlrVersionAndFlags(CompilerScratch* csb)
1668-
{
1669-
BlrReader::Flags flags;
1670-
const SSHORT version = csb->csb_blr_reader.parseHeader(&flags);
1671-
1672-
switch (version)
1673-
{
1674-
case blr_version4:
1675-
csb->blrVersion = 4;
1676-
break;
1677-
case blr_version5:
1678-
csb->blrVersion = 5;
1679-
break;
1680-
//case blr_version6:
1681-
// csb->blrVersion = 6;
1682-
// break;
1683-
default:
1684-
PAR_error(csb, Arg::Gds(isc_metadata_corrupt) <<
1685-
Arg::Gds(isc_wroblrver2) << Arg::Num(blr_version4) << Arg::Num(blr_version5/*6*/) <<
1686-
Arg::Num(version));
1687-
}
1688-
1689-
if (flags.searchSystemSchema)
1690-
csb->csb_g_flags |= csb_search_system_schema;
1691-
}
1692-
1693-
16941697
// Parse subroutines.
16951698
static void parseSubRoutines(thread_db* tdbb, CompilerScratch* csb)
16961699
{

src/jrd/par_proto.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ USHORT PAR_desc(Jrd::thread_db*, Jrd::CompilerScratch*, dsc*, Jrd::ItemInfo* =
6262
void PAR_error(Jrd::CompilerScratch*, const Firebird::Arg::StatusVector&, bool isSyntaxError = true);
6363
SSHORT PAR_find_proc_field(const Jrd::jrd_prc*, const Jrd::MetaName&);
6464
Jrd::ValueExprNode* PAR_gen_field(Jrd::thread_db* tdbb, StreamType stream, USHORT id, bool byId = false);
65+
void PAR_getBlrVersionAndFlags(Jrd::CompilerScratch* csb);
6566
Jrd::ValueExprNode* PAR_make_field(Jrd::thread_db*, Jrd::CompilerScratch*, USHORT, const Jrd::MetaName&);
6667
Jrd::CompoundStmtNode* PAR_make_list(Jrd::thread_db*, Jrd::StmtNodeStack&);
6768
ULONG PAR_marks(Jrd::CompilerScratch*);

0 commit comments

Comments
 (0)