support max_connections and max_user_connections
This commit is contained in:
		@ -1695,6 +1695,11 @@ typedef enum ObItemType {
 | 
			
		||||
  T_RANGE_PARTITION_LIST,
 | 
			
		||||
  T_LIST_PARTITION_LIST,
 | 
			
		||||
 | 
			
		||||
  T_USER_RESOURCE_OPTIONS,
 | 
			
		||||
  T_MAX_CONNECTIONS_PER_HOUR,
 | 
			
		||||
  T_MAX_USER_CONNECTIONS,
 | 
			
		||||
  T_MAX_QUERIES_PER_HOUR,
 | 
			
		||||
  T_MAX_UPDATES_PER_HOUR,
 | 
			
		||||
  T_MAX  // Attention: add a new type before T_MAX
 | 
			
		||||
} ObItemType;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -417,6 +417,7 @@ END_P SET_VAR DELIMITER
 | 
			
		||||
%type <node> opt_match_option
 | 
			
		||||
%type <ival> match_action
 | 
			
		||||
%type <node> opt_reference_option_list reference_option require_specification tls_option_list tls_option
 | 
			
		||||
%type <node> opt_resource_option resource_option_list resource_option
 | 
			
		||||
%type <ival> reference_action
 | 
			
		||||
%type <node> alter_foreign_key_action
 | 
			
		||||
%type <node> optimize_stmt
 | 
			
		||||
@ -9371,19 +9372,23 @@ opt_desc_column_option:
 | 
			
		||||
 *
 | 
			
		||||
 *****************************************************************************/
 | 
			
		||||
create_user_stmt:
 | 
			
		||||
CREATE USER opt_if_not_exists user_specification_list
 | 
			
		||||
CREATE USER opt_if_not_exists user_specification_list opt_resource_option
 | 
			
		||||
{
 | 
			
		||||
  ParseNode *users_node = NULL;
 | 
			
		||||
  merge_nodes(users_node, result, T_USERS, $4);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER, 3, $3, users_node, NULL);
 | 
			
		||||
  ParseNode *res_opt_node = NULL;
 | 
			
		||||
  merge_nodes(res_opt_node, result, T_USER_RESOURCE_OPTIONS, $5);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER, 4, $3, users_node, NULL, res_opt_node);
 | 
			
		||||
}
 | 
			
		||||
| CREATE USER opt_if_not_exists user_specification_list require_specification
 | 
			
		||||
| CREATE USER opt_if_not_exists user_specification_list require_specification opt_resource_option
 | 
			
		||||
{
 | 
			
		||||
  ParseNode *users_node = NULL;
 | 
			
		||||
  merge_nodes(users_node, result, T_USERS, $4);
 | 
			
		||||
  ParseNode *require_node = NULL;
 | 
			
		||||
  merge_nodes(require_node, result, T_TLS_OPTIONS, $5);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER, 3, $3, users_node, require_node);
 | 
			
		||||
  ParseNode *res_opt_node = NULL;
 | 
			
		||||
  merge_nodes(res_opt_node, result, T_USER_RESOURCE_OPTIONS, $6);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_CREATE_USER, 4, $3, users_node, require_node, res_opt_node);
 | 
			
		||||
}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
@ -9443,6 +9448,52 @@ REQUIRE NONE
 | 
			
		||||
}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
opt_resource_option:
 | 
			
		||||
WITH resource_option_list
 | 
			
		||||
{
 | 
			
		||||
  $$ = $2;
 | 
			
		||||
}
 | 
			
		||||
|
 | 
			
		||||
{
 | 
			
		||||
  $$ = NULL;
 | 
			
		||||
}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
resource_option_list:
 | 
			
		||||
resource_option_list resource_option
 | 
			
		||||
{
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_LINK_NODE, 2, $1, $2);
 | 
			
		||||
}
 | 
			
		||||
| resource_option
 | 
			
		||||
{
 | 
			
		||||
  $$ = $1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
resource_option:
 | 
			
		||||
MAX_CONNECTIONS_PER_HOUR INTNUM
 | 
			
		||||
{
 | 
			
		||||
  malloc_terminal_node($$, result->malloc_pool_, T_MAX_CONNECTIONS_PER_HOUR);
 | 
			
		||||
  $$->value_ = $2->value_;
 | 
			
		||||
}
 | 
			
		||||
| MAX_USER_CONNECTIONS INTNUM
 | 
			
		||||
{
 | 
			
		||||
  malloc_terminal_node($$, result->malloc_pool_, T_MAX_USER_CONNECTIONS);
 | 
			
		||||
  $$->value_ = $2->value_;
 | 
			
		||||
}
 | 
			
		||||
/*
 | 
			
		||||
| MAX_QUERIES_PER_HOUR INTNUM
 | 
			
		||||
{
 | 
			
		||||
  malloc_terminal_node($$, result->malloc_pool_, T_MAX_QUERIES_PER_HOUR);
 | 
			
		||||
  $$->value_ = $2->value_;
 | 
			
		||||
}
 | 
			
		||||
| MAX_UPDATES_PER_HOUR INTNUM
 | 
			
		||||
{
 | 
			
		||||
  malloc_terminal_node($$, result->malloc_pool_, T_MAX_UPDATES_PER_HOUR);
 | 
			
		||||
  $$->value_ = $2->value_;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
tls_option_list:
 | 
			
		||||
tls_option
 | 
			
		||||
{
 | 
			
		||||
@ -9572,6 +9623,12 @@ SET PASSWORD opt_for_user COMP_EQ STRING_VALUE
 | 
			
		||||
  merge_nodes(require_node, result, T_TLS_OPTIONS, $4);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, NULL, NULL, require_node);
 | 
			
		||||
}
 | 
			
		||||
| ALTER USER user_with_host_name WITH resource_option_list
 | 
			
		||||
{
 | 
			
		||||
  ParseNode *res_opt_node = NULL;
 | 
			
		||||
  merge_nodes(res_opt_node, result, T_USER_RESOURCE_OPTIONS, $5);
 | 
			
		||||
  malloc_non_terminal_node($$, result->malloc_pool_, T_SET_PASSWORD, 4, $3, NULL, NULL, res_opt_node);
 | 
			
		||||
}
 | 
			
		||||
;
 | 
			
		||||
 | 
			
		||||
opt_for_user:
 | 
			
		||||
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@ -372,6 +372,7 @@ const char* get_type_name(int type)
 | 
			
		||||
	case T_FUN_SYS_QUARTER : return "T_FUN_SYS_QUARTER";
 | 
			
		||||
	case T_FUN_SYS_BIT_LENGTH : return "T_FUN_SYS_BIT_LENGTH";
 | 
			
		||||
	case T_FUN_SYS_PI : return "T_FUN_SYS_PI";
 | 
			
		||||
	case T_FUN_SYS_EXPORT_SET : return "T_FUN_SYS_EXPORT_SET";
 | 
			
		||||
	case T_MYSQL_ONLY_SYS_MAX_OP : return "T_MYSQL_ONLY_SYS_MAX_OP";
 | 
			
		||||
	case T_FUN_SYS_CONNECT_BY_PATH : return "T_FUN_SYS_CONNECT_BY_PATH";
 | 
			
		||||
	case T_FUN_SYS_SYSTIMESTAMP : return "T_FUN_SYS_SYSTIMESTAMP";
 | 
			
		||||
@ -1553,7 +1554,11 @@ const char* get_type_name(int type)
 | 
			
		||||
	case T_HASH_PARTITION_LIST : return "T_HASH_PARTITION_LIST";
 | 
			
		||||
	case T_RANGE_PARTITION_LIST : return "T_RANGE_PARTITION_LIST";
 | 
			
		||||
	case T_LIST_PARTITION_LIST : return "T_LIST_PARTITION_LIST";
 | 
			
		||||
	case T_FUN_SYS_EXPORT_SET : return "T_FUN_SYS_EXPORT_SET";
 | 
			
		||||
	case T_USER_RESOURCE_OPTIONS : return "T_USER_RESOURCE_OPTIONS";
 | 
			
		||||
	case T_MAX_CONNECTIONS_PER_HOUR : return "T_MAX_CONNECTIONS_PER_HOUR";
 | 
			
		||||
	case T_MAX_USER_CONNECTIONS : return "T_MAX_USER_CONNECTIONS";
 | 
			
		||||
	case T_MAX_QUERIES_PER_HOUR : return "T_MAX_QUERIES_PER_HOUR";
 | 
			
		||||
	case T_MAX_UPDATES_PER_HOUR : return "T_MAX_UPDATES_PER_HOUR";
 | 
			
		||||
	default:return "Unknown";
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user