Changeset: f80f1afc063e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f80f1afc063e
Modified Files:
        monetdb5/modules/atoms/mtime.c
        sql/test/miscellaneous/Tests/simple_selects.sql
        sql/test/miscellaneous/Tests/simple_selects.stable.out
Branch: alloc-less-str
Log Message:

Allocate less at mtime module


diffs (truncated from 396 to 300 lines):

diff --git a/monetdb5/modules/atoms/mtime.c b/monetdb5/modules/atoms/mtime.c
--- a/monetdb5/modules/atoms/mtime.c
+++ b/monetdb5/modules/atoms/mtime.c
@@ -63,6 +63,8 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define is_str_nil strNil
 
+#define MTIME_STR_BUFFER_LENGTH MAX(strlen(str_nil) + 1, 512)
+
 
 #define DEC_VAR_R(TYPE, VAR) TYPE *restrict VAR
 
@@ -70,6 +72,14 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define DEC_ITER(TYPE, VAR) BATiter VAR
 
+#define DEC_BUFFER(OUTTYPE, RES, MALFUNC) \
+       OUTTYPE RES = GDKmalloc(MTIME_STR_BUFFER_LENGTH); \
+       if (!res) {     \
+               msg = createException(MAL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
+               goto bailout; \
+       } \
+
+#define DEC_INT(OUTTYPE, RES, MALFUNC) OUTTYPE RES = (OUTTYPE){0};
 
 #define INIT_VAR(VAR, VAR_BAT) VAR = Tloc(VAR_BAT, 0)
 
@@ -83,11 +93,9 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define APPEND_STR(MALFUNC) \
        if (tfastins_nocheckVAR(bn, i, res, Tsize(bn)) != GDK_SUCCEED) { \
-               GDKfree(res); \
                msg = createException(SQL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
                break; \
        } \
-       GDKfree(res); \
 
 #define GET_NEXT_ITER(VAR) BUNtvar(VAR, i)
 
@@ -95,6 +103,21 @@ MTIMEcurrent_timestamp(timestamp *ret)
 
 #define DEC_NOTHING(A, B) ;
 
+#define FINISH_BUFFER_SINGLE(MALFUNC) \
+bailout: \
+       *ret = NULL; \
+       if (!msg && res && !(*ret = GDKstrdup(res))) \
+               msg = createException(MAL, "batmtime." MALFUNC, SQLSTATE(HY013) 
MAL_MALLOC_FAIL); \
+       GDKfree(res); \
+
+#define FINISH_INT_SINGLE(MALFUNC) \
+       *ret = res;
+
+#define FINISH_BUFFER_MULTI(RES) GDKfree(RES);
+
+#define CLEAR_NOTHING(RES) ;
+
+
 #define COPYFLAGS      do { bn->tsorted = b1->tsorted; bn->trevsorted = 
b1->trevsorted; } while (0)
 #define SETFLAGS       do { bn->tsorted = bn->trevsorted = n < 2; } while (0)
 #define func1(NAME, NAMEBULK, MALFUNC, INTYPE, OUTTYPE, FUNC, SETFLAGS, 
FUNC_CALL, DEC_SRC, DEC_OUTPUT, \
@@ -152,11 +175,11 @@ bailout:                                                  
                                                                        \
 static str                                                                     
                                                        \
 NAMEBULK##_cand(bat *ret, const bat *bid, const bat *sid)                      
        \
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b1 = NULL, *s = NULL, *bn = NULL;                                  
                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC(INTYPE, src1);                                                  
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
        struct canditer ci;                                                     
                                                \
        oid off;                                                                
                                                        \
        bool nils = false;                                                      
                                                \
@@ -205,26 +228,30 @@ bailout:                                                  
                                                                        \
 #define func1_noexcept(FUNC, RET, PARAM) RET = FUNC(PARAM)
 #define func1_except(FUNC, RET, PARAM) msg = FUNC(&RET, PARAM); if (msg) break;
 
-#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC, 
FUNC_CALL, DEC_INPUT1, DEC_INPUT2, DEC_SRC1, DEC_SRC2, DEC_OUTPUT, \
-                        INIT_SRC1, INIT_SRC2, INIT_OUTPUT, GET_NEXT_SRC1, 
GET_NEXT_SRC2, APPEND_NEXT)  \
+#define func2(NAME, NAMEBULK, MALFUNC, INTYPE1, INTYPE2, OUTTYPE, FUNC, 
FUNC_CALL, DEC_INPUT1, DEC_INPUT2, DEC_SRC1, DEC_SRC2, DEC_OUTPUT, DEC_EXTRA, \
+                        INIT_SRC1, INIT_SRC2, INIT_OUTPUT, GET_NEXT_SRC1, 
GET_NEXT_SRC2, APPEND_NEXT, CLEAR_EXTRA_SINGLE, CLEAR_EXTRA_MULTI)   \
 static str                                                                     
                                                        \
 NAME(OUTTYPE *ret, const INTYPE1 *v1, const INTYPE2 *v2)                       
        \
 {                                                                              
                                                                \
        str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
+                                                                               
                                                                \
        do {                                                                    
                                                        \
-               FUNC_CALL(FUNC, (*ret), *v1, *v2);                              
                                \
+               FUNC_CALL(FUNC, res, *v1, *v2);                                 
                                \
        } while (0);                                                            
                                                \
+       CLEAR_EXTRA_SINGLE(MALFUNC);                                            
                                \
        return msg;                                                             
                                                        \
 }                                                                              
                                                                \
 static str                                                                     
                                                        \
 NAMEBULK(bat *ret, const bat *bid1, const bat *bid2)                           
        \
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b1 = NULL, *b2 = NULL, *bn = NULL;                                 
                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC1(INTYPE1, src1);                                                
                                        \
        DEC_SRC2(INTYPE2, src2);                                                
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
                                                                                
                                                                \
        b1 = BATdescriptor(*bid1);                                              
                                        \
        b2 = BATdescriptor(*bid2);                                              
                                        \
