The R Project SVN R-packages

Rev

Rev 3358 | Rev 3419 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3358 Rev 3397
1
#include "sqlite_dataframe.h"
1
#include "sqlite_dataframe.h"
2
#include <math.h>
2
#include <math.h>
3
#include "Rmath.h"
3
#include "Rmath.h"
4
 
4
 
5
/****************************************************************************
5
/****************************************************************************
6
 * UTILITY FUNCTIONS
6
 * UTILITY FUNCTIONS
7
 ****************************************************************************/
7
 ****************************************************************************/
8
static char *_create_svector1(SEXP name, const char *type, int * _namelen) {
8
static char *_create_svector1(SEXP name, const char *type, int * _namelen) {
9
    int namelen, res;
9
    int namelen, res;
10
    char *iname = _create_sdf_skeleton1(name, &namelen);
10
    char *iname = _create_sdf_skeleton1(name, &namelen);
11
 
11
 
12
    if (iname == NULL) return NULL;
12
    if (iname == NULL) return NULL;
13
 
13
 
14
    sprintf(g_sql_buf[2], "create table [%s].sdf_data ([row name] text, "
14
    sprintf(g_sql_buf[2], "create table [%s].sdf_data ([row name] text, "
15
            "V1 %s, primary key ([row name]))", iname, type);
15
            "V1 %s, primary key ([row name]))", iname, type);
16
    res = _sqlite_exec(g_sql_buf[2]);
16
    res = _sqlite_exec(g_sql_buf[2]);
17
    _sqlite_error(res);
17
    _sqlite_error(res);
18
 
18
 
19
    if (_namelen != NULL) *_namelen = namelen;
19
    if (_namelen != NULL) *_namelen = namelen;
20
    return iname;
20
    return iname;
21
}
21
}
22
 
22
 
23
static SEXP _create_svector_sexp(const char *iname, const char *varname, 
23
static SEXP _create_svector_sexp(const char *iname, const char *varname, 
24
        const char *type) {
24
        const char *type) {
25
    SEXP ret, value; int nprotected = 0;
25
    SEXP ret, value; int nprotected = 0;
26
    PROTECT(ret = NEW_LIST(2)); nprotected++;
26
    PROTECT(ret = NEW_LIST(2)); nprotected++;
27
 
27
 
28
    /* set list names */
28
    /* set list names */
29
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
29
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
30
    SET_STRING_ELT(value, 0, mkChar("iname"));
30
    SET_STRING_ELT(value, 0, mkChar("iname"));
31
    SET_STRING_ELT(value, 1, mkChar("varname"));
31
    SET_STRING_ELT(value, 1, mkChar("varname"));
32
    SET_NAMES(ret, value);
32
    SET_NAMES(ret, value);
33
 
33
 
34
    /* set list values */
34
    /* set list values */
35
    SET_VECTOR_ELT(ret, 0, mkString(iname));
35
    SET_VECTOR_ELT(ret, 0, mkString(iname));
36
    SET_VECTOR_ELT(ret, 1, mkString(varname));
36
    SET_VECTOR_ELT(ret, 1, mkString(varname));
37
 
37
 
38
    /* set sexp class */
38
    /* set sexp class */
39
    if (strcmp(type, "ordered") == 0) {
39
    if (strcmp(type, "ordered") == 0) {
40
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
40
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
41
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
41
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
42
        SET_VECTOR_ELT(value, 1, mkChar(type));
42
        SET_VECTOR_ELT(value, 1, mkChar(type));
43
        SET_VECTOR_ELT(value, 2, mkChar("factor"));
43
        SET_VECTOR_ELT(value, 2, mkChar("factor"));
44
    } else {
44
    } else {
45
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
45
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
46
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
46
        SET_VECTOR_ELT(value, 0, mkChar("sqlite.vector"));
47
        SET_VECTOR_ELT(value, 1, mkChar(type));
47
        SET_VECTOR_ELT(value, 1, mkChar(type));
48
        SET_CLASS(ret, value);
48
        SET_CLASS(ret, value);
49
    }
49
    }
50
 
50
 
51
    UNPROTECT(nprotected);
51
    UNPROTECT(nprotected);
52
 
52
 
53
    return ret;
53
    return ret;
54
}
54
}
55
 
55
 
56
/* if ret == NULL, 3rd arg is the length of the vector created. otherwise
56
/* if ret == NULL, 3rd arg is the length of the vector created. otherwise
57
 * it is the index in the vector ret where we will put the result extracted
57
 * it is the index in the vector ret where we will put the result extracted
58
 * from ret */
58
 * from ret */
59
int _get_vector_index_typed_result(sqlite3_stmt *stmt, SEXP *ret, int idx_or_len) {
59
int _get_vector_index_typed_result(sqlite3_stmt *stmt, SEXP *ret, int idx_or_len) {
60
    int added = 1;
60
    int added = 1;
61
    if (*ret == NULL || *ret == R_NilValue) {
61
    if (*ret == NULL || *ret == R_NilValue) {
62
        const char *coltype = sqlite3_column_decltype(stmt, 0);
62
        const char *coltype = sqlite3_column_decltype(stmt, 0);
63
        if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) {
63
        if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) {
64
            added = 0;
64
            added = 0;
65
        }
65
        }
66
        
66
        
67
        if (strcmp(coltype, "text") == 0) {
67
        if (strcmp(coltype, "text") == 0) {
68
            PROTECT(*ret = NEW_CHARACTER(idx_or_len));
68
            PROTECT(*ret = NEW_CHARACTER(idx_or_len));
69
            if (added) 
69
            if (added) 
70
                SET_STRING_ELT(*ret, 0, mkChar((char *)sqlite3_column_text(stmt, 0)));
70
                SET_STRING_ELT(*ret, 0, mkChar((char *)sqlite3_column_text(stmt, 0)));
71
        } else if (strcmp(coltype, "double") == 0) {
71
        } else if (strcmp(coltype, "double") == 0) {
72
            PROTECT(*ret = NEW_NUMERIC(idx_or_len));
72
            PROTECT(*ret = NEW_NUMERIC(idx_or_len));
73
            if (added) REAL(*ret)[0] = sqlite3_column_double(stmt, 0);
73
            if (added) REAL(*ret)[0] = sqlite3_column_double(stmt, 0);
74
        } else if (strcmp(coltype, "bit") == 0) {
74
        } else if (strcmp(coltype, "bit") == 0) {
75
            PROTECT(*ret = NEW_LOGICAL(idx_or_len));
75
            PROTECT(*ret = NEW_LOGICAL(idx_or_len));
76
            if (added) INTEGER(*ret)[0] = sqlite3_column_int(stmt, 0);
76
            if (added) INTEGER(*ret)[0] = sqlite3_column_int(stmt, 0);
77
        } else if (strcmp(coltype, "integer") == 0 || 
77
        } else if (strcmp(coltype, "integer") == 0 || 
78
                   strcmp(coltype, "int") == 0) {
78
                   strcmp(coltype, "int") == 0) {
79
            /* caller should just copy off the vars level attr for factors */
79
            /* caller should just copy off the vars level attr for factors */
80
            PROTECT(*ret = NEW_INTEGER(idx_or_len));
80
            PROTECT(*ret = NEW_INTEGER(idx_or_len));
81
            if (added) INTEGER(*ret)[0] = sqlite3_column_int(stmt, 0);
81
            if (added) INTEGER(*ret)[0] = sqlite3_column_int(stmt, 0);
82
        } else added = 0;
82
        } else added = 0;
83
 
83
 
84
        UNPROTECT(1);
84
        UNPROTECT(1);
85
    } else {
85
    } else {
86
        const char *coltype = sqlite3_column_decltype(stmt, 0);
86
        const char *coltype = sqlite3_column_decltype(stmt, 0);
87
        if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) {
87
        if (sqlite3_column_type(stmt, 0) == SQLITE_NULL) {
88
            added = 0;
88
            added = 0;
89
        } else if (strcmp(coltype, "text") == 0) {
89
        } else if (strcmp(coltype, "text") == 0) {
90
            SET_STRING_ELT(*ret, idx_or_len, 
90
            SET_STRING_ELT(*ret, idx_or_len, 
91
                    mkChar((char *)sqlite3_column_text(stmt, 0)));
91
                    mkChar((char *)sqlite3_column_text(stmt, 0)));
92
        } else if (strcmp(coltype, "double") == 0) {
92
        } else if (strcmp(coltype, "double") == 0) {
93
            REAL(*ret)[idx_or_len] = sqlite3_column_double(stmt, 0);
93
            REAL(*ret)[idx_or_len] = sqlite3_column_double(stmt, 0);
94
        } else if (strcmp(coltype, "bit") == 0) {
94
        } else if (strcmp(coltype, "bit") == 0) {
95
            INTEGER(*ret)[idx_or_len] = sqlite3_column_int(stmt, 0);
95
            INTEGER(*ret)[idx_or_len] = sqlite3_column_int(stmt, 0);
96
        } else if (strcmp(coltype, "integer") == 0 ||
96
        } else if (strcmp(coltype, "integer") == 0 ||
97
                   strcmp(coltype, "int") == 0) {
97
                   strcmp(coltype, "int") == 0) {
98
            /* caller should just copy off the vars level attr for factors */
98
            /* caller should just copy off the vars level attr for factors */
99
            INTEGER(*ret)[idx_or_len] = sqlite3_column_int(stmt, 0);
99
            INTEGER(*ret)[idx_or_len] = sqlite3_column_int(stmt, 0);
100
        } else added = 0;
100
        } else added = 0;
101
    }
101
    }
102
        
102
        
103
    return added;
103
    return added;
104
}
104
}
105
 
105
 
106
/****************************************************************************
106
/****************************************************************************
107
 * SVEC FUNCTIONS
107
 * SVEC FUNCTIONS
108
 ****************************************************************************/
108
 ****************************************************************************/
