[PATCH] oledb32: Support VT_NULL on all conversions (resend)

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Mon Oct 26 03:56:17 CDT 2015


This replaces my previous patches for VT_NULL.

I've moved the VT_NULL check to the top of the DataConvert function
since every type, except VARIANT, doesnt touch the dst_len parameter.

Remove all places that checked for VT_NULL.
Added tests for any DBTYPE that didn't already have a test for VT_NULL.
Corrected any test that didn't set dst_len before calling DataConvert.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/oledb32/convert.c       |  79 +++++++++----------
 dlls/oledb32/tests/convert.c | 177 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 208 insertions(+), 48 deletions(-)

diff --git a/dlls/oledb32/convert.c b/dlls/oledb32/convert.c
index 11d153c..72714d3 100644
--- a/dlls/oledb32/convert.c
+++ b/dlls/oledb32/convert.c
@@ -183,6 +183,15 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
         return S_OK;
     }
 
+    if(src_type == DBTYPE_VARIANT && V_VT((VARIANT*)src) == VT_NULL)
+    {
+        if(dst_type == DBTYPE_VARIANT)
+            *dst_len = sizeof(VARIANT);
+
+        *dst_status = DBSTATUS_S_ISNULL;
+        return S_OK;
+    }
+
     if(IDataConvert_CanConvert(iface, src_type, dst_type) != S_OK)
     {
         return DB_E_UNSUPPORTEDCONVERSION;
@@ -631,18 +640,9 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
         }
         break;
         case DBTYPE_VARIANT:
-            if(V_VT((VARIANT*)src) == VT_NULL)
-            {
-                *dst_status = DBSTATUS_S_ISNULL;
-                *dst_len = get_length(DBTYPE_BSTR);
-                return S_OK;
-            }
-            else
-            {
-                VariantInit(&tmp);
-                if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
-                    *d = V_BSTR(&tmp);
-            }
+            VariantInit(&tmp);
+            if ((hr = VariantChangeType(&tmp, (VARIANT*)src, 0, VT_BSTR)) == S_OK)
+                *d = V_BSTR(&tmp);
             break;
         default: FIXME("Unimplemented conversion %04x -> BSTR\n", src_type); return E_NOTIMPL;
         }
@@ -1000,44 +1000,35 @@ static HRESULT WINAPI convert_DataConvert(IDataConvert* iface,
             return S_OK;
         case DBTYPE_VARIANT:
         {
-            if(V_VT((VARIANT*)src) == VT_NULL)
+            switch(V_VT((VARIANT*)src))
             {
-                *dst_status = DBSTATUS_S_ISNULL;
-                *dst_len = 0;
-                return S_OK;
-            }
-            else
+            case VT_UI1 | VT_ARRAY:
             {
-                switch(V_VT((VARIANT*)src))
-                {
-                case VT_UI1 | VT_ARRAY:
-                {
-                    LONG l;
-                    BYTE *data = NULL;
+                LONG l;
+                BYTE *data = NULL;
 
-                    hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l);
-                    if(FAILED(hr))
-                        return hr;
+                hr = SafeArrayGetUBound(V_ARRAY((VARIANT*)src), 1, &l);
+                if(FAILED(hr))
+                    return hr;
 
-                    hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data);
-                    if(FAILED(hr))
-                    {
-                        ERR("SafeArrayAccessData Failed = 0x%08x\n", hr);
-                        return hr;
-                    }
+                hr = SafeArrayAccessData(V_ARRAY((VARIANT*)src), (VOID**)&data);
+                if(FAILED(hr))
+                {
+                    ERR("SafeArrayAccessData Failed = 0x%08x\n", hr);
+                    return hr;
+                }
 
-                    *dst_len = l+1;
-                    *dst_status = DBSTATUS_S_OK;
-                    memcpy(d, data, *dst_len);
+                *dst_len = l+1;
+                *dst_status = DBSTATUS_S_OK;
+                memcpy(d, data, *dst_len);
 
-                    SafeArrayUnaccessData(V_ARRAY((VARIANT*)src));
-                    return S_OK;
-                }
-                break;
-                default:
-                    FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src));
-                    return E_NOTIMPL;
-                }
+                SafeArrayUnaccessData(V_ARRAY((VARIANT*)src));
+                return S_OK;
+            }
+            break;
+            default:
+                FIXME("Unimplemented variant type %d -> BYTES\n", V_VT((VARIANT*)src));
+                return E_NOTIMPL;
             }
         }
         break;
diff --git a/dlls/oledb32/tests/convert.c b/dlls/oledb32/tests/convert.c
index f679b5c..adeceec 100644
--- a/dlls/oledb32/tests/convert.c
+++ b/dlls/oledb32/tests/convert.c
@@ -455,6 +455,13 @@ todo_wine
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst == 0x4321, "got %08x\n", dst);
 
