summaryrefslogtreecommitdiff
path: root/sql/sql_show.cc
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2004-02-17 01:35:17 +0200
committerunknown <monty@mysql.com>2004-02-17 01:35:17 +0200
commit709356d47343af2951cdcd02419c71fc49c35f85 (patch)
tree7e3324032ecc97c6af3771a6904e8ae32dbf7a48 /sql/sql_show.cc
parent0c259c54b062f065e375fa185556cdf7fd419c13 (diff)
downloadmariadb-git-709356d47343af2951cdcd02419c71fc49c35f85.tar.gz
Changed wellformedlen to well_formed_len
Fixed that blobs >16M can be inserted/updated Fixed bug when doing CREATE TEMPORARY TABLE ... LIKE include/m_ctype.h: Changed wellformedlen to well_formed_len include/mysql.h: Fixed comment libmysql/libmysql.c: Fixed indentation libmysqld/lib_sql.cc: Fixed indentation mysql-test/r/ctype_utf8.result: updated warning numbers mysql-test/r/innodb.result: Moved test to right place mysql-test/r/myisam-blob.result: More test for blobs mysql-test/r/rpl000002.result: Move test to better place mysql-test/r/rpl_log.result: Move test to better place mysql-test/r/union.result: Move test to better place mysql-test/t/innodb.test: Moved test to right place mysql-test/t/myisam-blob.test: More test of blobs mysql-test/t/rpl000002.test: Move test to better place mysql-test/t/rpl_log.test: Move test to better place mysql-test/t/union.test: Move test to better place sql/field.cc: Changed wellformedlen to well_formed_len. Fixed that blobs >16M can be inserted/updated (new bug) sql/field.h: Code optimization sql/sql_lex.cc: Changed short variable names sql/sql_show.cc: Optimized quote handling sql/sql_table.cc: Fixed bug when doing CREATE TEMPORARY TABLE ... LIKE sql/sql_union.cc: Added comment strings/ctype-big5.c: Changed wellformedlen to well_formed_len strings/ctype-bin.c: Changed wellformedlen to well_formed_len strings/ctype-euc_kr.c: Changed wellformedlen to well_formed_len strings/ctype-gb2312.c: Changed wellformedlen to well_formed_len strings/ctype-gbk.c: Changed wellformedlen to well_formed_len strings/ctype-latin1.c: Changed wellformedlen to well_formed_len strings/ctype-mb.c: Changed wellformedlen to well_formed_len strings/ctype-simple.c: Changed wellformedlen to well_formed_len strings/ctype-sjis.c: Changed wellformedlen to well_formed_len strings/ctype-tis620.c: Changed wellformedlen to well_formed_len strings/ctype-ucs2.c: Changed wellformedlen to well_formed_len Indentation changes strings/ctype-ujis.c: Changed wellformedlen to well_formed_len strings/ctype-utf8.c: Changed wellformedlen to well_formed_len
Diffstat (limited to 'sql/sql_show.cc')
-rw-r--r--sql/sql_show.cc126
1 files changed, 56 insertions, 70 deletions
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 8ed44d618fb..c169ea8952f 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1089,100 +1089,86 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
DBUG_RETURN(0);
}
-static inline const char *require_quotes(const char *name, uint length)
-{
- uint i, d, c;
- for (i=0; i<length; i+=d)
- {
- c=((uchar *)name)[i];
- d=my_mbcharlen(system_charset_info, c);
- if (d==1 && !system_charset_info->ident_map[c])
- return name+i;
- }
- return 0;
-}
-
/*
- Looking for char in multibyte string
+ Go through all character combinations and ensure that sql_lex.cc can
+ parse it as an identifer.
SYNOPSIS
- look_for_char()
- name string for looking at
- length length of name
- q '\'' or '\"' for looking for
-
- RETURN VALUES
- # pointer to found char in string
- 0 string doesn't contain required char
+ require_quotes()
+ name attribute name
+ name_length length of name
+
+ RETURN
+ # Pointer to conflicting character
+ 0 No conflicting character
*/
-static inline const char *look_for_char(const char *name,
- uint length, char q)
+static const char *require_quotes(const char *name, uint name_length)
{
- const char *cur= name;
- const char *end= cur+length;
- uint symbol_length;
- for (; cur<end; cur+= symbol_length)
+ uint length;
+ const char *end= name + name_length;
+
+ for ( ; name < end ; name++)
{
- char c= *cur;
- symbol_length= my_mbcharlen(system_charset_info, c);
- if (symbol_length==1 && c==q)
- return cur;
+ uchar chr= (uchar) *name;
+ length= my_mbcharlen(system_charset_info, chr);
+ if (length == 1 && !system_charset_info->ident_map[chr])
+ return name;
}
return 0;
}
+
+static void append_quoted_simple_identifier(String *packet, char quote_char,
+ const char *name, uint length)
+{
+ packet->append(&quote_char, 1, system_charset_info);
+ packet->append(name, length, system_charset_info);
+ packet->append(&quote_char, 1, system_charset_info);
+}
+
+
void
append_identifier(THD *thd, String *packet, const char *name, uint length)
{
- char qtype;
+ const char *name_end;
+ char quote_char;
uint part_len;
- const char *qplace;
+
if (thd->variables.sql_mode & MODE_ANSI_QUOTES)
- qtype= '\"';
+ quote_char= '\"';
else
- qtype= '`';
+ quote_char= '`';
if (is_keyword(name,length))
{
- packet->append(&qtype, 1, system_charset_info);
- packet->append(name, length, system_charset_info);
- packet->append(&qtype, 1, system_charset_info);
+ append_quoted_simple_identifier(packet, quote_char, name, length);
+ return;
}
- else
+
+ if (!require_quotes(name, length))
{
- if (!(qplace= require_quotes(name, length)))
- {
- if (!(thd->options & OPTION_QUOTE_SHOW_CREATE))
- packet->append(name, length, system_charset_info);
- else
- {
- packet->append(&qtype, 1, system_charset_info);
- packet->append(name, length, system_charset_info);
- packet->append(&qtype, 1, system_charset_info);
- }
- }
- else
- {
- packet->shrink(packet->length()+length+2);
- packet->append(&qtype, 1, system_charset_info);
- if (*qplace != qtype)
- qplace= look_for_char(qplace+1,length-(qplace-name)-1,qtype);
- while (qplace)
- {
- if ((part_len= qplace-name))
- {
- packet->append(name, part_len, system_charset_info);
- length-= part_len;
- }
- packet->append(qplace, 1, system_charset_info);
- name= qplace;
- qplace= look_for_char(name+1,length-1,qtype);
- }
+ if (!(thd->options & OPTION_QUOTE_SHOW_CREATE))
packet->append(name, length, system_charset_info);
- packet->append(&qtype, 1, system_charset_info);
- }
+ else
+ append_quoted_simple_identifier(packet, quote_char, name, length);
+ return;
+ }
+
+ /* The identifier must be quoted as it includes a quote character */
+
+ packet->reserve(length*2 + 2);
+ packet->append(&quote_char, 1, system_charset_info);
+
+ for (name_end= name+length ; name < name_end ; name+= length)
+ {
+ char chr= *name;
+ length= my_mbcharlen(system_charset_info, chr);
+ if (length == 1 && chr == quote_char)
+ packet->append(&quote_char, 1, system_charset_info);
+ packet->append(name, length, packet->charset());
}
+ packet->append(&quote_char, 1, system_charset_info);
}