mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Merge branch '10.0' into 10.1
This commit is contained in:
commit
3361aee591
654 changed files with 30636 additions and 12494 deletions
|
@ -235,8 +235,6 @@ my_bool
|
|||
get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
char *argument)
|
||||
{
|
||||
int error = 0;
|
||||
|
||||
switch(optid) {
|
||||
case 'c':
|
||||
opt_count_iterations= 1;
|
||||
|
@ -284,8 +282,8 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
break;
|
||||
case '?':
|
||||
case 'I': /* Info */
|
||||
error++;
|
||||
break;
|
||||
usage();
|
||||
exit(0);
|
||||
case OPT_CHARSETS_DIR:
|
||||
#if MYSQL_VERSION_ID > 32300
|
||||
charsets_dir = argument;
|
||||
|
@ -296,11 +294,6 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
opt->name);
|
||||
break;
|
||||
}
|
||||
if (error)
|
||||
{
|
||||
usage();
|
||||
exit(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -246,7 +246,7 @@ static void dbDisconnect(char *host);
|
|||
static void DBerror(MYSQL *mysql, const char *when);
|
||||
static void safe_exit(int error);
|
||||
static void print_result();
|
||||
static uint fixed_name_length(const char *name);
|
||||
static size_t fixed_name_length(const char *name);
|
||||
static char *fix_table_name(char *dest, char *src);
|
||||
int what_to_do = 0;
|
||||
|
||||
|
@ -594,10 +594,10 @@ static int process_selected_tables(char *db, char **table_names, int tables)
|
|||
} /* process_selected_tables */
|
||||
|
||||
|
||||
static uint fixed_name_length(const char *name)
|
||||
static size_t fixed_name_length(const char *name)
|
||||
{
|
||||
const char *p;
|
||||
uint extra_length= 2; /* count the first/last backticks */
|
||||
size_t extra_length= 2; /* count the first/last backticks */
|
||||
DBUG_ENTER("fixed_name_length");
|
||||
|
||||
for (p= name; *p; p++)
|
||||
|
@ -605,7 +605,7 @@ static uint fixed_name_length(const char *name)
|
|||
if (*p == '`')
|
||||
extra_length++;
|
||||
}
|
||||
DBUG_RETURN((uint) ((p - name) + extra_length));
|
||||
DBUG_RETURN((size_t) ((p - name) + extra_length));
|
||||
}
|
||||
|
||||
|
||||
|
@ -664,7 +664,7 @@ static int process_all_tables_in_db(char *database)
|
|||
*/
|
||||
|
||||
char *tables, *end;
|
||||
uint tot_length = 0;
|
||||
size_t tot_length = 0;
|
||||
|
||||
char *views, *views_end;
|
||||
uint tot_views_length = 0;
|
||||
|
@ -769,7 +769,9 @@ static int fix_table_storage_name(const char *name)
|
|||
|
||||
if (strncmp(name, "#mysql50#", 9))
|
||||
DBUG_RETURN(1);
|
||||
sprintf(qbuf, "RENAME TABLE `%s` TO `%s`", name, name + 9);
|
||||
my_snprintf(qbuf, sizeof(qbuf), "RENAME TABLE %`s TO %`s",
|
||||
name, name + 9);
|
||||
|
||||
rc= run_query(qbuf, 1);
|
||||
if (verbose)
|
||||
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
||||
|
@ -784,7 +786,8 @@ static int fix_database_storage_name(const char *name)
|
|||
|
||||
if (strncmp(name, "#mysql50#", 9))
|
||||
DBUG_RETURN(1);
|
||||
sprintf(qbuf, "ALTER DATABASE `%s` UPGRADE DATA DIRECTORY NAME", name);
|
||||
my_snprintf(qbuf, sizeof(qbuf), "ALTER DATABASE %`s UPGRADE DATA DIRECTORY "
|
||||
"NAME", name);
|
||||
rc= run_query(qbuf, 1);
|
||||
if (verbose)
|
||||
printf("%-50s %s\n", name, rc ? "FAILED" : "OK");
|
||||
|
@ -806,7 +809,7 @@ static int rebuild_table(char *name)
|
|||
ptr= strxmov(ptr, " FORCE", NullS);
|
||||
if (verbose >= 3)
|
||||
puts(query);
|
||||
if (mysql_real_query(sock, query, (uint)(ptr - query)))
|
||||
if (mysql_real_query(sock, query, (ulong)(ptr - query)))
|
||||
{
|
||||
fprintf(stderr, "Failed to %s\n", query);
|
||||
fprintf(stderr, "Error: %s\n", mysql_error(sock));
|
||||
|
@ -871,7 +874,7 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||
{
|
||||
char *query, *end, options[100], message[100];
|
||||
char table_name_buff[NAME_CHAR_LEN*2*2+1], *table_name;
|
||||
uint query_length= 0;
|
||||
size_t query_length= 0, query_size= sizeof(char)*(length+110);
|
||||
const char *op = 0;
|
||||
const char *tab_view;
|
||||
DBUG_ENTER("handle_request_for_tables");
|
||||
|
@ -924,10 +927,12 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||
DBUG_RETURN(fix_table_storage_name(tables));
|
||||
}
|
||||
|
||||
if (!(query =(char *) my_malloc((sizeof(char)*(length+110)), MYF(MY_WME))))
|
||||
if (!(query =(char *) my_malloc(query_size, MYF(MY_WME))))
|
||||
DBUG_RETURN(1);
|
||||
if (opt_all_in_1)
|
||||
{
|
||||
DBUG_ASSERT(strlen(op)+strlen(tables)+strlen(options)+8+1 <= query_size);
|
||||
|
||||
/* No backticks here as we added them before */
|
||||
query_length= sprintf(query, "%s%s%s %s", op,
|
||||
tab_view, tables, options);
|
||||
|
@ -943,7 +948,7 @@ static int handle_request_for_tables(char *tables, size_t length, my_bool view)
|
|||
(int) (ptr - org)));
|
||||
table_name= table_name_buff;
|
||||
ptr= strxmov(ptr, " ", options, NullS);
|
||||
query_length= (uint) (ptr - query);
|
||||
query_length= (size_t) (ptr - query);
|
||||
}
|
||||
if (verbose >= 3)
|
||||
puts(query);
|
||||
|
@ -1209,7 +1214,7 @@ int main(int argc, char **argv)
|
|||
process_databases(argv);
|
||||
if (opt_auto_repair)
|
||||
{
|
||||
uint i;
|
||||
size_t i;
|
||||
|
||||
if (!opt_silent && (tables4repair.elements || tables4rebuild.elements))
|
||||
puts("\nRepairing tables");
|
||||
|
|
|
@ -92,7 +92,7 @@
|
|||
|
||||
static void add_load_option(DYNAMIC_STRING *str, const char *option,
|
||||
const char *option_value);
|
||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
||||
static ulong find_set(TYPELIB *lib, const char *x, size_t length,
|
||||
char **err_pos, uint *err_len);
|
||||
static char *alloc_query_str(ulong size);
|
||||
|
||||
|
@ -896,7 +896,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
opt_set_charset= 0;
|
||||
opt_compatible_mode_str= argument;
|
||||
opt_compatible_mode= find_set(&compatible_mode_typelib,
|
||||
argument, (uint) strlen(argument),
|
||||
argument, strlen(argument),
|
||||
&err_ptr, &err_len);
|
||||
if (err_len)
|
||||
{
|
||||
|
@ -906,7 +906,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
}
|
||||
#if !defined(DBUG_OFF)
|
||||
{
|
||||
uint size_for_sql_mode= 0;
|
||||
size_t size_for_sql_mode= 0;
|
||||
const char **ptr;
|
||||
for (ptr= compatible_mode_names; *ptr; ptr++)
|
||||
size_for_sql_mode+= strlen(*ptr);
|
||||
|
@ -1177,8 +1177,8 @@ static int fetch_db_collation(const char *db_name,
|
|||
break;
|
||||
}
|
||||
|
||||
strncpy(db_cl_name, db_cl_row[0], db_cl_size);
|
||||
db_cl_name[db_cl_size - 1]= 0; /* just in case. */
|
||||
strncpy(db_cl_name, db_cl_row[0], db_cl_size-1);
|
||||
db_cl_name[db_cl_size - 1]= 0;
|
||||
|
||||
} while (FALSE);
|
||||
|
||||
|
@ -1311,7 +1311,7 @@ get_gtid_pos(char *out_gtid_pos, int master)
|
|||
|
||||
|
||||
static char *my_case_str(const char *str,
|
||||
uint str_len,
|
||||
size_t str_len,
|
||||
const char *token,
|
||||
uint token_len)
|
||||
{
|
||||
|
@ -1527,7 +1527,7 @@ static int switch_character_set_results(MYSQL *mysql, const char *cs_name)
|
|||
*/
|
||||
|
||||
static char *cover_definer_clause(const char *stmt_str,
|
||||
uint stmt_length,
|
||||
size_t stmt_length,
|
||||
const char *definer_version_str,
|
||||
uint definer_version_length,
|
||||
const char *stmt_version_str,
|
||||
|
@ -1727,14 +1727,14 @@ static void dbDisconnect(char *host)
|
|||
} /* dbDisconnect */
|
||||
|
||||
|
||||
static void unescape(FILE *file,char *pos,uint length)
|
||||
static void unescape(FILE *file,char *pos, size_t length)
|
||||
{
|
||||
char *tmp;
|
||||
DBUG_ENTER("unescape");
|
||||
if (!(tmp=(char*) my_malloc(length*2+1, MYF(MY_WME))))
|
||||
die(EX_MYSQLERR, "Couldn't allocate memory");
|
||||
|
||||
mysql_real_escape_string(&mysql_connection, tmp, pos, length);
|
||||
mysql_real_escape_string(&mysql_connection, tmp, pos, (ulong)length);
|
||||
fputc('\'', file);
|
||||
fputs(tmp, file);
|
||||
fputc('\'', file);
|
||||
|
@ -1868,7 +1868,7 @@ static char *quote_for_equal(const char *name, char *buff)
|
|||
Quote '<' '>' '&' '\"' chars and print a string to the xml_file.
|
||||
*/
|
||||
|
||||
static void print_quoted_xml(FILE *xml_file, const char *str, ulong len,
|
||||
static void print_quoted_xml(FILE *xml_file, const char *str, size_t len,
|
||||
my_bool is_attribute_name)
|
||||
{
|
||||
const char *end;
|
||||
|
@ -2129,7 +2129,7 @@ static void print_xml_row(FILE *xml_file, const char *row_name,
|
|||
squeezed to a single hyphen.
|
||||
*/
|
||||
|
||||
static void print_xml_comment(FILE *xml_file, ulong len,
|
||||
static void print_xml_comment(FILE *xml_file, size_t len,
|
||||
const char *comment_string)
|
||||
{
|
||||
const char* end;
|
||||
|
@ -2246,7 +2246,7 @@ static uint dump_events_for_db(char *db)
|
|||
DBUG_ENTER("dump_events_for_db");
|
||||
DBUG_PRINT("enter", ("db: '%s'", db));
|
||||
|
||||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
||||
mysql_real_escape_string(mysql, db_name_buff, db, (ulong)strlen(db));
|
||||
|
||||
/* nice comments */
|
||||
print_comment(sql_file, 0,
|
||||
|
@ -2366,7 +2366,6 @@ static uint dump_events_for_db(char *db)
|
|||
(const char *) delimiter);
|
||||
|
||||
my_free(query_str);
|
||||
|
||||
restore_time_zone(sql_file, delimiter);
|
||||
restore_sql_mode(sql_file, delimiter);
|
||||
|
||||
|
@ -2459,7 +2458,7 @@ static uint dump_routines_for_db(char *db)
|
|||
DBUG_ENTER("dump_routines_for_db");
|
||||
DBUG_PRINT("enter", ("db: '%s'", db));
|
||||
|
||||
mysql_real_escape_string(mysql, db_name_buff, db, strlen(db));
|
||||
mysql_real_escape_string(mysql, db_name_buff, db, (ulong)strlen(db));
|
||||
|
||||
/* nice comments */
|
||||
print_comment(sql_file, 0,
|
||||
|
@ -2517,9 +2516,9 @@ static uint dump_routines_for_db(char *db)
|
|||
if the user has EXECUTE privilege he see routine names, but NOT the
|
||||
routine body of other routines that are not the creator of!
|
||||
*/
|
||||
DBUG_PRINT("info",("length of body for %s row[2] '%s' is %d",
|
||||
DBUG_PRINT("info",("length of body for %s row[2] '%s' is %zu",
|
||||
routine_name, row[2] ? row[2] : "(null)",
|
||||
row[2] ? (int) strlen(row[2]) : 0));
|
||||
row[2] ? strlen(row[2]) : 0));
|
||||
if (row[2] == NULL)
|
||||
{
|
||||
print_comment(sql_file, 1, "\n-- insufficient privileges to %s\n",
|
||||
|
@ -4107,7 +4106,7 @@ static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
|
|||
int i;
|
||||
char name_buff[NAME_LEN*2+3];
|
||||
|
||||
mysql_real_escape_string(mysql, name_buff, db, strlen(db));
|
||||
mysql_real_escape_string(mysql, name_buff, db, (ulong)strlen(db));
|
||||
|
||||
init_dynamic_string_checked(&dynamic_where, " AND TABLESPACE_NAME IN ("
|
||||
"SELECT DISTINCT TABLESPACE_NAME FROM"
|
||||
|
@ -4120,7 +4119,7 @@ static int dump_tablespaces_for_tables(char *db, char **table_names, int tables)
|
|||
for (i=0 ; i<tables ; i++)
|
||||
{
|
||||
mysql_real_escape_string(mysql, name_buff,
|
||||
table_names[i], strlen(table_names[i]));
|
||||
table_names[i], (ulong)strlen(table_names[i]));
|
||||
|
||||
dynstr_append_checked(&dynamic_where, "'");
|
||||
dynstr_append_checked(&dynamic_where, name_buff);
|
||||
|
@ -4150,7 +4149,7 @@ static int dump_tablespaces_for_databases(char** databases)
|
|||
{
|
||||
char db_name_buff[NAME_LEN*2+3];
|
||||
mysql_real_escape_string(mysql, db_name_buff,
|
||||
databases[i], strlen(databases[i]));
|
||||
databases[i], (ulong)strlen(databases[i]));
|
||||
dynstr_append_checked(&dynamic_where, "'");
|
||||
dynstr_append_checked(&dynamic_where, db_name_buff);
|
||||
dynstr_append_checked(&dynamic_where, "',");
|
||||
|
@ -5418,7 +5417,7 @@ static int start_transaction(MYSQL *mysql_con)
|
|||
}
|
||||
|
||||
|
||||
static ulong find_set(TYPELIB *lib, const char *x, uint length,
|
||||
static ulong find_set(TYPELIB *lib, const char *x, size_t length,
|
||||
char **err_pos, uint *err_len)
|
||||
{
|
||||
const char *end= x + length;
|
||||
|
@ -5476,7 +5475,7 @@ static void print_value(FILE *file, MYSQL_RES *result, MYSQL_ROW row,
|
|||
fputc(' ',file);
|
||||
fputs(prefix, file);
|
||||
if (string_value)
|
||||
unescape(file,row[0],(uint) strlen(row[0]));
|
||||
unescape(file,row[0], strlen(row[0]));
|
||||
else
|
||||
fputs(row[0], file);
|
||||
check_io(file);
|
||||
|
@ -5732,8 +5731,8 @@ static my_bool get_view_structure(char *table, char* db)
|
|||
verbose_msg("-- Retrieving view structure for table %s...\n", table);
|
||||
|
||||
#ifdef NOT_REALLY_USED_YET
|
||||
sprintf(insert_pat, "SET SQL_QUOTE_SHOW_CREATE=%d",
|
||||
(opt_quoted || opt_keywords));
|
||||
dynstr_append_checked(&insert_pat, "SET SQL_QUOTE_SHOW_CREATE=");
|
||||
dynstr_append_checked(&insert_pat, (opt_quoted || opt_keywords)? "1":"0");
|
||||
#endif
|
||||
|
||||
result_table= quote_name(table, table_buff, 1);
|
||||
|
|
|
@ -51,9 +51,9 @@ static int list_tables(MYSQL *mysql,const char *db,const char *table);
|
|||
static int list_table_status(MYSQL *mysql,const char *db,const char *table);
|
||||
static int list_fields(MYSQL *mysql,const char *db,const char *table,
|
||||
const char *field);
|
||||
static void print_header(const char *header,uint head_length,...);
|
||||
static void print_row(const char *header,uint head_length,...);
|
||||
static void print_trailer(uint length,...);
|
||||
static void print_header(const char *header,size_t head_length,...);
|
||||
static void print_row(const char *header,size_t head_length,...);
|
||||
static void print_trailer(size_t length,...);
|
||||
static void print_res_header(MYSQL_RES *result);
|
||||
static void print_res_top(MYSQL_RES *result);
|
||||
static void print_res_row(MYSQL_RES *result,MYSQL_ROW cur);
|
||||
|
@ -379,7 +379,8 @@ static int
|
|||
list_dbs(MYSQL *mysql,const char *wild)
|
||||
{
|
||||
const char *header;
|
||||
uint length, counter = 0;
|
||||
size_t length = 0;
|
||||
uint counter = 0;
|
||||
ulong rowcount = 0L;
|
||||
char tables[NAME_LEN+1], rows[NAME_LEN+1];
|
||||
char query[NAME_LEN + 100];
|
||||
|
@ -417,7 +418,7 @@ list_dbs(MYSQL *mysql,const char *wild)
|
|||
printf("Wildcard: %s\n",wild);
|
||||
|
||||
header="Databases";
|
||||
length=(uint) strlen(header);
|
||||
length= strlen(header);
|
||||
field=mysql_fetch_field(result);
|
||||
if (length < field->max_length)
|
||||
length=field->max_length;
|
||||
|
@ -505,7 +506,8 @@ static int
|
|||
list_tables(MYSQL *mysql,const char *db,const char *table)
|
||||
{
|
||||
const char *header;
|
||||
uint head_length, counter = 0;
|
||||
size_t head_length;
|
||||
uint counter = 0;
|
||||
char query[NAME_LEN + 100], rows[NAME_LEN], fields[16];
|
||||
MYSQL_FIELD *field;
|
||||
MYSQL_RES *result;
|
||||
|
@ -542,7 +544,7 @@ list_tables(MYSQL *mysql,const char *db,const char *table)
|
|||
putchar('\n');
|
||||
|
||||
header="Tables";
|
||||
head_length=(uint) strlen(header);
|
||||
head_length= strlen(header);
|
||||
field=mysql_fetch_field(result);
|
||||
if (head_length < field->max_length)
|
||||
head_length=field->max_length;
|
||||
|
@ -660,7 +662,7 @@ list_table_status(MYSQL *mysql,const char *db,const char *wild)
|
|||
len= sizeof(query);
|
||||
len-= my_snprintf(query, len, "show table status from `%s`", db);
|
||||
if (wild && wild[0] && len)
|
||||
strxnmov(query + strlen(query), len, " like '", wild, "'", NullS);
|
||||
strxnmov(query + strlen(query), len - 1, " like '", wild, "'", NullS);
|
||||
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
||||
{
|
||||
fprintf(stderr,"%s: Cannot get status for db: %s, table: %s: %s\n",
|
||||
|
@ -693,7 +695,7 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||
const char *wild)
|
||||
{
|
||||
char query[NAME_LEN + 100];
|
||||
int len;
|
||||
size_t len;
|
||||
MYSQL_RES *result;
|
||||
MYSQL_ROW row;
|
||||
ulong UNINIT_VAR(rows);
|
||||
|
@ -723,7 +725,7 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||
len-= my_snprintf(query, len, "show /*!32332 FULL */ columns from `%s`",
|
||||
table);
|
||||
if (wild && wild[0] && len)
|
||||
strxnmov(query + strlen(query), len, " like '", wild, "'", NullS);
|
||||
strxnmov(query + strlen(query), len - 1, " like '", wild, "'", NullS);
|
||||
if (mysql_query(mysql,query) || !(result=mysql_store_result(mysql)))
|
||||
{
|
||||
fprintf(stderr,"%s: Cannot list columns in db: %s, table: %s: %s\n",
|
||||
|
@ -771,10 +773,10 @@ list_fields(MYSQL *mysql,const char *db,const char *table,
|
|||
*****************************************************************************/
|
||||
|
||||
static void
|
||||
print_header(const char *header,uint head_length,...)
|
||||
print_header(const char *header,size_t head_length,...)
|
||||
{
|
||||
va_list args;
|
||||
uint length,i,str_length,pre_space;
|
||||
size_t length,i,str_length,pre_space;
|
||||
const char *field;
|
||||
|
||||
va_start(args,head_length);
|
||||
|
@ -797,10 +799,10 @@ print_header(const char *header,uint head_length,...)
|
|||
putchar('|');
|
||||
for (;;)
|
||||
{
|
||||
str_length=(uint) strlen(field);
|
||||
str_length= strlen(field);
|
||||
if (str_length > length)
|
||||
str_length=length+1;
|
||||
pre_space=(uint) (((int) length-(int) str_length)/2)+1;
|
||||
pre_space= ((length- str_length)/2)+1;
|
||||
for (i=0 ; i < pre_space ; i++)
|
||||
putchar(' ');
|
||||
for (i = 0 ; i < str_length ; i++)
|
||||
|
@ -834,11 +836,11 @@ print_header(const char *header,uint head_length,...)
|
|||
|
||||
|
||||
static void
|
||||
print_row(const char *header,uint head_length,...)
|
||||
print_row(const char *header,size_t head_length,...)
|
||||
{
|
||||
va_list args;
|
||||
const char *field;
|
||||
uint i,length,field_length;
|
||||
size_t i,length,field_length;
|
||||
|
||||
va_start(args,head_length);
|
||||
field=header; length=head_length;
|
||||
|
@ -847,7 +849,7 @@ print_row(const char *header,uint head_length,...)
|
|||
putchar('|');
|
||||
putchar(' ');
|
||||
fputs(field,stdout);
|
||||
field_length=(uint) strlen(field);
|
||||
field_length= strlen(field);
|
||||
for (i=field_length ; i <= length ; i++)
|
||||
putchar(' ');
|
||||
if (!(field=va_arg(args,char *)))
|
||||
|
@ -861,10 +863,10 @@ print_row(const char *header,uint head_length,...)
|
|||
|
||||
|
||||
static void
|
||||
print_trailer(uint head_length,...)
|
||||
print_trailer(size_t head_length,...)
|
||||
{
|
||||
va_list args;
|
||||
uint length,i;
|
||||
size_t length,i;
|
||||
|
||||
va_start(args,head_length);
|
||||
length=head_length;
|
||||
|
@ -907,7 +909,7 @@ static void print_res_top(MYSQL_RES *result)
|
|||
mysql_field_seek(result,0);
|
||||
while((field = mysql_fetch_field(result)))
|
||||
{
|
||||
if ((length=(uint) strlen(field->name)) > field->max_length)
|
||||
if ((length= strlen(field->name)) > field->max_length)
|
||||
field->max_length=length;
|
||||
else
|
||||
length=field->max_length;
|
||||
|
|
|
@ -15,7 +15,7 @@ SET(fail_patterns
|
|||
)
|
||||
|
||||
MACRO (MY_CHECK_C_COMPILER_FLAG flag)
|
||||
STRING(REGEX REPLACE "[-,= ]" "_" result "HAVE_C_${flag}")
|
||||
STRING(REGEX REPLACE "[-,= +]" "_" result "HAVE_C_${flag}")
|
||||
SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
||||
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}")
|
||||
CHECK_C_SOURCE_COMPILES("int main(void) { return 0; }" ${result}
|
||||
|
@ -24,7 +24,7 @@ MACRO (MY_CHECK_C_COMPILER_FLAG flag)
|
|||
ENDMACRO()
|
||||
|
||||
MACRO (MY_CHECK_CXX_COMPILER_FLAG flag)
|
||||
STRING(REGEX REPLACE "[-,= ]" "_" result "HAVE_CXX_${flag}")
|
||||
STRING(REGEX REPLACE "[-,= +]" "_" result "HAVE_CXX_${flag}")
|
||||
SET(SAVE_CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS}")
|
||||
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${flag}")
|
||||
CHECK_CXX_SOURCE_COMPILES("int main(void) { return 0; }" ${result}
|
||||
|
@ -40,7 +40,7 @@ FUNCTION(MY_CHECK_AND_SET_COMPILER_FLAG flag)
|
|||
ENDIF()
|
||||
MY_CHECK_C_COMPILER_FLAG(${flag})
|
||||
MY_CHECK_CXX_COMPILER_FLAG(${flag})
|
||||
STRING(REGEX REPLACE "[-,= ]" "_" result "${flag}")
|
||||
STRING(REGEX REPLACE "[-,= +]" "_" result "${flag}")
|
||||
FOREACH(lang C CXX)
|
||||
IF (HAVE_${lang}_${result})
|
||||
IF(ARGN)
|
||||
|
|
|
@ -50,10 +50,11 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
switch(optid) {
|
||||
case 'V':
|
||||
printf("%s version %s by Jani Tolonen\n", progname, VER);
|
||||
exit(-1);
|
||||
exit(0);
|
||||
case 'I':
|
||||
case '?':
|
||||
usage();
|
||||
exit(0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -69,7 +70,10 @@ int main(int argc, char *argv[])
|
|||
exit(-1);
|
||||
if (!argv[0] || !argv[1] || (pid= atoi(argv[0])) <= 0 ||
|
||||
(t= atoi(argv[1])) <= 0)
|
||||
{
|
||||
usage();
|
||||
exit(-1);
|
||||
}
|
||||
for (; t > 0; t--)
|
||||
{
|
||||
if (kill((pid_t) pid, sig))
|
||||
|
@ -100,5 +104,4 @@ void usage(void)
|
|||
printf("integer arguments.\n\n");
|
||||
printf("Options:\n");
|
||||
my_print_help(my_long_options);
|
||||
exit(-1);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
/*
|
||||
Copyright (C) 2000-2007 MySQL AB
|
||||
Use is subject to license terms
|
||||
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
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
|
||||
|
|
|
@ -331,7 +331,8 @@ typedef struct st_sort_info
|
|||
my_off_t filelength, dupp, buff_length;
|
||||
ha_rows max_records;
|
||||
uint current_key, total_keys;
|
||||
uint got_error, threads_running;
|
||||
volatile uint got_error;
|
||||
uint threads_running;
|
||||
myf myf_rw;
|
||||
enum data_file_type new_data_file_type;
|
||||
} MI_SORT_INFO;
|
||||
|
|
|
@ -122,8 +122,12 @@ ADD_DEPENDENCIES(sql_embedded GenError GenServerSource)
|
|||
# On Unix, it is libmysqld.a
|
||||
IF(WIN32)
|
||||
SET(MYSQLSERVER_OUTPUT_NAME mysqlserver)
|
||||
SET(COMPONENT_MYSQLSERVER "Embedded")
|
||||
SET(COMPONENT_LIBMYSQLD "Embedded")
|
||||
ELSE()
|
||||
SET(MYSQLSERVER_OUTPUT_NAME mysqld)
|
||||
SET(COMPONENT_MYSQLSERVER "Development")
|
||||
SET(COMPONENT_LIBMYSQLD "Server")
|
||||
ENDIF()
|
||||
|
||||
|
||||
|
@ -148,9 +152,9 @@ FOREACH(LIB ${LIBS})
|
|||
ENDFOREACH()
|
||||
|
||||
MERGE_LIBRARIES(mysqlserver STATIC ${EMBEDDED_LIBS}
|
||||
OUTPUT_NAME ${MYSQLSERVER_OUTPUT_NAME} COMPONENT Development)
|
||||
OUTPUT_NAME ${MYSQLSERVER_OUTPUT_NAME} COMPONENT ${COMPONENT_MYSQLSERVER})
|
||||
|
||||
INSTALL(FILES embedded_priv.h DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT Development)
|
||||
INSTALL(FILES embedded_priv.h DESTINATION ${INSTALL_INCLUDEDIR}/private COMPONENT ${COMPONENT_MYSQLSERVER})
|
||||
|
||||
# Visual Studio users need debug static library
|
||||
IF(MSVC)
|
||||
|
@ -177,7 +181,7 @@ ENDFOREACH()
|
|||
|
||||
IF(NOT DISABLE_SHARED)
|
||||
MERGE_LIBRARIES(libmysqld SHARED mysqlserver EXPORTS ${EMBEDDED_API}
|
||||
COMPONENT Server)
|
||||
COMPONENT ${COMPONENT_LIBMYSQLD})
|
||||
IF(UNIX)
|
||||
# Name the shared library, handle versioning (provides same api as client
|
||||
# library hence the same version)
|
||||
|
|
|
@ -1783,9 +1783,12 @@ sub set_build_thread_ports($) {
|
|||
if ( lc($opt_build_thread) eq 'auto' ) {
|
||||
my $found_free = 0;
|
||||
$build_thread = 300; # Start attempts from here
|
||||
my $build_thread_upper = $build_thread + ($opt_parallel > 1500
|
||||
? 3000
|
||||
: 2 * $opt_parallel) + 300;
|
||||
while (! $found_free)
|
||||
{
|
||||
$build_thread= mtr_get_unique_id($build_thread, 349);
|
||||
$build_thread= mtr_get_unique_id($build_thread, $build_thread_upper);
|
||||
if ( !defined $build_thread ) {
|
||||
mtr_error("Could not get a unique build thread id");
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@ Visma http://visma.com Member of the MariaDB Foundation
|
|||
Nexedi http://www.nexedi.com Member of the MariaDB Foundation
|
||||
Acronis http://www.acronis.com Member of the MariaDB Foundation
|
||||
Verkkokauppa.com Finland Sponsor of the MariaDB Foundation
|
||||
Webyog Bangalore Sponsor of the MariaDB Foundation
|
||||
Virtuozzo https://virtuozzo.com/ Sponsor of the MariaDB Foundation
|
||||
Google USA Sponsoring encryption, parallel replication and GTID
|
||||
Facebook USA Sponsoring non-blocking API, LIMIT ROWS EXAMINED etc
|
||||
Ronald Bradford Brisbane, Australia EFF contribution for UC2006 Auction
|
||||
|
|
|
@ -262,11 +262,11 @@ create table mysqltest2.t2 like test.t1;
|
|||
lock table test.t1 write, mysqltest2.t2 write;
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock mysqltest2 t2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
create or replace table test.t1;
|
||||
ERROR 42000: A table must have at least 1 column
|
||||
show tables;
|
||||
|
@ -274,10 +274,10 @@ Tables_in_test
|
|||
t2
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock mysqltest2 t2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2
|
||||
create or replace table mysqltest2.t2;
|
||||
ERROR 42000: A table must have at least 1 column
|
||||
select * from information_schema.metadata_lock_info;
|
||||
|
@ -289,11 +289,11 @@ create table mysqltest2.t2 like test.t1;
|
|||
lock table test.t1 write, mysqltest2.t2 write;
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock mysqltest2 t2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
create or replace table test.t1 (a int) select 1 as 'a', 2 as 'a';
|
||||
ERROR 42S21: Duplicate column name 'a'
|
||||
show tables;
|
||||
|
@ -301,10 +301,10 @@ Tables_in_test
|
|||
t2
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock mysqltest2 t2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock mysqltest2
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock mysqltest2 t2
|
||||
create or replace table mysqltest2.t2 (a int) select 1 as 'a', 2 as 'a';
|
||||
ERROR 42S21: Duplicate column name 'a'
|
||||
select * from information_schema.metadata_lock_info;
|
||||
|
@ -398,31 +398,31 @@ create table t1 (a int);
|
|||
lock table t1 write, t2 read;
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_SHARED_READ MDL_EXPLICIT Table metadata lock test t2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
# MDL_SHARED_READ NULL Table metadata lock test t2
|
||||
create or replace table t1 (i int);
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_SHARED_READ MDL_EXPLICIT Table metadata lock test t2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
# MDL_SHARED_READ NULL Table metadata lock test t2
|
||||
create or replace table t1 like t2;
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_SHARED_READ MDL_EXPLICIT Table metadata lock test t2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
# MDL_SHARED_READ NULL Table metadata lock test t2
|
||||
create or replace table t1 select 1 as f1;
|
||||
select * from information_schema.metadata_lock_info;
|
||||
THREAD_ID LOCK_MODE LOCK_DURATION LOCK_TYPE TABLE_SCHEMA TABLE_NAME
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Global read lock
|
||||
# MDL_SHARED_NO_READ_WRITE MDL_EXPLICIT Table metadata lock test t1
|
||||
# MDL_SHARED_READ MDL_EXPLICIT Table metadata lock test t2
|
||||
# MDL_INTENTION_EXCLUSIVE MDL_EXPLICIT Schema metadata lock test
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Global read lock
|
||||
# MDL_INTENTION_EXCLUSIVE NULL Schema metadata lock test
|
||||
# MDL_SHARED_NO_READ_WRITE NULL Table metadata lock test t1
|
||||
# MDL_SHARED_READ NULL Table metadata lock test t2
|
||||
drop table t1;
|
||||
unlock tables;
|
||||
#
|
||||
|
|
|
@ -277,9 +277,40 @@ CREATE TABLE t1 ( a VARCHAR(1) );
|
|||
INSERT INTO t1 VALUES ('m'),('n');
|
||||
CREATE VIEW v1 AS SELECT 'w' ;
|
||||
SELECT * FROM t1 WHERE a < ALL ( SELECT * FROM v1 );
|
||||
ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<='
|
||||
a
|
||||
m
|
||||
n
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
SET character_set_connection = default;
|
||||
SET optimizer_switch= default;
|
||||
#End of 5.3 tests
|
||||
#
|
||||
# Start of 5.5 tests
|
||||
#
|
||||
#
|
||||
# MDEV-10181 Illegal mix of collation for a field and an ASCII string as a view field
|
||||
#
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1);
|
||||
INSERT INTO t1 VALUES ('A'),('a'),('B'),('b');
|
||||
CREATE VIEW v1 AS SELECT 'a';
|
||||
SELECT * FROM v1,t1 where t1.a=v1.a;
|
||||
a a
|
||||
a A
|
||||
a a
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1);
|
||||
INSERT INTO t1 VALUES ('a'),('b'),('c');
|
||||
CREATE VIEW v1 AS SELECT 'a' AS a UNION SELECT 'b';
|
||||
SELECT * FROM v1,t1 WHERE t1.a=v1.a;
|
||||
a a
|
||||
a a
|
||||
b b
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
|
|
|
@ -6209,6 +6209,45 @@ OCTET_LENGTH(a) a
|
|||
255 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-8402 Bug#77473 Bug#21317406 TRUNCATED DATA WITH SUBQUERY & UTF8
|
||||
#
|
||||
#
|
||||
SET NAMES utf8;
|
||||
SELECT length(rpad(_utf8 0xD0B1, 65536, _utf8 0xD0B2)) AS data;
|
||||
data
|
||||
131072
|
||||
SELECT length(data) AS len FROM (
|
||||
SELECT rpad(_utf8 0xD0B1, 65536, _utf8 0xD0B2) AS data
|
||||
) AS sub;
|
||||
len
|
||||
131072
|
||||
SELECT length(rpad(_utf8 0xD0B1, 65535, _utf8 0xD0B2)) AS data;
|
||||
data
|
||||
131070
|
||||
SELECT length(data) AS len FROM (
|
||||
SELECT rpad(_utf8 0xD0B1, 65535, _utf8 0xD0B2) AS data
|
||||
) AS sub;
|
||||
len
|
||||
131070
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36766) AS data) AS sub;
|
||||
len
|
||||
73532
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36767) AS data) AS sub;
|
||||
len
|
||||
73534
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36778) AS data) AS sub;
|
||||
len
|
||||
73556
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65535) AS data) AS sub;
|
||||
len
|
||||
131070
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65536) AS data) AS sub;
|
||||
len
|
||||
131072
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65537) AS data) AS sub;
|
||||
len
|
||||
131074
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -2825,6 +2825,40 @@ OCTET_LENGTH(a) a
|
|||
252 😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎😎
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-8402 Bug#77473 Bug#21317406 TRUNCATED DATA WITH SUBQUERY & UTF8
|
||||
#
|
||||
#
|
||||
SET NAMES utf8mb4;
|
||||
SELECT length(repeat(_utf8mb4 0xE29883, 21844)) AS data;
|
||||
data
|
||||
65532
|
||||
SELECT length(data) AS len
|
||||
FROM ( SELECT repeat(_utf8mb4 0xE29883, 21844) AS data ) AS sub;
|
||||
len
|
||||
65532
|
||||
SELECT length(repeat(_utf8mb4 0xE29883, 21846)) AS data;
|
||||
data
|
||||
65538
|
||||
SELECT length(data) AS len
|
||||
FROM ( SELECT repeat(_utf8mb4 0xE29883, 21846) AS data ) AS sub;
|
||||
len
|
||||
65538
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21844) AS data ) AS sub;
|
||||
len
|
||||
65532
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21845) AS data ) AS sub;
|
||||
len
|
||||
65535
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21846) AS data ) AS sub;
|
||||
len
|
||||
65538
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65535) AS data ) AS sub;
|
||||
len
|
||||
196605
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub;
|
||||
len
|
||||
196608
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -470,6 +470,26 @@ DROP EVENT ev1;
|
|||
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
#
|
||||
# MDEV-9524 Cannot load from mysql.event when sql_mode is set to PAD_CHAR_TO_FULL_LENGTH
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 SECOND DO DELETE FROM t1;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
events_test ev1 root@localhost SYSTEM RECURRING NULL 5 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
SET sql_mode=PAD_CHAR_TO_FULL_LENGTH;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
events_test ev1 root@localhost SYSTEM RECURRING NULL 5 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
DROP EVENT ev1;
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 SECOND DO DELETE FROM t1;
|
||||
SHOW EVENTS;
|
||||
Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation
|
||||
events_test ev1 root@localhost SYSTEM RECURRING NULL 5 # # NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci
|
||||
DROP EVENT ev1;
|
||||
DROP TABLE t1;
|
||||
SET sql_mode=DEFAULT;
|
||||
|
||||
#
|
||||
# End of tests
|
||||
|
|
|
@ -813,6 +813,25 @@ EXECUTE s;
|
|||
DROP TABLE t1;
|
||||
# End of 5.3 tests
|
||||
#
|
||||
# Start of 10.0 tests
|
||||
#
|
||||
#
|
||||
# MDEV-10020 InnoDB NOT IN Query Crash When One Item Is NULL
|
||||
#
|
||||
CREATE TABLE t1
|
||||
(
|
||||
a INT(11),
|
||||
b VARCHAR(10),
|
||||
KEY (b)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1,'x'),(2,'y'),(3,'z');
|
||||
SELECT * FROM t1 WHERE b NOT IN (NULL, '', 'A');
|
||||
a b
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Start of 10.1 tests
|
||||
#
|
||||
#
|
||||
# MDEV-8755 Equal field propagation is not performed any longer for the IN list when multiple comparison types
|
||||
#
|
||||
CREATE TABLE t1 (a INT);
|
||||
|
|
|
@ -148,6 +148,21 @@ help 'impossible_category_1';
|
|||
source_category_name name is_it_category
|
||||
impossible_category_1 impossible_function_1 N
|
||||
impossible_category_1 impossible_function_2 N
|
||||
# MDEV-9524 Cannot load from mysql.event when sql_mode is set to PAD_CHAR_TO_FULL_LENGTH
|
||||
help 'impossible_function_1';
|
||||
name description example
|
||||
impossible_function_1 description of
|
||||
impossible_function1
|
||||
example of
|
||||
impossible_function1
|
||||
SET sql_mode=PAD_CHAR_TO_FULL_LENGTH;
|
||||
help 'impossible_function_1';
|
||||
name description example
|
||||
impossible_function_1 description of
|
||||
impossible_function1
|
||||
example of
|
||||
impossible_function1
|
||||
SET sql_mode=DEFAULT;
|
||||
set sql_mode="";
|
||||
alter table mysql.help_relation engine=innodb;
|
||||
alter table mysql.help_keyword engine=innodb;
|
||||
|
|
70
mysql-test/r/information_schema_stats.result
Normal file
70
mysql-test/r/information_schema_stats.result
Normal file
|
@ -0,0 +1,70 @@
|
|||
set global userstat=1;
|
||||
create table just_a_test(id int,first_name varchar(10),last_name varchar(10),address varchar(100),phone bigint,email varchar(30), state varchar(30));
|
||||
insert into just_a_test values(1,'fa','la','china_a',11111111,'fa_la@163.com','California'),
|
||||
(2,'fb','lb','china_b',22222222,'fb_lb@163.com','Arizona'),
|
||||
(3,'fc','lc','china_c',33333333,'fc_lc@163.com','California'),
|
||||
(4,'fd','ld','china_d',44444444,'fd_ld@163.com','Utah'),
|
||||
(5,'fe','le','china_e',55555555,'fe_le@163.com','Arizona');
|
||||
alter table just_a_test add primary key (id);
|
||||
alter table just_a_test add key IND_just_a_test_first_name_last_name(first_name,last_name);
|
||||
alter table just_a_test add key IND_just_a_test_state(state);
|
||||
select count(*) from just_a_test where first_name='fc' and last_name='lc';
|
||||
count(*)
|
||||
1
|
||||
select count(*) from just_a_test where state = 'California';
|
||||
count(*)
|
||||
2
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
test just_a_test IND_just_a_test_state 2
|
||||
test just_a_test IND_just_a_test_first_name_last_name 1
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
test just_a_test 18 5 5
|
||||
alter table just_a_test drop key IND_just_a_test_first_name_last_name;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
test just_a_test IND_just_a_test_state 2
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
test just_a_test 23 5 5
|
||||
alter table just_a_test drop column state;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
test just_a_test 28 5 5
|
||||
drop table just_a_test;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
create table just_a_test(id int not null primary key,first_name varchar(10),last_name varchar(10),address varchar(100),phone bigint,email varchar(30), state varchar(30),key(first_name,last_name),key(state));
|
||||
insert into just_a_test values(1,'fa','la','china_a',11111111,'fa_la@163.com','California'),
|
||||
(2,'fb','lb','china_b',22222222,'fb_lb@163.com','Arizona'),
|
||||
(3,'fc','lc','china_c',33333333,'fc_lc@163.com','California'),
|
||||
(4,'fd','ld','china_d',44444444,'fd_ld@163.com','Utah'),
|
||||
(5,'fe','le','china_e',55555555,'fe_le@163.com','Arizona');
|
||||
select count(*) from just_a_test where first_name='fc' and last_name='lc';
|
||||
count(*)
|
||||
1
|
||||
select count(*) from just_a_test where state = 'California';
|
||||
count(*)
|
||||
2
|
||||
select count(*) from just_a_test where id between 2 and 4;
|
||||
count(*)
|
||||
3
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
test just_a_test first_name 1
|
||||
test just_a_test state 2
|
||||
test just_a_test PRIMARY 5
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
test just_a_test 8 5 15
|
||||
drop table just_a_test;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
set global userstat=0;
|
|
@ -28,3 +28,18 @@ ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`
|
|||
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
||||
ERROR 23000: Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `t2_ibfk_1` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||
DROP TABLE t2, t1;
|
||||
#
|
||||
# BUG#22037930: INSERT IGNORE FAILS TO IGNORE FOREIGN
|
||||
# KEY CONSTRAINT
|
||||
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE= INNODB;
|
||||
CREATE TABLE t2 (fld1 VARCHAR(10), fld2 INT NOT NULL,
|
||||
CONSTRAINT fk FOREIGN KEY (fld2) REFERENCES t1(fld1)) ENGINE= INNODB;
|
||||
# Without patch, reports incorrect error.
|
||||
INSERT INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||
REPLACE INTO t2 VALUES('abc', 2);
|
||||
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||
INSERT IGNORE INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||
Warnings:
|
||||
Warning 1452 Cannot add or update a child row: a foreign key constraint fails (`test`.`t2`, CONSTRAINT `fk` FOREIGN KEY (`fld2`) REFERENCES `t1` (`fld1`))
|
||||
DROP TABLE t2, t1;
|
||||
|
|
|
@ -102,6 +102,34 @@ SELECT monthname('2001-03-01');
|
|||
monthname('2001-03-01')
|
||||
März
|
||||
#
|
||||
# MDEV-10052 Illegal mix of collations with DAYNAME(date_field)<>varchar_field
|
||||
#
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (c VARCHAR(8) CHARACTER SET latin1, d DATE);
|
||||
INSERT INTO t1 VALUES ('test',now());
|
||||
Warnings:
|
||||
Note 1265 Data truncated for column 'd' at row 1
|
||||
SET lc_time_names=ru_RU;
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<>'
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
ERROR HY000: Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,IMPLICIT) for operation '<>'
|
||||
SET lc_time_names=en_US;
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
c
|
||||
test
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
c
|
||||
test
|
||||
SET NAMES latin1;
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
c
|
||||
test
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
c
|
||||
test
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# Start of 5.6 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -1040,4 +1040,36 @@ f1 f2
|
|||
1 97
|
||||
DROP TABLE t1, t2;
|
||||
DROP VIEW v1;
|
||||
#
|
||||
# MDEV-5973: MySQL Bug#11757486:49539: NON-DESCRIPTIVE ERR (ERROR 0
|
||||
# FROM STORAGE ENGINE) WITH MULTI-TABLE UPDATE
|
||||
#
|
||||
CREATE TABLE table_11757486 (field1 tinyint) ENGINE=INNODB;
|
||||
INSERT INTO table_11757486 VALUES (0),(0);
|
||||
SET SESSION SQL_MODE='STRICT_ALL_TABLES';
|
||||
UPDATE IGNORE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'field1' at row 1
|
||||
Warning 1264 Out of range value for column 'field1' at row 2
|
||||
UPDATE IGNORE table_11757486 SET field1=128;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'field1' at row 1
|
||||
Warning 1264 Out of range value for column 'field1' at row 2
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.
|
||||
UPDATE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
ERROR 22003: Out of range value for column 'field1' at row 1
|
||||
UPDATE table_11757486 SET field1=128;
|
||||
ERROR 22003: Out of range value for column 'field1' at row 1
|
||||
SET SESSION SQL_MODE='';
|
||||
UPDATE IGNORE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'field1' at row 1
|
||||
Warning 1264 Out of range value for column 'field1' at row 2
|
||||
UPDATE IGNORE table_11757486 SET field1=128;
|
||||
Warnings:
|
||||
Warning 1264 Out of range value for column 'field1' at row 1
|
||||
Warning 1264 Out of range value for column 'field1' at row 2
|
||||
Note 1592 Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. UPDATE IGNORE is unsafe because the order in which rows are updated determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave.
|
||||
DROP TABLE table_11757486;
|
||||
SET SESSION SQL_MODE=default;
|
||||
end of 10.0 tests
|
||||
|
|
|
@ -376,6 +376,11 @@ Repairing views
|
|||
test.v1 OK
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
create table `#mysql50#t1``1` (a int) engine=myisam;
|
||||
show tables;
|
||||
Tables_in_test
|
||||
t1`1
|
||||
drop table `t1``1`;
|
||||
#
|
||||
#MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck
|
||||
#
|
||||
|
|
|
@ -643,6 +643,26 @@ CREATE TRIGGER trigger1 BEFORE INSERT ON t1 FOR EACH ROW
|
|||
SET default_storage_engine = NEW.INNODB;
|
||||
ERROR 42S22: Unknown column 'INNODB' in 'NEW'
|
||||
DROP TABLE t1;
|
||||
select 0==0;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=0' at line 1
|
||||
select 1=!0, 1 = ! 0;
|
||||
1=!0 1 = ! 0
|
||||
1 1
|
||||
select !!0, ! ! 0;
|
||||
!!0 ! ! 0
|
||||
0 0
|
||||
select 2>!0, 2 > ! 0;
|
||||
2>!0 2 > ! 0
|
||||
1 1
|
||||
select 0<=!0, 0 <= !0;
|
||||
0<=!0 0 <= !0
|
||||
1 1
|
||||
select 1<<!0, 1 << !0;
|
||||
1<<!0 1 << !0
|
||||
2 2
|
||||
select 0<!0, 0 < ! 0;
|
||||
0<!0 0 < ! 0
|
||||
1 1
|
||||
#
|
||||
# MDEV-7792 - SQL Parsing Error - UNION AND ORDER BY WITH JOIN
|
||||
#
|
||||
|
|
24
mysql-test/r/ssl_ca.result
Normal file
24
mysql-test/r/ssl_ca.result
Normal file
|
@ -0,0 +1,24 @@
|
|||
#
|
||||
# Bug#21920657: SSL-CA FAILS SILENTLY IF THE PATH CANNOT BE FOUND
|
||||
#
|
||||
# try to connect with wrong '--ssl-ca' path : should fail
|
||||
ERROR 2026 (HY000): SSL connection error: SSL_CTX_set_default_verify_paths failed
|
||||
# try to connect with correct '--ssl-ca' path : should connect
|
||||
Variable_name Value
|
||||
Ssl_cipher DHE-RSA-AES256-SHA
|
||||
#
|
||||
# Bug#21920678: SSL-CA DOES NOT ACCEPT ~USER TILDE HOME DIRECTORY
|
||||
# PATH SUBSTITUTION
|
||||
#
|
||||
# try to connect with '--ssl-ca' option using tilde home directoy
|
||||
# path substitution : should connect
|
||||
Variable_name Value
|
||||
Ssl_cipher DHE-RSA-AES256-SHA
|
||||
# try to connect with '--ssl-key' option using tilde home directoy
|
||||
# path substitution : should connect
|
||||
Variable_name Value
|
||||
Ssl_cipher DHE-RSA-AES256-SHA
|
||||
# try to connect with '--ssl-cert' option using tilde home directoy
|
||||
# path substitution : should connect
|
||||
Variable_name Value
|
||||
Ssl_cipher DHE-RSA-AES256-SHA
|
|
@ -440,6 +440,7 @@ select 1 from t1 as t1_0 inner join t1 as t2 on (t1_0.a <=> now()) join t1 on 1;
|
|||
drop table t1;
|
||||
#
|
||||
# MDEV-9521 Least function returns 0000-00-00 for null date columns instead of null
|
||||
# MDEV-9972 Least function retuns date in date time format
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
id BIGINT NOT NULL,
|
||||
|
|
|
@ -834,6 +834,14 @@ a b a b
|
|||
DEALLOCATE PREPARE stmt1;
|
||||
DROP TABLE t1,t2;
|
||||
#
|
||||
# MDEV-9374 having '2015-01-01 01:00:00.000001' > coalesce(NULL) returns true
|
||||
#
|
||||
CREATE TABLE t1 (c1 DATETIME(0));
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
SELECT * FROM t1 HAVING '2015-01-01 01:00:00.000001' > COALESCE(c1);
|
||||
c1
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# End of 5.5 tests
|
||||
#
|
||||
#
|
||||
|
|
|
@ -135,16 +135,12 @@ handler_read_key
|
|||
set @@global.userstat=0;
|
||||
select * from information_schema.index_statistics;
|
||||
TABLE_SCHEMA TABLE_NAME INDEX_NAME ROWS_READ
|
||||
test t1 PRIMARY 2
|
||||
select * from information_schema.table_statistics;
|
||||
TABLE_SCHEMA TABLE_NAME ROWS_READ ROWS_CHANGED ROWS_CHANGED_X_INDEXES
|
||||
test t1 6 13 13
|
||||
show table_statistics;
|
||||
Table_schema Table_name Rows_read Rows_changed Rows_changed_x_#indexes
|
||||
test t1 6 13 13
|
||||
show index_statistics;
|
||||
Table_schema Table_name Index_name Rows_read
|
||||
test t1 PRIMARY 2
|
||||
select TOTAL_CONNECTIONS, TOTAL_SSL_CONNECTIONS, CONCURRENT_CONNECTIONS, ROWS_READ, ROWS_SENT, ROWS_DELETED, ROWS_INSERTED, ROWS_UPDATED, SELECT_COMMANDS, UPDATE_COMMANDS, OTHER_COMMANDS, COMMIT_TRANSACTIONS, ROLLBACK_TRANSACTIONS, DENIED_CONNECTIONS, LOST_CONNECTIONS, ACCESS_DENIED, EMPTY_QUERIES from information_schema.client_statistics;;
|
||||
TOTAL_CONNECTIONS 2
|
||||
TOTAL_SSL_CONNECTIONS 1
|
||||
|
|
89
mysql-test/suite/innodb/r/innodb-fkcheck.result
Normal file
89
mysql-test/suite/innodb/r/innodb-fkcheck.result
Normal file
|
@ -0,0 +1,89 @@
|
|||
set global innodb_file_per_table = 1;
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
||||
create database bug_fk;
|
||||
use bug_fk;
|
||||
CREATE TABLE b (
|
||||
b int unsigned NOT NULL,
|
||||
d1 datetime NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
CREATE TABLE c (
|
||||
b int unsigned NOT NULL,
|
||||
d1 datetime NOT NULL,
|
||||
d2 datetime NOT NULL,
|
||||
PRIMARY KEY (b,d1),
|
||||
CONSTRAINT b_fk FOREIGN KEY (b) REFERENCES b (b)
|
||||
) ENGINE=InnoDB;
|
||||
show warnings;
|
||||
Level Code Message
|
||||
set foreign_key_checks = 0;
|
||||
DROP TABLE IF EXISTS b;
|
||||
show create table c;
|
||||
Table Create Table
|
||||
c CREATE TABLE `c` (
|
||||
`b` int(10) unsigned NOT NULL,
|
||||
`d1` datetime NOT NULL,
|
||||
`d2` datetime NOT NULL,
|
||||
PRIMARY KEY (`b`,`d1`),
|
||||
CONSTRAINT `b_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
ERROR HY000: Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1005 Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
DROP TABLE IF EXISTS d;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'bug_fk.d'
|
||||
CREATE TABLE d (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1),
|
||||
CONSTRAINT bd_fk FOREIGN KEY (b) REFERENCES b (b)
|
||||
) ENGINE=InnoDB;
|
||||
show warnings;
|
||||
Level Code Message
|
||||
set foreign_key_checks = 1;
|
||||
show create table c;
|
||||
Table Create Table
|
||||
c CREATE TABLE `c` (
|
||||
`b` int(10) unsigned NOT NULL,
|
||||
`d1` datetime NOT NULL,
|
||||
`d2` datetime NOT NULL,
|
||||
PRIMARY KEY (`b`,`d1`),
|
||||
CONSTRAINT `b_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
show create table d;
|
||||
Table Create Table
|
||||
d CREATE TABLE `d` (
|
||||
`b` bigint(20) unsigned NOT NULL,
|
||||
`d1` date NOT NULL,
|
||||
PRIMARY KEY (`b`,`d1`),
|
||||
CONSTRAINT `bd_fk` FOREIGN KEY (`b`) REFERENCES `b` (`b`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
ERROR HY000: Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Error 1005 Can't create table `bug_fk`.`b` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||
Warning 1215 Cannot add foreign key constraint
|
||||
set foreign_key_checks=0;
|
||||
drop table c;
|
||||
drop table d;
|
||||
create table b(id int) engine=innodb;
|
||||
show warnings;
|
||||
Level Code Message
|
||||
b.frm
|
||||
b.ibd
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
|
@ -1,82 +1,48 @@
|
|||
set names utf8;
|
||||
CREATE TABLE corrupt_bit_test_ā(
|
||||
a INT AUTO_INCREMENT PRIMARY KEY,
|
||||
b CHAR(100),
|
||||
c INT,
|
||||
z INT,
|
||||
INDEX(b))
|
||||
ENGINE=InnoDB;
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(0,'x',1, 1);
|
||||
CREATE UNIQUE INDEX idxā ON corrupt_bit_test_ā(c, b);
|
||||
CREATE UNIQUE INDEX idxē ON corrupt_bit_test_ā(z, b);
|
||||
SELECT * FROM corrupt_bit_test_ā;
|
||||
a b c z
|
||||
1 x 1 1
|
||||
select @@unique_checks;
|
||||
@@unique_checks
|
||||
0
|
||||
select @@innodb_change_buffering_debug;
|
||||
@@innodb_change_buffering_debug
|
||||
1
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+10,z+10 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+20,z+20 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+50,z+50 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+100,z+100 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+200,z+200 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+400,z+400 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+800,z+800 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1600,z+1600 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+4000,z+4000 FROM corrupt_bit_test_ā;
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
count(*)
|
||||
1024
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(13000,'x',1,1);
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
check table corrupt_bit_test_ā;
|
||||
2
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: The B-tree of index "idxā" is corrupted.
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: The B-tree of index "idxē" is corrupted.
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxā" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
select c from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
show warnings;
|
||||
Level Code Message
|
||||
Warning 180 InnoDB: Index "idxē" for table "test"."corrupt_bit_test_ā" is marked as corrupted
|
||||
Error 1712 Index corrupt_bit_test_ā is corrupted
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
select * from corrupt_bit_test_ā use index(primary) where a = 10001;
|
||||
a b c z
|
||||
10001 a 20001 20001
|
||||
begin;
|
||||
insert into corrupt_bit_test_ā values (10002, "a", 20002, 20002);
|
||||
delete from corrupt_bit_test_ā where a = 10001;
|
||||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
rollback;
|
||||
drop index idxā on corrupt_bit_test_ā;
|
||||
check table corrupt_bit_test_ā;
|
||||
Table Op Msg_type Msg_text
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idx" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check Warning InnoDB: Index "idxē" is marked as corrupted
|
||||
test.corrupt_bit_test_ā check error Corrupt
|
||||
set names utf8;
|
||||
select z from corrupt_bit_test_ā;
|
||||
ERROR HY000: Index corrupt_bit_test_ā is corrupted
|
||||
drop index idxē on corrupt_bit_test_ā;
|
||||
select z from corrupt_bit_test_ā limit 10;
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`b` char(100) DEFAULT NULL,
|
||||
`c` int(11) DEFAULT NULL,
|
||||
`z` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`),
|
||||
UNIQUE KEY `idxē` (`z`,`b`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
ERROR HY000: Index "idx" is corrupted
|
||||
Table Create Table
|
||||
corrupt_bit_test_ā CREATE TABLE `corrupt_bit_test_ā` (
|
||||
`a` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`b` char(100) DEFAULT NULL,
|
||||
`c` int(11) DEFAULT NULL,
|
||||
`z` int(11) DEFAULT NULL,
|
||||
PRIMARY KEY (`a`),
|
||||
KEY `idx` (`b`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=latin1
|
||||
z
|
||||
20001
|
||||
1
|
||||
1
|
||||
2
|
||||
11
|
||||
12
|
||||
21
|
||||
22
|
||||
31
|
||||
32
|
||||
drop table corrupt_bit_test_ā;
|
||||
DROP DATABASE pad;
|
||||
SET GLOBAL innodb_change_buffering_debug = 0;
|
||||
|
|
115
mysql-test/suite/innodb/t/innodb-fkcheck.test
Normal file
115
mysql-test/suite/innodb/t/innodb-fkcheck.test
Normal file
|
@ -0,0 +1,115 @@
|
|||
--source include/have_innodb.inc
|
||||
|
||||
#
|
||||
# MDEV-10083: Orphan ibd file when playing with foreign keys
|
||||
#
|
||||
--disable_query_log
|
||||
SET @start_global_fpt = @@global.innodb_file_per_table;
|
||||
SET @start_global_fkc = @@global.foreign_key_checks;
|
||||
--enable_query_log
|
||||
|
||||
set global innodb_file_per_table = 1;
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
||||
--enable_warnings
|
||||
|
||||
let $MYSQLD_DATADIR = `select @@datadir`;
|
||||
|
||||
create database bug_fk;
|
||||
use bug_fk;
|
||||
|
||||
CREATE TABLE b (
|
||||
b int unsigned NOT NULL,
|
||||
d1 datetime NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
CREATE TABLE c (
|
||||
b int unsigned NOT NULL,
|
||||
d1 datetime NOT NULL,
|
||||
d2 datetime NOT NULL,
|
||||
PRIMARY KEY (b,d1),
|
||||
CONSTRAINT b_fk FOREIGN KEY (b) REFERENCES b (b)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
set foreign_key_checks = 0;
|
||||
|
||||
DROP TABLE IF EXISTS b;
|
||||
|
||||
show create table c;
|
||||
|
||||
#
|
||||
# Note that column b has different type in parent table
|
||||
#
|
||||
--error 1005
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
DROP TABLE IF EXISTS d;
|
||||
|
||||
CREATE TABLE d (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1),
|
||||
CONSTRAINT bd_fk FOREIGN KEY (b) REFERENCES b (b)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
set foreign_key_checks = 1;
|
||||
|
||||
show create table c;
|
||||
show create table d;
|
||||
|
||||
#
|
||||
# Table c column b used on foreign key has different type
|
||||
# compared referenced column b in table b, but this
|
||||
# create still produced b.ibd file. This is because
|
||||
# we row_drop_table_for_mysql was called and referenced
|
||||
# table is not allowed to be dropped even in case
|
||||
# when actual create is not successfull.
|
||||
#
|
||||
--error 1005
|
||||
CREATE TABLE b (
|
||||
b bigint unsigned NOT NULL,
|
||||
d1 date NOT NULL,
|
||||
PRIMARY KEY (b,d1)
|
||||
) ENGINE=InnoDB;
|
||||
|
||||
show warnings;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
set foreign_key_checks=0;
|
||||
|
||||
drop table c;
|
||||
drop table d;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
create table b(id int) engine=innodb;
|
||||
show warnings;
|
||||
|
||||
--list_files $MYSQLD_DATADIR/bug_fk b*
|
||||
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
--disable_query_log
|
||||
SET @@global.innodb_file_per_table = @start_global_fpt;
|
||||
SET @@global.foreign_key_checks = @start_global_fkc;
|
||||
--enable_query_log
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists b;
|
||||
drop database if exists bug_fk;
|
||||
--enable_warnings
|
|
@ -2,46 +2,24 @@
|
|||
# Test for persistent corrupt bit for corrupted index and table
|
||||
#
|
||||
-- source include/have_innodb.inc
|
||||
-- source include/have_innodb_16k.inc
|
||||
|
||||
# Issues with innodb_change_buffering_debug on Windows, so the test scenario
|
||||
# cannot be created on windows
|
||||
--source include/not_windows.inc
|
||||
|
||||
#-- source include/have_innodb_16k.inc
|
||||
-- source include/not_embedded.inc
|
||||
# This test needs debug server
|
||||
--source include/have_debug.inc
|
||||
-- source include/have_debug.inc
|
||||
|
||||
-- disable_query_log
|
||||
call mtr.add_suppression("Flagged corruption of idx.*in CHECK TABLE");
|
||||
# This test setup is extracted from bug56680.test:
|
||||
# The flag innodb_change_buffering_debug is only available in debug builds.
|
||||
# It instructs InnoDB to try to evict pages from the buffer pool when
|
||||
# change buffering is possible, so that the change buffer will be used
|
||||
# whenever possible.
|
||||
SET @innodb_change_buffering_debug_orig = @@innodb_change_buffering_debug;
|
||||
SET GLOBAL innodb_change_buffering_debug = 1;
|
||||
|
||||
# Turn off Unique Check to create corrupted index with dup key
|
||||
SET UNIQUE_CHECKS=0;
|
||||
|
||||
CREATE DATABASE pad;
|
||||
let $i=338;
|
||||
while ($i)
|
||||
{
|
||||
--eval CREATE TABLE pad.t$i(a INT PRIMARY KEY)ENGINE=InnoDB;
|
||||
dec $i;
|
||||
}
|
||||
|
||||
-- enable_query_log
|
||||
call mtr.add_suppression("Flagged corruption of idx.*in");
|
||||
|
||||
set names utf8;
|
||||
|
||||
SET UNIQUE_CHECKS=0;
|
||||
|
||||
CREATE TABLE corrupt_bit_test_ā(
|
||||
a INT AUTO_INCREMENT PRIMARY KEY,
|
||||
b CHAR(100),
|
||||
c INT,
|
||||
z INT,
|
||||
INDEX(b))
|
||||
INDEX idx(b))
|
||||
ENGINE=InnoDB;
|
||||
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(0,'x',1, 1);
|
||||
|
@ -54,37 +32,20 @@ CREATE UNIQUE INDEX idxē ON corrupt_bit_test_ā(z, b);
|
|||
|
||||
SELECT * FROM corrupt_bit_test_ā;
|
||||
|
||||
select @@unique_checks;
|
||||
select @@innodb_change_buffering_debug;
|
||||
|
||||
# Create enough rows for the table, so that the insert buffer will be
|
||||
# used for modifying the secondary index page. There must be multiple
|
||||
# index pages, because changes to the root page are never buffered.
|
||||
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1,z+1 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+10,z+10 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+20,z+20 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+50,z+50 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+100,z+100 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+200,z+200 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+400,z+400 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+800,z+800 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+1600,z+1600 FROM corrupt_bit_test_ā;
|
||||
INSERT INTO corrupt_bit_test_ā SELECT 0,b,c+4000,z+4000 FROM corrupt_bit_test_ā;
|
||||
|
||||
select count(*) from corrupt_bit_test_ā;
|
||||
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
|
||||
# Create a dup key error on index "idxē" and "idxā" by inserting a dup value
|
||||
INSERT INTO corrupt_bit_test_ā VALUES(13000,'x',1,1);
|
||||
|
||||
# creating an index should succeed even if other secondary indexes are corrupted
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
|
||||
# Check table will find the unique indexes corrupted
|
||||
# with dup key
|
||||
# This will flag all secondary indexes corrupted
|
||||
SET SESSION debug_dbug="+d,dict_set_index_corrupted";
|
||||
check table corrupt_bit_test_ā;
|
||||
SET SESSION debug_dbug="";
|
||||
|
||||
# Cannot create new indexes while corrupted indexes exist
|
||||
--error ER_INDEX_CORRUPT
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
--error ER_INDEX_CORRUPT
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
|
||||
# This selection intend to use the corrupted index. Expect to fail
|
||||
-- error ER_INDEX_CORRUPT
|
||||
|
@ -109,7 +70,6 @@ delete from corrupt_bit_test_ā where a = 10001;
|
|||
insert into corrupt_bit_test_ā values (10001, "a", 20001, 20001);
|
||||
rollback;
|
||||
|
||||
# Drop one corrupted index before reboot
|
||||
drop index idxā on corrupt_bit_test_ā;
|
||||
|
||||
check table corrupt_bit_test_ā;
|
||||
|
@ -119,14 +79,26 @@ set names utf8;
|
|||
-- error ER_INDEX_CORRUPT
|
||||
select z from corrupt_bit_test_ā;
|
||||
|
||||
show create table corrupt_bit_test_ā;
|
||||
|
||||
# Drop the corrupted index
|
||||
drop index idxē on corrupt_bit_test_ā;
|
||||
|
||||
# Cannot create new indexes while a corrupt index exists.
|
||||
--error ER_INDEX_CORRUPT
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
--error ER_INDEX_CORRUPT
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
|
||||
show create table corrupt_bit_test_ā;
|
||||
drop index idx on corrupt_bit_test_ā;
|
||||
|
||||
# Now that there exist no corrupted indexes, we can create new indexes.
|
||||
CREATE INDEX idx3 ON corrupt_bit_test_ā(b, c);
|
||||
CREATE INDEX idx4 ON corrupt_bit_test_ā(b, z);
|
||||
|
||||
# Now select back to normal
|
||||
select z from corrupt_bit_test_ā limit 10;
|
||||
|
||||
# Drop table
|
||||
drop table corrupt_bit_test_ā;
|
||||
DROP DATABASE pad;
|
||||
|
||||
SET GLOBAL innodb_change_buffering_debug = 0;
|
||||
|
|
|
@ -67,3 +67,4 @@ Performance_schema_table_instances_lost 0
|
|||
Performance_schema_thread_classes_lost 0
|
||||
Performance_schema_thread_instances_lost 0
|
||||
Performance_schema_users_lost 0
|
||||
CALL mtr.add_suppression("innodb_open_files should not be greater than the open_files_limit.");
|
||||
|
|
|
@ -8,5 +8,5 @@ SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
|
|||
####################################
|
||||
SELECT event_name, digest, digest_text, sql_text FROM events_statements_history_long;
|
||||
event_name digest digest_text sql_text
|
||||
statement/sql/truncate 9d8bb20bae9d3c7cdfd36bc9d78b1d63 TRUNCATE TABLE truncate table events_statements_history_long
|
||||
statement/sql/select d4c5d748dcc95f29805e3c04d47d7f64 SELECT ? + ? + SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
|
||||
statement/sql/truncate e1c917a43f978456fab15240f89372ca TRUNCATE TABLE truncate table events_statements_history_long
|
||||
statement/sql/select 3f7ca34376814d0e985337bd588b5ffd SELECT ? + ? + SELECT 1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1+1
|
||||
|
|
156
mysql-test/suite/perfschema/r/table_name.result
Normal file
156
mysql-test/suite/perfschema/r/table_name.result
Normal file
|
@ -0,0 +1,156 @@
|
|||
|
||||
#
|
||||
# TEST 1: Normal tables prefixed with "#sql" and "sql".
|
||||
#
|
||||
USE test;
|
||||
CREATE TABLE `#sql_1` (a int, b text);
|
||||
INSERT INTO `#sql_1` VALUES(1,'one');
|
||||
|
||||
CREATE TABLE `sql_1` (a int, b text);
|
||||
INSERT INTO `sql_1` VALUES(1,'one');
|
||||
|
||||
# Verify that the tables are treated as normal tables .
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
TABLE test #sql_1
|
||||
TABLE test sql_1
|
||||
|
||||
# Drop the tables, verify that the table objects are removed.
|
||||
|
||||
DROP TABLE `#sql_1`;
|
||||
DROP TABLE `sql_1`;
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
#
|
||||
# TEST 2: Temporary tables, no special prefix.
|
||||
#
|
||||
CREATE TEMPORARY TABLE sql_temp2_myisam (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO sql_temp2_myisam VALUES(1,'one');
|
||||
|
||||
CREATE TEMPORARY TABLE sql_temp2_innodb (a int, b text) ENGINE=INNODB;
|
||||
INSERT INTO sql_temp2_innodb VALUES(1,'one');
|
||||
|
||||
# Confirm that the temporary tables are ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
# Drop the tables, verify that the table objects are not created.
|
||||
|
||||
DROP TABLE sql_temp2_myisam;
|
||||
DROP TABLE sql_temp2_innodb;
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
#
|
||||
# TEST 3: Temporary tables with the "#sql" prefix.
|
||||
#
|
||||
CREATE TEMPORARY TABLE `#sql_temp3_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
CHECK TABLE `#sql_temp3_myisam`;
|
||||
Table Op Msg_type Msg_text
|
||||
test.#sql_temp3_myisam check status OK
|
||||
INSERT INTO `#sql_temp3_myisam` VALUES(1,'one');
|
||||
|
||||
CREATE TEMPORARY TABLE `#sql_temp3_innodb` (a int, b text) ENGINE=INNODB;
|
||||
CHECK TABLE `#sql_temp3_innodb`;
|
||||
Table Op Msg_type Msg_text
|
||||
test.#sql_temp3_innodb check status OK
|
||||
INSERT INTO `#sql_temp3_innodb` VALUES(1,'one');
|
||||
|
||||
# Confirm that the temporary tables are ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
# Drop the temporary tables.
|
||||
|
||||
DROP TABLE `#sql_temp3_myisam`;
|
||||
DROP TABLE `#sql_temp3_innodb`;
|
||||
|
||||
# Confirm that the temporary tables are still ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
#
|
||||
# TEST 4: Special case: MyISAM temporary tables are recreated as non-temporary
|
||||
# when they are truncated.
|
||||
#
|
||||
CREATE TEMPORARY TABLE `sql_temp4_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO `sql_temp4_myisam` VALUES(1,'one');
|
||||
|
||||
CREATE TEMPORARY TABLE `#sql_temp4_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO `#sql_temp4_myisam` VALUES(1,'one');
|
||||
|
||||
# Confirm that the MyISAM temporary tables are ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
# Truncate the MyISAM temporary tables, forcing them to be recreated as non-temporary.
|
||||
|
||||
TRUNCATE TABLE `sql_temp4_myisam`;
|
||||
TRUNCATE TABLE `#sql_temp4_myisam`;
|
||||
|
||||
# Confirm that the recreated MyISAM tables are still regarded as temporary and ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
# Drop the recreated MyISAM tables;
|
||||
|
||||
DROP TABLE `sql_temp4_myisam`;
|
||||
DROP TABLE `#sql_temp4_myisam`;
|
||||
|
||||
# Confirm that the recreated temporary tables are still ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
#
|
||||
# TEST 5: Generate temporary tables with ALTER MyISAM table.
|
||||
#
|
||||
USE test;
|
||||
CREATE TABLE t1 (a int) ENGINE=MYISAM;
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
ALTER TABLE t1 ADD COLUMN (b int);
|
||||
|
||||
# Confirm that the recreated temporary tables are still ignored.
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
||||
|
||||
# Drop the MyISAM table
|
||||
|
||||
DROP TABLE t1;
|
||||
|
||||
# Confirm that no tables remain;
|
||||
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
object_type object_schema object_name
|
|
@ -7,3 +7,4 @@
|
|||
|
||||
--source ../include/sizing_auto.inc
|
||||
|
||||
CALL mtr.add_suppression("innodb_open_files should not be greater than the open_files_limit.");
|
||||
|
|
165
mysql-test/suite/perfschema/t/table_name.test
Normal file
165
mysql-test/suite/perfschema/t/table_name.test
Normal file
|
@ -0,0 +1,165 @@
|
|||
#
|
||||
# Performance Schema
|
||||
#
|
||||
# Verify that the Performance Schema correctly identifies normal and temporary
|
||||
# tables with non-standard names.
|
||||
|
||||
# The server uses the table name prefix "#sql" for temporary and intermediate
|
||||
# tables, however user-defined tables having the "#sql" prefix are also permitted.
|
||||
# Independent of the table name, temporary or intermediate tables always have the
|
||||
# "#sql" prefix in the filename. (For non-temporary tables starting with "#",
|
||||
# the "#" is encoded to @0023 in the filename.)
|
||||
#
|
||||
# Given the ambiguity with temporary table names, the Performance Schema identifies
|
||||
# temporary tables tables either by the table category or by the filename.
|
||||
#
|
||||
--source include/have_perfschema.inc
|
||||
--source include/have_innodb.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # TEST 1: Normal tables prefixed with "#sql" and "sql".
|
||||
--echo #
|
||||
USE test;
|
||||
CREATE TABLE `#sql_1` (a int, b text);
|
||||
# INSERT forces path through get_table_share()
|
||||
INSERT INTO `#sql_1` VALUES(1,'one');
|
||||
--echo
|
||||
CREATE TABLE `sql_1` (a int, b text);
|
||||
INSERT INTO `sql_1` VALUES(1,'one');
|
||||
--echo
|
||||
--echo # Verify that the tables are treated as normal tables .
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Drop the tables, verify that the table objects are removed.
|
||||
--echo
|
||||
DROP TABLE `#sql_1`;
|
||||
DROP TABLE `sql_1`;
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # TEST 2: Temporary tables, no special prefix.
|
||||
--echo #
|
||||
CREATE TEMPORARY TABLE sql_temp2_myisam (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO sql_temp2_myisam VALUES(1,'one');
|
||||
--echo
|
||||
CREATE TEMPORARY TABLE sql_temp2_innodb (a int, b text) ENGINE=INNODB;
|
||||
INSERT INTO sql_temp2_innodb VALUES(1,'one');
|
||||
--echo
|
||||
--echo # Confirm that the temporary tables are ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Drop the tables, verify that the table objects are not created.
|
||||
--echo
|
||||
DROP TABLE sql_temp2_myisam;
|
||||
DROP TABLE sql_temp2_innodb;
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # TEST 3: Temporary tables with the "#sql" prefix.
|
||||
--echo #
|
||||
CREATE TEMPORARY TABLE `#sql_temp3_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
CHECK TABLE `#sql_temp3_myisam`;
|
||||
INSERT INTO `#sql_temp3_myisam` VALUES(1,'one');
|
||||
--echo
|
||||
CREATE TEMPORARY TABLE `#sql_temp3_innodb` (a int, b text) ENGINE=INNODB;
|
||||
CHECK TABLE `#sql_temp3_innodb`;
|
||||
INSERT INTO `#sql_temp3_innodb` VALUES(1,'one');
|
||||
--echo
|
||||
--echo # Confirm that the temporary tables are ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Drop the temporary tables.
|
||||
--echo
|
||||
DROP TABLE `#sql_temp3_myisam`;
|
||||
DROP TABLE `#sql_temp3_innodb`;
|
||||
--echo
|
||||
--echo # Confirm that the temporary tables are still ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # TEST 4: Special case: MyISAM temporary tables are recreated as non-temporary
|
||||
--echo # when they are truncated.
|
||||
--echo #
|
||||
CREATE TEMPORARY TABLE `sql_temp4_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO `sql_temp4_myisam` VALUES(1,'one');
|
||||
--echo
|
||||
CREATE TEMPORARY TABLE `#sql_temp4_myisam` (a int, b text) ENGINE=MYISAM;
|
||||
INSERT INTO `#sql_temp4_myisam` VALUES(1,'one');
|
||||
--echo
|
||||
--echo # Confirm that the MyISAM temporary tables are ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Truncate the MyISAM temporary tables, forcing them to be recreated as non-temporary.
|
||||
--echo
|
||||
TRUNCATE TABLE `sql_temp4_myisam`;
|
||||
TRUNCATE TABLE `#sql_temp4_myisam`;
|
||||
--echo
|
||||
--echo # Confirm that the recreated MyISAM tables are still regarded as temporary and ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Drop the recreated MyISAM tables;
|
||||
--echo
|
||||
DROP TABLE `sql_temp4_myisam`;
|
||||
DROP TABLE `#sql_temp4_myisam`;
|
||||
--echo
|
||||
--echo # Confirm that the recreated temporary tables are still ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # TEST 5: Generate temporary tables with ALTER MyISAM table.
|
||||
--echo #
|
||||
USE test;
|
||||
CREATE TABLE t1 (a int) ENGINE=MYISAM;
|
||||
INSERT INTO t1 VALUES (1), (2), (3);
|
||||
# Force a path throug mysql_alter_table() and ha_create_table().
|
||||
ALTER TABLE t1 ADD COLUMN (b int);
|
||||
--echo
|
||||
--echo # Confirm that the recreated temporary tables are still ignored.
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
||||
--echo
|
||||
--echo # Drop the MyISAM table
|
||||
--echo
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo
|
||||
--echo # Confirm that no tables remain;
|
||||
--echo
|
||||
SELECT object_type, object_schema, object_name
|
||||
FROM performance_schema.objects_summary_global_by_type
|
||||
WHERE object_schema="test";
|
|
@ -165,7 +165,7 @@ CREATE USER u1 IDENTIFIED BY 'pwd-123';
|
|||
GRANT ALL ON sa_db TO u2 IDENTIFIED BY "pwd-321";
|
||||
SET PASSWORD FOR u1 = PASSWORD('pwd 098');
|
||||
SET PASSWORD FOR u1=<secret>;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=<secret>' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '<secret>' at line 1
|
||||
CREATE USER u3 IDENTIFIED BY '';
|
||||
drop user u1, u2, u3;
|
||||
select 2;
|
||||
|
|
|
@ -165,7 +165,7 @@ CREATE USER u1 IDENTIFIED BY 'pwd-123';
|
|||
GRANT ALL ON sa_db TO u2 IDENTIFIED BY "pwd-321";
|
||||
SET PASSWORD FOR u1 = PASSWORD('pwd 098');
|
||||
SET PASSWORD FOR u1=<secret>;
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '=<secret>' at line 1
|
||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '<secret>' at line 1
|
||||
CREATE USER u3 IDENTIFIED BY '';
|
||||
drop user u1, u2, u3;
|
||||
select 2;
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
include/master-slave.inc
|
||||
[connection master]
|
||||
create role r1;
|
||||
set role r1;
|
||||
grant select on db.* to current_role;
|
||||
revoke all privileges, grant option from current_role;
|
||||
drop role r1;
|
||||
include/rpl_end.inc
|
||||
connection server_2;
|
||||
connection server_2;
|
||||
connection server_2;
|
||||
connection server_2;
|
||||
connection server_1;
|
||||
connection server_1;
|
||||
connection server_1;
|
||||
connection server_2;
|
||||
connection server_1;
|
||||
connection server_2;
|
||||
connection server_2;
|
||||
connection server_1;
|
||||
connection server_1;
|
|
@ -0,0 +1,12 @@
|
|||
--source include/master-slave.inc
|
||||
--source include/have_binlog_format_mixed.inc
|
||||
|
||||
--enable_connect_log
|
||||
|
||||
create role r1;
|
||||
set role r1;
|
||||
grant select on db.* to current_role;
|
||||
revoke all privileges, grant option from current_role;
|
||||
drop role r1;
|
||||
|
||||
--source include/rpl_end.inc
|
99
mysql-test/suite/roles/set_role-9614.result
Normal file
99
mysql-test/suite/roles/set_role-9614.result
Normal file
|
@ -0,0 +1,99 @@
|
|||
#
|
||||
# MDEV-9614 Roles and Users Longer than 6 characters
|
||||
#
|
||||
# This test case checks the edge case presented in the MDEV. The
|
||||
# real issue is actually apparent when the username is longer than the
|
||||
# rolename.
|
||||
#
|
||||
# We need a separate database not including test or test_% names. Due to
|
||||
# default privileges given on these databases.
|
||||
#
|
||||
DROP DATABASE IF EXISTS `bug_db`;
|
||||
Warnings:
|
||||
Note 1008 Can't drop database 'bug_db'; database doesn't exist
|
||||
#
|
||||
# The first user did not show the bug as john's length is smaller
|
||||
# than client. The bug is apparent most of the time for usertestjohn.
|
||||
#
|
||||
CREATE USER `john`@`%`;
|
||||
CREATE USER `usertestjohn`@`%`;
|
||||
CREATE ROLE `client`;
|
||||
#
|
||||
# Setup the required tables.
|
||||
#
|
||||
CREATE DATABASE `bug_db`;
|
||||
CREATE TABLE `bug_db`.`t0`(`c0` INT);
|
||||
#
|
||||
# Setup select privileges only on the role. Setting the role should give
|
||||
# select access to bug_db.t0.
|
||||
#
|
||||
GRANT SELECT ON `bug_db`.`t0` TO `client`;
|
||||
GRANT `client` TO `john`@`%`;
|
||||
GRANT `client` TO `usertestjohn`@`%`;
|
||||
#
|
||||
# Check to see grants are set.
|
||||
#
|
||||
SHOW GRANTS FOR `john`@`%`;
|
||||
Grants for john@%
|
||||
GRANT client TO 'john'@'%'
|
||||
GRANT USAGE ON *.* TO 'john'@'%'
|
||||
SHOW GRANTS FOR `usertestjohn`@`%`;
|
||||
Grants for usertestjohn@%
|
||||
GRANT client TO 'usertestjohn'@'%'
|
||||
GRANT USAGE ON *.* TO 'usertestjohn'@'%'
|
||||
SHOW GRANTS FOR `client`;
|
||||
Grants for client
|
||||
GRANT USAGE ON *.* TO 'client'
|
||||
GRANT SELECT ON `bug_db`.`t0` TO 'client'
|
||||
show databases;
|
||||
Database
|
||||
bug_db
|
||||
information_schema
|
||||
mtr
|
||||
mysql
|
||||
performance_schema
|
||||
test
|
||||
#
|
||||
# Try using the database as john.
|
||||
#
|
||||
connect john, localhost, john,,information_schema;
|
||||
show databases;
|
||||
Database
|
||||
information_schema
|
||||
test
|
||||
set role client;
|
||||
show databases;
|
||||
Database
|
||||
bug_db
|
||||
information_schema
|
||||
test
|
||||
use bug_db;
|
||||
#
|
||||
# Try using the database as usertestjohn.
|
||||
#
|
||||
connect usertestjohn, localhost, usertestjohn,,information_schema;
|
||||
show databases;
|
||||
Database
|
||||
information_schema
|
||||
test
|
||||
set role client;
|
||||
show databases;
|
||||
Database
|
||||
bug_db
|
||||
information_schema
|
||||
test
|
||||
show grants;
|
||||
Grants for usertestjohn@%
|
||||
GRANT client TO 'usertestjohn'@'%'
|
||||
GRANT USAGE ON *.* TO 'usertestjohn'@'%'
|
||||
GRANT USAGE ON *.* TO 'client'
|
||||
GRANT SELECT ON `bug_db`.`t0` TO 'client'
|
||||
use bug_db;
|
||||
#
|
||||
# Cleanup
|
||||
#
|
||||
connection default;
|
||||
drop user john;
|
||||
drop user usertestjohn;
|
||||
drop role client;
|
||||
drop database bug_db;
|
79
mysql-test/suite/roles/set_role-9614.test
Normal file
79
mysql-test/suite/roles/set_role-9614.test
Normal file
|
@ -0,0 +1,79 @@
|
|||
--source include/not_embedded.inc
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9614 Roles and Users Longer than 6 characters
|
||||
--echo #
|
||||
--echo # This test case checks the edge case presented in the MDEV. The
|
||||
--echo # real issue is actually apparent when the username is longer than the
|
||||
--echo # rolename.
|
||||
|
||||
--enable_connect_log
|
||||
--echo #
|
||||
--echo # We need a separate database not including test or test_% names. Due to
|
||||
--echo # default privileges given on these databases.
|
||||
--echo #
|
||||
DROP DATABASE IF EXISTS `bug_db`;
|
||||
|
||||
--echo #
|
||||
--echo # The first user did not show the bug as john's length is smaller
|
||||
--echo # than client. The bug is apparent most of the time for usertestjohn.
|
||||
--echo #
|
||||
CREATE USER `john`@`%`;
|
||||
CREATE USER `usertestjohn`@`%`;
|
||||
CREATE ROLE `client`;
|
||||
|
||||
--echo #
|
||||
--echo # Setup the required tables.
|
||||
--echo #
|
||||
CREATE DATABASE `bug_db`;
|
||||
CREATE TABLE `bug_db`.`t0`(`c0` INT);
|
||||
|
||||
--echo #
|
||||
--echo # Setup select privileges only on the role. Setting the role should give
|
||||
--echo # select access to bug_db.t0.
|
||||
--echo #
|
||||
GRANT SELECT ON `bug_db`.`t0` TO `client`;
|
||||
GRANT `client` TO `john`@`%`;
|
||||
GRANT `client` TO `usertestjohn`@`%`;
|
||||
|
||||
--echo #
|
||||
--echo # Check to see grants are set.
|
||||
--echo #
|
||||
SHOW GRANTS FOR `john`@`%`;
|
||||
SHOW GRANTS FOR `usertestjohn`@`%`;
|
||||
SHOW GRANTS FOR `client`;
|
||||
|
||||
show databases;
|
||||
|
||||
--echo #
|
||||
--echo # Try using the database as john.
|
||||
--echo #
|
||||
connect (john, localhost, john,,information_schema);
|
||||
|
||||
show databases;
|
||||
set role client;
|
||||
show databases;
|
||||
use bug_db;
|
||||
|
||||
--echo #
|
||||
--echo # Try using the database as usertestjohn.
|
||||
--echo #
|
||||
connect (usertestjohn, localhost, usertestjohn,,information_schema);
|
||||
|
||||
show databases;
|
||||
set role client;
|
||||
show databases;
|
||||
|
||||
show grants;
|
||||
use bug_db;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Cleanup
|
||||
--echo #
|
||||
connection default;
|
||||
drop user john;
|
||||
drop user usertestjohn;
|
||||
drop role client;
|
||||
drop database bug_db;
|
||||
--disable_connect_log
|
|
@ -144,4 +144,5 @@ HEX(word)
|
|||
SELECT * FROM tmptbl504451f4258$1;
|
||||
ERROR 42S02: Table 'test.tmptbl504451f4258$1' doesn't exist
|
||||
DROP TABLE t5;
|
||||
flush privileges;
|
||||
include/rpl_end.inc
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
source include/master-slave.inc;
|
||||
let collation=utf8_unicode_ci;
|
||||
--source include/have_collation.inc
|
||||
source include/have_collation.inc;
|
||||
source include/master-slave.inc;
|
||||
|
||||
call mtr.add_suppression("Can't find record in 't.'");
|
||||
call mtr.add_suppression("Can't find record in 'user'");
|
||||
|
@ -181,6 +181,7 @@ SELECT HEX(word) FROM t5;
|
|||
SELECT * FROM tmptbl504451f4258$1;
|
||||
connection master;
|
||||
DROP TABLE t5;
|
||||
flush privileges;
|
||||
sync_slave_with_master;
|
||||
|
||||
--source include/rpl_end.inc
|
||||
|
|
|
@ -661,8 +661,8 @@
|
|||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME INNODB_VERSION
|
||||
SESSION_VALUE NULL
|
||||
-GLOBAL_VALUE 5.6.30
|
||||
+GLOBAL_VALUE 5.6.29-76.2
|
||||
-GLOBAL_VALUE 5.6.31
|
||||
+GLOBAL_VALUE 5.6.30-76.3
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE NULL
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
|
|
|
@ -2359,7 +2359,7 @@ READ_ONLY NO
|
|||
COMMAND_LINE_ARGUMENT OPTIONAL
|
||||
VARIABLE_NAME INNODB_VERSION
|
||||
SESSION_VALUE NULL
|
||||
GLOBAL_VALUE 5.6.30
|
||||
GLOBAL_VALUE 5.6.31
|
||||
GLOBAL_VALUE_ORIGIN COMPILE-TIME
|
||||
DEFAULT_VALUE NULL
|
||||
VARIABLE_SCOPE GLOBAL
|
||||
|
|
|
@ -90,3 +90,13 @@ drop table t1;
|
|||
--replace_result .dll .so
|
||||
select * from mysql.plugin;
|
||||
truncate table mysql.plugin;
|
||||
|
||||
|
||||
#
|
||||
# MDEV-9969 mysql_install_db error processing ignore_db_dirs.
|
||||
#
|
||||
--write_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
||||
use test;
|
||||
EOF
|
||||
--exec $MYSQLD_BOOTSTRAP_CMD --ignore-db-dirs='some_dir' --ignore-db-dirs='some_dir' < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1
|
||||
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql
|
||||
|
|
|
@ -214,15 +214,18 @@ create table test.t1 (i int);
|
|||
create table mysqltest2.t2 like test.t1;
|
||||
lock table test.t1 write, mysqltest2.t2 write;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
--error ER_TABLE_MUST_HAVE_COLUMNS
|
||||
create or replace table test.t1;
|
||||
show tables;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
--error ER_TABLE_MUST_HAVE_COLUMNS
|
||||
create or replace table mysqltest2.t2;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
create table t1 (i int);
|
||||
drop table t1;
|
||||
|
@ -231,15 +234,18 @@ create table test.t1 (i int);
|
|||
create table mysqltest2.t2 like test.t1;
|
||||
lock table test.t1 write, mysqltest2.t2 write;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
--error ER_DUP_FIELDNAME
|
||||
create or replace table test.t1 (a int) select 1 as 'a', 2 as 'a';
|
||||
show tables;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
--error ER_DUP_FIELDNAME
|
||||
create or replace table mysqltest2.t2 (a int) select 1 as 'a', 2 as 'a';
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
create table t1 (i int);
|
||||
drop table t1;
|
||||
|
@ -317,15 +323,19 @@ drop view t1;
|
|||
create table t1 (a int);
|
||||
lock table t1 write, t2 read;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
create or replace table t1 (i int);
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
create or replace table t1 like t2;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
create or replace table t1 select 1 as f1;
|
||||
--replace_column 1 #
|
||||
--sorted_result
|
||||
select * from information_schema.metadata_lock_info;
|
||||
drop table t1;
|
||||
unlock tables;
|
||||
|
|
|
@ -220,7 +220,6 @@ SET character_set_connection = utf8;
|
|||
CREATE TABLE t1 ( a VARCHAR(1) );
|
||||
INSERT INTO t1 VALUES ('m'),('n');
|
||||
CREATE VIEW v1 AS SELECT 'w' ;
|
||||
--error ER_CANT_AGGREGATE_2COLLATIONS
|
||||
SELECT * FROM t1 WHERE a < ALL ( SELECT * FROM v1 );
|
||||
drop view v1;
|
||||
drop table t1;
|
||||
|
@ -228,3 +227,30 @@ SET character_set_connection = default;
|
|||
SET optimizer_switch= default;
|
||||
|
||||
--echo #End of 5.3 tests
|
||||
|
||||
--echo #
|
||||
--echo # Start of 5.5 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10181 Illegal mix of collation for a field and an ASCII string as a view field
|
||||
--echo #
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1);
|
||||
INSERT INTO t1 VALUES ('A'),('a'),('B'),('b');
|
||||
CREATE VIEW v1 AS SELECT 'a';
|
||||
SELECT * FROM v1,t1 where t1.a=v1.a;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (a VARCHAR(10) CHARACTER SET latin1);
|
||||
INSERT INTO t1 VALUES ('a'),('b'),('c');
|
||||
CREATE VIEW v1 AS SELECT 'a' AS a UNION SELECT 'b';
|
||||
SELECT * FROM v1,t1 WHERE t1.a=v1.a;
|
||||
DROP VIEW v1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
|
|
@ -1678,6 +1678,29 @@ ALTER TABLE t1 MODIFY a TINYTEXT CHARACTER SET utf8;
|
|||
SELECT OCTET_LENGTH(a),a FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8402 Bug#77473 Bug#21317406 TRUNCATED DATA WITH SUBQUERY & UTF8
|
||||
--echo #
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8;
|
||||
SELECT length(rpad(_utf8 0xD0B1, 65536, _utf8 0xD0B2)) AS data;
|
||||
SELECT length(data) AS len FROM (
|
||||
SELECT rpad(_utf8 0xD0B1, 65536, _utf8 0xD0B2) AS data
|
||||
) AS sub;
|
||||
|
||||
SELECT length(rpad(_utf8 0xD0B1, 65535, _utf8 0xD0B2)) AS data;
|
||||
SELECT length(data) AS len FROM (
|
||||
SELECT rpad(_utf8 0xD0B1, 65535, _utf8 0xD0B2) AS data
|
||||
) AS sub;
|
||||
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36766) AS data) AS sub;
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36767) AS data) AS sub;
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 36778) AS data) AS sub;
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65535) AS data) AS sub;
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65536) AS data) AS sub;
|
||||
SELECT length(data) AS len FROM (SELECT REPEAT('ä', 65537) AS data) AS sub;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
|
|
@ -1821,6 +1821,26 @@ SELECT OCTET_LENGTH(a),a FROM t1;
|
|||
DROP TABLE t1;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8402 Bug#77473 Bug#21317406 TRUNCATED DATA WITH SUBQUERY & UTF8
|
||||
--echo #
|
||||
--echo #
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
SELECT length(repeat(_utf8mb4 0xE29883, 21844)) AS data;
|
||||
SELECT length(data) AS len
|
||||
FROM ( SELECT repeat(_utf8mb4 0xE29883, 21844) AS data ) AS sub;
|
||||
|
||||
SELECT length(repeat(_utf8mb4 0xE29883, 21846)) AS data;
|
||||
SELECT length(data) AS len
|
||||
FROM ( SELECT repeat(_utf8mb4 0xE29883, 21846) AS data ) AS sub;
|
||||
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21844) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21845) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 21846) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65535) AS data ) AS sub;
|
||||
SELECT LENGTH(data) AS len FROM (SELECT REPEAT('☃', 65536) AS data ) AS sub;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
|
|
@ -461,6 +461,25 @@ DROP EVENT ev1;
|
|||
SHOW EVENTS;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9524 Cannot load from mysql.event when sql_mode is set to PAD_CHAR_TO_FULL_LENGTH
|
||||
--echo #
|
||||
CREATE TABLE t1 (a INT);
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 SECOND DO DELETE FROM t1;
|
||||
--replace_column 8 # 9 #
|
||||
SHOW EVENTS;
|
||||
SET sql_mode=PAD_CHAR_TO_FULL_LENGTH;
|
||||
--replace_column 8 # 9 #
|
||||
SHOW EVENTS;
|
||||
DROP EVENT ev1;
|
||||
CREATE EVENT ev1 ON SCHEDULE EVERY 5 SECOND DO DELETE FROM t1;
|
||||
--replace_column 8 # 9 #
|
||||
SHOW EVENTS;
|
||||
DROP EVENT ev1;
|
||||
DROP TABLE t1;
|
||||
SET sql_mode=DEFAULT;
|
||||
|
||||
|
||||
--echo
|
||||
--echo #
|
||||
--echo # End of tests
|
||||
|
|
|
@ -607,6 +607,28 @@ DROP TABLE t1;
|
|||
|
||||
--echo # End of 5.3 tests
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Start of 10.0 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10020 InnoDB NOT IN Query Crash When One Item Is NULL
|
||||
--echo #
|
||||
CREATE TABLE t1
|
||||
(
|
||||
a INT(11),
|
||||
b VARCHAR(10),
|
||||
KEY (b)
|
||||
);
|
||||
INSERT INTO t1 VALUES (1,'x'),(2,'y'),(3,'z');
|
||||
SELECT * FROM t1 WHERE b NOT IN (NULL, '', 'A');
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Start of 10.1 tests
|
||||
--echo #
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-8755 Equal field propagation is not performed any longer for the IN list when multiple comparison types
|
||||
--echo #
|
||||
|
|
|
@ -61,6 +61,12 @@ help '%function_7';
|
|||
help '%category_2';
|
||||
help 'impossible_function_1';
|
||||
help 'impossible_category_1';
|
||||
|
||||
--echo # MDEV-9524 Cannot load from mysql.event when sql_mode is set to PAD_CHAR_TO_FULL_LENGTH
|
||||
help 'impossible_function_1';
|
||||
SET sql_mode=PAD_CHAR_TO_FULL_LENGTH;
|
||||
help 'impossible_function_1';
|
||||
SET sql_mode=DEFAULT;
|
||||
##############
|
||||
|
||||
set sql_mode="";
|
||||
|
|
44
mysql-test/t/information_schema_stats.test
Normal file
44
mysql-test/t/information_schema_stats.test
Normal file
|
@ -0,0 +1,44 @@
|
|||
#
|
||||
# MDEV-8633: information_schema.index_statistics doesn't delete item when drop table indexes or drop table;
|
||||
#
|
||||
set global userstat=1;
|
||||
create table just_a_test(id int,first_name varchar(10),last_name varchar(10),address varchar(100),phone bigint,email varchar(30), state varchar(30));
|
||||
insert into just_a_test values(1,'fa','la','china_a',11111111,'fa_la@163.com','California'),
|
||||
(2,'fb','lb','china_b',22222222,'fb_lb@163.com','Arizona'),
|
||||
(3,'fc','lc','china_c',33333333,'fc_lc@163.com','California'),
|
||||
(4,'fd','ld','china_d',44444444,'fd_ld@163.com','Utah'),
|
||||
(5,'fe','le','china_e',55555555,'fe_le@163.com','Arizona');
|
||||
alter table just_a_test add primary key (id);
|
||||
alter table just_a_test add key IND_just_a_test_first_name_last_name(first_name,last_name);
|
||||
alter table just_a_test add key IND_just_a_test_state(state);
|
||||
select count(*) from just_a_test where first_name='fc' and last_name='lc';
|
||||
select count(*) from just_a_test where state = 'California';
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
alter table just_a_test drop key IND_just_a_test_first_name_last_name;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
alter table just_a_test drop column state;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
drop table just_a_test;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
#
|
||||
# Test direct drop table
|
||||
#
|
||||
create table just_a_test(id int not null primary key,first_name varchar(10),last_name varchar(10),address varchar(100),phone bigint,email varchar(30), state varchar(30),key(first_name,last_name),key(state));
|
||||
insert into just_a_test values(1,'fa','la','china_a',11111111,'fa_la@163.com','California'),
|
||||
(2,'fb','lb','china_b',22222222,'fb_lb@163.com','Arizona'),
|
||||
(3,'fc','lc','china_c',33333333,'fc_lc@163.com','California'),
|
||||
(4,'fd','ld','china_d',44444444,'fd_ld@163.com','Utah'),
|
||||
(5,'fe','le','china_e',55555555,'fe_le@163.com','Arizona');
|
||||
select count(*) from just_a_test where first_name='fc' and last_name='lc';
|
||||
select count(*) from just_a_test where state = 'California';
|
||||
select count(*) from just_a_test where id between 2 and 4;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
drop table just_a_test;
|
||||
select * from information_schema.index_statistics where table_schema='test' and table_name='just_a_test';
|
||||
select * from information_schema.table_statistics where table_schema='test' and table_name='just_a_test';
|
||||
set global userstat=0;
|
|
@ -41,3 +41,24 @@ UPDATE t1, t2 SET t2.fld2= t2.fld2 + 3;
|
|||
UPDATE t1, t2 SET t1.fld1= t1.fld1 + 3;
|
||||
|
||||
DROP TABLE t2, t1;
|
||||
|
||||
--echo #
|
||||
--echo # BUG#22037930: INSERT IGNORE FAILS TO IGNORE FOREIGN
|
||||
--echo # KEY CONSTRAINT
|
||||
|
||||
CREATE TABLE t1 (fld1 INT PRIMARY KEY) ENGINE= INNODB;
|
||||
|
||||
CREATE TABLE t2 (fld1 VARCHAR(10), fld2 INT NOT NULL,
|
||||
CONSTRAINT fk FOREIGN KEY (fld2) REFERENCES t1(fld1)) ENGINE= INNODB;
|
||||
|
||||
--echo # Without patch, reports incorrect error.
|
||||
--error ER_NO_REFERENCED_ROW_2
|
||||
INSERT INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||
--error ER_NO_REFERENCED_ROW_2
|
||||
REPLACE INTO t2 VALUES('abc', 2);
|
||||
|
||||
--enable_warnings
|
||||
INSERT IGNORE INTO t2 VALUES('abc', 2) ON DUPLICATE KEY UPDATE fld1= 'def';
|
||||
--disable_warnings
|
||||
|
||||
DROP TABLE t2, t1;
|
||||
|
|
|
@ -64,6 +64,25 @@ SELECT monthname('2001-01-01');
|
|||
SELECT monthname('2001-02-01');
|
||||
SELECT monthname('2001-03-01');
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-10052 Illegal mix of collations with DAYNAME(date_field)<>varchar_field
|
||||
--echo #
|
||||
SET NAMES utf8;
|
||||
CREATE TABLE t1 (c VARCHAR(8) CHARACTER SET latin1, d DATE);
|
||||
INSERT INTO t1 VALUES ('test',now());
|
||||
SET lc_time_names=ru_RU;
|
||||
--error ER_CANT_AGGREGATE_2COLLATIONS
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
--error ER_CANT_AGGREGATE_2COLLATIONS
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
SET lc_time_names=en_US;
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
SET NAMES latin1;
|
||||
SELECT c FROM t1 WHERE DAYNAME(d)<>c;
|
||||
SELECT c FROM t1 WHERE MONTHNAME(d)<>c;
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # Start of 5.6 tests
|
||||
--echo #
|
||||
|
|
|
@ -1083,4 +1083,28 @@ SELECT * FROM v1;
|
|||
DROP TABLE t1, t2;
|
||||
DROP VIEW v1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-5973: MySQL Bug#11757486:49539: NON-DESCRIPTIVE ERR (ERROR 0
|
||||
--echo # FROM STORAGE ENGINE) WITH MULTI-TABLE UPDATE
|
||||
--echo #
|
||||
|
||||
CREATE TABLE table_11757486 (field1 tinyint) ENGINE=INNODB;
|
||||
INSERT INTO table_11757486 VALUES (0),(0);
|
||||
SET SESSION SQL_MODE='STRICT_ALL_TABLES';
|
||||
UPDATE IGNORE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
UPDATE IGNORE table_11757486 SET field1=128;
|
||||
|
||||
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||
UPDATE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
--error ER_WARN_DATA_OUT_OF_RANGE
|
||||
UPDATE table_11757486 SET field1=128;
|
||||
|
||||
SET SESSION SQL_MODE='';
|
||||
UPDATE IGNORE (SELECT 128 as col1) x, table_11757486 SET field1=x.col1;
|
||||
UPDATE IGNORE table_11757486 SET field1=128;
|
||||
|
||||
DROP TABLE table_11757486;
|
||||
|
||||
SET SESSION SQL_MODE=default;
|
||||
|
||||
--echo end of 10.0 tests
|
||||
|
|
|
@ -350,6 +350,11 @@ create table t1(a int);
|
|||
drop view v1;
|
||||
drop table t1;
|
||||
|
||||
create table `#mysql50#t1``1` (a int) engine=myisam;
|
||||
--exec $MYSQL_CHECK --fix-table-names --databases test
|
||||
show tables;
|
||||
drop table `t1``1`;
|
||||
|
||||
--echo #
|
||||
--echo #MDEV-7384 [PATCH] add PERSISENT FOR ALL option to mysqlanalyze/mysqlcheck
|
||||
--echo #
|
||||
|
|
|
@ -759,6 +759,22 @@ CREATE TRIGGER trigger1 BEFORE INSERT ON t1 FOR EACH ROW
|
|||
SET default_storage_engine = NEW.INNODB;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# MDEV-8328 Evaluation of two "!" operators depends on space in beetween
|
||||
#
|
||||
--error ER_PARSE_ERROR
|
||||
select 0==0;
|
||||
select 1=!0, 1 = ! 0;
|
||||
select !!0, ! ! 0;
|
||||
select 2>!0, 2 > ! 0;
|
||||
select 0<=!0, 0 <= !0;
|
||||
select 1<<!0, 1 << !0;
|
||||
select 0<!0, 0 < ! 0;
|
||||
|
||||
#
|
||||
# start of 10.1 tests
|
||||
#
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-7792 - SQL Parsing Error - UNION AND ORDER BY WITH JOIN
|
||||
--echo #
|
||||
|
|
36
mysql-test/t/ssl_ca.test
Normal file
36
mysql-test/t/ssl_ca.test
Normal file
|
@ -0,0 +1,36 @@
|
|||
--source include/have_ssl_communication.inc
|
||||
--source include/not_embedded.inc
|
||||
|
||||
--echo #
|
||||
--echo # Bug#21920657: SSL-CA FAILS SILENTLY IF THE PATH CANNOT BE FOUND
|
||||
--echo #
|
||||
|
||||
--echo # try to connect with wrong '--ssl-ca' path : should fail
|
||||
--error 1
|
||||
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/wrong-cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'" 2>&1
|
||||
|
||||
--echo # try to connect with correct '--ssl-ca' path : should connect
|
||||
--replace_result DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-SHA
|
||||
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||
|
||||
--echo #
|
||||
--echo # Bug#21920678: SSL-CA DOES NOT ACCEPT ~USER TILDE HOME DIRECTORY
|
||||
--echo # PATH SUBSTITUTION
|
||||
--echo #
|
||||
|
||||
--let $mysql_test_dir_path= `SELECT IF(LENGTH('$HOME'), REPLACE('=$MYSQL_TEST_DIR', '=$HOME', '=~'), '=$MYSQL_TEST_DIR')`
|
||||
|
||||
--echo # try to connect with '--ssl-ca' option using tilde home directoy
|
||||
--echo # path substitution : should connect
|
||||
--replace_result DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-SHA
|
||||
--exec $MYSQL --ssl-ca$mysql_test_dir_path/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||
|
||||
--echo # try to connect with '--ssl-key' option using tilde home directoy
|
||||
--echo # path substitution : should connect
|
||||
--replace_result DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-SHA
|
||||
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key$mysql_test_dir_path/std_data/client-key.pem --ssl-cert=$MYSQL_TEST_DIR/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
||||
|
||||
--echo # try to connect with '--ssl-cert' option using tilde home directoy
|
||||
--echo # path substitution : should connect
|
||||
--replace_result DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES256-SHA
|
||||
--exec $MYSQL --ssl-ca=$MYSQL_TEST_DIR/std_data/cacert.pem --ssl-key=$MYSQL_TEST_DIR/std_data/client-key.pem --ssl-cert$mysql_test_dir_path/std_data/client-cert.pem test -e "SHOW STATUS LIKE 'Ssl_cipher'"
|
|
@ -387,6 +387,7 @@ drop table t1;
|
|||
|
||||
--echo #
|
||||
--echo # MDEV-9521 Least function returns 0000-00-00 for null date columns instead of null
|
||||
--echo # MDEV-9972 Least function retuns date in date time format
|
||||
--echo #
|
||||
CREATE TABLE t1 (
|
||||
id BIGINT NOT NULL,
|
||||
|
|
|
@ -610,6 +610,14 @@ EXECUTE stmt1;
|
|||
DEALLOCATE PREPARE stmt1;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-9374 having '2015-01-01 01:00:00.000001' > coalesce(NULL) returns true
|
||||
--echo #
|
||||
CREATE TABLE t1 (c1 DATETIME(0));
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
SELECT * FROM t1 HAVING '2015-01-01 01:00:00.000001' > COALESCE(c1);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # End of 5.5 tests
|
||||
--echo #
|
||||
|
|
|
@ -19,36 +19,6 @@
|
|||
# Suppress some common (not fatal) errors in system libraries found by valgrind
|
||||
#
|
||||
|
||||
#
|
||||
# Pthread doesn't free all thread specific memory before program exists
|
||||
#
|
||||
{
|
||||
pthread allocate_tls memory loss
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
fun:_dl_allocate_tls
|
||||
fun:allocate_stack
|
||||
fun:pthread_create*
|
||||
}
|
||||
|
||||
{
|
||||
pthread allocate_tls memory loss
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
fun:_dl_allocate_tls
|
||||
fun:pthread_create*
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
pthread allocate_tls memory loss
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
obj:/lib*/ld*.so
|
||||
fun:_dl_allocate_tls
|
||||
fun:pthread_create*
|
||||
}
|
||||
|
||||
{
|
||||
pthead_exit memory loss 1
|
||||
Memcheck:Leak
|
||||
|
@ -89,53 +59,6 @@
|
|||
fun:_dl_map_object_from_fd
|
||||
}
|
||||
|
||||
{
|
||||
pthread allocate_dtv memory loss
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
fun:allocate_dtv
|
||||
fun:_dl_allocate_tls_storage
|
||||
fun:__GI__dl_allocate_tls
|
||||
fun:pthread_create
|
||||
}
|
||||
|
||||
{
|
||||
pthread allocate_dtv memory loss second
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
fun:allocate_dtv
|
||||
fun:_dl_allocate_tls
|
||||
fun:pthread_create*
|
||||
}
|
||||
|
||||
{
|
||||
pthread memalign memory loss
|
||||
Memcheck:Leak
|
||||
fun:memalign
|
||||
fun:_dl_allocate_tls_storage
|
||||
fun:__GI__dl_allocate_tls
|
||||
fun:pthread_create
|
||||
}
|
||||
|
||||
{
|
||||
pthread memalign memory loss2
|
||||
Memcheck:Leak
|
||||
fun:memalign
|
||||
fun:tls_get_addr_tail
|
||||
...
|
||||
fun:*ha_initialize_handlerton*
|
||||
}
|
||||
|
||||
{
|
||||
pthread memalign memory loss3
|
||||
Memcheck:Leak
|
||||
fun:memalign
|
||||
fun:tls_get_addr_tail
|
||||
...
|
||||
fun:*ha_finalize_handlerton*
|
||||
}
|
||||
|
||||
{
|
||||
pthread pthread_key_create
|
||||
Memcheck:Leak
|
||||
fun:malloc
|
||||
|
@ -1006,18 +929,6 @@
|
|||
fun:nptl_pthread_exit_hack_handler
|
||||
}
|
||||
|
||||
#
|
||||
# Pthread doesn't free all thread specific memory before program exists
|
||||
#
|
||||
{
|
||||
pthread allocate_tls memory loss in 2.6.1.
|
||||
Memcheck:Leak
|
||||
fun:calloc
|
||||
obj:*/ld-*.so
|
||||
fun:_dl_allocate_tls
|
||||
fun:pthread_create*
|
||||
}
|
||||
|
||||
{
|
||||
memory "leak" in backtrace() of glibc 2.9 (not present in 2.13)
|
||||
Memcheck:Leak
|
||||
|
@ -1170,6 +1081,23 @@
|
|||
fun:gethostbyaddr_r
|
||||
}
|
||||
|
||||
#
|
||||
# Detached threads may not complete deiniitialization by the time shutdown
|
||||
# thread calls exit. This is unfortunate property of detached threads, which
|
||||
# we currently can only ignore. Unfortunately there is no way to distinguish
|
||||
# between false positives generated by detached threads and real memory leaks
|
||||
# generated by not joined joinable threads. So we hide both cases.
|
||||
#
|
||||
# To avoid enumeration of the whole variety of possible traces we ignore all
|
||||
# "possibly lost" blocks allocated by pthread_create (and it's callees).
|
||||
#
|
||||
{
|
||||
Detached threads memory loss
|
||||
Memcheck:Leak
|
||||
match-leak-kinds:possible
|
||||
...
|
||||
fun:pthread_create*
|
||||
}
|
||||
|
||||
{
|
||||
ConnectSE: unixODBC SQLAllocEnv leaves some "still reachable" pointers
|
||||
|
@ -1632,4 +1560,3 @@ g codership/mysql-wsrep/issues#176
|
|||
fun:start_thread
|
||||
fun:clone
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
/*
|
||||
Copyright (c) 2000, 2013, Oracle and/or its affiliates
|
||||
Copyright (c) 1995, 2013, Monty Program Ab
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
|
|
@ -614,6 +614,7 @@ int _my_b_cache_read(IO_CACHE *info, uchar *Buffer, size_t Count)
|
|||
{
|
||||
/* End of file. Return, what we did copy from the buffer. */
|
||||
info->error= (int) left_length;
|
||||
info->seek_not_done=1;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
/*
|
||||
|
@ -631,6 +632,7 @@ int _my_b_cache_read(IO_CACHE *info, uchar *Buffer, size_t Count)
|
|||
*/
|
||||
info->error= (read_length == (size_t) -1 ? -1 :
|
||||
(int) (read_length+left_length));
|
||||
info->seek_not_done=1;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
Count-=length;
|
||||
|
@ -683,6 +685,7 @@ int _my_b_cache_read(IO_CACHE *info, uchar *Buffer, size_t Count)
|
|||
/* For a read error, return -1, otherwise, what we got in total. */
|
||||
info->error= length == (size_t) -1 ? -1 : (int) (length+left_length);
|
||||
info->read_pos=info->read_end=info->buffer;
|
||||
info->seek_not_done=1;
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
/*
|
||||
|
@ -1925,6 +1928,7 @@ void die(const char* fmt, ...)
|
|||
fprintf(stderr,"Error:");
|
||||
vfprintf(stderr, fmt,va_args);
|
||||
fprintf(stderr,", errno=%d\n", errno);
|
||||
va_end(va_args);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2011, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
|
|
@ -169,7 +169,9 @@ static int do_test()
|
|||
for (j=0 ; j < 1000 ; j++)
|
||||
if (key1[j] > 1)
|
||||
break;
|
||||
if (key1[j] > 1)
|
||||
// j will be 1000 only if we have no keys in the hash. This only happens
|
||||
// when the parameter recant is set to 0 via command line argument.
|
||||
if (j < 1000 && key1[j] > 1)
|
||||
{
|
||||
HASH_SEARCH_STATE state;
|
||||
printf("- Testing identical read\n");
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
/* Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates.
|
||||
Copyright (c) 2010, 2016, MariaDB
|
||||
|
||||
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
|
||||
|
|
|
@ -8,7 +8,7 @@ Email domain: cam.ac.uk
|
|||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2015 University of Cambridge
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
All rights reserved
|
||||
|
||||
|
||||
|
@ -19,7 +19,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2015 Zoltan Herczeg
|
||||
Copyright(c) 2010-2016 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -30,7 +30,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2015 Zoltan Herczeg
|
||||
Copyright(c) 2009-2016 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
|
|
@ -65,6 +65,7 @@
|
|||
# so it has been removed.
|
||||
# 2013-10-08 PH got rid of the "source" command, which is a bash-ism (use ".")
|
||||
# 2013-11-05 PH added support for PARENS_NEST_LIMIT
|
||||
# 2016-03-01 PH applied Chris Wilson's patch for MSVC static build
|
||||
|
||||
PROJECT(PCRE C CXX)
|
||||
|
||||
|
|
|
@ -4,12 +4,104 @@ ChangeLog for PCRE
|
|||
Note that the PCRE 8.xx series (PCRE1) is now in a bugfix-only state. All
|
||||
development is happening in the PCRE2 10.xx series.
|
||||
|
||||
Version 8.39 14-June-2016
|
||||
-------------------------
|
||||
|
||||
1. If PCRE_AUTO_CALLOUT was set on a pattern that had a (?# comment between
|
||||
an item and its qualifier (for example, A(?#comment)?B) pcre_compile()
|
||||
misbehaved. This bug was found by the LLVM fuzzer.
|
||||
|
||||
2. Similar to the above, if an isolated \E was present between an item and its
|
||||
qualifier when PCRE_AUTO_CALLOUT was set, pcre_compile() misbehaved. This
|
||||
bug was found by the LLVM fuzzer.
|
||||
|
||||
3. Further to 8.38/46, negated classes such as [^[:^ascii:]\d] were also not
|
||||
working correctly in UCP mode.
|
||||
|
||||
4. The POSIX wrapper function regexec() crashed if the option REG_STARTEND
|
||||
was set when the pmatch argument was NULL. It now returns REG_INVARG.
|
||||
|
||||
5. Allow for up to 32-bit numbers in the ordin() function in pcregrep.
|
||||
|
||||
6. An empty \Q\E sequence between an item and its qualifier caused
|
||||
pcre_compile() to misbehave when auto callouts were enabled. This bug was
|
||||
found by the LLVM fuzzer.
|
||||
|
||||
7. If a pattern that was compiled with PCRE_EXTENDED started with white
|
||||
space or a #-type comment that was followed by (?-x), which turns off
|
||||
PCRE_EXTENDED, and there was no subsequent (?x) to turn it on again,
|
||||
pcre_compile() assumed that (?-x) applied to the whole pattern and
|
||||
consequently mis-compiled it. This bug was found by the LLVM fuzzer.
|
||||
|
||||
8. A call of pcre_copy_named_substring() for a named substring whose number
|
||||
was greater than the space in the ovector could cause a crash.
|
||||
|
||||
9. Yet another buffer overflow bug involved duplicate named groups with a
|
||||
group that reset capture numbers (compare 8.38/7 below). Once again, I have
|
||||
just allowed for more memory, even if not needed. (A proper fix is
|
||||
implemented in PCRE2, but it involves a lot of refactoring.)
|
||||
|
||||
10. pcre_get_substring_list() crashed if the use of \K in a match caused the
|
||||
start of the match to be earlier than the end.
|
||||
|
||||
11. Migrating appropriate PCRE2 JIT improvements to PCRE.
|
||||
|
||||
12. A pattern such as /(?<=((?C)0))/, which has a callout inside a lookbehind
|
||||
assertion, caused pcretest to generate incorrect output, and also to read
|
||||
uninitialized memory (detected by ASAN or valgrind).
|
||||
|
||||
13. A pattern that included (*ACCEPT) in the middle of a sufficiently deeply
|
||||
nested set of parentheses of sufficient size caused an overflow of the
|
||||
compiling workspace (which was diagnosed, but of course is not desirable).
|
||||
|
||||
14. And yet another buffer overflow bug involving duplicate named groups, this
|
||||
time nested, with a nested back reference. Yet again, I have just allowed
|
||||
for more memory, because anything more needs all the refactoring that has
|
||||
been done for PCRE2. An example pattern that provoked this bug is:
|
||||
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/ and the bug was
|
||||
registered as CVE-2016-1283.
|
||||
|
||||
15. pcretest went into a loop if global matching was requested with an ovector
|
||||
size less than 2. It now gives an error message. This bug was found by
|
||||
afl-fuzz.
|
||||
|
||||
16. An invalid pattern fragment such as (?(?C)0 was not diagnosing an error
|
||||
("assertion expected") when (?(?C) was not followed by an opening
|
||||
parenthesis.
|
||||
|
||||
17. Fixed typo ("&&" for "&") in pcre_study(). Fortunately, this could not
|
||||
actually affect anything, by sheer luck.
|
||||
|
||||
18. Applied Chris Wilson's patch (Bugzilla #1681) to CMakeLists.txt for MSVC
|
||||
static compilation.
|
||||
|
||||
19. Modified the RunTest script to incorporate a valgrind suppressions file so
|
||||
that certain errors, provoked by the SSE2 instruction set when JIT is used,
|
||||
are ignored.
|
||||
|
||||
20. A racing condition is fixed in JIT reported by Mozilla.
|
||||
|
||||
21. Minor code refactor to avoid "array subscript is below array bounds"
|
||||
compiler warning.
|
||||
|
||||
22. Minor code refactor to avoid "left shift of negative number" warning.
|
||||
|
||||
23. Fix typo causing compile error when 16- or 32-bit JIT is compiled without
|
||||
UCP support.
|
||||
|
||||
24. Refactor to avoid compiler warnings in pcrecpp.cc.
|
||||
|
||||
25. Refactor to fix a typo in pcre_jit_test.c
|
||||
|
||||
26. Patch to support compiling pcrecpp.cc with Intel compiler.
|
||||
|
||||
|
||||
Version 8.38 23-November-2015
|
||||
-----------------------------
|
||||
|
||||
1. If a group that contained a recursive back reference also contained a
|
||||
forward reference subroutine call followed by a non-forward-reference
|
||||
subroutine call, for example /.((?2)(?R)\1)()/, pcre2_compile() failed to
|
||||
subroutine call, for example /.((?2)(?R)\1)()/, pcre_compile() failed to
|
||||
compile correct code, leading to undefined behaviour or an internally
|
||||
detected error. This bug was discovered by the LLVM fuzzer.
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@ Email domain: cam.ac.uk
|
|||
University of Cambridge Computing Service,
|
||||
Cambridge, England.
|
||||
|
||||
Copyright (c) 1997-2015 University of Cambridge
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -36,7 +36,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2010-2015 Zoltan Herczeg
|
||||
Copyright(c) 2010-2016 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
@ -47,7 +47,7 @@ Written by: Zoltan Herczeg
|
|||
Email local part: hzmester
|
||||
Emain domain: freemail.hu
|
||||
|
||||
Copyright(c) 2009-2015 Zoltan Herczeg
|
||||
Copyright(c) 2009-2016 Zoltan Herczeg
|
||||
All rights reserved.
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,15 @@
|
|||
News about PCRE releases
|
||||
------------------------
|
||||
|
||||
Release 8.39 14-June-2016
|
||||
-------------------------
|
||||
|
||||
Some appropriate PCRE2 JIT improvements have been retro-fitted to PCRE1. Apart
|
||||
from that, this is another bug-fix release. Note that this library (now called
|
||||
PCRE1) is now being maintained for bug fixes only. New projects are advised to
|
||||
use the new PCRE2 libraries.
|
||||
|
||||
|
||||
Release 8.38 23-November-2015
|
||||
-----------------------------
|
||||
|
||||
|
|
|
@ -67,6 +67,15 @@ fi
|
|||
./pcretest -C utf >/dev/null
|
||||
utf8=$?
|
||||
|
||||
# We need valgrind suppressions when JIT is in use. (This isn't perfect because
|
||||
# some tests are run with -no-jit, but as PCRE1 is in maintenance only, I have
|
||||
# not bothered about that.)
|
||||
|
||||
./pcretest -C jit >/dev/null
|
||||
if [ $? -eq 1 -a "$valgrind" != "" ] ; then
|
||||
valgrind="$valgrind --suppressions=./testdata/valgrind-jit.supp"
|
||||
fi
|
||||
|
||||
echo "Testing pcregrep main features"
|
||||
|
||||
echo "---------------------------- Test 1 ------------------------------" >testtrygrep
|
||||
|
|
32
pcre/RunTest
32
pcre/RunTest
|
@ -178,6 +178,7 @@ nojit=
|
|||
sim=
|
||||
skip=
|
||||
valgrind=
|
||||
vjs=
|
||||
|
||||
# This is in case the caller has set aliases (as I do - PH)
|
||||
unset cp ls mv rm
|
||||
|
@ -357,6 +358,9 @@ $sim ./pcretest -C jit >/dev/null
|
|||
jit=$?
|
||||
if [ $jit -ne 0 -a "$nojit" != "yes" ] ; then
|
||||
jitopt=-s+
|
||||
if [ "$valgrind" != "" ] ; then
|
||||
vjs="--suppressions=$testdata/valgrind-jit.supp"
|
||||
fi
|
||||
fi
|
||||
|
||||
# If no specific tests were requested, select all. Those that are not
|
||||
|
@ -423,7 +427,7 @@ for bmode in "$test8" "$test16" "$test32"; do
|
|||
if [ $do1 = yes ] ; then
|
||||
echo $title1
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput1 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput1 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput1 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -441,7 +445,7 @@ fi
|
|||
if [ $do2 = yes ] ; then
|
||||
echo $title2 "(not UTF-$bits)"
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput2 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput2 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput2 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -504,7 +508,7 @@ if [ $do3 = yes ] ; then
|
|||
if [ "$locale" != "" ] ; then
|
||||
echo $title3 "(using '$locale' locale)"
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $infile testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $infile testtry
|
||||
if [ $? = 0 ] ; then
|
||||
if $cf $outfile testtry >teststdout || \
|
||||
$cf $outfile2 testtry >teststdout || \
|
||||
|
@ -540,7 +544,7 @@ if [ $do4 = yes ] ; then
|
|||
echo " Skipped because UTF-$bits support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput4 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput4 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput4 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -560,7 +564,7 @@ if [ $do5 = yes ] ; then
|
|||
echo " Skipped because UTF-$bits support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput5 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput5 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput5 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -580,7 +584,7 @@ if [ $do6 = yes ] ; then
|
|||
echo " Skipped because Unicode property support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput6 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput6 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput6 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -602,7 +606,7 @@ if [ $do7 = yes ] ; then
|
|||
echo " Skipped because Unicode property support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput7 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput7 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput7 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -698,7 +702,7 @@ if [ $do12 = yes ] ; then
|
|||
if [ $jit -eq 0 -o "$nojit" = "yes" ] ; then
|
||||
echo " Skipped because JIT is not available or not usable"
|
||||
else
|
||||
$sim $valgrind ./pcretest -q $bmode $testdata/testinput12 testtry
|
||||
$sim $valgrind $vjs ./pcretest -q $bmode $testdata/testinput12 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput12 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -735,7 +739,7 @@ if [ "$do14" = yes ] ; then
|
|||
cp -f $testdata/saved16 testsaved16
|
||||
cp -f $testdata/saved32 testsaved32
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput14 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput14 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput14 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -759,7 +763,7 @@ if [ "$do15" = yes ] ; then
|
|||
echo " Skipped because UTF-$bits support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput15 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput15 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput15 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -783,7 +787,7 @@ if [ $do16 = yes ] ; then
|
|||
echo " Skipped because Unicode property support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput16 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput16 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput16 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -805,7 +809,7 @@ if [ $do17 = yes ] ; then
|
|||
echo " Skipped when running 8-bit tests"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput17 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput17 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput17 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -829,7 +833,7 @@ if [ $do18 = yes ] ; then
|
|||
echo " Skipped because UTF-$bits support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput18 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput18 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput18-$bits testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
@ -853,7 +857,7 @@ if [ $do19 = yes ] ; then
|
|||
echo " Skipped because Unicode property support is not available"
|
||||
else
|
||||
for opt in "" "-s" $jitopt; do
|
||||
$sim $valgrind ./pcretest -q $bmode $opt $testdata/testinput19 testtry
|
||||
$sim $valgrind ${opt:+$vjs} ./pcretest -q $bmode $opt $testdata/testinput19 testtry
|
||||
if [ $? = 0 ] ; then
|
||||
$cf $testdata/testoutput19 testtry
|
||||
if [ $? != 0 ] ; then exit 1; fi
|
||||
|
|
|
@ -9,18 +9,18 @@ dnl The PCRE_PRERELEASE feature is for identifying release candidates. It might
|
|||
dnl be defined as -RC2, for example. For real releases, it should be empty.
|
||||
|
||||
m4_define(pcre_major, [8])
|
||||
m4_define(pcre_minor, [38])
|
||||
m4_define(pcre_minor, [39])
|
||||
m4_define(pcre_prerelease, [])
|
||||
m4_define(pcre_date, [2015-11-23])
|
||||
m4_define(pcre_date, [2016-06-14])
|
||||
|
||||
# NOTE: The CMakeLists.txt file searches for the above variables in the first
|
||||
# 50 lines of this file. Please update that if the variables above are moved.
|
||||
|
||||
# Libtool shared library interface versions (current:revision:age)
|
||||
m4_define(libpcre_version, [3:6:2])
|
||||
m4_define(libpcre16_version, [2:6:2])
|
||||
m4_define(libpcre32_version, [0:6:0])
|
||||
m4_define(libpcreposix_version, [0:3:0])
|
||||
m4_define(libpcre_version, [3:7:2])
|
||||
m4_define(libpcre16_version, [2:7:2])
|
||||
m4_define(libpcre32_version, [0:7:0])
|
||||
m4_define(libpcreposix_version, [0:4:0])
|
||||
m4_define(libpcrecpp_version, [0:1:0])
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
|
|
|
@ -315,9 +315,8 @@ documentation for details of how to do this. It is a non-standard way of
|
|||
building PCRE, for use in environments that have limited stacks. Because of the
|
||||
greater use of memory management, it runs more slowly. Separate functions are
|
||||
provided so that special-purpose external code can be used for this case. When
|
||||
used, these functions are always called in a stack-like manner (last obtained,
|
||||
first freed), and always for memory blocks of the same size. There is a
|
||||
discussion about PCRE's stack usage in the
|
||||
used, these functions always allocate memory blocks of the same size. There is
|
||||
a discussion about PCRE's stack usage in the
|
||||
<a href="pcrestack.html"><b>pcrestack</b></a>
|
||||
documentation.
|
||||
</P>
|
||||
|
@ -2913,9 +2912,9 @@ Cambridge CB2 3QH, England.
|
|||
</P>
|
||||
<br><a name="SEC26" href="#TOC1">REVISION</a><br>
|
||||
<P>
|
||||
Last updated: 09 February 2014
|
||||
Last updated: 18 December 2015
|
||||
<br>
|
||||
Copyright © 1997-2014 University of Cambridge.
|
||||
Copyright © 1997-2015 University of Cambridge.
|
||||
<br>
|
||||
<p>
|
||||
Return to the <a href="index.html">PCRE index page</a>.
|
||||
|
|
1935
pcre/doc/pcre.txt
1935
pcre/doc/pcre.txt
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
.TH PCREAPI 3 "09 February 2014" "PCRE 8.35"
|
||||
.TH PCREAPI 3 "18 December 2015" "PCRE 8.39"
|
||||
.SH NAME
|
||||
PCRE - Perl-compatible regular expressions
|
||||
.sp
|
||||
|
@ -273,9 +273,8 @@ documentation for details of how to do this. It is a non-standard way of
|
|||
building PCRE, for use in environments that have limited stacks. Because of the
|
||||
greater use of memory management, it runs more slowly. Separate functions are
|
||||
provided so that special-purpose external code can be used for this case. When
|
||||
used, these functions are always called in a stack-like manner (last obtained,
|
||||
first freed), and always for memory blocks of the same size. There is a
|
||||
discussion about PCRE's stack usage in the
|
||||
used, these functions always allocate memory blocks of the same size. There is
|
||||
a discussion about PCRE's stack usage in the
|
||||
.\" HREF
|
||||
\fBpcrestack\fP
|
||||
.\"
|
||||
|
@ -2914,6 +2913,6 @@ Cambridge CB2 3QH, England.
|
|||
.rs
|
||||
.sp
|
||||
.nf
|
||||
Last updated: 09 February 2014
|
||||
Copyright (c) 1997-2014 University of Cambridge.
|
||||
Last updated: 18 December 2015
|
||||
Copyright (c) 1997-2015 University of Cambridge.
|
||||
.fi
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2014 University of Cambridge
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -485,7 +485,7 @@ static const char error_texts[] =
|
|||
"lookbehind assertion is not fixed length\0"
|
||||
"malformed number or name after (?(\0"
|
||||
"conditional group contains more than two branches\0"
|
||||
"assertion expected after (?(\0"
|
||||
"assertion expected after (?( or (?(?C)\0"
|
||||
"(?R or (?[+-]digits must be followed by )\0"
|
||||
/* 30 */
|
||||
"unknown POSIX class name\0"
|
||||
|
@ -560,6 +560,7 @@ static const char error_texts[] =
|
|||
/* 85 */
|
||||
"parentheses are too deeply nested (stack check)\0"
|
||||
"digits missing in \\x{} or \\o{}\0"
|
||||
"regular expression is too complicated\0"
|
||||
;
|
||||
|
||||
/* Table to identify digits and hex digits. This is used when compiling
|
||||
|
@ -4566,6 +4567,10 @@ for (;; ptr++)
|
|||
pcre_uint32 ec;
|
||||
pcre_uchar mcbuffer[8];
|
||||
|
||||
/* Come here to restart the loop without advancing the pointer. */
|
||||
|
||||
REDO_LOOP:
|
||||
|
||||
/* Get next character in the pattern */
|
||||
|
||||
c = *ptr;
|
||||
|
@ -4591,7 +4596,8 @@ for (;; ptr++)
|
|||
if (code > cd->start_workspace + cd->workspace_size -
|
||||
WORK_SIZE_SAFETY_MARGIN) /* Check for overrun */
|
||||
{
|
||||
*errorcodeptr = ERR52;
|
||||
*errorcodeptr = (code >= cd->start_workspace + cd->workspace_size)?
|
||||
ERR52 : ERR87;
|
||||
goto FAILED;
|
||||
}
|
||||
|
||||
|
@ -4645,9 +4651,10 @@ for (;; ptr++)
|
|||
goto FAILED;
|
||||
}
|
||||
|
||||
/* If in \Q...\E, check for the end; if not, we have a literal */
|
||||
/* If in \Q...\E, check for the end; if not, we have a literal. Otherwise an
|
||||
isolated \E is ignored. */
|
||||
|
||||
if (inescq && c != CHAR_NULL)
|
||||
if (c != CHAR_NULL)
|
||||
{
|
||||
if (c == CHAR_BACKSLASH && ptr[1] == CHAR_E)
|
||||
{
|
||||
|
@ -4655,7 +4662,7 @@ for (;; ptr++)
|
|||
ptr++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
else if (inescq)
|
||||
{
|
||||
if (previous_callout != NULL)
|
||||
{
|
||||
|
@ -4670,18 +4677,27 @@ for (;; ptr++)
|
|||
}
|
||||
goto NORMAL_CHAR;
|
||||
}
|
||||
/* Control does not reach here. */
|
||||
|
||||
/* Check for the start of a \Q...\E sequence. We must do this here rather
|
||||
than later in case it is immediately followed by \E, which turns it into a
|
||||
"do nothing" sequence. */
|
||||
|
||||
if (c == CHAR_BACKSLASH && ptr[1] == CHAR_Q)
|
||||
{
|
||||
inescq = TRUE;
|
||||
ptr++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* In extended mode, skip white space and comments. We need a loop in order
|
||||
to check for more white space and more comments after a comment. */
|
||||
/* In extended mode, skip white space and comments. */
|
||||
|
||||
if ((options & PCRE_EXTENDED) != 0)
|
||||
{
|
||||
for (;;)
|
||||
const pcre_uchar *wscptr = ptr;
|
||||
while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);
|
||||
if (c == CHAR_NUMBER_SIGN)
|
||||
{
|
||||
while (MAX_255(c) && (cd->ctypes[c] & ctype_space) != 0) c = *(++ptr);
|
||||
if (c != CHAR_NUMBER_SIGN) break;
|
||||
ptr++;
|
||||
while (*ptr != CHAR_NULL)
|
||||
{
|
||||
|
@ -4695,8 +4711,29 @@ for (;; ptr++)
|
|||
if (utf) FORWARDCHAR(ptr);
|
||||
#endif
|
||||
}
|
||||
c = *ptr; /* Either NULL or the char after a newline */
|
||||
}
|
||||
|
||||
/* If we skipped any characters, restart the loop. Otherwise, we didn't see
|
||||
a comment. */
|
||||
|
||||
if (ptr > wscptr) goto REDO_LOOP;
|
||||
}
|
||||
|
||||
/* Skip over (?# comments. We need to do this here because we want to know if
|
||||
the next thing is a quantifier, and these comments may come between an item
|
||||
and its quantifier. */
|
||||
|
||||
if (c == CHAR_LEFT_PARENTHESIS && ptr[1] == CHAR_QUESTION_MARK &&
|
||||
ptr[2] == CHAR_NUMBER_SIGN)
|
||||
{
|
||||
ptr += 3;
|
||||
while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
|
||||
if (*ptr == CHAR_NULL)
|
||||
{
|
||||
*errorcodeptr = ERR18;
|
||||
goto FAILED;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
/* See if the next thing is a quantifier. */
|
||||
|
@ -4820,15 +4857,15 @@ for (;; ptr++)
|
|||
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_STARTWORD, 6) == 0)
|
||||
{
|
||||
nestptr = ptr + 7;
|
||||
ptr = sub_start_of_word - 1;
|
||||
continue;
|
||||
ptr = sub_start_of_word;
|
||||
goto REDO_LOOP;
|
||||
}
|
||||
|
||||
if (STRNCMP_UC_C8(ptr+1, STRING_WEIRD_ENDWORD, 6) == 0)
|
||||
{
|
||||
nestptr = ptr + 7;
|
||||
ptr = sub_end_of_word - 1;
|
||||
continue;
|
||||
ptr = sub_end_of_word;
|
||||
goto REDO_LOOP;
|
||||
}
|
||||
|
||||
/* Handle a real character class. */
|
||||
|
@ -5046,20 +5083,22 @@ for (;; ptr++)
|
|||
ptr = tempptr + 1;
|
||||
continue;
|
||||
|
||||
/* For the other POSIX classes (ascii, xdigit) we are going to fall
|
||||
through to the non-UCP case and build a bit map for characters with
|
||||
code points less than 256. If we are in a negated POSIX class
|
||||
within a non-negated overall class, characters with code points
|
||||
greater than 255 must all match. In the special case where we have
|
||||
not yet generated any xclass data, and this is the final item in
|
||||
the overall class, we need do nothing: later on, the opcode
|
||||
/* For the other POSIX classes (ascii, cntrl, xdigit) we are going
|
||||
to fall through to the non-UCP case and build a bit map for
|
||||
characters with code points less than 256. If we are in a negated
|
||||
POSIX class, characters with code points greater than 255 must
|
||||
either all match or all not match. In the special case where we
|
||||
have not yet generated any xclass data, and this is the final item
|
||||
in the overall class, we need do nothing: later on, the opcode
|
||||
OP_NCLASS will be used to indicate that characters greater than 255
|
||||
are acceptable. If we have already seen an xclass item or one may
|
||||
follow (we have to assume that it might if this is not the end of
|
||||
the class), explicitly match all wide codepoints. */
|
||||
the class), explicitly list all wide codepoints, which will then
|
||||
either not match or match, depending on whether the class is or is
|
||||
not negated. */
|
||||
|
||||
default:
|
||||
if (!negate_class && local_negate &&
|
||||
if (local_negate &&
|
||||
(xclass || tempptr[2] != CHAR_RIGHT_SQUARE_BRACKET))
|
||||
{
|
||||
*class_uchardata++ = XCL_RANGE;
|
||||
|
@ -6529,21 +6568,6 @@ for (;; ptr++)
|
|||
case CHAR_LEFT_PARENTHESIS:
|
||||
ptr++;
|
||||
|
||||
/* First deal with comments. Putting this code right at the start ensures
|
||||
that comments have no bad side effects. */
|
||||
|
||||
if (ptr[0] == CHAR_QUESTION_MARK && ptr[1] == CHAR_NUMBER_SIGN)
|
||||
{
|
||||
ptr += 2;
|
||||
while (*ptr != CHAR_NULL && *ptr != CHAR_RIGHT_PARENTHESIS) ptr++;
|
||||
if (*ptr == CHAR_NULL)
|
||||
{
|
||||
*errorcodeptr = ERR18;
|
||||
goto FAILED;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Now deal with various "verbs" that can be introduced by '*'. */
|
||||
|
||||
if (ptr[0] == CHAR_ASTERISK && (ptr[1] == ':'
|
||||
|
@ -6604,8 +6628,21 @@ for (;; ptr++)
|
|||
cd->had_accept = TRUE;
|
||||
for (oc = cd->open_caps; oc != NULL; oc = oc->next)
|
||||
{
|
||||
*code++ = OP_CLOSE;
|
||||
PUT2INC(code, 0, oc->number);
|
||||
if (lengthptr != NULL)
|
||||
{
|
||||
#ifdef COMPILE_PCRE8
|
||||
*lengthptr += 1 + IMM2_SIZE;
|
||||
#elif defined COMPILE_PCRE16
|
||||
*lengthptr += 2 + IMM2_SIZE;
|
||||
#elif defined COMPILE_PCRE32
|
||||
*lengthptr += 4 + IMM2_SIZE;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
*code++ = OP_CLOSE;
|
||||
PUT2INC(code, 0, oc->number);
|
||||
}
|
||||
}
|
||||
setverb = *code++ =
|
||||
(cd->assert_depth > 0)? OP_ASSERT_ACCEPT : OP_ACCEPT;
|
||||
|
@ -6734,6 +6771,15 @@ for (;; ptr++)
|
|||
for (i = 3;; i++) if (!IS_DIGIT(ptr[i])) break;
|
||||
if (ptr[i] == CHAR_RIGHT_PARENTHESIS)
|
||||
tempptr += i + 1;
|
||||
|
||||
/* tempptr should now be pointing to the opening parenthesis of the
|
||||
assertion condition. */
|
||||
|
||||
if (*tempptr != CHAR_LEFT_PARENTHESIS)
|
||||
{
|
||||
*errorcodeptr = ERR28;
|
||||
goto FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
/* For conditions that are assertions, check the syntax, and then exit
|
||||
|
@ -7258,7 +7304,7 @@ for (;; ptr++)
|
|||
issue is fixed "properly" in PCRE2. As PCRE1 is now in maintenance
|
||||
only mode, we finesse the bug by allowing more memory always. */
|
||||
|
||||
*lengthptr += 2 + 2*LINK_SIZE;
|
||||
*lengthptr += 4 + 4*LINK_SIZE;
|
||||
|
||||
/* It is even worse than that. The current reference may be to an
|
||||
existing named group with a different number (so apparently not
|
||||
|
@ -7274,7 +7320,12 @@ for (;; ptr++)
|
|||
so far in order to get the number. If the name is not found, leave
|
||||
the value of recno as 0 for a forward reference. */
|
||||
|
||||
else
|
||||
/* This patch (removing "else") fixes a problem when a reference is
|
||||
to multiple identically named nested groups from within the nest.
|
||||
Once again, it is not the "proper" fix, and it results in an
|
||||
over-allocation of memory. */
|
||||
|
||||
/* else */
|
||||
{
|
||||
ng = cd->named_groups;
|
||||
for (i = 0; i < cd->names_found; i++, ng++)
|
||||
|
@ -7585,39 +7636,15 @@ for (;; ptr++)
|
|||
newoptions = (options | set) & (~unset);
|
||||
|
||||
/* If the options ended with ')' this is not the start of a nested
|
||||
group with option changes, so the options change at this level. If this
|
||||
item is right at the start of the pattern, the options can be
|
||||
abstracted and made external in the pre-compile phase, and ignored in
|
||||
the compile phase. This can be helpful when matching -- for instance in
|
||||
caseless checking of required bytes.
|
||||
|
||||
If the code pointer is not (cd->start_code + 1 + LINK_SIZE), we are
|
||||
definitely *not* at the start of the pattern because something has been
|
||||
compiled. In the pre-compile phase, however, the code pointer can have
|
||||
that value after the start, because it gets reset as code is discarded
|
||||
during the pre-compile. However, this can happen only at top level - if
|
||||
we are within parentheses, the starting BRA will still be present. At
|
||||
any parenthesis level, the length value can be used to test if anything
|
||||
has been compiled at that level. Thus, a test for both these conditions
|
||||
is necessary to ensure we correctly detect the start of the pattern in
|
||||
both phases.
|
||||
|
||||
group with option changes, so the options change at this level.
|
||||
If we are not at the pattern start, reset the greedy defaults and the
|
||||
case value for firstchar and reqchar. */
|
||||
|
||||
if (*ptr == CHAR_RIGHT_PARENTHESIS)
|
||||
{
|
||||
if (code == cd->start_code + 1 + LINK_SIZE &&
|
||||
(lengthptr == NULL || *lengthptr == 2 + 2*LINK_SIZE))
|
||||
{
|
||||
cd->external_options = newoptions;
|
||||
}
|
||||
else
|
||||
{
|
||||
greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
|
||||
greedy_non_default = greedy_default ^ 1;
|
||||
req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;
|
||||
}
|
||||
greedy_default = ((newoptions & PCRE_UNGREEDY) != 0);
|
||||
greedy_non_default = greedy_default ^ 1;
|
||||
req_caseopt = ((newoptions & PCRE_CASELESS) != 0)? REQ_CASELESS:0;
|
||||
|
||||
/* Change options at this level, and pass them back for use
|
||||
in subsequent branches. */
|
||||
|
@ -7896,16 +7923,6 @@ for (;; ptr++)
|
|||
c = ec;
|
||||
else
|
||||
{
|
||||
if (escape == ESC_Q) /* Handle start of quoted string */
|
||||
{
|
||||
if (ptr[1] == CHAR_BACKSLASH && ptr[2] == CHAR_E)
|
||||
ptr += 2; /* avoid empty string */
|
||||
else inescq = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (escape == ESC_E) continue; /* Perl ignores an orphan \E */
|
||||
|
||||
/* For metasequences that actually match a character, we disable the
|
||||
setting of a first character if it hasn't already been set. */
|
||||
|
||||
|
|
|
@ -250,6 +250,7 @@ Arguments:
|
|||
code the compiled regex
|
||||
stringname the name of the capturing substring
|
||||
ovector the vector of matched substrings
|
||||
stringcount number of captured substrings
|
||||
|
||||
Returns: the number of the first that is set,
|
||||
or the number of the last one if none are set,
|
||||
|
@ -258,13 +259,16 @@ Returns: the number of the first that is set,
|
|||
|
||||
#if defined COMPILE_PCRE8
|
||||
static int
|
||||
get_first_set(const pcre *code, const char *stringname, int *ovector)
|
||||
get_first_set(const pcre *code, const char *stringname, int *ovector,
|
||||
int stringcount)
|
||||
#elif defined COMPILE_PCRE16
|
||||
static int
|
||||
get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector)
|
||||
get_first_set(const pcre16 *code, PCRE_SPTR16 stringname, int *ovector,
|
||||
int stringcount)
|
||||
#elif defined COMPILE_PCRE32
|
||||
static int
|
||||
get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector)
|
||||
get_first_set(const pcre32 *code, PCRE_SPTR32 stringname, int *ovector,
|
||||
int stringcount)
|
||||
#endif
|
||||
{
|
||||
const REAL_PCRE *re = (const REAL_PCRE *)code;
|
||||
|
@ -295,7 +299,7 @@ if (entrysize <= 0) return entrysize;
|
|||
for (entry = (pcre_uchar *)first; entry <= (pcre_uchar *)last; entry += entrysize)
|
||||
{
|
||||
int n = GET2(entry, 0);
|
||||
if (ovector[n*2] >= 0) return n;
|
||||
if (n < stringcount && ovector[n*2] >= 0) return n;
|
||||
}
|
||||
return GET2(entry, 0);
|
||||
}
|
||||
|
@ -402,7 +406,7 @@ pcre32_copy_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
|
|||
PCRE_UCHAR32 *buffer, int size)
|
||||
#endif
|
||||
{
|
||||
int n = get_first_set(code, stringname, ovector);
|
||||
int n = get_first_set(code, stringname, ovector, stringcount);
|
||||
if (n <= 0) return n;
|
||||
#if defined COMPILE_PCRE8
|
||||
return pcre_copy_substring(subject, ovector, stringcount, n, buffer, size);
|
||||
|
@ -457,7 +461,10 @@ pcre_uchar **stringlist;
|
|||
pcre_uchar *p;
|
||||
|
||||
for (i = 0; i < double_count; i += 2)
|
||||
size += sizeof(pcre_uchar *) + IN_UCHARS(ovector[i+1] - ovector[i] + 1);
|
||||
{
|
||||
size += sizeof(pcre_uchar *) + IN_UCHARS(1);
|
||||
if (ovector[i+1] > ovector[i]) size += IN_UCHARS(ovector[i+1] - ovector[i]);
|
||||
}
|
||||
|
||||
stringlist = (pcre_uchar **)(PUBL(malloc))(size);
|
||||
if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
|
||||
|
@ -473,7 +480,7 @@ p = (pcre_uchar *)(stringlist + stringcount + 1);
|
|||
|
||||
for (i = 0; i < double_count; i += 2)
|
||||
{
|
||||
int len = ovector[i+1] - ovector[i];
|
||||
int len = (ovector[i+1] > ovector[i])? (ovector[i+1] - ovector[i]) : 0;
|
||||
memcpy(p, subject + ovector[i], IN_UCHARS(len));
|
||||
*stringlist++ = p;
|
||||
p += len;
|
||||
|
@ -619,7 +626,7 @@ pcre32_get_named_substring(const pcre32 *code, PCRE_SPTR32 subject,
|
|||
PCRE_SPTR32 *stringptr)
|
||||
#endif
|
||||
{
|
||||
int n = get_first_set(code, stringname, ovector);
|
||||
int n = get_first_set(code, stringname, ovector, stringcount);
|
||||
if (n <= 0) return n;
|
||||
#if defined COMPILE_PCRE8
|
||||
return pcre_get_substring(subject, ovector, stringcount, n, stringptr);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2014 University of Cambridge
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -275,7 +275,7 @@ pcre.h(.in) and disable (comment out) this message. */
|
|||
|
||||
typedef pcre_uint16 pcre_uchar;
|
||||
#define UCHAR_SHIFT (1)
|
||||
#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
|
||||
#define IN_UCHARS(x) ((x) * 2)
|
||||
#define MAX_255(c) ((c) <= 255u)
|
||||
#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
|
||||
|
||||
|
@ -283,7 +283,7 @@ typedef pcre_uint16 pcre_uchar;
|
|||
|
||||
typedef pcre_uint32 pcre_uchar;
|
||||
#define UCHAR_SHIFT (2)
|
||||
#define IN_UCHARS(x) ((x) << UCHAR_SHIFT)
|
||||
#define IN_UCHARS(x) ((x) * 4)
|
||||
#define MAX_255(c) ((c) <= 255u)
|
||||
#define TABLE_GET(c, table, default) (MAX_255(c)? ((table)[c]):(default))
|
||||
|
||||
|
@ -2289,7 +2289,7 @@ enum { ERR0, ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9,
|
|||
ERR50, ERR51, ERR52, ERR53, ERR54, ERR55, ERR56, ERR57, ERR58, ERR59,
|
||||
ERR60, ERR61, ERR62, ERR63, ERR64, ERR65, ERR66, ERR67, ERR68, ERR69,
|
||||
ERR70, ERR71, ERR72, ERR73, ERR74, ERR75, ERR76, ERR77, ERR78, ERR79,
|
||||
ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERRCOUNT };
|
||||
ERR80, ERR81, ERR82, ERR83, ERR84, ERR85, ERR86, ERR87, ERRCOUNT };
|
||||
|
||||
/* JIT compiling modes. The function list is indexed by them. */
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -242,13 +242,17 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
{ MA, 0, "a\\z", "aaa" },
|
||||
{ MA, 0 | F_NOMATCH, "a\\z", "aab" },
|
||||
|
||||
/* Brackets. */
|
||||
/* Brackets and alternatives. */
|
||||
{ MUA, 0, "(ab|bb|cd)", "bacde" },
|
||||
{ MUA, 0, "(?:ab|a)(bc|c)", "ababc" },
|
||||
{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|efg))", "abac" },
|
||||
{ CMUA, 0, "((aB|(Cc))|(bB)|(?:cd|EFg))", "AcCe" },
|
||||
{ MUA, 0, "((ab|(cc))|(bb)|(?:cd|ebg))", "acebebg" },
|
||||
{ MUA, 0, "(?:(a)|(?:b))(cc|(?:d|e))(a|b)k", "accabdbbccbk" },
|
||||
{ MUA, 0, "\xc7\x82|\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
|
||||
{ MUA, 0, "=\xc7\x82|#\xc6\x82", "\xf1\x83\x82\x82=\xc7\x82\xc7\x83" },
|
||||
{ MUA, 0, "\xc7\x82\xc7\x83|\xc6\x82\xc6\x82", "\xf1\x83\x82\x82\xc7\x82\xc7\x83" },
|
||||
{ MUA, 0, "\xc6\x82\xc6\x82|\xc7\x83\xc7\x83|\xc8\x84\xc8\x84", "\xf1\x83\x82\x82\xc8\x84\xc8\x84" },
|
||||
|
||||
/* Greedy and non-greedy ? operators. */
|
||||
{ MUA, 0, "(?:a)?a", "laab" },
|
||||
|
@ -318,6 +322,14 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
{ CMUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
|
||||
{ MUA, 0, "[^\xe1\xbd\xb8][^\xc3\xa9]", "\xe1\xbd\xb8\xe1\xbf\xb8\xc3\xa9\xc3\x89#" },
|
||||
{ MUA, 0, "[^\xe1\xbd\xb8]{3,}?", "##\xe1\xbd\xb8#\xe1\xbd\xb8#\xc3\x89#\xe1\xbd\xb8" },
|
||||
{ MUA, 0, "\\d+123", "987654321,01234" },
|
||||
{ MUA, 0, "abcd*|\\w+xy", "aaaaa,abxyz" },
|
||||
{ MUA, 0, "(?:abc|((?:amc|\\b\\w*xy)))", "aaaaa,abxyz" },
|
||||
{ MUA, 0, "a(?R)|([a-z]++)#", ".abcd.abcd#."},
|
||||
{ MUA, 0, "a(?R)|([a-z]++)#", ".abcd.mbcd#."},
|
||||
{ MUA, 0, ".[ab]*.", "xx" },
|
||||
{ MUA, 0, ".[ab]*a", "xxa" },
|
||||
{ MUA, 0, ".[ab]?.", "xx" },
|
||||
|
||||
/* Bracket repeats with limit. */
|
||||
{ MUA, 0, "(?:(ab){2}){5}M", "abababababababababababM" },
|
||||
|
@ -574,6 +586,16 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
{ MUA, 0, "(?:(?=.)??[a-c])+m", "abacdcbacacdcaccam" },
|
||||
{ MUA, 0, "((?!a)?(?!([^a]))?)+$", "acbab" },
|
||||
{ MUA, 0, "((?!a)?\?(?!([^a]))?\?)+$", "acbab" },
|
||||
{ MUA, 0, "a(?=(?C)\\B)b", "ab" },
|
||||
{ MUA, 0, "a(?!(?C)\\B)bb|ab", "abb" },
|
||||
{ MUA, 0, "a(?=\\b|(?C)\\B)b", "ab" },
|
||||
{ MUA, 0, "a(?!\\b|(?C)\\B)bb|ab", "abb" },
|
||||
{ MUA, 0, "c(?(?=(?C)\\B)ab|a)", "cab" },
|
||||
{ MUA, 0, "c(?(?!(?C)\\B)ab|a)", "cab" },
|
||||
{ MUA, 0, "c(?(?=\\b|(?C)\\B)ab|a)", "cab" },
|
||||
{ MUA, 0, "c(?(?!\\b|(?C)\\B)ab|a)", "cab" },
|
||||
{ MUA, 0, "a(?=)b", "ab" },
|
||||
{ MUA, 0 | F_NOMATCH, "a(?!)b", "ab" },
|
||||
|
||||
/* Not empty, ACCEPT, FAIL */
|
||||
{ MUA | PCRE_NOTEMPTY, 0 | F_NOMATCH, "a*", "bcx" },
|
||||
|
@ -664,6 +686,7 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
{ PCRE_MULTILINE | PCRE_UTF8 | PCRE_NEWLINE_CRLF | PCRE_FIRSTLINE, 1, ".", "\r\n" },
|
||||
{ PCRE_FIRSTLINE | PCRE_NEWLINE_LF | PCRE_DOTALL, 0 | F_NOMATCH, "ab.", "ab" },
|
||||
{ MUA | PCRE_FIRSTLINE, 1 | F_NOMATCH, "^[a-d0-9]", "\nxx\nd" },
|
||||
{ PCRE_NEWLINE_ANY | PCRE_FIRSTLINE | PCRE_DOTALL, 0, "....a", "012\n0a" },
|
||||
|
||||
/* Recurse. */
|
||||
{ MUA, 0, "(a)(?1)", "aa" },
|
||||
|
@ -798,6 +821,9 @@ static struct regression_test_case regression_test_cases[] = {
|
|||
|
||||
/* (*SKIP) verb. */
|
||||
{ MUA, 0 | F_NOMATCH, "(?=a(*SKIP)b)ab|ad", "ad" },
|
||||
{ MUA, 0, "(\\w+(*SKIP)#)", "abcd,xyz#," },
|
||||
{ MUA, 0, "\\w+(*SKIP)#|mm", "abcd,xyz#," },
|
||||
{ MUA, 0 | F_NOMATCH, "b+(?<=(*SKIP)#c)|b+", "#bbb" },
|
||||
|
||||
/* (*THEN) verb. */
|
||||
{ MUA, 0, "((?:a(*THEN)|aab)(*THEN)c|a+)+m", "aabcaabcaabcaabcnacm" },
|
||||
|
@ -1534,10 +1560,10 @@ static int regression_tests(void)
|
|||
is_successful = 0;
|
||||
}
|
||||
#endif
|
||||
#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE16
|
||||
if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector16_1[i] || ovector16_1[i] != ovector16_2[i]) {
|
||||
printf("\n16 and 16 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
|
||||
i, ovector16_1[i], ovector16_2[i], ovector16_1[i], ovector16_2[i],
|
||||
#if defined SUPPORT_PCRE16 && defined SUPPORT_PCRE32
|
||||
if (ovector16_1[i] != ovector16_2[i] || ovector16_1[i] != ovector32_1[i] || ovector16_1[i] != ovector32_2[i]) {
|
||||
printf("\n16 and 32 bit: Ovector[%d] value differs(J16:%d,I16:%d,J32:%d,I32:%d): [%d] '%s' @ '%s' \n",
|
||||
i, ovector16_1[i], ovector16_2[i], ovector32_1[i], ovector32_2[i],
|
||||
total, current->pattern, current->input);
|
||||
is_successful = 0;
|
||||
}
|
||||
|
|
|
@ -1371,7 +1371,7 @@ do
|
|||
for (c = 0; c < 16; c++) start_bits[c] |= map[c];
|
||||
for (c = 128; c < 256; c++)
|
||||
{
|
||||
if ((map[c/8] && (1 << (c&7))) != 0)
|
||||
if ((map[c/8] & (1 << (c&7))) != 0)
|
||||
{
|
||||
int d = (c >> 6) | 0xc0; /* Set bit for this starter */
|
||||
start_bits[d/8] |= (1 << (d&7)); /* and then skip on to the */
|
||||
|
|
130
pcre/pcrecpp.cc
130
pcre/pcrecpp.cc
|
@ -66,7 +66,7 @@ Arg RE::no_arg((void*)NULL);
|
|||
// inclusive test if we ever needed it. (Note that not only the
|
||||
// __attribute__ syntax, but also __USER_LABEL_PREFIX__, are
|
||||
// gnu-specific.)
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__)
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3 && defined(__ELF__) && !defined(__INTEL_COMPILER)
|
||||
# define ULP_AS_STRING(x) ULP_AS_STRING_INTERNAL(x)
|
||||
# define ULP_AS_STRING_INTERNAL(x) #x
|
||||
# define USER_LABEL_PREFIX_STR ULP_AS_STRING(__USER_LABEL_PREFIX__)
|
||||
|
@ -168,22 +168,22 @@ bool RE::FullMatch(const StringPiece& text,
|
|||
const Arg& ptr16) const {
|
||||
const Arg* args[kMaxArgs];
|
||||
int n = 0;
|
||||
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
|
||||
if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
|
||||
done:
|
||||
|
||||
int consumed;
|
||||
|
@ -210,22 +210,22 @@ bool RE::PartialMatch(const StringPiece& text,
|
|||
const Arg& ptr16) const {
|
||||
const Arg* args[kMaxArgs];
|
||||
int n = 0;
|
||||
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
|
||||
if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
|
||||
done:
|
||||
|
||||
int consumed;
|
||||
|
@ -252,22 +252,22 @@ bool RE::Consume(StringPiece* input,
|
|||
const Arg& ptr16) const {
|
||||
const Arg* args[kMaxArgs];
|
||||
int n = 0;
|
||||
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
|
||||
if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
|
||||
done:
|
||||
|
||||
int consumed;
|
||||
|
@ -300,22 +300,22 @@ bool RE::FindAndConsume(StringPiece* input,
|
|||
const Arg& ptr16) const {
|
||||
const Arg* args[kMaxArgs];
|
||||
int n = 0;
|
||||
if (&ptr1 == &no_arg) goto done; args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) goto done; args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) goto done; args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) goto done; args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) goto done; args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) goto done; args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) goto done; args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) goto done; args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) goto done; args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) goto done; args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) goto done; args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) goto done; args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) goto done; args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) goto done; args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) goto done; args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) goto done; args[n++] = &ptr16;
|
||||
if (&ptr1 == &no_arg) { goto done; } args[n++] = &ptr1;
|
||||
if (&ptr2 == &no_arg) { goto done; } args[n++] = &ptr2;
|
||||
if (&ptr3 == &no_arg) { goto done; } args[n++] = &ptr3;
|
||||
if (&ptr4 == &no_arg) { goto done; } args[n++] = &ptr4;
|
||||
if (&ptr5 == &no_arg) { goto done; } args[n++] = &ptr5;
|
||||
if (&ptr6 == &no_arg) { goto done; } args[n++] = &ptr6;
|
||||
if (&ptr7 == &no_arg) { goto done; } args[n++] = &ptr7;
|
||||
if (&ptr8 == &no_arg) { goto done; } args[n++] = &ptr8;
|
||||
if (&ptr9 == &no_arg) { goto done; } args[n++] = &ptr9;
|
||||
if (&ptr10 == &no_arg) { goto done; } args[n++] = &ptr10;
|
||||
if (&ptr11 == &no_arg) { goto done; } args[n++] = &ptr11;
|
||||
if (&ptr12 == &no_arg) { goto done; } args[n++] = &ptr12;
|
||||
if (&ptr13 == &no_arg) { goto done; } args[n++] = &ptr13;
|
||||
if (&ptr14 == &no_arg) { goto done; } args[n++] = &ptr14;
|
||||
if (&ptr15 == &no_arg) { goto done; } args[n++] = &ptr15;
|
||||
if (&ptr16 == &no_arg) { goto done; } args[n++] = &ptr16;
|
||||
done:
|
||||
|
||||
int consumed;
|
||||
|
|
|
@ -2437,7 +2437,7 @@ return options;
|
|||
static char *
|
||||
ordin(int n)
|
||||
{
|
||||
static char buffer[8];
|
||||
static char buffer[14];
|
||||
char *p = buffer;
|
||||
sprintf(p, "%d", n);
|
||||
while (*p != 0) p++;
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
and semantics are as close as possible to those of the Perl 5 language.
|
||||
|
||||
Written by Philip Hazel
|
||||
Copyright (c) 1997-2014 University of Cambridge
|
||||
Copyright (c) 1997-2016 University of Cambridge
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
|
@ -173,7 +173,8 @@ static const int eint[] = {
|
|||
REG_BADPAT, /* group name must start with a non-digit */
|
||||
/* 85 */
|
||||
REG_BADPAT, /* parentheses too deeply nested (stack check) */
|
||||
REG_BADPAT /* missing digits in \x{} or \o{} */
|
||||
REG_BADPAT, /* missing digits in \x{} or \o{} */
|
||||
REG_BADPAT /* pattern too complicated */
|
||||
};
|
||||
|
||||
/* Table of texts corresponding to POSIX error codes */
|
||||
|
@ -364,6 +365,7 @@ start location rather than being passed as a PCRE "starting offset". */
|
|||
|
||||
if ((eflags & REG_STARTEND) != 0)
|
||||
{
|
||||
if (pmatch == NULL) return REG_INVARG;
|
||||
so = pmatch[0].rm_so;
|
||||
eo = pmatch[0].rm_eo;
|
||||
}
|
||||
|
|
|
@ -2250,7 +2250,7 @@ data is not zero. */
|
|||
static int callout(pcre_callout_block *cb)
|
||||
{
|
||||
FILE *f = (first_callout | callout_extra)? outfile : NULL;
|
||||
int i, pre_start, post_start, subject_length;
|
||||
int i, current_position, pre_start, post_start, subject_length;
|
||||
|
||||
if (callout_extra)
|
||||
{
|
||||
|
@ -2280,14 +2280,19 @@ printed lengths of the substrings. */
|
|||
|
||||
if (f != NULL) fprintf(f, "--->");
|
||||
|
||||
/* If a lookbehind is involved, the current position may be earlier than the
|
||||
match start. If so, use the match start instead. */
|
||||
|
||||
current_position = (cb->current_position >= cb->start_match)?
|
||||
cb->current_position : cb->start_match;
|
||||
|
||||
PCHARS(pre_start, cb->subject, 0, cb->start_match, f);
|
||||
PCHARS(post_start, cb->subject, cb->start_match,
|
||||
cb->current_position - cb->start_match, f);
|
||||
current_position - cb->start_match, f);
|
||||
|
||||
PCHARS(subject_length, cb->subject, 0, cb->subject_length, NULL);
|
||||
|
||||
PCHARSV(cb->subject, cb->current_position,
|
||||
cb->subject_length - cb->current_position, f);
|
||||
PCHARSV(cb->subject, current_position, cb->subject_length - current_position, f);
|
||||
|
||||
if (f != NULL) fprintf(f, "\n");
|
||||
|
||||
|
@ -5612,6 +5617,12 @@ while (!done)
|
|||
break;
|
||||
}
|
||||
|
||||
if (use_size_offsets < 2)
|
||||
{
|
||||
fprintf(outfile, "Cannot do global matching with an ovector size < 2\n");
|
||||
break;
|
||||
}
|
||||
|
||||
/* If we have matched an empty string, first check to see if we are at
|
||||
the end of the subject. If so, the /g loop is over. Otherwise, mimic what
|
||||
Perl's /g options does. This turns out to be rather cunning. First we set
|
||||
|
@ -5740,3 +5751,4 @@ return yield;
|
|||
}
|
||||
|
||||
/* End of pcretest.c */
|
||||
|
||||
|
|
2
pcre/testdata/testinput11
vendored
2
pcre/testdata/testinput11
vendored
|
@ -138,4 +138,6 @@ is required for these tests. --/
|
|||
|
||||
/.((?2)(?R)\1)()/B
|
||||
|
||||
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
|
||||
|
||||
/-- End of testinput11 --/
|
||||
|
|
26
pcre/testdata/testinput2
vendored
26
pcre/testdata/testinput2
vendored
|
@ -4217,4 +4217,30 @@ backtracking verbs. --/
|
|||
|
||||
/a[[:punct:]b]/BZ
|
||||
|
||||
/L(?#(|++<!(2)?/BZ
|
||||
|
||||
/L(?#(|++<!(2)?/BOZ
|
||||
|
||||
/L(?#(|++<!(2)?/BCZ
|
||||
|
||||
/L(?#(|++<!(2)?/BCOZ
|
||||
|
||||
/(A*)\E+/CBZ
|
||||
|
||||
/()\Q\E*]/BCZ
|
||||
|
||||
/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/
|
||||
\O\CC
|
||||
|
||||
/(?=a\K)/
|
||||
ring bpattingbobnd $ 1,oern cou \rb\L
|
||||
|
||||
/(?<=((?C)0))/
|
||||
9010
|
||||
abcd
|
||||
|
||||
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/
|
||||
|
||||
/\N(?(?C)0?!.)*/
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
|
9
pcre/testdata/testinput6
vendored
9
pcre/testdata/testinput6
vendored
|
@ -1553,4 +1553,13 @@
|
|||
\x{200}
|
||||
\x{37e}
|
||||
|
||||
/[^[:^ascii:]\d]/8W
|
||||
a
|
||||
~
|
||||
0
|
||||
\a
|
||||
\x{7f}
|
||||
\x{389}
|
||||
\x{20ac}
|
||||
|
||||
/-- End of testinput6 --/
|
||||
|
|
4
pcre/testdata/testinput7
vendored
4
pcre/testdata/testinput7
vendored
|
@ -853,4 +853,8 @@ of case for anything other than the ASCII letters. --/
|
|||
|
||||
/a[b[:punct:]]/8WBZ
|
||||
|
||||
/L(?#(|++<!(2)?/B8COZ
|
||||
|
||||
/L(?#(|++<!(2)?/B8WCZ
|
||||
|
||||
/-- End of testinput7 --/
|
||||
|
|
5
pcre/testdata/testoutput11-16
vendored
5
pcre/testdata/testoutput11-16
vendored
|
@ -231,7 +231,7 @@ Memory allocation (code space): 73
|
|||
------------------------------------------------------------------
|
||||
|
||||
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
|
||||
Memory allocation (code space): 77
|
||||
Memory allocation (code space): 93
|
||||
------------------------------------------------------------------
|
||||
0 24 Bra
|
||||
2 5 CBra 1
|
||||
|
@ -765,4 +765,7 @@ Memory allocation (code space): 14
|
|||
25 End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
|
||||
Failed: regular expression is too complicated at offset 490
|
||||
|
||||
/-- End of testinput11 --/
|
||||
|
|
5
pcre/testdata/testoutput11-32
vendored
5
pcre/testdata/testoutput11-32
vendored
|
@ -231,7 +231,7 @@ Memory allocation (code space): 155
|
|||
------------------------------------------------------------------
|
||||
|
||||
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
|
||||
Memory allocation (code space): 157
|
||||
Memory allocation (code space): 189
|
||||
------------------------------------------------------------------
|
||||
0 24 Bra
|
||||
2 5 CBra 1
|
||||
|
@ -765,4 +765,7 @@ Memory allocation (code space): 28
|
|||
25 End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
|
||||
Failed: missing ) at offset 509
|
||||
|
||||
/-- End of testinput11 --/
|
||||
|
|
5
pcre/testdata/testoutput11-8
vendored
5
pcre/testdata/testoutput11-8
vendored
|
@ -231,7 +231,7 @@ Memory allocation (code space): 45
|
|||
------------------------------------------------------------------
|
||||
|
||||
/(?P<a>a)...(?P=a)bbb(?P>a)d/BM
|
||||
Memory allocation (code space): 50
|
||||
Memory allocation (code space): 62
|
||||
------------------------------------------------------------------
|
||||
0 30 Bra
|
||||
3 7 CBra 1
|
||||
|
@ -765,4 +765,7 @@ Memory allocation (code space): 10
|
|||
38 End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00]([00](*ACCEPT)/
|
||||
Failed: missing ) at offset 509
|
||||
|
||||
/-- End of testinput11 --/
|
||||
|
|
132
pcre/testdata/testoutput2
vendored
132
pcre/testdata/testoutput2
vendored
|
@ -419,7 +419,7 @@ Need char = '>'
|
|||
|
||||
/(?U)<.*>/I
|
||||
Capturing subpattern count = 0
|
||||
Options: ungreedy
|
||||
No options
|
||||
First char = '<'
|
||||
Need char = '>'
|
||||
abc<def>ghi<klm>nop
|
||||
|
@ -443,7 +443,7 @@ Need char = '='
|
|||
|
||||
/(?U)={3,}?/I
|
||||
Capturing subpattern count = 0
|
||||
Options: ungreedy
|
||||
No options
|
||||
First char = '='
|
||||
Need char = '='
|
||||
abc========def
|
||||
|
@ -477,7 +477,7 @@ Failed: lookbehind assertion is not fixed length at offset 12
|
|||
|
||||
/(?i)abc/I
|
||||
Capturing subpattern count = 0
|
||||
Options: caseless
|
||||
No options
|
||||
First char = 'a' (caseless)
|
||||
Need char = 'c' (caseless)
|
||||
|
||||
|
@ -489,7 +489,7 @@ No need char
|
|||
|
||||
/(?i)^1234/I
|
||||
Capturing subpattern count = 0
|
||||
Options: anchored caseless
|
||||
Options: anchored
|
||||
No first char
|
||||
No need char
|
||||
|
||||
|
@ -502,7 +502,7 @@ No need char
|
|||
/(?s).*/I
|
||||
Capturing subpattern count = 0
|
||||
May match empty string
|
||||
Options: anchored dotall
|
||||
Options: anchored
|
||||
No first char
|
||||
No need char
|
||||
|
||||
|
@ -516,7 +516,7 @@ Starting chars: a b c d
|
|||
|
||||
/(?i)[abcd]/IS
|
||||
Capturing subpattern count = 0
|
||||
Options: caseless
|
||||
No options
|
||||
No first char
|
||||
No need char
|
||||
Subject length lower bound = 1
|
||||
|
@ -524,7 +524,7 @@ Starting chars: A B C D a b c d
|
|||
|
||||
/(?m)[xy]|(b|c)/IS
|
||||
Capturing subpattern count = 1
|
||||
Options: multiline
|
||||
No options
|
||||
No first char
|
||||
No need char
|
||||
Subject length lower bound = 1
|
||||
|
@ -538,7 +538,7 @@ No need char
|
|||
|
||||
/(?i)(^a|^b)/Im
|
||||
Capturing subpattern count = 1
|
||||
Options: caseless multiline
|
||||
Options: multiline
|
||||
First char at start or follows newline
|
||||
No need char
|
||||
|
||||
|
@ -555,13 +555,13 @@ Failed: malformed number or name after (?( at offset 4
|
|||
Failed: malformed number or name after (?( at offset 4
|
||||
|
||||
/(?(?i))/
|
||||
Failed: assertion expected after (?( at offset 3
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 3
|
||||
|
||||
/(?(abc))/
|
||||
Failed: reference to non-existent subpattern at offset 7
|
||||
|
||||
/(?(?<ab))/
|
||||
Failed: assertion expected after (?( at offset 3
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 3
|
||||
|
||||
/((?s)blah)\s+\1/I
|
||||
Capturing subpattern count = 1
|
||||
|
@ -1179,7 +1179,7 @@ No need char
|
|||
End
|
||||
------------------------------------------------------------------
|
||||
Capturing subpattern count = 1
|
||||
Options: anchored dotall
|
||||
Options: anchored
|
||||
No first char
|
||||
No need char
|
||||
|
||||
|
@ -2735,7 +2735,7 @@ No match
|
|||
End
|
||||
------------------------------------------------------------------
|
||||
Capturing subpattern count = 0
|
||||
Options: caseless extended
|
||||
Options: extended
|
||||
First char = 'a' (caseless)
|
||||
Need char = 'c' (caseless)
|
||||
|
||||
|
@ -2748,7 +2748,7 @@ Need char = 'c' (caseless)
|
|||
End
|
||||
------------------------------------------------------------------
|
||||
Capturing subpattern count = 0
|
||||
Options: caseless extended
|
||||
Options: extended
|
||||
First char = 'a' (caseless)
|
||||
Need char = 'c' (caseless)
|
||||
|
||||
|
@ -3095,7 +3095,7 @@ Need char = 'b'
|
|||
End
|
||||
------------------------------------------------------------------
|
||||
Capturing subpattern count = 0
|
||||
Options: ungreedy
|
||||
No options
|
||||
First char = 'x'
|
||||
Need char = 'b'
|
||||
xaaaab
|
||||
|
@ -3497,7 +3497,7 @@ Need char = 'c'
|
|||
|
||||
/(?i)[ab]/IS
|
||||
Capturing subpattern count = 0
|
||||
Options: caseless
|
||||
No options
|
||||
No first char
|
||||
No need char
|
||||
Subject length lower bound = 1
|
||||
|
@ -6299,7 +6299,7 @@ Capturing subpattern count = 3
|
|||
Named capturing subpatterns:
|
||||
A 2
|
||||
A 3
|
||||
Options: anchored dupnames
|
||||
Options: anchored
|
||||
Duplicate name status changes
|
||||
No first char
|
||||
No need char
|
||||
|
@ -7870,7 +7870,7 @@ No match
|
|||
Failed: malformed number or name after (?( at offset 6
|
||||
|
||||
/(?(''))/
|
||||
Failed: assertion expected after (?( at offset 4
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 4
|
||||
|
||||
/(?('R')stuff)/
|
||||
Failed: reference to non-existent subpattern at offset 7
|
||||
|
@ -14346,7 +14346,7 @@ No match
|
|||
"((?2)+)((?1))"
|
||||
|
||||
"(?(?<E>.*!.*)?)"
|
||||
Failed: assertion expected after (?( at offset 3
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 3
|
||||
|
||||
"X((?2)()*+){2}+"BZ
|
||||
------------------------------------------------------------------
|
||||
|
@ -14574,4 +14574,100 @@ No match
|
|||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/L(?#(|++<!(2)?/BZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
L?+
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/L(?#(|++<!(2)?/BOZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
L?
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/L(?#(|++<!(2)?/BCZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
Callout 255 0 14
|
||||
L?+
|
||||
Callout 255 14 0
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/L(?#(|++<!(2)?/BCOZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
Callout 255 0 14
|
||||
L?
|
||||
Callout 255 14 0
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/(A*)\E+/CBZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
Callout 255 0 7
|
||||
SCBra 1
|
||||
Callout 255 1 2
|
||||
A*
|
||||
Callout 255 3 0
|
||||
KetRmax
|
||||
Callout 255 7 0
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/()\Q\E*]/BCZ
|
||||
------------------------------------------------------------------
|
||||
Bra
|
||||
Callout 255 0 7
|
||||
Brazero
|
||||
SCBra 1
|
||||
Callout 255 1 0
|
||||
KetRmax
|
||||
Callout 255 7 1
|
||||
]
|
||||
Callout 255 8 0
|
||||
Ket
|
||||
End
|
||||
------------------------------------------------------------------
|
||||
|
||||
/(?<A>)(?J:(?<B>)(?<B>))(?<C>)/
|
||||
\O\CC
|
||||
Matched, but too many substrings
|
||||
copy substring C failed -7
|
||||
|
||||
/(?=a\K)/
|
||||
ring bpattingbobnd $ 1,oern cou \rb\L
|
||||
Start of matched string is beyond its end - displaying from end to start.
|
||||
0: a
|
||||
0L
|
||||
|
||||
/(?<=((?C)0))/
|
||||
9010
|
||||
--->9010
|
||||
0 ^ 0
|
||||
0 ^ 0
|
||||
0:
|
||||
1: 0
|
||||
abcd
|
||||
--->abcd
|
||||
0 ^ 0
|
||||
0 ^ 0
|
||||
0 ^ 0
|
||||
0 ^ 0
|
||||
No match
|
||||
|
||||
/((?J)(?'R'(?'R'(?'R'(?'R'(?'R'(?|(\k'R'))))))))/
|
||||
|
||||
/\N(?(?C)0?!.)*/
|
||||
Failed: assertion expected after (?( or (?(?C) at offset 4
|
||||
|
||||
/-- End of testinput2 --/
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue