From bcf1b8c984f9ac69d22d0f00d1dc37c5151e5471 Mon Sep 17 00:00:00 2001 From: lmbelo Date: Wed, 2 Apr 2025 16:23:41 -0300 Subject: [PATCH 1/5] Bool type mappings --- interbase/ibase.py | 1 + interbase/ibcore.py | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/interbase/ibase.py b/interbase/ibase.py index ac76557..b3d6252 100644 --- a/interbase/ibase.py +++ b/interbase/ibase.py @@ -239,6 +239,7 @@ def UNCHECKED(type): SQL_TYPE_TIME = 560 SQL_TYPE_DATE = 570 SQL_INT64 = 580 +SQL_BOOL = 590 SQLIND_NULL = (1 << 15) SQLIND_INSERT = (1 << 0) diff --git a/interbase/ibcore.py b/interbase/ibcore.py index eb09e1b..bda6d25 100644 --- a/interbase/ibcore.py +++ b/interbase/ibcore.py @@ -91,7 +91,7 @@ SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, SQL_TEXT, SQL_VARYING, SQL_SHORT, SQL_LONG, SQL_FLOAT, SQL_DOUBLE, SQL_D_FLOAT, SQL_TIMESTAMP, SQL_BLOB, SQL_ARRAY, SQL_TYPE_TIME, - SQL_TYPE_DATE, SQL_INT64, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL, + SQL_TYPE_DATE, SQL_INT64, SQL_BOOL, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL, SQLIND_NULL, SQLIND_INSERT, SQLIND_UPDATE, SQLIND_DELETE, SQLIND_CHANGE, SQLIND_TRUNCATE, SQLIND_CHANGE_VIEW, @@ -422,6 +422,16 @@ def bytes_to_uint(b): # Read as little endian. raise InternalError return struct.unpack(fmt, b)[0] +def bytes_to_bool(b): # Read as little endian. + len_b = len(b) + if len(b) == 1: + fmt = ' Date: Wed, 2 Apr 2025 20:30:12 -0300 Subject: [PATCH 2/5] Bool type resolution --- interbase/ibcore.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/interbase/ibcore.py b/interbase/ibcore.py index bda6d25..0d8ad3e 100644 --- a/interbase/ibcore.py +++ b/interbase/ibcore.py @@ -471,6 +471,16 @@ def uint_to_bytes(val, nbytes): # Convert int value to little endian bytes. raise InternalError return struct.pack(fmt, val) +def bool_to_bytes(val, nbytes): # Convert bool value to little endian bytes. + int_val = int(bool(val)) # Ensure it's 0 or 1 + if nbytes == 1: + fmt = ' 0 @@ -2144,6 +2154,8 @@ def __get_external_data_type_name(self, dialect, data_type, subtype, return 'SMALLINT' elif data_type == SQL_LONG: return 'INTEGER' + elif data_type == SQL_BOOL: + return 'BOOLEAN' elif data_type == SQL_INT64: return 'BIGINT' elif data_type == SQL_FLOAT: @@ -2169,6 +2181,8 @@ def __get_internal_data_type_name(self, data_type): return 'SQL_SHORT' elif data_type == SQL_LONG: return 'SQL_LONG' + elif data_type == SQL_BOOL: + return 'SQL_BOOL' elif data_type == SQL_INT64: return 'SQL_INT64' elif data_type == SQL_FLOAT: @@ -2217,6 +2231,9 @@ def __get_description(self): elif vartype == SQL_LONG: vtype = IntType dispsize = 11 + elif vartype == SQL_BOOL: + vtype = bool + dispsize = 5 elif vartype == SQL_INT64: vtype = LongType dispsize = 20 @@ -2904,6 +2921,10 @@ def __Tuple2XSQLDA(self, xsqlda, parameters): sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( int_to_bytes(value, sqlvar.sqllen))), buf_pointer) + elif vartype == SQL_BOOL: + sqlvar.sqldata = ctypes.cast(ctypes.pointer( + ctypes.create_string_buffer( + bool_to_bytes(value, sqlvar.sqllen))), buf_pointer) elif vartype == SQL_TYPE_DATE: sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( From dfcb50d56e1c957d566c68aba87136e2578db896 Mon Sep 17 00:00:00 2001 From: lmbelo Date: Fri, 4 Apr 2025 09:19:11 -0300 Subject: [PATCH 3/5] Boolean type constant name update --- interbase/__init__.py | 2 +- interbase/ibase.py | 2 +- interbase/ibcore.py | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/interbase/__init__.py b/interbase/__init__.py index eb13e6f..c77d2c4 100644 --- a/interbase/__init__.py +++ b/interbase/__init__.py @@ -120,7 +120,7 @@ 'SQL_ARRAY', 'SQL_BLOB', 'SQL_DOUBLE', 'SQL_D_FLOAT', 'SQL_FLOAT', 'SQL_INT64', 'SQL_LONG', 'SQL_QUAD', 'SQL_SHORT', 'SQL_TEXT', 'SQL_TIMESTAMP', 'SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_VARYING', - 'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb', + 'SQL_BOOLEAN', 'SUBTYPE_DECIMAL', 'SUBTYPE_NUMERIC', 'build_dpb', 'charset_map', 'isc_info_end', 'isc_sqlcode', 'bs', ) diff --git a/interbase/ibase.py b/interbase/ibase.py index b3d6252..afa6088 100644 --- a/interbase/ibase.py +++ b/interbase/ibase.py @@ -239,7 +239,7 @@ def UNCHECKED(type): SQL_TYPE_TIME = 560 SQL_TYPE_DATE = 570 SQL_INT64 = 580 -SQL_BOOL = 590 +SQL_BOOLEAN = 590 SQLIND_NULL = (1 << 15) SQLIND_INSERT = (1 << 0) diff --git a/interbase/ibcore.py b/interbase/ibcore.py index 0d8ad3e..a6af818 100644 --- a/interbase/ibcore.py +++ b/interbase/ibcore.py @@ -91,7 +91,7 @@ SHRT_MIN, SHRT_MAX, INT_MIN, INT_MAX, LONG_MIN, LONG_MAX, SQL_TEXT, SQL_VARYING, SQL_SHORT, SQL_LONG, SQL_FLOAT, SQL_DOUBLE, SQL_D_FLOAT, SQL_TIMESTAMP, SQL_BLOB, SQL_ARRAY, SQL_TYPE_TIME, - SQL_TYPE_DATE, SQL_INT64, SQL_BOOL, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL, + SQL_TYPE_DATE, SQL_INT64, SQL_BOOLEAN, SUBTYPE_NUMERIC, SUBTYPE_DECIMAL, SQLIND_NULL, SQLIND_INSERT, SQLIND_UPDATE, SQLIND_DELETE, SQLIND_CHANGE, SQLIND_TRUNCATE, SQLIND_CHANGE_VIEW, @@ -2154,7 +2154,7 @@ def __get_external_data_type_name(self, dialect, data_type, subtype, return 'SMALLINT' elif data_type == SQL_LONG: return 'INTEGER' - elif data_type == SQL_BOOL: + elif data_type == SQL_BOOLEAN: return 'BOOLEAN' elif data_type == SQL_INT64: return 'BIGINT' @@ -2181,8 +2181,8 @@ def __get_internal_data_type_name(self, data_type): return 'SQL_SHORT' elif data_type == SQL_LONG: return 'SQL_LONG' - elif data_type == SQL_BOOL: - return 'SQL_BOOL' + elif data_type == SQL_BOOLEAN: + return 'SQL_BOOLEAN' elif data_type == SQL_INT64: return 'SQL_INT64' elif data_type == SQL_FLOAT: @@ -2231,7 +2231,7 @@ def __get_description(self): elif vartype == SQL_LONG: vtype = IntType dispsize = 11 - elif vartype == SQL_BOOL: + elif vartype == SQL_BOOLEAN: vtype = bool dispsize = 5 elif vartype == SQL_INT64: @@ -2398,7 +2398,7 @@ def __coerce_XSQLDA(self, xsqlda): elif vartype == SQL_LONG: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) - elif vartype == SQL_BOOL: + elif vartype == SQL_BOOLEAN: sqlvar.sqldata = ctypes.cast(ctypes.create_string_buffer( sqlvar.sqllen),buf_pointer) elif vartype == SQL_INT64: @@ -2483,7 +2483,7 @@ def __XSQLDA2Tuple(self, xsqlda): # It's scalled integer? if (sqlvar.sqlsubtype or scale): value = decimal.Decimal(value) / _tenTo[abs(scale)] - elif vartype == SQL_BOOL: + elif vartype == SQL_BOOLEAN: value = bool(bytes_to_bool(sqlvar.sqldata[:sqlvar.sqllen])) elif vartype == SQL_TYPE_DATE: yyyy, mm, dd = self._parse_date(sqlvar.sqldata[:sqlvar.sqllen]) @@ -2921,7 +2921,7 @@ def __Tuple2XSQLDA(self, xsqlda, parameters): sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( int_to_bytes(value, sqlvar.sqllen))), buf_pointer) - elif vartype == SQL_BOOL: + elif vartype == SQL_BOOLEAN: sqlvar.sqldata = ctypes.cast(ctypes.pointer( ctypes.create_string_buffer( bool_to_bytes(value, sqlvar.sqllen))), buf_pointer) From e5f6e4f9bffe150543437d9748cf501078c41195 Mon Sep 17 00:00:00 2001 From: lmbelo Date: Fri, 4 Apr 2025 09:58:32 -0300 Subject: [PATCH 4/5] Boolean as 2 bytes only --- interbase/ibcore.py | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/interbase/ibcore.py b/interbase/ibcore.py index a6af818..17cf42b 100644 --- a/interbase/ibcore.py +++ b/interbase/ibcore.py @@ -423,14 +423,10 @@ def bytes_to_uint(b): # Read as little endian. return struct.unpack(fmt, b)[0] def bytes_to_bool(b): # Read as little endian. - len_b = len(b) - if len(b) == 1: - fmt = ' 0 From 63b1392669db9f25af546320c0a60ebdacfcb629 Mon Sep 17 00:00:00 2001 From: lmbelo Date: Fri, 4 Apr 2025 15:57:38 -0300 Subject: [PATCH 5/5] Mergin docwiki keyword list to existing list --- interbase/schema.py | 113 +++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 60 deletions(-) diff --git a/interbase/schema.py b/interbase/schema.py index 86213a4..06863fb 100644 --- a/interbase/schema.py +++ b/interbase/schema.py @@ -177,66 +177,59 @@ def gkey2(item): def isKeyword(ident): "Returns True if `ident` is InterBase keyword." - return ident in ['ABS', 'ACCENT', 'ACOS', 'ACTION', 'ACTIVE', 'ADD', 'ADMIN', - 'AFTER', 'ALL', 'ALTER', 'ALWAYS', 'AND', 'ANY', 'AS', 'ASC', - 'ASCENDING', 'ASCII_CHAR', 'ASCII_VAL', 'ASIN', 'AT', 'ATAN', - 'ATAN2', 'AUTO', 'AUTONOMOUS', 'AVG', 'BACKUP', 'BEFORE', - 'BEGIN', 'BETWEEN', 'BIGINT', 'BIN_AND', 'BIN_NOT', 'BIN_OR', - 'BIN_SHL', 'BIN_SHR', 'BIN_XOR', 'BIT_LENGTH', 'BLOB', 'BLOCK', - 'BOTH', 'BREAK', 'BY', 'CALLER', 'CASCADE', 'CASE', 'CAST', - 'CEIL', 'CEILING', 'CHAR', 'CHAR_LENGTH', 'CHAR_TO_UUID', - 'CHARACTER', 'CHARACTER_LENGTH', 'CHECK', 'CLOSE', 'COALESCE', - 'COLLATE', 'COLLATION', 'COLUMN', 'COMMENT', 'COMMIT', - 'COMMITTED', 'COMMON', 'COMPUTED', 'CONDITIONAL', 'CONNECT', - 'CONSTRAINT', 'CONTAINING', 'COS', 'COSH', 'COT', 'COUNT', - 'CREATE', 'CROSS', 'CSTRING', 'CURRENT', 'CURRENT_CONNECTION', - 'CURRENT_DATE', 'CURRENT_ROLE', 'CURRENT_TIME', - 'CURRENT_TIMESTAMP', 'CURRENT_TRANSACTION', 'CURRENT_USER', - 'CURSOR', 'DATA', 'DATABASE', 'DATE', 'DATEADD', 'DATEDIFF', - 'DAY', 'DEC', 'DECIMAL', 'DECLARE', 'DECODE', 'DEFAULT', - 'DELETE', 'DELETING', 'DESC', 'DESCENDING', 'DESCRIPTOR', - 'DIFFERENCE', 'DISCONNECT', 'DISTINCT', 'DO', 'DOMAIN', - 'DOUBLE', 'DROP', 'ELSE', 'END', 'ENTRY_POINT', 'ESCAPE', - 'EXCEPTION', 'EXECUTE', 'EXISTS', 'EXIT', 'EXP', 'EXTERNAL', - 'EXTRACT', 'FETCH', 'FILE', 'FILTER', 'FIRST', 'FIRSTNAME', - 'FLOAT', 'FLOOR', 'FOR', 'FOREIGN', 'FREE_IT', 'FROM', 'FULL', - 'FUNCTION', 'GDSCODE', 'GEN_ID', 'GEN_UUID', 'GENERATED', - 'GENERATOR', 'GLOBAL', 'GRANT', 'GRANTED', 'GROUP', 'HASH', - 'HAVING', 'HOUR', 'IF', 'IGNORE', 'IIF', 'IN', 'INACTIVE', - 'INDEX', 'INNER', 'INPUT_TYPE', 'INSENSITIVE', 'INSERT', - 'INSERTING', 'INT', 'INTEGER', 'INTO', 'IS', 'ISOLATION', 'JOIN', - 'KEY', 'LAST', 'LASTNAME', 'LEADING', 'LEAVE', 'LEFT', 'LENGTH', - 'LEVEL', 'LIKE', 'LIMBO', 'LIST', 'LN', 'LOCK', 'LOG', 'LOG10', - 'LONG', 'LOWER', 'LPAD', 'MANUAL', 'MAPPING', 'MATCHED', - 'MATCHING', 'MAX', 'MAXIMUM_SEGMENT', 'MAXVALUE', 'MERGE', - 'MIDDLENAME', 'MILLISECOND', 'MIN', 'MINUTE', 'MINVALUE', 'MOD', - 'MODULE_NAME', 'MONTH', 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', - 'NEXT', 'NO', 'NOT', 'NULL', 'NULLIF', 'NULLS', 'NUMERIC', - 'OCTET_LENGTH', 'OF', 'ON', 'ONLY', 'OPEN', 'OPTION', 'OR', - 'ORDER', 'OS_NAME', 'OUTER', 'OUTPUT_TYPE', 'OVERFLOW', - 'OVERLAY', 'PAD', 'PAGE', 'PAGE_SIZE', 'PAGES', 'PARAMETER', - 'PASSWORD', 'PI', 'PLACING', 'PLAN', 'POSITION', 'POST_EVENT', - 'POWER', 'PRECISION', 'PRESERVE', 'PRIMARY', 'PRIVILEGES', - 'PROCEDURE', 'PROTECTED', 'RAND', 'RDB$DB_KEY', 'READ', 'REAL', - 'RECORD_VERSION', 'RECREATE', 'RECURSIVE', 'REFERENCES', - 'RELEASE', 'REPLACE', 'REQUESTS', 'RESERV', 'RESERVING', - 'RESTART', 'RESTRICT', 'RETAIN', 'RETURNING', 'RETURNING_VALUES', - 'RETURNS', 'REVERSE', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', - 'ROUND', 'ROW_COUNT', 'ROWS', 'RPAD', 'SAVEPOINT', 'SCALAR_ARRAY', - 'SCHEMA', 'SECOND', 'SEGMENT', 'SELECT', 'SENSITIVE', 'SEQUENCE', - 'SET', 'SHADOW', 'SHARED', 'SIGN', 'SIMILAR', 'SIN', 'SINGULAR', - 'SINH', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SORT', - 'SOURCE', 'SPACE', 'SQLCODE', 'SQLSTATE', 'SQRT', 'STABILITY', - 'START', 'STARTING', 'STARTS', 'STATEMENT', 'STATISTICS', - 'SUB_TYPE', 'SUBSTRING', 'SUM', 'SUSPEND', 'TABLE', 'TAN', 'TANH', - 'TEMPORARY', 'THEN', 'TIME', 'TIMEOUT', 'TIMESTAMP', 'TO', - 'TRAILING', 'TRANSACTION', 'TRIGGER', 'TRIM', 'TRUNC', 'TWO_PHASE', - 'TYPE', 'UNCOMMITTED', 'UNDO', 'UNION', 'UNIQUE', 'UPDATE', - 'UPDATING', 'UPPER', 'USER', 'USING', 'UUID_TO_CHAR', 'VALUE', - 'VALUES', 'VARCHAR', 'VARIABLE', 'VARYING', 'VIEW', 'WAIT', 'WEEK', - 'WEEKDAY', 'WHEN', 'WHERE', 'WHILE', 'WITH', 'WORK', 'WRITE', - 'YEAR', 'YEARDAY'] - + return ident in [ + 'ABS', 'ACCENT', 'ACOS', 'ACTION', 'ACTIVE', 'ADD', 'ADMIN', 'AFTER', 'ALL', + 'ALTER', 'ALWAYS', 'AND', 'ANY', 'AS', 'ASC', 'ASCENDING', 'ASCII_CHAR', 'ASCII_VAL', + 'ASIN', 'AT', 'ATAN', 'ATAN2', 'AUTO', 'AUTODDL', 'AUTONOMOUS', 'AVG', + 'BACKUP', 'BASED', 'BASENAME', 'BASE_NAME', 'BEFORE', 'BEGIN', 'BETWEEN', 'BIGINT', + 'BIN_AND', 'BIN_NOT', 'BIN_OR', 'BIN_SHL', 'BIN_SHR', 'BIN_XOR', 'BIT_LENGTH', 'BLOB', + 'BLOBEDIT', 'BLOCK', 'BOOLEAN', 'BOTH', 'BREAK', 'BUFFER', 'BY', + 'CACHE', 'CALLER', 'CASCADE', 'CASE', 'CAST', 'CEIL', 'CEILING', 'CHAR', 'CHARACTER', + 'CHARACTER_LENGTH', 'CHAR_LENGTH', 'CHAR_TO_UUID', 'CHECK', 'CHECK_POINT_LEN', + 'CHECK_POINT_LENGTH', 'CLOSE', 'COALESCE', 'COLLATE', 'COLLATION', 'COLUMN', 'COMMENT', + 'COMMIT', 'COMMITTED', 'COMMON', 'COMPILETIME', 'COMPUTED', 'CONDITIONAL', 'CONNECT', + 'CONSTRAINT', 'CONTAINING', 'CONTINUE', 'COS', 'COSH', 'COT', 'COUNT', 'CREATE', 'CROSS', + 'CSTRING', 'CURRENT', 'CURRENT_CONNECTION', 'CURRENT_DATE', 'CURRENT_ROLE', 'CURRENT_TIME', + 'CURRENT_TIMESTAMP', 'CURRENT_TRANSACTION', 'CURRENT_USER', 'CURSOR', + 'DATA', 'DATABASE', 'DATE', 'DATEADD', 'DATEDIFF', 'DAY', 'DB_KEY', 'DEBUG', 'DEC', 'DECIMAL', + 'DECLARE', 'DECODE', 'DECRYPT', 'DEFAULT', 'DELETE', 'DELETING', 'DESC', 'DESCENDING', 'DESCRIBE', + 'DESCRIPTOR', 'DIFFERENCE', 'DISCONNECT', 'DISPLAY', 'DISTINCT', 'DO', 'DOMAIN', 'DOUBLE', 'DROP', + 'ECHO', 'EDIT', 'ELSE', 'ENCRYPT', 'ENCRYPTION', 'END', 'ENTRY_POINT', 'ESCAPE', 'EVENT', + 'EXCEPTION', 'EXECUTE', 'EXISTS', 'EXIT', 'EXP', 'EXTERN', 'EXTERNAL', 'EXTRACT', + 'FALSE', 'FETCH', 'FILE', 'FILTER', 'FIRST', 'FIRSTNAME', 'FLOAT', 'FLOOR', 'FOR', 'FOREIGN', + 'FOUND', 'FREE_IT', 'FROM', 'FULL', 'FUNCTION', + 'GDSCODE', 'GENERATED', 'GENERATOR', 'GEN_ID', 'GEN_UUID', 'GLOBAL', 'GOTO', 'GRANT', 'GRANTED', + 'GROUP', 'GROUP_COMMIT_WAIT', 'GROUP_COMMIT_WAIT_TIME', + 'HASH', 'HAVING', 'HELP', 'HOUR', + 'IF', 'IGNORE', 'IIF', 'IMMEDIATE', 'IN', 'INACTIVE', 'INDEX', 'INDICATOR', 'INIT', 'INNER', 'INPUT', + 'INPUT_TYPE', 'INSENSITIVE', 'INSERT', 'INSERTING', 'INT', 'INTEGER', 'INTO', 'IS', 'ISOLATION', 'ISQL', + 'JOIN', + 'KEY', + 'LAST', 'LASTNAME', 'LC_MESSAGES', 'LC_TYPE', 'LEADING', 'LEAVE', 'LEFT', 'LENGTH', 'LEV', 'LEVEL', 'LIKE', + 'LIMBO', 'LIST', 'LN', 'LOCK', 'LOG', 'LOG10', 'LOGFILE', 'LOG_BUFFER_SIZE', 'LOG_BUF_SIZE', 'LONG', 'LOWER', 'LPAD', + 'MANUAL', 'MAPPING', 'MATCHED', 'MATCHING', 'MAX', 'MAXIMUM', 'MAXIMUM_SEGMENT', 'MAXVALUE', 'MAX_SEGMENT', + 'MERGE', 'MESSAGE', 'MIDDLENAME', 'MILLISECOND', 'MIN', 'MINIMUM', 'MINUTE', 'MINVALUE', 'MOD', 'MODULE_NAME', 'MONTH', + 'NAMES', 'NATIONAL', 'NATURAL', 'NCHAR', 'NEXT', 'NO', 'NOAUTO', 'NOT', 'NULL', 'NULLIF', 'NULLS', 'NUMERIC', + 'NUM_LOG_BUFFERS', 'NUM_LOG_BUFS', + 'OCTET_LENGTH', 'OF', 'ON', 'ONLY', 'OPEN', 'OPTION', 'OR', 'ORDER', 'OS_NAME', 'OUTER', 'OUTPUT', 'OUTPUT_TYPE', 'OVERFLOW', 'OVERLAY', + 'PAD', 'PAGE', 'PAGELENGTH', 'PAGES', 'PAGE_SIZE', 'PARAMETER', 'PARAMETERS', 'PASSWORD', 'PERCENT', 'PI', + 'PLACING', 'PLAN', 'POSITION', 'POST_EVENT', 'POWER', 'PRECISION', 'PREPARE', 'PRESERVE', 'PRIMARY', 'PRIVILEGES', + 'PROCEDURE', 'PROTECTED', 'PUBLIC', + 'QUIT', + 'RAND', 'RAW_PARTITIONS', 'RDB$DB_KEY', 'READ', 'REAL', 'RECORD_VERSION', 'RECREATE', 'RECURSIVE', 'REFERENCES', + 'RELEASE', 'REPLACE', 'REQUESTS', 'RESERV', 'RESERVING', 'RESTART', 'RESTRICT', 'RETAIN', 'RETURN', 'RETURNING', + 'RETURNING_VALUES', 'RETURNS', 'REVERSE', 'REVOKE', 'RIGHT', 'ROLE', 'ROLLBACK', 'ROUND', 'ROW', 'ROWS', 'ROW_COUNT', + 'RPAD', 'RUNTIME', + 'SAVEPOINT', 'SCALAR_ARRAY', 'SCHEMA', 'SECOND', 'SEGMENT', 'SELECT', 'SENSITIVE', 'SEQUENCE', 'SET', 'SHADOW', 'SHARED', + 'SHELL', 'SHOW', 'SIGN', 'SIMILAR', 'SIN', 'SINGULAR', 'SINH', 'SIZE', 'SKIP', 'SMALLINT', 'SNAPSHOT', 'SOME', 'SORT', + 'SOURCE', 'SPACE', 'SQLCODE', 'SQLERROR', 'SQLSTATE', 'SQLWARNING', 'SQRT', 'STABILITY', 'START', 'STARTING', 'STARTS', + 'STATEMENT', 'STATIC', 'STATISTICS', 'SUBSTRING', 'SUB_TYPE', 'SUM', 'SUSPEND', + 'TABLE', 'TABLESPACE', 'TAN', 'TANH', 'TEMPORARY', 'TERMINATOR', 'THEN', 'TIES', 'TIME', 'TIMEOUT', 'TIMESTAMP', 'TO', + 'TRAILING', 'TRANSACTION', 'TRANSLATE', 'TRANSLATION', 'TRIGGER', 'TRIM', 'TRUE', 'TRUNC', 'TWO_PHASE', 'TYPE', + 'UNCOMMITTED', 'UNDO', 'UNION', 'UNIQUE', 'UNKNOWN', 'UPDATE', 'UPDATING', 'UPPER', 'USER', 'USING', 'UUID_TO_CHAR', + 'VALUE', 'VALUES', 'VARCHAR', 'VARIABLE', 'VARYING', 'VERSION', 'VIEW', + 'WAIT', 'WEEK', 'WEEKDAY', 'WHEN', 'WHENEVER', 'WHERE', 'WHILE', 'WITH', 'WORK', 'WRITE', + 'YEAR', 'YEARDAY'] def escape_single_quotes(text): return text.replace("'", "''")