decimal_to_str(lng v, sql_subtype *t) #endif { char buf[64]; int scale = t->scale, cur = 63, neg = (v<0), i, done = 0; if (v<0) v = -v; buf[cur--] = 0; if (scale){ for (i=0; i<scale; i++) { buf[cur--] = (char) (v%10 + '0'); v /= 10; } buf[cur--] = '.'; } while (v) { buf[cur--] = (char ) (v%10 + '0'); v /= 10; done = 1; } if (!done) buf[cur--] = '0'; if (neg) buf[cur--] = '-'; assert(cur >= -1); return _STRDUP(buf+cur+1); }
void stack_set_string(mvc *sql, const char *name, const char *val) { ValRecord *v = stack_get_var(sql, name); if (v != NULL) { if (v->val.sval) _DELETE(v->val.sval); v->val.sval = _STRDUP(val); } }
str SQLcompile(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { str *ret = getArgReference_str(stk, pci, 0); str *expr = getArgReference_str(stk, pci, 1); str msg; (void) mb; *ret = NULL; msg = SQLstatementIntern(cntxt, expr, "SQLcompile", FALSE, FALSE, NULL); if (msg == MAL_SUCCEED) *ret = _STRDUP("SQLcompile"); return msg; }
void stack_push_rel_view(mvc *sql, char *name, sql_rel *var) { if (sql->topvars == sql->sizevars) { sql->sizevars <<= 1; sql->vars = RENEW_ARRAY(sql_var,sql->vars,sql->sizevars); } sql->vars[sql->topvars].s = var; sql->vars[sql->topvars].name = _STRDUP(name); sql->vars[sql->topvars].value.vtype = 0; sql->vars[sql->topvars].view = 1; sql->vars[sql->topvars].type.comp_type = NULL; sql->topvars++; }
char * propvalue2string( prop *p) { char buf [BUFSIZ]; if (p->value) { switch(p->kind) { case PROP_JOINIDX: { sql_idx *i = p->value; snprintf(buf, BUFSIZ, "%s.%s.%s", i->t->s->base.name, i->t->base.name, i->base.name); return _STRDUP(buf); } case PROP_REMOTE: { char *uri = p->value; return _STRDUP(uri); } default: break; } } return ""; }
void stack_push_rel_var(mvc *sql, char *name, sql_rel *var, sql_subtype *type) { if (sql->topvars == sql->sizevars) { sql->sizevars <<= 1; sql->vars = RENEW_ARRAY(sql_var,sql->vars,sql->sizevars); } sql->vars[sql->topvars].s = rel_dup(var); sql->vars[sql->topvars].name = _STRDUP(name); sql->vars[sql->topvars].value.vtype = 0; sql->vars[sql->topvars].type = *type; assert(sql->vars[sql->topvars].type.comp_type != NULL); sql->vars[sql->topvars].view = 0; sql->topvars++; }
int mvc_set_schema(mvc *m, char *schema) { int ret = 0; sql_schema *s = find_sql_schema(m->session->tr, schema); if (s) { if (m->session->schema_name) _DELETE(m->session->schema_name); m->session->schema_name = _STRDUP(schema); m->type = Q_TRANS; if (m->session->active) m->session->schema = s; ret = 1; } return ret; }
void stack_push_frame(mvc *sql, char *name) { if (sql->topvars == sql->sizevars) { sql->sizevars <<= 1; sql->vars = RENEW_ARRAY(sql_var,sql->vars,sql->sizevars); } sql->vars[sql->topvars].s = NULL; sql->vars[sql->topvars].name = NULL; sql->vars[sql->topvars].value.vtype = 0; sql->vars[sql->topvars].view = 0; sql->vars[sql->topvars].type.comp_type = NULL; if (name) sql->vars[sql->topvars].name = _STRDUP(name); sql->topvars++; sql->frame++; }
/* variable management */ static void stack_set(mvc *sql, int var, const char *name, sql_subtype *type, sql_rel *rel, sql_table *t, int view, int frame) { sql_var *v; if (var == sql->sizevars) { sql->sizevars <<= 1; sql->vars = RENEW_ARRAY(sql_var,sql->vars,sql->sizevars); } v = sql->vars+var; v->name = NULL; v->value.vtype = 0; v->rel = rel; v->t = t; v->view = view; v->frame = frame; v->type.type = NULL; if (type) { int tpe = type->type->localtype; VALinit(&sql->vars[var].value, tpe, ATOMnilptr(tpe)); v->type = *type; } if (name) v->name = _STRDUP(name); }
int main() { list *l = list_create(NULL); printf("0 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("niels")); printf("1 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("nes")); printf("1 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("lilian")); printf("1 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("nes")); printf("1 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("max")); printf("1 list_length %d\n", list_length(l)); list_append_string(l, _STRDUP("nes")); printf("1 list_length %d\n", list_length(l)); list_traverse(l, print_data, NULL); printf("\n"); list_traverse(l, destroy_data, NULL); list_destroy(l); }
str SQLinitClient(Client c) { mvc *m; str schema; str msg = MAL_SUCCEED; backend *be; bstream *bfd = NULL; stream *fd = NULL; static int maybeupgrade = 1; #ifdef _SQL_SCENARIO_DEBUG mnstr_printf(GDKout, "#SQLinitClient\n"); #endif if (SQLinitialized == 0 && (msg = SQLprelude(NULL)) != MAL_SUCCEED) return msg; MT_lock_set(&sql_contextLock); /* * Based on the initialization return value we can prepare a SQLinit * string with all information needed to initialize the catalog * based on the mandatory scripts to be executed. */ if (sqlinit) { /* add sqlinit to the fdin stack */ buffer *b = (buffer *) GDKmalloc(sizeof(buffer)); size_t len = strlen(sqlinit); bstream *fdin; buffer_init(b, _STRDUP(sqlinit), len); fdin = bstream_create(buffer_rastream(b, "si"), b->len); bstream_next(fdin); MCpushClientInput(c, fdin, 0, ""); } if (c->sqlcontext == 0) { m = mvc_create(c->idx, 0, SQLdebug, c->fdin, c->fdout); global_variables(m, "monetdb", "sys"); if (isAdministrator(c) || strcmp(c->scenario, "msql") == 0) /* console should return everything */ m->reply_size = -1; be = (void *) backend_create(m, c); } else { be = c->sqlcontext; m = be->mvc; mvc_reset(m, c->fdin, c->fdout, SQLdebug, NR_GLOBAL_VARS); backend_reset(be); } if (m->session->tr) reset_functions(m->session->tr); /* pass through credentials of the user if not console */ schema = monet5_user_set_def_schema(m, c->user); if (!schema) { _DELETE(schema); throw(PERMD, "SQLinitClient", "08004!schema authorization error"); } _DELETE(schema); /*expect SQL text first */ be->language = 'S'; /* Set state, this indicates an initialized client scenario */ c->state[MAL_SCENARIO_READER] = c; c->state[MAL_SCENARIO_PARSER] = c; c->state[MAL_SCENARIO_OPTIMIZE] = c; c->sqlcontext = be; initSQLreferences(); /* initialize the database with predefined SQL functions */ if (SQLnewcatalog == 0) { /* check whether table sys.systemfunctions exists: if * it doesn't, this is probably a restart of the * server after an incomplete initialization */ sql_schema *s = mvc_bind_schema(m, "sys"); sql_table *t = s ? mvc_bind_table(m, s, "systemfunctions") : NULL; if (t == NULL) SQLnewcatalog = 1; } if (SQLnewcatalog > 0) { char path[PATHLENGTH]; str fullname; SQLnewcatalog = 0; maybeupgrade = 0; snprintf(path, PATHLENGTH, "createdb"); slash_2_dir_sep(path); fullname = MSP_locate_sqlscript(path, 1); if (fullname) { str filename = fullname; str p, n; fprintf(stdout, "# SQL catalog created, loading sql scripts once\n"); do { p = strchr(filename, PATH_SEP); if (p) *p = '\0'; if ((n = strrchr(filename, DIR_SEP)) == NULL) { n = filename; } else { n++; } fprintf(stdout, "# loading sql script: %s\n", n); fd = open_rastream(filename); if (p) filename = p + 1; if (fd) { size_t sz; sz = getFileSize(fd); if (sz > (size_t) 1 << 29) { mnstr_destroy(fd); msg = createException(MAL, "createdb", "file %s too large to process", filename); } else { bfd = bstream_create(fd, sz == 0 ? (size_t) (128 * BLOCK) : sz); if (bfd && bstream_next(bfd) >= 0) msg = SQLstatementIntern(c, &bfd->buf, "sql.init", TRUE, FALSE, NULL); bstream_destroy(bfd); } if (m->sa) sa_destroy(m->sa); m->sa = NULL; if (msg) p = NULL; } } while (p); GDKfree(fullname); } else fprintf(stderr, "!could not read createdb.sql\n"); } else { /* handle upgrades */ if (!m->sa) m->sa = sa_create(); if (maybeupgrade) SQLupgrades(c,m); maybeupgrade = 0; } MT_lock_unset(&sql_contextLock); fflush(stdout); fflush(stderr); /* send error from create scripts back to the first client */ if (msg) { error(c->fdout, msg); handle_error(m, c->fdout, 0); sqlcleanup(m, mvc_status(m)); } return msg; }
static sql_rel * rel_create_func(mvc *sql, dlist *qname, dlist *params, symbol *res, dlist *ext_name, dlist *body, int type, int lang) { char *fname = qname_table(qname); char *sname = qname_schema(qname); sql_schema *s = NULL; sql_func *f = NULL; sql_subfunc *sf; dnode *n; list *type_list = NULL, *restype = NULL; int instantiate = (sql->emode == m_instantiate); int deps = (sql->emode == m_deps); int create = (!instantiate && !deps); bit vararg = FALSE; char is_table = (res && res->token == SQL_TABLE); char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char *F = is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE"); char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": ""; assert(res || type == F_PROC || type == F_FILT); if (is_table) type = F_UNION; if (STORE_READONLY && create) return sql_error(sql, 06, "schema statements cannot be executed on a readonly database."); if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, "3F000!CREATE %s%s: no such schema '%s'", KF, F, sname); if (s == NULL) s = cur_schema(sql); type_list = create_type_list(sql, params, 1); if ((sf = sql_bind_func_(sql->sa, s, fname, type_list, type)) != NULL && create) { if (params) { char *arg_list = NULL; node *n; for (n = type_list->h; n; n = n->next) { char *tpe = subtype2string((sql_subtype *) n->data); if (arg_list) { arg_list = sql_message("%s, %s", arg_list, tpe); _DELETE(tpe); } else { arg_list = tpe; } } (void)sql_error(sql, 02, "CREATE %s%s: name '%s' (%s) already in use", KF, F, fname, arg_list); _DELETE(arg_list); list_destroy(type_list); return NULL; } else { list_destroy(type_list); return sql_error(sql, 02, "CREATE %s%s: name '%s' already in use", KF, F, fname); } } else { list_destroy(type_list); if (create && !schema_privs(sql->role_id, s)) { return sql_error(sql, 02, "CREATE %s%s: insufficient privileges " "for user '%s' in schema '%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name); } else { char *q = QUERY(sql->scanner); list *l = NULL; if (params) { for (n = params->h; n; n = n->next) { dnode *an = n->data.lval->h; sql_add_param(sql, an->data.sval, &an->next->data.typeval); } l = sql->params; if (l && list_length(l) == 1) { sql_arg *a = l->h->data; if (strcmp(a->name, "*") == 0) { l = NULL; vararg = TRUE; } } } if (!l) l = sa_list(sql->sa); if (res) { restype = result_type(sql, res); if (!restype) return sql_error(sql, 01, "CREATE %s%s: failed to get restype", KF, F); } if (body && lang > FUNC_LANG_SQL) { char *lang_body = body->h->data.sval; char *mod = (lang == FUNC_LANG_R)?"rapi": (lang == FUNC_LANG_C)?"capi": (lang == FUNC_LANG_J)?"japi":"unknown"; sql->params = NULL; if (create) { f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, mod, fname, lang_body, FALSE, vararg); } else if (!sf) { return sql_error(sql, 01, "CREATE %s%s: R function %s.%s not bound", KF, F, s->base.name, fname ); } else { sql_func *f = sf->func; f->mod = _STRDUP("rapi"); f->imp = _STRDUP("eval"); if (res && restype) f->res = restype; f->sql = 0; /* native */ f->lang = FUNC_LANG_INT; } } else if (body) { sql_arg *ra = (restype && !is_table)?restype->h->data:NULL; list *b = NULL; sql_schema *old_schema = cur_schema(sql); sql->session->schema = s; b = sequential_block(sql, (ra)?&ra->type:NULL, ra?NULL:restype, body, NULL, is_func); sql->session->schema = old_schema; sql->params = NULL; if (!b) return NULL; /* check if we have a return statement */ if (is_func && restype && !has_return(b)) { return sql_error(sql, 01, "CREATE %s%s: missing return statement", KF, F); } if (!is_func && !restype && has_return(b)) { return sql_error(sql, 01, "CREATE %s%s: procedures " "cannot have return statements", KF, F); } /* in execute mode we instantiate the function */ if (instantiate || deps) { return rel_psm_block(sql->sa, b); } else if (create) { f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg); } } else { char *fmod = qname_module(ext_name); char *fnme = qname_fname(ext_name); if (!fmod || !fnme) return NULL; sql->params = NULL; if (create) { f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, fmod, fnme, q, FALSE, vararg); } else if (!sf) { return sql_error(sql, 01, "CREATE %s%s: external name %s.%s not bound (%s,%s)", KF, F, fmod, fnme, s->base.name, fname ); } else { sql_func *f = sf->func; f->mod = _STRDUP(fmod); f->imp = _STRDUP(fnme); f->sql = 0; /* native */ f->lang = FUNC_LANG_INT; } } } } return rel_create_function(sql->sa, s->base.name, f); }
static sql_rel * rel_create_func(mvc *sql, dlist *qname, dlist *params, symbol *res, dlist *ext_name, dlist *body, int type, int lang, int replace) { const char *fname = qname_table(qname); const char *sname = qname_schema(qname); sql_schema *s = NULL; sql_func *f = NULL; sql_subfunc *sf; dnode *n; list *type_list = NULL, *restype = NULL; int instantiate = (sql->emode == m_instantiate); int deps = (sql->emode == m_deps); int create = (!instantiate && !deps); bit vararg = FALSE; char is_table = (res && res->token == SQL_TABLE); char is_aggr = (type == F_AGGR); char is_func = (type != F_PROC); char is_loader = (type == F_LOADER); char *F = is_loader?"LOADER":(is_aggr?"AGGREGATE":(is_func?"FUNCTION":"PROCEDURE")); char *fn = is_loader?"loader":(is_aggr ? "aggregate" : (is_func ? "function" : "procedure")); char *KF = type==F_FILT?"FILTER ": type==F_UNION?"UNION ": ""; char *kf = type == F_FILT ? "filter " : type == F_UNION ? "union " : ""; assert(res || type == F_PROC || type == F_FILT || type == F_LOADER); if (is_table) type = F_UNION; if (STORE_READONLY && create) return sql_error(sql, 06, SQLSTATE(42000) "Schema statements cannot be executed on a readonly database."); if (sname && !(s = mvc_bind_schema(sql, sname))) return sql_error(sql, 02, SQLSTATE(3F000) "CREATE %s%s: no such schema '%s'", KF, F, sname); if (s == NULL) s = cur_schema(sql); type_list = create_type_list(sql, params, 1); if ((sf = sql_bind_func_(sql->sa, s, fname, type_list, type)) != NULL && create) { if (replace) { sql_func *func = sf->func; int action = 0; if (!mvc_schema_privs(sql, s)) { return sql_error(sql, 02, SQLSTATE(42000) "CREATE OR REPLACE %s%s: access denied for %s to schema ;'%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name); } if (mvc_check_dependency(sql, func->base.id, !IS_PROC(func) ? FUNC_DEPENDENCY : PROC_DEPENDENCY, NULL)) return sql_error(sql, 02, SQLSTATE(42000) "CREATE OR REPLACE %s%s: there are database objects dependent on %s%s %s;", KF, F, kf, fn, func->base.name); if (!func->s) { return sql_error(sql, 02, SQLSTATE(42000) "CREATE OR REPLACE %s%s: not allowed to replace system %s%s %s;", KF, F, kf, fn, func->base.name); } if(mvc_drop_func(sql, s, func, action)) return sql_error(sql, 02, SQLSTATE(HY001) MAL_MALLOC_FAIL); sf = NULL; } else { if (params) { char *arg_list = NULL; node *n; for (n = type_list->h; n; n = n->next) { char *tpe = subtype2string((sql_subtype *) n->data); if (arg_list) { char *t = arg_list; arg_list = sql_message("%s, %s", arg_list, tpe); _DELETE(t); _DELETE(tpe); } else { arg_list = tpe; } } (void)sql_error(sql, 02, SQLSTATE(42000) "CREATE %s%s: name '%s' (%s) already in use", KF, F, fname, arg_list); _DELETE(arg_list); list_destroy(type_list); return NULL; } else { list_destroy(type_list); return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s%s: name '%s' already in use", KF, F, fname); } } } list_destroy(type_list); if (create && !mvc_schema_privs(sql, s)) { return sql_error(sql, 02, SQLSTATE(42000) "CREATE %s%s: insufficient privileges " "for user '%s' in schema '%s'", KF, F, stack_get_string(sql, "current_user"), s->base.name); } else { char *q = QUERY(sql->scanner); list *l = NULL; if (params) { for (n = params->h; n; n = n->next) { dnode *an = n->data.lval->h; sql_add_param(sql, an->data.sval, &an->next->data.typeval); } l = sql->params; if (l && list_length(l) == 1) { sql_arg *a = l->h->data; if (strcmp(a->name, "*") == 0) { l = NULL; vararg = TRUE; } } } if (!l) l = sa_list(sql->sa); if (res) { restype = result_type(sql, res); if (!restype) return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s%s: failed to get restype", KF, F); } if (body && lang > FUNC_LANG_SQL) { char *lang_body = body->h->data.sval; char *mod = (lang == FUNC_LANG_R)?"rapi": (lang == FUNC_LANG_C || lang == FUNC_LANG_CPP)?"capi": (lang == FUNC_LANG_J)?"japi": (lang == FUNC_LANG_PY)?"pyapi": (lang == FUNC_LANG_MAP_PY)?"pyapimap":"unknown"; sql->params = NULL; if (create) { f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, mod, fname, lang_body, (type == F_LOADER)?TRUE:FALSE, vararg, FALSE); } else if (!sf) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s%s: R function %s.%s not bound", KF, F, s->base.name, fname ); } /*else { sql_func *f = sf->func; f->mod = _STRDUP("rapi"); f->imp = _STRDUP("eval"); if (res && restype) f->res = restype; f->sql = 0; f->lang = FUNC_LANG_INT; }*/ } else if (body) { sql_arg *ra = (restype && !is_table)?restype->h->data:NULL; list *b = NULL; sql_schema *old_schema = cur_schema(sql); if (create) { /* needed for recursive functions */ q = query_cleaned(q); sql->forward = f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, "user", q, q, FALSE, vararg, FALSE); GDKfree(q); } sql->session->schema = s; b = sequential_block(sql, (ra)?&ra->type:NULL, ra?NULL:restype, body, NULL, is_func); sql->forward = NULL; sql->session->schema = old_schema; sql->params = NULL; if (!b) return NULL; /* check if we have a return statement */ if (is_func && restype && !has_return(b)) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s%s: missing return statement", KF, F); } if (!is_func && !restype && has_return(b)) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s%s: procedures " "cannot have return statements", KF, F); } /* in execute mode we instantiate the function */ if (instantiate || deps) { return rel_psm_block(sql->sa, b); } } else { char *fmod = qname_module(ext_name); char *fnme = qname_fname(ext_name); if (!fmod || !fnme) return NULL; sql->params = NULL; if (create) { q = query_cleaned(q); f = mvc_create_func(sql, sql->sa, s, fname, l, restype, type, lang, fmod, fnme, q, FALSE, vararg, FALSE); GDKfree(q); } else if (!sf) { return sql_error(sql, 01, SQLSTATE(42000) "CREATE %s%s: external name %s.%s not bound (%s.%s)", KF, F, fmod, fnme, s->base.name, fname ); } else { sql_func *f = sf->func; if (!f->mod || strcmp(f->mod, fmod)) f->mod = _STRDUP(fmod); if (!f->imp || strcmp(f->imp, fnme)) f->imp = (f->sa)?sa_strdup(f->sa, fnme):_STRDUP(fnme); if(!f->mod || !f->imp) { _DELETE(f->mod); _DELETE(f->imp); return sql_error(sql, 02, SQLSTATE(HY001) "CREATE %s%s: could not allocate space", KF, F); } f->sql = 0; /* native */ f->lang = FUNC_LANG_INT; } } } return rel_create_function(sql->sa, s->base.name, f); }
char * atom2sql(atom *a) { int ec = a->tpe.type->eclass; char buf[BUFSIZ]; if (a->data.vtype == TYPE_str && EC_INTERVAL(ec)) ec = EC_STRING; /* todo handle NULL's early */ switch (ec) { case EC_BIT: assert( a->data.vtype == TYPE_bit); if (a->data.val.btval) return _STRDUP("true"); return _STRDUP("false"); case EC_CHAR: case EC_STRING: assert (a->data.vtype == TYPE_str); if (a->data.val.sval) sprintf(buf, "'%s'", a->data.val.sval); else sprintf(buf, "NULL"); break; case EC_BLOB: /* TODO atom to string */ break; case EC_MONTH: case EC_SEC: { lng v; switch (a->data.vtype) { case TYPE_lng: v = a->data.val.lval; break; case TYPE_int: v = a->data.val.ival; break; case TYPE_sht: v = a->data.val.shval; break; case TYPE_bte: v = a->data.val.btval; break; default: v = 0; break; } switch (a->tpe.digits) { case 1: /* year */ v /= 12; break; case 2: /* year to month */ case 3: /* month */ break; case 4: /* day */ v /= 60 * 60 * 24; break; case 5: /* day to hour */ case 8: /* hour */ v /= 60 * 60; break; case 6: /* day to minute */ case 9: /* hour to minute */ case 11: /* minute */ v /= 60; break; case 7: /* day to second */ case 10: /* hour to second */ case 12: /* minute to second */ case 13: /* second */ break; } if (a->tpe.digits < 4) { sprintf(buf, LLFMT, v); } else { lng sec = v/1000; lng msec = v%1000; sprintf(buf, LLFMT "." LLFMT, sec, msec); } break; } case EC_NUM: switch (a->data.vtype) { #ifdef HAVE_HGE case TYPE_hge: { char *_buf = buf; int _bufsiz = BUFSIZ; hgeToStr(&_buf, &_bufsiz, &a->data.val.hval); break; } #endif case TYPE_lng: sprintf(buf, LLFMT, a->data.val.lval); break; case TYPE_int: sprintf(buf, "%d", a->data.val.ival); break; case TYPE_sht: sprintf(buf, "%d", a->data.val.shval); break; case TYPE_bte: sprintf(buf, "%d", a->data.val.btval); break; default: break; } break; case EC_DEC: { #ifdef HAVE_HGE hge v = 0; #else lng v = 0; #endif switch (a->data.vtype) { #ifdef HAVE_HGE case TYPE_hge: v = a->data.val.hval; break; #endif case TYPE_lng: v = a->data.val.lval; break; case TYPE_int: v = a->data.val.ival; break; case TYPE_sht: v = a->data.val.shval; break; case TYPE_bte: v = a->data.val.btval; break; default: break; } return decimal_to_str(v, &a->tpe); } case EC_FLT: if (a->data.vtype == TYPE_dbl) sprintf(buf, "%f", a->data.val.dval); else sprintf(buf, "%f", a->data.val.fval); break; case EC_TIME: case EC_DATE: case EC_TIMESTAMP: if (a->data.vtype == TYPE_str) { if (a->data.val.sval) sprintf(buf, "%s '%s'", a->tpe.type->sqlname, a->data.val.sval); else sprintf(buf, "NULL"); } break; default: snprintf(buf, BUFSIZ, "atom2sql(TYPE_%d) not implemented", a->data.vtype); } return _STRDUP(buf); }