This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 9c86cad4ec [improvement](session variable) add max execution time 
session variabe like mysql and add setter attributes in variables (#19759)
9c86cad4ec is described below

commit 9c86cad4eccf65f83ab83e5aab453e019693675d
Author: yiguolei <[email protected]>
AuthorDate: Fri May 19 12:42:47 2023 +0800

    [improvement](session variable) add max execution time session variabe like 
mysql and add setter attributes in variables (#19759)
    
    1. add session variable max_execution_time to an alias of query timeout, if 
user set max_execution_time, the query timeout will be modified too.
    2. add a setter attribute to session variable, so that we could add some 
logic in setter method instead of field reflection.
---
 .../java/org/apache/doris/qe/SessionVariable.java  | 23 +++++
 .../main/java/org/apache/doris/qe/VariableMgr.java | 99 ++++++++++++----------
 .../test_set_session_default_val.groovy            | 15 ++++
 3 files changed, 94 insertions(+), 43 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 00d4bf82c9..7018bcaa67 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -65,6 +65,7 @@ public class SessionVariable implements Serializable, 
Writable {
     public static final String EXEC_MEM_LIMIT = "exec_mem_limit";
     public static final String SCAN_QUEUE_MEM_LIMIT = "scan_queue_mem_limit";
     public static final String QUERY_TIMEOUT = "query_timeout";
+    public static final String MAX_EXECUTION_TIME = "max_execution_time";
     public static final String INSERT_TIMEOUT = "insert_timeout";
     public static final String ENABLE_PROFILE = "enable_profile";
     public static final String SQL_MODE = "sql_mode";
@@ -367,6 +368,14 @@ public class SessionVariable implements Serializable, 
Writable {
     @VariableMgr.VarAttr(name = QUERY_TIMEOUT)
     public int queryTimeoutS = 300;
 
+    // The global max_execution_time value provides the default for the 
session value for new connections.
+    // The session value applies to SELECT executions executed within the 
session that include
+    // no MAX_EXECUTION_TIME(N) optimizer hint or for which N is 0.
+    // https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
+    // So that it is == query timeout in doris
+    @VariableMgr.VarAttr(name = MAX_EXECUTION_TIME, fuzzy = true, setter = 
"setMaxExecutionTimeMS")
+    public int maxExecutionTimeMS = -1;
+
     @VariableMgr.VarAttr(name = INSERT_TIMEOUT)
     public int insertTimeoutS = 14400;
 
@@ -1051,6 +1060,10 @@ public class SessionVariable implements Serializable, 
Writable {
         return queryTimeoutS;
     }
 
+    public int getMaxExecutionTimeMS() {
+        return maxExecutionTimeMS;
+    }
+
     public int getInsertTimeoutS() {
         return insertTimeoutS;
     }
@@ -1210,6 +1223,16 @@ public class SessionVariable implements Serializable, 
Writable {
         this.queryTimeoutS = queryTimeoutS;
     }
 
+    public void setMaxExecutionTimeMS(int maxExecutionTimeMS) {
+        this.maxExecutionTimeMS = maxExecutionTimeMS;
+        this.queryTimeoutS = this.maxExecutionTimeMS / 1000;
+    }
+
+    public void setMaxExecutionTimeMS(String maxExecutionTimeMS) {
+        this.maxExecutionTimeMS = Integer.valueOf(maxExecutionTimeMS);
+        this.queryTimeoutS = this.maxExecutionTimeMS / 1000;
+    }
+
     public String getResourceGroup() {
         return resourceGroup;
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
index f714bb2d8b..1d58c07f54 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java
@@ -159,50 +159,60 @@ public class VariableMgr {
                 ErrorReport.reportDdlException(ErrorCode.ERR_INVALID_VALUE, 
attr.name(), value, e.getMessage());
             }
         }
-        try {
-            switch (field.getType().getSimpleName()) {
-                case "boolean":
-                    if (value.equalsIgnoreCase("ON")
-                            || value.equalsIgnoreCase("TRUE")
-                            || value.equalsIgnoreCase("1")) {
-                        field.setBoolean(obj, true);
-                    } else if (value.equalsIgnoreCase("OFF")
-                            || value.equalsIgnoreCase("FALSE")
-                            || value.equalsIgnoreCase("0")) {
-                        field.setBoolean(obj, false);
-                    } else {
-                        throw new IllegalAccessException();
-                    }
-                    break;
-                case "byte":
-                    field.setByte(obj, Byte.valueOf(value));
-                    break;
-                case "short":
-                    field.setShort(obj, Short.valueOf(value));
-                    break;
-                case "int":
-                    field.setInt(obj, Integer.valueOf(value));
-                    break;
-                case "long":
-                    field.setLong(obj, Long.valueOf(value));
-                    break;
-                case "float":
-                    field.setFloat(obj, Float.valueOf(value));
-                    break;
-                case "double":
-                    field.setDouble(obj, Double.valueOf(value));
-                    break;
-                case "String":
-                    field.set(obj, value);
-                    break;
-                default:
-                    // Unsupported type variable.
-                    
ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_TYPE_FOR_VAR, attr.name());
+        // If the session variable has specified the setter, then not use 
reflect
+        if (!attr.setter().equals("")) {
+            Preconditions.checkArgument(obj instanceof SessionVariable);
+            try {
+                SessionVariable.class.getDeclaredMethod(attr.setter(), 
String.class).invoke(obj, value);
+            } catch (Exception e) {
+                ErrorReport.reportDdlException(ErrorCode.ERR_INVALID_VALUE, 
attr.name(), value, e.getMessage());
+            }
+        } else  {
+            try {
+                switch (field.getType().getSimpleName()) {
+                    case "boolean":
+                        if (value.equalsIgnoreCase("ON")
+                                || value.equalsIgnoreCase("TRUE")
+                                || value.equalsIgnoreCase("1")) {
+                            field.setBoolean(obj, true);
+                        } else if (value.equalsIgnoreCase("OFF")
+                                || value.equalsIgnoreCase("FALSE")
+                                || value.equalsIgnoreCase("0")) {
+                            field.setBoolean(obj, false);
+                        } else {
+                            throw new IllegalAccessException();
+                        }
+                        break;
+                    case "byte":
+                        field.setByte(obj, Byte.valueOf(value));
+                        break;
+                    case "short":
+                        field.setShort(obj, Short.valueOf(value));
+                        break;
+                    case "int":
+                        field.setInt(obj, Integer.valueOf(value));
+                        break;
+                    case "long":
+                        field.setLong(obj, Long.valueOf(value));
+                        break;
+                    case "float":
+                        field.setFloat(obj, Float.valueOf(value));
+                        break;
+                    case "double":
+                        field.setDouble(obj, Double.valueOf(value));
+                        break;
+                    case "String":
+                        field.set(obj, value);
+                        break;
+                    default:
+                        // Unsupported type variable.
+                        
ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_TYPE_FOR_VAR, attr.name());
+                }
+            } catch (NumberFormatException e) {
+                
ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_TYPE_FOR_VAR, attr.name());
+            } catch (IllegalAccessException e) {
+                
ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_VALUE_FOR_VAR, attr.name(), 
value);
             }
-        } catch (NumberFormatException e) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_TYPE_FOR_VAR, 
attr.name());
-        } catch (IllegalAccessException e) {
-            ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_VALUE_FOR_VAR, 
attr.name(), value);
         }
 
         if (VariableVarCallbacks.hasCallback(attr.name())) {
@@ -652,6 +662,9 @@ public class VariableMgr {
         // the checker function should be: public void checker(String value), 
value is the input string.
         String checker() default "";
 
+        // could specify the setter method for a variable, not depend on 
reflect mechanism
+        String setter() default "";
+
         // Set to true if the variables need to be forwarded along with 
forward statement.
         boolean needForward() default false;
 
diff --git 
a/regression-test/suites/correctness/test_set_session_default_val.groovy 
b/regression-test/suites/correctness/test_set_session_default_val.groovy
index 26a2aec639..6cf3923fa8 100644
--- a/regression-test/suites/correctness/test_set_session_default_val.groovy
+++ b/regression-test/suites/correctness/test_set_session_default_val.groovy
@@ -21,4 +21,19 @@ suite("test_set_session_default_val") {
     sql """set session insert_timeout=${default_timeout[0][1]};"""
     def session_timeout = sql """show variables where variable_name = 
'insert_timeout';"""
     assertEquals(default_timeout, session_timeout)
+
+    def default_query_timeout = sql """show variables where variable_name = 
'query_timeout';"""
+    def default_max_execute_timeout = sql """show variables where 
variable_name = 'max_execution_time';"""
+
+    sql """set query_timeout=2;"""
+    def query_timeout = sql """show variables where variable_name = 
'query_timeout';"""
+    def max_execute_timeout = sql """show variables where variable_name = 
'max_execution_time';"""
+    assertEquals(query_timeout[0][1], "2")
+    assertEquals(max_execute_timeout[0][1], default_max_execute_timeout[0][1])
+
+    sql """set max_execution_time=3000;"""
+    def query_timeout2 = sql """show variables where variable_name = 
'query_timeout';"""
+    def max_execute_timeout2 = sql """show variables where variable_name = 
'max_execution_time';"""
+    assertEquals(query_timeout2[0][1], "3")
+    assertEquals(max_execute_timeout2[0][1], "3000")
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to