Changeset: 901b7411bd8e for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/901b7411bd8e Modified Files: clients/odbc/driver/SQLGetInfo.c clients/odbc/tests/ODBCgetInfo.c Branch: default Log Message:
Correct information returned by SQLGetInfo(hdbc, SQL_KEYWORDS, ...) It used to return all MonetDB keywords but it should not contain the ODBC reseved keywords, see https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/reserved-keywords https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlgetinfo-function diffs (131 lines): diff --git a/clients/odbc/driver/SQLGetInfo.c b/clients/odbc/driver/SQLGetInfo.c --- a/clients/odbc/driver/SQLGetInfo.c +++ b/clients/odbc/driver/SQLGetInfo.c @@ -663,9 +663,46 @@ MNDBGetInfo(ODBCDbc *dbc, * SQL_CA2_SIMULATE_UNIQUE */ break; case SQL_KEYWORDS: - /* Returns the MonetDB keywords, i.e. a dump of - * sys.keywords */ - if ((hdl = mapi_query(dbc->mid, "WITH x(k) AS (SELECT keyword FROM sys.keywords ORDER BY keyword) SELECT group_concat(k, ',') FROM x")) != NULL && mapi_fetch_row(hdl)) { + /* A character string that contains a comma-separated list of all data source-specific keywords. + * This list does not contain keywords specific to ODBC or keywords used by both the data source and ODBC. + * This list represents all the reserved keywords; interoperable applications should not use these words in object names. + * Returns the MonetDB sys.keywords minus the ODBC keywords: https://learn.microsoft.com/en-us/sql/odbc/reference/appendixes/reserved-keywords */ + hdl = mapi_query(dbc->mid, + "WITH x(k) AS (SELECT keyword FROM sys.keywords WHERE keyword NOT IN (" + "'ABSOLUTE','ACTION','ADA','ADD','ALL','ALLOCATE','ALTER','AND','ANY'," + "'ARE','AS','ASC','ASSERTION','AT','AUTHORIZATION','AVG'," + "'BEGIN','BETWEEN','BIT','BIT_LENGTH','BOTH','BY'," + "'CASCADE','CASCADED','CASE','CAST','CATALOG','CHAR','CHAR_LENGTH'," + "'CHARACTER','CHARACTER_LENGTH','CHECK','CLOSE','COALESCE'," + "'COLLATE','COLLATION','COLUMN','COMMIT','CONNECT','CONNECTION','CONSTRAINT'," + "'CONSTRAINTS','CONTINUE','CONVERT','CORRESPONDING','COUNT','CREATE','CROSS'," + "'CURRENT','CURRENT_DATE','CURRENT_TIME','CURRENT_TIMESTAMP','CURRENT_USER','CURSOR'," + "'DATE','DAY','DEALLOCATE','DEC','DECIMAL','DECLARE','DEFAULT','DEFERRABLE'," + "'DEFERRED','DELETE','DESC','DESCRIBE','DESCRIPTOR','DIAGNOSTICS','DISCONNECT'," + "'DISTINCT','DOMAIN','DOUBLE','DROP'," + "'ELSE','END','END-EXEC','ESCAPE','EXCEPT','EXCEPTION','EXEC','EXECUTE'," + "'EXISTS','EXTERNAL','EXTRACT'," + "'FALSE','FETCH','FIRST','FLOAT','FOR','FOREIGN','FORTRAN','FOUND','FROM','FULL'," + "'GET','GLOBAL','GO','GOTO','GRANT','GROUP','HAVING','HOUR'," + "'IDENTITY','IMMEDIATE','IN','INCLUDE','INDEX','INDICATOR','INITIALLY','INNER','INPUT'," + "'INSENSITIVE','INSERT','INT','INTEGER','INTERSECT','INTERVAL','INTO','IS','ISOLATION'," + "'JOIN','KEY','LANGUAGE','LAST','LEADING','LEFT','LEVEL','LIKE','LOCAL','LOWER'," + "'MATCH','MAX','MIN','MINUTE','MODULE','MONTH'," + "'NAMES','NATIONAL','NATURAL','NCHAR','NEXT','NO','NONE','NOT','NULL','NULLIF','NUMERIC'," + "'OCTET_LENGTH','OF','ON','ONLY','OPEN','OPTION','OR','ORDER','OUTER','OUTPUT','OVERLAPS'," + "'PAD','PARTIAL','PASCAL','PLI','POSITION','PRECISION','PREPARE','PRESERVE'," + "'PRIMARY','PRIOR','PRIVILEGES','PROCEDURE','PUBLIC'," + "'READ','REAL','REFERENCES','RELATIVE','RESTRICT','REVOKE','RIGHT','ROLLBACK','ROWS'," + "'SCHEMA','SCROLL','SECOND','SECTION','SELECT','SESSION','SESSION_USER','SET'," + "'SIZE','SMALLINT','SOME','SPACE','SQL','SQLCA','SQLCODE','SQLERROR'," + "'SQLSTATE','SQLWARNING','SUBSTRING','SUM','SYSTEM_USER'," + "'TABLE','TEMPORARY','THEN','TIME','TIMESTAMP','TIMEZONE_HOUR','TIMEZONE_MINUTE'," + "'TO','TRAILING','TRANSACTION','TRANSLATE','TRANSLATION','TRIM','TRUE'," + "'UNION','UNIQUE','UNKNOWN','UPDATE','UPPER','USAGE','USER','USING'," + "'VALUE','VALUES','VARCHAR','VARYING','VIEW'," + "'WHEN','WHENEVER','WHERE','WITH','WORK','WRITE'," + "'YEAR','ZONE') ORDER BY keyword) SELECT group_concat(k, ',') FROM x"); + if (hdl != NULL && mapi_fetch_row(hdl)) { sValue = mapi_fetch_field(hdl, 0); } else { addDbcError(dbc, mapi_error(dbc->mid) == MTIMEOUT ? "HYT01" : "HY000", NULL, 0); diff --git a/clients/odbc/tests/ODBCgetInfo.c b/clients/odbc/tests/ODBCgetInfo.c --- a/clients/odbc/tests/ODBCgetInfo.c +++ b/clients/odbc/tests/ODBCgetInfo.c @@ -648,49 +648,33 @@ const struct { .info = SQL_KEYWORDS, .name = "SQL_KEYWORDS", .type = STRING, - .str = "ADD,ADMIN,AFTER,AGGREGATE,ALL,ALTER,ALWAYS,ANALYZE,AND," - "ANY,ASC,ASYMMETRIC,AT,ATOMIC,AUTHORIZATION," - "AUTO_INCREMENT,BEFORE,BEGIN,BEST,BETWEEN,BIG,BIGINT," - "BIGSERIAL,BINARY,BLOB,BY,CACHE,CALL,CASCADE,CASE,CAST," - "CENTURY,CHAIN,CHAR,CHARACTER,CHECK,CLIENT,CLOB," - "COALESCE,COLUMN,COMMENT,COMMIT,COMMITTED,CONSTRAINT," - "CONTINUE,CONVERT,COPY,CORRESPONDING,CREATE,CROSS,CUBE," - "CURRENT,CURRENT_DATE,CURRENT_ROLE,CURRENT_SCHEMA," - "CURRENT_TIME,CURRENT_TIMESTAMP,CURRENT_TIMEZONE," - "CURRENT_USER,CYCLE,DATA,DATE,DAY,DEALLOCATE,DEBUG,DEC," - "DECADE,DECIMAL,DECLARE,DEFAULT,DELETE,DELIMITERS,DESC," - "DIAGNOSTICS,DISTINCT,DO,DOUBLE,DOW,DOY,DROP,EACH," - "EFFORT,ELSE,ELSEIF,ENCRYPTED,END,ENDIAN,EPOCH,ESCAPE," - "EVERY,EXCEPT,EXCLUDE,EXEC,EXECUTE,EXISTS,EXPLAIN," - "EXTERNAL,EXTRACT,FALSE,FIRST,FLOAT,FOLLOWING,FOR," - "FOREIGN,FROM,FULL,FUNCTION,FWF,GENERATED,GLOBAL,GRANT," - "GROUP,GROUPING,GROUPS,HAVING,HOUR,HUGEINT,IDENTITY,IF," - "ILIKE,IMPRINTS,IN,INCREMENT,INDEX,INNER,INSERT,INT," - "INTEGER,INTERSECT,INTERVAL,INTO,IS,ISOLATION,JOIN,KEY," - "LANGUAGE,LARGE,LAST,LATERAL,LEFT,LEVEL,LIKE,LIMIT," - "LITTLE,LOADER,LOCAL,LOCALTIME,LOCALTIMESTAMP,MATCH," - "MATCHED,MAXVALUE,MEDIUMINT,MERGE,MINUTE,MINVALUE," - "MONTH,NAME,NATIVE,NATURAL,NEW,NEXT,NO,NOT,NOW,NULL," - "NULLIF,NULLS,NUMERIC,OBJECT,OF,OFFSET,OLD,ON,ONLY," - "OPTION,OPTIONS,OR,ORDER,ORDERED,OTHERS,OUTER,OVER," - "PARTIAL,PARTITION,PASSWORD,PATH,PLAN,POSITION," - "PRECEDING,PRECISION,PREP,PREPARE,PRESERVE,PRIMARY," - "PRIVILEGES,PROCEDURE,PUBLIC,QUARTER,RANGE,READ,REAL," - "RECORDS,REFERENCES,REFERENCING,RELEASE,REMOTE,RENAME," - "REPEATABLE,REPLACE,REPLICA,RESTART,RESTRICT,RETURN," - "RETURNS,REVOKE,RIGHT,ROLE,ROLLBACK,ROLLUP,ROW,ROWS," - "SAMPLE,SAVEPOINT,SCHEMA,SECOND,SEED,SELECT,SEQUENCE," - "SERIAL,SERIALIZABLE,SERVER,SESSION,SESSION_USER,SET," - "SETS,SIMPLE,SIZE,SMALLINT,SOME,SPLIT_PART,START," - "STATEMENT,STDIN,STDOUT,STORAGE,STRING,SUBSTRING," - "SYMMETRIC,TABLE,TEMP,TEMPORARY,TEXT,THEN,TIES,TIME," - "TIMESTAMP,TINYINT,TO,TRACE,TRANSACTION,TRIGGER,TRUE," - "TRUNCATE,TYPE,UNBOUNDED,UNCOMMITTED,UNENCRYPTED,UNION," - "UNIQUE,UPDATE,USER,USING,VALUE,VALUES,VARCHAR,VARYING," - "VIEW,WEEK,WHEN,WHERE,WHILE,WINDOW,WITH,WORK,WRITE," + .str = "ADMIN,AFTER,AGGREGATE,ALWAYS,ANALYZE," + "ASYMMETRIC,ATOMIC,AUTO_INCREMENT," + "BEFORE,BEST,BIG,BIGINT,BIGSERIAL,BINARY,BLOB," + "CACHE,CALL,CENTURY,CHAIN,CLIENT,CLOB,COMMENT," + "COMMITTED,COPY,CUBE," + "CURRENT_ROLE,CURRENT_SCHEMA,CURRENT_TIMEZONE,CYCLE," + "DATA,DEBUG,DECADE,DELIMITERS,DO,DOW,DOY," + "EACH,EFFORT,ELSEIF,ENCRYPTED,ENDIAN,EPOCH,EVERY," + "EXCLUDE,EXPLAIN,FOLLOWING,FUNCTION,FWF," + "GENERATED,GROUPING,GROUPS," + "HUGEINT,IF,ILIKE,IMPRINTS,INCREMENT," + "LARGE,LATERAL,LIMIT,LITTLE,LOADER,LOCALTIME,LOCALTIMESTAMP," + "MATCHED,MAXVALUE,MEDIUMINT,MERGE,MINVALUE," + "NAME,NATIVE,NEW,NOW,NULLS," + "OBJECT,OFFSET,OLD,OPTIONS,ORDERED,OTHERS,OVER," + "PARTITION,PASSWORD,PATH,PLAN,PRECEDING,PREP,QUARTER," + "RANGE,RECORDS,REFERENCING,RELEASE,REMOTE,RENAME,REPEATABLE," + "REPLACE,REPLICA,RESTART,RETURN,RETURNS,ROLE,ROLLUP,ROW," + "SAMPLE,SAVEPOINT,SEED,SEQUENCE,SERIAL,SERIALIZABLE," + "SERVER,SETS,SIMPLE,SPLIT_PART,START,STATEMENT," + "STDIN,STDOUT,STORAGE,STRING,SYMMETRIC," + "TEMP,TEXT,TIES,TINYINT,TRACE,TRIGGER,TRUNCATE,TYPE," + "UNBOUNDED,UNCOMMITTED,UNENCRYPTED," + "WEEK,WHILE,WINDOW," "XMLAGG,XMLATTRIBUTES,XMLCOMMENT,XMLCONCAT,XMLDOCUMENT," "XMLELEMENT,XMLFOREST,XMLNAMESPACES,XMLPARSE,XMLPI," - "XMLQUERY,XMLSCHEMA,XMLTEXT,XMLVALIDATE,YEAR,ZONE", + "XMLQUERY,XMLSCHEMA,XMLTEXT,XMLVALIDATE", }, { .info = SQL_LIKE_ESCAPE_CLAUSE, _______________________________________________ checkin-list mailing list -- [email protected] To unsubscribe send an email to [email protected]