+    V_VT((VARIANT*)src) = VT_NULL;
+    dst_len = 0x1234;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 0x1234, "got %ld\n", dst_len);
+
     dst_len = dst = 0x1234;
     memset(src, 0, sizeof(DECIMAL));
     ((DECIMAL*)src)->u1.Lo64 = 0x4321;
@@ -764,6 +771,13 @@ static void test_converttoi4(void)
     ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
     ok(i4 == 0x1234, "got %08x\n", i4);
 
+    V_VT((VARIANT*)src) = VT_NULL;
+    dst_len = 0x1234;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 0x1234, "got %ld\n", dst_len);
+
     i4 = 0x12345678;
     memset(src, 0, sizeof(DECIMAL));
     ((DECIMAL*)src)->u1.Lo64 = 0x1234;
@@ -924,6 +938,13 @@ static void test_converttoi8(void)
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst.QuadPart == 10, "got %d\n", (int)dst.QuadPart);
     SysFreeString(b);
+
+    V_VT((VARIANT*)src) = VT_NULL;
+    dst_len = 0x1234;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 0x1234, "got %ld\n", dst_len);
 }
 
 static void test_converttobstr(void)
@@ -989,10 +1010,11 @@ static void test_converttobstr(void)
 
     V_VT(&v) = VT_NULL;
     dst = (void*)0x1234;
+    dst_len = 33;
     hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
-    ok(dst_len == sizeof(BSTR), "got %ld\n", dst_len);
+    ok(dst_len == 33, "got %ld\n", dst_len);
     ok(dst == (void*)0x1234, "got %p\n", dst);
 }
 
@@ -1013,6 +1035,8 @@ static void test_converttowstr(void)
     BSTR b;
     VARIANT v;
 
+    VariantInit(&v);
+
     memset(dst, 0xcc, sizeof(dst));
     dst_len = 0x1234;
     hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
@@ -1476,11 +1500,12 @@ static void test_converttowstr(void)
     ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
     VariantClear(&v);
 
+    dst_len = 44;
     V_VT(&v) = VT_NULL;
     hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
-    ok(dst_len == 0, "got %ld\n", dst_len);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttostr(void)
@@ -1497,6 +1522,7 @@ static void test_converttostr(void)
     static const char hexunpacked_a[] = "57696E6500";
     static const char hexpacked_a[] = "Wine";
     BSTR b;
+    VARIANT v;
 
     memset(dst, 0xcc, sizeof(dst));
     dst_len = 0x1234;
@@ -1974,6 +2000,13 @@ static void test_converttostr(void)
     ok(dst_len == 0, "got %ld\n", dst_len);
     ok(dst[0] == 0, "not null terminated\n");
     ok(dst[1] == (char)0xcc, "clobbered buffer\n");
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_STR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttobyrefwstr(void)
@@ -1986,6 +2019,9 @@ static void test_converttobyrefwstr(void)
     static const WCHAR ten[] = {'1','0',0};
     static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
     BSTR b;
+    VARIANT v;
+
+    VariantInit(&v);
 
     hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
@@ -2058,6 +2094,13 @@ static void test_converttobyrefwstr(void)
     ok(dst_len == 4, "got %ld\n", dst_len);
     ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
     CoTaskMemFree(dst);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttoguid(void)
@@ -2067,6 +2110,9 @@ static void test_converttoguid(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst = IID_IDCInfo;
     dst_len = 0x1234;
@@ -2092,6 +2138,13 @@ static void test_converttoguid(void)
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
     ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttofiletime(void)
@@ -2101,6 +2154,9 @@ static void test_converttofiletime(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     memset(&dst, 0xcc, sizeof(dst));
     ((FILETIME *)src)->dwLowDateTime = 0x12345678;
@@ -2117,6 +2173,13 @@ static void test_converttofiletime(void)
         ok(dst.dwLowDateTime == 0x12345678, "got %08x\n", dst.dwLowDateTime);
         ok(dst.dwHighDateTime == 0x9abcdef0, "got %08x\n", dst.dwHighDateTime);
     }
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_FILETIME, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttoui1(void)
@@ -2126,6 +2189,9 @@ static void test_converttoui1(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst = 0x12;
     dst_len = 0x1234;
@@ -2160,6 +2226,13 @@ static void test_converttoui1(void)
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst == 0xfe, "got %08x\n", dst);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI1, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttoui4(void)
@@ -2223,6 +2296,13 @@ todo_wine
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst == 0x4321, "got %08x\n", dst);
+
+    dst_len = 44;
+    V_VT((VARIANT*)src) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttor4(void)
@@ -2232,6 +2312,9 @@ static void test_converttor4(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst = 1.0;
     dst_len = 0x1234;
@@ -2266,6 +2349,13 @@ static void test_converttor4(void)
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst == 10.0, "got %f\n", dst);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttor8(void)
@@ -2319,6 +2409,13 @@ static void test_converttor8(void)
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst == 0x4321, "got %f\n", dst);
+
+    dst_len = 44;
+    V_VT(&var) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttocy(void)
@@ -2328,6 +2425,9 @@ static void test_converttocy(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst.int64 = 0xcc;
     dst_len = 0x1234;
@@ -2362,6 +2462,13 @@ static void test_converttocy(void)
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
     ok(dst.int64 == 1234, "got %d\n", dst.s.Lo);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_CY, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttoui8(void)
@@ -2371,6 +2478,9 @@ static void test_converttoui8(void)
     BYTE src[20];
     DBSTATUS dst_status;
     DBLENGTH dst_len;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst.QuadPart = 0xcc;
     dst_len = 0x1234;
@@ -2416,6 +2526,13 @@ todo_wine
     ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_getconversionsize(void)
@@ -2567,11 +2684,11 @@ static void test_converttobytes(void)
     ok(!memcmp(byte_src, dst, 2 ), "bytes differ\n");
 
     V_VT(&v) = VT_NULL;
-    dst_len = 0;
+    dst_len = 77;
     hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, sizeof(v), &dst_len, &v, &dst, 2, 0, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
-    ok(dst_len == 0, "got %ld\n", dst_len);
+    ok(dst_len == 77, "got %ld\n", dst_len);
 
     dst_len = 0;
     rgsabound[0].lLbound = 0;
@@ -2586,6 +2703,13 @@ static void test_converttobytes(void)
     ok(!memcmp(byte_dst, dst, dst_len), "bytes differ\n");
     VariantClear(&v);
 
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
+
 }
 
 static void test_converttobytesbyref(void)
