summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@tik.mysql.fi>2001-05-23 02:40:20 +0300
committerunknown <monty@tik.mysql.fi>2001-05-23 02:40:20 +0300
commit6906a7893c2c0fbbbc2234d8dbbe4c4543df16c9 (patch)
tree5cfeb4797dcf12adce2ff584d8919b58a2516885
parent2cc87b411f8226e8bd0ca3daa556c1e22fb295b8 (diff)
parent36b93f91db9b619b9f970f2723975ccb9da16e09 (diff)
downloadmariadb-git-6906a7893c2c0fbbbc2234d8dbbe4c4543df16c9.tar.gz
Merge work:/my/mysql into tik.mysql.fi:/home/my/mysql
Docs/manual.texi: Auto merged
-rw-r--r--BitKeeper/etc/logging_ok7
-rw-r--r--Docs/manual.texi59
-rw-r--r--mysql-test/r/func_crypt.result4
-rw-r--r--mysql-test/t/func_crypt.test3
-rw-r--r--mysys/thr_lock.c10
5 files changed, 52 insertions, 31 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok
index ee67cbe13b6..01a1261eae5 100644
--- a/BitKeeper/etc/logging_ok
+++ b/BitKeeper/etc/logging_ok
@@ -1,6 +1 @@
-mwagner@evoq.mwagner.org
-tim@threads.polyesthetic.msg
-tim@work.mysql.com
-heikki@donna.mysql.fi
-paul@central.snake.net
-monty@donna.mysql.fi
+monty@tik.mysql.fi
diff --git a/Docs/manual.texi b/Docs/manual.texi
index 92173dbddf6..b3848edf0f8 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -10370,7 +10370,7 @@ feature).
Ignore the @code{delay_key_write} option for all tables.
@xref{Server parameters}.
-@item -Sg, --skip-grant-tables
+@item --skip-grant-tables
This option causes the server not to use the privilege system at all. This
gives everyone @emph{full access} to all databases! (You can tell a running
server to start using the grant tables again by executing @code{mysqladmin
@@ -35350,12 +35350,20 @@ To add a new native @strong{MySQL} function, follow these steps:
Add one line to @file{lex.h} that defines the function name in the
@code{sql_functions[]} array.
@item
-Add two lines to @file{sql_yacc.yy}. One indicates the preprocessor
-symbol that @code{yacc} should define (this should be added at the
-beginning of the file). Then define the function parameters and add an
-``item'' with these parameters to the @code{simple_expr} parsing rule.
-For an example, check all occurrences of @code{SOUNDEX} in
-@file{sql_yacc.yy} to see how this is done.
+If the function prototype is simple (just takes zero, one, two or three
+arguments), you should in lex.h specify SYM(FUNC_ARG#) (where # is the
+number of arguments) as the second argument in the
+@code{sql_functions[]} array and add a function that creates a function
+object in @file{item_create.cc}. Take a look at @code{"ABS"} and
+@code{create_funcs_abs()} for an example of this.
+
+If the function prototype is complicated (for example takes a variable number
+of arguments), you should add two lines to @file{sql_yacc.yy}. One
+indicates the preprocessor symbol that @code{yacc} should define (this
+should be added at the beginning of the file). Then define the function
+parameters and add an ``item'' with these parameters to the
+@code{simple_expr} parsing rule. For an example, check all occurrences
+of @code{ATAN} in @file{sql_yacc.yy} to see how this is done.
@item
In @file{item_func.h}, declare a class inheriting from @code{Item_num_func} or
@code{Item_str_func}, depending on whether your function returns a number or a
@@ -35368,28 +35376,45 @@ double Item_func_newname::val()
longlong Item_func_newname::val_int()
String *Item_func_newname::Str(String *str)
@end example
+
+If you inherit your object from any of the standard items (like
+@code{Item_num_func} you probably only have to define one of the above
+functions and let the parent object take care of the other functions.
+For example, the @code{Item_str_func} class defines a @code{val()} function
+that executes @code{atof()} on the value returned by @code{::str()}.
+
@item
-You should probably also define the following function:
+You should probably also define the following object function:
@example
void Item_func_newname::fix_length_and_dec()
@end example
This function should at least calculate @code{max_length} based on the
given arguments. @code{max_length} is the maximum number of characters
-the function may return. This function should also set @code{maybe_null = 0}
-if the main function can't return a @code{NULL} value. The function can check
-if any of the function arguments can return @code{NULL} by checking the
-arguments @code{maybe_null} variable.
+the function may return. This function should also set @code{maybe_null
+= 0} if the main function can't return a @code{NULL} value. The
+function can check if any of the function arguments can return
+@code{NULL} by checking the arguments @code{maybe_null} variable. You
+can take a look at @code{Item_func_mod::fix_length_and_dec} for a
+typical example of how to do this.
@end enumerate
-All functions must be thread safe.
+All functions must be thread safe (In other words, don't use any global or
+static variables in the functions without protecting them with mutexes).
+
+If you want to return @code{NULL}, from @code{::val()}, @code{::val_int()}
+or @code{::str()} you should set @code{null_value} to 1 and return 0.
+
+For @code{::str()} object functions, there are some additional
+considerations to be aware of:
-For string functions, there are some additional considerations to be aware of:
@itemize @bullet
@item
-The @code{String *str} argument provides a string
-buffer that may be used to hold the result.
+The @code{String *str} argument provides a string buffer that may be
+used to hold the result. (For more information about the @code{String} type,
+take a look at the @file{sql_string.h} file.)
@item
-The function should return the string that holds the result.
+The @code{::str()} function should return the string that holds the result or
+@code{(char*) 0} if the result is @code{NULL}.
@item
All current string functions try to avoid allocating any memory unless
absolutely necessary!
diff --git a/mysql-test/r/func_crypt.result b/mysql-test/r/func_crypt.result
index 7e0f5f7981d..021989add8d 100644
--- a/mysql-test/r/func_crypt.result
+++ b/mysql-test/r/func_crypt.result
@@ -1,2 +1,2 @@
-encrypt('foo', 'ff')
-ffTU0fyIP09Z.
+length(encrypt('foo', 'ff')) <> 0
+1
diff --git a/mysql-test/t/func_crypt.test b/mysql-test/t/func_crypt.test
index 4a499f3d5b7..ddc0816e301 100644
--- a/mysql-test/t/func_crypt.test
+++ b/mysql-test/t/func_crypt.test
@@ -1 +1,2 @@
-select encrypt('foo', 'ff');
+
+select length(encrypt('foo', 'ff')) <> 0;
diff --git a/mysys/thr_lock.c b/mysys/thr_lock.c
index 74548b7fa12..7c92a7fa5fa 100644
--- a/mysys/thr_lock.c
+++ b/mysys/thr_lock.c
@@ -449,7 +449,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
check_locks(lock,"read lock with old write lock",0);
if (lock->get_status)
(*lock->get_status)(data->status_param);
- ++locks_immediate;
+ statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end;
}
if (lock->write.data->type == TL_WRITE_ONLY)
@@ -473,7 +473,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
if ((int) lock_type == (int) TL_READ_NO_INSERT)
lock->read_no_write_count++;
check_locks(lock,"read lock with no write locks",0);
- ++locks_immediate;
+ statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end;
}
/* Can't get lock yet; Wait for it */
@@ -505,7 +505,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
data->cond=get_cond();
if (lock->get_status)
(*lock->get_status)(data->status_param);
- ++locks_immediate;
+ statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end;
}
}
@@ -540,7 +540,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
check_locks(lock,"second write lock",0);
if (data->lock->get_status)
(*data->lock->get_status)(data->status_param);
- ++locks_immediate;
+ statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end;
}
DBUG_PRINT("lock",("write locked by thread: %ld",
@@ -566,7 +566,7 @@ int thr_lock(THR_LOCK_DATA *data,enum thr_lock_type lock_type)
if (data->lock->get_status)
(*data->lock->get_status)(data->status_param);
check_locks(lock,"only write lock",0);
- ++locks_immediate;
+ statistic_increment(locks_immediate,&THR_LOCK_lock);
goto end;
}
}