Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : static inline str
14 1456 : FUN(do_,TP1,_dec2dec_,TP2) (TP2 *restrict res, int s1, TP1 val, int p, int s2)
15 : {
16 1456 : ValRecord v1, v2;
17 :
18 1456 : VALset(&v1, TPE(TP1), &val);
19 1456 : v2.bat = false;
20 1456 : v2.vtype = TPE(TP2);
21 1456 : if (VARconvert(&v2, &v1, s1, s2, p) != GDK_SUCCEED)
22 15 : throw(SQL, STRNG(FUN(,TP1,_2_,TP2)), GDK_EXCEPTION);
23 1441 : *res = *(TP2 *) VALptr(&v2);
24 1441 : return MAL_SUCCEED;
25 : }
26 :
27 : #if IS_NUMERIC(TP1)
28 : str
29 197 : FUN(,TP1,_dec2_,TP2) (TP2 *res, const int *s1, const TP1 *v)
30 : {
31 197 : return FUN(do_,TP1,_dec2dec_,TP2) (res, *s1, *v, 0, 0);
32 : }
33 :
34 : str
35 820 : FUN(,TP1,_dec2dec_,TP2) (TP2 *res, const int *S1, const TP1 *v, const int *d2, const int *S2)
36 : {
37 820 : return FUN(do_,TP1,_dec2dec_,TP2) (res, *S1, *v, *d2, *S2);
38 : }
39 : #endif
40 :
41 : str
42 439 : FUN(,TP1,_num2dec_,TP2) (TP2 *res, const TP1 *v, const int *d2, const int *s2)
43 : {
44 439 : return FUN(do_,TP1,_dec2dec_,TP2)(res, 0, *v, *d2, *s2);
45 : }
46 :
47 : #if IS_NUMERIC(TP1)
48 : str
49 184 : FUN(bat,TP1,_dec2_,TP2) (bat *res, const int *s1, const bat *bid, const bat *sid)
50 : {
51 184 : BAT *b, *s = NULL, *bn;
52 :
53 184 : if ((b = BATdescriptor(*bid)) == NULL) {
54 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_dec2_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
55 : }
56 184 : if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == NULL) {
57 0 : BBPunfix(b->batCacheid);
58 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_dec2_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
59 : }
60 184 : bn = BATconvert(b, s, TPE(TP2), *s1, 0, 0);
61 183 : BBPunfix(b->batCacheid);
62 184 : BBPreclaim(s);
63 184 : if (bn == NULL)
64 1 : throw(SQL, "sql."STRNG(FUN(dec,TP1,_2_,TP2)), GDK_EXCEPTION);
65 183 : *res = bn->batCacheid;
66 183 : BBPkeepref(bn);
67 183 : return MAL_SUCCEED;
68 : }
69 :
70 : str
71 821 : FUN(bat,TP1,_dec2dec_,TP2) (bat *res, const int *S1, const bat *bid, const bat *sid, const int *d2, const int *S2)
72 : {
73 821 : BAT *b, *s = NULL, *bn;
74 :
75 821 : if ((b = BATdescriptor(*bid)) == NULL) {
76 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_dec2dec_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
77 : }
78 823 : if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == NULL) {
79 0 : BBPunfix(b->batCacheid);
80 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_dec2_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
81 : }
82 823 : bn = BATconvert(b, s, TPE(TP2), *S1, *S2, *d2);
83 821 : BBPunfix(b->batCacheid);
84 822 : BBPreclaim(s);
85 822 : if (bn == NULL)
86 0 : throw(SQL, "sql."STRNG(FUN(,TP1,_dec2dec_,TP2)), GDK_EXCEPTION);
87 :
88 822 : *res = bn->batCacheid;
89 822 : BBPkeepref(bn);
90 822 : return MAL_SUCCEED;
91 : }
92 : #endif
93 :
94 : str
95 839 : FUN(bat,TP1,_num2dec_,TP2) (bat *res, const bat *bid, const bat *sid, const int *d2, const int *s2)
96 : {
97 839 : BAT *b, *s = NULL, *bn;
98 :
99 839 : if ((b = BATdescriptor(*bid)) == NULL) {
100 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_num2dec_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
101 : }
102 840 : if (sid && !is_bat_nil(*sid) && (s = BATdescriptor(*sid)) == NULL) {
103 0 : BBPunfix(b->batCacheid);
104 0 : throw(SQL, "batcalc."STRNG(FUN(,TP1,_dec2_,TP2)), SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
105 : }
106 840 : bn = BATconvert(b, s, TPE(TP2), 0, *s2, *d2);
107 839 : BBPunfix(b->batCacheid);
108 840 : BBPreclaim(s);
109 840 : if (bn == NULL)
110 0 : throw(SQL, "sql."STRNG(FUN(,TP1,_num2dec_,TP2)), GDK_EXCEPTION);
111 840 : *res = bn->batCacheid;
112 840 : BBPkeepref(bn);
113 840 : return MAL_SUCCEED;
114 : }
|