109
SEXP sdf_get_variable(SEXP sdf, SEXP name) {
109
SEXP sdf_get_variable(SEXP sdf, SEXP name) {
110
    if (!IS_CHARACTER(name)) {
110
    if (!IS_CHARACTER(name)) {
111
        Rprintf("ERROR: argument is not a string.\n");
111
        Rprintf("ERROR: argument is not a string.\n");
112
        return R_NilValue;
112
        return R_NilValue;
113
    }
113
    }
114
 
114
 
115
    char *iname = SDF_INAME(sdf);
115
    char *iname = SDF_INAME(sdf);
116
    char *varname = CHAR_ELT(name, 0);
116
    char *varname = CHAR_ELT(name, 0);
117
 
117
 
118
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
118
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
119
 
119
 
120
    /* check if sdf & varname w/in that sdf exists */
120
    /* check if sdf & varname w/in that sdf exists */
121
    sqlite3_stmt *stmt;
121
    sqlite3_stmt *stmt;
122
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data", varname, iname);
122
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data", varname, iname);
123
 
123
 
124
    int res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
124
    int res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
125
 
125
 
126
    if (_sqlite_error(res)) return R_NilValue;
126
    if (_sqlite_error(res)) return R_NilValue;
127
 
127
 
128
    const char *coltype = sqlite3_column_decltype(stmt, 0);
128
    const char *coltype = sqlite3_column_decltype(stmt, 0);
129
    sqlite3_finalize(stmt);
129
    sqlite3_finalize(stmt);
130
 
130
 
131
 
131
 
132
    SEXP ret, value, class = R_NilValue; int nprotected = 0;
132
    SEXP ret, value, class = R_NilValue; int nprotected = 0;
133
    PROTECT(ret = NEW_LIST(2)); nprotected++;
133
    PROTECT(ret = NEW_LIST(2)); nprotected++;
134
 
134
 
135
    /* set list names */
135
    /* set list names */
136
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
136
    PROTECT(value = NEW_CHARACTER(2)); nprotected++;
137
    SET_STRING_ELT(value, 0, mkChar("iname"));
137
    SET_STRING_ELT(value, 0, mkChar("iname"));
138
    SET_STRING_ELT(value, 1, mkChar("varname"));
138
    SET_STRING_ELT(value, 1, mkChar("varname"));
139
    SET_NAMES(ret, value);
139
    SET_NAMES(ret, value);
140
 
140
 
141
    /* set list values */
141
    /* set list values */
142
    SET_VECTOR_ELT(ret, 0, mkString(iname));
142
    SET_VECTOR_ELT(ret, 0, mkString(iname));
143
    SET_VECTOR_ELT(ret, 1, mkString(varname));
143
    SET_VECTOR_ELT(ret, 1, mkString(varname));
144
 
144
 
145
    /* set class */
145
    /* set class */
146
    int type = -1;
146
    int type = -1;
147
    if (strcmp(coltype, "text") == 0) class = mkChar("character");
147
    if (strcmp(coltype, "text") == 0) class = mkChar("character");
148
    else if (strcmp(coltype, "double") == 0) class = mkChar("numeric");
148
    else if (strcmp(coltype, "double") == 0) class = mkChar("numeric");
149
    else if (strcmp(coltype, "bit") == 0) class = mkChar("logical");
149
    else if (strcmp(coltype, "bit") == 0) class = mkChar("logical");
150
    else if (strcmp(coltype, "integer") == 0 || strcmp(coltype, "int") == 0) {
150
    else if (strcmp(coltype, "integer") == 0 || strcmp(coltype, "int") == 0) {
151
        /* determine if int, factor or ordered */
151
        /* determine if int, factor or ordered */
152
        type = _get_factor_levels1(iname, varname, ret);
152
        type = _get_factor_levels1(iname, varname, ret);
153
        switch(type) {
153
        switch(type) {
154
            case VAR_INTEGER: class = mkChar("integer"); break;
154
            case VAR_INTEGER: class = mkChar("integer"); break;
155
            case VAR_FACTOR: class = mkChar("factor"); break;
155
            case VAR_FACTOR: class = mkChar("factor"); break;
156
            case VAR_ORDERED: class = mkChar("ordered");
156
            case VAR_ORDERED: class = mkChar("ordered");
157
        }
157
        }
158
 
158
 
159
    }
159
    }
160
 
160
 
161
    if (type != VAR_ORDERED) {
161
    if (type != VAR_ORDERED) {
162
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
162
        PROTECT(value = NEW_CHARACTER(2)); nprotected++;
163
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
163
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
164
        SET_STRING_ELT(value, 1, class);
164
        SET_STRING_ELT(value, 1, class);
165
    } else {
165
    } else {
166
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
166
        PROTECT(value = NEW_CHARACTER(3)); nprotected++;
167
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
167
        SET_STRING_ELT(value, 0, mkChar("sqlite.vector"));
168
        SET_STRING_ELT(value, 1, class);
168
        SET_STRING_ELT(value, 1, class);
169
        SET_STRING_ELT(value, 2, mkChar("factor"));
169
        SET_STRING_ELT(value, 2, mkChar("factor"));
170
    }
170
    }
171
    SET_CLASS(ret, value);
171
    SET_CLASS(ret, value);
172
 
172
 
173
    UNPROTECT(nprotected);
173
    UNPROTECT(nprotected);
174
    return ret;
174
    return ret;
175
 
175
 
176
}
176
}
177
 
177
 
178
 
178
 
179
SEXP sdf_get_variable_length(SEXP svec) {
179
SEXP sdf_get_variable_length(SEXP svec) {
180
    char *iname = SDF_INAME(svec);
180
    char *iname = SDF_INAME(svec);
181
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
181
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
182
 
182
 
183
    SEXP ret;
183
    SEXP ret;
184
    PROTECT(ret = NEW_INTEGER(1));
184
    PROTECT(ret = NEW_INTEGER(1));
185
    INTEGER(ret)[0] = _get_row_count2(iname, 1);
185
    INTEGER(ret)[0] = _get_row_count2(iname, 1);
186
    UNPROTECT(1);
186
    UNPROTECT(1);
187
    return ret;
187
    return ret;
188
}
188
}
189
 
189
 
190
    
190
    
191
SEXP sdf_get_variable_index(SEXP svec, SEXP idx) {
191
SEXP sdf_get_variable_index(SEXP svec, SEXP idx) {
192
    SEXP ret = R_NilValue, tmp;
192
    SEXP ret = R_NilValue, tmp;
193
    char *iname = SDF_INAME(svec), *varname = SVEC_VARNAME(svec);
193
    char *iname = SDF_INAME(svec), *varname = SVEC_VARNAME(svec);
194
    int index, idxlen, i, retlen=0, res;
194
    int index, idxlen, i, retlen=0, res;
195
    sqlite3_stmt *stmt;
195
    sqlite3_stmt *stmt;
196
 
196
 
197
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
197
    if (!USE_SDF1(iname, TRUE)) return R_NilValue;
198
 
198
 
199
    idxlen = LENGTH(idx);
199
    idxlen = LENGTH(idx);
200
    if (idxlen < 1) return ret;
200
    if (idxlen < 1) return ret;
201
 
201
 
202
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data limit ?,1",
202
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data limit ?,1",
203
            varname, iname);
203
            varname, iname);
204
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
204
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
205
 
205
 
206
    /* get data based on index */
206
    /* get data based on index */
207
    if (IS_NUMERIC(idx)) {
207
    if (IS_NUMERIC(idx)) {
208
        index = ((int) REAL(idx)[0]) - 1;
208
        index = ((int) REAL(idx)[0]) - 1;
209
        if (index < 0 && idxlen == 1) return ret;
209
        if (index < 0 && idxlen == 1) return ret;
210
 
210
 
211
        if (index >= 0) {
211
        if (index >= 0) {
212
            sqlite3_bind_int(stmt, 1, index);
212
            sqlite3_bind_int(stmt, 1, index);
213
            res = sqlite3_step(stmt);
213
            res = sqlite3_step(stmt);
214
            if (res == SQLITE_ROW) { 
214
            if (res == SQLITE_ROW) { 
215
                retlen = _get_vector_index_typed_result(stmt, &ret, idxlen);
215
                retlen = _get_vector_index_typed_result(stmt, &ret, idxlen);
216
            } 
216
            } 
217
        } 
217
        } 
218
        
218
        
219
        if (index < 0 || res != SQLITE_ROW) {
219
        if (index < 0 || res != SQLITE_ROW) {
220
            /* something wrong w/ 1st idx, and it is quietly ignored. we make 
220
            /* something wrong w/ 1st idx, and it is quietly ignored. we make 
221
             * a "dummy" call to setup the SEXP */
221
             * a "dummy" call to setup the SEXP */
222
            sqlite3_reset(stmt);
222
            sqlite3_reset(stmt);
223
            sqlite3_bind_int(stmt, 1, 0);
223
            sqlite3_bind_int(stmt, 1, 0);
224
            res = sqlite3_step(stmt);
224
            res = sqlite3_step(stmt);
225
            if (res == SQLITE_ROW) {
225
            if (res == SQLITE_ROW) {
226
                _get_vector_index_typed_result(stmt, &ret, idxlen - 1);
226
                _get_vector_index_typed_result(stmt, &ret, idxlen - 1);
227
            }
227
            }
228
            retlen = 0;
228
            retlen = 0;
229
        }
229
        }
230
 
230
 
231
 
231
 
232
        if (idxlen > 1) {
232
        if (idxlen > 1) {
233
            for (i = 1; i < idxlen; i++) {
233
            for (i = 1; i < idxlen; i++) {
234
                index = ((int) REAL(idx)[i]) - 1;
234
                index = ((int) REAL(idx)[i]) - 1;
235
                if (index < 0) continue;
235
                if (index < 0) continue;
236
                sqlite3_reset(stmt);
236
                sqlite3_reset(stmt);
237
                sqlite3_bind_int(stmt, 1, index);
237
                sqlite3_bind_int(stmt, 1, index);
238
                res = sqlite3_step(stmt);
238
                res = sqlite3_step(stmt);
239
                if (res == SQLITE_ROW)
239
                if (res == SQLITE_ROW)
240
                    retlen += _get_vector_index_typed_result(stmt, &ret, retlen); 
240
                    retlen += _get_vector_index_typed_result(stmt, &ret, retlen); 
241
            }
241
            }
242
        }
242
        }
243
    } else if (IS_INTEGER(idx)) {
243
    } else if (IS_INTEGER(idx)) {
244
        /* similar to REAL (IS_NUMERIC) above, except that we don't have
244
        /* similar to REAL (IS_NUMERIC) above, except that we don't have
245
         * to cast idx to int. can't refactor this out, sucks. */
245
         * to cast idx to int. can't refactor this out, sucks. */
246
        index = INTEGER(idx)[0] - 1;
246
        index = INTEGER(idx)[0] - 1;
247
        if (index < 0 && idxlen == 1) return ret;
247
        if (index < 0 && idxlen == 1) return ret;
248
 
248
 
249
        if (index >= 0) {
249
        if (index >= 0) {
250
            sqlite3_bind_int(stmt, 1, index);
250
            sqlite3_bind_int(stmt, 1, index);
251
            res = sqlite3_step(stmt);
251
            res = sqlite3_step(stmt);
252
            if (res == SQLITE_ROW) { 
252
            if (res == SQLITE_ROW) { 
253
                retlen = _get_vector_index_typed_result(stmt, &ret, idxlen);
253
                retlen = _get_vector_index_typed_result(stmt, &ret, idxlen);
254
            } 
254
            } 
255
        } 
255
        } 
256
        
256
        
257
        if (index < 0 || res != SQLITE_ROW) {
257
        if (index < 0 || res != SQLITE_ROW) {
258
            /* something wrong w/ 1st idx, and it is quietly ignored. we make 
258
            /* something wrong w/ 1st idx, and it is quietly ignored. we make 
259
             * a "dummy" call to setup the SEXP */
259
             * a "dummy" call to setup the SEXP */
260
            sqlite3_reset(stmt);
260
            sqlite3_reset(stmt);
261
            sqlite3_bind_int(stmt, 1, 0);
261
            sqlite3_bind_int(stmt, 1, 0);
262
            res = sqlite3_step(stmt);
262
            res = sqlite3_step(stmt);
263
            if (res == SQLITE_ROW) {
263
            if (res == SQLITE_ROW) {
264
                _get_vector_index_typed_result(stmt, &ret, idxlen - 1);
264
                _get_vector_index_typed_result(stmt, &ret, idxlen - 1);
265
            }
265
            }
266
            retlen = 0;
266
            retlen = 0;
267
        }
267
        }
268
 
268
 
269
        if (idxlen > 1) {
269
        if (idxlen > 1) {
270
            for (i = 1; i < idxlen; i++) {
270
            for (i = 1; i < idxlen; i++) {
271
                index = INTEGER(idx)[i] - 1;
271
                index = INTEGER(idx)[i] - 1;
272
                if (index < 0) continue;
272
                if (index < 0) continue;
273
                sqlite3_reset(stmt);
273
                sqlite3_reset(stmt);
274
                sqlite3_bind_int(stmt, 1, index);
274
                sqlite3_bind_int(stmt, 1, index);
275
                sqlite3_step(stmt);
275
                sqlite3_step(stmt);
276
                retlen += _get_vector_index_typed_result(stmt, &ret, retlen); 
276
                retlen += _get_vector_index_typed_result(stmt, &ret, retlen); 
277
            }
277
            }
278
        }
278
        }
279
 
279
 
280
    } else if (IS_LOGICAL(idx)) {
280
    } else if (IS_LOGICAL(idx)) {
281
        /* have to deal with recycling */
281
        /* have to deal with recycling */
282
        int veclen = _get_row_count2(iname, 1);
282
        int veclen = _get_row_count2(iname, 1);
283
 
283
 
284
        /* find if there is any TRUE element in the vector */
284
        /* find if there is any TRUE element in the vector */
285
        for (i = 0; i < idxlen && i < veclen; i++) {
285
        for (i = 0; i < idxlen && i < veclen; i++) {
286
            if (LOGICAL(idx)[i]) {
286
            if (LOGICAL(idx)[i]) {
287
                sqlite3_bind_int(stmt, 1, i);
287
                sqlite3_bind_int(stmt, 1, i);
288
                sqlite3_step(stmt);
288
                sqlite3_step(stmt);
289
                /* there are at least (idxlen-i) TRUE per cycle of the LOGICAL
289
                /* there are at least (idxlen-i) TRUE per cycle of the LOGICAL
290
                 * index. there are at least (veclen/idxlen) cycles (int div).
290
                 * index. there are at least (veclen/idxlen) cycles (int div).
291
                 * at the last cycle, if (veclen%idxlen > 0), there will be
291
                 * at the last cycle, if (veclen%idxlen > 0), there will be
292
                 * at least (veclen%idxlen - i) if veclen%idxlen > i */
292
                 * at least (veclen%idxlen - i) if veclen%idxlen > i */
293
                retlen = (idxlen-i) * (veclen/idxlen);
293
                retlen = (idxlen-i) * (veclen/idxlen);
294
                if (veclen%idxlen > i) retlen += (veclen%idxlen - i);
294
                if (veclen%idxlen > i) retlen += (veclen%idxlen - i);
295
 
295
 
296
                /* create the vector */
296
                /* create the vector */
297
                retlen = _get_vector_index_typed_result(stmt, &ret, retlen);
297
                retlen = _get_vector_index_typed_result(stmt, &ret, retlen);
298
                break;
298
                break;
299
            }
299
            }
300
        }
300
        }
301
 
301
 
302
        if (i < idxlen && i < veclen) {
302
        if (i < idxlen && i < veclen) {
303
            for (i++; i < veclen; i++) {
303
            for (i++; i < veclen; i++) {
304
                if (LOGICAL(idx)[i%idxlen]) {
304
                if (LOGICAL(idx)[i%idxlen]) {
305
                    sqlite3_reset(stmt);
305
                    sqlite3_reset(stmt);
306
                    sqlite3_bind_int(stmt, 1, i);
306
                    sqlite3_bind_int(stmt, 1, i);
307
                    sqlite3_step(stmt);
307
                    sqlite3_step(stmt);
308
                    retlen += _get_vector_index_typed_result(stmt, &ret, retlen);
308
                    retlen += _get_vector_index_typed_result(stmt, &ret, retlen);
309
                }
309
                }
310
            }
310
            }
311
        }
311
        }
312
    }
312
    }
