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 -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org