Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion builds/win32/msvc15/engine_test.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,7 @@
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\..\src\jrd\tests\BlrGenTest.cpp" />
<ClCompile Include="..\..\..\src\jrd\tests\CompressorTest.cpp" />
</ItemGroup>
<ItemGroup>
Expand Down Expand Up @@ -317,4 +318,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
12 changes: 6 additions & 6 deletions src/dsql/DdlNodes.epp
Original file line number Diff line number Diff line change
Expand Up @@ -2372,8 +2372,8 @@ void CreateAlterFunctionNode::storeArgument(thread_db* tdbb, DsqlCompilerScratch
if (!isUdf())
{
ARG.RDB$ARGUMENT_MECHANISM.NULL = FALSE;
ARG.RDB$ARGUMENT_MECHANISM = (USHORT) (type->fullDomain || type->typeOfName.object.isEmpty() ?
prm_mech_normal : prm_mech_type_of);
fb_assert(type->mechanism == prm_mech_normal || !type->typeOfName.object.isEmpty());
ARG.RDB$ARGUMENT_MECHANISM = type->mechanism;
}

if (type->notNull)
Expand Down Expand Up @@ -2563,7 +2563,7 @@ void CreateAlterFunctionNode::compile(thread_db* /*tdbb*/, DsqlCompilerScratch*
{
ParameterClause* parameter = parameters[i];

if (parameter->type->fullDomain || parameter->type->notNull)
if (parameter->type->mechanism == prm_mech_normal || parameter->type->notNull)
{
// ASF: To validate input parameters we need only to read its value.
// Assigning it to null is an easy way to do this.
Expand Down Expand Up @@ -3399,8 +3399,8 @@ void CreateAlterProcedureNode::storeParameter(thread_db* tdbb, DsqlCompilerScrat
PRM.RDB$PARAMETER_TYPE = parameterType;

PRM.RDB$PARAMETER_MECHANISM.NULL = FALSE;
PRM.RDB$PARAMETER_MECHANISM = (USHORT) (type->fullDomain || type->typeOfName.object.isEmpty() ?
prm_mech_normal : prm_mech_type_of);
fb_assert(type->mechanism == prm_mech_normal || !type->typeOfName.object.isEmpty());
PRM.RDB$PARAMETER_MECHANISM = type->mechanism;

PRM.RDB$NULL_FLAG.NULL = !type->notNull;
PRM.RDB$NULL_FLAG = type->notNull;
Expand Down Expand Up @@ -3533,7 +3533,7 @@ void CreateAlterProcedureNode::compile(thread_db* /*tdbb*/, DsqlCompilerScratch*
{
ParameterClause* parameter = parameters[i];

if (parameter->type->fullDomain || parameter->type->notNull)
if (parameter->type->mechanism == prm_mech_normal || parameter->type->notNull)
{
// ASF: To validate an input parameter we need only to read its value.
// Assigning it to null is an easy way to do this.
Expand Down
4 changes: 2 additions & 2 deletions src/dsql/DsqlCompilerScratch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ void DsqlCompilerScratch::putTypeName(const TypeClause& type, const bool useExpl
else
differentSchema = type.typeOfName.schema != ddlSchema;

const UCHAR domainBlr = type.fullDomain ? blr_domain_full : blr_domain_type_of;
const UCHAR domainBlr = type.mechanism == prm_mech_normal ? blr_domain_full : blr_domain_type_of;
if (differentSchema)
{
appendUChar(blrSet.name3);
Expand Down Expand Up @@ -454,7 +454,7 @@ void DsqlCompilerScratch::putLocalVariableInit(dsql_var* variable, const Declare
appendUChar(blr_variable);
appendUShort(variable->number);
}
else if (node || (!field->fullDomain && !field->notNull))
else if (node || (field->mechanism != prm_mech_normal && !field->notNull))
{
appendUChar(blr_assignment);

Expand Down
2 changes: 1 addition & 1 deletion src/dsql/ExprNodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3578,7 +3578,7 @@ bool CastNode::setParameterType(DsqlCompilerScratch* /*dsqlScratch*/,
{
parameter->par_node = source;
DsqlDescMaker::fromField(&parameter->par_desc, dsqlField);
if (!dsqlField->fullDomain)
if (dsqlField->mechanism != prm_mech_normal)
parameter->par_desc.setNullable(true);
return true;
}
Expand Down
56 changes: 19 additions & 37 deletions src/dsql/PackageNodes.epp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "firebird.h"
#include "../dsql/PackageNodes.h"
#include "../dsql/metd_proto.h"
#include "../jrd/dyn.h"
#include "../jrd/intl.h"
#include "../jrd/jrd.h"
Expand Down Expand Up @@ -55,7 +56,7 @@ namespace
{
// Return function and procedure names (in the user charset) and optionally its details for a
// given package.
void collectPackagedItems(thread_db* tdbb, jrd_tra* transaction, const QualifiedName& packageName,
void collectPackagedItems(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch, jrd_tra* transaction, const QualifiedName& packageName,
SortedObjectsArray<Signature>& functions,
SortedObjectsArray<Signature>& procedures, bool details)
{
Expand Down Expand Up @@ -89,12 +90,12 @@ namespace
parameter.number = ARG.RDB$ARGUMENT_POSITION;
parameter.name = ARG.RDB$ARGUMENT_NAME;
parameter.fieldSource = QualifiedName(ARG.RDB$FIELD_SOURCE, ARG.RDB$FIELD_SOURCE_SCHEMA_NAME);
parameter.mechanism = ARG.RDB$ARGUMENT_MECHANISM;
parameter.mechanism = static_cast<prm_mech_t>(ARG.RDB$ARGUMENT_MECHANISM);

if (!ARG.RDB$FIELD_NAME.NULL)
parameter.fieldName = QualifiedName(ARG.RDB$FIELD_NAME);
parameter.typeOfName = QualifiedName(ARG.RDB$FIELD_NAME);
if (!ARG.RDB$RELATION_NAME.NULL)
parameter.relationName = QualifiedName(ARG.RDB$RELATION_NAME, ARG.RDB$RELATION_SCHEMA_NAME);
parameter.typeOfTable = QualifiedName(ARG.RDB$RELATION_NAME, ARG.RDB$RELATION_SCHEMA_NAME);
if (!ARG.RDB$COLLATION_ID.NULL)
parameter.collationId = CollId(ARG.RDB$COLLATION_ID);
if (!ARG.RDB$NULL_FLAG.NULL)
Expand Down Expand Up @@ -144,50 +145,31 @@ namespace
if (details)
{
FOR (REQUEST_HANDLE requestHandle2 TRANSACTION_HANDLE transaction)
PRM IN RDB$PROCEDURE_PARAMETERS CROSS
FLD IN RDB$FIELDS
PRM IN RDB$PROCEDURE_PARAMETERS
WITH PRM.RDB$SCHEMA_NAME EQ PRC.RDB$SCHEMA_NAME AND
PRM.RDB$PACKAGE_NAME EQ PRC.RDB$PACKAGE_NAME AND
PRM.RDB$PROCEDURE_NAME EQ PRC.RDB$PROCEDURE_NAME AND
FLD.RDB$SCHEMA_NAME EQUIV PRM.RDB$FIELD_SOURCE_SCHEMA_NAME AND
FLD.RDB$FIELD_NAME EQ PRM.RDB$FIELD_SOURCE
PRM.RDB$PROCEDURE_NAME EQ PRC.RDB$PROCEDURE_NAME
{
SignatureParameter parameter(*getDefaultMemoryPool());
parameter.type = PRM.RDB$PARAMETER_TYPE;
parameter.number = PRM.RDB$PARAMETER_NUMBER;
parameter.name = PRM.RDB$PARAMETER_NAME;
parameter.fieldSource = QualifiedName(PRM.RDB$FIELD_SOURCE, PRM.RDB$FIELD_SOURCE_SCHEMA_NAME);
parameter.mechanism = PRM.RDB$PARAMETER_MECHANISM;
parameter.mechanism = static_cast<prm_mech_t>(PRM.RDB$PARAMETER_MECHANISM);

if (!PRM.RDB$FIELD_NAME.NULL)
parameter.fieldName = QualifiedName(PRM.RDB$FIELD_NAME);
parameter.typeOfName = QualifiedName(PRM.RDB$FIELD_NAME);
if (!PRM.RDB$RELATION_NAME.NULL)
parameter.relationName = QualifiedName(PRM.RDB$RELATION_NAME, PRM.RDB$RELATION_SCHEMA_NAME);
parameter.typeOfTable = QualifiedName(PRM.RDB$RELATION_NAME, PRM.RDB$RELATION_SCHEMA_NAME);
if (!PRM.RDB$COLLATION_ID.NULL)
parameter.collationId = CollId(PRM.RDB$COLLATION_ID);
if (!PRM.RDB$NULL_FLAG.NULL)
parameter.nullFlag = PRM.RDB$NULL_FLAG;

if (!FLD.RDB$FIELD_LENGTH.NULL)
parameter.fieldLength = FLD.RDB$FIELD_LENGTH;
if (!FLD.RDB$FIELD_SCALE.NULL)
parameter.fieldScale = FLD.RDB$FIELD_SCALE;
if (!FLD.RDB$FIELD_TYPE.NULL)
parameter.fieldType = FLD.RDB$FIELD_TYPE;
if (!FLD.RDB$FIELD_SUB_TYPE.NULL)
parameter.fieldSubType = FLD.RDB$FIELD_SUB_TYPE;
if (!FLD.RDB$SEGMENT_LENGTH.NULL)
parameter.fieldSegmentLength = FLD.RDB$SEGMENT_LENGTH;
if (!FLD.RDB$NULL_FLAG.NULL)
parameter.fieldNullFlag = FLD.RDB$NULL_FLAG;
if (!FLD.RDB$CHARACTER_LENGTH.NULL)
parameter.fieldCharLength = FLD.RDB$CHARACTER_LENGTH;
if (!FLD.RDB$COLLATION_ID.NULL)
parameter.fieldCollationId = CollId(FLD.RDB$COLLATION_ID);
if (!FLD.RDB$CHARACTER_SET_ID.NULL)
parameter.fieldCharSetId = CSetId(FLD.RDB$CHARACTER_SET_ID);
if (!FLD.RDB$FIELD_PRECISION.NULL)
parameter.fieldPrecision = FLD.RDB$FIELD_PRECISION;
if (parameter.typeOfName.object.hasData())
{
Metadata::resolveType(dsqlScratch, parameter.typeOfTable, parameter.typeOfName, parameter);
}

procedure.parameters.add(parameter);
}
Expand Down Expand Up @@ -444,7 +426,7 @@ bool CreateAlterPackageNode::executeAlter(thread_db* tdbb, DsqlCompilerScratch*

SortedObjectsArray<Signature> existingFuncs(pool);
SortedObjectsArray<Signature> existingProcs(pool);
collectPackagedItems(tdbb, transaction, name, existingFuncs, existingProcs, false);
collectPackagedItems(tdbb, dsqlScratch, transaction, name, existingFuncs, existingProcs, false);

for (SortedObjectsArray<Signature>::iterator i = existingFuncs.begin();
i != existingFuncs.end(); ++i)
Expand Down Expand Up @@ -621,7 +603,7 @@ void DropPackageNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlScratch,

SortedObjectsArray<Signature> existingFuncs(pool);
SortedObjectsArray<Signature> existingProcs(pool);
collectPackagedItems(tdbb, transaction, name, existingFuncs, existingProcs, false);
collectPackagedItems(tdbb, dsqlScratch, transaction, name, existingFuncs, existingProcs, false);

for (SortedObjectsArray<Signature>::iterator i = existingFuncs.begin();
i != existingFuncs.end(); ++i)
Expand Down Expand Up @@ -839,7 +821,7 @@ void CreatePackageBodyNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlSc

SortedObjectsArray<Signature> headerFuncs(pool);
SortedObjectsArray<Signature> headerProcs(pool);
collectPackagedItems(tdbb, transaction, name, headerFuncs, headerProcs, false);
collectPackagedItems(tdbb, dsqlScratch, transaction, name, headerFuncs, headerProcs, false);

SortedObjectsArray<Signature> existingFuncs(pool);
SortedObjectsArray<Signature> existingProcs(pool);
Expand All @@ -858,7 +840,7 @@ void CreatePackageBodyNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlSc
existingProcs.clear();
}

collectPackagedItems(tdbb, transaction, name, existingFuncs, existingProcs, true);
collectPackagedItems(tdbb, dsqlScratch, transaction, name, existingFuncs, existingProcs, true);

for (unsigned j = 0; j < arrays[i]->getCount(); ++j)
{
Expand Down Expand Up @@ -913,7 +895,7 @@ void CreatePackageBodyNode::execute(thread_db* tdbb, DsqlCompilerScratch* dsqlSc

SortedObjectsArray<Signature> newFuncs(pool);
SortedObjectsArray<Signature> newProcs(pool);
collectPackagedItems(tdbb, transaction, name, newFuncs, newProcs, true);
collectPackagedItems(tdbb, dsqlScratch, transaction, name, newFuncs, newProcs, true);

for (SortedObjectsArray<Signature>::iterator i = existingFuncs.begin();
i != existingFuncs.end(); ++i)
Expand Down
2 changes: 1 addition & 1 deletion src/dsql/StmtNodes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5194,7 +5194,7 @@ void ExecBlockNode::genBlr(DsqlCompilerScratch* dsqlScratch)
const dsql_var* variable = dsqlScratch->variables[i];
const TypeClause* field = variable->field;

if (field->fullDomain || field->notNull)
if (field->mechanism == prm_mech_normal || field->notNull)
{
dsqlScratch->appendUChar(blr_assignment);
dsqlScratch->appendUChar(blr_parameter2);
Expand Down
57 changes: 1 addition & 56 deletions src/dsql/ddl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,62 +154,7 @@ void DDL_resolve_intl_type(DsqlCompilerScratch* dsqlScratch, dsql_fld* field,

if (field->typeOfName.object.hasData())
{
if (field->typeOfTable.object.hasData())
{
dsqlScratch->qualifyExistingName(field->typeOfTable, obj_relation);

dsql_rel* relation = METD_get_relation(dsqlScratch->getTransaction(), dsqlScratch, field->typeOfTable);
const dsql_fld* fld = NULL;

if (relation)
{
const MetaName fieldName(field->typeOfName.object);

for (fld = relation->rel_fields; fld; fld = fld->fld_next)
{
if (fieldName == fld->fld_name)
{
field->dimensions = fld->dimensions;
field->fieldSource = fld->fieldSource;
field->length = fld->length;
field->scale = fld->scale;
field->subType = fld->subType;
field->charSetId = fld->charSetId;
field->collationId = fld->collationId;
field->charLength = fld->charLength;
field->flags = fld->flags;
field->dtype = fld->dtype;
field->segLength = fld->segLength;
break;
}
}
}

if (!fld)
{
// column @1 does not exist in table/view @2
post_607(Arg::Gds(isc_dyn_column_does_not_exist) <<
field->typeOfName.toQuotedString() <<
field->typeOfTable.toQuotedString());
}
}
else
{
dsqlScratch->qualifyExistingName(field->typeOfName, obj_field);

if (!METD_get_domain(dsqlScratch->getTransaction(), field, field->typeOfName))
{
// Specified domain or source field does not exist
post_607(Arg::Gds(isc_dsql_domain_not_found) << field->typeOfName.toQuotedString());
}
}

if (field->dimensions != 0)
{
ERRD_post(Arg::Gds(isc_wish_list) <<
Arg::Gds(isc_random) <<
Arg::Str("Usage of domain or TYPE OF COLUMN of array type in PSQL"));
}
Metadata::resolveType(dsqlScratch, field->typeOfTable, field->typeOfName, *field);

if (field->dtype <= dtype_any_text ||
(field->dtype == dtype_blob && field->subType == isc_blob_text))
Expand Down
Loading
Loading