@@ -248,7 +275,6 @@ NAMEBULK(bat *ret, const bat *bid1, cons
        INIT_SRC2(src2, b2);                                                    
                                        \
        INIT_OUTPUT(dst, bn);                                                   
                                        \
        for (BUN i = 0; i < n; i++) {                                           
                                \
-               OUTTYPE res;                                                    
                                                \
                FUNC_CALL(FUNC, (res), (GET_NEXT_SRC1(src1)), 
(GET_NEXT_SRC2(src2)));   \
                APPEND_NEXT(MALFUNC);                                           
                                        \
        }                                                                       
                                                                \
@@ -259,6 +285,7 @@ NAMEBULK(bat *ret, const bat *bid1, cons
        bn->trevsorted = n < 2;                                                 
                                        \
        bn->tkey = false;                                                       
                                                \
 bailout:                                                                       
                                                        \
+       CLEAR_EXTRA_MULTI(res);                                                 
                                        \
        if (b1)                                                                 
                                                        \
                BBPunfix(b1->batCacheid);                                       
                                        \
        if (b2)                                                                 
                                                        \
@@ -272,11 +299,12 @@ bailout:                                                  
                                                                        \
 static str                                                                     
                                                        \
 NAMEBULK##_p1(bat *ret, const DEC_INPUT1(INTYPE1, src1), const bat *bid2)      
\
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b2 = NULL, *bn = NULL;                                             
                                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC2(INTYPE2, src2);                                                
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
                                                                                
                                                                \
        if ((b2 = BATdescriptor(*bid2)) == NULL) {                              
                        \
                msg = createException(MAL, "batmtime." MALFUNC,                 
                \
@@ -292,7 +320,6 @@ NAMEBULK##_p1(bat *ret, const DEC_INPUT1
        INIT_SRC2(src2, b2);                                                    
                                        \
        INIT_OUTPUT(dst, bn);                                                   
                                        \
        for (BUN i = 0; i < n; i++) {                                           
                                \
-               OUTTYPE res;                                                    
                                                \
                FUNC_CALL(FUNC, (res), *src1, (GET_NEXT_SRC2(src2)));           
        \
                APPEND_NEXT(MALFUNC);                                           
                                        \
        }                                                                       
                                                                \
@@ -303,6 +330,7 @@ NAMEBULK##_p1(bat *ret, const DEC_INPUT1
        bn->trevsorted = n < 2;                                                 
                                        \
        bn->tkey = false;                                                       
                                                \
 bailout:                                                                       
                                                        \
+       CLEAR_EXTRA_MULTI(res);                                                 
                                        \
        if (b2)                                                                 
                                                        \
                BBPunfix(b2->batCacheid);                                       
                                        \
        if (msg && bn)                                                          
                                                \
@@ -314,11 +342,12 @@ bailout:                                                  
                                                                        \
 static str                                                                     
                                                        \
 NAMEBULK##_p2(bat *ret, const bat *bid1, const DEC_INPUT2(INTYPE2, src2))      
\
 {                                                                              
                                                                \
+       str msg = MAL_SUCCEED;                                                  
                                        \
        BAT *b1 = NULL, *bn = NULL;                                             
                                        \
        BUN n;                                                                  
                                                        \
        DEC_SRC1(INTYPE1, src1);                                                
                                        \
        DEC_OUTPUT(OUTTYPE, dst);                                               
                                        \
-       str msg = MAL_SUCCEED;                                                  
                                        \
+       DEC_EXTRA(OUTTYPE, res, MALFUNC);                                       
                                \
                                                                                
                                                                \
        if ((b1 = BATdescriptor(*bid1)) == NULL) {                              
                        \
                msg = createException(MAL, "batmtime." MALFUNC,                 
                \
@@ -334,7 +363,6 @@ NAMEBULK##_p2(bat *ret, const bat *bid1,
        INIT_SRC1(src1, b1);                                                    
                                        \
        INIT_OUTPUT(dst, bn);                                                   
                                        \
        for (BUN i = 0; i < n; i++) {                                           
                                \
-               OUTTYPE res;                                                    
                                                \
                FUNC_CALL(FUNC, (res), (GET_NEXT_SRC1(src1)), *src2);           
        \
                APPEND_NEXT(MALFUNC);                                           
                                        \
        }                                                                       
                                                                \
@@ -345,6 +373,7 @@ NAMEBULK##_p2(bat *ret, const bat *bid1,
        bn->trevsorted = n < 2;                                                 
                                        \
        bn->tkey = false;                                                       
                                                \
 bailout:                                                                       
                                                        \
+       CLEAR_EXTRA_MULTI(res);                                                 
                                        \
        if (b1)                                                                 
                                                        \
                BBPunfix(b1->batCacheid);                                       
                                        \
        if (msg && bn)                                                          
                                                \
@@ -365,9 +394,9 @@ date_diff_imp(const date d1, const date 
        return is_int_nil(diff) ? lng_nil : (lng) diff * (lng) (24*60*60*1000);
 }
 func2(MTIMEdate_diff, MTIMEdate_diff_bulk, "diff", date, date, lng, 
date_diff_imp, func2_noexcept, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEdaytime_diff_msec, MTIMEdaytime_diff_msec_bulk, "diff", daytime, 
daytime, lng, daytime_diff, func2_noexcept, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline str
 date_sub_msec_interval(date *ret, date d, lng ms)
@@ -392,9 +421,9 @@ date_add_msec_interval(date *ret, date d
        return MAL_SUCCEED;
 }
 func2(MTIMEdate_sub_msec_interval, MTIMEdate_sub_msec_interval_bulk, 
"date_sub_msec_interval", date, lng, date, date_sub_msec_interval, 
func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEdate_add_msec_interval, MTIMEdate_add_msec_interval_bulk, 
"date_add_msec_interval", date, lng, date, date_add_msec_interval, 
func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline str
 timestamp_sub_msec_interval(timestamp *ret, timestamp ts, lng ms)
@@ -419,9 +448,9 @@ timestamp_add_msec_interval(timestamp *r
        return MAL_SUCCEED;
 }
 func2(MTIMEtimestamp_sub_msec_interval, MTIMEtimestamp_sub_msec_interval_bulk, 
"timestamp_sub_msec_interval", timestamp, lng, timestamp, 
timestamp_sub_msec_interval, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEtimestamp_add_msec_interval, MTIMEtimestamp_add_msec_interval_bulk, 
"timestamp_add_msec_interval", timestamp, lng, timestamp, 
timestamp_add_msec_interval, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline str
 timestamp_sub_month_interval(timestamp *ret, timestamp ts, int m)
@@ -446,9 +475,9 @@ timestamp_add_month_interval(timestamp *
        return MAL_SUCCEED;
 }
 func2(MTIMEtimestamp_sub_month_interval, 
MTIMEtimestamp_sub_month_interval_bulk, "timestamp_sub_month_interval", 
timestamp, int, timestamp, timestamp_sub_month_interval, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEtimestamp_add_month_interval, 
MTIMEtimestamp_add_month_interval_bulk, "timestamp_add_month_interval", 
timestamp, int, timestamp, timestamp_add_month_interval, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline daytime
 time_sub_msec_interval(const daytime t, const lng ms)
@@ -465,9 +494,9 @@ time_add_msec_interval(const daytime t, 
        return daytime_add_usec_modulo(t, ms * 1000);
 }
 func2(MTIMEtime_sub_msec_interval, MTIMEtime_sub_msec_interval_bulk, 
"time_sub_msec_interval", daytime, lng, daytime, time_sub_msec_interval, 
func2_noexcept, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEtime_add_msec_interval, MTIMEtime_add_msec_interval_bulk, 
"time_add_msec_interval", daytime, lng, daytime, time_add_msec_interval, 
func2_noexcept, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline str
 date_submonths(date *ret, date d, int m)
@@ -492,9 +521,9 @@ date_addmonths(date *ret, date d, int m)
        return MAL_SUCCEED;
 }
 func2(MTIMEdate_submonths, MTIMEdate_submonths_bulk, "date_submonths", date, 
int, date, date_submonths, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 func2(MTIMEdate_addmonths, MTIMEdate_addmonths_bulk, "date_addmonths", date, 
int, date, date_addmonths, func2_except, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 func1(MTIMEdate_extract_century, MTIMEdate_extract_century_bulk, 
"date_century", date, int, date_century, COPYFLAGS, func1_noexcept, \
          DEC_VAR_R, DEC_VAR_R, INIT_VAR, INIT_VAR, GET_NEXT_VAR)
@@ -538,7 +567,7 @@ TSDIFF(timestamp t1, timestamp t2)
        return diff;
 }
 func2(MTIMEtimestamp_diff_msec, MTIMEtimestamp_diff_msec_bulk, "diff", 
timestamp, timestamp, lng, TSDIFF, func2_noexcept, \
-         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, INIT_VAR, 
INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR)
+         DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_VAR_R, DEC_INT, 
INIT_VAR, INIT_VAR, INIT_VAR, GET_NEXT_VAR, GET_NEXT_VAR, APPEND_VAR, 
FINISH_INT_SINGLE, CLEAR_NOTHING)
 
 static inline int
 timestamp_century(const timestamp t)
@@ -781,18 +810,14 @@ MTIMElocal_timezone_msec(lng *ret)
 }
 
 static str
-timestamp_to_str(str *ret, const timestamp *d, str *format,
-                                const char *type, const char *malfunc)
+timestamp_to_str(str *buf, const timestamp *d, str *format, const char *type, 
const char *malfunc)
 {
-       char buf[512];
        date dt;
        daytime t;
        struct tm tm;
 
        if (is_timestamp_nil(*d) || strNil(*format)) {
-               *ret = GDKstrdup(str_nil);
-               if (*ret == NULL)
-                       throw(MAL, malfunc, SQLSTATE(HY013) MAL_MALLOC_FAIL);
+               strcpy(*buf, str_nil);
                return MAL_SUCCEED;
        }
        dt = timestamp_date(*d);
@@ -807,11 +832,8 @@ timestamp_to_str(str *ret, const timesta
                .tm_min = daytime_min(t),
                .tm_sec = daytime_sec(t),
        };
-       if (strftime(buf, sizeof(buf), *format, &tm) == 0)
+       if (strftime(*buf, MTIME_STR_BUFFER_LENGTH, *format, &tm) == 0)
                throw(MAL, malfunc, "cannot convert %s", type);
-       *ret = GDKstrdup(buf);
-       if (*ret == NULL)
-               throw(MAL, malfunc, SQLSTATE(HY013) MAL_MALLOC_FAIL);
        return MAL_SUCCEED;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to