Skip to content

Commit 0203243

Browse files
committed
Started writelob-lo, changes to relevant tests
1 parent c884b29 commit 0203243

File tree

6 files changed

+94
-71
lines changed

6 files changed

+94
-71
lines changed

src/rwl.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -859,10 +859,12 @@ struct rwl_main
859859
sb4 filvarn; /* fine variable number for write/writeline */
860860
text *lobnam; /* LOB variable name for readlob/rwitelob */
861861
sb4 lobvarn; /* LOB variable number for readlob/rwitelob */
862-
text *lobwritenam;
863-
sb4 lobwritevarn;
864-
text *loblengthnam;
865-
sb4 loblengthvarn;
862+
text *lobstringnam; /* String variable name for readlob/writelob to read/write to */
863+
sb4 lobstringvarn; /* String variable number readlob/writelob to read/write to */
864+
text *loblengthnam; /* LOB read length varible name for readlob */
865+
sb4 loblengthvarn; /* LOB read length variable number for readlob */
866+
sb4 lobdataexpr; /* Flag for whether or not lob write data is a expression */
867+
rwl_estack *lobwritedata; /* Data to write to LOB for data stream */
866868
rwl_estack *loboffset; /* LOB offset to start at for data stream */
867869

868870
rwl_sql *sqsav; /* temporary save of sql */
@@ -1710,6 +1712,7 @@ extern void rwlcodeadd(rwl_main *, rwl_code_t, void *, ub4 , void *, ub4, void *
17101712
#define rwlcodeaddpupupu(rwlp,ctype,parg1,arg2,parg3,arg4,parg5,arg6) rwlcodeadd(rwlp,ctype,parg1,arg2,parg3,arg4,parg5,arg6,0)
17111713
#define rwlcodeaddpuppp(rwlp,ctype,parg1,arg2,parg3,parg5,parg7) rwlcodeadd(rwlp,(ctype),parg1,arg2,parg3,0,parg5,0,parg7)
17121714
#define rwlcodeaddpupp(rwlp,ctype,parg1,arg2,parg3,parg5) rwlcodeadd(rwlp,ctype,parg1,arg2,parg3,0,parg5,0,0)
1715+
#define rwlcodeaddpupup(rwlp,ctype,parg1,arg2,parg3,arg4,parg5) rwlcodeadd(rwlp,ctype,parg1,arg2,parg3,arg4,parg5,0,0)
17131716
#define rwlcodeaddpupu(rwlp,ctype,parg1,arg2,parg3,arg4) rwlcodeadd(rwlp,ctype,parg1,arg2,parg3,arg4,0,0,0)
17141717
#define rwlcodeaddpup(rwlp,ctype,parg1,arg2,parg3) rwlcodeadd(rwlp,ctype,parg1,arg2,parg3,0,0,0,0)
17151718
#define rwlcodeaddppu(rwlp,ctype,parg1,parg3,arg4) rwlcodeadd(rwlp,ctype,parg1,0,parg3,arg4,0,0,0)

src/rwlparser.y

Lines changed: 74 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,63 +2972,37 @@ statement:
29722972
}
29732973
}
29742974

2975-
| RWL_T_READLOB readlobhead maybereadlobtail terminator
2975+
| RWL_T_READLOB readlobhead maybereadlobtail terminator
29762976
{
29772977
if (rwm->loblengthvarn && rwm->loboffset)
29782978
{
29792979

29802980
rwlcodeaddpupupup(rwm, RWL_CODE_READLOB_LO, rwm->lobnam, rwm->lobvarn,
2981-
rwm->lobwritenam, rwm->lobwritevarn, rwm->loblengthnam, rwm->loblengthvarn, rwm->loboffset);
2981+
rwm->lobstringnam, rwm->lobstringvarn, rwm->loblengthnam, rwm->loblengthvarn, rwm->loboffset);
29822982
}
29832983
else
29842984
{
2985-
rwlcodeaddpupu(rwm, RWL_CODE_READLOB, rwm->lobnam, rwm->lobvarn, rwm->lobwritenam, rwm->lobwritevarn);
2985+
rwlcodeaddpupu(rwm, RWL_CODE_READLOB, rwm->lobnam, rwm->lobvarn, rwm->lobstringnam, rwm->lobstringvarn);
29862986
}
29872987
}
29882988

