In Postgresql, numeric items without precision are unlimited and there's no natural...
authorHiroshi Inoue <h-inoue@dream.email.ne.jp>
Mon, 5 Nov 2018 05:39:49 +0000 (14:39 +0900)
committerHiroshi Inoue <h-inoue@dream.email.ne.jp>
Mon, 5 Nov 2018 05:39:49 +0000 (14:39 +0900)
Add an option *Numeric(without precision) as*.

dlg_specific.c
dlg_specific.h
dlg_wingui.c
pgtypes.c
psqlodbc.h
psqlodbc.rc
resource.h

index 8436672b5cf9f996bbd75d6042747c46a13fdff3..309b9bcd546c95aeecf1fa1084a942f0117ddbee 100644 (file)
@@ -354,6 +354,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
            INI_LOWERCASEIDENTIFIER "=%d;"
            "%s"        /* INI_PQOPT */
            "%s"        /* INIKEEPALIVE TIME/INTERVAL */
+           INI_NUMERIC_AS "=%d;"
 #ifdef _HANDLE_ENLIST_IN_DTC_
            INI_XAOPT "=%d" /* XAOPT */
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -386,6 +387,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
            ,ci->lower_case_identifier
            ,makeBracketConnectString(ci->pqopt_in_str, &pqoptStr, ci->pqopt, INI_PQOPT)
            ,makeKeepaliveConnectString(keepaliveStr, sizeof(keepaliveStr), ci, FALSE)
+           ,ci->numeric_as
 #ifdef _HANDLE_ENLIST_IN_DTC_
            ,ci->xa_opt
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -461,6 +463,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
                ABBR_EXTRASYSTABLEPREFIXES "=%s;"
                "%s"        /* ABBR_PQOPT */
                "%s"        /* ABBRKEEPALIVE TIME/INTERVAL */
+               INI_NUMERIC_AS "=%d;"
 #ifdef _HANDLE_ENLIST_IN_DTC_
                "%s"
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -473,6 +476,7 @@ MYLOG(DETAIL_LOG_LEVEL, "hlen=" FORMAT_SSIZE_T "\n", hlen);
                ci->drivers.extra_systable_prefixes,
                makeBracketConnectString(ci->pqopt_in_str, &pqoptStr, ci->pqopt, ABBR_PQOPT),
                makeKeepaliveConnectString(keepaliveStr, sizeof(keepaliveStr), ci, TRUE),
+               ci->numeric_as,
 #ifdef _HANDLE_ENLIST_IN_DTC_
                makeXaOptConnectString(xaOptStr, sizeof(xaOptStr), ci, TRUE),
 #endif /* _HANDLE_ENLIST_IN_DTC_ */
@@ -658,6 +662,8 @@ copyConnAttributes(ConnInfo *ci, const char *attribute, const char *value)
        ci->true_is_minus1 = atoi(value);
    else if (stricmp(attribute, INI_INT8AS) == 0)
        ci->int8_as = atoi(value);
+   else if (stricmp(attribute, INI_NUMERIC_AS) == 0)
+       ci->numeric_as = atoi(value);
    else if (stricmp(attribute, INI_BYTEAASLONGVARBINARY) == 0 || stricmp(attribute, ABBR_BYTEAASLONGVARBINARY) == 0)
        ci->bytea_as_longvarbinary = atoi(value);
    else if (stricmp(attribute, INI_USESERVERSIDEPREPARE) == 0 || stricmp(attribute, ABBR_USESERVERSIDEPREPARE) == 0)
@@ -790,6 +796,7 @@ getCiDefaults(ConnInfo *ci)
    ci->lf_conversion = DEFAULT_LFCONVERSION;
    ci->true_is_minus1 = DEFAULT_TRUEISMINUS1;
    ci->int8_as = DEFAULT_INT8AS;
+   ci->numeric_as = DEFAULT_NUMERIC_AS;
    ci->bytea_as_longvarbinary = DEFAULT_BYTEAASLONGVARBINARY;
    ci->use_server_side_prepare = DEFAULT_USESERVERSIDEPREPARE;
    ci->lower_case_identifier = DEFAULT_LOWERCASEIDENTIFIER;
@@ -1019,6 +1026,9 @@ MYLOG(0, "drivername=%s\n", drivername);
    if (SQLGetPrivateProfileString(DSN, INI_INT8AS, NULL_STRING, temp, sizeof(temp), ODBC_INI) > 0)
        ci->int8_as = atoi(temp);
 
