List:Commits« Previous MessageNext Message »
From:Chad MILLER Date:November 6 2006 11:25pm
Subject:bk commit into 5.1 tree (cmiller:1.2339)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of cmiller. When cmiller does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2006-11-06 17:25:32-05:00, cmiller@stripped +5 -0
  Merge zippy.cornsilk.net:/home/cmiller/work/mysql/bug18761/my50-bug18761
  into  zippy.cornsilk.net:/home/cmiller/work/mysql/bug18761/my51-bug18761
  MERGE: 1.1810.2078.85

  BitKeeper/etc/collapsed@stripped, 2006-11-06 17:25:19-05:00, cmiller@stripped +1
-1
    auto-union
    MERGE: 1.5.1.6

  mysql-test/r/udf.result@stripped, 2006-11-06 17:25:29-05:00, cmiller@stripped +0 -0
    Auto merged
    MERGE: 1.3.1.5

  mysql-test/t/udf.test@stripped, 2006-11-06 17:25:29-05:00, cmiller@stripped +0 -0
    Auto merged
    MERGE: 1.8.1.1

  sql/item_func.cc@stripped, 2006-11-06 17:25:29-05:00, cmiller@stripped +0 -0
    Auto merged
    MERGE: 1.270.1.40

  sql/udf_example.c@stripped, 2006-11-06 17:25:29-05:00, cmiller@stripped +0 -0
    Auto merged
    MERGE: 1.29.1.2

# This is a BitKeeper patch.  What follows are the unified diffs for the
# set of deltas contained in the patch.  The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User:	cmiller
# Host:	zippy.cornsilk.net
# Root:	/home/cmiller/work/mysql/bug18761/my51-bug18761/RESYNC

