This is an automated email from the ASF dual-hosted git repository.
dataroaring 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 543576227db [Featrue](default value) add pi as default value (#36280)
543576227db is described below
commit 543576227db1521e66c2d32a6fa522c1a7a7aa61
Author: Liu Zhenlong <[email protected]>
AuthorDate: Wed Jun 26 20:21:34 2024 +0800
[Featrue](default value) add pi as default value (#36280)
## Proposed changes
Issue Number: refers https://github.com/apache/doris/issues/34228
<!--Describe your changes.-->
add pi as default value, such as:
```sql
CREATE TABLE IF NOT EXISTS t1
(
k TINYINT,
v double not null DEFAULT PI
)
UNIQUE KEY(k)
DISTRIBUTED BY HASH(k)
PROPERTIES("replication_num" = "1");
```
---
.../antlr4/org/apache/doris/nereids/DorisLexer.g4 | 1 +
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 3 +-
.../antlr4/org/apache/doris/nereids/PLParser.g4 | 1 +
.../java/org/apache/doris/analysis/ColumnDef.java | 9 ++
.../doris/nereids/parser/LogicalPlanBuilder.java | 2 +
.../trees/plans/commands/info/DefaultValue.java | 5 +
.../data/correctness_p0/test_default_pi.out | 28 +++++
.../correctness_p0/test_default_pi_streamload.csv | 2 +
.../suites/correctness_p0/test_default_pi.groovy | 123 +++++++++++++++++++++
9 files changed, 173 insertions(+), 1 deletion(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
index 9971d277ebe..5ed655c212a 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisLexer.g4
@@ -415,6 +415,7 @@ PERCENT: 'PERCENT';
PERIOD: 'PERIOD';
PERMISSIVE: 'PERMISSIVE';
PHYSICAL: 'PHYSICAL';
+PI: 'PI';
PLACEHOLDER: '?';
PLAN: 'PLAN';
PRIVILEGES: 'PRIVILEGES';
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 68da90f9da1..ee9b91fdf6f 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -588,7 +588,7 @@ columnDef
((GENERATED ALWAYS)? AS LEFT_PAREN generatedExpr=expression
RIGHT_PAREN)?
((NOT)? nullable=NULL)?
(AUTO_INCREMENT (LEFT_PAREN autoIncInitValue=number RIGHT_PAREN)?)?
- (DEFAULT (nullValue=NULL | INTEGER_VALUE | DECIMAL_VALUE |
stringValue=STRING_LITERAL
+ (DEFAULT (nullValue=NULL | INTEGER_VALUE | DECIMAL_VALUE | PI |
stringValue=STRING_LITERAL
| CURRENT_DATE | defaultTimestamp=CURRENT_TIMESTAMP (LEFT_PAREN
defaultValuePrecision=number RIGHT_PAREN)?))?
(ON UPDATE CURRENT_TIMESTAMP (LEFT_PAREN onUpdateValuePrecision=number
RIGHT_PAREN)?)?
(COMMENT comment=STRING_LITERAL)?
@@ -1237,6 +1237,7 @@ nonReserved
| PERIOD
| PERMISSIVE
| PHYSICAL
+ | PI
| PLAN
| PLUGIN
| PLUGINS
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
index f8dc6039145..e967da2f955 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/PLParser.g4
@@ -884,6 +884,7 @@ non_reserved_words : // Tokens that
are not reserved words
| PART_LOC
| PCTFREE
| PCTUSED
+ | PI
| PRECISION
| PRESERVE
| PRINT
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java
b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java
index f306bb782fe..e01a4f11793 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ColumnDef.java
@@ -99,6 +99,7 @@ public class ColumnDef {
this.defaultValueExprDef = new DefaultValueExprDef(exprName,
precision);
}
+ public static String PI = "PI";
public static String CURRENT_DATE = "CURRENT_DATE";
// default "CURRENT_TIMESTAMP", only for DATETIME type
public static String CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
@@ -526,6 +527,14 @@ public class ColumnDef {
throw new AnalysisException("Types other than DATE and
DATEV2 "
+ "cannot use current_date as the default value");
}
+ } else if (null != defaultValueExprDef
+ &&
defaultValueExprDef.getExprName().equalsIgnoreCase(DefaultValue.PI)) {
+ switch (primitiveType) {
+ case DOUBLE:
+ break;
+ default:
+ throw new AnalysisException("Types other than DOUBLE
cannot use pi as the default value");
+ }
}
switch (primitiveType) {
case TINYINT:
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index f092701fce6..d9a0a49753d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -2712,6 +2712,8 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
}
} else if (ctx.CURRENT_DATE() != null) {
defaultValue =
Optional.of(DefaultValue.CURRENT_DATE_DEFAULT_VALUE);
+ } else if (ctx.PI() != null) {
+ defaultValue = Optional.of(DefaultValue.PI_DEFAULT_VALUE);
}
}
if (ctx.UPDATE() != null) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DefaultValue.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DefaultValue.java
index 48a22daf7b7..6df1d3d7cf1 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DefaultValue.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/DefaultValue.java
@@ -24,6 +24,7 @@ import org.apache.doris.catalog.ScalarType;
* default value of a column.
*/
public class DefaultValue {
+ public static String PI = "PI";
public static String CURRENT_DATE = "CURRENT_DATE";
public static String CURRENT_TIMESTAMP = "CURRENT_TIMESTAMP";
public static String NOW = "now";
@@ -40,6 +41,10 @@ public class DefaultValue {
public static DefaultValue BITMAP_EMPTY_DEFAULT_VALUE = new
DefaultValue(ZERO);
// default "value", "[]" means empty array
public static DefaultValue ARRAY_EMPTY_DEFAULT_VALUE = new
DefaultValue("[]");
+ // default "value", "3.14159265358979323846" means pi, refer to M_PI in
<math.h>.
+ // M_PI is enough for type double because the precision of type double is
15~16 digits.
+ // but it is not adequate for computation using long double. in this case,
use M_PIl in <math.h>.
+ public static DefaultValue PI_DEFAULT_VALUE = new
DefaultValue("3.14159265358979323846", PI);
private final String value;
// used for column which defaultValue is an expression.
diff --git a/regression-test/data/correctness_p0/test_default_pi.out
b/regression-test/data/correctness_p0/test_default_pi.out
new file mode 100644
index 00000000000..4b9a36fa12f
--- /dev/null
+++ b/regression-test/data/correctness_p0/test_default_pi.out
@@ -0,0 +1,28 @@
+-- This file is automatically generated. You should know what you did if you
want to edit this
+-- !insert_into1 --
+1 3.141592653589793 1
+2 3.141592653589793 2
+3 3.141592653589793 3
+4 3.141592653589793 4
+
+-- !stream_load_csv1 --
+1 3.141592653589793 1
+2 3.141592653589793 2
+3 3.141592653589793 3
+4 3.141592653589793 4
+5 3.141592653589793 5
+6 3.141592653589793 6
+
+-- !select_1 --
+1 3.141592653589793 1
+2 3.141592653589793 2
+3 3.141592653589793 3
+4 3.141592653589793 4
+
+-- !stream_load_csv1 --
+1 3.141592653589793 1
+2 3.141592653589793 2
+3 3.141592653589793 3
+4 3.141592653589793 4
+5 3.141592653589793 5
+6 3.141592653589793 6
diff --git a/regression-test/data/correctness_p0/test_default_pi_streamload.csv
b/regression-test/data/correctness_p0/test_default_pi_streamload.csv
new file mode 100644
index 00000000000..a4f37673aa0
--- /dev/null
+++ b/regression-test/data/correctness_p0/test_default_pi_streamload.csv
@@ -0,0 +1,2 @@
+5,5
+6,6
diff --git a/regression-test/suites/correctness_p0/test_default_pi.groovy
b/regression-test/suites/correctness_p0/test_default_pi.groovy
new file mode 100644
index 00000000000..47333b6a3ad
--- /dev/null
+++ b/regression-test/suites/correctness_p0/test_default_pi.groovy
@@ -0,0 +1,123 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_default_pi") {
+ def tableName = "test_default_pi"
+
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName}
+ (
+ k TINYINT,
+ v1 DOUBLE NOT NULL DEFAULT PI,
+ v2 INT
+ )
+ UNIQUE KEY(K)
+ DISTRIBUTED BY HASH(k)
+ PROPERTIES("replication_num" = "1");
+ """
+
+ // test insert into.
+ sql " insert into ${tableName} (k, v2) values (1, 1); "
+ sql " insert into ${tableName} (k, v2) values (2, 2); "
+ sql " insert into ${tableName} (k, v2) values (3, 3); "
+ sql " insert into ${tableName} (k, v2) values (4, 4); "
+ sql "sync"
+ qt_insert_into1 """ select * from ${tableName} order by k; """
+
+ // test csv stream load.
+ streamLoad {
+ table "${tableName}"
+
+ set 'column_separator', ','
+ set 'columns', 'k, v1=pi(), v2'
+
+ file 'test_default_pi_streamload.csv'
+
+ time 10000 // limit inflight 10s
+ }
+
+ sql "sync"
+
+ qt_stream_load_csv1 """ select * from ${tableName} order by k; """
+
+ // test partial update
+ sql """ DROP TABLE IF EXISTS ${tableName} """
+ sql """
+ CREATE TABLE IF NOT EXISTS ${tableName}
+ (
+ k TINYINT,
+ v1 DOUBLE NOT NULL DEFAULT PI,
+ v2 INT
+ )
+ UNIQUE KEY(K)
+ DISTRIBUTED BY HASH(k)
+ PROPERTIES("replication_num" = "1");
+ """
+
+ sql "set enable_unique_key_partial_update=true;"
+ sql "set enable_insert_strict=false;"
+
+ sql " insert into ${tableName} (k, v2) values (1, 1); "
+ sql " insert into ${tableName} (k, v2) values (2, 2); "
+ sql " insert into ${tableName} (k, v2) values (3, 3); "
+ sql " insert into ${tableName} (k, v2) values (4, 4); "
+ sql "sync"
+
+ qt_select_1 "select * from ${tableName} order by k;"
+
+ streamLoad {
+ table "${tableName}"
+
+ set 'partial_columns', 'true'
+ set 'column_separator', ','
+ set 'columns', 'k, v1=pi(), v2'
+
+ file 'test_default_pi_streamload.csv'
+
+ time 10000 // limit inflight 10s
+ }
+
+ sql "sync"
+
+ qt_stream_load_csv1 """ select * from ${tableName} order by k; """
+
+ // test varchar with default pi
+ sql "DROP TABLE IF EXISTS test_varchar_default"
+ test {
+ sql """create table test_varchar_default(a int, b varchar(100) default
pi)
+ distributed by hash(a) properties('replication_num'="1");"""
+ exception "Types other than DOUBLE cannot use pi as the default value"
+ }
+
+ // test int with default pi
+ sql "DROP TABLE IF EXISTS test_int_default"
+ test {
+ sql """create table test_int_default(a int, b int default pi)
+ distributed by hash(a) properties('replication_num'="1");"""
+ exception "Types other than DOUBLE cannot use pi as the default value"
+ }
+
+ // test float with default pi
+ sql "DROP TABLE IF EXISTS test_double_default"
+ test {
+ sql """create table test_int_default(a int, b float default pi)
+ distributed by hash(a) properties('replication_num'="1");"""
+ exception "Types other than DOUBLE cannot use pi as the default value"
+ }
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]