+   if (SQLGetPrivateProfileString(DSN, INI_NUMERIC_AS, NULL_STRING, temp, sizeof(temp), ODBC_INI) > 0)
+       ci->numeric_as = atoi(temp);
+
    if (SQLGetPrivateProfileString(DSN, INI_BYTEAASLONGVARBINARY, NULL_STRING, temp, sizeof(temp), ODBC_INI) > 0)
        ci->bytea_as_longvarbinary = atoi(temp);
 
@@ -1276,6 +1286,11 @@ writeDSNinfo(const ConnInfo *ci)
                                 INI_INT8AS,
                                 temp,
                                 ODBC_INI);
+   ITOA_FIXED(temp, ci->numeric_as);
+   SQLWritePrivateProfileString(DSN,
+                                INI_NUMERIC_AS,
+                                temp,
+                                ODBC_INI);
    SPRINTF_FIXED(temp, "%x", getExtraOptions(ci));
    SQLWritePrivateProfileString(DSN,
                            INI_EXTRAOPTIONS,
@@ -1706,6 +1721,7 @@ CC_conninfo_init(ConnInfo *conninfo, UInt4 option)
    conninfo->lf_conversion = -1;
    conninfo->true_is_minus1 = -1;
    conninfo->int8_as = -101;
+   conninfo->numeric_as = DEFAULT_NUMERIC_AS;
    conninfo->bytea_as_longvarbinary = -1;
    conninfo->use_server_side_prepare = -1;
    conninfo->lower_case_identifier = -1;
@@ -1802,6 +1818,7 @@ CC_copy_conninfo(ConnInfo *ci, const ConnInfo *sci)
    CORR_VALCPY(lf_conversion);
    CORR_VALCPY(true_is_minus1);
    CORR_VALCPY(int8_as);
+   CORR_VALCPY(numeric_as);
    CORR_VALCPY(bytea_as_longvarbinary);
    CORR_VALCPY(use_server_side_prepare);
    CORR_VALCPY(lower_case_identifier);
index 9f779d944d0406c56c3ca0a4a85fc119c088ae0d..9676257014a5f25fefacba59f39da6eaac6cd2d0 100644 (file)
@@ -148,6 +148,7 @@ extern "C" {
 #define INI_TRUEISMINUS1       "TrueIsMinus1"
 #define ABBR_TRUEISMINUS1      "C6"
 #define INI_INT8AS         "BI"
+#define INI_NUMERIC_AS         "D6"
 #define INI_BYTEAASLONGVARBINARY   "ByteaAsLongVarBinary"
 #define ABBR_BYTEAASLONGVARBINARY  "C7"
 #define INI_USESERVERSIDEPREPARE   "UseServerSidePrepare"
@@ -260,6 +261,7 @@ extern "C" {
 #define DEFAULT_USESERVERSIDEPREPARE   1
 #define DEFAULT_LOWERCASEIDENTIFIER    0
 #define DEFAULT_SSLMODE            SSLMODE_DISABLE
+#define DEFAULT_NUMERIC_AS     (-101)
 
 #ifdef _HANDLE_ENLIST_IN_DTC_
 #define DEFAULT_XAOPT          1
index 7980f5ee23147665e66307b09d492a30edb66a46..f0a7f32d0b7035952ec784d6ac64f00fbfdfe992 100644 (file)
@@ -528,6 +528,18 @@ ds_options_update(HWND hdlg, ConnInfo *ci)
    else
        ci->int8_as = SQL_VARCHAR;
 
+   /* Numeric without precision As */
+   if (IsDlgButtonChecked(hdlg, DS_NUMERIC_AS_NUMERIC))
+       ci->numeric_as = SQL_NUMERIC;
+   else if (IsDlgButtonChecked(hdlg, DS_NUMERIC_AS_DOUBLE))
+       ci->numeric_as = SQL_DOUBLE;
+   else if (IsDlgButtonChecked(hdlg, DS_NUMERIC_AS_VARCHAR))
+       ci->numeric_as = SQL_VARCHAR;
+   else if (IsDlgButtonChecked(hdlg, DS_NUMERIC_AS_LONGVARCHAR))
+       ci->numeric_as = SQL_LONGVARCHAR;
+   else
+       ci->numeric_as = DEFAULT_NUMERIC_AS;
+
    GetDlgItemText(hdlg, DS_EXTRA_OPTIONS, buf, sizeof(buf));
    setExtraOptions(ci, buf, NULL);
    ITOA_FIXED(ci->show_system_tables, IsDlgButtonChecked(hdlg, DS_SHOWSYSTEMTABLES));
@@ -656,6 +668,24 @@ ds_options2Proc(HWND hdlg,
                default:
                    CheckDlgButton(hdlg, DS_INT8_AS_DEFAULT, 1);
            }
+           /* Numeric As */
+           switch (ci->numeric_as)
+           {
+               case SQL_NUMERIC:
+                   CheckDlgButton(hdlg, DS_NUMERIC_AS_NUMERIC, 1);
+                   break;
+               case SQL_VARCHAR:
+                   CheckDlgButton(hdlg, DS_NUMERIC_AS_VARCHAR, 1);
+                   break;
+               case SQL_DOUBLE:
+                   CheckDlgButton(hdlg, DS_NUMERIC_AS_DOUBLE, 1);
+                   break;
+               case SQL_LONGVARCHAR:
+                   CheckDlgButton(hdlg, DS_NUMERIC_AS_LONGVARCHAR, 1);
+                   break;
+               default:
+                   CheckDlgButton(hdlg, DS_NUMERIC_AS_DEFAULT, 1);
+           }
            SPRINTF_FIXED(buf, "0x%x", getExtraOptions(ci));
            SetDlgItemText(hdlg, DS_EXTRA_OPTIONS, buf);
 
index e2da0a704fddaf2f7d6b82160a953756a66785ae..5f49137ded57d142625f92e507b36f2f955808f2 100644 (file)
--- a/pgtypes.c
+++ b/pgtypes.c
@@ -387,11 +387,21 @@ static Int4   /* PostgreSQL restritiction */
 getNumericColumnSizeX(const ConnectionClass *conn, OID type, int atttypmod, int adtsize_or_longest, int handle_unknown_size_as)
 {
    Int4    default_column_size = 28;
+   const ConnInfo  *ci = &(conn->connInfo);
 
    MYLOG(0, "entering type=%d, typmod=%d\n", type, atttypmod);
 
    if (atttypmod > -1)
        return (atttypmod >> 16) & 0xffff;
+   switch (ci->numeric_as)
+   {
+       case SQL_VARCHAR:
+           return ci->drivers.max_varchar_size;
+       case SQL_LONGVARCHAR:
+           return ci->drivers.max_longvarchar_size;
+       case SQL_DOUBLE:
+           return PG_DOUBLE_DIGITS;
+   }
    switch (handle_unknown_size_as)
    {
        case UNKNOWNS_AS_DONTKNOW:
@@ -566,6 +576,8 @@ pgtype_attr_to_concise_type(const ConnectionClass *conn, OID type, int atttypmod
            return SQL_BIGINT;
 
        case PG_TYPE_NUMERIC:
+           if (-1 == atttypmod && DEFAULT_NUMERIC_AS != ci->numeric_as)
+               return ci->numeric_as;
            return SQL_NUMERIC;
 
        case PG_TYPE_FLOAT4:
index fa9c1c4d860c5c924a5313051fb936e8a808ff06..fad41e00606a5f6573bf81f8963a879c735b75f0 100644 (file)
@@ -637,6 +637,7 @@ typedef struct
    signed char ignore_round_trip_time;
    signed char disable_keepalive;
    signed char wcs_debug;
+   signed char numeric_as;
    UInt4       extra_opts;
    Int4        keepalive_idle;
    Int4        keepalive_interval;
index 7433a3b6c446ab07b76e81e86f2c9fc7612fe49c..e81d62229439d07ebfdcf2182253319e60bcb00b 100644 (file)
@@ -175,13 +175,24 @@ BEGIN
                     WS_TABSTOP,227,108,29,10
     LTEXT           "\93Á\95Ê\82È\83I\83v\83V\83\87\83\93",IDC_STATIC,227,158,66,8
     EDITTEXT        DS_EXTRA_OPTIONS,227,168,35,14,ES_AUTOHSCROLL
-    GROUPBOX        "\83G\83\89\81[\8e\9e\82Ì\83\8d\81[\83\8b\83o\83b\83N\94­\8ds",IDC_STATIC,160,128,130,25
+    GROUPBOX        "Numeric(\90¸\93x\8ew\92è\82È\82µ) \82Ì\91ã\91Ö\92è\8b`",IDC_STATIC,5,128,160,25
+    CONTROL         "default",DS_NUMERIC_AS_DEFAULT,"Button",BS_AUTORADIOBUTTON | 
+                    WS_GROUP,12,140,40,10
+//    CONTROL         "numeric",DS_NUMERIC_AS_NUMERIC,"Button",BS_AUTORADIOBUTTON | 
+//                    WS_TABSTOP,50,140,40,10
+    CONTROL         "memo",DS_NUMERIC_AS_LONGVARCHAR,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,126,140,40,10
+    CONTROL         "varchar",DS_NUMERIC_AS_VARCHAR,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,50,140,40,10
+    CONTROL         "double",DS_NUMERIC_AS_DOUBLE,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,90,140,36,10
+    GROUPBOX        "\83G\83\89\81[\8e\9e\82Ì\83\8d\81[\83\8b\83o\83b\83N\94­\8ds",IDC_STATIC,170,128,130,25
     CONTROL         "\96³\82µ",DS_NO_ROLLBACK,"Button",BS_AUTORADIOBUTTON | 
-                    WS_GROUP,165,139,30,10
+                    WS_GROUP,175,139,30,10
     CONTROL         "\91S·¬Ý¾Ù",DS_TRANSACTION_ROLLBACK,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,195,140,50,10
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,205,140,50,10
     CONTROL         "\95\92P\88Ê",DS_STATEMENT_ROLLBACK,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,250,140,35,10
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,260,140,35,10
     GROUPBOX        "OID \83I\83v\83V\83\87\83\93",IDC_STATIC,5,158,206,25
     CONTROL         "\83J\83\89\83\80\97ñ\95\\8e¦(&C)",DS_SHOWOIDCOLUMN,"Button",
                     BS_AUTOCHECKBOX | WS_GROUP,16,169,72,10
@@ -625,6 +636,17 @@ BEGIN
                     WS_TABSTOP,227,107,29,10
     LTEXT     "Extra Opts",IDC_STATIC,264,98,40,17
     EDITTEXT       DS_EXTRA_OPTIONS,264,105,40,12,ES_AUTOHSCROLL
+    GROUPBOX        "Numeric(without precision) As",IDC_STATIC,5,126,160,25
+    CONTROL         "default",DS_NUMERIC_AS_DEFAULT,"Button",BS_AUTORADIOBUTTON | 
+                    WS_GROUP,12,138,40,10
+//    CONTROL         "numeric",DS_NUMERIC_AS_NUMERIC,"Button",BS_AUTORADIOBUTTON | 
+//                    WS_TABSTOP,50,138,40,10
+    CONTROL         "memo",DS_NUMERIC_AS_LONGVARCHAR,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,126,138,40,10
+    CONTROL         "varchar",DS_NUMERIC_AS_VARCHAR,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,50,138,40,10
+    CONTROL         "double",DS_NUMERIC_AS_DOUBLE,"Button",BS_AUTORADIOBUTTON | 
+                    WS_TABSTOP,90,138,36,10
     GROUPBOX        "OID Options",IDC_STATIC,5,157,296,25
     CONTROL         "Show &Column",DS_SHOWOIDCOLUMN,"Button",BS_AUTOCHECKBOX | 
                     WS_GROUP | WS_TABSTOP,13,168,67,10
@@ -642,13 +664,13 @@ BEGIN
     DEFPUSHBUTTON   "OK",IDOK,5,ENDLINE_Y,50,14,WS_GROUP
     PUSHBUTTON      "Cancel",IDCANCEL,81,ENDLINE_Y,50,14
     PUSHBUTTON      "Apply",IDAPPLY,156,ENDLINE_Y,50,14
-    GROUPBOX        "Level of rollback on errors",IDC_STATIC,147,126,154,25
+    GROUPBOX        "Level of rollback on errors",IDC_STATIC,172,126,134,25
     CONTROL         "Nop",DS_NO_ROLLBACK,"Button",BS_AUTORADIOBUTTON | 
-                    WS_GROUP,151,138,36,9
+                    WS_GROUP,176,138,36,9
     CONTROL         "Transaction",DS_TRANSACTION_ROLLBACK,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,186,138,57,9
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,206,138,57,9
     CONTROL         "Statement",DS_STATEMENT_ROLLBACK,"Button",
-                    BS_AUTORADIOBUTTON | WS_TABSTOP,247,138,47,9
+                    BS_AUTORADIOBUTTON | WS_TABSTOP,257,138,47,9
 END
 
 #undef DTC_GRP_X
index fb3e9a64542cb564b5e702c8f178410087f84e34..f3435248f5588c6890e90312a69102748c10a05c 100644 (file)
 #define DS_LIBPQOPT            1104
 #define DS_COMMLOG         1105
 #define DS_DEBUG           1106
+#define DS_NUMERIC_AS_DEFAULT      1107
+#define DS_NUMERIC_AS_NUMERIC      1108
+#define DS_NUMERIC_AS_VARCHAR      1109
+#define DS_NUMERIC_AS_DOUBLE       1110
+#define DS_NUMERIC_AS_LONGVARCHAR  1111
 
 // Next default values for new objects
 //
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        106
 #define _APS_NEXT_COMMAND_VALUE         40001
-#define _APS_NEXT_CONTROL_VALUE         1107
+#define _APS_NEXT_CONTROL_VALUE         1112
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif