diff --git a/Docs/glibc-2.2.5.patch b/Docs/glibc-2.2.5.patch index c6bc2bf39a8..9b905e6e744 100644 --- a/Docs/glibc-2.2.5.patch +++ b/Docs/glibc-2.2.5.patch @@ -1,73 +1,183 @@ -diff -Nur --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet ../glibc-2.2.5/linuxthreads/internals.h ./linuxthreads/internals.h ---- ../glibc-2.2.5/linuxthreads/internals.h Thu Nov 29 00:44:16 2001 -+++ ./linuxthreads/internals.h Fri Feb 22 21:18:09 2002 -@@ -343,7 +343,7 @@ - THREAD_SELF implementation is used, this must be a power of two and - a multiple of PAGE_SIZE. */ - #ifndef STACK_SIZE --#define STACK_SIZE (2 * 1024 * 1024) -+#define STACK_SIZE (128 * 1024) - #endif - - /* The initial size of the thread stack. Must be a multiple of PAGE_SIZE. */ -diff -Nur --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet ../glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h ./linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h ---- ../glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h Thu Jun 8 13:49:49 2000 -+++ ./linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h Fri Feb 22 21:18:09 2002 -@@ -64,7 +64,7 @@ - /* The number of threads per process. */ - #define _POSIX_THREAD_THREADS_MAX 64 - /* This is the value this implementation supports. */ --#define PTHREAD_THREADS_MAX 1024 -+#define PTHREAD_THREADS_MAX 4096 - - /* Maximum amount by which a process can descrease its asynchronous I/O - priority level. */ -diff -Nur --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet ../glibc-2.2.5/nss/nsswitch.c ./nss/nsswitch.c ---- ../glibc-2.2.5/nss/nsswitch.c Tue Jul 17 02:21:36 2001 -+++ ./nss/nsswitch.c Fri Feb 22 21:18:09 2002 -@@ -515,8 +515,16 @@ - + (line - name + 1)); - if (new_service == NULL) - return result; -- -+#ifdef DO_STATIC_NSS -+ if (strncmp(name,"files",5) == 0 || -+ strncmp(name,"dns",3) == 0) -+#endif - *((char *) __mempcpy (new_service->name, name, line - name)) = '\0'; -+#ifdef DO_STATIC_NSS -+ else -+ *((char *) __mempcpy (new_service->name, "files", 5)) = '\0'; -+#endif -+ - - /* Set default actions. */ - new_service->actions[2 + NSS_STATUS_TRYAGAIN] = NSS_ACTION_CONTINUE; -diff -Nur --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet ../glibc-2.2.5/time/Makefile ./time/Makefile ---- ../glibc-2.2.5/time/Makefile Fri Feb 22 21:27:19 2002 -+++ ./time/Makefile Fri Feb 22 21:26:47 2002 -@@ -37,8 +37,8 @@ - - include ../Rules - --tz-cflags = -DTZDIR='"$(zonedir)"' \ -- -DTZDEFAULT='"$(localtime-file)"' \ -+tz-cflags = -DTZDIR='"/usr/share/zoneinfo/"' \ -+ -DTZDEFAULT='"/etc/localtime"' \ - -DTZDEFRULES='"$(posixrules-file)"' - - CFLAGS-tzfile.c = $(tz-cflags) -diff -Nur --exclude=SCCS --exclude=BitKeeper --exclude=ChangeSet ../glibc-2.2.5/timezone/Makefile ./timezone/Makefile ---- ../glibc-2.2.5/timezone/Makefile Wed Aug 29 16:45:25 2001 -+++ ./timezone/Makefile Fri Feb 22 21:18:09 2002 -@@ -159,8 +159,8 @@ - - $(objpfx)zic: $(objpfx)scheck.o $(objpfx)ialloc.o - --tz-cflags = -DTZDIR='"$(zonedir)"' \ -- -DTZDEFAULT='"$(localtime-file)"' \ -+tz-cflags = -DTZDIR='"/usr/share/zoneinfo/"' \ -+ -DTZDEFAULT='"/etc/localtime"' \ - -DTZDEFRULES='"$(posixrules-file)"' \ - -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone - +Only in glibc-2.2.4-new: bits +Only in glibc-2.2.4-new: config.cache +Only in glibc-2.2.4-new: config.h +Only in glibc-2.2.4-new: config.log +Only in glibc-2.2.4-new: config.make +Only in glibc-2.2.4-new: config.status +Only in glibc-2.2.4-new: glibcbug +Only in glibc-2.2.4-new/iconv: strtab.o +diff -r -c glibc-2.2.4/linuxthreads/internals.h glibc-2.2.4-new/linuxthreads/internals.h +*** glibc-2.2.4/linuxthreads/internals.h Mon Jul 23 20:54:13 2001 +--- glibc-2.2.4-new/linuxthreads/internals.h Tue Apr 16 15:08:03 2002 +*************** +*** 339,345 **** + THREAD_SELF implementation is used, this must be a power of two and + a multiple of PAGE_SIZE. */ + #ifndef STACK_SIZE +! #define STACK_SIZE (2 * 1024 * 1024) + #endif + + /* The initial size of the thread stack. Must be a multiple of PAGE_SIZE. */ +--- 339,345 ---- + THREAD_SELF implementation is used, this must be a power of two and + a multiple of PAGE_SIZE. */ + #ifndef STACK_SIZE +! #define STACK_SIZE (128 * 1024) + #endif + + /* The initial size of the thread stack. Must be a multiple of PAGE_SIZE. */ +Only in glibc-2.2.4-new/linuxthreads: internals.h.rej +diff -r -c glibc-2.2.4/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h glibc-2.2.4-new/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h +*** glibc-2.2.4/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h Fri Jun 9 22:17:35 2000 +--- glibc-2.2.4-new/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h Tue Apr 16 15:10:38 2002 +*************** +*** 64,70 **** + /* The number of threads per process. */ + #define _POSIX_THREAD_THREADS_MAX 64 + /* This is the value this implementation supports. */ +! #define PTHREAD_THREADS_MAX 1024 + + /* Maximum amount by which a process can descrease its asynchronous I/O + priority level. */ +--- 64,70 ---- + /* The number of threads per process. */ + #define _POSIX_THREAD_THREADS_MAX 64 + /* This is the value this implementation supports. */ +! #define PTHREAD_THREADS_MAX 4096 + + /* Maximum amount by which a process can descrease its asynchronous I/O + priority level. */ +Only in glibc-2.2.4-new/linuxthreads/sysdeps/unix/sysv/linux/bits: local_lim.h.rej +Only in glibc-2.2.4-new/manual: chapters.texi +Only in glibc-2.2.4/manual: dir-add.info +Only in glibc-2.2.4/manual: libc.info +Only in glibc-2.2.4/manual: libc.info-1 +Only in glibc-2.2.4/manual: libc.info-10 +Only in glibc-2.2.4/manual: libc.info-11 +Only in glibc-2.2.4/manual: libc.info-12 +Only in glibc-2.2.4/manual: libc.info-13 +Only in glibc-2.2.4/manual: libc.info-14 +Only in glibc-2.2.4/manual: libc.info-15 +Only in glibc-2.2.4/manual: libc.info-16 +Only in glibc-2.2.4/manual: libc.info-17 +Only in glibc-2.2.4/manual: libc.info-18 +Only in glibc-2.2.4/manual: libc.info-19 +Only in glibc-2.2.4/manual: libc.info-2 +Only in glibc-2.2.4/manual: libc.info-20 +Only in glibc-2.2.4/manual: libc.info-21 +Only in glibc-2.2.4/manual: libc.info-22 +Only in glibc-2.2.4/manual: libc.info-23 +Only in glibc-2.2.4/manual: libc.info-24 +Only in glibc-2.2.4/manual: libc.info-25 +Only in glibc-2.2.4/manual: libc.info-26 +Only in glibc-2.2.4/manual: libc.info-27 +Only in glibc-2.2.4/manual: libc.info-28 +Only in glibc-2.2.4/manual: libc.info-29 +Only in glibc-2.2.4/manual: libc.info-3 +Only in glibc-2.2.4/manual: libc.info-30 +Only in glibc-2.2.4/manual: libc.info-31 +Only in glibc-2.2.4/manual: libc.info-32 +Only in glibc-2.2.4/manual: libc.info-33 +Only in glibc-2.2.4/manual: libc.info-34 +Only in glibc-2.2.4/manual: libc.info-35 +Only in glibc-2.2.4/manual: libc.info-36 +Only in glibc-2.2.4/manual: libc.info-37 +Only in glibc-2.2.4/manual: libc.info-38 +Only in glibc-2.2.4/manual: libc.info-39 +Only in glibc-2.2.4/manual: libc.info-4 +Only in glibc-2.2.4/manual: libc.info-40 +Only in glibc-2.2.4/manual: libc.info-41 +Only in glibc-2.2.4/manual: libc.info-42 +Only in glibc-2.2.4/manual: libc.info-43 +Only in glibc-2.2.4/manual: libc.info-44 +Only in glibc-2.2.4/manual: libc.info-45 +Only in glibc-2.2.4/manual: libc.info-46 +Only in glibc-2.2.4/manual: libc.info-47 +Only in glibc-2.2.4/manual: libc.info-48 +Only in glibc-2.2.4/manual: libc.info-49 +Only in glibc-2.2.4/manual: libc.info-5 +Only in glibc-2.2.4/manual: libc.info-50 +Only in glibc-2.2.4/manual: libc.info-51 +Only in glibc-2.2.4/manual: libc.info-52 +Only in glibc-2.2.4/manual: libc.info-53 +Only in glibc-2.2.4/manual: libc.info-54 +Only in glibc-2.2.4/manual: libc.info-55 +Only in glibc-2.2.4/manual: libc.info-56 +Only in glibc-2.2.4/manual: libc.info-57 +Only in glibc-2.2.4/manual: libc.info-58 +Only in glibc-2.2.4/manual: libc.info-59 +Only in glibc-2.2.4/manual: libc.info-6 +Only in glibc-2.2.4/manual: libc.info-60 +Only in glibc-2.2.4/manual: libc.info-7 +Only in glibc-2.2.4/manual: libc.info-8 +Only in glibc-2.2.4/manual: libc.info-9 +Only in glibc-2.2.4-new/manual: stamp-summary +Only in glibc-2.2.4-new/manual: summary.texi +Only in glibc-2.2.4-new/manual: texis +Only in glibc-2.2.4-new/manual: top-menu.texi +Only in glibc-2.2.4-new/nss: nsswitch-org.c +diff -r -c glibc-2.2.4/nss/nsswitch.c glibc-2.2.4-new/nss/nsswitch.c +*** glibc-2.2.4/nss/nsswitch.c Mon Jul 23 20:54:48 2001 +--- glibc-2.2.4-new/nss/nsswitch.c Tue Apr 16 15:43:32 2002 +*************** +*** 510,515 **** +--- 510,523 ---- + if (name == line) + return result; + ++ #ifdef DO_STATIC_NSS ++ if (!(((line-name) == 5 && strncmp(name,"files",5) == 0) || ++ ((line-name) == 3 && strncmp(name,"dns",3) == 0))) ++ { ++ name = (char*) "files"; ++ line = (char*) name+5; ++ } ++ #endif + + new_service = (service_user *) malloc (sizeof (service_user) + + (line - name + 1)); +Only in glibc-2.2.4-new: skr +diff -r -c glibc-2.2.4/time/Makefile glibc-2.2.4-new/time/Makefile +*** glibc-2.2.4/time/Makefile Fri Aug 10 22:12:07 2001 +--- glibc-2.2.4-new/time/Makefile Tue Apr 16 15:11:09 2002 +*************** +*** 37,44 **** + + include ../Rules + +! tz-cflags = -DTZDIR='"$(zonedir)"' \ +! -DTZDEFAULT='"$(localtime-file)"' \ + -DTZDEFRULES='"$(posixrules-file)"' + + CFLAGS-tzfile.c = $(tz-cflags) +--- 37,44 ---- + + include ../Rules + +! tz-cflags = -DTZDIR='"/usr/share/zoneinfo/"' \ +! -DTZDEFAULT='"/etc/localtime"' \ + -DTZDEFRULES='"$(posixrules-file)"' + + CFLAGS-tzfile.c = $(tz-cflags) +diff -r -c glibc-2.2.4/timezone/Makefile glibc-2.2.4-new/timezone/Makefile +*** glibc-2.2.4/timezone/Makefile Mon Jul 23 20:58:05 2001 +--- glibc-2.2.4-new/timezone/Makefile Tue Apr 16 15:11:09 2002 +*************** +*** 159,166 **** + + $(objpfx)zic: $(objpfx)scheck.o $(objpfx)ialloc.o + +! tz-cflags = -DTZDIR='"$(zonedir)"' \ +! -DTZDEFAULT='"$(localtime-file)"' \ + -DTZDEFRULES='"$(posixrules-file)"' \ + -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone + +--- 159,166 ---- + + $(objpfx)zic: $(objpfx)scheck.o $(objpfx)ialloc.o + +! tz-cflags = -DTZDIR='"/usr/share/zoneinfo/"' \ +! -DTZDEFAULT='"/etc/localtime"' \ + -DTZDEFRULES='"$(posixrules-file)"' \ + -DTM_GMTOFF=tm_gmtoff -DTM_ZONE=tm_zone + diff --git a/Docs/manual.texi b/Docs/manual.texi index dc7884bb7f8..6e973f85264 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -45829,9 +45829,6 @@ Another common reason to receive the @code{MySQL server has gone away} error is because you have issued a ``close'' on your MySQL connection and then tried to run a query on the closed connection. -You can check that the MySQL hasn't died by executing -@code{mysqladmin version} and examining the uptime. - If you have a script, you just have to issue the query again for the client to do an automatic reconnection. @@ -45846,6 +45843,15 @@ server. to the server, but it didn't get a full answer (or any answer) to the question. @end multitable +You will also get this error if someone has kills the running thread with +@code{kill #threadid#}. + +You can check that the MySQL hasn't died by executing @code{mysqladmin +version} and examining the uptime. If the problem is that mysqld +crashed you should concentrate one finding the reason for the crash. +You should in this case start by checking if issuing the query again +will kill MySQL again. @xref{Crashing}. + You can also get these errors if you send a query to the server that is incorrect or too large. If @code{mysqld} gets a packet that is too large or out of order, it assumes that something has gone wrong with the client and @@ -45856,6 +45862,26 @@ starting @code{mysqld} with the @code{-O max_allowed_packet=#} option use more memory only when you issue a big query or when @code{mysqld} must return a big result row! +If you want to make a bug report regarding this problem, be sure that +you include the following information: + +@itemize @bullet +@item +Include information if MySQL died or not. (You can find this in the +@code{hostname.err file}. @xref{Crashing}. +@item +If a specific query kills @code{mysqld} and the involved tables where +checked with @code{CHECK TABLE} before you did the query, can you do +a test case for this? @xref{Reproduceable test case}. +@item +What is the value of the @code{wait_timeout} variable in the MySQL server ? +@code{mysqladmin variables} gives you the value of this +@item +Have you tried to run @code{mysqld} with @code{--log} and check if the +issued query appears in the log ? +@end itemize + +@xref{Asking questions}. @node Can not connect to server, Blocked host, Gone away, Common errors @appendixsubsec @code{Can't connect to [local] MySQL server} Error diff --git a/client/mysql.cc b/client/mysql.cc index 239e624a691..24abefedda3 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 MySQL AB +/* Copyright (C) 2000-2002 MySQL AB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -685,7 +685,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), break; case 'p': if (argument == disabled_my_option) - opt_password= ""; + opt_password= (char*) ""; else { if (argument) @@ -2319,7 +2319,7 @@ com_status(String *buffer __attribute__((unused)), } #ifdef HAVE_OPENSSL if (mysql.net.vio->ssl_ && SSL_get_cipher(mysql.net.vio->ssl_)) - tee_fprintf("SSL cipher in use is %s\n", + tee_fprintf(stdout, "SSL cipher in use is %s\n", SSL_get_cipher(mysql.net.vio->ssl_)); else #endif /* HAVE_OPENSSL */ diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c index 5b137df20f8..0bd542d2bd9 100644 --- a/mysys/my_thr_init.c +++ b/mysys/my_thr_init.c @@ -105,7 +105,7 @@ static long thread_id=0; my_bool my_thread_init(void) { struct st_my_thread_var *tmp; -#ifdef EXTRA_DEBUG +#ifdef EXTRA_DEBUG_THREADS fprintf(stderr,"my_thread_init(): thread_id=%ld\n",pthread_self()); #endif #if !defined(__WIN__) || defined(USE_TLS) || ! defined(SAFE_MUTEX) @@ -152,7 +152,7 @@ end: void my_thread_end(void) { struct st_my_thread_var *tmp=my_thread_var; -#ifdef EXTRA_DEBUG +#ifdef EXTRA_DEBUG_THREADS fprintf(stderr,"my_thread_end(): tmp=%p,thread_id=%ld\n", tmp,pthread_self()); #endif diff --git a/sql-bench/limits/mysql.cfg b/sql-bench/limits/mysql.cfg index a496bd7bf4c..cd4aea7dcf5 100644 --- a/sql-bench/limits/mysql.cfg +++ b/sql-bench/limits/mysql.cfg @@ -29,7 +29,7 @@ columns_in_order_by=+64 # number of columns in order by comment_#=yes # # as comment comment_--=yes # -- as comment (ANSI) comment_/**/=yes # /* */ as comment -comment_//=no # // as comment (ANSI) +comment_//=no # // as comment compute=no # Compute connections=101 # Simultaneous connections (installation default) constraint_check=no # Column constraints @@ -62,6 +62,7 @@ except=no # except except_all=no # except all except_all_incompat=no # except all (incompatible lists) except_incompat=no # except (incompatible lists) +field_name_case=yes # case independent field names float_int_expr=yes # mixing of integer and float in expression foreign_key=no # foreign keys foreign_key_syntax=yes # foreign key syntax @@ -228,10 +229,10 @@ func_odbc_timestampdiff=no # Function TIMESTAMPDIFF func_odbc_truncate=yes # Function TRUNCATE func_odbc_ucase=yes # Function UCASE func_odbc_user()=yes # Function USER() -func_odbc_week=yes # Function WEEK +func_odbc_week=error # Function WEEK func_odbc_year=yes # Function YEAR func_sql_+=yes # Function +, -, * and / -func_sql_bit_length=no # Function BIT_LENGTH +func_sql_bit_length=yes # Function BIT_LENGTH func_sql_cast=no # Function CAST func_sql_char_length=error # Function CHAR_LENGTH func_sql_char_length(constant)=yes # Function CHAR_LENGTH(constant) @@ -299,13 +300,14 @@ group_func_sql_min_str=yes # Group function MIN on strings group_func_sql_some=no # Group function SOME group_func_sql_sum=yes # Group function SUM group_functions=yes # Group functions +group_many_distinct_functions=yes # Group functions with several distinct group_on_unused=yes # Group on unused column has_true_false=no # TRUE and FALSE having=yes # Having having_with_alias=yes # Having on alias having_with_group=yes # Having with group function hex_numbers=yes # hex numbers (0x41) -hex_strings=no # hex strings (x'1ace') +hex_strings=yes # hex strings (x'1ace') ignore_end_space=yes # Ignore end space in compare index_in_create=yes # index in create table index_namespace=yes # different namespace for index @@ -319,7 +321,7 @@ intersect=no # intersect intersect_all=no # intersect all intersect_all_incompat=no # intersect all (incompatible lists) intersect_incompat=no # intersect (incompatible lists) -join_tables=63 # tables in join +join_tables=31 # tables in join left_outer_join=yes # left outer join left_outer_join_using=yes # left outer join using like_with_column=yes # column LIKE column @@ -331,7 +333,7 @@ max_char_size=255 # max char() size max_column_name=64 # column name length max_columns=3398 # Columns in table max_conditions=85660 # OR and AND in WHERE -max_expressions=1837 # simple expressions +max_expressions=856 # simple expressions max_index=32 # max index max_index_length=500 # index length max_index_name=64 # index name length @@ -341,7 +343,7 @@ max_index_varchar_part_length=255 # index varchar part length max_row_length=65534 # max table row length (without blobs) max_row_length_with_null=65502 # table row length with nulls (without blobs) max_select_alias_name=+512 # select alias name length -max_stack_expression=1837 # stacked expressions +max_stack_expression=856 # stacked expressions max_table_alias_name=+512 # table alias name length max_table_name=64 # table name length max_text_size=1048543 # max text or blob size @@ -353,8 +355,8 @@ minus_neg=yes # Calculate 1--1 multi_drop=yes # many tables to drop table multi_null_in_unique=yes # null in unique index multi_strings=yes # Multiple line strings -multi_table_delete=no # DELETE FROM table1,table2... -multi_table_update=no # Update with many tables +multi_table_delete=yes # DELETE FROM table1,table2... +multi_table_update=yes # Update with many tables natural_join=yes # natural join natural_join_incompat=yes # natural join (incompatible lists) natural_left_outer_join=yes # natural left outer join @@ -365,7 +367,7 @@ null_in_unique=yes # null in unique index null_num_expr=yes # Is 1+NULL = NULL nulls_in_unique=yes # null combination in unique index odbc_left_outer_join=yes # left outer join odbc style -operating_system=Linux 2.2.13-SMP alpha # crash-me tested on +operating_system=Linux 2.4.16-64GB-SMP i686 # crash-me tested on order_by=yes # Order by order_by_alias=yes # Order by alias order_by_function=yes # Order by function @@ -385,7 +387,7 @@ quote_with_"=yes # Allows ' and " as string markers remember_end_space=no # Remembers end space in char() remember_end_space_varchar=no # Remembers end space in varchar() rename_table=yes # rename table -repeat_string_size=1047552 # return string size from function +repeat_string_size=1048576 # return string size from function right_outer_join=yes # right outer join rowid=auto_increment # Type for row id select_constants=yes # Select constants @@ -394,7 +396,7 @@ select_limit2=yes # SELECT with LIMIT #,# select_string_size=1048565 # constant string size in SELECT select_table_update=no # Update with sub select select_without_from=yes # SELECT without FROM -server_version=MySQL 3.23.39 debug # server version +server_version=MySQL 4.0.2 alpha debug # server version simple_joins=yes # ANSI SQL simple joins storage_of_float=round # Storage of float values subqueries=no # subqueries @@ -402,7 +404,7 @@ table_alias=yes # Table alias table_name_case=no # case independent table names table_wildcard=yes # Select table_name.* temporary_table=yes # temporary tables -transactions=yes # constant string size in where +transactions=yes # transactions truncate_table=yes # truncate type_extra_abstime=no # Type abstime type_extra_bfile=no # Type bfile @@ -512,12 +514,11 @@ type_sql_time=yes # Type time type_sql_timestamp=yes # Type timestamp type_sql_timestamp_with_time_zone=no # Type timestamp with time zone type_sql_varchar(1_arg)=yes # Type varchar(1 arg) -union=no # union -union_all=no # union all -union_all_incompat=no # union all (incompatible lists) -union_incompat=no # union (incompatible lists) +union=yes # union +union_all=yes # union all +union_all_incompat=yes # union all (incompatible lists) +union_incompat=yes # union (incompatible lists) unique_in_create=yes # unique in create table unique_null_in_create=yes # unique null in create -user_comment=Alpha DS20 2x500 MHz, 2G memory, key_buffer=16M; ccc + cxx # comment views=no # views where_string_size=1048539 # constant string size in where