Skip to content

Commit 129c154

Browse files
committed
HHH-19297 Fix json type issue.
1 parent 947837b commit 129c154

7 files changed

+64
-39
lines changed

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonArrayAggFunction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public void render(
3838
ReturnableType<?> returnType,
3939
SqlAstTranslator<?> translator) {
4040
final boolean caseWrapper = filter != null;
41-
sqlAppender.appendSql( "json_build_array(group_concat(" );
41+
sqlAppender.appendSql( "concat('[',group_concat(" );
4242
final JsonNullBehavior nullBehavior;
4343
if ( sqlAstArguments.size() > 1 ) {
4444
nullBehavior = (JsonNullBehavior) sqlAstArguments.get( 1 );
@@ -80,7 +80,7 @@ public void render(
8080
}
8181
translator.getCurrentClauseStack().pop();
8282
}
83-
sqlAppender.appendSql( " separator ','))" );
83+
sqlAppender.appendSql( " separator ','),']')" );
8484
}
8585

8686
@Override

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonArrayAppendFunction.java

+17-8
Original file line numberDiff line numberDiff line change
@@ -36,30 +36,39 @@ public void render(
3636
final List<JsonPathHelper.JsonPathElement> jsonPathElements = JsonPathHelper.parseJsonPathElements( translator.getLiteralValue(
3737
jsonPath ) );
3838
final SqlAstNode value = arguments.get( 2 );
39-
sqlAppender.appendSql( "json_set_json(" );
39+
sqlAppender.appendSql( "case when json_get_type(json_extract_json(" );
4040
json.accept( translator );
4141
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
42-
sqlAppender.appendSql( ',' );
43-
sqlAppender.appendSql( " case when json_get_type(json_extract_json(" );
42+
sqlAppender.appendSql( ")) = 'array' THEN " );
43+
sqlAppender.appendSql( "json_set_json(" );
4444
json.accept( translator );
4545
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
46-
sqlAppender.appendSql( ")) = 'array' THEN " );
46+
sqlAppender.appendSql( ',' );
4747
sqlAppender.appendSql( "json_array_push_json(" );
4848
sqlAppender.appendSql( "json_extract_json(" );
4949
json.accept( translator );
5050
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
5151
sqlAppender.appendSql( ")," );
5252
sqlAppender.appendSql( "to_json(" );
5353
value.accept( translator );
54-
sqlAppender.appendSql( ")) ELSE " );
55-
sqlAppender.appendSql( "json_array_push_json(" );
56-
sqlAppender.appendSql( "json_build_array(json_extract_json(" );
54+
sqlAppender.appendSql( ")))" );
55+
sqlAppender.appendSql( " when json_get_type(json_extract_json(" );
56+
json.accept( translator );
57+
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
58+
sqlAppender.appendSql( ")) is null THEN " );
59+
json.accept( translator );
60+
sqlAppender.appendSql( " else " );
61+
sqlAppender.appendSql( "json_set_json(" );
62+
json.accept( translator );
63+
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
64+
sqlAppender.appendSql( ',' );
65+
sqlAppender.appendSql( "json_array_push_json(json_build_array(json_extract_json(" );
5766
json.accept( translator );
5867
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
5968
sqlAppender.appendSql( "))," );
6069
sqlAppender.appendSql( "to_json(" );
6170
value.accept( translator );
62-
sqlAppender.appendSql( ")) END )" );
71+
sqlAppender.appendSql( "))) END" );
6372
}
6473

6574
private static void buildJsonPath(

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonArrayInsertFunction.java

+8-15
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,16 @@ public void render(
3737
jsonPath ) );
3838
final SqlAstNode value = arguments.get( 2 );
3939
final int arrayIndex = getArrayIndex( jsonPathElements );
40+
sqlAppender.appendSql( "case when json_get_type(json_extract_json(" );
41+
json.accept( translator );
42+
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
43+
sqlAppender.appendSql( ")) = 'array' THEN " );
4044
if ( jsonPathElements.size() > 1 ) {
4145
sqlAppender.appendSql( "json_set_json(" );
4246
json.accept( translator );
4347
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
4448
sqlAppender.appendSql( ", " );
4549
}
46-
sqlAppender.appendSql( "case when json_get_type(json_extract_json(" );
47-
json.accept( translator );
48-
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
49-
sqlAppender.appendSql( ")) = 'array' THEN " );
5050
sqlAppender.appendSql( "json_splice_json(" );
5151
sqlAppender.appendSql( "json_extract_json(" );
5252
json.accept( translator );
@@ -56,20 +56,13 @@ public void render(
5656
sqlAppender.appendSql( ", 0, " );
5757
sqlAppender.appendSql( "to_json(" );
5858
value.accept( translator );
59-
sqlAppender.appendSql( ")) ELSE " );
60-
sqlAppender.appendSql( "json_splice_json(" );
61-
sqlAppender.appendSql( "json_build_array(json_extract_json(" );
62-
json.accept( translator );
63-
buildJsonPath( sqlAppender, jsonPath, jsonPathElements );
64-
sqlAppender.appendSql( "))," );
65-
sqlAppender.appendSql( arrayIndex );
66-
sqlAppender.appendSql( ", 0, " );
67-
sqlAppender.appendSql( "to_json(" );
68-
value.accept( translator );
69-
sqlAppender.appendSql( ")) END" );
59+
sqlAppender.appendSql( "))" );
7060
if ( jsonPathElements.size() > 1 ) {
7161
sqlAppender.appendSql( ')' );
7262
}
63+
sqlAppender.appendSql( " else " );
64+
json.accept( translator );
65+
sqlAppender.appendSql( " END" );
7366
}
7467

