diff --git a/mysql-test/r/sql_mode.result b/mysql-test/r/sql_mode.result index 5492a7a65fc..09adc48259c 100644 --- a/mysql-test/r/sql_mode.result +++ b/mysql-test/r/sql_mode.result @@ -386,4 +386,18 @@ p mask example 20 \\\\% \\\\% 20 \\\\% \\\\_ DROP TABLE t1; +SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; +SELECT 'a\\b', 'a\\\"b', 'a''\\b', 'a''\\\"b'; +a\\b a\\\"b a'\\b a'\\\"b +a\\b a\\\"b a'\\b a'\\\"b +SELECT "a\\b", "a\\\'b", "a""\\b", "a""\\\'b"; +a\\b a\\\'b a"\\b a"\\\'b +a\\b a\\\'b a"\\b a"\\\'b +SET @@SQL_MODE=''; +SELECT 'a\\b', 'a\\\"b', 'a''\\b', 'a''\\\"b'; +a\b a\"b a'\b a'\"b +a\b a\"b a'\b a'\"b +SELECT "a\\b", "a\\\'b", "a""\\b", "a""\\\'b"; +a\b a\'b a"\b a"\'b +a\b a\'b a"\b a"\'b SET @@SQL_MODE=@OLD_SQL_MODE; diff --git a/mysql-test/t/sql_mode.test b/mysql-test/t/sql_mode.test index fa5c6cb8a5b..e80752eb71b 100644 --- a/mysql-test/t/sql_mode.test +++ b/mysql-test/t/sql_mode.test @@ -174,4 +174,14 @@ order by masks.p, example; DROP TABLE t1; +# Bug #6368: Make sure backslashes mixed with doubled quotes are handled +# correctly in NO_BACKSLASH_ESCAPES mode +SET @@SQL_MODE='NO_BACKSLASH_ESCAPES'; +SELECT 'a\\b', 'a\\\"b', 'a''\\b', 'a''\\\"b'; +SELECT "a\\b", "a\\\'b", "a""\\b", "a""\\\'b"; + +SET @@SQL_MODE=''; +SELECT 'a\\b', 'a\\\"b', 'a''\\b', 'a''\\\"b'; +SELECT "a\\b", "a\\\'b", "a""\\b", "a""\\\'b"; + SET @@SQL_MODE=@OLD_SQL_MODE; diff --git a/scripts/mysqld_safe.sh b/scripts/mysqld_safe.sh index d6ee11f226d..a8615ff2113 100644 --- a/scripts/mysqld_safe.sh +++ b/scripts/mysqld_safe.sh @@ -23,6 +23,29 @@ case "$1" in ;; esac +usage () { + cat <= 4) + else if (argc == 4 || argc == 5) { - const char *defaults_file = "--defaults-file"; - const char *service = "--local-service"; - char extra_opt[FN_REFLEN] = ""; + /* + This may seem strange, because we handle --local-service while + preserving 4.1's behavior of allowing any one other argument that is + passed to the service on startup. (The assumption is that this is + --defaults-file=file, but that was not enforced in 4.1, so we don't + enforce it here.) + */ + char *extra_opt= NULL; char *account_name = NULL; - char *option; int index; for (index = 3; index < argc; index++) { - option= argv[index]; - /* - Install an optional service with optional config file - mysqld --install-manual mysqldopt --defaults-file=c:\miguel\my.ini - */ - if (strncmp(option, defaults_file, strlen(defaults_file)) == 0) - { - strmov(extra_opt, option); - } - else - /* - Install an optional service as local service - mysqld --install-manual mysqldopt --local-service - */ - if (strncmp(option, service, strlen(service)) == 0) + if (strncmp(argv[index], "--local-service", 15) == 0) { account_name=(char*)malloc(27); strmov(account_name, "NT AUTHORITY\\LocalService\0"); } + else + { + extra_opt= argv[index]; + } } - if (!default_service_handling(argv, argv[2], argv[2], file_path, extra_opt, account_name)) - return 0; + if (argc != 5 || account_name) + if (!default_service_handling(argv, argv[2], argv[2], file_path, extra_opt, account_name)) + return 0; } else if (argc == 1 && Service.IsService(MYSQL_SERVICENAME)) { diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 0644ca5af68..b8c77a822c4 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -337,7 +337,8 @@ static char *get_text(LEX *lex) continue; } #endif - if (*str == '\\' && str+1 != end) + if (!(lex->thd->variables.sql_mode & MODE_NO_BACKSLASH_ESCAPES) && + *str == '\\' && str+1 != end) { switch(*++str) { case 'n':