//-------------------------------------------------------------------- // Microsoft OLE DB Test // // Copyright 1995-2000 Microsoft Corporation. // // @doc // // @module IMDWPAR.H | Header file for ICommandWithParameters test module. // // @rev 01 | 02-04-96 | Microsoft | Created // @rev 02 | 12-01-96 | Microsoft | Updated // #ifndef _ICMDWPAR_H_ #define _ICMDWPAR_H_ #include "oledb.h" // OLE DB Header Files #include "oledberr.h" #include "privlib.h" //include private library, which includes #include "stddef.h" // offsetof //----------------------------------------------------------------------------- // Defines //----------------------------------------------------------------------------- #define TOTAL_NUMBER_OF_ROWS 30 // Total number of rows in the table. #define NOT_TOUCHED_ORD 210 // "Not touched" ordinal value #define NO_LONG_COLS 0 #define INCLUDE_LONG_COLS 1 #define MAX_STD_TYPE_NAME 30 // Max length of a standard type name for SetParameterInfo #define MAX_STMT_BUF 1024 // Max length for SQL Stmt buffer #define MAX_MSG_LEN 255 #define MAX_LTOW 33 #define RELCMP_NULL_VARIANT 2 // Since variants may be null internally we need // a way to recognize that. #define OUT_PARAM_STATUS_INVALID 99 #define OUT_PARAM_LENGTH_INVALID LONG_MAX-5; #define EXPAND(x) x, L#x #define IS_BASE_TYPE(wType, wBaseType) (((wType) & ~(DBTYPE_ARRAY|DBTYPE_BYREF|DBTYPE_VECTOR)) == (wBaseType)) //----------------------------------------------------------------------------- // ENUM //----------------------------------------------------------------------------- enum SPPARAMETERTYPE_ENUM { INPUT_ONLY, OUTPUT_ONLY, INPUT_OUTPUT, RETURN_VALUE_TYPE, MAX_NUM_PARAMS, MAX_NUM_PARAMSPLUS2, DEFAULT_PARAM }; enum SPDATAVALUES_ENUM { VALID_IN_OUT_DATA, VALID_IN_NULL_OUT_DATA, NULL_IN_VALID_OUT_DATA, NULL_IN_OUT_DATA }; enum SPBINDING_ENUM { NULL_STATUS_ONLY, STATUS_ONLY, LENGTH_VALUE_ONLY, VALUE_STATUS_ONLY, VALUE_ONLY, LENGTH_VALUE_STATUS, PASS_BYREF, REVERSE_BIND }; enum SPPARAMNAMES_ENUM { NO_PARAMNAMES, REGULAR_PARAMNAMES, VERY_LONG_PARAMNAMES }; enum NAME_ENUM { ALL_VALID_NAMES, ALL_INVALID_NAMES, // Control characters SOME_INVALID_NAMES, // Odd names are invalid ALL_NULL_NAMES, ALL_EMPTY_STRING_NAMES }; //This enumeration represents various objects that can be //obtained from Execute. For e.g., TC_Row represents the Test //Case which will test getting a ROW object (mostly) from Execute. enum ETESTCASE { TC_Rowset = 1, //Getting Rowset TC_Row, //Getting Row }; const ULONG SP_TEXT_BLOCK_SIZE = 40000; const ULONG SP_MAX_PARAMNAME_LENGTH = 128; const ULONG SP_MAX_NUM_PARAMS = 255; //----------------------------------------------------------------------------- // String constants //----------------------------------------------------------------------------- // These strings are stored procedure statements specific to SQL SERVER (odbc) // Syntax: drop procedure // Create stored procedure. // Syntax: Create procedure // , // <.......>, // <.......> // as // SQL statements // SQL statements // Returns a rowset. // Sql statements for TYPEMISMATCH and OVERFLOW test cases. const WCHAR g_wszInsertInvalidValue[] = L"Insert into %s values ( ? )"; const WCHAR g_wszMultiInsertInvalidValue[] = L"Insert into %s values ( ?,? )"; const WCHAR g_wszInsertInvalidChar[] = L"Insert into %s values ( ? )"; const WCHAR g_wszNotSqlServerOrNoOutParams[]= L"Not running against known provider/dbms or Output parameters or not supported\n"; // ---------------------------------------------------------------------- // All the following variables are for SetParameterInfo::Variation // Just moved them here so that they won't clutter the variation. // ---------------------------------------------------------------------- struct tagStdTypes { WCHAR wszStdTypeName[MAX_STD_TYPE_NAME]; DBTYPE wType; DBPARAMBINDINFO rgParamBindInfo[1]; } g_rgStdParamBindInfo[] = { // Bind info // Std Type Name DBTYPE Type Name ulParamSize dwFlags bPrecision bScale L"DBTYPE_I1", DBTYPE_I1, { NULL, NULL, 1, DBPARAMFLAGS_ISSIGNED, (BYTE)3, (BYTE)0 }, L"DBTYPE_I2", DBTYPE_I2, { NULL, NULL, 2, DBPARAMFLAGS_ISSIGNED, (BYTE)5, (BYTE)0 }, L"DBTYPE_I4", DBTYPE_I4, { NULL, NULL, 4, DBPARAMFLAGS_ISSIGNED, (BYTE)10, (BYTE)0 }, L"DBTYPE_I8", DBTYPE_I8, { NULL, NULL, 8, DBPARAMFLAGS_ISSIGNED, (BYTE)19, (BYTE)0 }, L"DBTYPE_UI1", DBTYPE_UI1, { NULL, NULL, 1, DBPARAMFLAGS_ISSIGNED, (BYTE)3, (BYTE)0 }, L"DBTYPE_UI2", DBTYPE_UI2, { NULL, NULL, 2, DBPARAMFLAGS_ISSIGNED, (BYTE)5, (BYTE)0 }, L"DBTYPE_UI4", DBTYPE_UI4, { NULL, NULL, 4, DBPARAMFLAGS_ISSIGNED, (BYTE)10, (BYTE)0 }, L"DBTYPE_UI8", DBTYPE_UI8, { NULL, NULL, 8, DBPARAMFLAGS_ISSIGNED, (BYTE)19, (BYTE)0 }, L"DBTYPE_R4", DBTYPE_R4, { NULL, NULL, 4, DBPARAMFLAGS_ISSIGNED, (BYTE)7, (BYTE)~0 }, L"DBTYPE_R8", DBTYPE_R8, { NULL, NULL, 8, DBPARAMFLAGS_ISSIGNED, (BYTE)15, (BYTE)~0 }, L"DBTYPE_CY", DBTYPE_CY, { NULL, NULL, 8, DBPARAMFLAGS_ISSIGNED, 19, 4 }, L"DBTYPE_DECIMAL", DBTYPE_DECIMAL, { NULL, NULL, 19, DBPARAMFLAGS_ISSIGNED, (BYTE)28, (BYTE)0 }, L"DBTYPE_NUMERIC", DBTYPE_NUMERIC, { NULL, NULL, 19, DBPARAMFLAGS_ISSIGNED, 25, 4 }, L"DBTYPE_BOOL", DBTYPE_BOOL, { NULL, NULL, 2, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_ERROR", DBTYPE_ERROR, { NULL, NULL, 4, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_UDT", DBTYPE_UDT, { NULL, NULL, 4, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_VARIANT", DBTYPE_VARIANT, { NULL, NULL, sizeof(VARIANT), DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_IDISPATCH", DBTYPE_IDISPATCH, { NULL, NULL, sizeof(IDispatch *), DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_IUNKNOWN", DBTYPE_IUNKNOWN, { NULL, NULL, sizeof(IUnknown *), DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_GUID", DBTYPE_GUID, { NULL, NULL, sizeof(GUID), DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_DATE", DBTYPE_DATE, { NULL, NULL, 6, DBPARAMFLAGS_ISSIGNED, (BYTE)23, (BYTE)3 }, L"DBTYPE_DBDATE", DBTYPE_DBDATE, { NULL, NULL, 6, DBPARAMFLAGS_ISSIGNED, (BYTE)23, (BYTE)3 }, L"DBTYPE_DBTIME", DBTYPE_DBTIME, { NULL, NULL, 6, DBPARAMFLAGS_ISSIGNED, (BYTE)23, (BYTE)3 }, L"DBTYPE_DBTIMESTAMP", DBTYPE_DBTIMESTAMP, { NULL, NULL, 16, DBPARAMFLAGS_ISSIGNED, (BYTE)23, (BYTE)3 }, L"DBTYPE_BSTR", DBTYPE_BSTR, { NULL, NULL, 500, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_CHAR", DBTYPE_STR, { NULL, NULL, 50, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_VARCHAR", DBTYPE_STR, { NULL, NULL, 500, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_LONGVARCHAR", DBTYPE_STR, { NULL, NULL, 5000, DBPARAMFLAGS_ISSIGNED|DBPARAMFLAGS_ISLONG, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_WCHAR", DBTYPE_WSTR, { NULL, NULL, 50, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_WVARCHAR", DBTYPE_WSTR, { NULL, NULL, 500, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_WLONGVARCHAR", DBTYPE_WSTR, { NULL, NULL, 5000, DBPARAMFLAGS_ISSIGNED|DBPARAMFLAGS_ISLONG, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_BINARY", DBTYPE_BYTES, { NULL, NULL, 50, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_VARBINARY", DBTYPE_BYTES, { NULL, NULL, 500, DBPARAMFLAGS_ISSIGNED, (BYTE)~0, (BYTE)~0 }, L"DBTYPE_LONGVARBINARY", DBTYPE_BYTES, { NULL, NULL, 5000, DBPARAMFLAGS_ISSIGNED|DBPARAMFLAGS_ISLONG, (BYTE)~0, (BYTE)~0 } }; const ULONG g_cStdParams = NUMELEM(g_rgStdParamBindInfo); struct tagParamFlags { DBPARAMFLAGS dwFlag; WCHAR * pwszFlagName; } g_rgParamFlags[] = { EXPAND(DBPARAMFLAGS_ISINPUT), EXPAND(DBPARAMFLAGS_ISOUTPUT), EXPAND(DBPARAMFLAGS_ISSIGNED), EXPAND(DBPARAMFLAGS_ISNULLABLE), EXPAND(DBPARAMFLAGS_ISLONG), EXPAND(DBPARAMFLAGS_SCALEISNEGATIVE) }; //---------------------------------------------------------------------------------------- // Use our own WCSDUP instead of _wcsdup //---------------------------------------------------------------------------------------- inline WCHAR * WCSDUP (IMalloc *pIAlloc, WCHAR * pwszStr) { WCHAR *ptr=NULL; // If pwsz is not null. if (pwszStr) { ptr = (WCHAR *)pIAlloc->Alloc(sizeof(WCHAR)*wcslen(pwszStr) + sizeof(WCHAR)); // If ptr is not null copy the string else return NULL; if (ptr) wcscpy(ptr, pwszStr); } return ptr; } #define MAX_SQL 250 #define MAX_PROVIDER_NAME 100 #define MAX_DBMS_NAME 100 #define MAX_LONG_VALUE 200001L //5000000L // 5 MBytes #define BOUNDARY_VALUE 65535L // 64K #define MAX_DATA_BUF MAX_LONG_VALUE+1 #define MAX_COMMAND_BUF 1000 #define FILL_VALUE 0x01 #define MAX_ORDER_LIST 16 // Max number of columns in an order by clause enum PARAM_OBJECT_TEST { VALID_INPUT_DATA, NULL_STORAGE_OBJECT, EMPTY_STORAGE_OBJECT, NULL_DATA, DEFAULT_DATA, MULTIPLE_OBJECTS, NON_BLOCKING_OBJECTS, VALID_OUTPUT_DATA, VALID_INOUT_DATA, ZOMBIE_OBJECT, NULL_POBJECT, BADSTORAGEFLAGS, NO_VALUE_BINDING }; // The following error conditions require the stream to // remain active, that is not be released. enum ACTIVE_ERROR { INVALIDARG_MULTRES, INVALIDARG_NULL_PDATA, INVALIDARG_CPARAMSETS_ZERO, BADACCESSORHANDLE, BADACCESSORTYPE, ERRORSOCCURRED, NOINTERFACE, BADBINDINFO, BADORDINAL, BADSTORAGEFLAGS_ERR, UNSUPPORTEDCONVERSION, NOAGGREGATION_OLEDB1, NOAGGREGATION_NOT_IUNKOWN, NOCOMMAND, OBJECTOPEN, LAST_ACTIVE_ERROR // Must remain last enum value }; enum CREATE_FLAGS { NO_FLAGS=0, CREATE_LONG_NAMES=1, // Param names longer than max CREATE_MAX_NAMES=2 // Param names equal max }; enum COMPARE_OP { CP_EQ, CP_GT, CP_LT, CP_ISNULL, CP_ISNOTNULL }; enum PROVIDER_ENUM { MSDASQL, SQLOLEDB, MSDAORA, MSDAORA8, UNKNOWN_PROVIDER // This must be the last enum in the list }; enum DBMS_ENUM { MS_SQL_SERVER, ORACLE, // MS_ACCESS, UNKNOWN_DBMS // This must be the last enum in the list }; enum VERIFY_ENUM { VERIFY_USE_TABLE, VERIFY_USE_PDATA, VERIFY_NULL, VERIFY_NONE }; enum ROWSET_ENUM { ROWSET_NONE, ROWSET_MAYBE, ROWSET_ALWAYS }; enum DIALECT_ENUM { ORA_SQL, // ANSI SQL SS_SQL, // SQL Server SQL JET_SQL // JET Engine SQL }; enum TOKEN_ENUM { T_COL_LIST, T_CREATE_PROC, T_CREATE_PROC_RET, T_CREATE_PROC_INSERT_IN, T_CREATE_PROC_SELECT_IN, T_CREATE_PROC_SELECT_IN_RET, T_CREATE_PROC_SELECT_INOUT, T_CREATE_PROC_SELECT_LOOKUP, T_CREATE_PROC_SELECT_NO_PARM, T_CREATE_PROC_SELECT_OUT, T_CREATE_PROC_SELECT_OUT_DFLT, T_CREATE_PROC_SELECT_OUT_NULL, T_CREATE_PROC_SELECT_OUT_RET, T_DATA_VAL, T_DEFAULT, T_DROP, T_DROP_FUN, T_DROP_FUNC, T_DROP_PROC, T_EMPTY, T_EQUALS, T_EXEC, T_EXEC_PROC_DELETE, T_EXEC_PROC_DELETE_RET, T_EXEC_PROC_INSERT_INPUT, T_EXEC_PROC_INSERT_INPUT_RET, T_EXEC_PROC_SELECT_IN, T_EXEC_PROC_SELECT_IN_RET, T_EXEC_PROC_SELECT_INOUT, T_EXEC_PROC_SELECT_INOUT_RET, T_EXEC_PROC_SELECT_LOOKUP, T_EXEC_PROC_SELECT_NO_PARM, T_EXEC_PROC_SELECT_OUT, T_EXEC_PROC_SELECT_OUT_DFLT, T_EXEC_PROC_SELECT_OUT_NULL, T_EXEC_PROC_SELECT_OUT_RET, T_EXEC_PROC_UPDATE_INPUT, T_EXEC_PROC_UPDATE_INPUT_RET, T_EXEC_RET, T_FIRST_COL_EQ_PARM, T_FIRST_PARM, T_INTO, T_INSERT, T_INSERT_IN, T_INSERT_IN_MARKER, T_LOOKUP_PARM_EQ_LIST, T_LOOKUP_PARM_INTO, T_LOOKUP_WHERE_EQ, T_NO_LONG_COL_LIST, T_NO_LONG_COL_ORDER_LIST, T_NO_LONG_PARM_DEF_LIST, T_NO_LONG_PARM_DEF_LIST_DFLT, T_NO_LONG_PARM_DEF_LIST_PAREN, T_NO_LONG_PARM_DEF_LIST_DFLT_PAREN, T_NO_LONG_PARM_EQ_LIST, T_NO_LONG_PARM_LIST, T_NO_LONG_PARM_MARKER_EQ_LIST, // T_NO_LONG_PARM_MARKER_EQ_LIST_PAREN, T_NO_LONG_PARM_MARKER_LIST, T_NO_LONG_PARM_MARKER_LIST_PAREN, T_NONE, T_NULL_COL_LIST, T_NULL_PARM_EQ_LIST, T_OFFSET_NO_LONG_COL_LIST, T_OFFSET_NO_LONG_PARM_EQ_LIST, T_OFFSET_NO_LONG_PARM_MARKER_EQ_LIST, // T_OFFSET_NO_LONG_PARM_MARKER_EQ_LIST_PAREN, T_OFFSET_PARM_INTO, T_OFFSET_PARM_INTO_MARKER, T_OFFSET_SEARCHABLE_COL_EQ_PARM, T_OFFSET_WHERE_EQ, T_ORDER, T_ORDER_CLAUSE, T_ORDER_COL, T_PAREN, T_PARM_DEF, T_PARM_DEF_IN, T_PARM_DEF_INOUT, T_PARM_DEF_LIST, T_PARM_DEF_OUT, T_PARM_DEFAULT, T_PARM_EQ, T_PARM_IN, T_PARM_INOUT, T_PARM_INTO, T_PARM_INTO_MARKER, T_PARM_MARKER, T_PARM_MARKER_LIST, T_PARM_MARKER_LIST_DFLT, T_PARM_MARKER_LIST_RET, T_PARM_MARKER_LIST_PAREN, T_PARM_MARKER_LIST_DFLT_PAREN, T_PARM_MARKER_LIST_RET_PAREN, T_PARM_NAME, T_PARM_NAME_FMT, T_PARM_NULL, T_PARM_OUT, T_PARM_SIZE, T_PARM_TYPE, T_PROC_NAME, T_RET_DEF, T_RET_NAME, T_RET_TYPE, T_RET_TYPE_NAME, T_RET_VAL, T_ROOT, T_SEARCHABLE_COL_EQ, T_SEARCHABLE_COL_EQ_PARM, T_SEARCHABLE_COL_EQ_PARM_MARKER, T_SEARCHABLE_PARM_MARKER_LIST, T_SEARCHABLE_PARM_MARKER_LIST_PAREN, T_SECOND_COL, T_SELECT_IN, T_SELECT_IN_MARKER, T_SELECT_INOUT, T_SELECT_INOUT_MARKER, T_SELECT_LOOKUP, T_SELECT_NO_PARM, T_SELECT_NULL, T_SELECT_OUT, T_SELECT_OUT_MARKER, T_SELECT_OUT_NULL_MARKER, T_SELECT_UNIQUE, T_SELECT_UNIQUE_ALL, T_SELECT_WHERE, T_TABLE_NAME, T_UNIQUE_NO_LONG_PARM_EQ_LIST, T_UNIQUE_SEARCHABLE_COL_EQ_PARM, T_UNIQUE_SEARCHABLE_COL_EQ_PARM_MARKER, T_UNIQUE_WHERE_EQ, T_UNIQUE_WHERE_EQ_MARKER, T_UPDATABLE_COL_LIST, T_UPDATABLE_PARM_DEF_LIST, T_UPDATABLE_PARM_DEF_LIST_PAREN, T_UPDATABLE_PARM_LIST, T_UPDATABLE_PARM_MARKER_LIST, T_UPDATABLE_PARM_MARKER_LIST_PAREN, T_WHERE, T_WHERE_ALL, T_WHERE_EQ, T_WHERE_EQ_MARKER }; typedef struct tagDialect { enum PROVIDER_ENUM eProvider; enum DBMS_ENUM eDBMS; enum DIALECT_ENUM eDialect; } Dialects; const Dialects g_Dialects[] = { MSDAORA, ORACLE, ORA_SQL, MSDAORA8, ORACLE, ORA_SQL, // MSDASQL, MS_ORACLE, ORA_SQL, MSDASQL, MS_SQL_SERVER, SS_SQL, SQLOLEDB, MS_SQL_SERVER, SS_SQL, // MSDASQL, MS_ACCESS, JET_SQL, // JOLT, MS_ACCESS, JET_SQL UNKNOWN_PROVIDER, UNKNOWN_DBMS, ORA_SQL // This must be the last enum in the list }; typedef struct tagDialectTokens { enum DIALECT_ENUM eDialect; // Dialect in use enum TOKEN_ENUM eToken; // The token we want ULONG cTokens; // Made up of this number of other tokens enum TOKEN_ENUM rgeTokens[20]; // Other tokens in proper order WCHAR * pwszTokenString; // String for this token or NULL if none } DialectTokens; const DialectTokens g_DialectTokens[] = { // Token // Dialect String to create Count Token list, or required string. NULL for root token we know how to build // Syntax items we need to be able to create for testing // For testing input and output params in same proc ORA_SQL, T_CREATE_PROC_SELECT_OUT, 4, {T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_OUT}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_OUT, 3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_PAREN}, NULL, ORA_SQL, T_SELECT_OUT_MARKER, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_PARM_INTO_MARKER, T_WHERE_EQ_MARKER}, NULL, // For testing no params ORA_SQL, T_CREATE_PROC_SELECT_NO_PARM,4, {T_CREATE_PROC, T_PROC_NAME, T_EMPTY, T_SELECT_NO_PARM}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_NO_PARM, 3, {T_EXEC, T_PROC_NAME, T_EMPTY}, NULL, // ORA_SQL, T_SELECT_NO_PARM, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_COL_LIST, T_EMPTY}, NULL, // For testing input only params ORA_SQL, T_CREATE_PROC_SELECT_IN, 4, {T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_IN}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_IN, 3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_PAREN}, NULL, ORA_SQL, T_SELECT_IN_MARKER, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_COL_LIST, T_WHERE_EQ_MARKER}, NULL, // For testing in/out params ORA_SQL, T_CREATE_PROC_SELECT_INOUT, 4, {T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_INOUT}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_INOUT, 3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_PAREN}, NULL, ORA_SQL, T_SELECT_INOUT_MARKER, 5, {T_SELECT_UNIQUE, T_TABLE_NAME, T_PARM_INTO_MARKER, T_UNIQUE_WHERE_EQ_MARKER, T_NO_LONG_COL_ORDER_LIST}, NULL, // For testing return params ORA_SQL, T_CREATE_PROC_SELECT_OUT_RET,6, {T_CREATE_PROC_RET, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_OUT, T_RET_TYPE, T_RET_VAL}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_OUT_RET, 4, {T_EXEC_RET, T_PROC_NAME, T_PARM_MARKER_LIST_RET_PAREN, T_PARM_MARKER}, NULL, // For proving we can return a NULL on top of a valid input param ORA_SQL, T_CREATE_PROC_SELECT_LOOKUP,4, {T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_LOOKUP}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_LOOKUP, 3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_PAREN}, NULL, // For proving we can return a NULL when status-only is bound ORA_SQL, T_CREATE_PROC_SELECT_OUT_NULL,4,{T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_NULL}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_OUT_NULL,3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_PAREN}, NULL, ORA_SQL, T_SELECT_OUT_NULL_MARKER, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_PARM_INTO_MARKER, T_WHERE_EQ_MARKER}, NULL, // For testing input and output params in same proc using a default param ORA_SQL, T_CREATE_PROC_SELECT_OUT_DFLT,4,{T_CREATE_PROC, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_DFLT_PAREN, T_SELECT_OUT}, NULL, ORA_SQL, T_EXEC_PROC_SELECT_OUT_DFLT,3, {T_EXEC, T_PROC_NAME, T_PARM_MARKER_LIST_DFLT_PAREN}, NULL, // Can't have default params in a statement, only a procedure. // ORA_SQL, T_SELECT_OUT_MARKER_DFLT, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_PARM_INTO_MARKER, T_WHERE_EQ_MARKER}, NULL, // For testing of insert statements ORA_SQL, T_CREATE_PROC_INSERT_IN, 4, {T_CREATE_PROC, T_PROC_NAME, T_UPDATABLE_PARM_DEF_LIST_PAREN, T_INSERT_IN}, NULL, ORA_SQL, T_EXEC_PROC_INSERT_INPUT, 3, {T_EXEC, T_PROC_NAME, T_UPDATABLE_PARM_MARKER_LIST_PAREN}, NULL, ORA_SQL, T_INSERT_IN_MARKER, 4, {T_INSERT, T_TABLE_NAME, T_UPDATABLE_COL_LIST, T_UPDATABLE_PARM_MARKER_LIST}, NULL, // To drop the procedure or function when done ORA_SQL, T_DROP_PROC, 2, {T_DROP, T_PROC_NAME}, NULL, ORA_SQL, T_DROP_FUNC, 2, {T_DROP_FUN, T_PROC_NAME}, NULL, /* // TODO: Add logic for create proc, stmt with markers, etc, for the following types ORA_SQL, T_EXEC_PROC_UPDATE_INPUT, ?, {?, ?, }, NULL, ORA_SQL, T_EXEC_PROC_DELETE_INPUT, ?, {?, ?, }, NULL, ORA_SQL, T_EXEC_PROC_SELECT_BETWEEN, ?, {?, ?, }, NULL, ORA_SQL, T_EXEC_PROC_SELECT_IN, ?, {?, ?, }, NULL, */ // Partial strings used to build up other strings ORA_SQL, T_SELECT_OUT, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_PARM_INTO, T_WHERE_EQ}, NULL, ORA_SQL, T_SELECT_NULL, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_PARM_NULL, T_WHERE_EQ}, NULL, ORA_SQL, T_SELECT_NO_PARM, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_COL_LIST, T_ORDER_CLAUSE}, NULL, ORA_SQL, T_SELECT_IN, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_COL_LIST, T_WHERE_EQ}, NULL, ORA_SQL, T_SELECT_INOUT, 5, {T_SELECT_UNIQUE, T_TABLE_NAME, T_PARM_INTO, T_UNIQUE_WHERE_EQ, T_NO_LONG_COL_ORDER_LIST}, NULL, ORA_SQL, T_SELECT_LOOKUP, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_LOOKUP_PARM_INTO, T_LOOKUP_WHERE_EQ}, NULL, ORA_SQL, T_SELECT_UNIQUE_ALL, 5, {T_SELECT_UNIQUE, T_TABLE_NAME, T_NO_LONG_COL_LIST, T_WHERE_ALL, T_NO_LONG_COL_ORDER_LIST}, NULL, ORA_SQL, T_WHERE_EQ, 2, {T_WHERE, T_SEARCHABLE_COL_EQ_PARM},NULL, ORA_SQL, T_LOOKUP_WHERE_EQ, 2, {T_WHERE, T_FIRST_COL_EQ_PARM},NULL, ORA_SQL, T_OFFSET_WHERE_EQ, 2, {T_WHERE, T_OFFSET_SEARCHABLE_COL_EQ_PARM},NULL, ORA_SQL, T_UNIQUE_WHERE_EQ, 2, {T_WHERE, T_UNIQUE_SEARCHABLE_COL_EQ_PARM},NULL, ORA_SQL, T_WHERE_EQ_MARKER, 2, {T_WHERE, T_SEARCHABLE_COL_EQ_PARM_MARKER},NULL, ORA_SQL, T_UNIQUE_WHERE_EQ_MARKER, 2, {T_WHERE, T_UNIQUE_SEARCHABLE_COL_EQ_PARM_MARKER},NULL, ORA_SQL, T_PARM_INTO, 3, {T_INTO, T_NO_LONG_COL_LIST, T_NO_LONG_PARM_LIST}, NULL, ORA_SQL, T_PARM_NULL, 3, {T_INTO, T_NULL_COL_LIST, T_NO_LONG_PARM_LIST}, NULL, ORA_SQL, T_LOOKUP_PARM_INTO, 3, {T_INTO, T_SECOND_COL, T_FIRST_PARM}, NULL, ORA_SQL, T_OFFSET_PARM_INTO, 3, {T_INTO, T_OFFSET_NO_LONG_COL_LIST, T_NO_LONG_PARM_LIST}, NULL, ORA_SQL, T_PARM_INTO_MARKER, 3, {T_INTO, T_NO_LONG_COL_LIST, T_NO_LONG_PARM_MARKER_LIST}, NULL, ORA_SQL, T_OFFSET_PARM_INTO_MARKER, 3, {T_INTO, T_OFFSET_NO_LONG_COL_LIST, T_NO_LONG_PARM_MARKER_LIST}, NULL, ORA_SQL, T_PARM_DEF_IN, 5, {T_PARM_DEF, T_PARM_NAME, T_PARM_IN, T_PARM_TYPE, T_DEFAULT}, NULL, ORA_SQL, T_PARM_DEF_OUT, 5, {T_PARM_DEF, T_PARM_NAME, T_PARM_OUT, T_PARM_TYPE, T_EMPTY}, NULL, ORA_SQL, T_PARM_DEF_INOUT, 5, {T_PARM_DEF, T_PARM_NAME, T_PARM_INOUT, T_PARM_TYPE, T_EMPTY}, NULL, ORA_SQL, T_DEFAULT, 2, {T_PARM_DEFAULT, T_DATA_VAL}, NULL, ORA_SQL, T_UPDATABLE_PARM_DEF_LIST_PAREN,2, {T_PAREN, T_UPDATABLE_PARM_DEF_LIST}, NULL, ORA_SQL, T_NO_LONG_PARM_DEF_LIST_PAREN, 2, {T_PAREN, T_NO_LONG_PARM_DEF_LIST}, NULL, ORA_SQL, T_NO_LONG_PARM_DEF_LIST_DFLT_PAREN,2, {T_PAREN, T_NO_LONG_PARM_DEF_LIST_DFLT}, NULL, ORA_SQL, T_NO_LONG_PARM_MARKER_LIST_PAREN, 2, {T_PAREN, T_NO_LONG_PARM_MARKER_LIST}, NULL, // ORA_SQL, T_NO_LONG_PARM_MARKER_EQ_LIST_PAREN,2,{T_PAREN, T_NO_LONG_PARM_MARKER_EQ_LIST}, NULL, // ORA_SQL, T_OFFSET_NO_LONG_PARM_MARKER_EQ_LIST_PAREN ,2,{T_PAREN, T_OFFSET_NO_LONG_PARM_MARKER_EQ_LIST}, NULL, ORA_SQL, T_PARM_MARKER_LIST_PAREN, 2, {T_PAREN, T_PARM_MARKER_LIST}, NULL, ORA_SQL, T_PARM_MARKER_LIST_DFLT_PAREN, 2, {T_PAREN, T_PARM_MARKER_LIST_DFLT}, NULL, ORA_SQL, T_PARM_MARKER_LIST_RET_PAREN, 2, {T_PAREN, T_PARM_MARKER_LIST_RET}, NULL, ORA_SQL, T_SEARCHABLE_PARM_MARKER_LIST_PAREN,2,{T_PAREN, T_SEARCHABLE_PARM_MARKER_LIST}, NULL, ORA_SQL, T_UPDATABLE_PARM_MARKER_LIST_PAREN,2, {T_PAREN, T_UPDATABLE_PARM_MARKER_LIST}, NULL, ORA_SQL, T_ORDER_CLAUSE, 2, {T_ORDER, T_ORDER_COL}, NULL, ORA_SQL, T_INSERT_IN, 4, {T_INSERT, T_TABLE_NAME, T_UPDATABLE_COL_LIST, T_UPDATABLE_PARM_LIST}, NULL, // Root syntax that is merely returned and not composed of other tokens ORA_SQL, T_WHERE, 0, {T_ROOT}, L"where %1", ORA_SQL, T_WHERE_ALL, 0, {T_ROOT}, L"where 1=1", ORA_SQL, T_SELECT_WHERE, 0, {T_ROOT}, L"select %2 from %1 %3", ORA_SQL, T_SELECT_UNIQUE, 0, {T_ROOT}, L"select distinct %2 from %1 %3 order by %4", ORA_SQL, T_CREATE_PROC, 0, {T_ROOT}, L"create procedure %1%2 as begin %3; end;", ORA_SQL, T_CREATE_PROC_RET, 0, {T_ROOT}, L"create function %1%2 return %4 as begin %3; return(%5); end;", ORA_SQL, T_INTO, 0, {T_ROOT}, L"%1 into %2", ORA_SQL, T_INSERT, 0, {T_ROOT}, L"insert into %1(%2) values (%3)", ORA_SQL, T_EQUALS, 0, {T_ROOT}, L"%1 = %2", ORA_SQL, T_PARM_NAME_FMT, 0, {T_ROOT}, L"%1", ORA_SQL, T_PARM_MARKER, 0, {T_ROOT}, L"?", ORA_SQL, T_EXEC, 0, {T_ROOT}, L"{call %1 %2}", ORA_SQL, T_EXEC_RET, 0, {T_ROOT}, L"{%3=call %1 %2}", ORA_SQL, T_DROP, 0, {T_ROOT}, L"drop procedure %1", ORA_SQL, T_DROP_FUN, 0, {T_ROOT}, L"drop function %1", ORA_SQL, T_PARM_DEF, 0, {T_ROOT}, L"%1 %2 %3 %4", ORA_SQL, T_PARM_IN, 0, {T_ROOT}, L"IN", ORA_SQL, T_PARM_OUT, 0, {T_ROOT}, L"OUT", ORA_SQL, T_PARM_INOUT, 0, {T_ROOT}, L"IN OUT", ORA_SQL, T_RET_NAME, 0, {T_ROOT}, L"RETURN_VALUE", ORA_SQL, T_RET_TYPE_NAME, 0, {T_ROOT}, L"DBTYPE_CHAR", ORA_SQL, T_PARM_DEFAULT, 0, {T_ROOT}, L":= %1", ORA_SQL, T_PAREN, 0, {T_ROOT}, L"(%1)", ORA_SQL, T_ORDER, 0, {T_ROOT}, L"order by %1", ORA_SQL, T_EMPTY, 0, {T_ROOT}, L" ", // Provider specific syntax SS_SQL, T_SELECT_OUT, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_NO_LONG_PARM_EQ_LIST, T_WHERE_EQ}, NULL, SS_SQL, T_SELECT_NULL, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_NULL_PARM_EQ_LIST, T_WHERE_EQ}, NULL, SS_SQL, T_SELECT_INOUT, 5, {T_SELECT_UNIQUE, T_TABLE_NAME, T_NO_LONG_PARM_EQ_LIST, T_UNIQUE_WHERE_EQ, T_NO_LONG_COL_ORDER_LIST}, NULL, SS_SQL, T_SELECT_LOOKUP, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_LOOKUP_PARM_EQ_LIST, T_LOOKUP_WHERE_EQ}, NULL, SS_SQL, T_SELECT_INOUT_MARKER, 5, {T_SELECT_UNIQUE, T_TABLE_NAME, T_NO_LONG_PARM_MARKER_EQ_LIST, T_UNIQUE_WHERE_EQ_MARKER, T_NO_LONG_COL_ORDER_LIST}, NULL, SS_SQL, T_SELECT_OUT_MARKER, 4, {T_SELECT_WHERE, T_TABLE_NAME, T_NO_LONG_PARM_MARKER_EQ_LIST, T_WHERE_EQ_MARKER}, NULL, SS_SQL, T_PARM_NAME_FMT, 0, {T_ROOT}, L"@%1", SS_SQL, T_PARM_DEF, 0, {T_ROOT}, L"%1 %2%3%4 %5", SS_SQL, T_PARM_DEF_IN, 6, {T_PARM_DEF, T_PARM_NAME, T_PARM_TYPE, T_PARM_SIZE, T_DEFAULT, T_PARM_IN}, NULL, SS_SQL, T_PARM_DEF_OUT, 6, {T_PARM_DEF, T_PARM_NAME, T_PARM_TYPE, T_PARM_SIZE, T_DEFAULT, T_PARM_OUT}, NULL, SS_SQL, T_PARM_DEF_INOUT, 6, {T_PARM_DEF, T_PARM_NAME, T_PARM_TYPE, T_PARM_SIZE, T_DEFAULT, T_PARM_INOUT}, NULL, SS_SQL, T_PARM_IN, 0, {T_ROOT}, L"", SS_SQL, T_PARM_OUT, 0, {T_ROOT}, L"OUTPUT", SS_SQL, T_PARM_INOUT, 0, {T_ROOT}, L"OUTPUT", SS_SQL, T_CREATE_PROC_RET, 0, {T_ROOT}, L"create procedure %1%2 as begin %3 return(%4) end", SS_SQL, T_DROP_FUN, 0, {T_ROOT}, L"drop procedure %1", SS_SQL, T_CREATE_PROC_SELECT_OUT_RET,5, {T_CREATE_PROC_RET, T_PROC_NAME, T_NO_LONG_PARM_DEF_LIST_PAREN, T_SELECT_OUT, T_RET_VAL}, NULL, SS_SQL, T_RET_TYPE_NAME, 0, {T_ROOT}, L"DBTYPE_I4", SS_SQL, T_LOOKUP_PARM_EQ_LIST, 3, {T_EQUALS, T_FIRST_PARM, T_SECOND_COL}, NULL, SS_SQL, T_PARM_DEFAULT, 0, {T_ROOT}, L"= %1", SS_SQL, T_RET_NAME, 0, {T_ROOT}, L"@RETURN_VALUE", JET_SQL, T_DROP, 0, {T_ROOT}, L"drop table \"%1\"", // Special strings we know how to create given the table and possibly the bindings ORA_SQL, T_SEARCHABLE_COL_EQ, 0, {T_ROOT}, NULL, ORA_SQL, T_UPDATABLE_COL_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_COL_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NULL_COL_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_COL_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_COL_ORDER_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_OFFSET_NO_LONG_COL_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_DEF_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_DEF_LIST_DFLT,0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_MARKER_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_MARKER_EQ_LIST,0,{T_ROOT}, NULL, ORA_SQL, T_OFFSET_NO_LONG_PARM_MARKER_EQ_LIST,0,{T_ROOT}, NULL, ORA_SQL, T_NO_LONG_PARM_EQ_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_NULL_PARM_EQ_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_OFFSET_NO_LONG_PARM_EQ_LIST,0,{T_ROOT}, NULL, ORA_SQL, T_UNIQUE_NO_LONG_PARM_EQ_LIST,0,{T_ROOT}, NULL, ORA_SQL, T_SEARCHABLE_COL_EQ_PARM, 0, {T_ROOT}, NULL, ORA_SQL, T_OFFSET_SEARCHABLE_COL_EQ_PARM,0,{T_ROOT}, NULL, ORA_SQL, T_UNIQUE_SEARCHABLE_COL_EQ_PARM,0,{T_ROOT}, NULL, ORA_SQL, T_SEARCHABLE_COL_EQ_PARM_MARKER,0,{T_ROOT},NULL, ORA_SQL, T_UNIQUE_SEARCHABLE_COL_EQ_PARM_MARKER,0,{T_ROOT},NULL, ORA_SQL, T_PROC_NAME, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_NAME, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_TYPE, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_SIZE, 0, {T_ROOT}, NULL, ORA_SQL, T_TABLE_NAME, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_MARKER_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_MARKER_LIST_DFLT, 0, {T_ROOT}, NULL, ORA_SQL, T_PARM_MARKER_LIST_RET, 0, {T_ROOT}, NULL, ORA_SQL, T_SEARCHABLE_PARM_MARKER_LIST,0,{T_ROOT}, NULL, ORA_SQL, T_UPDATABLE_PARM_MARKER_LIST,0, {T_ROOT}, NULL, ORA_SQL, T_UPDATABLE_PARM_DEF_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_UPDATABLE_PARM_LIST, 0, {T_ROOT}, NULL, ORA_SQL, T_RET_DEF, 0, {T_ROOT}, NULL, ORA_SQL, T_RET_TYPE, 0, {T_ROOT}, NULL, ORA_SQL, T_RET_VAL, 0, {T_ROOT}, NULL, ORA_SQL, T_SECOND_COL, 0, {T_ROOT}, NULL, ORA_SQL, T_FIRST_PARM, 0, {T_ROOT}, NULL, ORA_SQL, T_FIRST_COL_EQ_PARM, 0, {T_ROOT}, NULL, ORA_SQL, T_DATA_VAL, 0, {T_ROOT}, NULL, ORA_SQL, T_ORDER_COL, 0, {T_ROOT}, NULL }; typedef struct tagProviderList { enum PROVIDER_ENUM eProvider; WCHAR wszProviderName[MAX_PROVIDER_NAME]; } ProviderList; const ProviderList g_ProviderList[] = { // MSDASQL, L"Microsoft OLE DB Provider for ODBC Drivers", // Kagera 1.1 MSDASQL, L"MSDASQL.DLL", // Chinook (Kagera 1.5) SQLOLEDB, L"sqloledb.dll", MSDAORA, L"MSDAORA.DLL", MSDAORA8, L"MSDAORA8.DLL" }; typedef struct tagDBMSList { enum DBMS_ENUM eDBMS; WCHAR wszDBMSName[MAX_DBMS_NAME]; } DBMSList; const DBMSList g_DBMSList[] = { MS_SQL_SERVER, L"Microsoft SQL Server", ORACLE, L"Oracle", // MS_ACCESS, L"ACCESS", }; #endif //_ICMDWPAR_H_