7568
private static int getArrayIndex(List<JsonPathHelper.JsonPathElement> jsonPathElements) {

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonExistsFunction.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.metamodel.model.domain.ReturnableType;
1313
import org.hibernate.sql.ast.SqlAstTranslator;
1414
import org.hibernate.sql.ast.spi.SqlAppender;
15+
import org.hibernate.sql.ast.tree.expression.Expression;
1516
import org.hibernate.sql.ast.tree.expression.JsonExistsErrorBehavior;
1617
import org.hibernate.type.spi.TypeConfiguration;
1718

@@ -49,8 +50,15 @@ protected void render(
4950
sqlAppender.appendSingleQuoteEscapedString( attribute.attribute() );
5051
}
5152
else if ( pathElement instanceof JsonPathHelper.JsonParameterIndexAccess ) {
53+
assert arguments.passingClause() != null;
5254
final String parameterName = ( (JsonPathHelper.JsonParameterIndexAccess) pathElement ).parameterName();
53-
throw new QueryException( "JSON path [" + jsonPath + "] uses parameter [" + parameterName + "] that is not passed" );
55+
final Expression expression = arguments.passingClause().getPassingExpressions().get( parameterName );
56+
if ( expression == null ) {
57+
throw new QueryException( "JSON path [" + JsonPathHelper.toJsonPath( jsonPathElements ) + "] uses parameter [" + parameterName + "] that is not passed" );
58+
}
59+
sqlAppender.appendSql( "cast(" );
60+
expression.accept( walker );
61+
sqlAppender.appendSql( " as char)" );
5462
}
5563
else {
5664
sqlAppender.appendSql( '\'' );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonQueryFunction.java

+13-6
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.metamodel.model.domain.ReturnableType;
1313
import org.hibernate.sql.ast.SqlAstTranslator;
1414
import org.hibernate.sql.ast.spi.SqlAppender;
15+
import org.hibernate.sql.ast.tree.expression.Expression;
1516
import org.hibernate.sql.ast.tree.expression.JsonQueryEmptyBehavior;
1617
import org.hibernate.sql.ast.tree.expression.JsonQueryErrorBehavior;
1718
import org.hibernate.sql.ast.tree.expression.JsonQueryWrapMode;
@@ -32,11 +33,10 @@ protected void render(
3233
JsonQueryArguments arguments,
3334
ReturnableType<?> returnType,
3435
SqlAstTranslator<?> walker) {
35-
if ( arguments.errorBehavior() != null && arguments.errorBehavior() != JsonQueryErrorBehavior.ERROR ) {
36-
throw new QueryException( "Can't emulate on error clause on SingleStore" );
37-
}
38-
if ( arguments.emptyBehavior() != null && arguments.emptyBehavior() != JsonQueryEmptyBehavior.NULL ) {
39-
throw new QueryException( "Can't emulate on empty clause on SingleStore" );
36+
if ( arguments.errorBehavior() != null && arguments.errorBehavior() != JsonQueryErrorBehavior.ERROR
37+
|| arguments.emptyBehavior() == JsonQueryEmptyBehavior.ERROR
38+
|| arguments.emptyBehavior() != null && arguments.emptyBehavior() != JsonQueryEmptyBehavior.NULL ) {
39+
super.render( sqlAppender, arguments, returnType, walker );
4040
}
4141
else {
4242
final String jsonPath;
@@ -60,8 +60,15 @@ protected void render(
6060
sqlAppender.appendSingleQuoteEscapedString( attribute.attribute() );
6161
}
6262
else if ( pathElement instanceof JsonPathHelper.JsonParameterIndexAccess ) {
63+
assert arguments.passingClause() != null;
6364
final String parameterName = ( (JsonPathHelper.JsonParameterIndexAccess) pathElement ).parameterName();
64-
throw new QueryException( "JSON path [" + jsonPath + "] uses parameter [" + parameterName + "] that is not passed" );
65+
final Expression expression = arguments.passingClause().getPassingExpressions().get( parameterName );
66+
if ( expression == null ) {
67+
throw new QueryException( "JSON path [" + JsonPathHelper.toJsonPath( jsonPathElements ) + "] uses parameter [" + parameterName + "] that is not passed" );
68+
}
69+
sqlAppender.appendSql( "cast(" );
70+
expression.accept( walker );
71+
sqlAppender.appendSql( " as char)" );
6572
}
6673
else {
6774
sqlAppender.appendSql( '\'' );

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonSetFunction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ else if ( pathElement instanceof JsonPathHelper.JsonParameterIndexAccess ) {
5555
sqlAppender.appendSql( '\'' );
5656
}
5757
}
58-
sqlAppender.appendSql( ", to_json(" );
58+
sqlAppender.appendSql( ',' );
5959
value.accept( translator );
60-
sqlAppender.appendSql( "))" );
60+
sqlAppender.appendSql( ')' );
6161
}
6262
}

hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/function/json/SingleStoreJsonValueFunction.java

+13-5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.hibernate.metamodel.model.domain.ReturnableType;
1313
import org.hibernate.sql.ast.SqlAstTranslator;
1414
import org.hibernate.sql.ast.spi.SqlAppender;
15+
import org.hibernate.sql.ast.tree.expression.Expression;
1516
import org.hibernate.sql.ast.tree.expression.JsonValueEmptyBehavior;
1617
import org.hibernate.sql.ast.tree.expression.JsonValueErrorBehavior;
1718
import org.hibernate.type.spi.TypeConfiguration;
@@ -31,9 +32,9 @@ protected void render(
3132
JsonValueArguments arguments,
3233
ReturnableType<?> returnType,
3334
SqlAstTranslator<?> walker) {
34-
35-
if ( arguments.errorBehavior() != null && arguments.errorBehavior() != JsonValueErrorBehavior.NULL ) {
36-
throw new QueryException( "Can't emulate on error clause on SingleStore" );
35+
if ( arguments.errorBehavior() != null && arguments.errorBehavior() != JsonValueErrorBehavior.NULL
36+
|| arguments.emptyBehavior() != null && arguments.emptyBehavior() != JsonValueEmptyBehavior.NULL ) {
37+
super.render( sqlAppender, arguments, returnType, walker );
3738
}
3839
if ( arguments.emptyBehavior() != null && arguments.emptyBehavior() != JsonValueEmptyBehavior.NULL ) {
3940
throw new QueryException( "Can't emulate on empty clause on SingleStore" );
@@ -54,16 +55,23 @@ protected void render(
5455
throw new QueryException( "SingleStore json_value only support literal json paths, but got " + arguments.jsonPath() );
5556
}
5657
final List<JsonPathHelper.JsonPathElement> jsonPathElements = JsonPathHelper.parseJsonPathElements( jsonPath );
57-
sqlAppender.appendSql( "json_extract_json(" );
58+
sqlAppender.appendSql( "json_extract_string(" );
5859
arguments.jsonDocument().accept( walker );
5960
for ( JsonPathHelper.JsonPathElement pathElement : jsonPathElements ) {
6061
sqlAppender.appendSql( ',' );
6162
if ( pathElement instanceof JsonPathHelper.JsonAttribute attribute ) {
6263
sqlAppender.appendSingleQuoteEscapedString( attribute.attribute() );
6364
}
6465
else if ( pathElement instanceof JsonPathHelper.JsonParameterIndexAccess ) {
66+
assert arguments.passingClause() != null;
6567
final String parameterName = ( (JsonPathHelper.JsonParameterIndexAccess) pathElement ).parameterName();
66-
throw new QueryException( "JSON path [" + jsonPath + "] uses parameter [" + parameterName + "] that is not passed" );
68+
final Expression expression = arguments.passingClause().getPassingExpressions().get( parameterName );
69+
if ( expression == null ) {
70+
throw new QueryException( "JSON path [" + JsonPathHelper.toJsonPath( jsonPathElements ) + "] uses parameter [" + parameterName + "] that is not passed" );
71+
}
72+
sqlAppender.appendSql( "cast(" );
73+
expression.accept( walker );
74+
sqlAppender.appendSql( " as char)" );
6775
}
6876
else {
6977
sqlAppender.appendSql( '\'' );

0 commit comments

Comments
 (0)