313
 
313
 
314
    sqlite3_finalize(stmt);
314
    sqlite3_finalize(stmt);
315
 
315
 
316
    if (ret != R_NilValue) {
316
    if (ret != R_NilValue) {
317
        ret = _shrink_vector(ret, retlen);
317
        ret = _shrink_vector(ret, retlen);
318
        tmp = GET_LEVELS(svec);
318
        tmp = GET_LEVELS(svec);
319
        if (tmp != R_NilValue) {
319
        if (tmp != R_NilValue) {
320
            SET_LEVELS(ret, duplicate(tmp));
320
            SET_LEVELS(ret, duplicate(tmp));
321
            if (LENGTH(GET_CLASS(svec)) == 2) {
321
            if (LENGTH(GET_CLASS(svec)) == 2) {
322
                SET_CLASS(ret, mkString("factor"));
322
                SET_CLASS(ret, mkString("factor"));
323
            } else {
323
            } else {
324
                PROTECT(tmp = NEW_CHARACTER(2));
324
                PROTECT(tmp = NEW_CHARACTER(2));
325
                SET_STRING_ELT(tmp, 0, mkChar("ordered"));
325
                SET_STRING_ELT(tmp, 0, mkChar("ordered"));
326
                SET_STRING_ELT(tmp, 1, mkChar("factor"));
326
                SET_STRING_ELT(tmp, 1, mkChar("factor"));
327
                UNPROTECT(1);
327
                UNPROTECT(1);
328
            }
328
            }
329
        }
329
        }
330
    }
330
    }
331
 
331
 
332
    return ret;
332
    return ret;
333
}
333
}
334
 
334
 
335
/* sqlite.vector.[<- */
335
/* sqlite.vector.[<- */
336
SEXP sdf_set_variable_index(SEXP svec, SEXP idx, SEXP value) {
336
SEXP sdf_set_variable_index(SEXP svec, SEXP idx, SEXP value) {
337
    int idx_len, val_len;
337
    int idx_len, val_len;
338
 
338
 
339
    /* match levels if factor or ordered */
339
    /* match levels if factor or ordered */
340
    if (inherits(value, "ordered")) {
340
    if (inherits(value, "ordered")) {
341
    } else if (inherits(value, "factor")) {
341
    } else if (inherits(value, "factor")) {
342
    }
342
    }
343
 
343
 
344
    idx_len = LENGTH(idx);
344
    idx_len = LENGTH(idx);
345
    val_len = LENGTH(value);
345
    val_len = LENGTH(value);
346
 
346
 
347
    if (IS_NUMERIC(idx)) {
347
    if (IS_NUMERIC(idx)) {
348
    } else if (IS_INTEGER(idx)) {
348
    } else if (IS_INTEGER(idx)) {
349
    } else if (IS_LOGICAL(idx)) {
349
    } else if (IS_LOGICAL(idx)) {
350
    }
350
    }
351
 
351
 
352
    return R_NilValue;
352
    return R_NilValue;
353
}
353
}
354
 
354
 
355
/* the global accumulator should be safe if we only do 1 cummulative or
355
/* the global accumulator should be safe if we only do 1 cummulative or
356
 * aggregate at any time. it won't work for stuffs like "select max(col)-min(col)
356
 * aggregate at any time. it won't work for stuffs like "select max(col)-min(col)
357
 * from sdf_data". */
357
 * from sdf_data". */
358
static double g_accumulator = 0.0; /* accumulator var for cumsum, cumprod, etc. */
358
static double g_accumulator = 0.0; /* accumulator var for cumsum, cumprod, etc. */
359
static int g_start = 0;            /* flag for start of cummulation */
359
static int g_start = 0;            /* flag for start of cummulation */
360
static int g_narm = 0;             /* for Summary group */
360
static int g_narm = 0;             /* for Summary group */
361
 
361
 
362
SEXP sdf_do_variable_math(SEXP func, SEXP vector, SEXP extra_args, SEXP _nargs) {
362
SEXP sdf_do_variable_math(SEXP func, SEXP vector, SEXP extra_args, SEXP _nargs) {
363
    char *iname, *iname_src, *varname_src, *funcname;
363
    char *iname, *iname_src, *varname_src, *funcname;
364
    int namelen, res, nargs;
364
    int namelen, res, nargs;
365
    sqlite3_stmt *stmt;
365
    sqlite3_stmt *stmt;
366
 
366
 
367
    /* get data from arguments (function name and sqlite.vector stuffs) */
367
    /* get data from arguments (function name and sqlite.vector stuffs) */
368
    funcname = CHAR_ELT(func, 0);
368
    funcname = CHAR_ELT(func, 0);
369
    iname_src = SDF_INAME(vector);
369
    iname_src = SDF_INAME(vector);
370
    varname_src = SVEC_VARNAME(vector);
370
    varname_src = SVEC_VARNAME(vector);
371
    nargs = INTEGER(_nargs)[0];
371
    nargs = INTEGER(_nargs)[0];
372
 
372
 
373
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
373
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
374
 
374
 
375
    /* check nargs */
375
    /* check nargs */
376
    if (nargs > 2) {
376
    if (nargs > 2) {
377
        Rprintf("Error: Don't know how to handle Math functions w/ more than 2 args\n");
377
        Rprintf("Error: Don't know how to handle Math functions w/ more than 2 args\n");
378
        return R_NilValue;
378
        return R_NilValue;
379
    }
379
    }
380
 
380
 
381
    /* create a new sdf, with 1 column named V1 */
381
    /* create a new sdf, with 1 column named V1 */
382
    iname = _create_svector1(R_NilValue, "double", &namelen);
382
    iname = _create_svector1(R_NilValue, "double", &namelen);
383
 
383
 
384
    /* insert into <newsdf>.col, row.names select func(col), rownames */
384
    /* insert into <newsdf>.col, row.names select func(col), rownames */
385
    sprintf(g_sql_buf[0], "insert into [%s].sdf_data([row name], V1) "
385
    sprintf(g_sql_buf[0], "insert into [%s].sdf_data([row name], V1) "
386
            "select [row name], %s([%s]) from [%s].sdf_data", iname, funcname,
386
            "select [row name], %s([%s]) from [%s].sdf_data", iname, funcname,
387
            varname_src, iname_src);
387
            varname_src, iname_src);
388
 
388
 
389
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0); 
389
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0); 
390
    if (_sqlite_error(res)) {
390
    if (_sqlite_error(res)) {
391
        sprintf(g_sql_buf[0], "detach %s", iname);
391
        sprintf(g_sql_buf[0], "detach %s", iname);
392
        _sqlite_exec(g_sql_buf[0]);
392
        _sqlite_exec(g_sql_buf[0]);
393
 
393
 
394
        /* we will return a string with the file name, and do file.remove
394
        /* we will return a string with the file name, and do file.remove
395
         * at R */
395
         * at R */
396
        iname[namelen] = '.';
396
        iname[namelen] = '.';
397
        return mkString(iname);
397
        return mkString(iname);
398
    }
398
    }
399
 
399
 
400
    g_accumulator = 0.0;   /* initialize accumulator */
400
    g_accumulator = 0.0;   /* initialize accumulator */
401
    g_start = 1;           /* flag that we are at start of accumulating */
401
    g_start = 1;           /* flag that we are at start of accumulating */
402
    sqlite3_step(stmt);
402
    sqlite3_step(stmt);
403
    sqlite3_finalize(stmt);
403
    sqlite3_finalize(stmt);
404
 
404
 
405
    return _create_svector_sexp(iname, "V1", "numeric");
405
    return _create_svector_sexp(iname, "V1", "numeric");
406
}
406
}
407
 
407
 
408
SEXP sdf_do_variable_op(SEXP func, SEXP vector, SEXP op2) {
408
SEXP sdf_do_variable_op(SEXP func, SEXP vector, SEXP op2) {
409
    char *iname = NULL, *iname_src, *varname_src, *funcname;
409
    char *iname = NULL, *iname_src, *varname_src, *funcname;
410
    int res, functype = -1, op2_len, svec_len, i;
410
    int res, functype = -1, op2_len, svec_len, i;
411
    sqlite3_stmt *stmt, *stmt2;
411
    sqlite3_stmt *stmt, *stmt2;
412
 
412
 
413
    /* get data from arguments (function name and sqlite.vector stuffs) */
413
    /* get data from arguments (function name and sqlite.vector stuffs) */
414
    funcname = CHAR_ELT(func, 0);
414
    funcname = CHAR_ELT(func, 0);
415
    iname_src = SDF_INAME(vector);
415
    iname_src = SDF_INAME(vector);
416
    varname_src = SVEC_VARNAME(vector);
416
    varname_src = SVEC_VARNAME(vector);
417
 
417
 
418
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
418
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
419
    switch(funcname[0]) {
419
    switch(funcname[0]) {
420
        case '+' :
420
        case '+' :
421
        case '-' :
421
        case '-' :
422
        case '*' :
422
        case '*' :
423
        case '/' :
423
        case '/' :
424
        case '^' :
424
        case '^' :
425
        case '%' : /* %% and %/% */ 
425
        case '%' : /* %% and %/% */ 
426
            functype = 0; break;  /* output is REAL */
426
            functype = 0; break;  /* output is REAL */
427
        case '&' :
427
        case '&' :
428
        case '|' :
428
        case '|' :
429
        case '!' :  /* ! and != */
429
        case '!' :  /* ! and != */
430
            if (funcname[1] == 0) { functype = 1; break; }
430
            if (funcname[1] == 0) { functype = 1; break; }
431
        case '=' :  /* == */
431
        case '=' :  /* == */
432
        case '<' :  /* < and <= */
432
        case '<' :  /* < and <= */
433
        case '>' :  /* > and >= */
433
        case '>' :  /* > and >= */
434
            functype = 2; 
434
            functype = 2; 
435
    }
435
    }
436
 
436
 
437
    svec_len = _get_row_count2(iname_src, 1);
437
    svec_len = _get_row_count2(iname_src, 1);
438
    if (functype == 0 || functype == 2 || (functype == 1 && funcname[0] != '!')) {
438
    if (functype == 0 || functype == 2 || (functype == 1 && funcname[0] != '!')) {
439
        char *insert_fmt_string1c, *insert_fmt_string1s;
439
        char *insert_fmt_string1c, *insert_fmt_string1s;
440
        char *insert_fmt_string2c, *insert_fmt_string2s;
440
        char *insert_fmt_string2c, *insert_fmt_string2s;
441
        iname = _create_svector1(R_NilValue, (functype == 0) ? "double" : "bit", NULL);
441
        iname = _create_svector1(R_NilValue, (functype == 0) ? "double" : "bit", NULL);
442
 
442
 
443
        if (functype == 1) { /* boolean binary operators */
443
        if (functype == 1) { /* boolean binary operators */
444
            insert_fmt_string1s = "insert into [%s].sdf_data "
444
            insert_fmt_string1s = "insert into [%s].sdf_data "
445
                        "select [row name], ([%s] != 0) %s (? != 0) from [%s].sdf_data";
445
                        "select [row name], ([%s] != 0) %s (? != 0) from [%s].sdf_data";
446
            insert_fmt_string2s = "insert into [%s].sdf_data values(?, (? != 0) %s (? != 0))";
446
            insert_fmt_string2s = "insert into [%s].sdf_data values(?, (? != 0) %s (? != 0))";
447
            /* no need for char version of fmt_string2, since %% only occurs for functype==0 */
447
            /* no need for char version of fmt_string2, since %% only occurs for functype==0 */
448
            insert_fmt_string1c = insert_fmt_string1s;
448
            insert_fmt_string1c = insert_fmt_string1s;
449
            insert_fmt_string2c = insert_fmt_string2s;
449
            insert_fmt_string2c = insert_fmt_string2s;
450
        } else {
450
        } else {
451
            insert_fmt_string1s = "insert into [%s].sdf_data "
451
            insert_fmt_string1s = "insert into [%s].sdf_data "
452
                        "select [row name], [%s] %s ? from [%s].sdf_data";
452
                        "select [row name], [%s] %s ? from [%s].sdf_data";
453
            insert_fmt_string1c = "insert into [%s].sdf_data "
453
            insert_fmt_string1c = "insert into [%s].sdf_data "
454
                        "select [row name], [%s] %c ? from [%s].sdf_data";
454
                        "select [row name], [%s] %c ? from [%s].sdf_data";
455
            /* fmt_string2c format operator from a char, used for %% and %/% */
455
            /* fmt_string2c format operator from a char, used for %% and %/% */
456
            /* BUG: i'm casting to int before applying / & %, w/c is different
456
            /* BUG: i'm casting to int before applying / & %, w/c is different
457
             * from R. added trunc to pass package test */
457
             * from R. added trunc to pass package test */
458
            insert_fmt_string2c = "insert into [%s].sdf_data values(?, trunc(? %c ?))";
458
            insert_fmt_string2c = "insert into [%s].sdf_data values(?, trunc(? %c ?))";
459
            insert_fmt_string2s = "insert into [%s].sdf_data values(?, ? %s ?)";
459
            insert_fmt_string2s = "insert into [%s].sdf_data values(?, ? %s ?)";
460
        }
460
        }
461
 
461
 
462
 
462
 
463
        if (IS_NUMERIC(op2)) {
463
        if (IS_NUMERIC(op2)) {
464
            op2_len = LENGTH(op2);
464
            op2_len = LENGTH(op2);
465
 
465
 
466
            if (op2_len == 1) {
466
            if (op2_len == 1) {
467
                if (funcname[0] == '%') {
467
                if (funcname[0] == '%') {
468
                    sprintf(g_sql_buf[2], insert_fmt_string1c, iname, 
468
                    sprintf(g_sql_buf[2], insert_fmt_string1c, iname, 
469
                            varname_src, funcname[1], iname_src);
469
                            varname_src, funcname[1], iname_src);
470
                } else {
470
                } else {
471
                    sprintf(g_sql_buf[2], insert_fmt_string1s, iname,
471
                    sprintf(g_sql_buf[2], insert_fmt_string1s, iname,
472
                            varname_src, funcname, iname_src);
472
                            varname_src, funcname, iname_src);
473
                }
473
                }
474
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
474
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
475
                _sqlite_error(res);
475
                _sqlite_error(res);
476
                sqlite3_bind_double(stmt, 1, REAL(op2)[0]);
476
                sqlite3_bind_double(stmt, 1, REAL(op2)[0]);
477
                sqlite3_step(stmt);
477
                sqlite3_step(stmt);
478
            } else if (op2_len <= svec_len) {  /* recycle op2 */
478
            } else if (op2_len <= svec_len) {  /* recycle op2 */
479
                sprintf(g_sql_buf[2], "select [row name], [%s] from [%s].sdf_data",
479
                sprintf(g_sql_buf[2], "select [row name], [%s] from [%s].sdf_data",
480
                        varname_src, iname_src);
480
                        varname_src, iname_src);
481
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
481
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
482
                _sqlite_error(res);
482
                _sqlite_error(res);
483
 
483
 
484
                if (funcname[0] == '%') {
484
                if (funcname[0] == '%') {
485
                    /* sqlite does int div with "/" if both args are int. mod is % also.
485
                    /* sqlite does int div with "/" if both args are int. mod is % also.
486
                     * fortunately, in both cases the sqlite op is 2nd char of funcname */
486
                     * fortunately, in both cases the sqlite op is 2nd char of funcname */
487
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
487
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
-
 
488
                    _sqlite_exec("begin");
488
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
489
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
489
                    _sqlite_error(res);
490
                    _sqlite_error(res);
490
 
491
 
491
                    for (i = 0; i < svec_len; i++) {
492
                    for (i = 0; i < svec_len; i++) {
492
                        sqlite3_step(stmt2);
493
                        sqlite3_step(stmt2);
493
 
494
 
494
                        sqlite3_reset(stmt);
495
                        sqlite3_reset(stmt);
495
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
496
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
496
                        sqlite3_bind_int(stmt, 2, (int)sqlite3_column_double(stmt2, 1));
497
                        sqlite3_bind_int(stmt, 2, (int)sqlite3_column_double(stmt2, 1));
497
                        sqlite3_bind_int(stmt, 3, (int)REAL(op2)[i % op2_len]);
498
                        sqlite3_bind_int(stmt, 3, (int)REAL(op2)[i % op2_len]);
498
                        sqlite3_step(stmt);
499
                        sqlite3_step(stmt);
499
                    }
500
                    }
-
 
501
                    _sqlite_exec("commit");
500
                } else { /* non-integer binary operation */
502
                } else { /* non-integer binary operation */
501
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
503
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
-
 
504
                    _sqlite_exec("begin");
502
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
505
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
503
                    _sqlite_error(res);
506
                    _sqlite_error(res);
504
 
507
 
505
                    for (i = 0; i < svec_len; i++) {
508
                    for (i = 0; i < svec_len; i++) {
506
                        sqlite3_step(stmt2);
509
                        sqlite3_step(stmt2);
507
 
510
 
508
                        sqlite3_reset(stmt);
511
                        sqlite3_reset(stmt);
509
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
512
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
510
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
513
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
511
                        sqlite3_bind_double(stmt, 3, REAL(op2)[i % op2_len]);
514
                        sqlite3_bind_double(stmt, 3, REAL(op2)[i % op2_len]);
512
                        sqlite3_step(stmt);
515
                        sqlite3_step(stmt);
513
                    }
516
                    }
-
 
517
                    _sqlite_exec("commit");
514
                }
518
                }
515
                sqlite3_finalize(stmt2);
519
                sqlite3_finalize(stmt2);
516
            } else { /* op2_len > svec_len, recycle svec */
520
            } else { /* op2_len > svec_len, recycle svec */
517
                sprintf(g_sql_buf[1], "select [%s] from [%s].sdf_data",
521
                sprintf(g_sql_buf[1], "select [%s] from [%s].sdf_data",
518
                        varname_src, iname_src);
522
                        varname_src, iname_src);
519
 
523
 
520
                if (funcname[0] == '%') {
524
                if (funcname[0] == '%') {
521
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
525
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
522
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
526
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
523
                    _sqlite_error(res);
527
                    _sqlite_error(res);
524
                } else {
528
                } else {
525
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
529
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
526
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
530
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
527
                    _sqlite_error(res);
531
                    _sqlite_error(res);
528
                }
532
                }
529
               
533
               
530
                i = 0;
534
                i = 0; _sqlite_exec("begin");
531
                while (i < op2_len) {
535
                while (i < op2_len) {
532
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
536
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
533
                    _sqlite_error(res);
537
                    _sqlite_error(res);
534
 
538
 
535
                    if (funcname[0] == '%') {
539
                    if (funcname[0] == '%') {
536
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
540
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
537
                            sqlite3_step(stmt2);
541
                            sqlite3_step(stmt2);
538
 
542
 
539
                            sqlite3_reset(stmt);
543
                            sqlite3_reset(stmt);
540
                            /* simplify my life, just use ints for row names so that we
544
                            /* simplify my life, just use ints for row names so that we
541
                             * don't have to worry about duplicates */
545
                             * don't have to worry about duplicates */
542
                            sqlite3_bind_int(stmt, 1, i); 
546
                            sqlite3_bind_int(stmt, 1, i); 
543
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
547
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
544
                            sqlite3_bind_int(stmt, 3, (int)REAL(op2)[i % op2_len]);
548
                            sqlite3_bind_int(stmt, 3, (int)REAL(op2)[i % op2_len]);
545
                            sqlite3_step(stmt);
549
                            sqlite3_step(stmt);
546
                        }
550
                        }
547
                    } else {
551
                    } else {
548
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
552
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
549
                            sqlite3_step(stmt2);
553
                            sqlite3_step(stmt2);
550
 
554
 
551
                            sqlite3_reset(stmt);
555
                            sqlite3_reset(stmt);
552
                            sqlite3_bind_int(stmt, 1, i);
556
                            sqlite3_bind_int(stmt, 1, i);
553
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
557
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
554
                            sqlite3_bind_double(stmt, 3, REAL(op2)[i % op2_len]);
558
                            sqlite3_bind_double(stmt, 3, REAL(op2)[i % op2_len]);
555
                            sqlite3_step(stmt);
559
                            sqlite3_step(stmt);
556
                        }
560
                        }
557
                    }
561
                    }
558
 
562
 
559
                    /* recycle on svec if we loop again */
563
                    /* recycle on svec if we loop again */
560
                    sqlite3_finalize(stmt2);
564
                    sqlite3_finalize(stmt2);
561
                }
565
                }
-
 
566
 
-
 
567
                _sqlite_exec("commit");
562
            }
568
            }
563
 
569
 
564
            sqlite3_finalize(stmt);
570
            sqlite3_finalize(stmt);
565
        } else if (IS_INTEGER(op2) || IS_LOGICAL(op2)) { /* I N T E G E R */
571
        } else if (IS_INTEGER(op2) || IS_LOGICAL(op2)) { /* I N T E G E R */
566
            /* we are taking advantage of the fact that logicals are stored as int.
572
            /* we are taking advantage of the fact that logicals are stored as int.
567
             * if this becomes untrue in the future, then this is a bug */
573
             * if this becomes untrue in the future, then this is a bug */
568
            op2_len = LENGTH(op2);
574
            op2_len = LENGTH(op2);
569
 
575
 
570
            if (op2_len == 1) {
576
            if (op2_len == 1) {
571
                if (funcname[0] == '%') {
577
                if (funcname[0] == '%') {
572
                    sprintf(g_sql_buf[2], insert_fmt_string1c, iname, 
578
                    sprintf(g_sql_buf[2], insert_fmt_string1c, iname, 
573
                            varname_src, funcname[1], iname_src);
579
                            varname_src, funcname[1], iname_src);
574
                } else {
580
                } else {
575
                    sprintf(g_sql_buf[2], insert_fmt_string1s, iname,
581
                    sprintf(g_sql_buf[2], insert_fmt_string1s, iname,
576
                            varname_src, funcname, iname_src);
582
                            varname_src, funcname, iname_src);
577
                }
583
                }
578
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
584
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
579
                _sqlite_error(res);
585
                _sqlite_error(res);
580
                sqlite3_bind_double(stmt, 1, (double)INTEGER(op2)[0]);
586
                sqlite3_bind_double(stmt, 1, (double)INTEGER(op2)[0]);
581
                sqlite3_step(stmt);
587
                sqlite3_step(stmt);
582
            } else if (op2_len <= svec_len) {
588
            } else if (op2_len <= svec_len) {
583
                sprintf(g_sql_buf[2], "select [row name], [%s] from [%s].sdf_data",
589
                sprintf(g_sql_buf[2], "select [row name], [%s] from [%s].sdf_data",
584
                        varname_src, iname_src);
590
                        varname_src, iname_src);
585
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
591
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
586
                _sqlite_error(res);
592
                _sqlite_error(res);
587
 
593
 
588
                if (funcname[0] == '%') {
594
                if (funcname[0] == '%') {
589
                    /* sqlite does int div with "/" if both args are int. mod is % also.
595
                    /* sqlite does int div with "/" if both args are int. mod is % also.
590
                     * fortunately, in both cases the sqlite op is 2nd char of funcname */
596
                     * fortunately, in both cases the sqlite op is 2nd char of funcname */
591
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
597
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
-
 
598
                    _sqlite_exec("begin");
592
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
599
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
593
                    _sqlite_error(res);
600
                    _sqlite_error(res);
594
 
601
 
595
                    for (i = 0; i < svec_len; i++) {
602
                    for (i = 0; i < svec_len; i++) {
596
                        sqlite3_step(stmt2);
603
                        sqlite3_step(stmt2);
597
 
604
 
598
                        sqlite3_reset(stmt);
605
                        sqlite3_reset(stmt);
599
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
606
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
600
                        sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
607
                        sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
601
                        sqlite3_bind_int(stmt, 3, INTEGER(op2)[i % op2_len]);
608
                        sqlite3_bind_int(stmt, 3, INTEGER(op2)[i % op2_len]);
602
                        sqlite3_step(stmt);
609
                        sqlite3_step(stmt);
603
                    }
610
                    }
-
 
611
                    _sqlite_exec("commit");
604
                } else {
612
                } else {
605
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
613
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
-
 
614
                    _sqlite_exec("begin");
606
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
615
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
607
                    _sqlite_error(res);
616
                    _sqlite_error(res);
608
 
617
 
609
                    for (i = 0; i < svec_len; i++) {
618
                    for (i = 0; i < svec_len; i++) {
610
                        sqlite3_step(stmt2);
619
                        sqlite3_step(stmt2);
611
 
620
 
612
                        sqlite3_reset(stmt);
621
                        sqlite3_reset(stmt);
613
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
622
                        sqlite3_bind_text(stmt, 1, (char *)sqlite3_column_text(stmt2, 0), -1, SQLITE_STATIC);
614
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
623
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
615
                        sqlite3_bind_double(stmt, 3, (double)INTEGER(op2)[i % op2_len]);
624
                        sqlite3_bind_double(stmt, 3, (double)INTEGER(op2)[i % op2_len]);
616
                        sqlite3_step(stmt);
625
                        sqlite3_step(stmt);
617
                    }
626
                    }
-
 
627
                    _sqlite_exec("commit");
618
                }
628
                }
619
                sqlite3_finalize(stmt2);
629
                sqlite3_finalize(stmt2);
620
            } else {
630
            } else {
621
                sprintf(g_sql_buf[1], "select [%s] from [%s].sdf_data",
631
                sprintf(g_sql_buf[1], "select [%s] from [%s].sdf_data",
622
                        varname_src, iname_src);
632
                        varname_src, iname_src);
623
 
633
 
624
                if (funcname[0] == '%') {
634
                if (funcname[0] == '%') {
625
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
635
                    sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);  
626
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
636
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
627
                    _sqlite_error(res);
637
                    _sqlite_error(res);
628
                } else {
638
                } else {
629
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
639
                    sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
630
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
640
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
631
                    _sqlite_error(res);
641
                    _sqlite_error(res);
632
                }
642
                }
633
               
643
               
634
                i = 0;
644
                i = 0; _sqlite_exec("begin");
635
                while (i < op2_len) {
645
                while (i < op2_len) {
636
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
646
                    res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
637
                    _sqlite_error(res);
647
                    _sqlite_error(res);
638
 
648
 
639
                    if (funcname[0] == '%') {
649
                    if (funcname[0] == '%') {
640
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
650
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
641
                            sqlite3_step(stmt2);
651
                            sqlite3_step(stmt2);
642
 
652
 
643
                            sqlite3_reset(stmt);
653
                            sqlite3_reset(stmt);
644
                            /* simplify my life, just use ints for row names so that we
654
                            /* simplify my life, just use ints for row names so that we
645
                             * don't have to worry about duplicates */
655
                             * don't have to worry about duplicates */
646
                            sqlite3_bind_int(stmt, 1, i); 
656
                            sqlite3_bind_int(stmt, 1, i); 
647
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
657
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 1));
648
                            sqlite3_bind_int(stmt, 3, INTEGER(op2)[i % op2_len]);
658
                            sqlite3_bind_int(stmt, 3, INTEGER(op2)[i % op2_len]);
649
                            sqlite3_step(stmt);
659
                            sqlite3_step(stmt);
650
                        }
660
                        }
651
                    } else {
661
                    } else {
652
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
662
                        for ( ; i < op2_len && sqlite3_step(stmt) == SQLITE_ROW ; i++) {
653
                            sqlite3_step(stmt2);
663
                            sqlite3_step(stmt2);
654
 
664
 
655
                            sqlite3_reset(stmt);
665
                            sqlite3_reset(stmt);
656
                            sqlite3_bind_int(stmt, 1, i);
666
                            sqlite3_bind_int(stmt, 1, i);
657
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
667
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 1));
658
                            sqlite3_bind_double(stmt, 3, (double)INTEGER(op2)[i % op2_len]);
668
                            sqlite3_bind_double(stmt, 3, (double)INTEGER(op2)[i % op2_len]);
659
                            sqlite3_step(stmt);
669
                            sqlite3_step(stmt);
660
                        }
670
                        }
