List:Commits« Previous MessageNext Message »
From:knielsen Date:July 5 2006 12:40pm
Subject:bk commit into 5.1 tree (knielsen:1.2243)
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of knielsen. When knielsen 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
  1.2243 06/07/05 14:40:20 knielsen@stripped +10 -0
  Merge rt.int.sifira.dk:/usr/local/mysql/tmpmerge3
  into  rt.int.sifira.dk:/usr/local/mysql/tmp-5.1

  sql/sql_show.cc
    1.355 06/07/05 14:40:16 knielsen@stripped +2 -1
    Manual merge.

  sql/mysqld.cc
    1.568 06/07/05 14:40:16 knielsen@stripped +1 -1
    Manual merge.

  sql/sql_parse.cc
    1.567 06/07/05 14:28:14 knielsen@stripped +0 -0
    Auto merged

  sql-common/client.c
    1.99 06/07/05 14:28:14 knielsen@stripped +0 -0
    Auto merged

  sql/set_var.cc
    1.179 06/07/05 14:28:13 knielsen@stripped +0 -0
    Auto merged

  mysql-test/t/variables.test
    1.61 06/07/05 14:28:12 knielsen@stripped +0 -0
    Auto merged

  mysql-test/r/variables.result
    1.86 06/07/05 14:28:12 knielsen@stripped +0 -0
    Auto merged

  mysql-test/r/information_schema.result
    1.127 06/07/05 14:28:12 knielsen@stripped +0 -0
    Auto merged

  libmysqld/libmysqld.c
    1.69 06/07/05 14:28:12 knielsen@stripped +0 -0
    Auto merged

  libmysqld/lib_sql.cc
    1.115 06/07/05 14:28:12 knielsen@stripped +0 -0
    Auto merged

# 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:	knielsen
# Host:	rt.int.sifira.dk
# Root:	/usr/local/mysql/tmp-5.1/RESYNC

--- 1.567/sql/mysqld.cc	2006-06-30 14:08:17 +02:00
+++ 1.568/sql/mysqld.cc	2006-07-05 14:40:16 +02:00
@@ -324,6 +324,7 @@
 static char *character_set_filesystem_name;
 static char *my_bind_addr_str;
 static char *default_collation_name, *default_storage_engine_str;
+static char compiled_default_collation_name[]= MYSQL_DEFAULT_COLLATION_NAME;
 static char mysql_data_home_buff[2];
 static struct passwd *user_info;
 static I_List<THD> thread_cache;
@@ -7047,7 +7048,7 @@
   /* Variables in libraries */
   charsets_dir= 0;
   default_character_set_name= (char*) MYSQL_DEFAULT_CHARSET_NAME;
-  default_collation_name= (char*) MYSQL_DEFAULT_COLLATION_NAME;
+  default_collation_name= compiled_default_collation_name;
   sys_charset_system.value= (char*) system_charset_info->csname;
   character_set_filesystem_name= (char*) "binary";
 
@@ -7181,7 +7182,8 @@
     strmake(mysql_home,argument,sizeof(mysql_home)-1);
     break;
   case 'C':
-    default_collation_name= 0;
+    if (default_collation_name == compiled_default_collation_name)
+      default_collation_name= 0;
     break;
   case 'l':
     opt_log=1;

--- 1.566/sql/sql_parse.cc	2006-07-04 10:02:05 +02:00
+++ 1.567/sql/sql_parse.cc	2006-07-05 14:28:14 +02:00
@@ -823,6 +823,37 @@
 #endif /* NO_EMBEDDED_ACCESS_CHECKS */
 }
 