--- 1.325/sql/item_func.cc	2006-11-06 17:25:37 -05:00
+++ 1.326/sql/item_func.cc	2006-11-06 17:25:37 -05:00
@@ -2700,38 +2700,51 @@ udf_handler::fix_fields(THD *thd, Item_r
     char *to=num_buffer;
     for (uint i=0; i < arg_count; i++)
     {
-      f_args.args[i]=0;
+      /*
+       For a constant argument i, args->args[i] points to the argument value. 
+       For non-constant, args->args[i] is NULL.
+      */
+      f_args.args[i]= NULL;         /* Non-const unless updated below. */
+
       f_args.lengths[i]= arguments[i]->max_length;
       f_args.maybe_null[i]= (char) arguments[i]->maybe_null;
       f_args.attributes[i]= arguments[i]->name;
       f_args.attribute_lengths[i]= arguments[i]->name_length;
 
-      switch(arguments[i]->type()) {
-      case Item::STRING_ITEM:			// Constant string !
+      switch (arguments[i]->result_type()) 
+      {
+      case STRING_RESULT:
+      case DECIMAL_RESULT:
       {
 	String *res=arguments[i]->val_str(&buffers[i]);
 	if (arguments[i]->null_value)
 	  continue;
+        if (arguments[i]->const_item())
 	f_args.args[i]=    (char*) res->ptr();
 	break;
       }
-      case Item::INT_ITEM:
+      case INT_RESULT:
 	*((longlong*) to) = arguments[i]->val_int();
 	if (!arguments[i]->null_value)
 	{
+          if (arguments[i]->const_item())
 	  f_args.args[i]=to;
 	  to+= ALIGN_SIZE(sizeof(longlong));
 	}
 	break;
-      case Item::REAL_ITEM:
+      case REAL_RESULT:
 	*((double*) to)= arguments[i]->val_real();
 	if (!arguments[i]->null_value)
 	{
+          if (arguments[i]->const_item())
 	  f_args.args[i]=to;
 	  to+= ALIGN_SIZE(sizeof(double));
 	}
 	break;
-      default:					// Skip these
+      case ROW_RESULT:
+      default:
+        // This case should never be chosen
+        DBUG_ASSERT(0);
 	break;
       }
     }

--- 1.31/sql/udf_example.c	2006-11-06 17:25:37 -05:00
+++ 1.32/sql/udf_example.c	2006-11-06 17:25:37 -05:00
@@ -165,6 +165,9 @@ void avgcost_reset( UDF_INIT* initid, UD
 void avgcost_clear( UDF_INIT* initid, char* is_null, char *error );
 void avgcost_add( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error );
 double avgcost( UDF_INIT* initid, UDF_ARGS* args, char* is_null, char *error );
+my_bool is_const_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
+char *is_const(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long
+               *length, char *is_null, char *error);
 
 
 /*************************************************************************
@@ -1074,5 +1077,32 @@ char *myfunc_argument_name(UDF_INIT *ini
   result[*length]= 0;
   return result;
 }
+
+
+
+my_bool is_const_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
+{
+  if (args->arg_count != 1)
+  {
+    strmov(message, "IS_CONST accepts only one argument");
+    return 1;
+  }
+  initid->ptr= (args->args[0] != NULL) ? 1 : 0;
+  return 0;
+}
+
+char * is_const(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long
+                *length, char *is_null, char *error)
+{
+  if (initid->ptr != 0) {
+    sprintf(result, "const");
+  } else {
+    sprintf(result, "not const");
+  }
+  *is_null= 0;
+  *length= strlen(result);
+  return result;
+}
+
 
 #endif /* HAVE_DLOPEN */

--- 1.15/BitKeeper/etc/collapsed	2006-11-06 17:25:37 -05:00
+++ 1.16/BitKeeper/etc/collapsed	2006-11-06 17:25:37 -05:00
@@ -15,3 +15,8 @@
 45214442pBGT9KuZEGixBH71jTzbOA
 45214a07hVsIGwvwa-WrO-jpeaSwVw
 452a92d0-31-8wSzSfZi165fcGcXPA
+454bb488ijVLOUK_GFjcoISE0GxPUA
+454bb9a8AwlGRC_wWLS2sNMoRBMRGw
+454c946ciQoR4dfTBZ0RTBmGJKp6lw
+454f6e7eAnfLD9OCbGr5X9KiKvfKcQ
+454f704bJiJy0_Nx2drY9P5kK3uOzg

--- 1.8/mysql-test/r/udf.result	2006-11-06 17:25:37 -05:00
+++ 1.9/mysql-test/r/udf.result	2006-11-06 17:25:37 -05:00
@@ -115,3 +115,36 @@ DROP FUNCTION sequence;
 DROP FUNCTION lookup;
 DROP FUNCTION reverse_lookup;
 DROP FUNCTION avgcost;
+CREATE FUNCTION is_const RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
+select
+is_const(3) as const,
+is_const(3.14) as const,
+is_const('fnord') as const,
+is_const(2+3) as const,
+is_const(rand()) as 'nc rand()',
+is_const(sin(3.14)) as const,
+is_const(upper('test')) as const;
+const	const	const	const	nc rand()	const	const
+const	const	const	const	not const	const	const
+create table bug18761 (n int);
+insert into bug18761 values (null),(2);
+select
+is_const(3) as const,
+is_const(3.14) as const,
+is_const('fnord') as const,
+is_const(2+3) as const,
+is_const(2+n) as 'nc  2+n  ',
+is_const(sin(n)) as 'nc sin(n)',
+is_const(sin(3.14)) as const,
+is_const(upper('test')) as const,
+is_const(rand()) as 'nc rand()',
+is_const(n) as 'nc   n   ',
+is_const(is_const(n)) as 'nc ic?(n)',
+is_const(is_const('c')) as const
+from
+bug18761;
+const	const	const	const	nc  2+n  	nc sin(n)	const	const	nc rand()	nc   n   	nc
ic?(n)	const
+const	const	const	const	not const	not const	const	const	not const	not const	not
const	const
+const	const	const	const	not const	not const	const	const	not const	not const	not
const	const
+drop table bug18761;
+drop function if exists is_const;

--- 1.9/mysql-test/t/udf.test	2006-11-06 17:25:37 -05:00
+++ 1.10/mysql-test/t/udf.test	2006-11-06 17:25:37 -05:00
@@ -143,4 +143,38 @@ DROP FUNCTION lookup;
 DROP FUNCTION reverse_lookup;
 DROP FUNCTION avgcost;
 
+#
+# Bug#18761: constant expression as UDF parameters not passed in as constant
+#
+--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
+eval CREATE FUNCTION is_const RETURNS STRING SONAME "$UDF_EXAMPLE_LIB";
 
+select
+  is_const(3) as const,
+  is_const(3.14) as const,
+  is_const('fnord') as const,
+  is_const(2+3) as const,
+  is_const(rand()) as 'nc rand()',
+  is_const(sin(3.14)) as const,
+  is_const(upper('test')) as const;
+
+create table bug18761 (n int);
+insert into bug18761 values (null),(2);
+select
+  is_const(3) as const,
+  is_const(3.14) as const,
+  is_const('fnord') as const,
+  is_const(2+3) as const,
+  is_const(2+n) as 'nc  2+n  ',
+  is_const(sin(n)) as 'nc sin(n)',
+  is_const(sin(3.14)) as const,
+  is_const(upper('test')) as const,
+  is_const(rand()) as 'nc rand()',
+  is_const(n) as 'nc   n   ',
+  is_const(is_const(n)) as 'nc ic?(n)',
+  is_const(is_const('c')) as const
+from
+  bug18761;
+drop table bug18761;
+
+drop function if exists is_const;
Thread
bk commit into 5.1 tree (cmiller:1.2339)Chad MILLER6 Nov