|
33 | 33 | #include "../common/TimeZoneUtil.h" |
34 | 34 | #include "../common/classes/VaryStr.h" |
35 | 35 | #include "../common/classes/Hash.h" |
| 36 | +#include "../common/classes/Uuid.h" |
36 | 37 | #include "../jrd/SysFunction.h" |
37 | 38 | #include "../jrd/DataTypeUtil.h" |
38 | 39 | #include "../include/fb_blk.h" |
@@ -1920,7 +1921,7 @@ void makeUnicodeChar(DataTypeUtilBase*, const SysFunction* function, dsc* result |
1920 | 1921 | void makeUuid(DataTypeUtilBase*, const SysFunction* function, dsc* result, |
1921 | 1922 | int argsCount, const dsc** args) |
1922 | 1923 | { |
1923 | | - fb_assert(argsCount == function->minArgCount); |
| 1924 | + fb_assert(argsCount >= function->minArgCount); |
1924 | 1925 |
|
1925 | 1926 | if (argsCount > 0 && args[0]->isNull()) |
1926 | 1927 | result->makeNullString(); |
@@ -4519,12 +4520,38 @@ dsc* evlFloor(thread_db* tdbb, const SysFunction*, const NestValueArray& args, |
4519 | 4520 | dsc* evlGenUuid(thread_db* tdbb, const SysFunction*, const NestValueArray& args, |
4520 | 4521 | impure_value* impure) |
4521 | 4522 | { |
4522 | | - fb_assert(args.isEmpty()); |
| 4523 | + const auto request = tdbb->getRequest(); |
| 4524 | + |
| 4525 | + fb_assert(args.getCount() <= 1); |
4523 | 4526 |
|
4524 | 4527 | // Generate UUID and convert it into platform-independent format |
4525 | 4528 | UCHAR data[Guid::SIZE]; |
| 4529 | + SLONG version = 4; |
| 4530 | + |
| 4531 | + if (args.getCount() > 0) |
| 4532 | + { |
| 4533 | + const auto* const versionDsc = EVL_expr(tdbb, request, args[0]); |
| 4534 | + |
| 4535 | + if (request->req_flags & req_null) |
| 4536 | + return nullptr; |
| 4537 | + |
| 4538 | + version = MOV_get_long(tdbb, versionDsc, 0); |
| 4539 | + } |
4526 | 4540 |
|
4527 | | - Guid::generate().convert(data); |
| 4541 | + switch (version) |
| 4542 | + { |
| 4543 | + case 4: |
| 4544 | + Guid::generate().convert(data); |
| 4545 | + break; |
| 4546 | + |
| 4547 | + case 7: |
| 4548 | + Uuid::generate(version).extractBytes(data, sizeof(data)); |
| 4549 | + break; |
| 4550 | + |
| 4551 | + default: |
| 4552 | + status_exception::raise(Arg::Gds(isc_sysf_invalid_gen_uuid_version) << Arg::Num(version)); |
| 4553 | + break; |
| 4554 | + } |
4528 | 4555 |
|
4529 | 4556 | dsc result; |
4530 | 4557 | result.makeText(Guid::SIZE, ttype_binary, data); |
@@ -6885,7 +6912,7 @@ const SysFunction SysFunction::functions[] = |
6885 | 6912 | {"EXP", 1, 1, setParamsDblDec, makeDblDecResult, evlExp, NULL}, |
6886 | 6913 | {"FIRST_DAY", 2, 2, setParamsFirstLastDay, makeFirstLastDayResult, evlFirstLastDay, (void*) funFirstDay}, |
6887 | 6914 | {"FLOOR", 1, 1, setParamsDblDec, makeCeilFloor, evlFloor, NULL}, |
6888 | | - {"GEN_UUID", 0, 0, NULL, makeUuid, evlGenUuid, NULL}, |
| 6915 | + {"GEN_UUID", 0, 1, NULL, makeUuid, evlGenUuid, NULL}, |
6889 | 6916 | {"HASH", 1, 2, setParamsHash, makeHash, evlHash, NULL}, |
6890 | 6917 | {"HEX_DECODE", 1, 1, NULL, makeDecodeHex, evlDecodeHex, NULL}, |
6891 | 6918 | {"HEX_ENCODE", 1, 1, NULL, makeEncodeHex, evlEncodeHex, NULL}, |
|
0 commit comments