diff options
author | Monty <monty@mariadb.org> | 2017-04-23 19:39:57 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2017-04-23 22:35:46 +0300 |
commit | 5a759d31f766087d5e135e1d3d3d987693bc9b88 (patch) | |
tree | 93c7359e8b211e269bfa73e5f595f34b9dca575a /include | |
parent | cba84469eb96481568a9f4ddf3f2989c49c9294c (diff) | |
download | mariadb-git-5a759d31f766087d5e135e1d3d3d987693bc9b88.tar.gz |
Changing field::field_name and Item::name to LEX_CSTRING
Benefits of this patch:
- Removed a lot of calls to strlen(), especially for field_string
- Strings generated by parser are now const strings, less chance of
accidently changing a string
- Removed a lot of calls with LEX_STRING as parameter (changed to pointer)
- More uniform code
- Item::name_length was not kept up to date. Now fixed
- Several bugs found and fixed (Access to null pointers,
access of freed memory, wrong arguments to printf like functions)
- Removed a lot of casts from (const char*) to (char*)
Changes:
- This caused some ABI changes
- lex_string_set now uses LEX_CSTRING
- Some fucntions are now taking const char* instead of char*
- Create_field::change and after changed to LEX_CSTRING
- handler::connect_string, comment and engine_name() changed to LEX_CSTRING
- Checked printf() related calls to find bugs. Found and fixed several
errors in old code.
- A lot of changes from LEX_STRING to LEX_CSTRING, especially related to
parsing and events.
- Some changes from LEX_STRING and LEX_STRING & to LEX_CSTRING*
- Some changes for char* to const char*
- Added printf argument checking for my_snprintf()
- Introduced null_clex_str, star_clex_string, temp_lex_str to simplify
code
- Added item_empty_name and item_used_name to be able to distingush between
items that was given an empty name and items that was not given a name
This is used in sql_yacc.yy to know when to give an item a name.
- select table_name."*' is not anymore same as table_name.*
- removed not used function Item::rename()
- Added comparision of item->name_length before some calls to
my_strcasecmp() to speed up comparison
- Moved Item_sp_variable::make_field() from item.h to item.cc
- Some minimal code changes to avoid copying to const char *
- Fixed wrong error message in wsrep_mysql_parse()
- Fixed wrong code in find_field_in_natural_join() where real_item() was
set when it shouldn't
- ER_ERROR_ON_RENAME was used with extra arguments.
- Removed some (wrong) ER_OUTOFMEMORY, as alloc_root will already
give the error.
TODO:
- Check possible unsafe casts in plugin/auth_examples/qa_auth_interface.c
- Change code to not modify LEX_CSTRING for database name
(as part of lower_case_table_names)
Diffstat (limited to 'include')
-rw-r--r-- | include/m_string.h | 13 | ||||
-rw-r--r-- | include/my_time.h | 2 | ||||
-rw-r--r-- | include/mysql.h.pp | 2 | ||||
-rw-r--r-- | include/mysql/plugin_audit.h.pp | 19 | ||||
-rw-r--r-- | include/mysql/plugin_auth.h | 2 | ||||
-rw-r--r-- | include/mysql/plugin_auth.h.pp | 21 | ||||
-rw-r--r-- | include/mysql/plugin_encryption.h.pp | 19 | ||||
-rw-r--r-- | include/mysql/plugin_ftparser.h.pp | 19 | ||||
-rw-r--r-- | include/mysql/plugin_password_validation.h | 4 | ||||
-rw-r--r-- | include/mysql/plugin_password_validation.h.pp | 23 | ||||
-rw-r--r-- | include/mysql/service_my_snprintf.h | 15 | ||||
-rw-r--r-- | include/mysql/service_thd_alloc.h | 17 | ||||
-rw-r--r-- | include/mysql_com.h | 2 |
13 files changed, 111 insertions, 47 deletions
diff --git a/include/m_string.h b/include/m_string.h index 708c2562e0f..f06acbea358 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -212,11 +212,6 @@ extern ulonglong strtoull(const char *str, char **ptr, int base); #define USTRING_WITH_LEN(X) ((uchar*) X), ((size_t) (sizeof(X) - 1)) #define C_STRING_WITH_LEN(X) ((char *) (X)), ((size_t) (sizeof(X) - 1)) -struct st_mysql_const_lex_string -{ - const char *str; - size_t length; -}; typedef struct st_mysql_const_lex_string LEX_CSTRING; /* A variant with const and unsigned */ @@ -227,15 +222,15 @@ struct st_mysql_const_unsigned_lex_string }; typedef struct st_mysql_const_unsigned_lex_string LEX_CUSTRING; -static inline void lex_string_set(LEX_STRING *lex_str, const char *c_str) +static inline void lex_string_set(LEX_CSTRING *lex_str, const char *c_str) { - lex_str->str= (char *) c_str; + lex_str->str= c_str; lex_str->length= strlen(c_str); } -static inline void lex_string_set3(LEX_STRING *lex_str, const char *c_str, +static inline void lex_string_set3(LEX_CSTRING *lex_str, const char *c_str, size_t len) { - lex_str->str= (char *) c_str; + lex_str->str= c_str; lex_str->length= len; } diff --git a/include/my_time.h b/include/my_time.h index 90d19c8861a..02e8f32ee23 100644 --- a/include/my_time.h +++ b/include/my_time.h @@ -173,8 +173,10 @@ static inline my_bool validate_timestamp_range(const MYSQL_TIME *t) } /* Can't include mysqld_error.h, it needs mysys to build, thus hardcode 2 error values here. */ +#ifndef ER_WARN_DATA_OUT_OF_RANGE #define ER_WARN_DATA_OUT_OF_RANGE 1264 #define ER_WARN_INVALID_TIMESTAMP 1299 +#endif my_time_t my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone, uint *error_code); diff --git a/include/mysql.h.pp b/include/mysql.h.pp index 517516aeb30..3316574a423 100644 --- a/include/mysql.h.pp +++ b/include/mysql.h.pp @@ -136,7 +136,7 @@ typedef struct st_udf_args char **args; unsigned long *lengths; char *maybe_null; - char **attributes; + const char **attributes; unsigned long *attribute_lengths; void *extension; } UDF_ARGS; diff --git a/include/mysql/plugin_audit.h.pp b/include/mysql/plugin_audit.h.pp index 2adde48dc22..1772c0f6b87 100644 --- a/include/mysql/plugin_audit.h.pp +++ b/include/mysql/plugin_audit.h.pp @@ -141,7 +141,8 @@ extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ; size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); extern struct progress_report_service_st { void (*thd_progress_init_func)(void* thd, unsigned int max_stage); @@ -233,13 +234,20 @@ struct st_mysql_lex_string size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, unsigned int); void *(*thd_calloc_func)(void*, unsigned int); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, unsigned int); void *(*thd_memdup_func)(void*, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(void*, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; void *thd_alloc(void* thd, unsigned int size); @@ -247,9 +255,10 @@ void *thd_calloc(void* thd, unsigned int size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, unsigned int size); void *thd_memdup(void* thd, const void* str, unsigned int size); -MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(void* thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); extern struct thd_autoinc_service_st { void (*thd_get_autoinc_func)(const void* thd, unsigned long* off, unsigned long* inc); diff --git a/include/mysql/plugin_auth.h b/include/mysql/plugin_auth.h index 807bfd4e652..638d9b57fd9 100644 --- a/include/mysql/plugin_auth.h +++ b/include/mysql/plugin_auth.h @@ -51,7 +51,7 @@ typedef struct st_mysql_server_auth_info User name as sent by the client and shown in USER(). NULL if the client packet with the user name was not received yet. */ - char *user_name; + const char *user_name; /** Length of user_name diff --git a/include/mysql/plugin_auth.h.pp b/include/mysql/plugin_auth.h.pp index a9cb8044c4f..bc873626fab 100644 --- a/include/mysql/plugin_auth.h.pp +++ b/include/mysql/plugin_auth.h.pp @@ -141,7 +141,8 @@ extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ; size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); extern struct progress_report_service_st { void (*thd_progress_init_func)(void* thd, unsigned int max_stage); @@ -233,13 +234,20 @@ struct st_mysql_lex_string size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, unsigned int); void *(*thd_calloc_func)(void*, unsigned int); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, unsigned int); void *(*thd_memdup_func)(void*, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(void*, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; void *thd_alloc(void* thd, unsigned int size); @@ -247,9 +255,10 @@ void *thd_calloc(void* thd, unsigned int size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, unsigned int size); void *thd_memdup(void* thd, const void* str, unsigned int size); -MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(void* thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); extern struct thd_autoinc_service_st { void (*thd_get_autoinc_func)(const void* thd, unsigned long* off, unsigned long* inc); @@ -501,7 +510,7 @@ typedef struct st_plugin_vio } MYSQL_PLUGIN_VIO; typedef struct st_mysql_server_auth_info { - char *user_name; + const char *user_name; unsigned int user_name_length; const char *auth_string; unsigned long auth_string_length; diff --git a/include/mysql/plugin_encryption.h.pp b/include/mysql/plugin_encryption.h.pp index 4675f0cf6ec..4113e6d24a9 100644 --- a/include/mysql/plugin_encryption.h.pp +++ b/include/mysql/plugin_encryption.h.pp @@ -141,7 +141,8 @@ extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ; size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); extern struct progress_report_service_st { void (*thd_progress_init_func)(void* thd, unsigned int max_stage); @@ -233,13 +234,20 @@ struct st_mysql_lex_string size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, unsigned int); void *(*thd_calloc_func)(void*, unsigned int); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, unsigned int); void *(*thd_memdup_func)(void*, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(void*, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; void *thd_alloc(void* thd, unsigned int size); @@ -247,9 +255,10 @@ void *thd_calloc(void* thd, unsigned int size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, unsigned int size); void *thd_memdup(void* thd, const void* str, unsigned int size); -MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(void* thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); extern struct thd_autoinc_service_st { void (*thd_get_autoinc_func)(const void* thd, unsigned long* off, unsigned long* inc); diff --git a/include/mysql/plugin_ftparser.h.pp b/include/mysql/plugin_ftparser.h.pp index 34d968b60ab..8147d793801 100644 --- a/include/mysql/plugin_ftparser.h.pp +++ b/include/mysql/plugin_ftparser.h.pp @@ -141,7 +141,8 @@ extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ; size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); extern struct progress_report_service_st { void (*thd_progress_init_func)(void* thd, unsigned int max_stage); @@ -233,13 +234,20 @@ struct st_mysql_lex_string size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, unsigned int); void *(*thd_calloc_func)(void*, unsigned int); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, unsigned int); void *(*thd_memdup_func)(void*, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(void*, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; void *thd_alloc(void* thd, unsigned int size); @@ -247,9 +255,10 @@ void *thd_calloc(void* thd, unsigned int size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, unsigned int size); void *thd_memdup(void* thd, const void* str, unsigned int size); -MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(void* thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); extern struct thd_autoinc_service_st { void (*thd_get_autoinc_func)(const void* thd, unsigned long* off, unsigned long* inc); diff --git a/include/mysql/plugin_password_validation.h b/include/mysql/plugin_password_validation.h index 18c643e877b..e2763483db6 100644 --- a/include/mysql/plugin_password_validation.h +++ b/include/mysql/plugin_password_validation.h @@ -42,8 +42,8 @@ struct st_mariadb_password_validation Function provided by the plugin which should perform password validation and return 0 if the password has passed the validation. */ - int (*validate_password)(MYSQL_LEX_STRING *username, - MYSQL_LEX_STRING *password); + int (*validate_password)(MYSQL_CONST_LEX_STRING *username, + MYSQL_CONST_LEX_STRING *password); }; #ifdef __cplusplus diff --git a/include/mysql/plugin_password_validation.h.pp b/include/mysql/plugin_password_validation.h.pp index 5a642a55d08..929b3307f9e 100644 --- a/include/mysql/plugin_password_validation.h.pp +++ b/include/mysql/plugin_password_validation.h.pp @@ -141,7 +141,8 @@ extern struct my_snprintf_service_st { size_t (*my_snprintf_type)(char*, size_t, const char*, ...); size_t (*my_vsnprintf_type)(char *, size_t, const char*, va_list); } *my_snprintf_service; -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ; size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); extern struct progress_report_service_st { void (*thd_progress_init_func)(void* thd, unsigned int max_stage); @@ -233,13 +234,20 @@ struct st_mysql_lex_string size_t length; }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; extern struct thd_alloc_service_st { void *(*thd_alloc_func)(void*, unsigned int); void *(*thd_calloc_func)(void*, unsigned int); char *(*thd_strdup_func)(void*, const char *); char *(*thd_strmake_func)(void*, const char *, unsigned int); void *(*thd_memdup_func)(void*, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(void*, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(void*, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; void *thd_alloc(void* thd, unsigned int size); @@ -247,9 +255,10 @@ void *thd_calloc(void* thd, unsigned int size); char *thd_strdup(void* thd, const char *str); char *thd_strmake(void* thd, const char *str, unsigned int size); void *thd_memdup(void* thd, const void* str, unsigned int size); -MYSQL_LEX_STRING *thd_make_lex_string(void* thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(void* thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); extern struct thd_autoinc_service_st { void (*thd_get_autoinc_func)(const void* thd, unsigned long* off, unsigned long* inc); @@ -487,6 +496,6 @@ void thd_wakeup_subsequent_commits(void* thd, int wakeup_error); struct st_mariadb_password_validation { int interface_version; - int (*validate_password)(MYSQL_LEX_STRING *username, - MYSQL_LEX_STRING *password); + int (*validate_password)(MYSQL_CONST_LEX_STRING *username, + MYSQL_CONST_LEX_STRING *password); }; diff --git a/include/mysql/service_my_snprintf.h b/include/mysql/service_my_snprintf.h index 4a99561dd00..586a539d48c 100644 --- a/include/mysql/service_my_snprintf.h +++ b/include/mysql/service_my_snprintf.h @@ -92,9 +92,22 @@ extern struct my_snprintf_service_st { #else -size_t my_snprintf(char* to, size_t n, const char* fmt, ...); +#ifndef ATTRIBUTE_FORMAT +#define ATTRIBUTE_FORMAT_DEFINED +#define ATTRIBUTE_FORMAT(A,B,C) +#endif +#ifdef MYSQL_ABI_CHECK +#undef ATTRIBUTE_FORMAT +#define ATTRIBUTE_FORMAT(A,B,C) +#endif +size_t my_snprintf(char* to, size_t n, const char* fmt, ...) + ATTRIBUTE_FORMAT(printf, 3, 4); size_t my_vsnprintf(char *to, size_t n, const char* fmt, va_list ap); +#ifdef ATTRIBUTE_FORMAT_DEFINED +#undef ATTRIBUTE_FORMAT_DEFINED +#undef ATTRIBUTE_FORMAT +#endif #endif #ifdef __cplusplus diff --git a/include/mysql/service_thd_alloc.h b/include/mysql/service_thd_alloc.h index e92f81b52c3..8d6ed8e4190 100644 --- a/include/mysql/service_thd_alloc.h +++ b/include/mysql/service_thd_alloc.h @@ -42,13 +42,21 @@ struct st_mysql_lex_string }; typedef struct st_mysql_lex_string MYSQL_LEX_STRING; +struct st_mysql_const_lex_string +{ + const char *str; + size_t length; +}; +typedef struct st_mysql_const_lex_string MYSQL_CONST_LEX_STRING; + extern struct thd_alloc_service_st { void *(*thd_alloc_func)(MYSQL_THD, unsigned int); void *(*thd_calloc_func)(MYSQL_THD, unsigned int); char *(*thd_strdup_func)(MYSQL_THD, const char *); char *(*thd_strmake_func)(MYSQL_THD, const char *, unsigned int); void *(*thd_memdup_func)(MYSQL_THD, const void*, unsigned int); - MYSQL_LEX_STRING *(*thd_make_lex_string_func)(MYSQL_THD, MYSQL_LEX_STRING *, + MYSQL_CONST_LEX_STRING *(*thd_make_lex_string_func)(MYSQL_THD, + MYSQL_CONST_LEX_STRING *, const char *, unsigned int, int); } *thd_alloc_service; @@ -115,9 +123,10 @@ void *thd_memdup(MYSQL_THD thd, const void* str, unsigned int size); @see thd_alloc() */ -MYSQL_LEX_STRING *thd_make_lex_string(MYSQL_THD thd, MYSQL_LEX_STRING *lex_str, - const char *str, unsigned int size, - int allocate_lex_string); +MYSQL_CONST_LEX_STRING +*thd_make_lex_string(MYSQL_THD thd, MYSQL_CONST_LEX_STRING *lex_str, + const char *str, unsigned int size, + int allocate_lex_string); #endif diff --git a/include/mysql_com.h b/include/mysql_com.h index ace54767b06..d24957d1990 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -634,7 +634,7 @@ typedef struct st_udf_args char **args; /* Pointer to argument */ unsigned long *lengths; /* Length of string arguments */ char *maybe_null; /* Set to 1 for all maybe_null args */ - char **attributes; /* Pointer to attribute name */ + const char **attributes; /* Pointer to attribute name */ unsigned long *attribute_lengths; /* Length of attribute arguments */ void *extension; } UDF_ARGS; |