Changeset: 792e60fc13cd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=792e60fc13cd
Modified Files:
        monetdb5/modules/mal/Tests/inspect05.stable.out
        monetdb5/modules/mal/Tests/inspect05.stable.out.Windows
        sql/backends/monet5/UDF/80_udf.sql
        sql/backends/monet5/UDF/udf.c
        sql/backends/monet5/UDF/udf.h
        sql/backends/monet5/UDF/udf.mal
        sql/test/leaks/Tests/check0.stable.out
        sql/test/leaks/Tests/check1.stable.out
        sql/test/leaks/Tests/check2.stable.out
        sql/test/leaks/Tests/check3.stable.out
        sql/test/leaks/Tests/check4.stable.out
        sql/test/leaks/Tests/check5.stable.out
        sql/test/mapi/Tests/php_monetdb.stable.out
Branch: Dec2011
Log Message:

UDF: added another example: fuse()

to fuse two N-byte integer values into one 2N-byte integer value


diffs (truncated from 572 to 300 lines):

diff --git a/monetdb5/modules/mal/Tests/inspect05.stable.out 
b/monetdb5/modules/mal/Tests/inspect05.stable.out
--- a/monetdb5/modules/mal/Tests/inspect05.stable.out
+++ b/monetdb5/modules/mal/Tests/inspect05.stable.out
@@ -28,7 +28,13 @@ end main;
 # str                          str             str             str             
                                                                                
                                        str                                     
                  # type
 
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
 [ "main",                        "function",     "user",         "():void;",   
                                                                                
                                          "nil"                                 
                  ]
+[ "fuse",                "command",      "udf",          
"(one:int,two:int):lng ",                                                       
                                        "UDFfuse_int_lng;"                      
]
+[ "fuse",                "command",      "udf",          
"(one:sht,two:sht):int ",                                                       
                                        "UDFfuse_sht_int;"                      
]
+[ "fuse",                "command",      "udf",          
"(one:bte,two:bte):sht ",                                                       
                                        "UDFfuse_bte_sht;"                      
]
 [ "reverse",             "command",      "udf",          "(ra1:str):str ",     
                                                                                
                  "UDFreverse;"                                   ]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:int],two:bat[:oid,:int]):bat[:oid,:lng] ",                      
                                        "UDFBATfuse;"                           
]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:sht],two:bat[:oid,:sht]):bat[:oid,:int] ",                      
                                        "UDFBATfuse;"                           
]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:bte],two:bat[:oid,:bte]):bat[:oid,:sht] ",                      
                                        "UDFBATfuse;"                           
]
 [ "reverse",                     "command",      "batudf",       
"(b:bat[:oid,:str]):bat[:oid,:str] ",                                           
                                                "UDFBATreverse;"                
        ]
 [ "angsep",                      "command",      "lsst",         
"(ra1:dbl,dec1:dbl,ra2:dbl,dec2:dbl):dbl ",                                     
                                "qserv_angSep;"                                 
]
 [ "ptinsphpoly",                 "pattern",      "lsst",         
"(ra:dbl,dec:dbl,list:dbl...):int ",                                            
                                "qserv_ptInSphPoly;"                            
]
diff --git a/monetdb5/modules/mal/Tests/inspect05.stable.out.Windows 
b/monetdb5/modules/mal/Tests/inspect05.stable.out.Windows
--- a/monetdb5/modules/mal/Tests/inspect05.stable.out.Windows
+++ b/monetdb5/modules/mal/Tests/inspect05.stable.out.Windows
@@ -28,7 +28,13 @@ end main;
 # str                          str             str             str             
                                                                                
                                        str                                     
                  # type
 
#-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------#
 [ "main",                        "function",     "user",         "():void;",   
                                                                                
                                          "nil"                                 
                  ]
