1
0
mirror of https://github.com/sasjs/core.git synced 2026-01-05 00:20:05 +00:00

Compare commits

...

6 Commits

Author SHA1 Message Date
Allan Bowe
349cbabc94 Merge pull request #282 from sasjs/allanbowe/error-multiple-lengths-281
fix: prevent warning from `_label_` variable with different lengths
2022-07-12 23:29:47 +01:00
Allan Bowe
9de056a3fc fix: prevent warning from _label_ variable with different lengths
Closes #281
2022-07-12 22:18:01 +00:00
Allan Bowe
ad497b322f chore(tests): adding some extra test cases 2022-07-12 15:03:41 +00:00
Allan Bowe
7a6408ee44 Merge pull request #280 from sasjs/allanbowe/support-special-missings-279
fix: supporting special missings in BETWEEN and IN operators
2022-07-08 00:25:53 +01:00
Allan Bowe
336743f2b4 fix: applying logic to BETWEEN as well as IN 2022-07-07 23:24:24 +00:00
Allan Bowe
6e32eb3bd6 fix: supporting special missings in BETWEEN and IN operators
Impacts mp_filtercheck.sas.  Tests added.  Closes #279
2022-07-07 22:47:04 +00:00
6 changed files with 92 additions and 30 deletions

43
all.sas
View File

@@ -5883,7 +5883,8 @@ data &outds;
/*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32 /*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32
OPERATOR_NM $10 RAW_VALUE $4000;*/ OPERATOR_NM $10 RAW_VALUE $4000;*/
set &inds; set &inds;
length reason_cd $4032 vtype $1 vnum dsid 8; length reason_cd $4032 vtype $1 vnum dsid 8 tmp $4000;
drop tmp;
/* quick check to ensure column exists */ /* quick check to ensure column exists */
if upcase(VARIABLE_NM) not in if upcase(VARIABLE_NM) not in
@@ -5959,18 +5960,32 @@ data &outds;
end; end;
/* special logic */ /* special logic */
if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',''); if OPERATOR_NM in ('IN','NOT IN','BETWEEN') then do;
else if OPERATOR_NM in ('IN','NOT IN') then do; if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',',');
if substr(raw_value,1,1) ne '(' else do;
or substr(cats(reverse(raw_value)),1,1) ne ')' if substr(raw_value,1,1) ne '('
then do; or substr(cats(reverse(raw_value)),1,1) ne ')'
REASON_CD='Missing start/end bracket in RAW_VALUE'; then do;
putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ; REASON_CD='Missing start/end bracket in RAW_VALUE';
call symputx('reason_cd',reason_cd,'l'); putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ;
call symputx('nobs',_n_,'l'); call symputx('reason_cd',reason_cd,'l');
output; call symputx('nobs',_n_,'l');
output;
end;
else raw_value1=substr(raw_value,2,max(length(raw_value)-2,0));
end;
/* we now have a comma seperated list of values */
if vtype='N' then do i=1 to countc(raw_value1, ',')+1;
tmp=scan(raw_value1,i,',');
if cats(tmp) ne '.' and input(tmp, ?? 8.) eq . then do;
REASON_CD='Non Numeric value provided';
putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ;
call symputx('reason_cd',reason_cd,'l');
call symputx('nobs',_n_,'l');
output;
end;
return;
end; end;
else raw_value1=substr(raw_value,2,max(length(raw_value)-2,0));
end; end;
else raw_value1=raw_value; else raw_value1=raw_value;
@@ -11769,7 +11784,9 @@ run;
%else %let vlist=%mf_getvarlist(&libds,dlm=%str(,),quote=DOUBLE); %else %let vlist=%mf_getvarlist(&libds,dlm=%str(,),quote=DOUBLE);
data &ds4; data &ds4;
length &inds_keep $41 tgtvar_nm $32; length &inds_keep $41 tgtvar_nm $32 _label_ $256;
if _n_=1 then call missing(_label_);
drop _label_;
set &ds2 &ds3 indsname=&inds_auto; set &ds2 &ds3 indsname=&inds_auto;
tgtvar_nm=upcase(tgtvar_nm); tgtvar_nm=upcase(tgtvar_nm);

View File

