felipebz / zpa

Parser and static code analysis tool for PL/SQL and Oracle SQL.
https://zpa.felipebz.com
GNU Lesser General Public License v3.0
211 stars 77 forks source link

Slowness when there is nested joins on sourcecode #152

Closed jorobper closed 2 years ago

jorobper commented 2 years ago

When analyzed script have nested joins, like the code below, the analysis get too slow and sonar cant finish.

OPEN l_cursor FOR SELECT "E_BILL_PAYMENT"."AMOUNT" "event_am", "EVENTT"."CURRENCY" "event_currency", "EV_BILL_CHARGE"."COUNTRY" "event_country", "ACCOUNT_T"."POID_ID0" "account_POID_IDO", "ACCOUNT_T"."ACCOUNT_NO" "account_account_NO", "E_BILL_PAYMENT"."TRANS_ID" "EVENTTRANS_ID", "EV_BILL_CHARGE"."NAME" "event_name", "EV_BILL_CHARGE"."DEBIT_NUM" "event_DEBIT_NUM", "EVENT_BILL_PAYMEN"."RESULT" "event_result", "EV_BILL_CHARGE"."STATE" "event_state", "ACCOUNT_T"."STATUS" "account_status", "E_BILL_PAYMENT"."COMMAND" "event_command", "EVENTT"."END_T" "event_ENT_T", "ACCOUNT_T"."POID_DB" "account_POID_DB", "CONF_BEID_BALANCES"."NAME" "config_name" FROM (((("EVENTT" "EVENTT" INNER JOIN "EVENT_BILL_PAYMEN" "EVENT_BILL_PAYMEN" ON "EVENTT"."POID_ID0"="EVENT_BILL_PAYMEN"."OBJ_ID0") INNER JOIN "E_BILL_PAYMENT" "E_BILL_PAYMENT" ON "EVENTT"."POID_ID0"="E_BILL_PAYMENT"."OBJ_ID0") INNER JOIN "ACCOUNT_T" "ACCOUNT_T" ON "EVENTT"."ACCOUNT_OBJ_ID0"="ACCOUNT_T"."POID_ID0") INNER JOIN "EV_BILL_CHARGE" "EV_BILL_CHARGE" ON "E_BILL_PAYMENT"."TRANS_ID"="EV_BILL_CHARGE"."TRANS_ID") INNER JOIN "EV_BILL_CHARGE" "EV_BILL_CHARGE" ON "EV_BILL_CHARGE"."OBJ_ID0"="EV_BILL_CHARGE"."OBJ_ID0" INNER JOIN "CONF_BEID_BALANCES" ON "EVENTT"."CURRENCY" = "CONF_BEID_BALANCES"."REC_ID" WHERE "ACCOUNT_T"."POID_DB">0 AND "EV_BILL_CHARGE"."COUNTRY" LIKE NVL(pCountry, "EV_BILL_CHARGE"."COUNTRY") AND "EV_BILL_CHARGE"."STATE" LIKE NVL(pState,"EV_BILL_CHARGE"."STATE")
AND ("ACCOUNT_T"."STATUS">= NVL(pAccountStatus,10100) AND "ACCOUNT_T"."STATUS"<= NVL(pAccountStatus,10103)) AND ( BIPEXT.INFCHECKDATES(pStartDate, pEndDate) = 1 AND ("EVENTT"."END_T" >= BIPEXT.infStrToTimet(pStartDate, 2) AND "EVENTT"."END_T" <= BIPEXT.infStrToTimet(pEndDate,2)-1)) AND "EVENT_BILL_PAYMEN"."RESULT"=0 AND "E_BILL_PAYMENT"."COMMAND"<>5 AND "ACCOUNT_T"."POID_ID0">1 ORDER BY "EVENTT"."CURRENCY", "EV_BILL_CHARGE"."COUNTRY", "ACCOUNT_T"."POID_ID0", "E_BILL_PAYMENT"."TRANS_ID"; END IF; Erro sonar

felipebz commented 2 years ago

Thanks for reporting this, @jorobper!

On my PC this SELECT took about 60 seconds to parse. I've made some changes and now it takes about 200 milliseconds.