Skip to content

Commit 8ae3b07

Browse files
committed
Warn when a collating sequence is ignored for keys of indexed files
1 parent 2c000f5 commit 8ae3b07

File tree

4 files changed

+88
-10
lines changed

4 files changed

+88
-10
lines changed

cobc/ChangeLog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11

2+
2024-09-12 Nicolas Berthier <[email protected]>
3+
4+
* tree.c (validate_indexed_key_field): warn about ignored collating
5+
sequence for non-alphanumeric keys (considers only primary keys and file
6+
collating sequence for now)
7+
28
2024-08-28 David Declerck <[email protected]>
39

410
* tree.c (char_to_precedence_idx, get_char_type_description, valid_char_order):

cobc/tree.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4712,7 +4712,7 @@ validate_indexed_key_field (struct cb_file *f, struct cb_field *records,
47124712
int cb;
47134713
char pic[32];
47144714
struct cb_key_component *key_component;
4715-
struct cb_field *composite_key;
4715+
struct cb_field *composite_key = NULL;
47164716

47174717
/* get reference (and check if it exists) */
47184718
key_ref = cb_ref (key);
@@ -4781,6 +4781,22 @@ validate_indexed_key_field (struct cb_file *f, struct cb_field *records,
47814781
}
47824782
}
47834783
}
4784+
4785+
/* check collating sequence is not ignored */
4786+
if (composite_key != NULL /* split keys are considered alphanums */
4787+
&& CB_TREE_CLASS (k) != CB_CLASS_ALPHANUMERIC) {
4788+
cb_tree colseq = (cbak == NULL)
4789+
? f->collating_sequence_key
4790+
: cbak->collating_sequence_key;
4791+
if (colseq == NULL) {
4792+
colseq = f->collating_sequence;
4793+
}
4794+
if (colseq != NULL) {
4795+
cb_warning_x (COBC_WARN_FILLER, CB_TREE(colseq),
4796+
_("COLLATING SEQUENCE is ignored for non-alphanumeric"
4797+
" key '%s'"), k->name);
4798+
}
4799+
}
47844800
}
47854801

47864802
void

tests/testsuite.src/run_file.at

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12444,7 +12444,7 @@ AT_CLEANUP
1244412444

1244512445

1244612446
# This is, so far, only supported by the BDB backend
12447-
AT_SETUP([INDEXED files under ASCII/EBCDIC collation])
12447+
AT_SETUP([INDEXED file under ASCII/EBCDIC collation])
1244812448
AT_KEYWORDS([runfile WRITE DELETE READ EBCDIC])
1244912449

1245012450
AT_SKIP_IF([test "$COB_HAS_ISAM" != "db"])
@@ -12691,7 +12691,9 @@ AT_DATA([prog1.cob], [
1269112691
==FILE-COLSEQ== BY ==COLLATING SEQUENCE IS ASCII==
1269212692
==KEY-COLSEQ== BY ====.
1269312693
])
12694-
AT_CHECK([$COMPILE -Wno-unfinished prog1.cob], [0], [], [])
12694+
AT_CHECK([$COMPILE -Wno-unfinished prog1.cob], [0], [],
12695+
[prog.cpy:18: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12696+
])
1269512697
AT_CHECK([$COBCRUN_DIRECT ./prog1 1>prog1.out], [0], [], [])
1269612698
AT_CHECK([diff reference_ascii prog1.out], [0], [], [])
1269712699

@@ -12712,7 +12714,9 @@ AT_DATA([prog3.cob], [
1271212714
==FILE-COLSEQ== BY ==COLLATING SEQUENCE IS ASCII==
1271312715
==KEY-COLSEQ== BY ==COLLATING SEQUENCE OF MY-AKEY1 IS EBCDIC==.
1271412716
])
12715-
AT_CHECK([$COMPILE -Wno-unfinished prog3.cob], [0], [], [])
12717+
AT_CHECK([$COMPILE -Wno-unfinished prog3.cob], [0], [],
12718+
[prog.cpy:18: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12719+
])
1271612720
AT_CHECK([$COBCRUN_DIRECT ./prog3 1>prog3.out], [0], [], [])
1271712721
AT_CHECK([diff reference_ascii_ebcdic prog3.out], [0], [], [])
1271812722

@@ -12732,7 +12736,9 @@ AT_DATA([prog5.cob], [
1273212736
==FILE-COLSEQ== BY ==COLLATING SEQUENCE IS EBCDIC==
1273312737
==KEY-COLSEQ== BY ==COLLATING SEQUENCE OF MY-AKEY1 IS EBCDIC==.
1273412738
])
12735-
AT_CHECK([$COMPILE -Wno-unfinished prog5.cob], [0], [], [])
12739+
AT_CHECK([$COMPILE -Wno-unfinished prog5.cob], [0], [],
12740+
[prog.cpy:18: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12741+
])
1273612742
AT_CHECK([$COBCRUN_DIRECT ./prog5 1>prog5.out], [0], [], [])
1273712743
AT_CHECK([diff reference_ebcdic prog5.out], [0], [], [])
1273812744

@@ -12742,7 +12748,9 @@ AT_DATA([prog6.cob], [
1274212748
==FILE-COLSEQ== BY ====
1274312749
==KEY-COLSEQ== BY ====.
1274412750
])
12745-
AT_CHECK([$COMPILE -Wno-unfinished -fdefault-file-colseq=EBCDIC prog6.cob], [0], [], [])
12751+
AT_CHECK([$COMPILE -Wno-unfinished -fdefault-file-colseq=EBCDIC prog6.cob], [0], [],
12752+
[prog.cpy:15: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12753+
])
1274612754
AT_CHECK([$COBCRUN_DIRECT ./prog6 1>prog6.out], [0], [], [])
1274712755
AT_CHECK([diff reference_ebcdic prog6.out], [0], [], [])
1274812756

@@ -12752,7 +12760,9 @@ AT_DATA([prog7.cob], [
1275212760
==FILE-COLSEQ== BY ==COLLATING SEQUENCE IS EBCDIC==
1275312761
==KEY-COLSEQ== BY ==COLLATING SEQUENCE OF MY-AKEY1 IS ASCII==.
1275412762
])
12755-
AT_CHECK([$COMPILE -Wno-unfinished prog7.cob], [0], [], [])
12763+
AT_CHECK([$COMPILE -Wno-unfinished prog7.cob], [0], [],
12764+
[prog.cpy:18: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12765+
])
1275612766
AT_CHECK([$COBCRUN_DIRECT ./prog7 1>prog7.out], [0], [], [])
1275712767
AT_CHECK([diff reference_ebcdic_ascii prog7.out], [0], [], [])
1275812768

@@ -12762,7 +12772,9 @@ AT_DATA([prog8.cob], [
1276212772
==FILE-COLSEQ== BY ====
1276312773
==KEY-COLSEQ== BY ==COLLATING SEQUENCE OF MY-AKEY1 IS ASCII==.
1276412774
])
12765-
AT_CHECK([$COMPILE -Wno-unfinished -fdefault-file-colseq=EBCDIC prog8.cob], [0], [], [])
12775+
AT_CHECK([$COMPILE -Wno-unfinished -fdefault-file-colseq=EBCDIC prog8.cob], [0], [],
12776+
[prog.cpy:15: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'MY-AKEY2'
12777+
])
1276612778
AT_CHECK([$COBCRUN_DIRECT ./prog8 1>prog8.out], [0], [], [])
1276712779
AT_CHECK([diff reference_ebcdic_ascii prog8.out], [0], [], [])
1276812780

tests/testsuite.src/syn_file.at

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ AT_CLEANUP
631631

632632

633633
AT_SETUP([INDEXED file invalid key items])
634-
AT_KEYWORDS([record ALTERNATE split])
634+
AT_KEYWORDS([record ALTERNATE split collation])
635635

636636
AT_DATA([prog.cob], [
637637
IDENTIFICATION DIVISION.
@@ -658,6 +658,27 @@ AT_DATA([prog.cob], [
658658
RECORD KEY IS NOT-HERE-KEY
659659
SOURCE IS NOT-IN-FILE1
660660
NOT-IN-FILE2.
661+
SELECT TEST-CSQ1 ASSIGN TO 'FILE-TEST-COSQ1'
662+
ORGANIZATION IS INDEXED
663+
ACCESS MODE IS DYNAMIC
664+
RECORD KEY IS TEST-P5
665+
ALTERNATE KEY IS TEST-P6
666+
ALTERNATE KEY IS TEST-P7
667+
COLLATING SEQUENCE IS EBCDIC
668+
COLLATING SEQUENCE OF TEST-P7 IS EBCDIC.
669+
SELECT TEST-CSQ2 ASSIGN TO 'FILE-TEST-COSQ2'
670+
ORGANIZATION IS INDEXED
671+
ACCESS MODE IS DYNAMIC
672+
RECORD KEY IS TEST-P8
673+
COLLATING SEQUENCE IS EBCDIC *> unused
674+
COLLATING SEQUENCE OF TEST-P8 IS EBCDIC.
675+
SELECT TEST-CSQ3 ASSIGN TO 'FILE-TEST-COSQ3'
676+
ORGANIZATION IS INDEXED
677+
ACCESS MODE IS DYNAMIC
678+
RECORD KEY IS SPLIT-KEY1 = TEST-P9 TEST-P10
679+
ALTERNATE KEY IS SPLIT-KEY2 = TEST-P9 TEST-P11
680+
COLLATING SEQUENCE IS EBCDIC *> should not warn
681+
COLLATING SEQUENCE OF SPLIT-KEY2 IS EBCDIC.*> should not warn
661682
DATA DIVISION.
662683
FILE SECTION.
663684
FD TEST-SOME.
@@ -670,6 +691,20 @@ AT_DATA([prog.cob], [
670691
FD TEST-MORE.
671692
01 MORE-REC.
672693
05 MORE-DATA PIC X(4).
694+
FD TEST-CSQ1.
695+
01 CSQ1-REC.
696+
05 TEST-P5 PIC 9(2) BINARY.
697+
05 TEST-P6 PIC 9(2) BINARY.
698+
05 TEST-P7 PIC X(2).
699+
FD TEST-CSQ2.
700+
01 CSQ2-REC.
701+
05 TEST-P8 PIC 9(2) BINARY.
702+
05 TEST-P8X PIC X(2).
703+
FD TEST-CSQ3.
704+
01 CSQ3-REC.
705+
05 TEST-P9 PIC 9(2) BINARY.
706+
05 TEST-P10 PIC 9(2) BINARY.
707+
05 TEST-P11 PIC X(2).
673708
WORKING-STORAGE SECTION.
674709
77 TEST-P2 PIC S9(4) COMP.
675710
77 TEST-P3 PIC S9(5) COMP-3.
@@ -681,13 +716,22 @@ AT_DATA([prog.cob], [
681716

682717
# FIXME: "is not defined" should be changed in "is not defined in file ..."
683718
AT_CHECK([$COMPILE_ONLY prog.cob], [1], [],
684-
[prog.cob:10: error: 'TEST-P2' is not defined
719+
[prog.cob:33: warning: handling of FILE COLLATING SEQUENCE is unfinished; implementation is likely to be changed
720+
prog.cob:33: warning: handling of KEY COLLATING SEQUENCE is unfinished; implementation is likely to be changed
721+
prog.cob:39: warning: handling of FILE COLLATING SEQUENCE is unfinished; implementation is likely to be changed
722+
prog.cob:39: warning: handling of KEY COLLATING SEQUENCE is unfinished; implementation is likely to be changed
723+
prog.cob:46: warning: handling of FILE COLLATING SEQUENCE is unfinished; implementation is likely to be changed
724+
prog.cob:46: warning: handling of KEY COLLATING SEQUENCE is unfinished; implementation is likely to be changed
725+
prog.cob:10: error: 'TEST-P2' is not defined
685726
prog.cob:11: error: 'TEST-P1' is not defined
686727
prog.cob:12: error: 'TEST-P3' is not defined
687728
prog.cob:18: error: 'NOT-THERE' is not defined
688729
prog.cob:13: error: invalid KEY item 'SOME-REC', not in file 'TEST-FILE'
689730
prog.cob:24: error: 'NOT-IN-FILE1' is not defined
690731
prog.cob:20: error: invalid KEY item 'NOT-HERE-KEY', not in file 'TEST-MORE'
732+
prog.cob:32: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'TEST-P5'
733+
prog.cob:32: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'TEST-P6'
734+
prog.cob:39: warning: COLLATING SEQUENCE is ignored for non-alphanumeric key 'TEST-P8'
691735
prog.cob:25: error: 'NOT-IN-FILE2' is not defined
692736
])
693737

0 commit comments

Comments
 (0)