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

Reply via email to