Changeset: 11ce4397edec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/11ce4397edec
Modified Files:
        clients/odbc/driver/ODBCQueries.h
        clients/odbc/driver/SQLSpecialColumns.c
        clients/odbc/tests/ODBCmetadata.c
Branch: default
Log Message:

Correcting datatypes for result columns BUFFER_LENGTH and DECIMAL_DIGITS as 
returned by SQLColumns(), SQLSpecialColumns() and SQLProcedureColumns(). They 
must be INTEGER and SMALLINT instead of BIGINT and BIGINT.


diffs (188 lines):

diff --git a/clients/odbc/driver/ODBCQueries.h 
b/clients/odbc/driver/ODBCQueries.h
--- a/clients/odbc/driver/ODBCQueries.h
+++ b/clients/odbc/driver/ODBCQueries.h
@@ -136,7 +136,7 @@
                     "else " #t ".type_digits "                 \
                "end as \"COLUMN_SIZE\""
 
-#define BUFFER_LENGTH(t) "case " #t ".type "                           \
+#define BUFFER_LENGTH(t) "cast(case " #t ".type "                              
\
                     "when 'bigint' then 20 "                                   
        \
                     "when 'char' then 2 * " #t ".type_digits "         \
                     "when 'clob' then 2 * " #t ".type_digits "         \
@@ -173,9 +173,9 @@
                     "when 'tinyint' then 4 "                                   
        \
                     "when 'varchar' then 2 * " #t ".type_digits "      \
                     "else " #t ".type_digits "                                 
        \
-               "end as \"BUFFER_LENGTH\""
+               "end as integer) as \"BUFFER_LENGTH\""
 
-#define DECIMAL_DIGITS(t) "case " #t ".type "                                  
                \
+#define DECIMAL_DIGITS(t) "cast(case " #t ".type "                             
                        \
                     "when 'bigint' then 0 "                                    
                                \
                     "when 'day_interval' then 0 "                              
                                \
                     "when 'decimal' then " #t ".type_scale "                   
                \
@@ -198,7 +198,7 @@
                     "when 'timetz' then " #t ".type_digits - 1 "               
                \
                     "when 'tinyint' then 0 "                                   
                                \
                     "else cast(null as smallint) "                             
                                \
-               "end as \"DECIMAL_DIGITS\""
+               "end as smallint) as \"DECIMAL_DIGITS\""
 
 #define NUM_PREC_RADIX(t) "case " #t ".type "                                  
                \
                     "when 'bigint' then 2 "                                    
                                \