2989-
| RWL_T_WRITELOB { bis(rwm->m2flags, RWL_P2_MAYBECOMMAW); } RWL_T_IDENTIFIER maybecomma
2990-
{
2991-
sb4 l;
2992-
rwm->lobvarn = RWL_VAR_NOTFOUND;
2993-
rwm->lobnam = rwm->inam;
2994-
if (bit(rwm->m2flags, RWL_P2_MAYBECOMMAW))
2995-
rwlerror(rwm, RWL_ERROR_COMMA_IS_RECOMMENDED, rwm->lobnam, "writelob");
2996-
/* lookup the file and check it is a file */
2997-
l = rwlfindvar2(rwm->mxq, rwm->lobnam, RWL_VAR_NOGUESS, rwm->codename);
2998-
if (l>=0)
2999-
{
3000-
switch (rwm->mxq->evar[l].vtype)
3001-
{
3002-
case RWL_TYPE_BLOB:
3003-
case RWL_TYPE_CLOB:
3004-
rwm->lobvarn = l;
3005-
break;
3006-
3007-
default:
3008-
rwlerror(rwm,RWL_ERROR_INCORRECT_TYPE2
3009-
, rwm->mxq->evar[l].stype, rwm->lobnam, "lob");
3010-
break;
3011-
}
3012-
}
3013-
}
3014-
concatenation terminator
3015-
{
3016-
rwl_estack *estk;
3017-
estk = rwlexprfinish(rwm);
3018-
if (rwm->codename)
3019-
rwlcodeaddpup(rwm, RWL_CODE_WRITELOB, rwm->lobnam
3020-
, rwm->lobvarn, estk);
3021-
else
3022-
if (!bit(rwm->m2flags, RWL_P2_NOEXEC))
3023-
{
3024-
rwlexpreval(estk, &rwm->loc, rwm->mxq, &rwm->mxq->xqnum);
3025-
if (rwm->maindb)
3026-
rwlwritelob(rwm->mxq, rwm->mxq->evar[rwm->lobvarn].num.vptr, rwm->maindb
3027-
, &rwm->mxq->xqnum, &rwm->loc, 0);
3028-
else
3029-
rwlerror(rwm, RWL_ERROR_NOT_DONE_IN_MAIN, "writelob");
3030-
}
3031-
}
2989+
| RWL_T_WRITELOB writelobhead maybewritelobtail terminator
2990+
{
2991+
if (rwm->loboffset)
2992+
{
2993+
rwlcodeaddpupup(rwm, RWL_CODE_WRITELOB, rwm->lobnam, rwm->lobvarn,
2994+
rwm->lobstringnam, rwm->lobstringvarn, rwm->loboffset);
2995+
}
2996+
else if (rwm->lobdataexpr)
2997+
{
2998+
rwlcodeaddpup(rwm, RWL_CODE_WRITELOB, rwm->lobnam
2999+
, rwm->lobvarn, rwm->lobwritedata);
3000+
}
3001+
else
3002+
{
3003+
rwlcodeaddpupu(rwm, RWL_CODE_WRITELOB, rwm->lobnam, rwm->lobvarn, rwm->lobstringnam, rwm->lobstringvarn);
3004+
}
3005+
}
30323006