@@ -2595,6 +2719,9 @@ static void test_converttobytesbyref(void)
     BYTE byte_src[] = {0, 1, 2, 4, 5};
     BYTE *dst;
     DBSTATUS dst_status;
+    VARIANT v;
+
+    VariantInit(&v);
 
     dst_len = 0;
     hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_BYTES | DBTYPE_BYREF, sizeof(byte_src), &dst_len, byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
@@ -2603,6 +2730,13 @@ static void test_converttobytesbyref(void)
     ok(dst_len == sizeof(byte_src), "got %ld\n", dst_len);
     ok(!memcmp(byte_src, dst, dst_len ), "bytes differ\n");
     CoTaskMemFree(dst);
+
+    dst_len = 44;
+    V_VT(&v) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES | DBTYPE_BYREF, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 static void test_converttodbdate(void)
@@ -2641,6 +2775,13 @@ static void test_converttodbdate(void)
     ok(dst_len == sizeof(DBDATE), "got %ld\n", dst_len);
     ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
     SysFreeString(bstr);
+
+    V_VT(&var) = VT_NULL;
+    dst_len = 88;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 88, "got %ld\n", dst_len);
 }
 
 
@@ -2662,6 +2803,9 @@ static void test_converttovar(void)
     LARGE_INTEGER i8;
     VARIANT_BOOL boolean = VARIANT_TRUE;
     FLOAT fvalue = 543.21f;
+    VARIANT var;
+
+    VariantInit(&var);
 
     V_VT(&dst) = VT_EMPTY;
     dst_len = 0;
@@ -2837,11 +2981,19 @@ static void test_converttovar(void)
 
     /* src_status = DBSTATUS_S_ISNULL */
     i4 = 123;
+    dst_len = 99;
     hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_VARIANT, sizeof(i4), &dst_len, &i4, &dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
     ok(dst_len == 0, "got %ld\n", dst_len);
 
+    dst_len = 44;
+    V_VT(&var) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_VARIANT, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 16, "got %ld\n", dst_len);
+
 }
 
 static void test_converttotimestamp(void)
@@ -2873,6 +3025,13 @@ static void test_converttotimestamp(void)
     ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
     ok(!memcmp(&ts, &dst, sizeof(ts)), "Wrong timestamp\n");
     SysFreeString(bstr);
+
+    V_VT(&var) = VT_NULL;
+    dst_len = 77;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBTIMESTAMP, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 77, "got %ld\n", dst_len);
 }
 
 static void test_converttoiunknown(void)
@@ -2882,12 +3041,22 @@ static void test_converttoiunknown(void)
     DBLENGTH dst_len;
     IUnknown *dst = NULL;
     static WCHAR strW[] = {'t','e','s','t',0};
+    VARIANT var;
+
+    VariantInit(&var);
 
     dst_len = 0x1234;
     hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_IUNKNOWN, sizeof(strW), &dst_len, strW, dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
     ok(hr == S_OK, "got %08x\n", hr);
     ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
     ok(dst_len == 0, "got %ld\n", dst_len);
+
+    dst_len = 44;
+    V_VT(&var) = VT_NULL;
+    hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_IUNKNOWN, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
+    ok(hr == S_OK, "got %08x\n", hr);
+    ok(dst_status == DBSTATUS_S_ISNULL, "got %08x\n", dst_status);
+    ok(dst_len == 44, "got %ld\n", dst_len);
 }
 
 START_TEST(convert)
-- 
1.9.1




More information about the wine-patches mailing list