Skip to content

Commit b33b98e

Browse files
committed
Use file collating sequence for any key of alphanumeric class
Before this change, only keys that were alphanumeric elementary items or numeric display were supported.
1 parent a894348 commit b33b98e

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

cobc/ChangeLog

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
* tree.c (validate_indexed_key_field): warn about ignored collating
55
sequence for non-alphanumeric keys (considers only primary keys and file
66
collating sequence for now)
7+
* codegen.c (output_indexed_file_key_colseq): assign collating sequence
8+
for any key of alphanumeric class
79

810
2024-08-28 David Declerck <[email protected]>
911

cobc/codegen.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9341,11 +9341,11 @@ output_indexed_file_key_colseq (const struct cb_file *f, const struct cb_alt_key
93419341
{
93429342
const cb_tree key = ak ? ak->key : f->key;
93439343
const cb_tree key_col = ak ? ak->collating_sequence_key : f->collating_sequence_key;
9344-
const int type = cb_tree_type (key, cb_code_field (key));
93459344
cb_tree col = NULL;
93469345

9347-
/* We only apply a collating sequence if the key is alphanumeric / display */
9348-
if ((type & COB_TYPE_ALNUM) || (type == COB_TYPE_NUMERIC_DISPLAY)) {
9346+
/* We only apply a collating sequence if the key is of class alphanumeric;
9347+
Warned in `validate_indexed_key_field`. */
9348+
if (CB_TREE_CLASS (key) == CB_CLASS_ALPHANUMERIC) {
93499349
col = key_col ? key_col : f->collating_sequence;
93509350
#if 0 /* TODO: this should be done for national, when available */
93519351
} else if (type & COB_TYPE_NATIONAL) {

tests/testsuite.src/run_file.at

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12769,6 +12769,85 @@ AT_CHECK([diff reference_ebcdic_ascii prog8.out], [0], [], [])
1276912769
AT_CLEANUP
1277012770

1277112771

12772+
12773+
# This is, so far, only supported by the BDB backend
12774+
AT_SETUP([INDEXED file with collation on group key])
12775+
AT_KEYWORDS([runfile WRITE READ EBCDIC])
12776+
12777+
AT_SKIP_IF([test "$COB_HAS_ISAM" != "db"])
12778+
12779+
AT_DATA([prog.cob], [
12780+
IDENTIFICATION DIVISION.
12781+
PROGRAM-ID. prog.
12782+
ENVIRONMENT DIVISION.
12783+
INPUT-OUTPUT SECTION.
12784+
FILE-CONTROL.
12785+
SELECT MY-FILE ASSIGN TO "testfile"
12786+
ORGANIZATION IS INDEXED
12787+
ACCESS IS DYNAMIC
12788+
COLLATING SEQUENCE IS EBCDIC
12789+
RECORD KEY IS MY-KEY.
12790+
DATA DIVISION.
12791+
FILE SECTION.
12792+
FD MY-FILE.
12793+
01 MY-REC.
12794+
05 MY-KEY.
12795+
10 MY-KEY-1 PIC X.
12796+
10 MY-KEY-2 PIC X.
12797+
05 MY-DATA PIC 9.
12798+
WORKING-STORAGE SECTION.
12799+
01 DONE-READING PIC 9.
12800+
PROCEDURE DIVISION.
12801+
12802+
OPEN OUTPUT MY-FILE
12803+
MOVE "111" TO MY-REC WRITE MY-REC
12804+
MOVE "AA2" TO MY-REC WRITE MY-REC
12805+
MOVE "223" TO MY-REC WRITE MY-REC
12806+
MOVE "BB4" TO MY-REC WRITE MY-REC
12807+
MOVE "335" TO MY-REC WRITE MY-REC
12808+
MOVE "CC6" TO MY-REC WRITE MY-REC
12809+
MOVE "447" TO MY-REC WRITE MY-REC
12810+
MOVE "DD8" TO MY-REC WRITE MY-REC
12811+
CLOSE MY-FILE
12812+
12813+
OPEN INPUT MY-FILE
12814+
MOVE LOW-VALUES TO MY-KEY
12815+
START MY-FILE KEY >= MY-KEY
12816+
INVALID KEY
12817+
DISPLAY "INVALID KEY"
12818+
NOT INVALID KEY
12819+
PERFORM UNTIL EXIT
12820+
READ MY-FILE NEXT
12821+
AT END
12822+
EXIT PERFORM
12823+
NOT AT END
12824+
DISPLAY MY-REC
12825+
END-READ
12826+
END-PERFORM
12827+
END-START.
12828+
CLOSE MY-FILE
12829+
12830+
STOP RUN.
12831+
])
12832+
12833+
AT_DATA([reference],
12834+
[AA2
12835+
BB4
12836+
CC6
12837+
DD8
12838+
111
12839+
223
12840+
335
12841+
447
12842+
])
12843+
12844+
AT_CHECK([$COMPILE -Wno-unfinished -fdefault-file-colseq=EBCDIC prog.cob], [0], [], [])
12845+
AT_CHECK([$COBCRUN_DIRECT ./prog 1>prog.out], [0], [], [])
12846+
AT_CHECK([diff reference prog.out], [0], [], [])
12847+
12848+
AT_CLEANUP
12849+
12850+
1277212851
AT_SETUP([INDEXED file numeric keys ordering])
1277312852
AT_KEYWORDS([runfile])
1277412853

0 commit comments

Comments
 (0)