+void thd_init_client_charset(THD *thd, uint cs_number)
+{
+  /*
+   Use server character set and collation if
+   - opt_character_set_client_handshake is not set
+   - client has not specified a character set
+   - client character set is the same as the servers
+   - client character set doesn't exists in server
+  */
+  if (!opt_character_set_client_handshake ||
+      !(thd->variables.character_set_client= get_charset(cs_number, MYF(0))) ||
+      !my_strcasecmp(&my_charset_latin1,
+                     global_system_variables.character_set_client->name,
+                     thd->variables.character_set_client->name))
+  {
+    thd->variables.character_set_client=
+      global_system_variables.character_set_client;
+    thd->variables.collation_connection=
+      global_system_variables.collation_connection;
+    thd->variables.character_set_results=
+      global_system_variables.character_set_results;
+  }
+  else
+  {
+    thd->variables.character_set_results=
+      thd->variables.collation_connection= 
+      thd->variables.character_set_client;
+  }
+}
+
+
 /*
     Perform handshake, authorize client and update thd ACL variables.
   SYNOPSIS
@@ -958,33 +989,7 @@
     thd->client_capabilities|= ((ulong) uint2korr(net->read_pos+2)) << 16;
     thd->max_client_packet_length= uint4korr(net->read_pos+4);
     DBUG_PRINT("info", ("client_character_set: %d", (uint) net->read_pos[8]));
-    /*
-      Use server character set and collation if
-      - opt_character_set_client_handshake is not set
-      - client has not specified a character set
-      - client character set is the same as the servers
-      - client character set doesn't exists in server
-    */
-    if (!opt_character_set_client_handshake ||
-        !(thd->variables.character_set_client=
-	  get_charset((uint) net->read_pos[8], MYF(0))) ||
-	!my_strcasecmp(&my_charset_latin1,
-		       global_system_variables.character_set_client->name,
-		       thd->variables.character_set_client->name))
-    {
-      thd->variables.character_set_client=
-	global_system_variables.character_set_client;
-      thd->variables.collation_connection=
-	global_system_variables.collation_connection;
-      thd->variables.character_set_results=
-	global_system_variables.character_set_results;
-    }
-    else
-    {
-      thd->variables.character_set_results=
-      thd->variables.collation_connection= 
-	thd->variables.character_set_client;
-    }
+    thd_init_client_charset(thd, (uint) net->read_pos[8]);
     thd->update_charset();
     end= (char*) net->read_pos+32;
   }

--- 1.354/sql/sql_show.cc	2006-06-26 16:44:38 +02:00
+++ 1.355/sql/sql_show.cc	2006-07-05 14:40:16 +02:00
@@ -70,6 +70,9 @@
 
 static void store_key_options(THD *thd, String *packet, TABLE *table,
                               KEY *key_info);