661
                    }
671
                    }
662
 
672
 
663
                    /* recycle on svec if we loop again */
673
                    /* recycle on svec if we loop again */
664
                    sqlite3_finalize(stmt2);
674
                    sqlite3_finalize(stmt2);
665
                }
675
                }
-
 
676
                _sqlite_exec("commit");
666
            }
677
            }
667
 
678
 
668
            sqlite3_finalize(stmt);
679
            sqlite3_finalize(stmt);
669
        } else if (inherits(op2, "sqlite.vector")) { 
680
        } else if (inherits(op2, "sqlite.vector")) { 
670
            /* op2 is surely not a factor, as handled by the R wrapper */
681
            /* op2 is surely not a factor, as handled by the R wrapper */
671
            char *iname_op2, *varname_op2;
682
            char *iname_op2, *varname_op2;
672
            sqlite3_stmt *stmt3;
683
            sqlite3_stmt *stmt3;
673
            iname_op2 = SDF_INAME(op2);
684
            iname_op2 = SDF_INAME(op2);
674
            varname_op2 = SVEC_VARNAME(op2);
685
            varname_op2 = SVEC_VARNAME(op2);
675
 
686
 
676
            if (!USE_SDF1(iname_op2, TRUE)) {
687
            if (!USE_SDF1(iname_op2, TRUE)) {
677
                /* delete created sqlite.vector */
688
                /* delete created sqlite.vector */
678
                Rprintf("Warning: detaching created result SDF %s\n", iname);
689
                Rprintf("Warning: detaching created result SDF %s\n", iname);
679
                sdf_detach_sdf(mkString(iname));
690
                sdf_detach_sdf(mkString(iname));
680
                return R_NilValue;
691
                return R_NilValue;
681
            }
692
            }
682
 
693
 
683
            op2_len = _get_row_count2(iname_op2, 1);
694
            op2_len = _get_row_count2(iname_op2, 1);
684
            
695
            
685
            sprintf(g_sql_buf[2], "select [%s] from [%s].sdf_data", varname_src, iname_src);
696
            sprintf(g_sql_buf[2], "select [%s] from [%s].sdf_data", varname_src, iname_src);
686
            res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
697
            res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt2, 0);
687
            _sqlite_error(res);
698
            _sqlite_error(res);
688
 
699
 
689
            sprintf(g_sql_buf[2], "select [%s] from [%s].sdf_data", varname_op2, iname_op2);
700
            sprintf(g_sql_buf[2], "select [%s] from [%s].sdf_data", varname_op2, iname_op2);
690
            res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt3, 0);
701
            res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt3, 0);
691
            _sqlite_error(res);
702
            _sqlite_error(res);
692
 
703
 
