mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-01-23 22:03:03 +01:00
Make MOV_move know how to move blobs.
This fixes CORE-1147: Blobs are not converted to string in UDF parameters.
This commit is contained in:
parent
76f9f12d57
commit
2100a06c84
@ -2509,7 +2509,7 @@ static void move_to_string(thread_db* tdbb, dsc* fromDesc, dsc* toDesc)
|
|||||||
blobAsText.dsc_address = buffer.begin();
|
blobAsText.dsc_address = buffer.begin();
|
||||||
blobAsText.dsc_length = (USHORT)len;
|
blobAsText.dsc_length = (USHORT)len;
|
||||||
|
|
||||||
MOV_move(&blobAsText, toDesc);
|
MOV_move(tdbb, &blobAsText, toDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2574,6 +2574,8 @@ static void slice_callback(array_slice* arg, ULONG count, DSC* descriptors)
|
|||||||
* Perform slice assignment.
|
* Perform slice assignment.
|
||||||
*
|
*
|
||||||
**************************************/
|
**************************************/
|
||||||
|
thread_db* tdbb = JRD_get_thread_data();
|
||||||
|
|
||||||
dsc* array_desc = descriptors;
|
dsc* array_desc = descriptors;
|
||||||
dsc* slice_desc = &arg->slice_desc;
|
dsc* slice_desc = &arg->slice_desc;
|
||||||
BLOB_PTR* const next =
|
BLOB_PTR* const next =
|
||||||
@ -2627,7 +2629,7 @@ static void slice_callback(array_slice* arg, ULONG count, DSC* descriptors)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MOV_move(slice_desc, array_desc);
|
MOV_move(tdbb, slice_desc, array_desc);
|
||||||
}
|
}
|
||||||
const BLOB_PTR* const end =
|
const BLOB_PTR* const end =
|
||||||
array_desc->dsc_address + array_desc->dsc_length;
|
array_desc->dsc_address + array_desc->dsc_length;
|
||||||
@ -2662,10 +2664,10 @@ static void slice_callback(array_slice* arg, ULONG count, DSC* descriptors)
|
|||||||
sizeof(USHORT));
|
sizeof(USHORT));
|
||||||
temp_desc.dsc_address =
|
temp_desc.dsc_address =
|
||||||
array_desc->dsc_address + sizeof(USHORT);
|
array_desc->dsc_address + sizeof(USHORT);
|
||||||
MOV_move(&temp_desc, slice_desc);
|
MOV_move(tdbb, &temp_desc, slice_desc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
MOV_move(array_desc, slice_desc);
|
MOV_move(tdbb, array_desc, slice_desc);
|
||||||
++arg->slice_count;
|
++arg->slice_count;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1671,7 +1671,7 @@ USHORT EVL_group(thread_db* tdbb, RecordSource* rsb, jrd_nod *const node, USHORT
|
|||||||
reinterpret_cast<ULONG**>(&data));
|
reinterpret_cast<ULONG**>(&data));
|
||||||
MOVE_CLEAR(data, ROUNDUP_LONG(asb->asb_key_desc->skd_length));
|
MOVE_CLEAR(data, ROUNDUP_LONG(asb->asb_key_desc->skd_length));
|
||||||
asb->asb_desc.dsc_address = data;
|
asb->asb_desc.dsc_address = data;
|
||||||
MOV_move(desc, &asb->asb_desc);
|
MOV_move(tdbb, desc, &asb->asb_desc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1739,7 +1739,7 @@ USHORT EVL_group(thread_db* tdbb, RecordSource* rsb, jrd_nod *const node, USHORT
|
|||||||
SET_NULL(record, id);
|
SET_NULL(record, id);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
MOV_move(&impure->vlu_desc, EVL_expr(tdbb, field));
|
MOV_move(tdbb, &impure->vlu_desc, EVL_expr(tdbb, field));
|
||||||
CLEAR_NULL(record, id);
|
CLEAR_NULL(record, id);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1759,7 +1759,7 @@ USHORT EVL_group(thread_db* tdbb, RecordSource* rsb, jrd_nod *const node, USHORT
|
|||||||
temp.dsc_sub_type = 0;
|
temp.dsc_sub_type = 0;
|
||||||
temp.dsc_address = (UCHAR *) & d;
|
temp.dsc_address = (UCHAR *) & d;
|
||||||
d = MOV_get_double(&impure->vlu_desc) / impure->vlux_count;
|
d = MOV_get_double(&impure->vlu_desc) / impure->vlux_count;
|
||||||
MOV_move(&temp, EVL_expr(tdbb, field));
|
MOV_move(tdbb, &temp, EVL_expr(tdbb, field));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case nod_agg_average_distinct2:
|
case nod_agg_average_distinct2:
|
||||||
@ -1787,7 +1787,7 @@ USHORT EVL_group(thread_db* tdbb, RecordSource* rsb, jrd_nod *const node, USHORT
|
|||||||
temp.dsc_address = (UCHAR *) & d;
|
temp.dsc_address = (UCHAR *) & d;
|
||||||
d = MOV_get_double(&impure->vlu_desc) / impure->vlux_count;
|
d = MOV_get_double(&impure->vlu_desc) / impure->vlux_count;
|
||||||
}
|
}
|
||||||
MOV_move(&temp, EVL_expr(tdbb, field));
|
MOV_move(tdbb, &temp, EVL_expr(tdbb, field));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: // Shut up some compiler warnings
|
default: // Shut up some compiler warnings
|
||||||
@ -2903,7 +2903,7 @@ static dsc* cast(thread_db* tdbb, dsc* value, const jrd_nod* node, impure_value*
|
|||||||
if (DTYPE_IS_BLOB(value->dsc_dtype) || DTYPE_IS_BLOB(impure->vlu_desc.dsc_dtype))
|
if (DTYPE_IS_BLOB(value->dsc_dtype) || DTYPE_IS_BLOB(impure->vlu_desc.dsc_dtype))
|
||||||
BLB_move(tdbb, value, &impure->vlu_desc, NULL);
|
BLB_move(tdbb, value, &impure->vlu_desc, NULL);
|
||||||
else
|
else
|
||||||
MOV_move(value, &impure->vlu_desc);
|
MOV_move(tdbb, value, &impure->vlu_desc);
|
||||||
|
|
||||||
if (impure->vlu_desc.dsc_dtype == dtype_text)
|
if (impure->vlu_desc.dsc_dtype == dtype_text)
|
||||||
adjust_text_descriptor(tdbb, &impure->vlu_desc);
|
adjust_text_descriptor(tdbb, &impure->vlu_desc);
|
||||||
|
@ -265,7 +265,7 @@ void EXE_assignment(thread_db* tdbb, jrd_nod* node)
|
|||||||
|
|
||||||
/* Get descriptors of receiving and sending fields/parameters, variables, etc. */
|
/* Get descriptors of receiving and sending fields/parameters, variables, etc. */
|
||||||
|
|
||||||
const dsc* missing = NULL;
|
dsc* missing = NULL;
|
||||||
if (node->nod_arg[e_asgn_missing]) {
|
if (node->nod_arg[e_asgn_missing]) {
|
||||||
missing = EVL_expr(tdbb, node->nod_arg[e_asgn_missing]);
|
missing = EVL_expr(tdbb, node->nod_arg[e_asgn_missing]);
|
||||||
}
|
}
|
||||||
@ -345,7 +345,7 @@ void EXE_assignment(thread_db* tdbb, jrd_nod* node)
|
|||||||
}
|
}
|
||||||
|
|
||||||
temp.dsc_address = (UCHAR *) &len;
|
temp.dsc_address = (UCHAR *) &len;
|
||||||
MOV_move(&temp, indicator);
|
MOV_move(tdbb, &temp, indicator);
|
||||||
|
|
||||||
if (len) {
|
if (len) {
|
||||||
temp = *from_desc;
|
temp = *from_desc;
|
||||||
@ -388,10 +388,12 @@ void EXE_assignment(thread_db* tdbb, jrd_nod* node)
|
|||||||
if (DTYPE_IS_BLOB_OR_QUAD(from_desc->dsc_dtype) ||
|
if (DTYPE_IS_BLOB_OR_QUAD(from_desc->dsc_dtype) ||
|
||||||
DTYPE_IS_BLOB_OR_QUAD(to_desc->dsc_dtype))
|
DTYPE_IS_BLOB_OR_QUAD(to_desc->dsc_dtype))
|
||||||
{
|
{
|
||||||
|
// ASF: Don't let MOV_move call BLB_move because MOV
|
||||||
|
// will not pass the destination field to BLB_move.
|
||||||
BLB_move(tdbb, from_desc, to_desc, to);
|
BLB_move(tdbb, from_desc, to_desc, to);
|
||||||
}
|
}
|
||||||
else if (!DSC_EQUIV(from_desc, to_desc, false))
|
else if (!DSC_EQUIV(from_desc, to_desc, false))
|
||||||
MOV_move(from_desc, to_desc);
|
MOV_move(tdbb, from_desc, to_desc);
|
||||||
else if (from_desc->dsc_dtype == dtype_short)
|
else if (from_desc->dsc_dtype == dtype_short)
|
||||||
{
|
{
|
||||||
*((SSHORT *) to_desc->dsc_address) =
|
*((SSHORT *) to_desc->dsc_address) =
|
||||||
@ -423,7 +425,7 @@ void EXE_assignment(thread_db* tdbb, jrd_nod* node)
|
|||||||
else if (node->nod_arg[e_asgn_missing2] &&
|
else if (node->nod_arg[e_asgn_missing2] &&
|
||||||
(missing = EVL_expr(tdbb, node->nod_arg[e_asgn_missing2])))
|
(missing = EVL_expr(tdbb, node->nod_arg[e_asgn_missing2])))
|
||||||
{
|
{
|
||||||
MOV_move(missing, to_desc);
|
MOV_move(tdbb, missing, to_desc);
|
||||||
to_desc->dsc_flags |= DSC_null;
|
to_desc->dsc_flags |= DSC_null;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -499,10 +501,10 @@ void EXE_assignment(thread_db* tdbb, jrd_nod* node)
|
|||||||
temp.dsc_scale = 0;
|
temp.dsc_scale = 0;
|
||||||
temp.dsc_sub_type = 0;
|
temp.dsc_sub_type = 0;
|
||||||
temp.dsc_address = (UCHAR *) & null;
|
temp.dsc_address = (UCHAR *) & null;
|
||||||
MOV_move(&temp, to_desc);
|
MOV_move(tdbb, &temp, to_desc);
|
||||||
if (null && to->nod_arg[e_arg_indicator]) {
|
if (null && to->nod_arg[e_arg_indicator]) {
|
||||||
to_desc = EVL_assign_to(tdbb, to->nod_arg[e_arg_indicator]);
|
to_desc = EVL_assign_to(tdbb, to->nod_arg[e_arg_indicator]);
|
||||||
MOV_move(&temp, to_desc);
|
MOV_move(tdbb, &temp, to_desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2631,7 +2633,7 @@ static jrd_nod* looper(thread_db* tdbb, jrd_req* request, jrd_nod* in_node)
|
|||||||
if (value && !(request->req_flags & req_null))
|
if (value && !(request->req_flags & req_null))
|
||||||
{
|
{
|
||||||
to_desc->dsc_flags &= ~DSC_null;
|
to_desc->dsc_flags &= ~DSC_null;
|
||||||
MOV_move(value, to_desc);
|
MOV_move(tdbb, value, to_desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2970,7 +2972,7 @@ static jrd_nod* modify(thread_db* tdbb, jrd_nod* node, SSHORT which_trig)
|
|||||||
(org_rpb->rpb_relation, org_record, i,
|
(org_rpb->rpb_relation, org_record, i,
|
||||||
&org_desc))
|
&org_desc))
|
||||||
{
|
{
|
||||||
MOV_move(&org_desc, &new_desc);
|
MOV_move(tdbb, &org_desc, &new_desc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SET_NULL(new_record, i);
|
SET_NULL(new_record, i);
|
||||||
|
@ -443,6 +443,8 @@ void EXT_store(record_param* rpb, jrd_tra* transaction)
|
|||||||
* Update an external file.
|
* Update an external file.
|
||||||
*
|
*
|
||||||
**************************************/
|
**************************************/
|
||||||
|
thread_db* tdbb = JRD_get_thread_data();
|
||||||
|
|
||||||
jrd_rel* relation = rpb->rpb_relation;
|
jrd_rel* relation = rpb->rpb_relation;
|
||||||
ExternalFile* file = relation->rel_file;
|
ExternalFile* file = relation->rel_file;
|
||||||
Record* record = rpb->rpb_record;
|
Record* record = rpb->rpb_record;
|
||||||
@ -454,7 +456,7 @@ void EXT_store(record_param* rpb, jrd_tra* transaction)
|
|||||||
/* check if file is read only if read only then
|
/* check if file is read only if read only then
|
||||||
post error we cannot write to this file */
|
post error we cannot write to this file */
|
||||||
if (file->ext_flags & EXT_readonly) {
|
if (file->ext_flags & EXT_readonly) {
|
||||||
Database* dbb = GET_DBB();
|
Database* dbb = tdbb->tdbb_database;
|
||||||
CHECK_DBB(dbb);
|
CHECK_DBB(dbb);
|
||||||
/* Distinguish error message for a ReadOnly database */
|
/* Distinguish error message for a ReadOnly database */
|
||||||
if (dbb->dbb_flags & DBB_read_only)
|
if (dbb->dbb_flags & DBB_read_only)
|
||||||
@ -481,11 +483,11 @@ void EXT_store(record_param* rpb, jrd_tra* transaction)
|
|||||||
TEST_NULL(record, i))
|
TEST_NULL(record, i))
|
||||||
{
|
{
|
||||||
UCHAR* p = record->rec_data + (IPTR) desc_ptr->dsc_address;
|
UCHAR* p = record->rec_data + (IPTR) desc_ptr->dsc_address;
|
||||||
const Literal* literal = (Literal*) field->fld_missing_value;
|
Literal* literal = (Literal*) field->fld_missing_value;
|
||||||
if (literal) {
|
if (literal) {
|
||||||
desc = *desc_ptr;
|
desc = *desc_ptr;
|
||||||
desc.dsc_address = p;
|
desc.dsc_address = p;
|
||||||
MOV_move(&literal->lit_desc, &desc);
|
MOV_move(tdbb, &literal->lit_desc, &desc);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const UCHAR pad = (desc_ptr->dsc_dtype == dtype_text) ? ' ' : 0;
|
const UCHAR pad = (desc_ptr->dsc_dtype == dtype_text) ? ' ' : 0;
|
||||||
|
@ -441,7 +441,7 @@ void FUN_evaluate(UserFunction* function, jrd_nod* node, impure_value* value)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MOV_move(input, &temp_desc);
|
MOV_move(tdbb, input, &temp_desc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -458,13 +458,13 @@ void FUN_evaluate(UserFunction* function, jrd_nod* node, impure_value* value)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MOV_move(input, &temp_desc);
|
MOV_move(tdbb, input, &temp_desc);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_quad:
|
case dtype_quad:
|
||||||
case dtype_array:
|
case dtype_array:
|
||||||
MOV_move(input, &temp_desc);
|
MOV_move(tdbb, input, &temp_desc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_blob:
|
case dtype_blob:
|
||||||
@ -516,7 +516,7 @@ void FUN_evaluate(UserFunction* function, jrd_nod* node, impure_value* value)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
fb_assert(FALSE);
|
fb_assert(FALSE);
|
||||||
MOV_move(input, &temp_desc);
|
MOV_move(tdbb, input, &temp_desc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -869,7 +869,7 @@ static SLONG get_scalar_array(fun_repeat* arg,
|
|||||||
for (; n; --n, to.dsc_address += to.dsc_length,
|
for (; n; --n, to.dsc_address += to.dsc_length,
|
||||||
from.dsc_address += array_desc->iad_element_length)
|
from.dsc_address += array_desc->iad_element_length)
|
||||||
{
|
{
|
||||||
MOV_move(&from, &to);
|
MOV_move(tdbb, &from, &to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const Firebird::Exception&)
|
catch (const Firebird::Exception&)
|
||||||
@ -1048,7 +1048,7 @@ static void invoke(UserFunction* function,
|
|||||||
else
|
else
|
||||||
if (return_dsc)
|
if (return_dsc)
|
||||||
{
|
{
|
||||||
MOV_move(return_dsc, &value->vlu_desc);
|
MOV_move(tdbb, return_dsc, &value->vlu_desc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1087,7 +1087,7 @@ static void invoke(UserFunction* function,
|
|||||||
case dtype_text:
|
case dtype_text:
|
||||||
temp_desc = value->vlu_desc;
|
temp_desc = value->vlu_desc;
|
||||||
temp_desc.dsc_address = temp_ptr;
|
temp_desc.dsc_address = temp_ptr;
|
||||||
MOV_move(&temp_desc, &value->vlu_desc);
|
MOV_move(tdbb, &temp_desc, &value->vlu_desc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_cstring:
|
case dtype_cstring:
|
||||||
@ -1097,7 +1097,7 @@ static void invoke(UserFunction* function,
|
|||||||
temp_desc.dsc_address = temp_ptr;
|
temp_desc.dsc_address = temp_ptr;
|
||||||
temp_desc.dsc_length =
|
temp_desc.dsc_length =
|
||||||
strlen(reinterpret_cast<char*>(temp_ptr)) + 1;
|
strlen(reinterpret_cast<char*>(temp_ptr)) + 1;
|
||||||
MOV_move(&temp_desc, &value->vlu_desc);
|
MOV_move(tdbb, &temp_desc, &value->vlu_desc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_varying:
|
case dtype_varying:
|
||||||
@ -1105,7 +1105,7 @@ static void invoke(UserFunction* function,
|
|||||||
temp_desc.dsc_address = temp_ptr;
|
temp_desc.dsc_address = temp_ptr;
|
||||||
temp_desc.dsc_length =
|
temp_desc.dsc_length =
|
||||||
reinterpret_cast<vary*>(temp_ptr)->vary_length + sizeof(USHORT);
|
reinterpret_cast<vary*>(temp_ptr)->vary_length + sizeof(USHORT);
|
||||||
MOV_move(&temp_desc, &value->vlu_desc);
|
MOV_move(tdbb, &temp_desc, &value->vlu_desc);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case dtype_timestamp:
|
case dtype_timestamp:
|
||||||
|
@ -583,7 +583,7 @@ int MOV_make_string2(Jrd::thread_db* tdbb,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void MOV_move(const dsc* from, dsc* to)
|
void MOV_move(Jrd::thread_db* tdbb, /*const*/ dsc* from, dsc* to)
|
||||||
{
|
{
|
||||||
/**************************************
|
/**************************************
|
||||||
*
|
*
|
||||||
@ -596,5 +596,11 @@ void MOV_move(const dsc* from, dsc* to)
|
|||||||
*
|
*
|
||||||
**************************************/
|
**************************************/
|
||||||
|
|
||||||
CVT_move(from, to, ERR_post);
|
if (DTYPE_IS_BLOB_OR_QUAD(from->dsc_dtype) ||
|
||||||
|
DTYPE_IS_BLOB_OR_QUAD(to->dsc_dtype))
|
||||||
|
{
|
||||||
|
BLB_move(tdbb, from, to, NULL);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CVT_move(from, to, ERR_post);
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,6 @@ GDS_TIME MOV_get_sql_time(const dsc*);
|
|||||||
GDS_TIMESTAMP MOV_get_timestamp(const dsc*);
|
GDS_TIMESTAMP MOV_get_timestamp(const dsc*);
|
||||||
int MOV_make_string(const dsc*, USHORT, const char**, vary*, USHORT);
|
int MOV_make_string(const dsc*, USHORT, const char**, vary*, USHORT);
|
||||||
int MOV_make_string2(Jrd::thread_db*, const dsc*, USHORT, UCHAR**, Jrd::MoveBuffer&);
|
int MOV_make_string2(Jrd::thread_db*, const dsc*, USHORT, UCHAR**, Jrd::MoveBuffer&);
|
||||||
void MOV_move(const dsc*, dsc*);
|
void MOV_move(Jrd::thread_db*, /*const*/ dsc*, dsc*);
|
||||||
|
|
||||||
#endif // JRD_MOV_PROTO_H
|
#endif // JRD_MOV_PROTO_H
|
||||||
|
@ -111,11 +111,11 @@ static bool get_record(thread_db*, RecordSource*, RecordSource*, RSE_GET_MODE);
|
|||||||
static bool get_union(thread_db*, RecordSource*, IRSB);
|
static bool get_union(thread_db*, RecordSource*, IRSB);
|
||||||
static void invalidate_child_rpbs(thread_db*, RecordSource*);
|
static void invalidate_child_rpbs(thread_db*, RecordSource*);
|
||||||
static void join_to_nulls(thread_db*, RecordSource*, StreamStack*);
|
static void join_to_nulls(thread_db*, RecordSource*, StreamStack*);
|
||||||
static void map_sort_data(jrd_req*, SortMap*, UCHAR *);
|
static void map_sort_data(thread_db*, jrd_req*, SortMap*, UCHAR *);
|
||||||
static void open_merge(thread_db*, RecordSource*, irsb_mrg*);
|
static void open_merge(thread_db*, RecordSource*, irsb_mrg*);
|
||||||
static void open_procedure(thread_db*, RecordSource*, irsb_procedure*);
|
static void open_procedure(thread_db*, RecordSource*, irsb_procedure*);
|
||||||
static void open_sort(thread_db*, RecordSource*, irsb_sort*, UINT64);
|
static void open_sort(thread_db*, RecordSource*, irsb_sort*, UINT64);
|
||||||
static void proc_assignment(const dsc*, const dsc*, UCHAR*, dsc*, SSHORT, Record*);
|
static void proc_assignment(thread_db*, const dsc*, const dsc*, UCHAR*, dsc*, SSHORT, Record*);
|
||||||
static void pop_rpbs(jrd_req*, RecordSource*);
|
static void pop_rpbs(jrd_req*, RecordSource*);
|
||||||
static void push_rpbs(thread_db*, jrd_req*, RecordSource*);
|
static void push_rpbs(thread_db*, jrd_req*, RecordSource*);
|
||||||
static ULONG read_merge_block(thread_db*, merge_file*, ULONG);
|
static ULONG read_merge_block(thread_db*, merge_file*, ULONG);
|
||||||
@ -1182,7 +1182,7 @@ static bool get_merge_fetch(
|
|||||||
current record in the record parameter block */
|
current record in the record parameter block */
|
||||||
|
|
||||||
merge_file* mfb = &tail->irsb_mrg_file;
|
merge_file* mfb = &tail->irsb_mrg_file;
|
||||||
map_sort_data(tdbb->tdbb_request, (SortMap*) sub_rsb->rsb_arg[0],
|
map_sort_data(tdbb, tdbb->tdbb_request, (SortMap*) sub_rsb->rsb_arg[0],
|
||||||
get_merge_data(tdbb, mfb, record));
|
get_merge_data(tdbb, mfb, record));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1221,7 +1221,7 @@ static bool get_merge_fetch(thread_db* tdbb, RecordSource* rsb, SSHORT stream)
|
|||||||
tail->irsb_mrg_equal_current = record;
|
tail->irsb_mrg_equal_current = record;
|
||||||
|
|
||||||
merge_file* mfb = &tail->irsb_mrg_file;
|
merge_file* mfb = &tail->irsb_mrg_file;
|
||||||
map_sort_data(tdbb->tdbb_request, (SortMap*) sub_rsb->rsb_arg[0],
|
map_sort_data(tdbb, tdbb->tdbb_request, (SortMap*) sub_rsb->rsb_arg[0],
|
||||||
get_merge_data(tdbb, mfb, record));
|
get_merge_data(tdbb, mfb, record));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1311,7 +1311,7 @@ static bool get_merge_join(
|
|||||||
|
|
||||||
/* Map data into target records and do comparison */
|
/* Map data into target records and do comparison */
|
||||||
|
|
||||||
map_sort_data(request, map, get_merge_data(tdbb, mfb, record));
|
map_sort_data(tdbb, request, map, get_merge_data(tdbb, mfb, record));
|
||||||
const int result = compare(tdbb, highest_ptr[1], ptr[1]);
|
const int result = compare(tdbb, highest_ptr[1], ptr[1]);
|
||||||
if (ptr != highest_ptr)
|
if (ptr != highest_ptr)
|
||||||
{
|
{
|
||||||
@ -1356,7 +1356,7 @@ static bool get_merge_join(
|
|||||||
get_merge_record(tdbb, sort_rsb, tail, mode);
|
get_merge_record(tdbb, sort_rsb, tail, mode);
|
||||||
if (record < 0)
|
if (record < 0)
|
||||||
return false;
|
return false;
|
||||||
map_sort_data(request, (SortMap*) sort_rsb->rsb_arg[0],
|
map_sort_data(tdbb, request, (SortMap*) sort_rsb->rsb_arg[0],
|
||||||
get_merge_data(tdbb, mfb, record));
|
get_merge_data(tdbb, mfb, record));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1517,7 +1517,7 @@ static bool get_merge_join(thread_db* tdbb, RecordSource* rsb, irsb_mrg* impure)
|
|||||||
|
|
||||||
/* Map data into target records and do comparison */
|
/* Map data into target records and do comparison */
|
||||||
|
|
||||||
map_sort_data(request, map, get_merge_data(tdbb, mfb, record));
|
map_sort_data(tdbb, request, map, get_merge_data(tdbb, mfb, record));
|
||||||
if (ptr != highest_ptr &&
|
if (ptr != highest_ptr &&
|
||||||
compare(tdbb, (jrd_nod*) highest_ptr[1], (jrd_nod*) ptr[1]) < 0)
|
compare(tdbb, (jrd_nod*) highest_ptr[1], (jrd_nod*) ptr[1]) < 0)
|
||||||
{
|
{
|
||||||
@ -1551,7 +1551,7 @@ static bool get_merge_join(thread_db* tdbb, RecordSource* rsb, irsb_mrg* impure)
|
|||||||
const SLONG record = get_merge_record(tdbb, sort_rsb, tail);
|
const SLONG record = get_merge_record(tdbb, sort_rsb, tail);
|
||||||
if (record < 0)
|
if (record < 0)
|
||||||
return false;
|
return false;
|
||||||
map_sort_data(request, (SortMap*) sort_rsb->rsb_arg[0],
|
map_sort_data(tdbb, request, (SortMap*) sort_rsb->rsb_arg[0],
|
||||||
get_merge_data(tdbb, mfb, record));
|
get_merge_data(tdbb, mfb, record));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1770,13 +1770,14 @@ static bool get_procedure(thread_db* tdbb,
|
|||||||
eos_desc.dsc_sub_type = 0;
|
eos_desc.dsc_sub_type = 0;
|
||||||
eos_desc.dsc_flags = 0;
|
eos_desc.dsc_flags = 0;
|
||||||
eos_desc.dsc_address = (UCHAR *) & eos;
|
eos_desc.dsc_address = (UCHAR *) & eos;
|
||||||
MOV_move(&desc, &eos_desc);
|
MOV_move(tdbb, &desc, &eos_desc);
|
||||||
if (!eos)
|
if (!eos)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
for (int i = 0; i < rec_format->fmt_count; i++)
|
for (int i = 0; i < rec_format->fmt_count; i++)
|
||||||
{
|
{
|
||||||
proc_assignment(&msg_format->fmt_desc[2 * i],
|
proc_assignment(tdbb,
|
||||||
|
&msg_format->fmt_desc[2 * i],
|
||||||
&msg_format->fmt_desc[2 * i + 1],
|
&msg_format->fmt_desc[2 * i + 1],
|
||||||
om,
|
om,
|
||||||
&rec_format->fmt_desc[i],
|
&rec_format->fmt_desc[i],
|
||||||
@ -2334,7 +2335,7 @@ static bool get_record(thread_db* tdbb,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
map_sort_data(request, (SortMap*) rsb->rsb_arg[0], data);
|
map_sort_data(tdbb, request, (SortMap*) rsb->rsb_arg[0], data);
|
||||||
|
|
||||||
#ifdef SCROLLABLE_CURSORS
|
#ifdef SCROLLABLE_CURSORS
|
||||||
/* fix up the sort data in case we need to retrieve it again */
|
/* fix up the sort data in case we need to retrieve it again */
|
||||||
@ -2689,7 +2690,7 @@ static void join_to_nulls(thread_db* tdbb, RecordSource* rsb, StreamStack* strea
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void map_sort_data(jrd_req* request, SortMap* map, UCHAR * data)
|
static void map_sort_data(thread_db* tdbb, jrd_req* request, SortMap* map, UCHAR * data)
|
||||||
{
|
{
|
||||||
/**************************************
|
/**************************************
|
||||||
*
|
*
|
||||||
@ -2767,7 +2768,7 @@ static void map_sort_data(jrd_req* request, SortMap* map, UCHAR * data)
|
|||||||
if (flag)
|
if (flag)
|
||||||
SET_NULL(record, id);
|
SET_NULL(record, id);
|
||||||
else {
|
else {
|
||||||
MOV_move(&from, &to);
|
MOV_move(tdbb, &from, &to);
|
||||||
CLEAR_NULL(record, id);
|
CLEAR_NULL(record, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3015,7 +3016,7 @@ static void open_sort(thread_db* tdbb, RecordSource* rsb, irsb_sort* impure, UIN
|
|||||||
from, &to, INTL_KEY_SORT);
|
from, &to, INTL_KEY_SORT);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
MOV_move(from, &to);
|
MOV_move(tdbb, from, &to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3054,7 +3055,7 @@ static void open_sort(thread_db* tdbb, RecordSource* rsb, irsb_sort* impure, UIN
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void proc_assignment(
|
static void proc_assignment(thread_db* tdbb,
|
||||||
const dsc* from_desc,
|
const dsc* from_desc,
|
||||||
const dsc* flag_desc,
|
const dsc* flag_desc,
|
||||||
UCHAR* msg, // this param is logically const
|
UCHAR* msg, // this param is logically const
|
||||||
@ -3082,7 +3083,7 @@ static void proc_assignment(
|
|||||||
dsc desc1;
|
dsc desc1;
|
||||||
desc1 = *flag_desc;
|
desc1 = *flag_desc;
|
||||||
desc1.dsc_address = msg + (IPTR) flag_desc->dsc_address;
|
desc1.dsc_address = msg + (IPTR) flag_desc->dsc_address;
|
||||||
MOV_move(&desc1, &desc2);
|
MOV_move(tdbb, &desc1, &desc2);
|
||||||
if (indicator) {
|
if (indicator) {
|
||||||
SET_NULL(record, to_id);
|
SET_NULL(record, to_id);
|
||||||
const USHORT l = to_desc->dsc_length;
|
const USHORT l = to_desc->dsc_length;
|
||||||
@ -3127,7 +3128,7 @@ static void proc_assignment(
|
|||||||
desc2 = *to_desc;
|
desc2 = *to_desc;
|
||||||
desc2.dsc_address = record->rec_data + (IPTR) desc2.dsc_address;
|
desc2.dsc_address = record->rec_data + (IPTR) desc2.dsc_address;
|
||||||
if (!DSC_EQUIV((&desc1), (&desc2), false))
|
if (!DSC_EQUIV((&desc1), (&desc2), false))
|
||||||
MOV_move(&desc1, &desc2);
|
MOV_move(tdbb, &desc1, &desc2);
|
||||||
|
|
||||||
else if (desc1.dsc_dtype == dtype_short)
|
else if (desc1.dsc_dtype == dtype_short)
|
||||||
*((SSHORT *) desc2.dsc_address) = *((SSHORT *) desc1.dsc_address);
|
*((SSHORT *) desc2.dsc_address) = *((SSHORT *) desc1.dsc_address);
|
||||||
|
@ -121,7 +121,7 @@ static int prepare_update(thread_db*, jrd_tra*, SLONG, record_param*,
|
|||||||
static void purge(thread_db*, record_param*);
|
static void purge(thread_db*, record_param*);
|
||||||
static Record* replace_gc_record(jrd_rel*, Record**, USHORT);
|
static Record* replace_gc_record(jrd_rel*, Record**, USHORT);
|
||||||
static void replace_record(thread_db*, record_param*, PageStack*, const jrd_tra*);
|
static void replace_record(thread_db*, record_param*, PageStack*, const jrd_tra*);
|
||||||
static void set_system_flag(record_param*, USHORT, SSHORT);
|
static void set_system_flag(thread_db*, record_param*, USHORT, SSHORT);
|
||||||
static void update_in_place(thread_db*, jrd_tra*, record_param*, record_param*);
|
static void update_in_place(thread_db*, jrd_tra*, record_param*, record_param*);
|
||||||
static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, record_param*,
|
static void verb_post(thread_db*, jrd_tra*, record_param*, Record*, record_param*,
|
||||||
const bool, const bool);
|
const bool, const bool);
|
||||||
@ -2649,7 +2649,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
|
|||||||
EVL_field(0, rpb->rpb_record, f_rel_name, &desc);
|
EVL_field(0, rpb->rpb_record, f_rel_name, &desc);
|
||||||
DFW_post_work(transaction, dfw_create_relation, &desc, 0);
|
DFW_post_work(transaction, dfw_create_relation, &desc, 0);
|
||||||
DFW_post_work(transaction, dfw_update_format, &desc, 0);
|
DFW_post_work(transaction, dfw_update_format, &desc, 0);
|
||||||
set_system_flag(rpb, f_rel_sys_flag, 0);
|
set_system_flag(tdbb, rpb, f_rel_sys_flag, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case rel_procedures:
|
case rel_procedures:
|
||||||
@ -2671,7 +2671,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
|
|||||||
if (check_blr)
|
if (check_blr)
|
||||||
DFW_post_work_arg(transaction, work, NULL, 0)->dfw_type = dfw_arg_check_blr;
|
DFW_post_work_arg(transaction, work, NULL, 0)->dfw_type = dfw_arg_check_blr;
|
||||||
} // scope
|
} // scope
|
||||||
set_system_flag(rpb, f_prc_sys_flag, 0);
|
set_system_flag(tdbb, rpb, f_prc_sys_flag, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case rel_indices:
|
case rel_indices:
|
||||||
@ -2692,7 +2692,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
|
|||||||
EVL_field(0, rpb->rpb_record, f_rfr_rname, &desc);
|
EVL_field(0, rpb->rpb_record, f_rfr_rname, &desc);
|
||||||
SCL_check_relation(&desc, SCL_control);
|
SCL_check_relation(&desc, SCL_control);
|
||||||
DFW_post_work(transaction, dfw_update_format, &desc, 0);
|
DFW_post_work(transaction, dfw_update_format, &desc, 0);
|
||||||
set_system_flag(rpb, f_rfr_sys_flag, 0);
|
set_system_flag(tdbb, rpb, f_rfr_sys_flag, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case rel_classes:
|
case rel_classes:
|
||||||
@ -2702,7 +2702,7 @@ void VIO_store(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
|
|||||||
|
|
||||||
case rel_fields:
|
case rel_fields:
|
||||||
check_control(tdbb);
|
check_control(tdbb);
|
||||||
set_system_flag(rpb, f_fld_sys_flag, 0);
|
set_system_flag(tdbb, rpb, f_fld_sys_flag, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case rel_files:
|
case rel_files:
|
||||||
@ -4836,7 +4836,7 @@ static void replace_record(thread_db* tdbb,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void set_system_flag(record_param* rpb, USHORT field_id, SSHORT flag)
|
static void set_system_flag(thread_db* tdbb, record_param* rpb, USHORT field_id, SSHORT flag)
|
||||||
{
|
{
|
||||||
/**************************************
|
/**************************************
|
||||||
*
|
*
|
||||||
@ -4861,7 +4861,7 @@ static void set_system_flag(record_param* rpb, USHORT field_id, SSHORT flag)
|
|||||||
desc2.dsc_scale = 0;
|
desc2.dsc_scale = 0;
|
||||||
desc2.dsc_sub_type = 0;
|
desc2.dsc_sub_type = 0;
|
||||||
desc2.dsc_address = (UCHAR *) & flag;
|
desc2.dsc_address = (UCHAR *) & flag;
|
||||||
MOV_move(&desc2, &desc1);
|
MOV_move(tdbb, &desc2, &desc1);
|
||||||
CLEAR_NULL(record, field_id);
|
CLEAR_NULL(record, field_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user