Skip to content

Commit a8af654

Browse files
authored
Handling overflow and incorrect outputs in case of certain money and smallmoney arithmetic and math functions. (#3865)
There were certain issues found both w.r.t overflow handling and certain functions and operations giving incorrect result for money and smallmoney datatype. This commit addresses those issues. Issue #1: Overflow of smallmoney arithmetic leading to TDS hang. Issue #2: Unhandled overflow cases leading to incorrect output. Issue #3: Fixeddecimal operators being resolved for smallmoney functions and operations leading to incorrect results. Task: BABEL-5745, BABEL-5757, BABEL-5756, BABEL-5747, BABEL-5754 Signed-off-by: Ayush Shah <ayushdsh@amazon.com>
1 parent 2b1c9b2 commit a8af654

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+25391
-305
lines changed

contrib/babelfishpg_common/sql/bit.sql

Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,3 +504,191 @@ WITH FUNCTION sys.varchar2bit(sys.VARCHAR) AS IMPLICIT;
504504

505505
CREATE CAST (bool AS sys.BIT)
506506
WITHOUT FUNCTION AS IMPLICIT;
507+
508+
509+
-- bit <op> smallmoney
510+
CREATE FUNCTION sys.bitsmallmoneypl(sys.BIT, sys.SMALLMONEY)
511+
RETURNS sys.SMALLMONEY
512+
AS 'babelfishpg_common', 'bitsmallmoneypl'
513+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
514+
515+
CREATE FUNCTION sys.bitsmallmoneymi(sys.BIT, sys.SMALLMONEY)
516+
RETURNS sys.SMALLMONEY
517+
AS 'babelfishpg_common', 'bitsmallmoneymi'
518+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
519+
520+
CREATE FUNCTION sys.bitsmallmoneymul(sys.BIT, sys.SMALLMONEY)
521+
RETURNS sys.SMALLMONEY
522+
AS 'babelfishpg_common', 'bitsmallmoneymul'
523+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
524+
525+
CREATE FUNCTION sys.bitsmallmoneydiv(sys.BIT, sys.SMALLMONEY)
526+
RETURNS sys.SMALLMONEY
527+
AS 'babelfishpg_common', 'bitsmallmoneydiv'
528+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
529+
530+
CREATE OPERATOR sys.+ (
531+
LEFTARG = sys.BIT,
532+
RIGHTARG = sys.SMALLMONEY,
533+
COMMUTATOR = +,
534+
PROCEDURE = sys.bitsmallmoneypl
535+
);
536+
537+
CREATE OPERATOR sys.- (
538+
LEFTARG = sys.BIT,
539+
RIGHTARG = sys.SMALLMONEY,
540+
PROCEDURE = sys.bitsmallmoneymi
541+
);
542+
543+
CREATE OPERATOR sys.* (
544+
LEFTARG = sys.BIT,
545+
RIGHTARG = sys.SMALLMONEY,
546+
PROCEDURE = sys.bitsmallmoneymul
547+
);
548+
549+
CREATE OPERATOR sys./ (
550+
LEFTARG = sys.BIT,
551+
RIGHTARG = sys.SMALLMONEY,
552+
PROCEDURE = sys.bitsmallmoneydiv
553+
);
554+
555+
556+
-- smallmoney <op> bit
557+
CREATE FUNCTION sys.smallmoneybitpl(sys.SMALLMONEY, sys.BIT)
558+
RETURNS sys.SMALLMONEY
559+
AS 'babelfishpg_common', 'smallmoneybitpl'
560+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
561+
562+
CREATE FUNCTION sys.smallmoneybitmi(sys.SMALLMONEY, sys.BIT)
563+
RETURNS sys.SMALLMONEY
564+
AS 'babelfishpg_common', 'smallmoneybitmi'
565+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
566+
567+
CREATE FUNCTION sys.smallmoneybitmul(sys.SMALLMONEY, sys.BIT)
568+
RETURNS sys.SMALLMONEY
569+
AS 'babelfishpg_common', 'smallmoneybitmul'
570+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
571+
572+
CREATE FUNCTION sys.smallmoneybitdiv(sys.SMALLMONEY, sys.BIT)
573+
RETURNS sys.SMALLMONEY
574+
AS 'babelfishpg_common', 'smallmoneybitdiv'
575+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
576+
577+
CREATE OPERATOR sys.+ (
578+
LEFTARG = sys.SMALLMONEY,
579+
RIGHTARG = sys.BIT,
580+
COMMUTATOR = +,
581+
PROCEDURE = sys.smallmoneybitpl
582+
);
583+
584+
CREATE OPERATOR sys.- (
585+
LEFTARG = sys.SMALLMONEY,
586+
RIGHTARG = sys.BIT,
587+
PROCEDURE = sys.smallmoneybitmi
588+
);
589+
590+
CREATE OPERATOR sys.* (
591+
LEFTARG = sys.SMALLMONEY,
592+
RIGHTARG = sys.BIT,
593+
PROCEDURE = sys.smallmoneybitmul
594+
);
595+
596+
CREATE OPERATOR sys./ (
597+
LEFTARG = sys.SMALLMONEY,
598+
RIGHTARG = sys.BIT,
599+
PROCEDURE = sys.smallmoneybitdiv
600+
);
601+
602+
603+
-- float <op> bit
604+
CREATE FUNCTION sys.floatbitpl(float8, sys.BIT)
605+
RETURNS sys.float
606+
AS 'babelfishpg_common', 'floatbitpl'
607+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
608+
609+
CREATE FUNCTION sys.floatbitmi(float8, sys.BIT)
610+
RETURNS sys.float
611+
AS 'babelfishpg_common', 'floatbitmi'
612+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
613+
614+
CREATE FUNCTION sys.floatbitmul(float8, sys.BIT)
615+
RETURNS sys.float
616+
AS 'babelfishpg_common', 'floatbitmul'
617+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
618+
619+
CREATE FUNCTION sys.floatbitdiv(float8, sys.BIT)
620+
RETURNS sys.float
621+
AS 'babelfishpg_common', 'floatbitdiv'
622+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
623+
624+
CREATE OPERATOR sys.+ (
625+
LEFTARG = float8,
626+
RIGHTARG = sys.BIT,
627+
COMMUTATOR = +,
628+
PROCEDURE = sys.floatbitpl
629+
);
630+
631+
CREATE OPERATOR sys.- (
632+
LEFTARG = float8,
633+
RIGHTARG = sys.BIT,
634+
PROCEDURE = sys.floatbitmi
635+
);
636+
637+
CREATE OPERATOR sys.* (
638+
LEFTARG = float8,
639+
RIGHTARG = sys.BIT,
640+
PROCEDURE = sys.floatbitmul
641+
);
642+
643+
CREATE OPERATOR sys./ (
644+
LEFTARG = float8,
645+
RIGHTARG = sys.BIT,
646+
PROCEDURE = sys.floatbitdiv
647+
);
648+
649+
650+
-- bit <op> float
651+
CREATE FUNCTION sys.bitfloatpl(sys.BIT, float8)
652+
RETURNS sys.float
653+
AS 'babelfishpg_common', 'bitfloatpl'
654+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
655+
656+
CREATE FUNCTION sys.bitfloatmi(sys.BIT, float8)
657+
RETURNS sys.float
658+
AS 'babelfishpg_common', 'bitfloatmi'
659+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
660+
661+
CREATE FUNCTION sys.bitfloatmul(sys.BIT, float8)
662+
RETURNS sys.float
663+
AS 'babelfishpg_common', 'bitfloatmul'
664+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
665+
666+
CREATE FUNCTION sys.bitfloatdiv(sys.BIT, float8)
667+
RETURNS sys.float
668+
AS 'babelfishpg_common', 'bitfloatdiv'
669+
LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
670+
671+
CREATE OPERATOR sys.+ (
672+
LEFTARG = sys.BIT,
673+
RIGHTARG = float8,
674+
COMMUTATOR = +,
675+
PROCEDURE = sys.bitfloatpl
676+
);
677+
678+
CREATE OPERATOR sys.- (
679+
LEFTARG = sys.BIT,
680+
RIGHTARG = float8,
681+
PROCEDURE = sys.bitfloatmi
682+
);
683+
684+
CREATE OPERATOR sys.* (
685+
LEFTARG = sys.BIT,
686+
RIGHTARG = float8,
687+
PROCEDURE = sys.bitfloatmul
688+
);
689+
690+
CREATE OPERATOR sys./ (
691+
LEFTARG = sys.BIT,
692+
RIGHTARG = float8,
693+
PROCEDURE = sys.bitfloatdiv
694+
);

0 commit comments

Comments
 (0)