693
            if (funcname[0] == '%') {
704
            if (funcname[0] == '%') {
694
                sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);
705
                sprintf(g_sql_buf[2], insert_fmt_string2c, iname, funcname[1]);
-
 
706
                _sqlite_exec("begin");
695
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
707
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
696
                _sqlite_error(res);
708
                _sqlite_error(res);
697
 
709
 
698
                if (svec_len == op2_len) {
710
                if (svec_len == op2_len) {
699
                    for (i = 0; i < svec_len; i++) {
711
                    for (i = 0; i < svec_len; i++) {
700
                        sqlite3_step(stmt2); sqlite3_step(stmt3);
712
                        sqlite3_step(stmt2); sqlite3_step(stmt3);
701
 
713
 
702
                        sqlite3_reset(stmt);
714
                        sqlite3_reset(stmt);
703
                        sqlite3_bind_int(stmt, 1, i);
715
                        sqlite3_bind_int(stmt, 1, i);
704
                        sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
716
                        sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
705
                        sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
717
                        sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
706
                        sqlite3_step(stmt);
718
                        sqlite3_step(stmt);
707
                    }
719
                    }
708
                } else if (svec_len < op2_len) {
720
                } else if (svec_len < op2_len) {
709
                    i = 0;
721
                    i = 0;
710
                    while (i < op2_len) {
722
                    while (i < op2_len) {
711
                        for ( ; sqlite3_step(stmt2) == SQLITE_ROW && i < op2_len; i++) {
723
                        for ( ; sqlite3_step(stmt2) == SQLITE_ROW && i < op2_len; i++) {
712
                            sqlite3_step(stmt3);
724
                            sqlite3_step(stmt3);
713
 
725
 
714
                            sqlite3_reset(stmt);
726
                            sqlite3_reset(stmt);
715
                            sqlite3_bind_int(stmt, 1, i);
727
                            sqlite3_bind_int(stmt, 1, i);
716
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
728
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
717
                            sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
729
                            sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
718
                            sqlite3_step(stmt);
730
                            sqlite3_step(stmt);
719
                        }
731
                        }
720
                        sqlite3_reset(stmt2);
732
                        sqlite3_reset(stmt2);
721
                    }
733
                    }
722
                } else {
734
                } else {
723
                    i = 0;
735
                    i = 0;
724
                    while (i < svec_len) {
736
                    while (i < svec_len) {
725
                        for ( ; sqlite3_step(stmt3) == SQLITE_ROW && i < svec_len; i++) {
737
                        for ( ; sqlite3_step(stmt3) == SQLITE_ROW && i < svec_len; i++) {
726
                            sqlite3_step(stmt2);
738
                            sqlite3_step(stmt2);
727
 
739
 
728
                            sqlite3_reset(stmt);
740
                            sqlite3_reset(stmt);
729
                            sqlite3_bind_int(stmt, 1, i);
741
                            sqlite3_bind_int(stmt, 1, i);
730
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
742
                            sqlite3_bind_int(stmt, 2, sqlite3_column_int(stmt2, 0));
731
                            sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
743
                            sqlite3_bind_int(stmt, 3, sqlite3_column_int(stmt3, 0));
732
                            sqlite3_step(stmt);
744
                            sqlite3_step(stmt);
733
                        }
745
                        }
734
                        sqlite3_reset(stmt3);
746
                        sqlite3_reset(stmt3);
735
                    }
747
                    }
736
                }
748
                }
-
 
749
                _sqlite_exec("commit");
737
            } else { /* not an integer op %% or %/% */
750
            } else { /* not an integer op %% or %/% */
738
                sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
751
                sprintf(g_sql_buf[2], insert_fmt_string2s, iname, funcname);
-
 
752
                _sqlite_exec("begin");
739
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
753
                res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
740
                _sqlite_error(res);
754
                _sqlite_error(res);
741
 
755
 
742
                if (svec_len == op2_len) {
756
                if (svec_len == op2_len) {
743
                    for (i = 0; i < svec_len; i++) {
757
                    for (i = 0; i < svec_len; i++) {
744
                        sqlite3_step(stmt2); sqlite3_step(stmt3);
758
                        sqlite3_step(stmt2); sqlite3_step(stmt3);
745
 
759
 
746
                        sqlite3_reset(stmt);
760
                        sqlite3_reset(stmt);
747
                        sqlite3_bind_int(stmt, 1, i);
761
                        sqlite3_bind_int(stmt, 1, i);
748
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
762
                        sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
749
                        sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
763
                        sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
750
                        sqlite3_step(stmt);
764
                        sqlite3_step(stmt);
751
                    }
765
                    }
752
                } else if (svec_len < op2_len) { /* recycle svec */
766
                } else if (svec_len < op2_len) { /* recycle svec */
753
                    i = 0;
767
                    i = 0;
754
                    while (i < op2_len) {
768
                    while (i < op2_len) {
755
                        for ( ; sqlite3_step(stmt2) == SQLITE_ROW && i < op2_len; i++) {
769
                        for ( ; sqlite3_step(stmt2) == SQLITE_ROW && i < op2_len; i++) {
756
                            sqlite3_step(stmt3);
770
                            sqlite3_step(stmt3);
757
 
771
 
758
                            sqlite3_reset(stmt);
772
                            sqlite3_reset(stmt);
759
                            sqlite3_bind_int(stmt, 1, i);
773
                            sqlite3_bind_int(stmt, 1, i);
760
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
774
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
761
                            sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
775
                            sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
762
                            sqlite3_step(stmt);
776
                            sqlite3_step(stmt);
763
                        }
777
                        }
764
                        sqlite3_reset(stmt2);
778
                        sqlite3_reset(stmt2);
765
                    }
779
                    }
766
                } else { /* svec_len > op2_len, recycle op2 */
780
                } else { /* svec_len > op2_len, recycle op2 */
767
                    i = 0;
781
                    i = 0;
768
                    while (i < svec_len) {
782
                    while (i < svec_len) {
769
                        for ( ; sqlite3_step(stmt3) == SQLITE_ROW && i < svec_len; i++) {
783
                        for ( ; sqlite3_step(stmt3) == SQLITE_ROW && i < svec_len; i++) {
770
                            sqlite3_step(stmt2);
784
                            sqlite3_step(stmt2);
771
 
785
 
772
                            sqlite3_reset(stmt);
786
                            sqlite3_reset(stmt);
773
                            sqlite3_bind_int(stmt, 1, i);
787
                            sqlite3_bind_int(stmt, 1, i);
774
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
788
                            sqlite3_bind_double(stmt, 2, sqlite3_column_double(stmt2, 0));
775
                            sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
789
                            sqlite3_bind_double(stmt, 3, sqlite3_column_double(stmt3, 0));
776
                            sqlite3_step(stmt);
790
                            sqlite3_step(stmt);
777
                        }
791
                        }
778
                        sqlite3_reset(stmt3);
792
                        sqlite3_reset(stmt3);
779
                    }
793
                    }
780
                }
794
                }
-
 
795
                _sqlite_exec("commit");
781
            }
796
            }
782
 
797
 
783
            sqlite3_finalize(stmt);
798
            sqlite3_finalize(stmt);
784
            sqlite3_finalize(stmt2);
799
            sqlite3_finalize(stmt2);
785
            sqlite3_finalize(stmt3);
800
            sqlite3_finalize(stmt3);
786
        }
801
        }
787
    } else if (functype == 1 && funcname[0] != '!') { /* unary not operator */
802
    } else if (functype == 1 && funcname[0] != '!') { /* unary not operator */
788
        iname = _create_svector1(R_NilValue, "bit", NULL);
803
        iname = _create_svector1(R_NilValue, "bit", NULL);
789
        sprintf(g_sql_buf[2], "insert into [%s].sdf_data "
804
        sprintf(g_sql_buf[2], "insert into [%s].sdf_data "
790
                    "select [row name], [%s] == 0 from [%s].sdf_data", 
805
                    "select [row name], [%s] == 0 from [%s].sdf_data", 
791
                    iname, varname_src, iname_src);
806
                    iname, varname_src, iname_src);
792
        res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
807
        res = sqlite3_prepare(g_workspace, g_sql_buf[2], -1, &stmt, 0);
793
        _sqlite_error(res);
808
        _sqlite_error(res);
794
        sqlite3_step(stmt);
809
        sqlite3_step(stmt);
795
        sqlite3_finalize(stmt);
810
        sqlite3_finalize(stmt);
796
    }
811
    }
797
 
812
 
798
    if (iname != NULL)
813
    if (iname != NULL)
799
        return _create_svector_sexp(iname, "V1", 
814
        return _create_svector_sexp(iname, "V1", 
800
                (functype == 0) ? "numeric" : "logical");
815
                (functype == 0) ? "numeric" : "logical");
801
 
816
 
802
    return R_NilValue;
817
    return R_NilValue;
803
 
818
 
804
}
819
}
805
 
820
 
806
SEXP sdf_do_variable_summary(SEXP func, SEXP vector, SEXP na_rm) {
821
SEXP sdf_do_variable_summary(SEXP func, SEXP vector, SEXP na_rm) {
807
    char *iname_src, *varname_src, *funcname;
822
    char *iname_src, *varname_src, *funcname;
808
    int res;
823
    int res;
809
    sqlite3_stmt *stmt;
824
    sqlite3_stmt *stmt;
810
    double _ret = NA_REAL; SEXP ret;
825
    double _ret = NA_REAL; SEXP ret;
811
 
826
 
812
    /* get data from arguments (function name and sqlite.vector stuffs) */
827
    /* get data from arguments (function name and sqlite.vector stuffs) */
813
    funcname = CHAR_ELT(func, 0);
828
    funcname = CHAR_ELT(func, 0);
814
    iname_src = SDF_INAME(vector);
829
    iname_src = SDF_INAME(vector);
815
    varname_src = SVEC_VARNAME(vector);
830
    varname_src = SVEC_VARNAME(vector);
816
 
831
 
817
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
832
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
818
 
833
 
819
    g_narm = LOGICAL(na_rm)[0];
834
    g_narm = LOGICAL(na_rm)[0];
820
    if (strcmp(funcname, "range") == 0) {
835
    if (strcmp(funcname, "range") == 0) {
821
        /* special handling for range. use min then max */
836
        /* special handling for range. use min then max */
822
        g_start = 1;
837
        g_start = 1;
823
        g_accumulator = 0.0;
838
        g_accumulator = 0.0;
824
        sprintf(g_sql_buf[0], "select min_df([%s]) from [%s].sdf_data", varname_src, iname_src);
839
        sprintf(g_sql_buf[0], "select min_df([%s]) from [%s].sdf_data", varname_src, iname_src);
825
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
840
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
826
        if (_sqlite_error(res)) return R_NilValue;
841
        if (_sqlite_error(res)) return R_NilValue;
827
        sqlite3_step(stmt); sqlite3_finalize(stmt);
842
        sqlite3_step(stmt); sqlite3_finalize(stmt);
828
        _ret = g_accumulator;
843
        _ret = g_accumulator;
829
 
844
 
830
        if (R_IsNA(_ret) && !g_narm) {
845
        if (R_IsNA(_ret) && !g_narm) {
831
            PROTECT(ret = NEW_NUMERIC(2));
846
            PROTECT(ret = NEW_NUMERIC(2));
832
            REAL(ret)[0] = REAL(ret)[1] = R_NaReal;
847
            REAL(ret)[0] = REAL(ret)[1] = R_NaReal;
833
            goto __sdf_do_variable_summary_out;
848
            goto __sdf_do_variable_summary_out;
834
        }
849
        }
835
        
850
        
836
        g_start = 1;
851
        g_start = 1;
837
        g_accumulator = 0.0;
852
        g_accumulator = 0.0;
838
        sprintf(g_sql_buf[0], "select max_df([%s]) from [%s].sdf_data", varname_src, iname_src);
853
        sprintf(g_sql_buf[0], "select max_df([%s]) from [%s].sdf_data", varname_src, iname_src);
839
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
854
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
840
        if (_sqlite_error(res)) return R_NilValue;
855
        if (_sqlite_error(res)) return R_NilValue;
841
        sqlite3_step(stmt); sqlite3_finalize(stmt);
856
        sqlite3_step(stmt); sqlite3_finalize(stmt);
842
 
857
 
843
        /* if there is NA, then the if above should have caught it already */
858
        /* if there is NA, then the if above should have caught it already */
844
        PROTECT(ret = NEW_NUMERIC(2));
859
        PROTECT(ret = NEW_NUMERIC(2));
845
        REAL(ret)[0] = _ret;
860
        REAL(ret)[0] = _ret;
846
        REAL(ret)[1] = g_accumulator;
861
        REAL(ret)[1] = g_accumulator;
847
    } else {
862
    } else {
848
        g_start = 1;  /* we'll use these instead of sqlite3_aggregate_context */
863
        g_start = 1;  /* we'll use these instead of sqlite3_aggregate_context */
849
        g_accumulator = 0.0;
864
        g_accumulator = 0.0;
850
        sprintf(g_sql_buf[0], "select %s_df([%s]) from [%s].sdf_data", funcname, varname_src, iname_src);
865
        sprintf(g_sql_buf[0], "select %s_df([%s]) from [%s].sdf_data", funcname, varname_src, iname_src);
851
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
866
        res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, NULL);
852
        if (_sqlite_error(res)) return R_NilValue;
867
        if (_sqlite_error(res)) return R_NilValue;
853
        res = sqlite3_step(stmt); sqlite3_finalize(stmt);
868
        res = sqlite3_step(stmt); sqlite3_finalize(stmt);
854
 
869
 
855
        if (strcmp(funcname, "all") == 0 || strcmp(funcname, "any") == 0) {
870
        if (strcmp(funcname, "all") == 0 || strcmp(funcname, "any") == 0) {
856
            PROTECT(ret = NEW_LOGICAL(1));
871
            PROTECT(ret = NEW_LOGICAL(1));
857
            if (R_IsNA(g_accumulator)) LOGICAL(ret)[0] = NA_INTEGER;
872
            if (R_IsNA(g_accumulator)) LOGICAL(ret)[0] = NA_INTEGER;
858
            else LOGICAL(ret)[0] = !(g_accumulator == 0);
873
            else LOGICAL(ret)[0] = !(g_accumulator == 0);
859
        } else {
874
        } else {
860
            PROTECT(ret = NEW_NUMERIC(1));
875
            PROTECT(ret = NEW_NUMERIC(1));
861
            REAL(ret)[0] = g_accumulator;
876
            REAL(ret)[0] = g_accumulator;
862
        }
877
        }
863
    }
878
    }
864
 
879
 
865
__sdf_do_variable_summary_out:
880
__sdf_do_variable_summary_out:
866
    UNPROTECT(1);
881
    UNPROTECT(1);
867
    return ret;
882
    return ret;
868
}
883
}
869
 
