Changeset: b5c286fa6e79 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/b5c286fa6e79 Modified Files: sql/backends/monet5/generator/generator.c Branch: default Log Message:
Overflow checking is complicated, especially if multiple types are involved.
diffs (83 lines):
diff --git a/sql/backends/monet5/generator/generator.c
b/sql/backends/monet5/generator/generator.c
--- a/sql/backends/monet5/generator/generator.c
+++ b/sql/backends/monet5/generator/generator.c
@@ -64,6 +64,18 @@ VLTgenerator_noop(Client cntxt, MalBlkPt
return MAL_SUCCEED;
}
+#define check_bte() (s > 0 ? f > l : f < l)
+#define check_sht() (s > 0 ? f > l : f < l)
+#define check_int() (s > 0 ? f > l : f < l)
+#if SIZEOF_BUN < SIZEOF_LNG
+#define check_lng() (s > 0 ? f > l || s > (lng) BUN_MAX : f < l || s < -(lng)
BUN_MAX)
+#else
+#define check_lng() (s > 0 ? f > l : f < l)
+#endif
+#ifdef HAVE_HGE
+#define check_hge() (s > 0 ? f > l || s > (lng) BUN_MAX : f < l || s < -(lng)
BUN_MAX)
+#endif
+
/*
* The base line consists of materializing the generator iterator value
*/
@@ -73,16 +85,53 @@ VLTgenerator_noop(Client cntxt, MalBlkPt
f = *getArgReference_##TPE(stk, pci, 1);
\
l = *getArgReference_##TPE(stk, pci, 2);
\
if ( pci->argc == 3)
\
- s = f<l? (TPE) 1: (TPE)-1;
\
+ s = f<=l? (TPE) 1: (TPE)-1;
\
else s = *getArgReference_##TPE(stk,pci, 3);
\
- if (s == 0 || (s > 0 && f > l) || (s < 0 && f < l) ||
is_##TPE##_nil(f) || is_##TPE##_nil(l)) \
+ if (s == 0 || is_##TPE##_nil(f) || is_##TPE##_nil(l) ||
check_##TPE()) \
throw(MAL, "generator.table",
\
SQLSTATE(42000) "Illegal generator range");
\
- if (s < 0)
\
- n = ((BUN)f - l);
\
- else
\
- n = ((BUN)l - f);
\
- step = s<0?-s:s;
\
+ if (f == l)
\
+ n = 0;
\
+ else if (f > l) {
\
+ /* n = f - l */
\
+ if (l < 1) {
\
+ if ((lng) BUN_MAX + l < f)
\
+ throw(MAL, "generator.table",
\
+ SQLSTATE(42000) "Illegal
generator range"); \
+ else if (GDK_##TPE##_max + l < f)
\
+ n = (BUN) ((lng) f - l);
\
+ else
\
+ n = (BUN) (f - l);
\
+ } else {
\
+ if (-(lng)BUN_MAX + l > f)
\
+ throw(MAL, "generator.table",
\
+ SQLSTATE(42000) "Illegal
generator range"); \
+ else if (-GDK_##TPE##_max + l > f)
\
+ n = (BUN) ((lng) f - l);
\
+ else
\
+ n = (BUN) (f - l);
\
+ }
\
+ } else {
\
+ /* n = l - f */
\
+ if (f < 1) {
\
+ if ((lng) BUN_MAX + f < l)
\
+ throw(MAL, "generator.table",
\
+ SQLSTATE(42000) "Illegal
generator range"); \
+ else if (GDK_##TPE##_max + f < l)
\
+ n = (BUN) ((lng) l - f);
\
+ else
\
+ n = (BUN) (l - f);
\
+ } else {
\
+ if (-(lng)BUN_MAX + f > l)
\
+ throw(MAL, "generator.table",
\
+ SQLSTATE(42000) "Illegal
generator range"); \
+ else if (-GDK_##TPE##_max + f > l)
\
+ n = (BUN) ((lng) l - f);
\
+ else
\
+ n = (BUN) (l - f);
\
+ }
\
+ }
\
+ step = (BUN) (s < 0 ? -s : s);
\
n = n/step;
\
if ((TPE) (n * s + f) != l)
\
n++;
\
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]
