Skip to content

Commit 289d47a

Browse files
authored
Merge pull request #695 from smeup/bugfix/LS25000333/ds-like-to-string
Bugfix/ls25000333/ds like to string
2 parents bd1e961 + b6abb6b commit 289d47a

File tree

4 files changed

+92
-5
lines changed

4 files changed

+92
-5
lines changed

rpgJavaInterpreter-core/src/main/kotlin/com/smeup/rpgparser/parsing/parsetreetoast/data_definitions.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,12 @@ internal fun RpgParser.DspecContext.toAst(
404404
NumberType(elementSize!! - decimalPositions, decimalPositions)
405405
} else {
406406
if (like != null) {
407-
compileTimeInterpreter.evaluateTypeOf(this.rContext(), like!!, conf, procedureName)
407+
val baseType = compileTimeInterpreter.evaluateTypeOf(this.rContext(), like!!, conf, procedureName)
408+
409+
// When LIKE is used on a DS we must declare a string with size == to the DS size
410+
if (baseType is DataStructureType) {
411+
StringType.createInstance(elementSize!!, varying)
412+
} else baseType
408413
} else {
409414
StringType.createInstance(elementSize!!, varying)
410415
}

rpgJavaInterpreter-core/src/test/kotlin/com/smeup/rpgparser/smeup/MULANGT02ConstAndDSpecTest.kt

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package com.smeup.rpgparser.smeup
22

33
import com.smeup.rpgparser.db.utilities.DBServer
4+
import com.smeup.rpgparser.interpreter.DataDefinition
5+
import com.smeup.rpgparser.interpreter.DataStructureType
6+
import com.smeup.rpgparser.interpreter.StringType
47
import com.smeup.rpgparser.smeup.dbmock.MULANGTLDbMock
58
import org.junit.Test
6-
import kotlin.test.AfterTest
7-
import kotlin.test.BeforeTest
8-
import kotlin.test.assertEquals
9+
import kotlin.test.*
910

1011
open class MULANGT02ConstAndDSpecTest : MULANGTTest() {
1112
@BeforeTest
@@ -427,7 +428,7 @@ open class MULANGT02ConstAndDSpecTest : MULANGTTest() {
427428
*/
428429
@Test
429430
fun executeMUDRNRAPU00227() {
430-
val expected = listOf("9991\uFFFF\uFFFF99999")
431+
val expected = listOf("\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF\uFFFF")
431432
assertEquals(expected, "smeup/MUDRNRAPU00227".outputOf(configuration = smeupConfig))
432433
}
433434

@@ -867,4 +868,23 @@ open class MULANGT02ConstAndDSpecTest : MULANGTTest() {
867868
val expected = listOf("IBMI", "", "IBMI")
868869
assertEquals(expected, "smeup/MUDRNRAPU00190".outputOf(configuration = smeupConfig))
869870
}
871+
872+
/**
873+
* Definitions with LIKE referencing a DS must be defined as strings with the same size as the DS
874+
* @see #LS25000333
875+
*/
876+
@Test
877+
fun executeMUDRNRAPU00281() {
878+
var mlDataDefinition: DataDefinition? = null
879+
var ds0002DataDefinition: DataDefinition? = null
880+
881+
assertASTCanBeProduced("smeup/MUDRNRAPU00281", afterAstCreation = {
882+
mlDataDefinition = it.getDataDefinition("ML")
883+
ds0002DataDefinition = it.getDataDefinition("DS0002")
884+
})
885+
886+
assertIs<DataStructureType>(mlDataDefinition?.type)
887+
assertIs<StringType>(ds0002DataDefinition?.type)
888+
assertEquals(mlDataDefinition?.elementSize(), ds0002DataDefinition?.elementSize())
889+
}
870890
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{"name": "MULANGTL",
2+
"tableName": "MULANGTF",
3+
"recordFormat": "MULANGR",
4+
"fields": [
5+
{ "fieldName": "MLSYST",
6+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":20, "varying":false}}
7+
, { "fieldName": "MLLIBR",
8+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
9+
, { "fieldName": "MLFILE",
10+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
11+
, { "fieldName": "MLTIPO",
12+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
13+
, { "fieldName": "MLPROG",
14+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
15+
, { "fieldName": "MLPSEZ",
16+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
17+
, { "fieldName": "MLPPAS",
18+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
19+
, { "fieldName": "MLPDES",
20+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":256, "varying":false}}
21+
, { "fieldName": "MLSQIN",
22+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
23+
, { "fieldName": "MLSQFI",
24+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
25+
, { "fieldName": "MLAAAT",
26+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1024, "varying":false}}
27+
, { "fieldName": "MLAAVA",
28+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":1024, "varying":false}}
29+
, { "fieldName": "MLNNAT",
30+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":21, "decimalDigits":9, "rpgType":"P"}}
31+
, { "fieldName": "MLNNVA",
32+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":21, "decimalDigits":9, "rpgType":"P"}}
33+
, { "fieldName": "MLINDI",
34+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":99, "varying":false}}
35+
, { "fieldName": "MLTEES",
36+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"P"}}
37+
, { "fieldName": "MLUSES",
38+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
39+
, { "fieldName": "MLDTES",
40+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":8, "decimalDigits":0, "rpgType":"S"}}
41+
, { "fieldName": "MLORES",
42+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":6, "decimalDigits":0, "rpgType":"S"}}
43+
, { "fieldName": "MLASLA",
44+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":10, "varying":false}}
45+
, { "fieldName": "MLASNR",
46+
"type":{"type":"com.smeup.rpgparser.interpreter.NumberType","entireDigits":6, "decimalDigits":0, "rpgType":"P"}}
47+
, { "fieldName": "MLLIBE",
48+
"type":{"type":"com.smeup.rpgparser.interpreter.StringType","length":30000, "varying":true}}
49+
], "accessFields": [ "MLSYST", "MLTIPO", "MLPROG", "MLPSEZ", "MLPPAS"]}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
V* ==============================================================
2+
V* 21/01/2025 APU002 Creation
3+
V* ==============================================================
4+
O * PROGRAM GOAL
5+
O * Definitions with LIKE referencing a DS must be defined as
6+
0 * strings with the same size as the DS
7+
V* ==============================================================
8+
O * JARIKO ANOMALY
9+
O * Before the fix, they were defined as DS themselves
10+
V* ==============================================================
11+
FMULANGTL IF E K DISK
12+
D ML E DS EXTNAME(MULANGTL) INZ
13+
D DS0002 S LIKE(ML)

0 commit comments

Comments
 (0)