From: Kirill Shcherbatov <kshcherbatov@tarantool.org> To: tarantool-patches@freelists.org, v.shpilevoy@tarantool.org Cc: Kirill Shcherbatov <kshcherbatov@tarantool.org> Subject: [tarantool-patches] [PATCH v1 1/4] sql: patch sql_name_from_token to use Parser Date: Fri, 15 Feb 2019 16:30:48 +0300 [thread overview] Message-ID: <7583e1f97bb56a602123455bfdcdf99a856fc281.1550237391.git.kshcherbatov@tarantool.org> (raw) In-Reply-To: <cover.1550237391.git.kshcherbatov@tarantool.org> The code was refactored so that the sql_name_from_token function would use the parser object instead of database connection. Also performed some additional names refactoring in adjacent places. Needed for #3931 --- src/box/sql/alter.c | 2 +- src/box/sql/analyze.c | 2 +- src/box/sql/build.c | 162 ++++++++++++++---------------------------- src/box/sql/delete.c | 2 +- src/box/sql/expr.c | 2 +- src/box/sql/fkey.c | 4 +- src/box/sql/parse.y | 10 +-- src/box/sql/pragma.c | 11 ++- src/box/sql/select.c | 4 +- src/box/sql/sqlInt.h | 81 ++++++++++++++++++++- src/box/sql/trigger.c | 4 +- 11 files changed, 152 insertions(+), 132 deletions(-) diff --git a/src/box/sql/alter.c b/src/box/sql/alter.c index d49ebb8df..6d9960156 100644 --- a/src/box/sql/alter.c +++ b/src/box/sql/alter.c @@ -43,7 +43,7 @@ sql_alter_table_rename(struct Parse *parse, struct SrcList *src_tab, { assert(src_tab->nSrc == 1); struct sql *db = parse->db; - char *new_name = sqlNameFromToken(db, new_name_tk); + char *new_name = sql_name_from_token(parse, new_name_tk); if (new_name == NULL) goto exit_rename_table; /* Check that new name isn't occupied by another table. */ diff --git a/src/box/sql/analyze.c b/src/box/sql/analyze.c index 7eabd0c7e..e82dcde0a 100644 --- a/src/box/sql/analyze.c +++ b/src/box/sql/analyze.c @@ -1118,7 +1118,7 @@ sqlAnalyze(Parse * pParse, Token * pName) sql_analyze_database(pParse); } else { /* Form 2: Analyze table named */ - char *z = sqlNameFromToken(db, pName); + char *z = sql_name_from_token(pParse, pName); if (z != NULL) { struct space *sp = space_by_name(z); if (sp != NULL) { diff --git a/src/box/sql/build.c b/src/box/sql/build.c index 5dc3d0248..3f4530620 100644 --- a/src/box/sql/build.c +++ b/src/box/sql/build.c @@ -294,30 +294,15 @@ sqlDeleteTable(sql * db, Table * pTable) table_delete(db, pTable); } -/* - * Given a token, return a string that consists of the text of that - * token. Space to hold the returned string - * is obtained from sqlMalloc() and must be freed by the calling - * function. - * - * Any quotation marks (ex: "name", 'name', [name], or `name`) that - * surround the body of the token are removed. - * - * Tokens are often just pointers into the original SQL text and so - * are not \000 terminated and are not persistent. The returned string - * is \000 terminated and is persistent. - */ char * -sqlNameFromToken(sql * db, Token * pName) +sql_name_from_token(struct Parse *parser, struct Token *name_token) { - char *zName; - if (pName) { - zName = sqlDbStrNDup(db, (char *)pName->z, pName->n); - sqlNormalizeName(zName); - } else { - zName = 0; - } - return zName; + if (name_token == NULL || name_token->z == NULL) + return NULL; + char *name = sqlDbStrNDup(parser->db, (char *)name_token->z, + name_token->n); + sqlNormalizeName(name); + return name; } /* @@ -404,7 +389,7 @@ sqlStartTable(Parse *pParse, Token *pName, int noErr) goto cleanup; sqlVdbeCountChanges(v); - zName = sqlNameFromToken(db, pName); + zName = sql_name_from_token(pParse, pName); pParse->sNameToken = *pName; if (zName == 0) @@ -779,7 +764,7 @@ sqlAddCollateType(Parse * pParse, Token * pToken) return; uint32_t i = p->def->field_count - 1; sql *db = pParse->db; - char *zColl = sqlNameFromToken(db, pToken); + char *zColl = sql_name_from_token(pParse, pToken); if (!zColl) return; uint32_t *coll_id = &p->def->fields[i].coll_id; @@ -1838,7 +1823,7 @@ sql_create_foreign_key(struct Parse *parse_context, struct SrcList *child, rlist_add_entry(&parse_context->new_fkey, fk, link); } assert(parent != NULL); - parent_name = sqlNameFromToken(db, parent); + parent_name = sql_name_from_token(parse_context, parent); if (parent_name == NULL) goto exit_create_fk; /* @@ -1875,10 +1860,12 @@ sql_create_foreign_key(struct Parse *parse_context, struct SrcList *child, new_tab->def->name); } else { struct Token *cnstr_nm = &parse_context->constraintName; - constraint_name = sqlNameFromToken(db, cnstr_nm); + constraint_name = sql_name_from_token(parse_context, + cnstr_nm); } } else { - constraint_name = sqlNameFromToken(db, constraint); + constraint_name = + sql_name_from_token(parse_context, constraint); } if (constraint_name == NULL) goto exit_create_fk; @@ -2011,8 +1998,7 @@ sql_drop_foreign_key(struct Parse *parse_context, struct SrcList *table, parse_context->nErr++; return; } - char *constraint_name = sqlNameFromToken(parse_context->db, - constraint); + char *constraint_name = sql_name_from_token(parse_context, constraint); if (constraint_name != NULL) vdbe_emit_fkey_drop(parse_context, constraint_name, child->def->id); @@ -2282,7 +2268,7 @@ sql_create_index(struct Parse *parse, struct Token *token, */ if (token != NULL) { assert(token->z != NULL); - name = sqlNameFromToken(db, token); + name = sql_name_from_token(parse, token); if (name == NULL) goto exit_create_index; if (sql_space_index_by_name(space, name) != NULL) { @@ -2295,10 +2281,11 @@ sql_create_index(struct Parse *parse, struct Token *token, } } else { char *constraint_name = NULL; - if (parse->constraintName.z != NULL) + if (parse->constraintName.z != NULL) { constraint_name = - sqlNameFromToken(db, - &parse->constraintName); + sql_name_from_token(parse, + &parse->constraintName); + } /* * This naming is temporary. Now it's not @@ -2539,7 +2526,8 @@ sql_drop_index(struct Parse *parse_context, struct SrcList *index_name_list, /* Never called with prior errors. */ assert(parse_context->nErr == 0); assert(table_token != NULL); - const char *table_name = sqlNameFromToken(db, table_token); + const char *table_name = + sql_name_from_token(parse_context, table_token); if (db->mallocFailed) { goto exit_drop_index; } @@ -2626,30 +2614,25 @@ sqlArrayAllocate(sql * db, /* Connection to notify of malloc failures */ return pArray; } -/* - * Append a new element to the given IdList. Create a new IdList if - * need be. - * - * A new IdList is returned, or NULL if malloc() fails. - */ -IdList * -sqlIdListAppend(sql * db, IdList * pList, Token * pToken) +struct IdList * +sql_IdList_append(struct Parse *parser, struct IdList *list, + struct Token *name_token) { + struct sql *db = parser->db; int i; - if (pList == 0) { - pList = sqlDbMallocZero(db, sizeof(IdList)); - if (pList == 0) - return 0; + if (list == NULL) { + list = sqlDbMallocZero(db, sizeof(IdList)); + if (list == NULL) + return NULL; } - pList->a = sqlArrayAllocate(db, - pList->a, - sizeof(pList->a[0]), &pList->nId, &i); + list->a = sqlArrayAllocate(db, list->a, sizeof(list->a[0]), + &list->nId, &i); if (i < 0) { - sqlIdListDelete(db, pList); + sqlIdListDelete(db, list); return 0; } - pList->a[i].zName = sqlNameFromToken(db, pToken); - return pList; + list->a[i].zName = sql_name_from_token(parser, name_token); + return list; } /* @@ -2772,62 +2755,26 @@ sql_alloc_src_list(sql *db) return pList; } -/* - * Append a new table name to the given SrcList. Create a new SrcList if - * need be. A new entry is created in the SrcList even if pTable is NULL. - * - * A SrcList is returned, or NULL if there is an OOM error. The returned - * SrcList might be the same as the SrcList that was input or it might be - * a new one. If an OOM error does occurs, then the prior value of pList - * that is input to this routine is automatically freed. - * - * If pDatabase is not null, it means that the table has an optional - * database name prefix. Like this: "database.table". The pDatabase - * points to the table name and the pTable points to the database name. - * The SrcList.a[].zName field is filled with the table name which might - * come from pTable (if pDatabase is NULL) or from pDatabase. - * SrcList.a[].zDatabase is filled with the database name from pTable, - * or with NULL if no database is specified. - * - * In other words, if call like this: - * - * sqlSrcListAppend(D,A,B,0); - * - * Then B is a table name and the database name is unspecified. If called - * like this: - * - * sqlSrcListAppend(D,A,B,C); - * - * Then C is the table name and B is the database name. If C is defined - * then so is B. In other words, we never have a case where: - * - * sqlSrcListAppend(D,A,0,C); - * - * Both pTable and pDatabase are assumed to be quoted. They are dequoted - * before being added to the SrcList. - */ -SrcList * -sqlSrcListAppend(sql * db, /* Connection to notify of malloc failures */ - SrcList * pList, /* Append to this SrcList. NULL creates a new SrcList */ - Token * pTable /* Table to append */ - ) +struct SrcList * +sql_SrcList_append(struct Parse *parser, struct SrcList *list, + struct Token *name_token) { struct SrcList_item *pItem; - assert(db != 0); - if (pList == 0) { - pList = sql_alloc_src_list(db); - if (pList == 0) - return 0; + struct sql *db = parser->db; + if (list == NULL) { + list = sql_alloc_src_list(db); + if (list == NULL) + return NULL; } else { - pList = sqlSrcListEnlarge(db, pList, 1, pList->nSrc); + list = sqlSrcListEnlarge(db, list, 1, list->nSrc); } if (db->mallocFailed) { - sqlSrcListDelete(db, pList); + sqlSrcListDelete(db, list); return 0; } - pItem = &pList->a[pList->nSrc - 1]; - pItem->zName = sqlNameFromToken(db, pTable); - return pList; + pItem = &list->a[list->nSrc - 1]; + pItem->zName = sql_name_from_token(parser, name_token); + return list; } /* @@ -2909,15 +2856,14 @@ sqlSrcListAppendFromTerm(Parse * pParse, /* Parsing context */ ); goto append_from_error; } - p = sqlSrcListAppend(db, p, pTable); + p = sql_SrcList_append(pParse, p, pTable); if (p == 0 || NEVER(p->nSrc == 0)) { goto append_from_error; } pItem = &p->a[p->nSrc - 1]; assert(pAlias != 0); - if (pAlias->n) { - pItem->zAlias = sqlNameFromToken(db, pAlias); - } + if (pAlias->n != 0) + pItem->zAlias = sql_name_from_token(pParse, pAlias); pItem->pSelect = pSubquery; pItem->pOn = pOn; pItem->pUsing = pUsing; @@ -2951,7 +2897,7 @@ sqlSrcListIndexedBy(Parse * pParse, SrcList * p, Token * pIndexedBy) pItem->fg.notIndexed = 1; } else { pItem->u1.zIndexedBy = - sqlNameFromToken(pParse->db, pIndexedBy); + sql_name_from_token(pParse, pIndexedBy); pItem->fg.isIndexedBy = (pItem->u1.zIndexedBy != 0); } } @@ -3037,7 +2983,7 @@ sql_transaction_rollback(Parse *pParse) void sqlSavepoint(Parse * pParse, int op, Token * pName) { - char *zName = sqlNameFromToken(pParse->db, pName); + char *zName = sql_name_from_token(pParse, pName); if (zName) { Vdbe *v = sqlGetVdbe(pParse); if (!v) { @@ -3131,7 +3077,7 @@ sqlWithAdd(Parse * pParse, /* Parsing context */ /* Check that the CTE name is unique within this WITH clause. If * not, store an error in the Parse structure. */ - zName = sqlNameFromToken(pParse->db, pName); + zName = sql_name_from_token(pParse, pName); if (zName && pWith) { int i; for (i = 0; i < pWith->nCte; i++) { diff --git a/src/box/sql/delete.c b/src/box/sql/delete.c index 41daa44ee..2b5d820ab 100644 --- a/src/box/sql/delete.c +++ b/src/box/sql/delete.c @@ -71,7 +71,7 @@ sql_materialize_view(struct Parse *parse, const char *name, struct Expr *where, { struct sql *db = parse->db; where = sqlExprDup(db, where, 0); - struct SrcList *from = sqlSrcListAppend(db, NULL, NULL); + struct SrcList *from = sql_SrcList_append(parse, NULL, NULL); if (from != NULL) { assert(from->nSrc == 1); from->a[0].zName = sqlDbStrDup(db, name); diff --git a/src/box/sql/expr.c b/src/box/sql/expr.c index 4450ac7ee..a6e35df6d 100644 --- a/src/box/sql/expr.c +++ b/src/box/sql/expr.c @@ -1583,7 +1583,7 @@ sqlIdListDup(sql * db, IdList * p) return 0; } /* Note that because the size of the allocation for p->a[] is not - * necessarily a power of two, sqlIdListAppend() may not be called + * necessarily a power of two, sql_IdList_append() may not be called * on the duplicate created by this function. */ for (i = 0; i < p->nId; i++) { diff --git a/src/box/sql/fkey.c b/src/box/sql/fkey.c index 32e5b3335..69740b39f 100644 --- a/src/box/sql/fkey.c +++ b/src/box/sql/fkey.c @@ -610,7 +610,7 @@ fkey_emit_check(struct Parse *parser, struct Table *tab, int reg_old, * table. We need the child table as a SrcList for * sqlWhereBegin(). */ - struct SrcList *src = sqlSrcListAppend(db, NULL, NULL); + struct SrcList *src = sql_SrcList_append(parser, NULL, NULL); if (src == NULL) continue; struct SrcList_item *item = src->a; @@ -871,7 +871,7 @@ fkey_action_trigger(struct Parse *pParse, struct Table *pTab, struct fkey *fkey, r->on_conflict_action = ON_CONFLICT_ACTION_ABORT; select = sqlSelectNew(pParse, sql_expr_list_append(db, NULL, r), - sqlSrcListAppend(db, NULL, &err), + sql_SrcList_append(pParse, NULL, &err), where, NULL, NULL, NULL, 0, NULL, NULL); where = NULL; diff --git a/src/box/sql/parse.y b/src/box/sql/parse.y index 661e69584..4713d0d09 100644 --- a/src/box/sql/parse.y +++ b/src/box/sql/parse.y @@ -604,7 +604,7 @@ seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP %type fullname {SrcList*} %destructor fullname {sqlSrcListDelete(pParse->db, $$);} fullname(A) ::= nm(X). - {A = sqlSrcListAppend(pParse->db,0,&X); /*A-overwrites-X*/} + {A = sql_SrcList_append(pParse,0,&X); /*A-overwrites-X*/} %type joinop {int} join_nm(A) ::= id(A). @@ -786,9 +786,9 @@ insert_cmd(A) ::= REPLACE. {A = ON_CONFLICT_ACTION_REPLACE;} idlist_opt(A) ::= . {A = 0;} idlist_opt(A) ::= LP idlist(X) RP. {A = X;} idlist(A) ::= idlist(A) COMMA nm(Y). - {A = sqlIdListAppend(pParse->db,A,&Y);} + {A = sql_IdList_append(pParse,A,&Y);} idlist(A) ::= nm(Y). - {A = sqlIdListAppend(pParse->db,0,&Y); /*A-overwrites-Y*/} + {A = sql_IdList_append(pParse,0,&Y); /*A-overwrites-Y*/} /////////////////////////// Expression Processing ///////////////////////////// // @@ -1140,7 +1140,7 @@ expr(A) ::= expr(A) in_op(N) LP select(Y) RP(E). [IN] { A.zEnd = &E.z[E.n]; } expr(A) ::= expr(A) in_op(N) nm(Y) paren_exprlist(E). [IN] { - SrcList *pSrc = sqlSrcListAppend(pParse->db, 0,&Y); + SrcList *pSrc = sql_SrcList_append(pParse, 0,&Y); Select *pSelect = sqlSelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); if( E ) sqlSrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); A.pExpr = sqlPExpr(pParse, TK_IN, A.pExpr, 0); @@ -1210,7 +1210,7 @@ paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} // cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) ON nm(Y) LP sortlist(Z) RP. { - sql_create_index(pParse, &X, sqlSrcListAppend(pParse->db,0,&Y), Z, &S, + sql_create_index(pParse, &X, sql_SrcList_append(pParse,0,&Y), Z, &S, SORT_ORDER_ASC, NE, U); } diff --git a/src/box/sql/pragma.c b/src/box/sql/pragma.c index f3e66f506..797224792 100644 --- a/src/box/sql/pragma.c +++ b/src/box/sql/pragma.c @@ -436,18 +436,17 @@ sqlPragma(Parse * pParse, Token * pId, /* First part of [schema.]id field */ sqlVdbeRunOnlyOnce(v); pParse->nMem = 2; - zLeft = sqlNameFromToken(db, pId); + zLeft = sql_name_from_token(pParse, pId); if (!zLeft) { printActivePragmas(user_session); return; } - if (minusFlag) { + if (minusFlag) zRight = sqlMPrintf(db, "-%T", pValue); - } else { - zRight = sqlNameFromToken(db, pValue); - } - zTable = sqlNameFromToken(db, pValue2); + else + zRight = sql_name_from_token(pParse, pValue); + zTable = sql_name_from_token(pParse, pValue2); db->busyHandler.nBusy = 0; /* Locate the pragma in the lookup table */ diff --git a/src/box/sql/select.c b/src/box/sql/select.c index a6e78d0df..dfd3a375e 100644 --- a/src/box/sql/select.c +++ b/src/box/sql/select.c @@ -256,7 +256,7 @@ findRightmost(Select * p) /** - * Work the same as sqlSrcListAppend(), but before adding to + * Work the same as sql_SrcList_append(), but before adding to * list provide check on name duplicates: only values with unique * names are appended. Moreover, names of tables are not * normalized: it is parser's business and in struct Select they @@ -4112,7 +4112,7 @@ flattenSubquery(Parse * pParse, /* Parsing context */ } else { assert(pParent != p); /* 2nd and subsequent times through the loop */ pSrc = pParent->pSrc = - sqlSrcListAppend(db, 0, 0); + sql_SrcList_append(pParse, 0, 0); if (pSrc == 0) { assert(db->mallocFailed); break; diff --git a/src/box/sql/sqlInt.h b/src/box/sql/sqlInt.h index 7f17fd84a..498982e01 100644 --- a/src/box/sql/sqlInt.h +++ b/src/box/sql/sqlInt.h @@ -3468,12 +3468,70 @@ void sqlDeleteTable(sql *, Table *); void sqlInsert(Parse *, SrcList *, Select *, IdList *, enum on_conflict_action); void *sqlArrayAllocate(sql *, void *, int, int *, int *); -IdList *sqlIdListAppend(sql *, IdList *, Token *); + +/* + * Append a new element to the given IdList. Create a new IdList if + * need be. + * A new IdList is returned, or NULL if malloc() fails. + * @param parser The parse context. + * @param list The pointer to existent Id list if exists. + * @param name_token The token containing name. + * @retval not NULL IdList pointer is returned on success. + * @retval NULL otherwise. + */ +struct IdList * +sql_IdList_append(struct Parse *parser, struct IdList *pList, + struct Token *pToken); + int sqlIdListIndex(IdList *, const char *); SrcList *sqlSrcListEnlarge(sql *, SrcList *, int, int); SrcList * sql_alloc_src_list(sql *db); -SrcList *sqlSrcListAppend(sql *, SrcList *, Token *); +/* + * Append a new table name to the given list. Create a new + * SrcList if need be. A new entry is created in the list even + * if name_token is NULL. + * + * A SrcList is returned, or NULL if there is an OOM error. + * The returned SrcList might be the same as the SrcList that was + * input or it might be a new one. If an OOM error does occurs, + * then the prior value of list that is input to this routine is + * automatically freed. + * + * If pDatabase is not null, it means that the table has an + * optional database name prefix. Like this: "database.table". + * The pDatabase points to the table name and the pTable points + * to the database name. The SrcList.a[].zName field is filled + * with the table name which might come from pTable (if pDatabase + * is NULL) or from pDatabase. + * SrcList.a[].zDatabase is filled with the database name from + * name_token, or with NULL if no database is specified. + * + * In other words, if call like this: + * + * sql_SrcList_append(D,A,B,0); + * + * Then B is a table name and the database name is unspecified. + * If called like this: + * + * sql_SrcList_append(D,A,B,C); + * + * Then C is the table name and B is the database name. If C is + * defined then so is B. In other words, we never have a case + * where: + * + * sql_SrcList_append(D,A,0,C); + * + * Both pTable and pDatabase are assumed to be quoted. They are + * dequoted before being added to the SrcList. + * @param parser Parse context. + * @param list Append to this SrcList. NULL creates a new SrcList. + * @param name_token Token representing table name. + * @retval not NULL SrcList pointer on success, NULL otherwise. + */ +struct SrcList * +sql_SrcList_append(struct Parse *parse, struct SrcList * pList, + struct Token *pTable); SrcList *sqlSrcListAppendFromTerm(Parse *, SrcList *, Token *, Token *, Select *, Expr *, IdList *); void sqlSrcListIndexedBy(Parse *, SrcList *, Token *); @@ -3656,7 +3714,24 @@ int sqlExprCodeExprList(Parse *, ExprList *, int, int, u8); void sqlExprIfTrue(Parse *, Expr *, int, int); void sqlExprIfFalse(Parse *, Expr *, int, int); -char *sqlNameFromToken(sql *, Token *); +/* + * Given a token, return a string that consists of the text of + * that token. Space to hold the returned string is obtained + * from sqlMalloc() and must be freed by the calling function. + * + * Any quotation marks (ex: "name", 'name', [name], or `name`) + * that surround the body of the token are removed. + * + * Tokens are often just pointers into the original SQL text and + * so are not \000 terminated and are not persistent. The returned + * string is \000 terminated and is persistent. + * @param parser The parse context. + * @param name_token The source token with text. + * @retval not NULL string pointer on success, NULL otherwise. + */ +char * +sql_name_from_token(struct Parse *parser, struct Token *name_token); + int sqlExprCompare(Expr *, Expr *, int); int sqlExprListCompare(ExprList *, ExprList *, int); int sqlExprImpliesExpr(Expr *, Expr *, int); diff --git a/src/box/sql/trigger.c b/src/box/sql/trigger.c index 8ad4e2ebd..2f54754fa 100644 --- a/src/box/sql/trigger.c +++ b/src/box/sql/trigger.c @@ -82,7 +82,7 @@ sql_trigger_begin(struct Parse *parse, struct Token *name, int tr_tm, goto trigger_cleanup; assert(table->nSrc == 1); - trigger_name = sqlNameFromToken(db, name); + trigger_name = sql_name_from_token(parse, name); if (trigger_name == NULL) goto trigger_cleanup; @@ -588,7 +588,7 @@ targetSrcList(Parse * pParse, /* The parsing context */ sql *db = pParse->db; SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlSrcListAppend(db, 0, 0); + pSrc = sql_SrcList_append(pParse, 0, 0); if (pSrc) { assert(pSrc->nSrc > 0); pSrc->a[pSrc->nSrc - 1].zName = -- 2.20.1
next prev parent reply other threads:[~2019-02-15 13:30 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-02-15 13:30 [tarantool-patches] [PATCH v1 0/4] sql: store regular identifiers in case-normal form Kirill Shcherbatov 2019-02-15 13:30 ` Kirill Shcherbatov [this message] 2019-02-15 13:30 ` [tarantool-patches] [PATCH v1 2/4] sql: patch sql_trigger_step_allocate to use Parser Kirill Shcherbatov 2019-02-15 13:30 ` [tarantool-patches] [PATCH v1 3/4] sql: patch sql_expr_create routine " Kirill Shcherbatov 2019-02-15 13:30 ` [tarantool-patches] [PATCH v1 4/4] sql: store regular identifiers in case-normal form Kirill Shcherbatov 2019-02-22 12:20 ` [tarantool-patches] Re: [PATCH v1 0/4] " Vladislav Shpilevoy 2019-02-22 12:38 ` Kirill Shcherbatov 2019-02-22 12:43 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=7583e1f97bb56a602123455bfdcdf99a856fc281.1550237391.git.kshcherbatov@tarantool.org \ --to=kshcherbatov@tarantool.org \ --cc=tarantool-patches@freelists.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [tarantool-patches] [PATCH v1 1/4] sql: patch sql_name_from_token to use Parser' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox