Re: Weird SQL Problem
Gad Miron <[email protected]> Sun, 3 May 2026 15:55:14 +0300
| Newsgroups | gmane.comp.lang.as400.rpg |
|---|---|
| Message-ID | <CAFj_=c1LuPubGbxsoOZK5nenwv53+eMrTGRQ2UVEak_bs-b7HA@mail.gmail.com> |
I have voted 1 Gad > date: Sun, 3 May 2026 13:28:30 +0200 > from: Daniel Gross <[email protected]> > subject: Re: Weird SQL Problem > > I have created an IBM idea to change the behavior of the pre-compiler, > because I think, that is not the IBM-i way of handling things: > > -> https://ibm-power-systems.ideas.ibm.com/ideas/IBMI-I-4904 > > If you like it, please vote. > > Thanks > Daniel > > > > Am 03.05.2026 um 13:04 schrieb Daniel Gross <[email protected]>: > > > > ?Well - the field is not to short - when BOOLEAN is converted to CHAR, > 'T'/'F', 1/0, '1'/'0', 'TRUE'/'FALSE' are all valid char constants. > > > > The BOOLEAN data type was a really good addition for Db2 for i - but > like most really good additions, it also brings some headaches for existing > programs. > > > > The correct way to circumvent this, would be to change the column to > BOOLEAN - recompile all programs - problem solved. > > > > But this is not the IBM i way. So I think a solution that keeps > backwards compatibility would be good - and that would mean, that *ON/*OFF > should convert to '1'/'0' and not 'T'/'F' for CHAR(1) fields - maybe as a > pre-compiler option. > > > > Regards, > > Daniel > > > > > >> Am 03.05.2026 um 12:50 schrieb Marco Facchinetti < > marco.facchinetti-kthxv0ud/[email protected]>: > >> > >> ?Suddenly, I'm not so sleepy anymore either :-). If it's as you say, > then > >> it's truly misleading and deserves further investigation. > >> > >> Normally I hate the fact that SQL gives an error if the field is too > long > >> but in this case I'd say it's useful. > >> > >> Best regards > >> -- > >> Marco Facchinetti > >> > >> Mr S.r.l. > >> > >> Tel. 035 962885 > >> Cel. 393 9620498 > >> > >> Skype: facchinettimarco > >> > >> > >>> Il giorno dom 3 mag 2026 alle ore 12:28 Daniel Gross <[email protected]> > ha > >>> scritto: > >>> > >>> > >>> Hi Jon, > >>> > >>> so - that problem didn't let me sleep real good - so I tested and bit > and > >>> searched - this is what I found: > >>> > >>> -> https://www.ibm.com/docs/en/i/7.5.0?topic=users-whats-new > >>> -> > >>> > https://www.ibm.com/docs/en/i/7.5.0?topic=changes-sql-ile-rpg-precompiler-change-boolean-support > >>> > >>> With the introduction of the SQL data type BOOLEAN, the pre-compiler > >>> changed, and now interprets RPG variables of type IND as BOOLEAN. > Existing > >>> programs that were not re-compiled, didn't change. > >>> > >>> Now what happens is simple - if you write an IND variable into a > CHAR(1) > >>> field in SQL, the value of the field is "T" or "F" - for "TRUE" and > >>> "FALSE". This code shows it quite good: > >>> > >>> dcl-s indic ind inz(*on); > >>> dcl-s char1 char(1) inz; > >>> dcl-s vchar varchar(10) inz; > >>> exec sql set (:char1, :vchar) = (:indic, :indic); > >>> > >>> char1 will be "T" and char will be "TRUE" after the EXEC SQL. > >>> > >>> And the same will happen with a CHAR(1) column in a table. But in a > newly > >>> compiled SQLRPGLE program, this wouldn't be a problem, as char values > "T" > >>> and "F" are correctly interpreted - but only in newly compiled > programs. > >>> > >>> I hope I could clarify this a bit. > >>> > >>> Regards, > >>> Daniel > >>> > >>> > >>>>>> Am 02.05.2026 um 23:04 schrieb Jon Paris <[email protected] > >: > >>>>> ?Well the ?fix? was this Daniel > >>>>> > >>>>> Dcl-DS Remap; // Used to remap indicator as char field for logging > (SQL > >>> bug) > >>>> result Ind; > >>>> resultC Char(1) samepos(result); > >>>> End-DS; > >>>> > >>>> Then using ?resultC" in place of ?result" as the host variable and > that > >>> fixed it. > >>>> > >>>> Remember - as I said before - this _exact_ code has been running > without > >>> errors for a couple of years. Because of the nature of the data (a log > of > >>> errors) we?re not sure exactly when it stopped working as we hadn?t > needed > >>> to look at the log until another issue arose a few days ago. > >>>> > >>>> I?ll be reporting the error to IBM. > >>>> > >>>> > >>>> Jon Paris > >>>> > >>>>> On May 2, 2026, at 15:11, Daniel Gross <[email protected]> wrote: > >>>>> > >>>>> Well - yes - historically an indicator is a CHAR(1) field, that only > >>> can be '0' or '1' - I think that was our way back on punched cards ;-) > - > >>> today BOOLEAN is the safe way to go. And in an ideal world, the > >>> pre-compiler should be helpful - but we live with an imperfect > pre-compiler > >>> since it exists. > >>>>> > >>>>> And now that you say it - the phenomenon with the "T" as a value has > >>> occurred to me too some time ago - but I can't remember what I have > done to > >>> cure it. Probably I also CASTed or used a CASE expression. > >>>>> > >>>>> The explanation for that phenomenon seems to this: > >>> https://www.ibm.com/docs/en/i/7.6.0?topic=statement-boolean-data-type > - I > >>> quote from the page: > >>>>> > >>>>>> String values representing true are 't' , 'true' , 'y', 'yes' , > 'on', > >>> and '1'. False can be represented by 'f', 'false', 'n', 'no', 'off', > and > >>> '0'. Any combination of uppercase and lowercase characters are > recognized. > >>>>> > >>>>> So - probably the indicator value *ON is converted to 'T' when > written > >>> to the table with SQL - because since BOOLEAN exists as a data type, > >>> indicators are treated as boolean values by the SQL engine. But this is > >>> pure speculation on my side. > >>>>> > >>>>> Can you look into the table data? Maybe look at the rows, where the > >>> SQLRPGLE fails? > >>>>> > >>>>> Regards, > >>>>> Daniel > >>>>> > >>>>> > >>>>> > >>>>>> Am 02.05.2026 um 20:44 schrieb Jon Paris <[email protected] > >: > >>>>>> ?I understand all that Daniel but the underlying data type for an > RPG > >>> indicator has always been char(1). > >>>>>> Perhaps more to the point: > >>>>>> 1) if this was a coding error on my part, the pre-compiler should > spit > >>> it out. Not accept it and screw up at run time. > >>>>>> 2) This has been working since 2024 > >>>>>> 3) If I manually cast the indicator I no longer get an error but the > >>> value returned is not zero or 1. It is currently a ?T? for the *On > >>> condition. > >>>>>> 4) The table has been around for some time and a bunch of other > stuff > >>> would have to change if I switch it to boolean. I?d rather avoid that. > >>>>>> Looks like I?m going to have to ?manually? interpret the indicator > and > >>> pass the resulting char field to the SQL. > >>>>>> Jon Paris > >>>>>>> On May 2, 2026, at 14:27, Daniel Gross <[email protected]> wrote: > >>>>>>> Hi Jon, > >>>>>>> if you use an indicator for the RESULT column, the natural SQL data > >>> type would be BOOLEAN. An indicator can only be *ON or *OFF - a Boolean > >>> column can only be TRUE (*ON) or FALSE (*OFF) - an embedded SQL is > >>> correctly casting/converting between those 2 data types. > >>>>>>> HTH > >>>>>>> Daniel > >>>>>>>>> Am 02.05.2026 um 20:15 schrieb Jon Paris < > [email protected] > >>>> : > >>>>>>>> ?Apologies if this is a dup but my original was rejected (I think) > >>> and I can?t see anything for May in the archives. > >>>>>>>> I have a table defined as: > >>>>>>>> REGISTERTIME TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, > >>>>>>>> WEBINARID DECIMAL(11, 0) NOT NULL DEFAULT 0 , > >>>>>>>> RESULT CHAR(1) NOT NULL DEFAULT '0' , > >>>>>>>> REGISTERDATA VARCHAR(1000) ALLOCATE(300) CCSID 37 NOT NULL > >>>>>>>> The SQL statement to insert the data is: > >>>>>>>> Insert into table ( webinarId, result, registerData ) > >>>>>>>> values( :webinarId, :result, :request ); > >>>>>>>> Where the columns are all defined as per the table definition - > >>> except that ?result? in the RPG code is an indicator. > >>>>>>>> This code has been running for a couple of years but since our > move > >>> to 7.6 has started to sometimes throw SQLCODE -404 against the ?result" > >>> column claiming that its length of 4 exceeds the capacity of the > column. > >>> But it isn?t 4 long it is 1. Running in debug, I can see that the temp > >>> variable for ?result? created by the pre-processor is char(1). > >>>>>>>> Not sure where else to look. > >>>>>>>> I have googled for PTFs or reported errors but am not seeing > >>> anything. > >>>>>>>> Anyone got any ideas on where to look next? > >>>>>>>> I have a work around - if I face the cast of the indicator to > >>> char(1) it works. Guess there is a bug in the code generated by the > >>> pre-compiler. > >>>>>>>> Insert into partner400/sqlregtest ( result, webinarId, regData ) > >>>>>>>> values( cast (:result as char(1)), :webinarId, :request ); > >>>>>>>> Jon Paris > >>>>>>>> -- > >>>>>>>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>>>>>>> To post a message email: [email protected] > >>>>>>>> To subscribe, unsubscribe, or change list options, > >>>>>>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>>>>>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>>>>>>> Before posting, please take a moment to review the archives > >>>>>>>> at https://archive.midrange.com/rpg400-l. > >>>>>>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > >>> related questions. > >>>>>>> -- > >>>>>>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>>>>>> To post a message email: [email protected] > >>>>>>> To subscribe, unsubscribe, or change list options, > >>>>>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>>>>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>>>>>> Before posting, please take a moment to review the archives > >>>>>>> at https://archive.midrange.com/rpg400-l. > >>>>>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > >>> related questions. > >>>>>> -- > >>>>>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>>>>> To post a message email: [email protected] > >>>>>> To subscribe, unsubscribe, or change list options, > >>>>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>>>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>>>>> Before posting, please take a moment to review the archives > >>>>>> at https://archive.midrange.com/rpg400-l. > >>>>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > >>> related questions. > >>>>> > >>>>> -- > >>>>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>>>> To post a message email: [email protected] > >>>>> To subscribe, unsubscribe, or change list options, > >>>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>>>> Before posting, please take a moment to review the archives > >>>>> at https://archive.midrange.com/rpg400-l. > >>>>> > >>>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > >>> related questions. > >>>> > >>>> -- > >>>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>>> To post a message email: [email protected] > >>>> To subscribe, unsubscribe, or change list options, > >>>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>>> Before posting, please take a moment to review the archives > >>>> at https://archive.midrange.com/rpg400-l. > >>>> > >>>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > >>> related questions. > >>> -- > >>> This is the RPG programming on IBM i (RPG400-L) mailing list > >>> To post a message email: [email protected] > >>> To subscribe, unsubscribe, or change list options, > >>> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >>> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >>> Before posting, please take a moment to review the archives > >>> at https://archive.midrange.com/rpg400-l. > >>> > >>> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > related > >>> questions. > >>> > >>> > >> -- > >> This is the RPG programming on IBM i (RPG400-L) mailing list > >> To post a message email: [email protected] > >> To subscribe, unsubscribe, or change list options, > >> visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > >> or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > >> Before posting, please take a moment to review the archives > >> at https://archive.midrange.com/rpg400-l. > >> > >> Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription > related questions. > >> > > > > > ------------------------------ > > Subject: Digest Footer > > -- > This is the RPG programming on IBM i (RPG400-L) digest list > To post a message email: [email protected] > To subscribe, unsubscribe, or change list options, > visit: https://lists.midrange.com/mailman/listinfo/rpg400-l > or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org > Before posting, please take a moment to review the archives > at http://archive.midrange.com/rpg400-l. > > Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription related > questions. > > > > ------------------------------ > > End of RPG400-L Digest, Vol 25, Issue 140 > ***************************************** > -- This is the RPG programming on IBM i (RPG400-L) mailing list To post a message email: [email protected] To subscribe, unsubscribe, or change list options, visit: https://lists.midrange.com/mailman/listinfo/rpg400-l or email: RPG400-L-request-+hD5IHI5Xscn3HwCXmMcX9BPR1lH4CV8@public.gmane.org Before posting, please take a moment to review the archives at https://archive.midrange.com/rpg400-l. Please contact support-FMtJrHiV//lnDLsaKlm4mFaTQe2KTcn/@public.gmane.org for any subscription related questions.