30333007
| controlloopheader
30343008
{
@@ -3101,10 +3075,56 @@ statement:
31013075
;
31023076
/* end of statement */
31033077

3104-
maybecomma:
3078+
writelobhead:
3079+
RWL_T_IDENTIFIER ','
3080+
{
3081+
sb4 l;
3082+
rwm->lobvarn = RWL_VAR_NOTFOUND;
3083+
rwm->lobnam = rwm->inam;
3084+
/* lookup the file and check it is a file */
3085+
l = rwlfindvar2(rwm->mxq, rwm->lobnam, RWL_VAR_NOGUESS, rwm->codename);
3086+
if (l>=0)
3087+
{
3088+
switch (rwm->mxq->evar[l].vtype)
3089+
{
3090+
case RWL_TYPE_BLOB:
3091+
case RWL_TYPE_CLOB:
3092+
rwm->lobvarn = l;
3093+
break;
3094+
3095+
default:
3096+
rwlerror(rwm,RWL_ERROR_INCORRECT_TYPE2
3097+
, rwm->mxq->evar[l].stype, rwm->lobnam, "lob");
3098+
break;
3099+
}
3100+
}
3101+
}
3102+
concatenation
3103+
{
3104+
rwl_estack *estk;
3105+
estk = rwlexprfinish(rwm);
3106+
if (rwm->codename)
3107+
{
3108+
rwm->lobdataexpr = 1;
3109+
rwm->lobwritedata = estk;
3110+
}
3111+
else
3112+
if (!bit(rwm->m2flags, RWL_P2_NOEXEC))
3113+
{
3114+
rwlexpreval(estk, &rwm->loc, rwm->mxq, &rwm->mxq->xqnum);
3115+
if (rwm->maindb)
3116+
rwlwritelob(rwm->mxq, rwm->mxq->evar[rwm->lobvarn].num.vptr, rwm->maindb
3117+
, &rwm->mxq->xqnum, &rwm->loc, 0);
3118+
else
3119+
rwlerror(rwm, RWL_ERROR_NOT_DONE_IN_MAIN, "writelob");
3120+
}
3121+
}
3122+
maybewritelobtail:
31053123
/*empty*/
3106-
| ',' { bic(rwm->m2flags, RWL_P2_MAYBECOMMAW); }
3107-
;
3124+
| ',' expression
3125+
{
3126+
rwm->loboffset = rwlexprfinish(rwm);
3127+
}
31083128

31093129
readlobhead:
31103130
RWL_T_IDENTIFIER ','
@@ -3133,22 +3153,22 @@ readlobhead:
31333153
RWL_T_IDENTIFIER
31343154
{
31353155
sb4 l;
3136-
rwm->lobwritevarn = 0;
3156+
rwm->lobstringvarn = 0;
31373157
rwm->loblengthvarn = 0;
31383158
rwm->loboffset = 0;
3139-
rwm->lobwritenam = (yychar == RWL_T_IDENTIFIER)
3159+
rwm->lobstringnam = (yychar == RWL_T_IDENTIFIER)
31403160
? rwm->previnam
31413161
: rwm->inam;
3142-
l = rwlfindvar2(rwm->mxq, rwm->lobwritenam, RWL_VAR_NOGUESS, rwm->codename);
3162+
l = rwlfindvar2(rwm->mxq, rwm->lobstringnam, RWL_VAR_NOGUESS, rwm->codename);
31433163
if (l>=0)
31443164
{
31453165
switch (rwm->mxq->evar[l].vtype)
31463166
{
31473167
case RWL_TYPE_STR:
3148-
rwm->lobwritevarn = l;
3168+
rwm->lobstringvarn = l;
31493169
break;
31503170
default:
3151-
rwlerror(rwm,RWL_ERROR_INCORRECT_TYPE2, rwm->mxq->evar[l].stype, rwm->lobwritenam, "string");
3171+
rwlerror(rwm,RWL_ERROR_INCORRECT_TYPE2, rwm->mxq->evar[l].stype, rwm->lobstringnam, "string");
31523172
break;
31533173
}
31543174
}

test/134.rwl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ is
2626

2727
ins;
2828
sel;
29-
writelob cl1 "hello" erlang2(100.0);
30-
writelob cl2 "world" || erlang2(100.0);
29+
writelob cl1, "hello" erlang2(100.0);
30+
writelob cl2, "world" || erlang2(100.0);
3131
commit;
3232
return id;
3333
end;
@@ -60,8 +60,8 @@ procedure dosome()
6060
id2 := inslobs();
6161

6262
for selthem loop
63-
readlob xl1 sl1;
64-
readlob xl2 sl2;
63+
readlob xl1, sl1;
64+
readlob xl2, sl2;
6565
printline sl1, sl2;
6666
end;
6767
end;

test/400.rwl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ is
2222

2323
ins;
2424
sel;
25-
writelob cl1,"verylongstring" || erlang2(100.0);
25+
string lobstring := "verylongstring" || erlang2(100.0);
26+
writelob cl1, lobstring;
2627
commit;
2728
return id;
2829
end;

test/72-10046.rwl

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,11 @@ is
2323

2424
ins;
2525
sel;
26-
writelob cl1 "hello" || erlang2(100.0);
27-
writelob cl2 "world" || erlang2(100.0);
26+
string clob1str, clob2str;
27+
clob1str := "hello" || erlang2(100.0);
28+
clob2str := "hello" || erlang2(100.0);
29+
writelob cl1, clob1str;
30+
writelob cl2, clob2str;
2831
commit;
2932
return id;
3033
end;
@@ -57,8 +60,8 @@ procedure dosome()
5760
id2 := inslobs();
5861

5962
for selthem loop
60-
readlob xl1 sl1;
61-
readlob xl2 sl2;
63+
readlob xl1, sl1;
64+
readlob xl2, sl2;
6265
printline sl1, sl2;
6366
end;
6467
end;

test/testres/134.err.good

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +0,0 @@
1-
RWL-137: warning at [134.rwl;29]: a comma is recommended after 'cl1' in writelob
2-
RWL-137: warning at [134.rwl;30]: a comma is recommended after 'cl2' in writelob
3-
RWL-137: warning at [134.rwl;63]: a comma is recommended after 'xl1' in readlob
4-
RWL-137: warning at [134.rwl;64]: a comma is recommended after 'xl2' in readlob

0 commit comments

Comments
 (0)