+[ "fuse",                "command",      "udf",          
"(one:int,two:int):lng ",                                                       
                                        "UDFfuse_int_lng;"                      
]
+[ "fuse",                "command",      "udf",          
"(one:sht,two:sht):int ",                                                       
                                        "UDFfuse_sht_int;"                      
]
+[ "fuse",                "command",      "udf",          
"(one:bte,two:bte):sht ",                                                       
                                        "UDFfuse_bte_sht;"                      
]
 [ "reverse",             "command",      "udf",          "(ra1:str):str ",     
                                                                                
                  "UDFreverse;"                                   ]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:int],two:bat[:oid,:int]):bat[:oid,:lng] ",                      
                                        "UDFBATfuse;"                           
]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:sht],two:bat[:oid,:sht]):bat[:oid,:int] ",                      
                                        "UDFBATfuse;"                           
]
+[ "fuse",                "command",      "batudf",       
"(one:bat[:oid,:bte],two:bat[:oid,:bte]):bat[:oid,:sht] ",                      
                                        "UDFBATfuse;"                           
]
 [ "reverse",                     "command",      "batudf",       
"(b:bat[:oid,:str]):bat[:oid,:str] ",                                           
                                                "UDFBATreverse;"                
        ]
 [ "angsep",              "command",      "lsst",         
"(ra1:dbl,dec1:dbl,ra2:dbl,dec2:dbl):dbl ",                                     
                                                                                
                                                                                
                        "qserv_angSep;"                         ]
 [ "ptinsphpoly",         "pattern",      "lsst",         
"(ra:dbl,dec:dbl,list:dbl...):int ",                                            
                                                                                
                                                                                
                        "qserv_ptInSphPoly;"                    ]
diff --git a/sql/backends/monet5/UDF/80_udf.sql 
b/sql/backends/monet5/UDF/80_udf.sql
--- a/sql/backends/monet5/UDF/80_udf.sql
+++ b/sql/backends/monet5/UDF/80_udf.sql
@@ -20,3 +20,16 @@ All Rights Reserved.
 -- Reverse a string
 create function reverse(src string)
 returns string external name udf.reverse;
+
+
+-- fuse two (1-byte) tinyint values into one (2-byte) smallint value
+create function fuse(one tinyint, two tinyint)
+returns smallint external name udf.fuse;
+
+-- fuse two (2-byte) smallint values into one (4-byte) integer value
+create function fuse(one smallint, two smallint)
+returns integer external name udf.fuse;
+
+-- fuse two (4-byte) integer values into one (8-byte) bigint value
+create function fuse(one integer, two integer)
+returns bigint external name udf.fuse;
diff --git a/sql/backends/monet5/UDF/udf.c b/sql/backends/monet5/UDF/udf.c
--- a/sql/backends/monet5/UDF/udf.c
+++ b/sql/backends/monet5/UDF/udf.c
@@ -117,3 +117,120 @@ bunins_failed:
        BBPreleaseref(*ret);
        throw(MAL, "batudf.reverse", OPERATION_FAILED " During bulk operation");
 }