@@ -92,7 +92,8 @@ data &outds;
/*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32 /*length GROUP_LOGIC SUBGROUP_LOGIC $3 SUBGROUP_ID 8 VARIABLE_NM $32
OPERATOR_NM $10 RAW_VALUE $4000;*/ OPERATOR_NM $10 RAW_VALUE $4000;*/
set &inds; set &inds;
length reason_cd $4032 vtype $1 vnum dsid 8; length reason_cd $4032 vtype $1 vnum dsid 8 tmp $4000;
drop tmp;
/* quick check to ensure column exists */ /* quick check to ensure column exists */
if upcase(VARIABLE_NM) not in if upcase(VARIABLE_NM) not in
@@ -168,18 +169,32 @@ data &outds;
end; end;
/* special logic */ /* special logic */
if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',''); if OPERATOR_NM in ('IN','NOT IN','BETWEEN') then do;
else if OPERATOR_NM in ('IN','NOT IN') then do; if OPERATOR_NM='BETWEEN' then raw_value1=tranwrd(raw_value,' AND ',',');
if substr(raw_value,1,1) ne '(' else do;
or substr(cats(reverse(raw_value)),1,1) ne ')' if substr(raw_value,1,1) ne '('
then do; or substr(cats(reverse(raw_value)),1,1) ne ')'
REASON_CD='Missing start/end bracket in RAW_VALUE'; then do;
putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ; REASON_CD='Missing start/end bracket in RAW_VALUE';
call symputx('reason_cd',reason_cd,'l'); putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ;
call symputx('nobs',_n_,'l'); call symputx('reason_cd',reason_cd,'l');
output; call symputx('nobs',_n_,'l');
output;
end;
else raw_value1=substr(raw_value,2,max(length(raw_value)-2,0));
end;
/* we now have a comma seperated list of values */
if vtype='N' then do i=1 to countc(raw_value1, ',')+1;
tmp=scan(raw_value1,i,',');
if cats(tmp) ne '.' and input(tmp, ?? 8.) eq . then do;
REASON_CD='Non Numeric value provided';
putlog REASON_CD= OPERATOR_NM= raw_value= raw_value1= ;
call symputx('reason_cd',reason_cd,'l');
call symputx('nobs',_n_,'l');
output;
end;
return;
end; end;
else raw_value1=substr(raw_value,2,max(length(raw_value)-2,0));
end; end;
else raw_value1=raw_value; else raw_value1=raw_value;

View File

@@ -154,7 +154,9 @@ run;
%else %let vlist=%mf_getvarlist(&libds,dlm=%str(,),quote=DOUBLE); %else %let vlist=%mf_getvarlist(&libds,dlm=%str(,),quote=DOUBLE);
data &ds4; data &ds4;
length &inds_keep $41 tgtvar_nm $32; length &inds_keep $41 tgtvar_nm $32 _label_ $256;
if _n_=1 then call missing(_label_);
drop _label_;
set &ds2 &ds3 indsname=&inds_auto; set &ds2 &ds3 indsname=&inds_auto;
tgtvar_nm=upcase(tgtvar_nm); tgtvar_nm=upcase(tgtvar_nm);

View File

@@ -67,7 +67,7 @@
}, },
{ {
"name": "server", "name": "server",
"serverUrl": "", "serverUrl": "https://sas.4gl.io",
"serverType": "SASJS", "serverType": "SASJS",
"httpsAgentOptions": { "httpsAgentOptions": {
"allowInsecureRequests": false "allowInsecureRequests": false
@@ -107,4 +107,4 @@
"contextName": "SAS Job Execution compute context" "contextName": "SAS Job Execution compute context"
} }
] ]
} }

View File

@@ -38,7 +38,7 @@ William,M,15,66.5,112
;;;; ;;;;
run; run;
/* valid filter conditions */ /* VALID filter conditions */
data work.inds; data work.inds;
infile datalines4 dsd; infile datalines4 dsd;
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32. input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
@@ -51,6 +51,9 @@ AND,OR,2,Weight,>=,77.7
AND,OR,2,Weight,NE,77.7 AND,OR,2,Weight,NE,77.7
AND,AND,1,age,=,.A AND,AND,1,age,=,.A
AND,AND,1,height,<,.B AND,AND,1,height,<,.B
AND,AND,1,age,IN,"(.a,.b,.)"
AND,AND,1,age,IN,"(.A)"
;;;; ;;;;
run; run;
@@ -115,6 +118,28 @@ run;
outds=work.test_results outds=work.test_results
) )
/* invalid IN value */
data work.inds;
infile datalines4 dsd;
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
OPERATOR_NM:$10. RAW_VALUE:$4000.;
datalines4;
AND,OR,2,age,IN,"(.,.a,X)"
;;;;
run;
%mp_filtercheck(work.inds,
targetds=work.class,
outds=work.badrecords,
abort=NO
)
%let syscc=0;
%mp_assertdsobs(work.badrecords,
desc=Invalid IN value,
test=HASOBS,
outds=work.test_results
)
/* Code injection - column name */ /* Code injection - column name */
data work.inds; data work.inds;
infile datalines4 dsd; infile datalines4 dsd;
@@ -163,7 +188,7 @@ run;
data work.inds; data work.inds;
infile datalines4 dsd; infile datalines4 dsd;
input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32. input GROUP_LOGIC:$3. SUBGROUP_LOGIC:$3. SUBGROUP_ID:8. VARIABLE_NM:$32.
OPERATOR_NM:$10. RAW_VALUE:8; OPERATOR_NM:$10. RAW_VALUE:8.;
datalines4; datalines4;
AND,AND,1,age,=,0 AND,AND,1,age,=,0
;;;; ;;;;

View File

@@ -56,6 +56,9 @@ AND,AND,1,SEX,<=,"'M'"
AND,OR,2,Name,NOT IN,"('Jane','Alfred')" AND,OR,2,Name,NOT IN,"('Jane','Alfred')"
AND,OR,2,Weight,>=,77.7 AND,OR,2,Weight,>=,77.7
AND,OR,2,Weight,NE,77.7 AND,OR,2,Weight,NE,77.7
AND,AND,3,age,NOT IN,"(.a,.b,.)"
AND,AND,3,age,NOT IN,"(.A)"
AND,AND,4,Name,=,"'Jeremiah'"
;;;; ;;;;
run; run;