static ValPtr SA_VALcopy(sql_allocator *sa, ValPtr d, ValPtr s) { if (!ATOMextern(s->vtype)) { *d = *s; } else if (s->val.pval == 0) { d->val.pval = ATOMnil(s->vtype); d->vtype = s->vtype; } else if (s->vtype == TYPE_str) { d->vtype = TYPE_str; d->val.sval = sa_strdup(sa, s->val.sval); d->len = strLen(d->val.sval); } else if (s->vtype == TYPE_bit) { d->vtype = s->vtype; d->len = 1; d->val.btval = s->val.btval; } else { ptr p = s->val.pval; d->vtype = s->vtype; d->len = ATOMlen(d->vtype, p); d->val.pval = sa_alloc(sa, d->len); memcpy(d->val.pval, p, d->len); } return d; }
char *str_tolower(const char* input) { if (!input) return NULL; size_t ilen = strlen(input); if (ilen < 1) return NULL; char *out = sa_alloc(ilen + 1); int i = 0; for (; i < ilen; ++i) { out[i] = tolower(input[i]); } out[i] = '\0'; return out; }
char *substring(const char* str, int beg_pos, int nc) { if (!str) { return NULL; } if (nc == 0) { return NULL; } size_t str_len = strlen(str); if (str_len < 1) { return NULL; } if (str_len < beg_pos + nc) { nc = str_len - beg_pos; } char *sub = sa_alloc(nc+1); strncpy(sub, str+beg_pos, nc); sub[nc] = '\0'; return sub; }
void *worker(void *arg) { int i, j; void *items[CONCURRENT]; for (i=0; i<CONCURRENT; i++) items[i]=NULL; inc(&b1); while (b1!=(NWORKER)); inc(&b2); while (b2!=(NWORKER)); for (j=0; j<NITER; j++) { /* get i from 0 to CONCURRENT -1 */ i=rand()%CONCURRENT; if (items[i]) { sa_free(&sa, items[i]); items[i]=NULL; } else items[i]=sa_alloc(&sa); } dec(&b1); while (b1!=0); dec(&b2); while (b2!=0); for (i=0; i<CONCURRENT; i++) if (items[i]) { sa_free(&sa, items[i]); items[i]=NULL; } return NULL; }
static inline int sql_get_next_token(YYSTYPE *yylval, void *parm) { mvc *c = (mvc*)parm; struct scanner *lc = &c->scanner; int token = 0, cur = 0; if (lc->rs->buf == NULL) /* malloc failure */ return EOF; if (lc->yynext) { int next = lc->yynext; lc->yynext = 0; return(next); } if (lc->yybak) { lc->rs->buf[lc->rs->pos + lc->yycur] = lc->yybak; lc->yybak = 0; } lc->yysval = lc->yycur; lc->yylast = lc->yyval; cur = scanner_getc(lc); if (cur < 0) return EOF; token = tokenize(c, cur); yylval->sval = (lc->rs->buf + (int)lc->rs->pos + lc->yysval); /* This is needed as ALIAS and aTYPE get defined too late, see sql_keyword.mx */ if (token == KW_ALIAS) token = ALIAS; if (token == KW_TYPE) token = aTYPE; if (token == IDENT || token == COMPARISON || token == FILTER_FUNC || token == AGGR || token == AGGR2 || token == RANK || token == aTYPE || token == ALIAS) yylval->sval = sa_strndup(c->sa, yylval->sval, lc->yycur-lc->yysval); else if (token == STRING) { char quote = *yylval->sval; char *str = sa_alloc( c->sa, (lc->yycur-lc->yysval-2)*2 + 1 ); assert(quote == '"' || quote == '\''); lc->rs->buf[lc->rs->pos+lc->yycur- 1] = 0; if (quote == '"') { if (valid_ident(yylval->sval+1,str)) { token = IDENT; } else { sql_error(c, 1, "Invalid identifier '%s'", yylval->sval+1); return LEX_ERROR; } } else { memcpy(str, yylval->sval+1, lc->yycur-lc->yysval - 1); } yylval->sval = str; /* reset original */ lc->rs->buf[lc->rs->pos+lc->yycur- 1] = quote; } return(token); }