ibec_psql_Analyze
Performs analysis of a PSQL object.
Syntax
ibec_psql_Analyze(PSQLObject : variant; Connection : variant; Options : string) : string;
| PSQLObject | PSQL object created with ibec_psql_Parse function. |
| Connection | Active connection object. |
| Options | Analysis options. Possible options are: |
| Select (or just S) | Process SELECT/WITH statements. |
| Insert | I | Process INSERT/MERGE statements. |
| Update | U | Process UPDATE/MERGE statements. |
| Delete | D | Process DELETE statements. |
| Plan | P | Include plan into the result report and analyze plan for NATURAL scans. |
| Type | T | Analyze datatype compatibility issues. |
| Warning | W | Include compiler warnings into the result report. |
If an empty string is passed as an option string all possible options will be applied.
The function returns a report in JSON format.
Example
Following example retrieves all procedure DDL's from a database, analyzes them and saves reports in separate files:
execute ibeblock
as
begin
db = ibec_GetDefaultConnection();
-- Directory to save analysis reports
sDir = 'D:\Temp\Procs';
ibec_ForceDirectories(sDir);
for select rdb$procedure_name
from rdb$procedures
-- Comment the next line if your server doesn't support packages
where rdb$package_name is null
order by 1
into :ProcName
do
begin
ProcName = ibec_Trim(ProcName);
-- Pass an empty string as an option string to get pure single CREATE statement without SET TERM etc.
sPSQL = ibec_GetObjectScript(db, ProcName, __dboProcedure, '');
ObjPSQL = ibec_psql_Parse(sPSQL, 3, __svFB30);
try
s = ibec_psql_Analyze(ObjPSQL, db, '');
ibec_SaveToFile(sDir || '\' || ProcName || '.sp.json', s, __stfOverwrite);
finally
ibec_psql_Free(ObjPSQL);
end
end;
end;
Example of output:
{
"SyntaxWarnings": [
{
"Message": "Empty BEGIN...END statement",
"StartPosition": 516,
"Length": 0
},
{
"Message": "Value assigned to 'INTVAR1' never used",
"StartPosition": 57,
"Length": 7
}
],
"Statements": [
{
"Statement": "for select emp_no,\r\n
dense_rank() over (order by salary),\r\n
salary / count(salary) over ()\r\n
from employee\r\n
into :intvar1, :intvar2, :dpVar3\r\n do",
"StartPosition": 322,
"Length": 182,
"Plan": "PLAN SORT (EMPLOYEE NATURAL)",
"PlanNatural": true,
"TypeWarnings": [
"DENSE_RANK BIGINT -> INTVAR2 INTEGER",
"DIVIDE NUMERIC(18,2) -> DPVAR3 INTEGER"
],
"Operations": [
{
"Action": "SELECT",
"AffectedObject": "EMPLOYEE"
}
]
},
{
"Statement": "for select emp_no,\r\n
salary / count(salary) over (),\r\n
NTH_VALUE(salary, 2) FROM FIRST over (order by salary)\r\n
from employee\r\n
into :intvar1, :intvar2, :dpVar3\r\n do",
"StartPosition": 527,
"Length": 204,
"Plan": "PLAN SORT (EMPLOYEE NATURAL)",
"PlanNatural": true,
"TypeWarnings": [
"DIVIDE NUMERIC(18,2) -> INTVAR2 INTEGER",
"NTH_VALUE NUMERIC(18,2) -> DPVAR3 INTEGER"
],
"Operations": [
{
"Action": "SELECT",
"AffectedObject": "EMPLOYEE"
}
]
},
{
"Statement": "for select emp_no,\r\n
dept_no,\r\n
salary / count(salary) over (partition by dept_no ORDER by dept_no nulls first) rank\r\n
from employee\r\n
order by emp_no\r\n
into :intvar1, :intvar2, :partition\r\n do",
"StartPosition": 753,
"Length": 234,
"Plan": "PLAN SORT (SORT (EMPLOYEE NATURAL))",
"PlanNatural": true,
"TypeWarnings": [
"DEPT_NO CHAR(3) -> INTVAR2 INTEGER",
"RANK NUMERIC(18,2) -> PARTITION INTEGER"
],
"Operations": [
{
"Action": "SELECT",
"AffectedObject": "EMPLOYEE"
}
]
}
]
}
back to top of page
<< ibec_psql_Format | IBEBlock | ibec_psql_CommentBody >>







