52 |
|
TAB = #9; |
53 |
|
NULL_TERMINATOR = #0; |
54 |
|
|
55 |
+ |
sqlReservedWords: array [0..166] of string = ( |
56 |
+ |
'ADD','ADMIN','ALL','ALTER','AND','ANY','AS','AT','AVG','BEGIN','BETWEEN','BIGINT','BIT_LENGTH','BLOB','BOTH', |
57 |
+ |
'BY','CASE','CAST','CHAR','CHAR_LENGTH','CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COLLATE','COLUMN', |
58 |
+ |
'COMMIT','CONNECT','CONSTRAINT','COUNT','CREATE','CROSS','CURRENT','CURRENT_CONNECTION','CURRENT_DATE', |
59 |
+ |
'CURRENT_ROLE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_TRANSACTION','CURRENT_USER','CURSOR','DATE', |
60 |
+ |
'DAY','DEC','DECIMAL','DECLARE','DEFAULT','DELETE','DISCONNECT','DISTINCT','DOUBLE','DROP','ELSE','END', |
61 |
+ |
'ESCAPE','EXECUTE','EXISTS','EXTERNAL','EXTRACT','FETCH','FILTER','FLOAT','FOR','FOREIGN','FROM','FULL', |
62 |
+ |
'FUNCTION','GDSCODE','GLOBAL','GRANT','GROUP','HAVING','HOUR','IN','INDEX','INNER','INSENSITIVE','INSERT', |
63 |
+ |
'INT','INTEGER','INTO','IS','JOIN','LEADING','LEFT','LIKE','LONG','LOWER','MAX','MAXIMUM_SEGMENT','MERGE', |
64 |
+ |
'MIN','MINUTE','MONTH','NATIONAL','NATURAL','NCHAR','NO','NOT','NULL','NUMERIC','OCTET_LENGTH','OF','ON', |
65 |
+ |
'ONLY','OPEN','OR','ORDER','OUTER','PARAMETER','PLAN','POSITION','POST_EVENT','PRECISION','PRIMARY', |
66 |
+ |
'PROCEDURE','RDB$DB_KEY','REAL','RECORD_VERSION','RECREATE','RECURSIVE','REFERENCES','RELEASE','RETURNING_VALUES', |
67 |
+ |
'RETURNS','REVOKE','RIGHT','ROLLBACK','ROW_COUNT','ROWS','SAVEPOINT','SECOND','SELECT','SENSITIVE', |
68 |
+ |
'SET','SIMILAR','SMALLINT','SOME','SQLCODE','SQLSTATE','START','SUM','TABLE','THEN','TIME', |
69 |
+ |
'TIMESTAMP','TO','TRAILING','TRIGGER','TRIM','UNION','UNIQUE','UPDATE','UPPER','USER','USING', |
70 |
+ |
'VALUE','VALUES','VARCHAR','VARIABLE','VARYING','VIEW','WHEN','WHERE','WHILE','WITH','YEAR'); |
71 |
+ |
|
72 |
|
function Max(n1, n2: Integer): Integer; |
73 |
|
function Min(n1, n2: Integer): Integer; |
74 |
|
function RandomString(iLength: Integer): String; |
76 |
|
function StripString(st: String; CharsToStrip: String): String; |
77 |
|
function FormatIdentifier(Dialect: Integer; Value: String): String; |
78 |
|
function FormatIdentifierValue(Dialect: Integer; Value: String): String; |
79 |
+ |
function FormatIdentifierValueNC(Dialect: Integer; Value: String): String; |
80 |
|
function ExtractIdentifier(Dialect: Integer; Value: String): String; |
81 |
|
function QuoteIdentifier(Dialect: Integer; Value: String): String; |
82 |
+ |
function QuoteIdentifierIfNeeded(Dialect: Integer; Value: String): String; |
83 |
+ |
function Space2Underscore(s: string): string; |
84 |
|
|
85 |
|
implementation |
86 |
|
|
157 |
|
Result := Value; |
158 |
|
end; |
159 |
|
|
160 |
+ |
function FormatIdentifierValueNC(Dialect: Integer; Value: String): String; |
161 |
+ |
begin |
162 |
+ |
Value := Trim(Value); |
163 |
+ |
if Dialect = 1 then |
164 |
+ |
Value := AnsiUpperCase(Value) |
165 |
+ |
else |
166 |
+ |
begin |
167 |
+ |
if (Value <> '') and (Value[1] = '"') then |
168 |
+ |
begin |
169 |
+ |
Delete(Value, 1, 1); |
170 |
+ |
Delete(Value, Length(Value), 1); |
171 |
+ |
Value := AnsiUpperCase(StringReplace (Value, '""', '"', [rfReplaceAll])); |
172 |
+ |
end |
173 |
+ |
else |
174 |
+ |
Value := AnsiUpperCase(Value); |
175 |
+ |
end; |
176 |
+ |
Result := Value; |
177 |
+ |
end; |
178 |
+ |
|
179 |
|
function ExtractIdentifier(Dialect: Integer; Value: String): String; |
180 |
|
begin |
181 |
|
Value := Trim(Value); |
195 |
|
Result := Value; |
196 |
|
end; |
197 |
|
|
198 |
+ |
function IsReservedWord(w: string): boolean; |
199 |
+ |
var i: integer; |
200 |
+ |
begin |
201 |
+ |
Result := true; |
202 |
+ |
for i := 0 to Length(sqlReservedWords) - 1 do |
203 |
+ |
if w = sqlReservedWords[i] then |
204 |
+ |
Exit; |
205 |
+ |
Result := false; |
206 |
+ |
end; |
207 |
+ |
|
208 |
|
function QuoteIdentifier(Dialect: Integer; Value: String): String; |
209 |
|
begin |
210 |
|
if Dialect = 1 then |
214 |
|
Result := Value; |
215 |
|
end; |
216 |
|
|
217 |
< |
end. |
217 |
> |
function QuoteIdentifierIfNeeded(Dialect: Integer; Value: String): String; |
218 |
> |
begin |
219 |
> |
if (Dialect = 3) and |
220 |
> |
((AnsiUpperCase(Value) <> Value) or IsReservedWord(Value)) then |
221 |
> |
Result := '"' + Value + '"' |
222 |
> |
else |
223 |
> |
Result := Value |
224 |
> |
end; |
225 |
> |
|
226 |
> |
function Space2Underscore(s: string): string; |
227 |
> |
var |
228 |
> |
k: integer; |
229 |
> |
begin |
230 |
> |
Result := s; |
231 |
> |
for k := 1 to Length(s) do |
232 |
> |
if not (Result[k] in ['0'..'9','A'..'Z','_','$']) then |
233 |
> |
Result[k] := '_'; |
234 |
> |
end; |
235 |
> |
|
236 |
> |
|
237 |
> |
end. |