884
 
870
 
885
 
871
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing) {
886
SEXP sdf_sort_variable(SEXP svec, SEXP decreasing) {
872
    char *iname, *iname_src, *varname_src, *type;
887
    char *iname, *iname_src, *varname_src, *type;
873
    sqlite3_stmt *stmt;
888
    sqlite3_stmt *stmt;
874
    int res;
889
    int res;
875
 
890
 
876
    iname_src = SDF_INAME(svec);
891
    iname_src = SDF_INAME(svec);
877
    varname_src = SVEC_VARNAME(svec);
892
    varname_src = SVEC_VARNAME(svec);
878
 
893
 
879
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
894
    if (!USE_SDF1(iname_src, TRUE)) return R_NilValue;
880
 
895
 
881
    /* determine type of svec */
896
    /* determine type of svec */
882
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data limit 1", varname_src, iname_src);
897
    sprintf(g_sql_buf[0], "select [%s] from [%s].sdf_data limit 1", varname_src, iname_src);
883
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
898
    res = sqlite3_prepare(g_workspace, g_sql_buf[0], -1, &stmt, 0);
884
    _sqlite_error(res);
899
    _sqlite_error(res);
885
    sqlite3_step(stmt);
900
    sqlite3_step(stmt);
886
    strcpy(g_sql_buf[0], sqlite3_column_decltype(stmt, 0));
901
    strcpy(g_sql_buf[0], sqlite3_column_decltype(stmt, 0));
887
    sqlite3_finalize(stmt);
902
    sqlite3_finalize(stmt);
888
 
903
 
889
    /* create a new vector of that type */
904
    /* create a new vector of that type */
890
    iname = _create_svector1(R_NilValue, g_sql_buf[0], NULL);
905
    iname = _create_svector1(R_NilValue, g_sql_buf[0], NULL);
891
 
906
 
892
    /* insert to new sdf ordered */
907
    /* insert to new sdf ordered */
893
    sprintf(g_sql_buf[0], "insert into [%s].sdf_data "
908
    sprintf(g_sql_buf[0], "insert into [%s].sdf_data "
894
            "select [row name], [%s] from [%s].sdf_data "
909
            "select [row name], [%s] from [%s].sdf_data "
895
            "order by [%s] %s", iname, varname_src, iname_src, varname_src,
910
            "order by [%s] %s", iname, varname_src, iname_src, varname_src,
896
            (LOGICAL(decreasing)[0]) ? "desc" : "asc");
911
            (LOGICAL(decreasing)[0]) ? "desc" : "asc");
897
    res = _sqlite_exec(g_sql_buf[0]);
912
    res = _sqlite_exec(g_sql_buf[0]);
898
    _sqlite_error(res);
913
    _sqlite_error(res);
899
 
914
 
900
    if (inherits(svec, "factor")) { /* copy factor table to iname */
915
    if (inherits(svec, "factor")) { /* copy factor table to iname */
901
        if (inherits(svec, "ordered")) type = "ordered";
916
        if (inherits(svec, "ordered")) type = "ordered";
902
        else type = "factor";
917
        else type = "factor";
903
        _copy_factor_levels2(type, iname_src, varname_src, iname, "V1");
918
        _copy_factor_levels2(type, iname_src, varname_src, iname, "V1");
904
    } else type = CHAR_ELT(GET_CLASS(svec), 1);
919
    } else type = CHAR_ELT(GET_CLASS(svec), 1);
905
 
920
 
906
    return _create_svector_sexp(iname, "V1", type);
921
    return _create_svector_sexp(iname, "V1", type);
907
}
922
}
908
 
923
 
909
/****************************************************************************
924
/****************************************************************************
910
 * VECTOR MATH/OPS/GROUP OPERATIONS
925
 * VECTOR MATH/OPS/GROUP OPERATIONS
911
 ****************************************************************************/
926
 ****************************************************************************/
912
 
927
 
913
int __vecmath_checkarg(sqlite3_context *ctx, sqlite3_value *arg, double *value) {
928
int __vecmath_checkarg(sqlite3_context *ctx, sqlite3_value *arg, double *value) {
914
    int ret = 1;
929
    int ret = 1;
915
    if (sqlite3_value_type(arg) == SQLITE_NULL) { 
930
    if (sqlite3_value_type(arg) == SQLITE_NULL) { 
916
        sqlite3_result_null(ctx); 
931
        sqlite3_result_null(ctx); 
917
        ret = 0;
932
        ret = 0;
918
    } else {
933
    } else {
919
        if (sqlite3_value_type(arg) == SQLITE_INTEGER) 
934
        if (sqlite3_value_type(arg) == SQLITE_INTEGER) 
920
            *value = sqlite3_value_int(arg); 
935
            *value = sqlite3_value_int(arg); 
921
        else *value = sqlite3_value_double(arg); 
936
        else *value = sqlite3_value_double(arg); 
922
    }
937
    }
923
    return ret;
938
    return ret;
924
}
939
}
925
 
940
 
926
#define SQLITE_MATH_FUNC1(name, func) static void __vecmath_ ## name(\
941
#define SQLITE_MATH_FUNC1(name, func) static void __vecmath_ ## name(\
927
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
942
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
928
    double value; \
943
    double value; \
929
    if (__vecmath_checkarg(ctx, argv[0], &value)) { \
944
    if (__vecmath_checkarg(ctx, argv[0], &value)) { \
930
        sqlite3_result_double(ctx, func(value)); \
945
        sqlite3_result_double(ctx, func(value)); \
931
    }  \
946
    }  \
932
}
947
}
933
 
948
 
934
#define SQLITE_MATH_FUNC_CUM(name, func) static void __vecmath_ ## name(\
949
#define SQLITE_MATH_FUNC_CUM(name, func) static void __vecmath_ ## name(\
935
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
950
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
936
    double value; \
951
    double value; \
937
    if (__vecmath_checkarg(ctx, argv[0], &value)) { \
952
    if (__vecmath_checkarg(ctx, argv[0], &value)) { \
938
        if (g_start) { g_start = 0; g_accumulator = value; } \
953
        if (g_start) { g_start = 0; g_accumulator = value; } \
939
        else g_accumulator = func(g_accumulator, value); \
954
        else g_accumulator = func(g_accumulator, value); \
940
        sqlite3_result_double(ctx, g_accumulator); \
955
        sqlite3_result_double(ctx, g_accumulator); \
941
    }  \
956
    }  \
942
}
957
}
943
 
958
 
944
/* SQLITE_MATH_FUNC1(abs, abs)   in SQLite */
959
/* SQLITE_MATH_FUNC1(abs, abs)   in SQLite */
945
SQLITE_MATH_FUNC1(sign, sign)   /* in R */
960
SQLITE_MATH_FUNC1(sign, sign)   /* in R */
946
SQLITE_MATH_FUNC1(sqrt, sqrt)
961
SQLITE_MATH_FUNC1(sqrt, sqrt)
947
SQLITE_MATH_FUNC1(floor, floor)
962
SQLITE_MATH_FUNC1(floor, floor)
948
SQLITE_MATH_FUNC1(ceiling, ceil)
963
SQLITE_MATH_FUNC1(ceiling, ceil)
949
SQLITE_MATH_FUNC1(trunc, ftrunc) /* in R */
964
SQLITE_MATH_FUNC1(trunc, ftrunc) /* in R */
950
/* SQLITE_MATH_FUNC1(round, )   in SQLite */
965
/* SQLITE_MATH_FUNC1(round, )   in SQLite */
951
/* SQLITE_MATH_FUNC1(signif, ) 2 arg */
966
/* SQLITE_MATH_FUNC1(signif, ) 2 arg */
952
SQLITE_MATH_FUNC1(exp, exp)
967
SQLITE_MATH_FUNC1(exp, exp)
953
/* SQLITE_MATH_FUNC1(log, ) 2 arg */
968
/* SQLITE_MATH_FUNC1(log, ) 2 arg */
954
SQLITE_MATH_FUNC1(cos, cos)
969
SQLITE_MATH_FUNC1(cos, cos)
955
SQLITE_MATH_FUNC1(sin, sin)
970
SQLITE_MATH_FUNC1(sin, sin)
956
SQLITE_MATH_FUNC1(tan, tan)
971
SQLITE_MATH_FUNC1(tan, tan)
957
SQLITE_MATH_FUNC1(acos, acos)
972
SQLITE_MATH_FUNC1(acos, acos)
958
SQLITE_MATH_FUNC1(asin, asin)
973
SQLITE_MATH_FUNC1(asin, asin)
959
SQLITE_MATH_FUNC1(atan, atan)
974
SQLITE_MATH_FUNC1(atan, atan)
960
SQLITE_MATH_FUNC1(cosh, cosh)
975
SQLITE_MATH_FUNC1(cosh, cosh)
961
SQLITE_MATH_FUNC1(sinh, sinh)
976
SQLITE_MATH_FUNC1(sinh, sinh)
962
SQLITE_MATH_FUNC1(tanh, tanh)
977
SQLITE_MATH_FUNC1(tanh, tanh)
963
SQLITE_MATH_FUNC1(acosh, acosh)  /* nowhere in include?? */
978
SQLITE_MATH_FUNC1(acosh, acosh)  /* nowhere in include?? */
964
SQLITE_MATH_FUNC1(asinh, asinh)  /* nowhere in include?? */
979
SQLITE_MATH_FUNC1(asinh, asinh)  /* nowhere in include?? */
965
SQLITE_MATH_FUNC1(atanh, atanh)  /* nowhere in include?? */
980
SQLITE_MATH_FUNC1(atanh, atanh)  /* nowhere in include?? */
966
SQLITE_MATH_FUNC1(lgamma, lgammafn) /* in R */
981
SQLITE_MATH_FUNC1(lgamma, lgammafn) /* in R */
967
SQLITE_MATH_FUNC1(gamma, gammafn) /* in R */
982
SQLITE_MATH_FUNC1(gamma, gammafn) /* in R */
968
/* SQLITE_MATH_FUNC1(gammaCody, gammaCody)   * in R ?? */
983
/* SQLITE_MATH_FUNC1(gammaCody, gammaCody)   * in R ?? */
969
SQLITE_MATH_FUNC1(digamma, digamma) /* in R */    
984
SQLITE_MATH_FUNC1(digamma, digamma) /* in R */    
970
SQLITE_MATH_FUNC1(trigamma, trigamma) /* in R */
985
SQLITE_MATH_FUNC1(trigamma, trigamma) /* in R */
971
 
