--- ibx/trunk/fbintf/IBUtils.pas 2016/12/06 10:33:46 45 +++ ibx/trunk/fbintf/IBUtils.pas 2017/01/09 15:31:51 47 @@ -55,22 +55,206 @@ const TAB = #9; NULL_TERMINATOR = #0; - sqlReservedWords: array [0..166] of string = ( - 'ADD','ADMIN','ALL','ALTER','AND','ANY','AS','AT','AVG','BEGIN','BETWEEN','BIGINT','BIT_LENGTH','BLOB','BOTH', -'BY','CASE','CAST','CHAR','CHAR_LENGTH','CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COLLATE','COLUMN', -'COMMIT','CONNECT','CONSTRAINT','COUNT','CREATE','CROSS','CURRENT','CURRENT_CONNECTION','CURRENT_DATE', -'CURRENT_ROLE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_TRANSACTION','CURRENT_USER','CURSOR','DATE', -'DAY','DEC','DECIMAL','DECLARE','DEFAULT','DELETE','DISCONNECT','DISTINCT','DOUBLE','DROP','ELSE','END', -'ESCAPE','EXECUTE','EXISTS','EXTERNAL','EXTRACT','FETCH','FILTER','FLOAT','FOR','FOREIGN','FROM','FULL', -'FUNCTION','GDSCODE','GLOBAL','GRANT','GROUP','HAVING','HOUR','IN','INDEX','INNER','INSENSITIVE','INSERT', -'INT','INTEGER','INTO','IS','JOIN','LEADING','LEFT','LIKE','LONG','LOWER','MAX','MAXIMUM_SEGMENT','MERGE', -'MIN','MINUTE','MONTH','NATIONAL','NATURAL','NCHAR','NO','NOT','NULL','NUMERIC','OCTET_LENGTH','OF','ON', -'ONLY','OPEN','OR','ORDER','OUTER','PARAMETER','PLAN','POSITION','POST_EVENT','PRECISION','PRIMARY', -'PROCEDURE','RDB$DB_KEY','REAL','RECORD_VERSION','RECREATE','RECURSIVE','REFERENCES','RELEASE','RETURNING_VALUES', -'RETURNS','REVOKE','RIGHT','ROLLBACK','ROW_COUNT','ROWS','SAVEPOINT','SECOND','SELECT','SENSITIVE', -'SET','SIMILAR','SMALLINT','SOME','SQLCODE','SQLSTATE','START','SUM','TABLE','THEN','TIME', -'TIMESTAMP','TO','TRAILING','TRIGGER','TRIM','UNION','UNIQUE','UPDATE','UPPER','USER','USING', -'VALUE','VALUES','VARCHAR','VARIABLE','VARYING','VIEW','WHEN','WHERE','WHILE','WITH','YEAR'); + sqlReservedWords: array [0..197] of string = ( + 'ADD', + 'ADMIN', + 'ALL', + 'ALTER', + 'AND', + 'ANY', + 'AS', + 'AT', + 'AVG', + 'BEGIN', + 'BETWEEN', + 'BIGINT', + 'BIT_LENGTH', + 'BLOB', + 'BOOLEAN', + 'BOTH', + 'BY', + 'CASE', + 'CAST', + 'CHAR', + 'CHAR_LENGTH', + 'CHARACTER', + 'CHARACTER_LENGTH', + 'CHECK', + 'CLOSE', + 'COLLATE', + 'COLUMN', + 'COMMIT', + 'CONNECT', + 'CONSTRAINT', + 'CORR', + 'COUNT', + 'COVAR_POP', + 'COVAR_SAMP', + 'CREATE', + 'CROSS', + 'CURRENT', + 'CURRENT_CONNECTION', + 'CURRENT_DATE', + 'CURRENT_ROLE', + 'CURRENT_TIME', + 'CURRENT_TIMESTAMP', + 'CURRENT_TRANSACTION', + 'CURRENT_USER', + 'CURSOR', + 'DATE', + 'DAY', + 'DEC', + 'DECIMAL', + 'DECLARE', + 'DEFAULT', + 'DELETE', + 'DELETING', + 'DETERMINISTIC', + 'DISCONNECT', + 'DISTINCT', + 'DOUBLE', + 'DROP', + 'ELSE', + 'END', + 'ESCAPE', + 'EXECUTE', + 'EXISTS', + 'EXTERNAL', + 'EXTRACT', + 'FALSE', + 'FETCH', + 'FILTER', + 'FLOAT', + 'FOR', + 'FOREIGN', + 'FROM', + 'FULL', + 'FUNCTION', + 'GDSCODE', + 'GLOBAL', + 'GRANT', + 'GROUP', + 'HAVING', + 'HOUR', + 'IN', + 'INDEX', + 'INNER', + 'INSENSITIVE', + 'INSERT', + 'INSERTING', + 'INT', + 'INTEGER', + 'INTO', + 'IS', + 'JOIN', + 'LEADING', + 'LEFT', + 'LIKE', + 'LONG', + 'LOWER', + 'MAX', + 'MAXIMUM_SEGMENT', + 'MERGE', + 'MIN', + 'MINUTE', + 'MONTH', + 'NATIONAL', + 'NATURAL', + 'NCHAR', + 'NO', + 'NOT', + 'NULL', + 'NUMERIC', + 'OCTET_LENGTH', + 'OF', + 'OFFSET', + 'ON', + 'ONLY', + 'OPEN', + 'OR', + 'ORDER', + 'OUTER', + 'OVER', + 'PARAMETER', + 'PLAN', + 'POSITION', + 'POST_EVENT', + 'PRECISION', + 'PRIMARY', + 'PROCEDURE', + 'RDB$DB_KEY', + 'RDB$RECORD_VERSION', + 'REAL', + 'RECORD_VERSION', + 'RECREATE', + 'RECURSIVE', + 'REFERENCES', + 'REGR_AVGX', + 'REGR_AVGY', + 'REGR_COUNT', + 'REGR_INTERCEPT', + 'REGR_R2', + 'REGR_SLOPE', + 'REGR_SXX', + 'REGR_SXY', + 'REGR_SYY', + 'RELEASE', + 'RETURN', + 'RETURNING_VALUES', + 'RETURNS', + 'REVOKE', + 'RIGHT', + 'ROLLBACK', + 'ROW', + 'ROW_COUNT', + 'ROWS', + 'SAVEPOINT', + 'SCROLL', + 'SECOND', + 'SELECT', + 'SENSITIVE', + 'SET', + 'SIMILAR', + 'SMALLINT', + 'SOME', + 'SQLCODE', + 'SQLSTATE', + 'SQLSTATE', + 'START', + 'STDDEV_POP', + 'STDDEV_SAMP', + 'SUM', + 'TABLE', + 'THEN', + 'TIME', + 'TIMESTAMP', + 'TO', + 'TRAILING', + 'TRIGGER', + 'TRIM', + 'TRUE', + 'UNION', + 'UNIQUE', + 'UNKNOWN', + 'UPDATE', + 'UPDATING', + 'UPPER', + 'USER', + 'USING', + 'VALUE', + 'VALUES', + 'VAR_POP', + 'VAR_SAMP', + 'VARCHAR', + 'VARIABLE', + 'VARYING', + 'VIEW', + 'WHEN', + 'WHERE', + 'WHILE', + 'WITH', + 'YEAR' + ); function Max(n1, n2: Integer): Integer; function Min(n1, n2: Integer): Integer; @@ -84,6 +268,7 @@ function ExtractIdentifier(Dialect: Inte function QuoteIdentifier(Dialect: Integer; Value: String): String; function QuoteIdentifierIfNeeded(Dialect: Integer; Value: String): String; function Space2Underscore(s: string): string; +function SQLSafeString(const s: string): string; implementation @@ -236,5 +421,9 @@ begin Result[k] := '_'; end; +function SQLSafeString(const s: string): string; +begin + Result := StringReplace(s,'''','''''',[rfReplaceAll]); +end; end.