Ryan Fife wrote:
Hello,

I'm working on getting RoundCube to work with Oracle and have run into problems with SQL reserved words being used for both table and column names. Oracle is one of the most strict databases with regard to reserved words. Here is the list of tables and column names that I've found to cause problems:

Tables:
session (I changed it to sessions and updated my config file. Easy fix.)

Reserved Field names:
users.language
messages.uid (Not SQL-standard reserved but Oracle reserved)
messages.from
messages.to
messages.date
messages.size

There's also a problem in the identities table with a minus sign in one of the fields:
identities.reply-to

There is no mechanism to have table and column names mapped in the config file so I'm asking for a recommendation on how to proceed. I think the ideal solution would be to change all the columns from reserved words to allowed words since only UID is a special Oracle (and Postgres) reserved word and the rest shouldn't really be allowed anywhere. The other alternative is to quote them everywhere but I'm not sure how portable this is and I'm testing Oracle on it now. What does everyone suggest?

I've also attached my first attempt at oracle.initial.sql.

Cheers,

Ryan


Can you not use `database`.`tablename` syntax to work around the reserved words that are SQL1992 compliant (like uid)? Does Oracle allow that? Because that would be an easy fix.

As for the other SQL reserved words, I agree, RC shouldn't use them. One option I find, and one I like, is to use a DB prefix (which is required) so that you can use "reserved" words inside the column name but not actually have them be reserved.

The way to achieve this is to change the config file (db.inc.php) and add "{$db_prefix}" before each table name. As for the column names, I'm sure I suggest:
users.lang
messages.userID
messages.author
messages.recipient
messages.sent
messages.Kbsize

Something like that, not suggesting that we use those exact ones. But to help the devs, here's the list of reserved words:

AFTER, ALIAS, ASYNC, BEFORE, BOOLEAN, BREADTH, COMPLETION, CALL, CYCLE, DATA, DEPTH, DICTIONARY, EACH, ELSEIF, EQUALS, GENERAL, IF, IGNORE, LEAVE, LESS, LIMIT, LOOP, MODIFY, NEW, NONE, OBJECT, OFF, OID, OLD, OPERATION, OPERATORS, OTHERS, PARAMETERS, PENDANT, PREORDER, PRIVATE, PROTECTED, RECURSIVE, REF, REFERENCING, REPLACE, RESIGNAL, RETURN, RETURNS, ROLE, ROUTINE, ROW, SAVEPOINT, SEARCH, SENSITIVE, SEQUENCE, SIGNAL, SIMILAR, SQLEXCEPTION, SQLWARNING, STRUCTURE, TEST, THERE, TRIGGER, TYPE, UNDER, VARIABLE, VIRTUAL, VISIBLE, WAIT, WHILE, WITHOUT

ABSOLUTE, ACTION, ADD, ALLOCATE, ALTER, ARE, ASSERTION, AT, BETWEEN, BIT, BIT_LENGTH, BOTH, CASCADE, CASCADED, CASE, CAST, CATALOG, CHAR_LENGTH, CHARACTER_LENGTH, COALESCE, COLLATE, COLLATION, COLUMN, CONNECT, CONNECTION, CONSTRAINT, CONSTRAINTS, CONVERT, CORRESPONDING, CROSS, CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_USER, DATE, DAY, DEALLOCATE, DEFERRABLE, DEFERRED, DESCRIBE, DESCRIPTOR, DIAGNOSTICS, DISCONNECT, DOMAIN, DROP, ELSE, END-EXEC, EXCEPT, EXCEPTION, EXECUTE, EXTERNAL, EXTRACT, FALSE, FIRST, FULL, GET, GLOBAL, HOUR, IDENTITY, IMMEDIATE, INITIALLY, INNER, INPUT, INSENSITIVE, INTERSECT, INTERVAL, ISOLATION, JOIN, LAST, LEADING, LEFT, LEVEL, LOCAL, LOWER, MATCH, MINUTE, MONTH, NAMES, NATIONAL, NATURAL, NCHAR, NEXT, NO, NULLIF, OCTET_LENGTH, ONLY, OUTER, OUTPUT, OVERLAPS, PAD, PARTIAL, POSITION, PREPARE, PRESERVE, PRIOR, READ, RELATIVE, RESTRICT, REVOKE, RIGHT, ROWS, SCROLL, SECOND, SESSION, SESSION_USER, SIZE, SPACE, SQLSTATE, SUBSTRING, SYSTEM_USER, TEMPORARY, THEN, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TRAILING, TRANSACTION, TRANSLATE, TRANSLATION, TRIM, TRUE, UNKNOWN, UPPER, USAGE, USING, VALUE, VARCHAR, VARYING, WHEN, WRITE, YEAR, ZONE

Those are all reserved in SQL1992 (SQL2) databases; although some are more lenient in their interpretation. For interoperability sake, we should stay away from SQL1992 reserved words when we can, and then we can deal with individual RDBMS issues one by one.

~Brett


Reply via email to