diff --git a/clients/odbc/driver/SQLSpecialColumns.c 
b/clients/odbc/driver/SQLSpecialColumns.c
--- a/clients/odbc/driver/SQLSpecialColumns.c
+++ b/clients/odbc/driver/SQLSpecialColumns.c
@@ -424,7 +424,7 @@ MNDBSpecialColumns(ODBCStmt *stmt,
                assert(IdentifierType == SQL_ROWVER);
                /* The backend does not have such info available */
                /* create just a query which results in zero rows */
-               /* Note: pseudo_column is sql_pc_unknown is 0 */
+               /* Note: PSEUDO_COLUMN is SQL_PC_UNKNOWN is 0 */
                query = strdup("select cast(null as smallint) as \"SCOPE\", "
                                      "cast('' as varchar(1)) as 
\"COLUMN_NAME\", "
                                      "cast(1 as smallint) as \"DATA_TYPE\", "
diff --git a/clients/odbc/tests/ODBCmetadata.c 
b/clients/odbc/tests/ODBCmetadata.c
--- a/clients/odbc/tests/ODBCmetadata.c
+++ b/clients/odbc/tests/ODBCmetadata.c
@@ -492,7 +492,7 @@ main(int argc, char **argv)
                "Resultset with 18 columns\n"
                "Resultset with 7 rows\n"
                "TABLE_CAT      TABLE_SCHEM     TABLE_NAME      COLUMN_NAME     
DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  
NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      SQL_DATA_TYPE   
SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       ORDINAL_POSITION        
IS_NULLABLE\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
                "NULL   odbctst nopk_twoucs     id2     4       INTEGER 32      
11      0       2       0       odbctst.nopk_twoucs.id2 column comment  NULL    
4       NULL    NULL    1       NO\n"
                "NULL   odbctst nopk_twoucs     name2   -9      VARCHAR 99      
198     NULL    NULL    1       odbctst.nopk_twoucs.name2 column comment        
NULL    -9      NULL    198     2       YES\n"
                "NULL   odbctst pk2c    pkc1    4       INTEGER 32      11      
0       2       0       NULL    NULL    4       NULL    NULL    1       NO\n"
@@ -509,7 +509,7 @@ main(int argc, char **argv)
                "Resultset with 18 columns\n"
                "Resultset with 8 rows\n"
                "TABLE_CAT      TABLE_SCHEM     TABLE_NAME      COLUMN_NAME     
DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  
NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      SQL_DATA_TYPE   
SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       ORDINAL_POSITION        
IS_NULLABLE\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
                "NULL   tmp     glbl_nopk_twoucs        id2     4       INTEGER 
32      11      0       2       0       NULL    NULL    4       NULL    NULL    
1       NO\n"
                "NULL   tmp     glbl_nopk_twoucs        name2   -9      VARCHAR 
99      198     NULL    NULL    1       NULL    NULL    -9      NULL    198     
2       YES\n"
                "NULL   tmp     glbl_pk_uc      id1     4       INTEGER 32      
11      0       2       0       NULL    NULL    4       NULL    NULL    1       
NO\n"
@@ -527,12 +527,21 @@ main(int argc, char **argv)
                "Resultset with 18 columns\n"
                "Resultset with 4 rows\n"
                "TABLE_CAT      TABLE_SCHEM     TABLE_NAME      COLUMN_NAME     
DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  
NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      SQL_DATA_TYPE   
SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       ORDINAL_POSITION        
IS_NULLABLE\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(1024)  WVARCHAR(1024)  
SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(2048)  SMALLINT        SMALLINT        
BIGINT  INTEGER WVARCHAR(3)\n"
                "NULL   tmp     glbl_nopk_twoucs        name2   -9      VARCHAR 
99      198     NULL    NULL    1       NULL    NULL    -9      NULL    198     
2       YES\n"
                "NULL   tmp     glbl_pk_uc      name1   -9      VARCHAR 99      
198     NULL    NULL    1       NULL    NULL    -9      NULL    198     2       
YES\n"
                "NULL   tmp     tmp_nopk_twoucs name2   -9      VARCHAR 99      
198     NULL    NULL    1       NULL    NULL    -9      NULL    198     2       
YES\n"
                "NULL   tmp     tmp_pk_uc       name1   -9      VARCHAR 99      
198     NULL    NULL    1       NULL    NULL    -9      NULL    198     2       
YES\n");
 
+       ret = SQLSpecialColumns(stmt, SQL_ROWVER, (SQLCHAR*)NULL, 0,
+                       (SQLCHAR*)"%", SQL_NTS, (SQLCHAR*)"%", SQL_NTS,
+                       SQL_SCOPE_SESSION, SQL_NO_NULLS);
+       compareResult(stmt, ret, "SQLSpecialColumns (%, %, SQL_ROWVER)",
+               "Resultset with 8 columns\n"
+               "Resultset with 0 rows\n"
+               "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
+               "SMALLINT       WVARCHAR(1)     SMALLINT        WVARCHAR(4)     
INTEGER INTEGER SMALLINT        SMALLINT\n");
+
        // sys.table_types
        ret = SQLPrimaryKeys(stmt, (SQLCHAR*)"", SQL_NTS,
                        (SQLCHAR*)"sys", SQL_NTS, (SQLCHAR*)"table_types", 
SQL_NTS);
@@ -550,7 +559,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      table_type_id   5       SMALLINT        16      6       
0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -609,7 +618,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id1     4       INTEGER 32      11      0       1\n");
 
        ret = SQLSpecialColumns(stmt, SQL_ROWVER, (SQLCHAR*)"", SQL_NTS,
@@ -683,7 +692,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id1     4       INTEGER 32      11      0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -749,7 +758,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id1     4       INTEGER 32      11      0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -814,7 +823,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id2     4       INTEGER 32      11      0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -877,7 +886,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id2     4       INTEGER 32      11      0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -942,7 +951,7 @@ main(int argc, char **argv)
                "Resultset with 8 columns\n"
                "Resultset with 1 rows\n"
                "SCOPE  COLUMN_NAME     DATA_TYPE       TYPE_NAME       
COLUMN_SIZE     BUFFER_LENGTH   DECIMAL_DIGITS  PSEUDO_COLUMN\n"
-               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER BIGINT  BIGINT  SMALLINT\n"
+               "SMALLINT       WVARCHAR(1024)  SMALLINT        WCHAR(25)       
INTEGER INTEGER SMALLINT        SMALLINT\n"
                "1      id2     4       INTEGER 32      11      0       1\n");
 
        ret = SQLStatistics(stmt, (SQLCHAR*)"", SQL_NTS,
@@ -1107,7 +1116,7 @@ main(int argc, char **argv)
                "Resultset with 20 columns\n"
                "Resultset with 6 rows\n"
                "PROCEDURE_CAT  PROCEDURE_SCHEM PROCEDURE_NAME  COLUMN_NAME     
COLUMN_TYPE     DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   
DECIMAL_DIGITS  NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      
SQL_DATA_TYPE   SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       
ORDINAL_POSITION        IS_NULLABLE     SPECIFIC_NAME\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        SMALLINT        
BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        
SMALLINT        SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        
SMALLINT        BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
                "NULL   sys     analyze sname   1       -9      VARCHAR 1024    
2048    NULL    NULL    2       NULL    NULL    -9      NULL    2048    1       
        replacedId\n"
                "NULL   sys     analyze sname   1       -9      VARCHAR 1024    
2048    NULL    NULL    2       NULL    NULL    -9      NULL    2048    1       
        replacedId\n"
                "NULL   sys     analyze tname   1       -9      VARCHAR 1024    
2048    NULL    NULL    2       NULL    NULL    -9      NULL    2048    2       
        replacedId\n"
@@ -1133,7 +1142,7 @@ main(int argc, char **argv)
                "Resultset with 20 columns\n"
                "Resultset with 4 rows\n"
                "PROCEDURE_CAT  PROCEDURE_SCHEM PROCEDURE_NAME  COLUMN_NAME     
COLUMN_TYPE     DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   
DECIMAL_DIGITS  NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      
SQL_DATA_TYPE   SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       
ORDINAL_POSITION        IS_NULLABLE     SPECIFIC_NAME\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        SMALLINT        
BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        
SMALLINT        SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        
SMALLINT        BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
                "NULL   sys     sin     arg_1   1       7       REAL    24      
14      7       2       2       NULL    NULL    7       NULL    NULL    1       
        replacedId\n"
                "NULL   sys     sin     res_0   5       7       REAL    24      
14      7       2       2       NULL    NULL    7       NULL    NULL    0       
        replacedId\n"
                "NULL   sys     sin     arg_1   1       8       DOUBLE  53      
24      15      2       2       NULL    NULL    8       NULL    NULL    1       
        replacedId\n"
@@ -1156,7 +1165,7 @@ main(int argc, char **argv)
                "Resultset with 20 columns\n"
                "Resultset with 2 rows\n"
                "PROCEDURE_CAT  PROCEDURE_SCHEM PROCEDURE_NAME  COLUMN_NAME     
COLUMN_TYPE     DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   
DECIMAL_DIGITS  NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      
SQL_DATA_TYPE   SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       
ORDINAL_POSITION        IS_NULLABLE     SPECIFIC_NAME\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        SMALLINT        
BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        
SMALLINT        SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        
SMALLINT        BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
                "NULL   sys     env     name    3       -9      VARCHAR 1024    
2048    NULL    NULL    2       NULL    NULL    -9      NULL    2048    1       
        replacedId\n"
                "NULL   sys     env     value   3       -9      VARCHAR 2048    
4096    NULL    NULL    2       NULL    NULL    -9      NULL    4096    2       
        replacedId\n");
 
@@ -1180,7 +1189,7 @@ main(int argc, char **argv)
                "Resultset with 20 columns\n"
                "Resultset with 58 rows\n"
                "PROCEDURE_CAT  PROCEDURE_SCHEM PROCEDURE_NAME  COLUMN_NAME     
COLUMN_TYPE     DATA_TYPE       TYPE_NAME       COLUMN_SIZE     BUFFER_LENGTH   
DECIMAL_DIGITS  NUM_PREC_RADIX  NULLABLE        REMARKS COLUMN_DEF      
SQL_DATA_TYPE   SQL_DATETIME_SUB        CHAR_OCTET_LENGTH       
ORDINAL_POSITION        IS_NULLABLE     SPECIFIC_NAME\n"
-               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER BIGINT  BIGINT  SMALLINT        
SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        SMALLINT        
BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
+               "WVARCHAR(1)    WVARCHAR(1024)  WVARCHAR(256)   WVARCHAR(256)   
TINYINT SMALLINT        WCHAR(25)       INTEGER INTEGER SMALLINT        
SMALLINT        SMALLINT        WVARCHAR(65000) WVARCHAR(1)     SMALLINT        
SMALLINT        BIGINT  BIGINT  WCHAR   WVARCHAR(10)\n"
                // 0 input argument and 13 result columns of sys.statistics()
                "NULL   sys     statistics      column_id       3       4       
INTEGER 32      11      0       2       2       NULL    NULL    4       NULL    
NULL    1               replacedId\n"
                "NULL   sys     statistics      schema  3       -9      VARCHAR 
1024    2048    NULL    NULL    2       NULL    NULL    -9      NULL    2048    
2               replacedId\n"
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to