ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/public/ibx/trunk/testsuite/Test24.pas
Revision: 323
Committed: Thu Feb 25 12:14:35 2021 UTC (3 years, 9 months ago) by tony
Content type: text/x-pascal
File size: 10734 byte(s)
Log Message:
Fixed Merged

File Contents

# User Rev Content
1 tony 323 (*
2     * IBX Test suite. This program is used to test the IBX non-visual
3     * components and provides a semi-automated pass/fail check for each test.
4     *
5     * The contents of this file are subject to the Initial Developer's
6     * Public License Version 1.0 (the "License"); you may not use this
7     * file except in compliance with the License. You may obtain a copy
8     * of the License here:
9     *
10     * http://www.firebirdsql.org/index.php?op=doc&id=idpl
11     *
12     * Software distributed under the License is distributed on an "AS
13     * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
14     * implied. See the License for the specific language governing rights
15     * and limitations under the License.
16     *
17     * The Initial Developer of the Original Code is Tony Whyman.
18     *
19     * The Original Code is (C) 2021 Tony Whyman, MWA Software
20     * (http://www.mwasoftware.co.uk).
21     *
22     * All Rights Reserved.
23     *
24     * Contributor(s): ______________________________________.
25     *
26     *)
27 tony 315 unit Test24;
28    
29     {$mode objfpc}{$H+}
30    
31     {Test 24: IB Parser Tests}
32    
33     {Iterates through a set of test strings, parsing each one and displaying the
34     results including any parameters found. Note last string is the empty string}
35    
36    
37     interface
38    
39     uses
40     Classes, SysUtils, TestApplication, IBXTestBase, IB, IBSQLParser, IBUtils;
41    
42     const
43     aTestID = '24';
44     aTestTitle = 'IB Parser Tests';
45    
46     const
47     TestStrings: array [0..13] of string = (
48     'Select distinct A.EMP_NO, A.FIRST_NAME, A.LAST_NAME, A.PHONE_EXT, A.HIRE_DATE, A.DEPT_NO, A.JOB_CODE, 2.2, 2..30 ' +
49     'A.JOB_GRADE, A.JOB_COUNTRY, A.SALARY, A.FULL_NAME, D.DEPT_PATH, D.DEPT_KEY_PATH' + LF +
50     'From EMPLOYEE A' + LF +
51     'JOIN Depts D On D.DEPT_NO = A.DEPT_NO;',
52    
53     'with recursive Depts As (' +
54     'Select DEPT_NO, DEPARTMENT, "HEAD_DEPT", cast(DEPARTMENT as VarChar(256)) as DEPT_PATH /* test */,' +
55     'cast(DEPT_NO as VarChar(64)) as DEPT_KEY_PATH ' + LF +
56     'From DEPARTMENT Where HEAD_DEPT is NULL ' + LF +
57     'UNION ALL' + CRLF +
58     'Select D.DEPT_NO, D.DEPARTMENT, D.HEAD_DEPT, Depts.DEPT_PATH || '' / '' || D.DEPARTMENT as DEPT_PATH,' +
59     'Depts.DEPT_KEY_PATH || '';'' || D.DEPT_NO as DEPT_KEY_PATH ' +
60     'From DEPARTMENT D'+ CR +
61     'JOIN Depts On D.HEAD_DEPT = Depts.DEPT_NO' + LF +
62     ')' +
63     '--ignore' + LF +
64     'Select distinct A.EMP_NO, A.FIRST_NAME, A.LAST_NAME, A.PHONE_EXT, A.HIRE_DATE, A.DEPT_NO, A.JOB_CODE, 2.2, 2..30 ' +
65     'A.JOB_GRADE, A.JOB_COUNTRY, A.SALARY, A.FULL_NAME, D.DEPT_PATH, D.DEPT_KEY_PATH' + LF +
66     'From EMPLOYEE A' + LF +
67     'JOIN Depts D On D.DEPT_NO = A.DEPT_NO',
68    
69     'Update EMPLOYEE A Set '#13#10' A.DEPT_NO = :DEPT_NO,'#13#10 +
70     ' A.FIRST_NAME = ''Mr/Ms '' || :FIRST_NAME,'#13#10+
71     ' A.HIRE_DATE = :HIRE_DATE,'#13#10+
72     ' A.JOB_CODE = :JOB_CODE,'#13#10' A.JOB_COUNTRY = :JOB_COUNTRY,'#13#10+
73     ' A.JOB_GRADE = :JOB_GRADE,'#13#10' A.LAST_NAME = :LAST_NAME,'#13#10+
74     ' A.PHONE_EXT = :PHONE_EXT,'#13#10' A.SALARY = :SALARY ' +
75     'Where A.EMP_NO = :OLD_EMP_NO;',
76    
77     'INSERT INTO EMPLOYEE (EMP_NO, FIRST_NAME, LAST_NAME, PHONE_EXT, HIRE_DATE,' +
78     'DEPT_NO, JOB_CODE, JOB_GRADE, JOB_COUNTRY, SALARY /* what''s this */) '+
79     'VALUES (:EMP_NO, :FIRST_NAME, :LAST_NAME, :PHONE_EXT, :HIRE_DATE, //end comment' + CRLF +
80     ':DEPT_NO, :"JOB""CODE", ''Tester''''s way'''''''''', :JOB_COUNTRY, :"$SALARY")',
81    
82     'Select * from EMPLOYEE Where EMP_NO = :EMP_NO',
83    
84     'Select DEPT_NO, DEPARTMENT, "HEAD_DEPT", cast(DEPARTMENT as VarChar(256)) as DEPT_PATH /* test */,' +
85     'cast(DEPT_NO as VarChar(64)) as DEPT_KEY_PATH ' + LF +
86     'From DEPARTMENT Where HEAD_DEPT is NULL ' + LF +
87     'UNION ALL' + CRLF +
88     'Select D.DEPT_NO, D.DEPARTMENT, D.HEAD_DEPT, Depts.DEPT_PATH || '' / '' || D.DEPARTMENT as DEPT_PATH,' +
89     'Depts.DEPT_KEY_PATH || '';'' || D.DEPT_NO as DEPT_KEY_PATH ' +
90     'From DEPARTMENT D'+ CR +
91     'JOIN Depts On D.HEAD_DEPT = Depts.DEPT_NO',
92    
93     'Select DEPT_NO, DEPARTMENT, "HEAD_DEPT", cast(DEPARTMENT as VarChar(256)) as DEPT_PATH /* test */,' +
94     'cast(DEPT_NO as VarChar(64)) as DEPT_KEY_PATH ' + LF +
95     'From DEPARTMENT Where HEAD_DEPT is NULL ' + LF +
96     'UNION ALL' + CRLF +
97     'Select D.DEPT_NO, D.DEPARTMENT, D.HEAD_DEPT, Depts.DEPT_PATH || '' / '' || D.DEPARTMENT as DEPT_PATH,' +
98     'Depts.DEPT_KEY_PATH || '';'' || D.DEPT_NO as DEPT_KEY_PATH ' +
99     'From DEPARTMENT D'+ CR +
100     'JOIN Depts On D.HEAD_DEPT = Depts.DEPT_NO '+
101     'Order by 1,2',
102    
103     'with test1 as (Select * from Employee), test2 as (Select Emp_no, ''A test'' from Employee) '+
104     'Select * from test1',
105    
106     'with recursive Account_Types_List As('#10+
107     'Select ACCOUNTTYPE_ID, PARENT, ACCOUNTTYPENAME,'#10+
108     ' ACCOUNTTYPENAME as SortName, '''' as INDENT'#10+
109     'From MYLB_ACCOUNTTYPES'#10+
110     'Where PARENT is Null'#10+
111     'UNION ALL'#10+
112     'Select A.ACCOUNTTYPE_ID, A.PARENT, A.ACCOUNTTYPENAME,'#10+
113     'L.SortName || A.ACCOUNTTYPENAME as SortName, L.INDENT || '' '' as INDENT'#10+
114     'From MYLB_ACCOUNTTYPES A'#10+
115     'Join Account_Types_List L On A.PARENT = L.ACCOUNTTYPE_ID)'#10+
116     #10+
117     'Select ACCOUNTTYPE_ID, PARENT, INDENT || ACCOUNTTYPENAME as Name'#10+
118     'From Account_Types_List'#10+
119     #10+
120     'Order by SortName',
121    
122     'SELECT r.RDB$DB_KEY, cast(''Local'' as VarChar(6)) as MAPTYPE, r.RDB$MAP_NAME,'#10+
123     ' Case'#10+
124     ' When r.RDB$MAP_USING = ''P'' and r.RDB$MAP_PLUGIN is not null then cast (''Plugin '' || r.RDB$MAP_PLUGIN as VarChar(20))'#10+
125     ' When r.RDB$MAP_USING = ''P'' and r.RDB$MAP_PLUGIN is null then ''Any Plugin'''#10+
126     ' When r.RDB$MAP_USING = ''S'' then ''Any Plugin Serverwide'''#10+
127     ' When r.RDB$MAP_USING = ''M'' then ''Mapping'''#10+
128     ' When r.RDB$MAP_USING = ''*'' then ''*'''#10+
129     ' else'#10+
130     ' ''Using '' || r.RDB$MAP_USING || '','' || coalesce(r.RDB$MAP_PLUGIN,'''') End as MAP_USING,'#10+
131     ' r.RDB$MAP_USING, r.RDB$MAP_PLUGIN,'#10+
132     ' r.RDB$MAP_DB, r.RDB$MAP_FROM_TYPE, r.RDB$MAP_FROM,'#10+
133     ' Trim(r.RDB$MAP_FROM_TYPE) || '': '' || Trim(r.RDB$MAP_FROM) as MAP_FROM,'#10+
134     ' r.RDB$MAP_TO_TYPE,'#10+
135     ' T.RDB$TYPE_NAME as MAP_TO_TYPE, r.RDB$MAP_TO,'#10+
136     ' Trim(T.RDB$TYPE_NAME) || '': '' || Trim(r.RDB$MAP_TO) as MAP_TO,'#10+
137     ' r.RDB$SYSTEM_FLAG, r.RDB$DESCRIPTION'#10+
138     'FROM RDB$AUTH_MAPPING r'#10+
139     'JOIN RDB$TYPES T On T.RDB$TYPE = r.RDB$MAP_TO_TYPE and T.RDB$FIELD_NAME = ''RDB$MAP_TO_TYPE'''#10+
140     'UNION'#10+
141     'SELECT r.RDB$DB_KEY, ''Global'', r.SEC$MAP_NAME,'#10+
142     ' Case'#10+
143     ' When r.SEC$MAP_USING = ''P'' and r.SEC$MAP_PLUGIN is not null then cast (''Plugin '' || r.SEC$MAP_PLUGIN as VarChar(20))'#10+
144     ' When r.SEC$MAP_USING = ''P'' and r.SEC$MAP_PLUGIN is null then ''Any Plugin'''#10+
145     ' When r.SEC$MAP_USING = ''S'' then ''Any Plugin Serverwide'''#10+
146     ' When r.SEC$MAP_USING = ''M'' then ''Mapping'''#10+
147     ' When r.SEC$MAP_USING = ''*'' then ''*'''#10+
148     ' else'#10+
149     ' ''Using '' || r.SEC$MAP_USING || '','' || coalesce(r.SEC$MAP_PLUGIN,'''') End as MAP_USING,'#10+
150     ' r.SEC$MAP_USING, r.SEC$MAP_PLUGIN,'#10+
151     ' r.SEC$MAP_DB, r.SEC$MAP_FROM_TYPE, r.SEC$MAP_FROM,'#10+
152     ' Trim(r.SEC$MAP_FROM_TYPE) || '': '' || Trim(r.SEC$MAP_FROM) as MAP_FROM,'#10+
153     ' r.SEC$MAP_TO_TYPE,'#10+
154     ' T.RDB$TYPE_NAME as MAP_TO_TYPE,r.SEC$MAP_TO,'#10+
155     ' Trim(T.RDB$TYPE_NAME) || '': '' || Trim(r.SEC$MAP_TO) as MAP_TO,'#10+
156     ' null,null'#10+
157     'FROM SEC$GLOBAL_AUTH_MAPPING r'#10+
158     'JOIN RDB$TYPES T On T.RDB$TYPE = r.SEC$MAP_TO_TYPE and T.RDB$FIELD_NAME = ''RDB$MAP_TO_TYPE''',
159    
160     'Select * From A '+
161     'Group By a1,b1 '+
162     'Union '+
163     'Select * From B Rows 3 to 4',
164    
165     'Select * From A '+
166     'Union '+
167     'Select * From B Order by 1 Rows 3 to 4',
168    
169     'Select * From A '+
170     'Union '+
171     'Select * From B '+
172     'Union '+
173     'Select * FROM C Order by 1',
174    
175     '') ;
176     type
177    
178     { TTest24 }
179    
180     TTest24 = class(TIBXTestBase)
181     private
182     procedure WriteSelect(parser: TSelectSQLParser);
183     protected
184     function GetTestID: AnsiString; override;
185     function GetTestTitle: AnsiString; override;
186     public
187     procedure RunTest(CharSet: AnsiString; SQLDialect: integer); override;
188     end;
189    
190    
191     implementation
192    
193     { TTest24 }
194    
195     procedure TTest24.WriteSelect(parser: TSelectSQLParser);
196     var j: integer;
197     begin
198     with parser do
199     begin
200     for j := 0 to CTECount -1 do
201     begin
202     write(OutFile,'CTE',j);
203     if CTES[j]^.Recursive then write(OutFile,' recursive');
204     writeln(OutFile,': ',CTES[j]^.Name,' as ',CTEs[j]^.text);
205     end;
206     writeln(OutFile,'Select: ' ,SelectClause);
207     writeln(OutFile,'From: ',FromClause);
208     writeln(OutFile,'Where: ',WhereClause);
209     writeln(OutFile,'Group By: ',GroupClause);
210     writeln(OutFile,'Having: ',HavingClause);
211     if Union <> nil then
212     begin
213     write(OutFile,'Union');
214     if Union.UnionAll then write(OutFile,' All');
215     writeln(OutFile);
216     WriteSelect(Union);
217     end;
218     writeln(OutFile,'Order by: ',OrderByClause);
219     writeln(OutFile,'Plan: ',PlanClause);
220     writeln(OutFile,'Rows: ',RowsClause);
221     writeln(OutFile,'SQL: ',SQLText);
222     writeln(OutFile,'Params: ');
223     for j := 0 to ParamList.Count - 1 do
224     write(OutFile,ParamList[j],',');
225     writeln(OutFile);
226     writeln(OutFile);
227     end;
228     end;
229    
230     function TTest24.GetTestID: AnsiString;
231     begin
232     Result := aTestID;
233     end;
234    
235     function TTest24.GetTestTitle: AnsiString;
236     begin
237     Result := aTestTitle;
238     end;
239    
240     procedure TTest24.RunTest(CharSet: AnsiString; SQLDialect: integer);
241     var i: integer;
242     parser: TSelectSQLParser;
243     begin
244     for i := 0 to Length(TestStrings) -1 do
245     begin
246     parser := TSelectSQLParser.Create(nil,TestStrings[i]);
247     try
248     with parser do
249     begin
250     writeln(OutFile,'Test String ',i);
251     writeln(OutFile,'---------------------------------------------------');
252     writeln(OutFile,TestStrings[i]);
253     writeln(OutFile,'---------------------------------------------------');
254     writeln(OutFile);
255     if NotaSelectStmt then
256     begin
257     writeln(OutFile,'Not a Select Statement');
258     continue;
259     end;
260     WriteSelect(parser);
261     if i = 4 then
262     Add2WhereClause('JOB_CODE = 2');
263     if i = 5 then
264     OrderByClause := '1';
265     writeln(Outfile,'Updated SQL');
266     writeln(OutFile,SQLText);
267     end;
268     finally
269     parser.Free
270     end;
271     end;
272     end;
273    
274     initialization
275     RegisterTest(TTest24);
276    
277     end.
278