Skip to content

Commit 9d191e8

Browse files
GREATEST and LEAST (SQL:2023 - T054) (#8532)
* Adding SQL-compliant names to existing MAXVALUE/MINVALUE functions
1 parent e8f20df commit 9d191e8

File tree

5 files changed

+55
-1
lines changed

5 files changed

+55
-1
lines changed

doc/sql.extensions/README.builtin_functions.txt

+43-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Authors:
1313
Alexey Karyakin <aleksey.karyakin@mail.ru>
1414
Claudio Valderrama C. <cvalde at usa.net>
1515
Alexander Peshkov <peshkoff@mail.ru>
16+
Alexey Chudaykin <chudaykinalex@gmail.com>
1617

1718

1819
---
@@ -568,6 +569,23 @@ Example:
568569
See also: CHAR_TO_UUID and UUID_TO_CHAR
569570

570571

572+
--------
573+
GREATEST
574+
--------
575+
576+
Function:
577+
Returns the maximum value of a list of values.
578+
579+
Format:
580+
GREATEST( <value> [, <value> ...] )
581+
582+
Example:
583+
select greatest(v1, v2, 10) from x;
584+
585+
Notes:
586+
This function is a SQL-compliant alias to the MAXVALUE function. They work identically.
587+
588+
571589
----
572590
HASH
573591
----
@@ -630,6 +648,23 @@ Example:
630648
select last_day(of week from date '2017-11-01') from rdb$database;
631649

632650

651+
-----
652+
LEAST
653+
-----
654+
655+
Function:
656+
Returns the minimun value of a list of values.
657+
658+
Format:
659+
LEAST( <value> [, <value> ...] )
660+
661+
Example:
662+
select least(v1, v2, 10) from x;
663+
664+
Notes:
665+
This function is a SQL-compliant alias to the MINVALUE function. They work identically.
666+
667+
633668
----
634669
LEFT
635670
----
@@ -778,6 +813,7 @@ Examples:
778813
where rdb$db_key >= make_dbkey('SOMETABLE', 0, 0, 5)
779814
and rdb$db_key < make_dbkey('SOMETABLE', 0, 1, 5)
780815

816+
781817
--------
782818
MAXVALUE
783819
--------
@@ -791,20 +827,26 @@ Format:
791827
Example:
792828
select maxvalue(v1, v2, 10) from x;
793829

830+
Notes:
831+
This function is a legacy name for the SQL-compliant GREATEST function. They work identically.
832+
794833

795834
--------
796835
MINVALUE
797836
--------
798837

799838
Function:
800-
Returns the minimun value of a list of values.
839+
Returns the minimum value of a list of values.
801840

802841
Format:
803842
MINVALUE( <value> [, <value> ...] )
804843

805844
Example:
806845
select minvalue(v1, v2, 10) from x;
807846

847+
Notes:
848+
This function is a legacy name for the SQL-compliant LEAST function. They work identically.
849+
808850

809851
---
810852
MOD

doc/sql.extensions/README.keywords

+2
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,8 @@ Firebird 6.0
396396
Added as reserved words:
397397

398398
CALL
399+
GREATEST
400+
LEAST
399401

400402
Added as non-reserved words:
401403

src/common/ParserTokens.h

+2
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ PARSER_TOKEN(TOK_GEN_UUID, "GEN_UUID", true)
237237
PARSER_TOKEN(TOK_GLOBAL, "GLOBAL", false)
238238
PARSER_TOKEN(TOK_GRANT, "GRANT", false)
239239
PARSER_TOKEN(TOK_GRANTED, "GRANTED", true)
240+
PARSER_TOKEN(TOK_GREATEST, "GREATEST", false)
240241
PARSER_TOKEN(TOK_GROUP, "GROUP", false)
241242
PARSER_TOKEN(TOK_HASH, "HASH", true)
242243
PARSER_TOKEN(TOK_HAVING, "HAVING", false)
@@ -275,6 +276,7 @@ PARSER_TOKEN(TOK_LAST_VALUE, "LAST_VALUE", true)
275276
PARSER_TOKEN(TOK_LASTNAME, "LASTNAME", true)
276277
PARSER_TOKEN(TOK_LEAD, "LEAD", true)
277278
PARSER_TOKEN(TOK_LEADING, "LEADING", false)
279+
PARSER_TOKEN(TOK_LEAST, "LEAST", false)
278280
PARSER_TOKEN(TOK_LEAVE, "LEAVE", true)
279281
PARSER_TOKEN(TOK_LEFT, "LEFT", false)
280282
PARSER_TOKEN(TOK_LEGACY, "LEGACY", true)

src/dsql/parse.y

+6
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,8 @@ using namespace Firebird;
710710
%token <metaNamePtr> NAMED_ARG_ASSIGN
711711
%token <metaNamePtr> RTRIM
712712
%token <metaNamePtr> UNLIST
713+
%token <metaNamePtr> GREATEST
714+
%token <metaNamePtr> LEAST
713715

714716
// precedence declarations for expression evaluation
715717

@@ -4595,6 +4597,8 @@ keyword_or_column
45954597
| CALL
45964598
| LTRIM
45974599
| RTRIM
4600+
| GREATEST
4601+
| LEAST
45984602
;
45994603

46004604
col_opt
@@ -8659,8 +8663,10 @@ system_function_std_syntax
86598663
| EXP
86608664
| FLOOR
86618665
| GEN_UUID
8666+
| GREATEST
86628667
| HEX_DECODE
86638668
| HEX_ENCODE
8669+
| LEAST
86648670
| LEFT
86658671
| LN
86668672
| LOG

src/jrd/SysFunction.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -6950,10 +6950,12 @@ const SysFunction SysFunction::functions[] =
69506950
{"FIRST_DAY", 2, 2, true, setParamsFirstLastDay, makeFirstLastDayResult, evlFirstLastDay, (void*) funFirstDay},
69516951
{"FLOOR", 1, 1, true, setParamsDblDec, makeCeilFloor, evlFloor, NULL},
69526952
{"GEN_UUID", 0, 1, false, NULL, makeUuid, evlGenUuid, NULL},
6953+
{"GREATEST", 1, -1, true, setParamsFromList, makeFromListResult, evlMaxMinValue, (void*) funMaxValue},
69536954
{"HASH", 1, 2, true, setParamsHash, makeHash, evlHash, NULL},
69546955
{"HEX_DECODE", 1, 1, true, NULL, makeDecodeHex, evlDecodeHex, NULL},
69556956
{"HEX_ENCODE", 1, 1, true, NULL, makeEncodeHex, evlEncodeHex, NULL},
69566957
{"LAST_DAY", 2, 2, true, setParamsFirstLastDay, makeFirstLastDayResult, evlFirstLastDay, (void*) funLastDay},
6958+
{"LEAST", 1, -1, true, setParamsFromList, makeFromListResult, evlMaxMinValue, (void*) funMinValue},
69576959
{"LEFT", 2, 2, true, setParamsSecondInteger, makeLeftRight, evlLeft, NULL},
69586960
{"LN", 1, 1, true, setParamsDblDec, makeDblDecResult, evlLnLog10, (void*) funLnat},
69596961
{"LOG", 2, 2, true, setParamsDblDec, makeDblDecResult, evlLog, NULL},

0 commit comments

Comments
 (0)