986
 
972
#define SUM(a, b)  (a) + (b)
987
#define SUM(a, b)  (a) + (b)
973
#define PROD(a, b) (a) * (b)
988
#define PROD(a, b) (a) * (b)
974
#define MIN(a, b) ((a) <= (b)) ? (a) : (b)
989
#define MIN(a, b) ((a) <= (b)) ? (a) : (b)
975
#define MAX(a, b) ((a) >= (b)) ? (a) : (b)
990
#define MAX(a, b) ((a) >= (b)) ? (a) : (b)
976
#define ALL(a, b) (((a) == 0) || ((b) == 0)) ? 0 : 1
991
#define ALL(a, b) (((a) == 0) || ((b) == 0)) ? 0 : 1
977
#define ANY(a, b) (((a) == 0) && ((b) == 0)) ? 0 : 1
992
#define ANY(a, b) (((a) == 0) && ((b) == 0)) ? 0 : 1
978
 
993
 
979
SQLITE_MATH_FUNC_CUM(cumsum, SUM)
994
SQLITE_MATH_FUNC_CUM(cumsum, SUM)
980
SQLITE_MATH_FUNC_CUM(cumprod, PROD)
995
SQLITE_MATH_FUNC_CUM(cumprod, PROD)
981
SQLITE_MATH_FUNC_CUM(cummin, MIN)
996
SQLITE_MATH_FUNC_CUM(cummin, MIN)
982
SQLITE_MATH_FUNC_CUM(cummax, MAX)
997
SQLITE_MATH_FUNC_CUM(cummax, MAX)
983
 
998
 
984
#define SQLITE_SUMMARY_FUNC(name, func) static void __vecsummary_ ## name(\
999
#define SQLITE_SUMMARY_FUNC(name, func) static void __vecsummary_ ## name(\
985
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
1000
        sqlite3_context *ctx, int argc, sqlite3_value **argv) { \
986
    double value; \
1001
    double value; \
987
    if (!g_narm && R_IsNA(g_accumulator)) return; /* NA if na.rm=F & NA found */ \
1002
    if (!g_narm && R_IsNA(g_accumulator)) return; /* NA if na.rm=F & NA found */ \
988
    if (sqlite3_value_type(argv[0]) != SQLITE_NULL) {  \
1003
    if (sqlite3_value_type(argv[0]) != SQLITE_NULL) {  \
989
        if (sqlite3_value_type(argv[0]) == SQLITE_INTEGER) {  \
1004
        if (sqlite3_value_type(argv[0]) == SQLITE_INTEGER) {  \
990
            int tmp = sqlite3_value_int(argv[0]); \
1005
            int tmp = sqlite3_value_int(argv[0]); \
991
            value = (tmp == NA_INTEGER) ? R_NaReal : tmp; \
1006
            value = (tmp == NA_INTEGER) ? R_NaReal : tmp; \
992
        } else value = sqlite3_value_double(argv[0]);  \
1007
        } else value = sqlite3_value_double(argv[0]);  \
993
        if (R_IsNA(value)) { \
1008
        if (R_IsNA(value)) { \
994
            if (!g_narm) g_accumulator = value; return; \
1009
            if (!g_narm) g_accumulator = value; return; \
995
        } else if (g_start) { g_start = 0; g_accumulator = value; } \
1010
        } else if (g_start) { g_start = 0; g_accumulator = value; } \
996
        else g_accumulator = func(g_accumulator, value); \
1011
        else g_accumulator = func(g_accumulator, value); \
997
    } \
1012
    } \
998
}
1013
}
999
 
1014
 
1000
SQLITE_SUMMARY_FUNC(all_df, ALL)
1015
SQLITE_SUMMARY_FUNC(all_df, ALL)
1001
SQLITE_SUMMARY_FUNC(any_df, ANY)
1016
SQLITE_SUMMARY_FUNC(any_df, ANY)
1002
SQLITE_SUMMARY_FUNC(sum_df, SUM)
1017
SQLITE_SUMMARY_FUNC(sum_df, SUM)
1003
SQLITE_SUMMARY_FUNC(prod_df, PROD)
1018
SQLITE_SUMMARY_FUNC(prod_df, PROD)
1004
SQLITE_SUMMARY_FUNC(min_df, MIN)
1019
SQLITE_SUMMARY_FUNC(min_df, MIN)
1005
SQLITE_SUMMARY_FUNC(max_df, MAX)
1020
SQLITE_SUMMARY_FUNC(max_df, MAX)
1006
 
1021
 
1007
static void __vecsummary_finalize(sqlite3_context *ctx) {
1022
static void __vecsummary_finalize(sqlite3_context *ctx) {
1008
    /* g_accumulator already summarizes it. just return that */
1023
    /* g_accumulator already summarizes it. just return that */
1009
    sqlite3_result_double(ctx, g_accumulator);
1024
    sqlite3_result_double(ctx, g_accumulator);
1010
}
1025
}
1011
 
1026
 
1012
#define VMENTRY1(func)  {#func, __vecmath_ ## func}
1027
#define VMENTRY1(func)  {#func, __vecmath_ ## func}
1013
#define VSENTRY1(func)  {#func, __vecsummary_ ## func}
1028
#define VSENTRY1(func)  {#func, __vecsummary_ ## func}
1014
void __register_vector_math() {
1029
void __register_vector_math() {
1015
    int i, res;
1030
    int i, res;
1016
    static const struct {
1031
    static const struct {
1017
        char *name;
1032
        char *name;
1018
        void (*func)(sqlite3_context*, int, sqlite3_value**);
1033
        void (*func)(sqlite3_context*, int, sqlite3_value**);
1019
    } arr_func1[] = {
1034
    } arr_func1[] = {
1020
        VMENTRY1(sign),
1035
        VMENTRY1(sign),
1021
        VMENTRY1(sqrt),
1036
        VMENTRY1(sqrt),
1022
        VMENTRY1(floor),
1037
        VMENTRY1(floor),
1023
        VMENTRY1(ceiling),
1038
        VMENTRY1(ceiling),
1024
        VMENTRY1(trunc),
1039
        VMENTRY1(trunc),
1025
        VMENTRY1(exp),
1040
        VMENTRY1(exp),
1026
        VMENTRY1(cos),
1041
        VMENTRY1(cos),
1027
        VMENTRY1(sin),
1042
        VMENTRY1(sin),
1028
        VMENTRY1(tan),
1043
        VMENTRY1(tan),
1029
        VMENTRY1(acos),
1044
        VMENTRY1(acos),
1030
        VMENTRY1(asin),
1045
        VMENTRY1(asin),
1031
        VMENTRY1(atan),
1046
        VMENTRY1(atan),
1032
        VMENTRY1(cosh),
1047
        VMENTRY1(cosh),
1033
        VMENTRY1(sinh),
1048
        VMENTRY1(sinh),
1034
        VMENTRY1(tanh),
1049
        VMENTRY1(tanh),
1035
        VMENTRY1(acosh),
1050
        VMENTRY1(acosh),
1036
        VMENTRY1(asinh),
1051
        VMENTRY1(asinh),
1037
        VMENTRY1(atanh),
1052
        VMENTRY1(atanh),
1038
        VMENTRY1(lgamma),
1053
        VMENTRY1(lgamma),
1039
        VMENTRY1(gamma),
1054
        VMENTRY1(gamma),
1040
        VMENTRY1(digamma),
1055
        VMENTRY1(digamma),
1041
        VMENTRY1(trigamma),
1056
        VMENTRY1(trigamma),
1042
        VMENTRY1(cumsum),
1057
        VMENTRY1(cumsum),
1043
        VMENTRY1(cumprod),
1058
        VMENTRY1(cumprod),
1044
        VMENTRY1(cummin),
1059
        VMENTRY1(cummin),
1045
        VMENTRY1(cummax)
1060
        VMENTRY1(cummax)
1046
    }, arr_sum1[] = {
1061
    }, arr_sum1[] = {
1047
        VSENTRY1(all_df),  /* can't override sum, min, max */
1062
        VSENTRY1(all_df),  /* can't override sum, min, max */
1048
        VSENTRY1(any_df),
1063
        VSENTRY1(any_df),
1049
        VSENTRY1(sum_df),
1064
        VSENTRY1(sum_df),
1050
        VSENTRY1(prod_df),
1065
        VSENTRY1(prod_df),
1051
        VSENTRY1(min_df),
1066
        VSENTRY1(min_df),
1052
        VSENTRY1(max_df)
1067
        VSENTRY1(max_df)
1053
    };
1068
    };
1054
 
1069
 
1055
    int len = sizeof(arr_func1) / sizeof(arr_func1[0]);
1070
    int len = sizeof(arr_func1) / sizeof(arr_func1[0]);
1056
 
1071
 
1057
    for (i = 0; i < len; i++) {
1072
    for (i = 0; i < len; i++) {
1058
        res = sqlite3_create_function(g_workspace, arr_func1[i].name, 1, 
1073
        res = sqlite3_create_function(g_workspace, arr_func1[i].name, 1, 
1059
                SQLITE_ANY, NULL, arr_func1[i].func, NULL, NULL);
1074
                SQLITE_ANY, NULL, arr_func1[i].func, NULL, NULL);
1060
        _sqlite_error(res);
1075
        _sqlite_error(res);
1061
    }
1076
    }
1062
 
1077
 
1063
    len = sizeof(arr_sum1) / sizeof(arr_sum1[0]);
1078
    len = sizeof(arr_sum1) / sizeof(arr_sum1[0]);
1064
    for (i = 0; i < len; i++) {
1079
    for (i = 0; i < len; i++) {
1065
        res = sqlite3_create_function(g_workspace, arr_sum1[i].name, 1, 
1080
        res = sqlite3_create_function(g_workspace, arr_sum1[i].name, 1, 
1066
                SQLITE_ANY, NULL, NULL, arr_sum1[i].func, __vecsummary_finalize);
1081
                SQLITE_ANY, NULL, NULL, arr_sum1[i].func, __vecsummary_finalize);
1067
        _sqlite_error(res);
1082
        _sqlite_error(res);
1068
    }
1083
    }
1069
}
1084
}