+static void
+append_algorithm(TABLE_LIST *table, String *buff);
+
 
 /***************************************************************************
 ** List all table types supported
@@ -1423,6 +1426,28 @@
 void
 view_store_options(THD *thd, TABLE_LIST *table, String *buff)
 {
+  append_algorithm(table, buff);
+  append_definer(thd, buff, &table->definer.user, &table->definer.host);
+  if (table->view_suid)
+    buff->append(STRING_WITH_LEN("SQL SECURITY DEFINER "));
+  else
+    buff->append(STRING_WITH_LEN("SQL SECURITY INVOKER "));
+}
+
+
+/*
+  Append DEFINER clause to the given buffer.
+  
+  SYNOPSIS
+    append_definer()
+    thd           [in] thread handle
+    buffer        [inout] buffer to hold DEFINER clause
+    definer_user  [in] user name part of definer
+    definer_host  [in] host name part of definer
+*/
+
+static void append_algorithm(TABLE_LIST *table, String *buff)
+{
   buff->append(STRING_WITH_LEN("ALGORITHM="));
   switch ((int8)table->algorithm) {
   case VIEW_ALGORITHM_UNDEFINED:
@@ -1437,11 +1462,6 @@
   default:
     DBUG_ASSERT(0); // never should happen
   }
-  append_definer(thd, buff, &table->definer.user, &table->definer.host);
-  if (table->view_suid)
-    buff->append(STRING_WITH_LEN("SQL SECURITY DEFINER "));
-  else
-    buff->append(STRING_WITH_LEN("SQL SECURITY INVOKER "));
 }
 
 /*
@@ -3517,7 +3537,16 @@
     table->field[1]->store(tables->view_db.str, tables->view_db.length, cs);
     table->field[2]->store(tables->view_name.str, tables->view_name.length, cs);
     if (grant & SHOW_VIEW_ACL)
-      table->field[3]->store(tables->query.str, tables->query.length, cs);
+    {
+      char buff[2048];
+      String qwe_str(buff, sizeof(buff), cs);
+      qwe_str.length(0);
+      qwe_str.append(STRING_WITH_LEN("/* "));
+      append_algorithm(tables, &qwe_str);
+      qwe_str.append(STRING_WITH_LEN("*/ "));
+      qwe_str.append(tables->query.str, tables->query.length);
+      table->field[3]->store(qwe_str.ptr(), qwe_str.length(), cs);
+    }
 
     if (tables->with_check != VIEW_CHECK_NONE)
     {

--- 1.126/mysql-test/r/information_schema.result	2006-06-26 16:44:37 +02:00
+++ 1.127/mysql-test/r/information_schema.result	2006-07-05 14:28:12 +02:00
@@ -386,11 +386,11 @@
 Table	Non_unique	Key_name	Seq_in_index	Column_name	Collation	Cardinality	Sub_part	Packed	Null	Index_type	Comment
 select * from information_schema.views where TABLE_NAME like "v%";
 TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE
-NULL	test	v0	select sql_no_cache `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata`	NONE	NO	root@localhost	DEFINER
-NULL	test	v1	select sql_no_cache `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1')	NONE	NO	root@localhost	DEFINER
-NULL	test	v2	select sql_no_cache `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2')	NONE	NO	root@localhost	DEFINER
-NULL	test	v3	select sql_no_cache `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%')	NONE	NO	root@localhost	DEFINER
-NULL	test	v4	select sql_no_cache `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%')	NONE	NO	root@localhost	DEFINER
+NULL	test	v0	/* ALGORITHM=UNDEFINED */ select sql_no_cache `schemata`.`SCHEMA_NAME` AS `c` from `information_schema`.`schemata`	NONE	NO	root@localhost	DEFINER
+NULL	test	v1	/* ALGORITHM=UNDEFINED */ select sql_no_cache `tables`.`TABLE_NAME` AS `c` from `information_schema`.`tables` where (`tables`.`TABLE_NAME` = _utf8'v1')	NONE	NO	root@localhost	DEFINER
+NULL	test	v2	/* ALGORITHM=UNDEFINED */ select sql_no_cache `columns`.`COLUMN_NAME` AS `c` from `information_schema`.`columns` where (`columns`.`TABLE_NAME` = _utf8'v2')	NONE	NO	root@localhost	DEFINER
+NULL	test	v3	/* ALGORITHM=UNDEFINED */ select sql_no_cache `character_sets`.`CHARACTER_SET_NAME` AS `c` from `information_schema`.`character_sets` where (`character_sets`.`CHARACTER_SET_NAME` like _utf8'latin1%')	NONE	NO	root@localhost	DEFINER
+NULL	test	v4	/* ALGORITHM=UNDEFINED */ select sql_no_cache `collations`.`COLLATION_NAME` AS `c` from `information_schema`.`collations` where (`collations`.`COLLATION_NAME` like _utf8'latin1%')	NONE	NO	root@localhost	DEFINER
 drop view v0, v1, v2, v3, v4;
 create table t1 (a int);
 grant select,update,insert on t1 to mysqltest_1@localhost;
@@ -483,9 +483,9 @@
 create view v3 (c) as select a from t1 WITH CASCADED CHECK OPTION;
 select * from information_schema.views;
 TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE
-NULL	test	v1	select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root@localhost	DEFINER
-NULL	test	v2	select `test`.`t1`.`a` AS `c` from `test`.`t1`	LOCAL	YES	root@localhost	DEFINER
-NULL	test	v3	select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root@localhost	DEFINER
+NULL	test	v1	/* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root@localhost	DEFINER
+NULL	test	v2	/* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1`	LOCAL	YES	root@localhost	DEFINER
+NULL	test	v3	/* ALGORITHM=UNDEFINED */ select `test`.`t1`.`a` AS `c` from `test`.`t1`	CASCADED	YES	root@localhost	DEFINER
 grant select (a) on test.t1 to joe@localhost with grant option;
 select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES;
 GRANTEE	TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	COLUMN_NAME	PRIVILEGE_TYPE	IS_GRANTABLE
@@ -1169,7 +1169,7 @@
 where table_name='v1' or table_name='v2';
 TABLE_CATALOG	TABLE_SCHEMA	TABLE_NAME	VIEW_DEFINITION	CHECK_OPTION	IS_UPDATABLE	DEFINER	SECURITY_TYPE
 NULL	test	v1		NONE	YES	root@localhost	DEFINER
-NULL	test	v2	select 1 AS `1`	NONE	NO	mysqltest_1@localhost	DEFINER
+NULL	test	v2	/* ALGORITHM=UNDEFINED */ select 1 AS `1`	NONE	NO	mysqltest_1@localhost	DEFINER
 drop view v1, v2;
 drop table t1;
 drop user mysqltest_1@localhost;

--- 1.98/sql-common/client.c	2006-05-12 12:32:01 +02:00
+++ 1.99/sql-common/client.c	2006-07-05 14:28:14 +02:00
@@ -125,6 +125,8 @@
 static int wait_for_data(my_socket fd, uint timeout);
 #endif
 
+CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
+
 
 /****************************************************************************
   A modified version of connect().  my_connect() allows you to specify
@@ -1426,7 +1428,7 @@
     bzero((char*) (mysql), sizeof(*(mysql)));
   mysql->options.connect_timeout= CONNECT_TIMEOUT;
   mysql->last_used_con= mysql->next_slave= mysql->master = mysql;
-  mysql->charset=default_charset_info;
+  mysql->charset=default_client_charset_info;
   strmov(mysql->net.sqlstate, not_error_sqlstate);
   /*
     By default, we are a replication pivot. The caller must reset it
@@ -1655,7 +1657,51 @@
 #endif
 };
 
-MYSQL *
+C_MODE_START
+int mysql_init_character_set(MYSQL *mysql)
+{
+  NET		*net= &mysql->net;
+  /* Set character set */
+  if (!mysql->options.charset_name &&
+      !(mysql->options.charset_name= 
+       my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
+    return 1;
+  
+  {
+    const char *save= charsets_dir;
+    if (mysql->options.charset_dir)
+      charsets_dir=mysql->options.charset_dir;
+    mysql->charset=get_charset_by_csname(mysql->options.charset_name,
+                                         MY_CS_PRIMARY, MYF(MY_WME));
+    charsets_dir= save;
+  }
+  
+  if (!mysql->charset)
+  {
+    net->last_errno=CR_CANT_READ_CHARSET;
+    strmov(net->sqlstate, unknown_sqlstate);
+    if (mysql->options.charset_dir)
+      my_snprintf(net->last_error, sizeof(net->last_error)-1,
+                  ER(net->last_errno),
+                  mysql->options.charset_name,
+                  mysql->options.charset_dir);
+    else
+    {
+      char cs_dir_name[FN_REFLEN];
+      get_charsets_dir(cs_dir_name);
+      my_snprintf(net->last_error, sizeof(net->last_error)-1,
+                  ER(net->last_errno),
+                  mysql->options.charset_name,
+                  cs_dir_name);
+    }
+    return 1;
+  }
+  return 0;
+}
+C_MODE_END
+
+
+MYSQL * STDCALL 
 CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
 		       const char *passwd, const char *db,
 		       uint port, const char *unix_socket,ulong client_flag)
@@ -1992,42 +2038,8 @@
     goto error;
   }
 