+
+
+/* scalar fuse */
+
+#define UDFfuse_scalar_impl(in,uin,out,shift)                          \
+/* fuse two (shift-byte) in values into one (2*shift-byte) out value */        
\
+str UDFfuse_##in##_##out ( out *ret , in *one , in *two )              \
+{                                                                      \
+       if (ret == NULL || one == NULL || two == NULL)                  \
+               throw(MAL, "udf.fuse", RUNTIME_OBJECT_MISSING);         \
+       if (*one == in##_nil || *two == in##_nil)                       \
+               *ret = out##_nil;                                       \
+       else                                                            \
+               *ret = ( ((out)((uin)*one)) << shift ) | ((uin)*two);   \
+       return MAL_SUCCEED;                                             \
+}
+
+UDFfuse_scalar_impl(bte,unsigned char ,sht, 8)
+UDFfuse_scalar_impl(sht,unsigned short,int,16)
+UDFfuse_scalar_impl(int,unsigned int  ,lng,32)
+
+
+/* BAT fuse */
+
+str UDFBATfuse(int *ires, int *ione, int *itwo)
+{
+       BAT *bres, *bone, *btwo;
+
+       /* check for NULL pointers */
+       if (ires == NULL || ione == NULL || itwo == NULL)
+               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
+
+       /* locate the BAT in the buffer pool */
+       if ((bone = BATdescriptor(*ione)) == NULL)
+               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
+
+       /* locate the BAT in the buffer pool */
+       if ((btwo = BATdescriptor(*itwo)) == NULL) {
+               BBPreleaseref(bone->batCacheid);
+               throw(MAL, "batudf.fuse", RUNTIME_OBJECT_MISSING);
+       }
+
+       /* check for dense & aligned heads */
+       if (!BAThdense(bone) || !BAThdense(btwo) || BATcount(bone) != 
BATcount(btwo) || bone->hseqbase != btwo->hseqbase) {
+               BBPreleaseref(bone->batCacheid);
+               BBPreleaseref(btwo->batCacheid);
+               throw(MAL, "batudf.fuse", "heads of input BATs must be 
aligned");
+       }
+
+       /* check tail types */
+       if (bone->ttype != btwo->ttype) {
+               BBPreleaseref(bone->batCacheid);
+               BBPreleaseref(btwo->batCacheid);
+               throw(MAL, "batudf.fuse", "tails of input BATs must be 
identical");
+       }
+
+#define UDFBATfuse_TYPE(in,uin,out,shift)                                      
        \
+{                                                                              
        \
+       in *one, *two;                                                          
        \
+       out *res;                                                               
        \
+       BUN i, n = BATcount(bone);                                              
        \
+                                                                               
        \
+       /* create the result container */                                       
        \
+       bres = BATnew(TYPE_void, TYPE_##out, n);                                
        \
+       if (bres == NULL) {                                                     
        \
+               BBPreleaseref(bone->batCacheid);                                
        \
+               BBPreleaseref(btwo->batCacheid);                                
        \
+               throw(MAL, "batudf.fuse", MAL_MALLOC_FAIL);                     
        \
+       }                                                                       
        \
+                                                                               
        \
+       one = (in *) Tloc(bone, BUNfirst(bone));                                
        \
+       two = (in *) Tloc(btwo, BUNfirst(btwo));                                
        \
+       res = (out*) Tloc(bres, BUNfirst(bres));                                
        \
+                                                                               
        \
+       for (i = 0; i < n; i++)                                                 
        \
+               if (one[i] == in##_nil || two[i] == in##_nil)                   
        \
+                       res[i] = out##_nil;                                     
        \
+               else                                                            
        \
+                       res[i] = ( ((out)((uin)one[i])) << shift ) | 
((uin)two[i]);     \
+                                                                               
        \
+       BATsetcount(bres, n);                                                   
        \
+}
+
+       switch (bone->ttype) {
+       case TYPE_bte:
+               UDFBATfuse_TYPE(bte,unsigned char ,sht, 8)
+               break;
+       case TYPE_sht:
+               UDFBATfuse_TYPE(sht,unsigned short,int,16)
+               break;
+       case TYPE_int:
+               UDFBATfuse_TYPE(int,unsigned int  ,lng,32)
+               break;
+       default:
+               throw(MAL, "batudf.fuse", "tails of input BATs must be one of 
{bte, sht, int}");
+       }
+
+       /* manage the properties of the result */
+       bres->hdense = BAThdense(bone);
+       BATseqbase(bres, bone->hseqbase);
+       bres->hsorted = GDK_SORTED;
+       BATkey(bone, TRUE);
+
+       if (BATtordered(bone)&1 && (BATtkey(bone) || BATtordered(btwo)&1))
+               bres->tsorted = GDK_SORTED;
+       else
+               bres->tsorted = 0;
+       BATkey(BATmirror(bres), BATtkey(bone) || BATtkey(btwo));
+
+       BBPreleaseref(bone->batCacheid);
+       BBPreleaseref(btwo->batCacheid);
+
+       *ires = bres->batCacheid;
+       BBPkeepref(*ires);
+
+       return MAL_SUCCEED;
+}
diff --git a/sql/backends/monet5/UDF/udf.h b/sql/backends/monet5/UDF/udf.h
--- a/sql/backends/monet5/UDF/udf.h
+++ b/sql/backends/monet5/UDF/udf.h
@@ -35,4 +35,12 @@
 udf_export str UDFreverse(str *ret, str *src);
 udf_export str UDFBATreverse(int *ret, int *bid);
 
+#define UDFfuse_scalar_decl(in,out) \
+        udf_export str UDFfuse_##in##_##out(out *ret, in *one, in *two)
+UDFfuse_scalar_decl(bte,sht);
+UDFfuse_scalar_decl(sht,int);
+UDFfuse_scalar_decl(int,lng);
+
+udf_export str UDFBATfuse(int *ret, int *one, int *two);
+
 #endif /* _SQL_UDF_H_ */
diff --git a/sql/backends/monet5/UDF/udf.mal b/sql/backends/monet5/UDF/udf.mal
--- a/sql/backends/monet5/UDF/udf.mal
+++ b/sql/backends/monet5/UDF/udf.mal
@@ -27,3 +27,34 @@ module batudf;
 command reverse(b:bat[:oid,:str]):bat[:oid,:str]
 address UDFBATreverse
 comment "Reverse a BAT of strings");
+
+
+
+module udf;
+
+command fuse(one:bte,two:bte):sht
+address UDFfuse_bte_sht
+comment "fuse two (1-byte) bte values into one (2-byte) sht value";
+
+command fuse(one:sht,two:sht):int
+address UDFfuse_sht_int
+comment "fuse two (2-byte) sht values into one (4-byte) int value";
+
+command fuse(one:int,two:int):lng
+address UDFfuse_int_lng
+comment "fuse two (4-byte) int values into one (8-byte) lng value";
+
+
+module batudf;
+
+command fuse(one:bat[:oid,:bte],two:bat[:oid,:bte]):bat[:oid,:sht]
+address UDFBATfuse
+comment "fuse two (1-byte) bte values into one (2-byte) sht value";
+
+command fuse(one:bat[:oid,:sht],two:bat[:oid,:sht]):bat[:oid,:int]
+address UDFBATfuse
+comment "fuse two (2-byte) sht values into one (4-byte) int value";
+
+command fuse(one:bat[:oid,:int],two:bat[:oid,:int]):bat[:oid,:lng]
+address UDFBATfuse
+comment "fuse two (4-byte) int values into one (8-byte) lng value";
diff --git a/sql/test/leaks/Tests/check0.stable.out 
b/sql/test/leaks/Tests/check0.stable.out
--- a/sql/test/leaks/Tests/check0.stable.out
+++ b/sql/test/leaks/Tests/check0.stable.out
@@ -51,28 +51,28 @@ Ready.
 [ "int",       "int",  16      ]
 [ "int",       "lng",  2       ]
 [ "int",       "str",  142     ]
-[ "oid",       "bit",  1151    ]
-[ "oid",       "bit",  1151    ]
+[ "oid",       "bit",  1154    ]
+[ "oid",       "bit",  1154    ]
 [ "oid",       "int",  19      ]
 [ "oid",       "int",  19      ]
-[ "oid",       "int",  1151    ]
-[ "oid",       "int",  1151    ]
-[ "oid",       "int",  1151    ]
-[ "oid",       "int",  1151    ]
-[ "oid",       "int",  3163    ]
-[ "oid",       "int",  3163    ]
-[ "oid",       "int",  3163    ]
-[ "oid",       "int",  3163    ]
-[ "oid",       "int",  3163    ]
+[ "oid",       "int",  1154    ]
+[ "oid",       "int",  1154    ]
+[ "oid",       "int",  1154    ]
+[ "oid",       "int",  1154    ]
+[ "oid",       "int",  3172    ]
+[ "oid",       "int",  3172    ]
+[ "oid",       "int",  3172    ]
+[ "oid",       "int",  3172    ]
+[ "oid",       "int",  3172    ]
 [ "oid",       "lng",  19      ]
 [ "oid",       "str",  1       ]
 [ "oid",       "str",  1       ]
 [ "oid",       "str",  19      ]
-[ "oid",       "str",  1151    ]
-[ "oid",       "str",  1151    ]
-[ "oid",       "str",  1151    ]
-[ "oid",       "str",  3163    ]
-[ "oid",       "str",  3163    ]
+[ "oid",       "str",  1154    ]
+[ "oid",       "str",  1154    ]
+[ "oid",       "str",  1154    ]
+[ "oid",       "str",  3172    ]
+[ "oid",       "str",  3172    ]
 #select 'transient', count(*) from bbp() as bbp where kind like 'tran%';
 % .L1, .bbp # table_name
 % L1,  L2 # name
diff --git a/sql/test/leaks/Tests/check1.stable.out 
b/sql/test/leaks/Tests/check1.stable.out
--- a/sql/test/leaks/Tests/check1.stable.out
+++ b/sql/test/leaks/Tests/check1.stable.out
@@ -35,8 +35,8 @@ Ready.
 [ "oid",       "bit",  58      ]
 [ "oid",       "bit",  58      ]
 [ "oid",       "bit",  296     ]
-[ "oid",       "bit",  1151    ]
-[ "oid",       "bit",  1151    ]
+[ "oid",       "bit",  1154    ]
+[ "oid",       "bit",  1154    ]
 [ "oid",       "int",  0       ]
 [ "oid",       "int",  0       ]
 [ "oid",       "int",  0       ]
@@ -83,15 +83,15 @@ Ready.
 [ "oid",       "int",  296     ]
 [ "oid",       "int",  296     ]
 [ "oid",       "int",  296     ]
-[ "oid",       "int",  1151    ]
-[ "oid",       "int",  1151    ]
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to