Skip to content

Commit e4be464

Browse files
turboFeiyanghua
authored andcommitted
[KYUUBI apache#4372] Support to return null value for OperationsResource rowset
### _Why are the changes needed?_ With restful api, for query `select cast(null as int) c1` #### Before the result is `0` #### After the result is `null`. ### _How was this patch tested?_ - [x] Add some test cases that check the changes thoroughly including negative and positive cases if possible - [ ] Add screenshots for manual tests if appropriate - [x] [Run test](https://kyuubi.readthedocs.io/en/master/develop_tools/testing.html#running-tests) locally before make a pull request Closes apache#4372 from turboFei/null_value. Closes apache#4372 b15f1eb [fwang12] nit 5f16855 [fwang12] fix 45c60dd [fwang12] check is set Authored-by: fwang12 <[email protected]> Signed-off-by: fwang12 <[email protected]>
1 parent 26aa92a commit e4be464

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

kyuubi-server/src/main/scala/org/apache/kyuubi/server/api/v1/OperationsResource.scala

+35-7
Original file line numberDiff line numberDiff line change
@@ -182,19 +182,47 @@ private[v1] class OperationsResource extends ApiRequestContext with Logging {
182182
i.getSetField.name(),
183183
i.getSetField match {
184184
case TColumnValue._Fields.STRING_VAL =>
185-
i.getStringVal.getFieldValue(TStringValue._Fields.VALUE)
185+
if (i.getStringVal.isSetValue) {
186+
i.getStringVal.getFieldValue(TStringValue._Fields.VALUE)
187+
} else {
188+
null
189+
}
186190
case TColumnValue._Fields.BOOL_VAL =>
187-
i.getBoolVal.getFieldValue(TBoolValue._Fields.VALUE)
191+
if (i.getBoolVal.isSetValue) {
192+
i.getBoolVal.getFieldValue(TBoolValue._Fields.VALUE)
193+
} else {
194+
null
195+
}
188196
case TColumnValue._Fields.BYTE_VAL =>
189-
i.getByteVal.getFieldValue(TByteValue._Fields.VALUE)
197+
if (i.getByteVal.isSetValue) {
198+
i.getByteVal.getFieldValue(TByteValue._Fields.VALUE)
199+
} else {
200+
null
201+
}
190202
case TColumnValue._Fields.DOUBLE_VAL =>
191-
i.getDoubleVal.getFieldValue(TDoubleValue._Fields.VALUE)
203+
if (i.getDoubleVal.isSetValue) {
204+
i.getDoubleVal.getFieldValue(TDoubleValue._Fields.VALUE)
205+
} else {
206+
null
207+
}
192208
case TColumnValue._Fields.I16_VAL =>
193-
i.getI16Val.getFieldValue(TI16Value._Fields.VALUE)
209+
if (i.getI16Val.isSetValue) {
210+
i.getI16Val.getFieldValue(TI16Value._Fields.VALUE)
211+
} else {
212+
null
213+
}
194214
case TColumnValue._Fields.I32_VAL =>
195-
i.getI32Val.getFieldValue(TI32Value._Fields.VALUE)
215+
if (i.getI32Val.isSetValue) {
216+
i.getI32Val.getFieldValue(TI32Value._Fields.VALUE)
217+
} else {
218+
null
219+
}
196220
case TColumnValue._Fields.I64_VAL =>
197-
i.getI64Val.getFieldValue(TI64Value._Fields.VALUE)
221+
if (i.getI64Val.isSetValue) {
222+
i.getI64Val.getFieldValue(TI64Value._Fields.VALUE)
223+
} else {
224+
null
225+
}
198226
})
199227
}).asJava)
200228
})

kyuubi-server/src/test/scala/org/apache/kyuubi/server/api/v1/OperationsResourceSuite.scala

+24
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,30 @@ class OperationsResourceSuite extends KyuubiFunSuite with RestFrontendTestHelper
126126
assert(logRowSet.getRowCount == 1)
127127
}
128128

129+
test("test get result row set with null value") {
130+
val opHandleStr = getOpHandleStr(
131+
s"""
132+
|select
133+
|cast(null as string) as c1,
134+
|cast(null as boolean) as c2,
135+
|cast(null as byte) as c3,
136+
|cast(null as double) as c4,
137+
|cast(null as short) as c5,
138+
|cast(null as int) as c6,
139+
|cast(null as bigint) as c7
140+
|""".stripMargin)
141+
checkOpState(opHandleStr, FINISHED)
142+
val response = webTarget.path(
143+
s"api/v1/operations/$opHandleStr/rowset")
144+
.queryParam("maxrows", "2")
145+
.queryParam("fetchorientation", "FETCH_NEXT")
146+
.request(MediaType.APPLICATION_JSON).get()
147+
assert(200 == response.getStatus)
148+
val logRowSet = response.readEntity(classOf[ResultRowSet])
149+
assert(logRowSet.getRows.asScala.head.getFields.asScala.forall(_.getValue == null))
150+
assert(logRowSet.getRowCount == 1)
151+
}
152+
129153
def getOpHandleStr(statement: String = "show tables"): String = {
130154
val sessionHandle = fe.be.openSession(
131155
HIVE_CLI_SERVICE_PROTOCOL_V2,

0 commit comments

Comments
 (0)