-  /* Set character set */
-  if (!mysql->options.charset_name &&
-      !(mysql->options.charset_name= 
-       my_strdup(MYSQL_DEFAULT_CHARSET_NAME,MYF(MY_WME))))
-    goto error;
-  
-  {
-    const char *save= charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_csname(mysql->options.charset_name,
-                                         MY_CS_PRIMARY, MYF(MY_WME));
-    charsets_dir= save;
-  }
-  
-  if (!mysql->charset)
-  {
-    net->last_errno=CR_CANT_READ_CHARSET;
-    strmov(net->sqlstate, unknown_sqlstate);
-    if (mysql->options.charset_dir)
-      my_snprintf(net->last_error, sizeof(net->last_error)-1,
-                  ER(net->last_errno),
-                  mysql->options.charset_name,
-                  mysql->options.charset_dir);
-    else
-    {
-      char cs_dir_name[FN_REFLEN];
-      get_charsets_dir(cs_dir_name);
-      my_snprintf(net->last_error, sizeof(net->last_error)-1,
-                  ER(net->last_errno),
-                  mysql->options.charset_name,
-                  cs_dir_name);
-    }
+  if (mysql_init_character_set(mysql))
     goto error;
-  }
-
 
   /* Save connection information */
   if (!my_multi_malloc(MYF(0),

--- 1.85/mysql-test/r/variables.result	2006-05-20 04:00:54 +02:00
+++ 1.86/mysql-test/r/variables.result	2006-07-05 14:28:12 +02:00
@@ -421,6 +421,28 @@
 set tx_isolation="READ-COMMITTED";
 set wait_timeout=100;
 set log_warnings=1;
+select @@session.insert_id;
+@@session.insert_id
+1
+set @save_insert_id=@@session.insert_id;
+set session insert_id=20;
+select @@session.insert_id;
+@@session.insert_id
+20
+set session last_insert_id=100;
+select @@session.insert_id;
+@@session.insert_id
+20
+select @@session.last_insert_id;
+@@session.last_insert_id
+100
+select @@session.insert_id;
+@@session.insert_id
+20
+set @@session.insert_id=@save_insert_id;
+select @@session.insert_id;
+@@session.insert_id
+1
 create table t1 (a int not null auto_increment, primary key(a));
 create table t2 (a int not null auto_increment, primary key(a));
 insert into t1 values(null),(null),(null);

--- 1.60/mysql-test/t/variables.test	2006-05-20 04:00:54 +02:00
+++ 1.61/mysql-test/t/variables.test	2006-07-05 14:28:12 +02:00
@@ -302,6 +302,22 @@
 set log_warnings=1;
 
 #
+# Bugs: #20392: INSERT_ID session variable has weird value
+#
+select @@session.insert_id;
+set @save_insert_id=@@session.insert_id;
+set session insert_id=20;
+select @@session.insert_id;
+
+set session last_insert_id=100;
+select @@session.insert_id;
+select @@session.last_insert_id;
+select @@session.insert_id;
+
+set @@session.insert_id=@save_insert_id;
+select @@session.insert_id;
+
+#
 # key buffer
 #
 

--- 1.178/sql/set_var.cc	2006-06-23 01:49:15 +02:00
+++ 1.179/sql/set_var.cc	2006-07-05 14:28:13 +02:00
@@ -2817,7 +2817,7 @@
 byte *sys_var_insert_id::value_ptr(THD *thd, enum_var_type type,
 				   LEX_STRING *base)
 {
-  return (byte*) &thd->current_insert_id;
+  return (byte*) &thd->next_insert_id;
 }
 
 

--- 1.114/libmysqld/lib_sql.cc	2006-04-10 18:34:07 +02:00
+++ 1.115/libmysqld/lib_sql.cc	2006-07-05 14:28:12 +02:00
@@ -37,6 +37,8 @@
 int check_user(THD *thd, enum enum_server_command command, 
 	       const char *passwd, uint passwd_len, const char *db,
 	       bool check_count);
+void thd_init_client_charset(THD *thd, uint cs_number);
+
 C_MODE_START
 
 #include <mysql.h>
@@ -604,11 +606,14 @@
   return NULL;
 }
 
+
 #ifdef NO_EMBEDDED_ACCESS_CHECKS
 int check_embedded_connection(MYSQL *mysql)
 {
   int result;
   THD *thd= (THD*)mysql->thd;
+  thd_init_client_charset(thd, mysql->charset->number);
+  thd->update_charset();
   Security_context *sctx= thd->security_ctx;
   sctx->host_or_ip= sctx->host= (char*) my_localhost;
   strmake(sctx->priv_host, (char*) my_localhost,  MAX_HOSTNAME-1);
@@ -627,6 +632,8 @@
   char scramble_buff[SCRAMBLE_LENGTH];
   int passwd_len;
 
+  thd_init_client_charset(thd, mysql->charset->number);
+  thd->update_charset();
   if (mysql->options.client_ip)
   {
     sctx->host= my_strdup(mysql->options.client_ip, MYF(0));

--- 1.68/libmysqld/libmysqld.c	2006-02-25 19:35:06 +01:00
+++ 1.69/libmysqld/libmysqld.c	2006-07-05 14:28:12 +02:00
@@ -90,49 +90,7 @@
 }
 
 
-static int mysql_init_charset(MYSQL *mysql)
-{
-  char charset_name_buff[16], *charset_name;
-
-  if ((charset_name=mysql->options.charset_name))
-  {
-    const char *save=charsets_dir;
-    if (mysql->options.charset_dir)
-      charsets_dir=mysql->options.charset_dir;
-    mysql->charset=get_charset_by_name(mysql->options.charset_name,
-                                       MYF(MY_WME));
-    charsets_dir=save;
-  }
-  else if (mysql->server_language)
-  {
-    charset_name=charset_name_buff;
-    sprintf(charset_name,"%d",mysql->server_language);	/* In case of errors */
-    mysql->charset=get_charset((uint8) mysql->server_language, MYF(MY_WME));
-  }
-  else
-    mysql->charset=default_charset_info;
-
-  if (!mysql->charset)
-  {
-    mysql->net.last_errno=CR_CANT_READ_CHARSET;
-    strmov(mysql->net.sqlstate, "HY0000");
-    if (mysql->options.charset_dir)
-      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
-              charset_name ? charset_name : "unknown",
-              mysql->options.charset_dir);
-    else
-    {
-      char cs_dir_name[FN_REFLEN];
-      get_charsets_dir(cs_dir_name);
-      sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
-              charset_name ? charset_name : "unknown",
-              cs_dir_name);
-    }
-    return mysql->net.last_errno;
-  }
-  return 0;
-}
-
+int mysql_init_character_set(MYSQL *mysql);
 
 MYSQL * STDCALL
 mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
@@ -222,10 +180,10 @@
 
   init_embedded_mysql(mysql, client_flag, db_name);
 
-  if (check_embedded_connection(mysql))
+  if (mysql_init_character_set(mysql))
     goto error;
 
-  if (mysql_init_charset(mysql))
+  if (check_embedded_connection(mysql))
     goto error;
 
   mysql->server_status= SERVER_STATUS_AUTOCOMMIT;
Thread
bk commit into 5.1 tree (knielsen:1.2243)knielsen5 Jul