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

jshao pushed a commit to branch branch-0.6
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-0.6 by this push:
     new 2318043e5 [#4115]  feat(api):  add validate check for decimal(0,0) 
(#4392)
2318043e5 is described below

commit 2318043e5d13327cdc5048c8e0e5b3f2f332fc5d
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Aug 6 18:57:22 2024 +0800

    [#4115]  feat(api):  add validate check for decimal(0,0) (#4392)
    
    ### What changes were proposed in this pull request?
    add validate check for decimal(0,0)
    
    ### Why are the changes needed?
    
    Fix: #4115
    
    ### Does this PR introduce _any_ user-facing change?
    no
    
    ### How was this patch tested?
    existing tests
    
    Co-authored-by: FANNG <[email protected]>
---
 .../java/org/apache/gravitino/rel/types/Types.java |  9 ++--
 .../java/org/apache/gravitino/rel/TestTypes.java   | 14 +++--
 docs/manage-relational-metadata-using-gravitino.md | 60 +++++++++++-----------
 3 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/api/src/main/java/org/apache/gravitino/rel/types/Types.java 
b/api/src/main/java/org/apache/gravitino/rel/types/Types.java
index 2355f7ebf..f0e9a2056 100644
--- a/api/src/main/java/org/apache/gravitino/rel/types/Types.java
+++ b/api/src/main/java/org/apache/gravitino/rel/types/Types.java
@@ -256,11 +256,14 @@ public class Types {
 
     static void checkPrecisionScale(int precision, int scale) {
       Preconditions.checkArgument(
-          precision <= 38,
-          "Decimals with precision larger than 38 are not supported: %s",
+          precision > 0 && precision <= 38,
+          "Decimal precision must be in range[1, 38]: precision: %s",
           precision);
       Preconditions.checkArgument(
-          scale <= precision, "Scale cannot be larger than precision: %s > 
%s", scale, precision);
+          scale >= 0 && scale <= precision,
+          "Decimal scale must be in range [0, precision (%s)]: scala: %s",
+          precision,
+          scale);
     }
 
     /** @return The name of the decimal type. */
diff --git a/api/src/test/java/org/apache/gravitino/rel/TestTypes.java 
b/api/src/test/java/org/apache/gravitino/rel/TestTypes.java
index e1a52c5c8..1de911f93 100644
--- a/api/src/test/java/org/apache/gravitino/rel/TestTypes.java
+++ b/api/src/test/java/org/apache/gravitino/rel/TestTypes.java
@@ -91,13 +91,17 @@ public class TestTypes {
     IllegalArgumentException exception =
         Assertions.assertThrows(IllegalArgumentException.class, () -> 
Types.DecimalType.of(40, 0));
     Assertions.assertTrue(
-        exception
-            .getMessage()
-            .contains("Decimals with precision larger than 38 are not 
supported"));
+        exception.getMessage().contains("Decimal precision must be in range[1, 
38]:"));
 
     exception =
-        Assertions.assertThrows(IllegalArgumentException.class, () -> 
Types.DecimalType.of(0, 40));
-    Assertions.assertTrue(exception.getMessage().contains("Scale cannot be 
larger than precision"));
+        Assertions.assertThrows(IllegalArgumentException.class, () -> 
Types.DecimalType.of(1, 40));
+    Assertions.assertTrue(
+        exception.getMessage().contains("Decimal scale must be in range [0, 
precision (1)]:"));
+
+    exception =
+        Assertions.assertThrows(IllegalArgumentException.class, () -> 
Types.DecimalType.of(0, 0));
+    Assertions.assertTrue(
+        exception.getMessage().contains("Decimal precision must be in range[1, 
38]:"));
 
     Types.DecimalType decimalType = Types.DecimalType.of(26, 10);
     Assertions.assertEquals(Type.Name.DECIMAL, decimalType.name());
diff --git a/docs/manage-relational-metadata-using-gravitino.md 
b/docs/manage-relational-metadata-using-gravitino.md
index 55984bf72..8e06fa142 100644
--- a/docs/manage-relational-metadata-using-gravitino.md
+++ b/docs/manage-relational-metadata-using-gravitino.md
@@ -703,36 +703,36 @@ In order to create a table, you need to provide the 
following information:
 
 The following types that Gravitino supports:
 
-| Type                       | Java                                            
                         | JSON                                                 
                                                                                
| Description                                                                   
                   |
-|----------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------|
-| Boolean                    | `Types.BooleanType.get()`                       
                         | `boolean`                                            
                                                                                
| Boolean type                                                                  
                   |
-| Byte                       | `Types.ByteType.get()`                          
                         | `byte`                                               
                                                                                
| Byte type, indicates a numerical value of 1 byte                              
                   |
-| Byte(false)                | `Types.ByteType.unsigned()`                     
                         | `byte unsigned`                                      
                                                                                
| Unsigned Byte type, indicates a unsigned numerical value of 1 byte            
                   |
-| Short                      | `Types.ShortType.get()`                         
                         | `short`                                              
                                                                                
| Short type, indicates a numerical value of 2 bytes                            
                   |
-| Short(false)               | `Types.ShortType.unsigned()`                    
                         | `short unsigned`                                     
                                                                                
| Unsigned Short type, indicates a unsigned numerical value of 2 bytes          
                   |
-| Integer                    | `Types.IntegerType.get()`                       
                         | `integer`                                            
                                                                                
| Integer type, indicates a numerical value of 4 bytes                          
                   |
-| Integer(false)             | `Types.IntegerType.unsigned()`                  
                         | `integer unsigned`                                   
                                                                                
| Unsigned Integer type, indicates a unsigned numerical value of 4 bytes        
                   |
-| Long                       | `Types.LongType.get()`                          
                         | `long`                                               
                                                                                
| Long type, indicates a numerical value of 8 bytes                             
                   |
-| Long(false)                | `Types.LongType.unsigned()`                     
                         | `long unsigned`                                      
                                                                                
| Unsigned Long type, indicates a unsigned numerical value of 8 bytes           
                   |
-| Float                      | `Types.FloatType.get()`                         
                         | `float`                                              
                                                                                
| Float type, indicates a single-precision floating point number                
                   |
-| Double                     | `Types.DoubleType.get()`                        
                         | `double`                                             
                                                                                
| Double type, indicates a double-precision floating point number               
                   |
-| Decimal(precision, scale)  | `Types.DecimalType.of(precision, scale)`        
                         | `decimal(p, s)`                                      
                                                                                
| Decimal type, indicates a fixed-precision decimal number                      
                   |
-| String                     | `Types.StringType.get()`                        
                         | `string`                                             
                                                                                
| String type                                                                   
                   |
-| FixedChar(length)          | `Types.FixedCharType.of(length)`                
                         | `char(l)`                                            
                                                                                
| Char type, indicates a fixed-length string                                    
                   |
-| VarChar(length)            | `Types.VarCharType.of(length)`                  
                         | `varchar(l)`                                         
                                                                                
| Varchar type, indicates a variable-length string, the length is the maximum 
length of the string |
-| Timestamp                  | `Types.TimestampType.withoutTimeZone()`         
                         | `timestamp`                                          
                                                                                
| Timestamp type, indicates a timestamp without timezone                        
                   |
-| TimestampWithTimezone      | `Types.TimestampType.withTimeZone()`            
                         | `timestamp_tz`                                       
                                                                                
| Timestamp with timezone type, indicates a timestamp with timezone             
                   |
-| Date                       | `Types.DateType.get()`                          
                         | `date`                                               
                                                                                
| Date type                                                                     
                   |
-| Time                       | `Types.TimeType.withoutTimeZone()`              
                         | `time`                                               
                                                                                
| Time type                                                                     
                   |
-| IntervalToYearMonth        | `Types.IntervalYearType.get()`                  
                         | `interval_year`                                      
                                                                                
| Interval type, indicates an interval of year and month                        
                   |
-| IntervalToDayTime          | `Types.IntervalDayType.get()`                   
                         | `interval_day`                                       
                                                                                
| Interval type, indicates an interval of day and time                          
                   |
-| Fixed(length)              | `Types.FixedType.of(length)`                    
                         | `fixed(l)`                                           
                                                                                
| Fixed type, indicates a fixed-length binary array                             
                   |
-| Binary                     | `Types.BinaryType.get()`                        
                         | `binary`                                             
                                                                                
| Binary type, indicates a arbitrary-length binary array                        
                   |
-| List                       | `Types.ListType.of(elementType, 
elementNullable)`                        | `{"type": "list", "containsNull": 
JSON Boolean, "elementType": type JSON}`                                        
                   | List type, indicate a list of elements with the same type  
                                      |
-| Map                        | `Types.MapType.of(keyType, valueType)`          
                         | `{"type": "map", "keyType": type JSON, "valueType": 
type JSON, "valueContainsNull": JSON Boolean}`                                  
 | Map type, indicate a map of key-value pairs                                  
                    |
-| Struct                     | 
`Types.StructType.of([Types.StructType.Field.of(name, type, nullable)])` | 
`{"type": "struct", "fields": [JSON StructField, {"name": string, "type": type 
JSON, "nullable": JSON Boolean, "comment": string}]}` | Struct type, indicate a 
struct of fields                                                         |
-| Union                      | `Types.UnionType.of([type1, type2, ...])`       
                         | `{"type": "union", "types": [type JSON, ...]}`       
                                                                                
| Union type, indicates a union of types                                        
                   |
-| UUID                       | `Types.UUIDType.get()`                          
                         | `uuid`                              | UUID type, 
indicates a universally unique identifier |
+| Type                      | Java                                             
                        | JSON                                                  
                                                                               
| Description                                                                   
                                                                                
             |
+|---------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Boolean                   | `Types.BooleanType.get()`                        
                        | `boolean`                                             
                                                                               
| Boolean type                                                                  
                                                                                
             |
+| Byte                      | `Types.ByteType.get()`                           
                        | `byte`                                                
                                                                               
| Byte type, indicates a numerical value of 1 byte                              
                                                                                
             |
+| Byte(false)               | `Types.ByteType.unsigned()`                      
                        | `byte unsigned`                                       
                                                                               
| Unsigned Byte type, indicates a unsigned numerical value of 1 byte            
                                                                                
             |
+| Short                     | `Types.ShortType.get()`                          
                        | `short`                                               
                                                                               
| Short type, indicates a numerical value of 2 bytes                            
                                                                                
             |
+| Short(false)              | `Types.ShortType.unsigned()`                     
                        | `short unsigned`                                      
                                                                               
| Unsigned Short type, indicates a unsigned numerical value of 2 bytes          
                                                                                
             |
+| Integer                   | `Types.IntegerType.get()`                        
                        | `integer`                                             
                                                                               
| Integer type, indicates a numerical value of 4 bytes                          
                                                                                
             |
+| Integer(false)            | `Types.IntegerType.unsigned()`                   
                        | `integer unsigned`                                    
                                                                               
| Unsigned Integer type, indicates a unsigned numerical value of 4 bytes        
                                                                                
             |
+| Long                      | `Types.LongType.get()`                           
                        | `long`                                                
                                                                               
| Long type, indicates a numerical value of 8 bytes                             
                                                                                
             |
+| Long(false)               | `Types.LongType.unsigned()`                      
                        | `long unsigned`                                       
                                                                               
| Unsigned Long type, indicates a unsigned numerical value of 8 bytes           
                                                                                
             |
+| Float                     | `Types.FloatType.get()`                          
                        | `float`                                               
                                                                               
| Float type, indicates a single-precision floating point number                
                                                                                
             |
+| Double                    | `Types.DoubleType.get()`                         
                        | `double`                                              
                                                                               
| Double type, indicates a double-precision floating point number               
                                                                                
             |
+| Decimal(precision, scale) | `Types.DecimalType.of(precision, scale)`         
                        | `decimal(p, s)`                                       
                                                                               
| Decimal type, indicates a fixed-precision decimal number with the constraint 
that the precision must be in range `[1, 38]` and the scala must be in range 
`[0, precision]` |
+| String                    | `Types.StringType.get()`                         
                        | `string`                                              
                                                                               
| String type                                                                   
                                                                                
             |
+| FixedChar(length)         | `Types.FixedCharType.of(length)`                 
                        | `char(l)`                                             
                                                                               
| Char type, indicates a fixed-length string                                    
                                                                                
             |
+| VarChar(length)           | `Types.VarCharType.of(length)`                   
                        | `varchar(l)`                                          
                                                                               
| Varchar type, indicates a variable-length string, the length is the maximum 
length of the string                                                            
               |
+| Timestamp                 | `Types.TimestampType.withoutTimeZone()`          
                        | `timestamp`                                           
                                                                               
| Timestamp type, indicates a timestamp without timezone                        
                                                                                
             |
+| TimestampWithTimezone     | `Types.TimestampType.withTimeZone()`             
                        | `timestamp_tz`                                        
                                                                               
| Timestamp with timezone type, indicates a timestamp with timezone             
                                                                                
             |
+| Date                      | `Types.DateType.get()`                           
                        | `date`                                                
                                                                               
| Date type                                                                     
                                                                                
             |
+| Time                      | `Types.TimeType.withoutTimeZone()`               
                        | `time`                                                
                                                                               
| Time type                                                                     
                                                                                
             |
+| IntervalToYearMonth       | `Types.IntervalYearType.get()`                   
                        | `interval_year`                                       
                                                                               
| Interval type, indicates an interval of year and month                        
                                                                                
             |
+| IntervalToDayTime         | `Types.IntervalDayType.get()`                    
                        | `interval_day`                                        
                                                                               
| Interval type, indicates an interval of day and time                          
                                                                                
             |
+| Fixed(length)             | `Types.FixedType.of(length)`                     
                        | `fixed(l)`                                            
                                                                               
| Fixed type, indicates a fixed-length binary array                             
                                                                                
             |
+| Binary                    | `Types.BinaryType.get()`                         
                        | `binary`                                              
                                                                               
| Binary type, indicates a arbitrary-length binary array                        
                                                                                
             |
+| List                      | `Types.ListType.of(elementType, 
elementNullable)`                        | `{"type": "list", "containsNull": 
JSON Boolean, "elementType": type JSON}`                                        
                   | List type, indicate a list of elements with the same type  
                                                                                
                                |
+| Map                       | `Types.MapType.of(keyType, valueType)`           
                        | `{"type": "map", "keyType": type JSON, "valueType": 
type JSON, "valueContainsNull": JSON Boolean}`                                  
 | Map type, indicate a map of key-value pairs                                  
                                                                                
              |
+| Struct                    | 
`Types.StructType.of([Types.StructType.Field.of(name, type, nullable)])` | 
`{"type": "struct", "fields": [JSON StructField, {"name": string, "type": type 
JSON, "nullable": JSON Boolean, "comment": string}]}` | Struct type, indicate a 
struct of fields                                                                
                                                                   |
+| Union                     | `Types.UnionType.of([type1, type2, ...])`        
                        | `{"type": "union", "types": [type JSON, ...]}`        
                                                                               
| Union type, indicates a union of types                                        
                                                                                
             |
+| UUID                      | `Types.UUIDType.get()`                           
                        | `uuid`                                                
                                                                               
| UUID type, indicates a universally unique identifier                          
                                                                                
             |
 
 The related java doc is 
[here](pathname:///docs/0.5.1/api/java/org/apache/gravitino/rel/types/Type.html).
 

Reply via email to