mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-07 02:42:48 +03:00
:-) (CVS 14)
FossilOrigin-Name: 1bb8ee8d9f1d3c409a11910e7552e4bb5e7f5f87
This commit is contained in:
22
manifest
22
manifest
@@ -1,22 +1,22 @@
|
|||||||
C :-)\s(CVS\s13)
|
C :-)\s(CVS\s14)
|
||||||
D 2000-05-30T03:28:36
|
D 2000-05-30T13:44:19
|
||||||
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
|
F COPYRIGHT 74a8a6531a42e124df07ab5599aad63870fa0bd4
|
||||||
F Makefile.in 89921c1ee4de75275bfadfbac198396da31704d1
|
F Makefile.in 89921c1ee4de75275bfadfbac198396da31704d1
|
||||||
F README 6b5960603c7f8bf42fc022b4b6436f242f238dbb
|
F README 6b5960603c7f8bf42fc022b4b6436f242f238dbb
|
||||||
F configure 00a5b5c82147a576fa6e82d7c1b0d55c321d6d2c x
|
F configure 00a5b5c82147a576fa6e82d7c1b0d55c321d6d2c x
|
||||||
F configure.in 6ccfd5fc80517f7cfe605a7fc7e0f62d962a233c
|
F configure.in 6ccfd5fc80517f7cfe605a7fc7e0f62d962a233c
|
||||||
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
|
F doc/lemon.html e233a3e97a779c7a87e1bc4528c664a58e49dd47
|
||||||
F src/build.c 94d1bda19f4129991e4e8bef2278a0398a49b0ec
|
F src/build.c bc81ec2f7c3296c1f784f7c94d2d8afea9f787e7
|
||||||
F src/dbbe.c ab05293e89525041eaab8b4aca10516db3648792
|
F src/dbbe.c ab05293e89525041eaab8b4aca10516db3648792
|
||||||
F src/dbbe.h bedeb3a0985bb584458e7849fb59927e99e751e6
|
F src/dbbe.h bedeb3a0985bb584458e7849fb59927e99e751e6
|
||||||
F src/main.c 25cce7bce0eb3ba10bada7c05f4b38dc6dbbc86f
|
F src/main.c 25cce7bce0eb3ba10bada7c05f4b38dc6dbbc86f
|
||||||
F src/parse.y 265c8596598afba0a94b94acd9c866d01603dfe5
|
F src/parse.y 265c8596598afba0a94b94acd9c866d01603dfe5
|
||||||
F src/shell.c 125f84ea5f8b725ba474d4702b575d062cc94d92
|
F src/shell.c 125f84ea5f8b725ba474d4702b575d062cc94d92
|
||||||
F src/sqlite.h 2397c17a8f4ca90c09acab0100dc7e2f8f441b69
|
F src/sqlite.h 2397c17a8f4ca90c09acab0100dc7e2f8f441b69
|
||||||
F src/sqliteInt.h 0365970442441b5e9b74e1e828afdeac7b0662be
|
F src/sqliteInt.h 562760efc29cf5b37a9029de04a5a8bca156f025
|
||||||
F src/tclsqlite.c 30f4317e1fc9119b130f29ee5dac4ab9121de68b
|
F src/tclsqlite.c 9efd29f79ded6a900aa3d142169c8bfe03b7affd
|
||||||
F src/tokenize.c ab578d90ec6ab117b7ade6e6cfbcb5b0f9cad500
|
F src/tokenize.c 948b8897ba211b58069d4a4465be23a2c639cf18
|
||||||
F src/util.c 321c136fc1a4d5821bad0f990c6374ef0785a118
|
F src/util.c dc1e1814cf69587e6ed58b82dd880ddb2165f3ce
|
||||||
F src/vdbe.c 80132b6bb9a744d1990a1c16666d54baaff2dbc3
|
F src/vdbe.c 80132b6bb9a744d1990a1c16666d54baaff2dbc3
|
||||||
F src/vdbe.h e721ad308f2e6ca805cebc4dd0a196ce4419d030
|
F src/vdbe.h e721ad308f2e6ca805cebc4dd0a196ce4419d030
|
||||||
F src/where.c be3973952e9bb5d2bb0bc5523b03f5d1f9e9d6f9
|
F src/where.c be3973952e9bb5d2bb0bc5523b03f5d1f9e9d6f9
|
||||||
@@ -25,7 +25,7 @@ F test/delete.test 814d53e3b0d2d7069fb17e005d4041454d6585d4
|
|||||||
F test/expr.test 11e00880d2de0f60ff1ba7fdd4e09a0d72a01910
|
F test/expr.test 11e00880d2de0f60ff1ba7fdd4e09a0d72a01910
|
||||||
F test/index.test 8d4f26901a5582daa353fe3c8266cbf4a53af830
|
F test/index.test 8d4f26901a5582daa353fe3c8266cbf4a53af830
|
||||||
F test/insert.test 161bc67a4189738c559e3569323ceae31f4d49d6
|
F test/insert.test 161bc67a4189738c559e3569323ceae31f4d49d6
|
||||||
F test/table.test b1afc2f6d4989f9ce911acbf711ac5d7ae521eb7
|
F test/table.test 2d6b3ba1024032d341aec0d3c48272c8407485b4
|
||||||
F test/tester.tcl 70d25b7ced0a958bc377c72399b3dc6bf6a2d09e
|
F test/tester.tcl 70d25b7ced0a958bc377c72399b3dc6bf6a2d09e
|
||||||
F test/update.test 69459302ea75cafac1479e60b0e36efb88123c0e
|
F test/update.test 69459302ea75cafac1479e60b0e36efb88123c0e
|
||||||
F tool/gdbmdump.c 529e67c78d920606ba196326ea55b57b75fcc82b
|
F tool/gdbmdump.c 529e67c78d920606ba196326ea55b57b75fcc82b
|
||||||
@@ -37,7 +37,7 @@ F tool/renumberOps.awk 6d067177ad5f8d711b79577b462da9b3634bd0a9
|
|||||||
F www/c_interface.tcl f875864edf7974157d1c257ca08de854660882a5
|
F www/c_interface.tcl f875864edf7974157d1c257ca08de854660882a5
|
||||||
F www/index.tcl 2466d1b2e26c6f354b0acedee12025309a216799
|
F www/index.tcl 2466d1b2e26c6f354b0acedee12025309a216799
|
||||||
F www/sqlite.tcl 947e067bcc347dc767af4c1a6e5a8d47d8404aa3
|
F www/sqlite.tcl 947e067bcc347dc767af4c1a6e5a8d47d8404aa3
|
||||||
P 20f2811fc19f937ed03bdb0e9d87a40c75452b17
|
P 191a7f484e0a10839e7e1c8eb6658536643e4756
|
||||||
R a5c212fd65bac2f4b07651714ab486bf
|
R 0c03c3a3c9ac1b3b825b1193112ad5a4
|
||||||
U drh
|
U drh
|
||||||
Z 182f1f474f82d5f20dd5789e51b5d83f
|
Z df606080358f2355e3007d65ffed4f54
|
||||||
|
@@ -1 +1 @@
|
|||||||
191a7f484e0a10839e7e1c8eb6658536643e4756
|
1bb8ee8d9f1d3c409a11910e7552e4bb5e7f5f87
|
@@ -24,7 +24,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** when syntax rules are reduced.
|
** when syntax rules are reduced.
|
||||||
**
|
**
|
||||||
** $Id: build.c,v 1.5 2000/05/30 03:12:21 drh Exp $
|
** $Id: build.c,v 1.6 2000/05/30 13:44:19 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@@ -243,7 +243,7 @@ void sqliteAddColumn(Parse *pParse, Token *pName){
|
|||||||
char **pz;
|
char **pz;
|
||||||
if( (p = pParse->pNewTable)==0 ) return;
|
if( (p = pParse->pNewTable)==0 ) return;
|
||||||
if( (p->nCol & 0x7)==0 ){
|
if( (p->nCol & 0x7)==0 ){
|
||||||
p->azCol = sqliteRealloc( p->azCol, (p->nCol+9)*sizeof(p->azCol[0]));
|
p->azCol = sqliteRealloc( p->azCol, (p->nCol+8)*sizeof(p->azCol[0]));
|
||||||
}
|
}
|
||||||
if( p->azCol==0 ){
|
if( p->azCol==0 ){
|
||||||
p->nCol = 0;
|
p->nCol = 0;
|
||||||
@@ -473,7 +473,7 @@ void sqliteCreateIndex(
|
|||||||
/*
|
/*
|
||||||
** Allocate the index structure.
|
** Allocate the index structure.
|
||||||
*/
|
*/
|
||||||
pIndex = sqliteMalloc( sizeof(Index) + strlen(zName) +
|
pIndex = sqliteMalloc( sizeof(Index) + strlen(zName) + 1 +
|
||||||
sizeof(int)*pList->nId );
|
sizeof(int)*pList->nId );
|
||||||
if( pIndex==0 ){
|
if( pIndex==0 ){
|
||||||
sqliteSetString(&pParse->zErrMsg, "out of memory", 0);
|
sqliteSetString(&pParse->zErrMsg, "out of memory", 0);
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** Internal interface definitions for SQLite.
|
** Internal interface definitions for SQLite.
|
||||||
**
|
**
|
||||||
** @(#) $Id: sqliteInt.h,v 1.1 2000/05/29 14:26:01 drh Exp $
|
** @(#) $Id: sqliteInt.h,v 1.2 2000/05/30 13:44:20 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqlite.h"
|
#include "sqlite.h"
|
||||||
#include "dbbe.h"
|
#include "dbbe.h"
|
||||||
@@ -35,6 +35,13 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
/* #define MEMORY_DEBUG 1 */
|
||||||
|
#ifdef MEMORY_DEBUG
|
||||||
|
# define sqliteMalloc(X) sqliteMalloc_(X,__FILE__,__LINE__)
|
||||||
|
# define sqliteFree(X) sqliteFree_(X,__FILE__,__LINE__)
|
||||||
|
# define sqliteRealloc(X,Y) sqliteRealloc_(X,Y,__FILE__,__LINE__)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** The number of entries in the in-memory hash table holding the
|
** The number of entries in the in-memory hash table holding the
|
||||||
** schema.
|
** schema.
|
||||||
@@ -200,9 +207,15 @@ int sqliteStrNICmp(const char *, const char *, int);
|
|||||||
int sqliteHashNoCase(const char *, int);
|
int sqliteHashNoCase(const char *, int);
|
||||||
int sqliteCompare(const char *, const char *);
|
int sqliteCompare(const char *, const char *);
|
||||||
int sqliteSortCompare(const char *, const char *);
|
int sqliteSortCompare(const char *, const char *);
|
||||||
void *sqliteMalloc(int);
|
#ifdef MEMORY_DEBUG
|
||||||
void sqliteFree(void*);
|
void *sqliteMalloc_(int,char*,int);
|
||||||
void *sqliteRealloc(void*,int);
|
void sqliteFree_(void*,char*,int);
|
||||||
|
void *sqliteRealloc_(void*,int,char*,int);
|
||||||
|
#else
|
||||||
|
void *sqliteMalloc(int);
|
||||||
|
void sqliteFree(void*);
|
||||||
|
void *sqliteRealloc(void*,int);
|
||||||
|
#endif
|
||||||
int sqliteGetToken(const char*, int *);
|
int sqliteGetToken(const char*, int *);
|
||||||
void sqliteSetString(char **, const char *, ...);
|
void sqliteSetString(char **, const char *, ...);
|
||||||
void sqliteSetNString(char **, ...);
|
void sqliteSetNString(char **, ...);
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** A TCL Interface to SQLite
|
** A TCL Interface to SQLite
|
||||||
**
|
**
|
||||||
** $Id: tclsqlite.c,v 1.2 2000/05/29 20:41:51 drh Exp $
|
** $Id: tclsqlite.c,v 1.3 2000/05/30 13:44:20 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqlite.h"
|
#include "sqlite.h"
|
||||||
#include <tcl.h>
|
#include <tcl.h>
|
||||||
@@ -152,6 +152,7 @@ static int DbCmd(void *cd, Tcl_Interp *interp, int argc, char **argv){
|
|||||||
}
|
}
|
||||||
if( argc==5 ){
|
if( argc==5 ){
|
||||||
cbData.interp = interp;
|
cbData.interp = interp;
|
||||||
|
cbData.once = 1;
|
||||||
cbData.zArray = argv[3];
|
cbData.zArray = argv[3];
|
||||||
cbData.zCode = argv[4];
|
cbData.zCode = argv[4];
|
||||||
zErrMsg = 0;
|
zErrMsg = 0;
|
||||||
|
@@ -27,10 +27,11 @@
|
|||||||
** individual tokens and sends those tokens one-by-one over to the
|
** individual tokens and sends those tokens one-by-one over to the
|
||||||
** parser for analysis.
|
** parser for analysis.
|
||||||
**
|
**
|
||||||
** $Id: tokenize.c,v 1.1 2000/05/29 14:26:02 drh Exp $
|
** $Id: tokenize.c,v 1.2 2000/05/30 13:44:20 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** All the keywords of the SQL language are stored as in a hash
|
** All the keywords of the SQL language are stored as in a hash
|
||||||
@@ -287,7 +288,7 @@ int sqliteRunParser(Parse *pParse, char *zSql, char **pzErrMsg){
|
|||||||
extern void sqliteParserTrace(FILE*, char *);
|
extern void sqliteParserTrace(FILE*, char *);
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
pEngine = sqliteParserAlloc(sqliteMalloc);
|
pEngine = sqliteParserAlloc((void(*)())malloc);
|
||||||
if( pEngine==0 ){
|
if( pEngine==0 ){
|
||||||
sqliteSetString(pzErrMsg, "out of memory", 0);
|
sqliteSetString(pzErrMsg, "out of memory", 0);
|
||||||
return 1;
|
return 1;
|
||||||
@@ -354,7 +355,7 @@ int sqliteRunParser(Parse *pParse, char *zSql, char **pzErrMsg){
|
|||||||
nErr++;
|
nErr++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sqliteParserFree(pEngine, sqliteFree);
|
sqliteParserFree(pEngine, free);
|
||||||
if( pParse->zErrMsg ){
|
if( pParse->zErrMsg ){
|
||||||
if( pzErrMsg ){
|
if( pzErrMsg ){
|
||||||
*pzErrMsg = pParse->zErrMsg;
|
*pzErrMsg = pParse->zErrMsg;
|
||||||
|
97
src/util.c
97
src/util.c
@@ -26,19 +26,109 @@
|
|||||||
** This file contains functions for allocating memory, comparing
|
** This file contains functions for allocating memory, comparing
|
||||||
** strings, and stuff like that.
|
** strings, and stuff like that.
|
||||||
**
|
**
|
||||||
** $Id: util.c,v 1.4 2000/05/29 23:48:23 drh Exp $
|
** $Id: util.c,v 1.5 2000/05/30 13:44:20 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
|
#ifdef MEMORY_DEBUG
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Allocate new memory and set it to zero. Return NULL if
|
||||||
|
** no memory is available.
|
||||||
|
*/
|
||||||
|
void *sqliteMalloc_(int n, char *zFile, int line){
|
||||||
|
void *p;
|
||||||
|
int *pi;
|
||||||
|
int k;
|
||||||
|
k = (n+sizeof(int)-1)/sizeof(int);
|
||||||
|
pi = malloc( (3+k)*sizeof(int));
|
||||||
|
if( pi==0 ) return 0;
|
||||||
|
pi[0] = 0xdead1122;
|
||||||
|
pi[1] = n;
|
||||||
|
pi[k+2] = 0xdead3344;
|
||||||
|
p = &pi[2];
|
||||||
|
memset(p, 0, n);
|
||||||
|
printf("malloc %d bytes at 0x%x from %s:%d\n", n, (int)p, zFile, line);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Free memory previously obtained from sqliteMalloc()
|
||||||
|
*/
|
||||||
|
void sqliteFree_(void *p, char *zFile, int line){
|
||||||
|
if( p ){
|
||||||
|
int *pi, k, n;
|
||||||
|
pi = p;
|
||||||
|
pi -= 2;
|
||||||
|
if( pi[0]!=0xdead1122 ){
|
||||||
|
printf("Low-end memory corruption at 0x%x\n", (int)p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
n = pi[1];
|
||||||
|
k = (n+sizeof(int)-1)/sizeof(int);
|
||||||
|
if( pi[k+2]!=0xdead3344 ){
|
||||||
|
printf("High-end memory corruption at 0x%x\n", (int)p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
memset(pi, 0, (k+3)*sizeof(int));
|
||||||
|
printf("free %d bytes at 0x%x from %s:%d\n", n, (int)p, zFile, line);
|
||||||
|
free(pi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
** Resize a prior allocation. If p==0, then this routine
|
||||||
|
** works just like sqliteMalloc(). If n==0, then this routine
|
||||||
|
** works just like sqliteFree().
|
||||||
|
*/
|
||||||
|
void *sqliteRealloc_(void *oldP, int n, char *zFile, int line){
|
||||||
|
int *oldPi, *pi, k, oldN, oldK;
|
||||||
|
void *p;
|
||||||
|
if( oldP==0 ){
|
||||||
|
return sqliteMalloc_(n,zFile,line);
|
||||||
|
}
|
||||||
|
if( n==0 ){
|
||||||
|
sqliteFree_(oldP,zFile,line);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
oldPi = oldP;
|
||||||
|
oldPi -= 2;
|
||||||
|
if( oldPi[0]!=0xdead1122 ){
|
||||||
|
printf("Low-end memory corruption in realloc at 0x%x\n", (int)p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
oldN = oldPi[1];
|
||||||
|
oldK = (oldN+sizeof(int)-1)/sizeof(int);
|
||||||
|
if( oldPi[oldK+2]!=0xdead3344 ){
|
||||||
|
printf("High-end memory corruption in realloc at 0x%x\n", (int)p);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
k = (n + sizeof(int) - 1)/sizeof(int);
|
||||||
|
pi = malloc( (k+3)*sizeof(int) );
|
||||||
|
pi[0] = 0xdead1122;
|
||||||
|
pi[1] = n;
|
||||||
|
pi[k+2] = 0xdead3344;
|
||||||
|
p = &pi[2];
|
||||||
|
memcpy(p, oldP, n>oldN ? oldN : n);
|
||||||
|
if( n>oldN ){
|
||||||
|
memset(&((char*)p)[oldN], 0, n-oldN);
|
||||||
|
}
|
||||||
|
memset(oldPi, 0, (oldK+3)*sizeof(int));
|
||||||
|
free(oldPi);
|
||||||
|
printf("realloc %d->%d bytes at 0x%x->0x%x at %s:%d\n", oldN, n,
|
||||||
|
(int)oldP, (int)p, zFile, line);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
#else /* !defined(MEMORY_DEBUG) */
|
||||||
/*
|
/*
|
||||||
** Allocate new memory and set it to zero. Return NULL if
|
** Allocate new memory and set it to zero. Return NULL if
|
||||||
** no memory is available.
|
** no memory is available.
|
||||||
*/
|
*/
|
||||||
void *sqliteMalloc(int n){
|
void *sqliteMalloc(int n){
|
||||||
void *p = malloc(n);
|
void *p = malloc(n);
|
||||||
/* printf("alloc 0x%x size: %d bytes\n", (int)p, n); */
|
|
||||||
if( p==0 ) return 0;
|
if( p==0 ) return 0;
|
||||||
memset(p, 0, n);
|
memset(p, 0, n);
|
||||||
return p;
|
return p;
|
||||||
@@ -49,7 +139,6 @@ void *sqliteMalloc(int n){
|
|||||||
*/
|
*/
|
||||||
void sqliteFree(void *p){
|
void sqliteFree(void *p){
|
||||||
if( p ){
|
if( p ){
|
||||||
/* printf("free 0x%x\n", (int)p); */
|
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -67,9 +156,9 @@ void *sqliteRealloc(void *p, int n){
|
|||||||
sqliteFree(p);
|
sqliteFree(p);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* printf("realloc 0x%x size: %d bytes\n", (int)p, n); */
|
|
||||||
return realloc(p, n);
|
return realloc(p, n);
|
||||||
}
|
}
|
||||||
|
#endif /* MEMORY_DEBUG */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Create a string from the 2nd and subsequent arguments (up to the
|
** Create a string from the 2nd and subsequent arguments (up to the
|
||||||
|
@@ -23,7 +23,7 @@
|
|||||||
# This file implements regression tests for SQLite library. The
|
# This file implements regression tests for SQLite library. The
|
||||||
# focus of this file is testing the CREATE TABLE statement.
|
# focus of this file is testing the CREATE TABLE statement.
|
||||||
#
|
#
|
||||||
# $Id: table.test,v 1.2 2000/05/30 03:12:22 drh Exp $
|
# $Id: table.test,v 1.3 2000/05/30 13:44:20 drh Exp $
|
||||||
|
|
||||||
set testdir [file dirname $argv0]
|
set testdir [file dirname $argv0]
|
||||||
source $testdir/tester.tcl
|
source $testdir/tester.tcl
|
||||||
@@ -113,7 +113,7 @@ do_test table-2.1d {
|
|||||||
|
|
||||||
# Verify that we cannot make a table with the same name as an index
|
# Verify that we cannot make a table with the same name as an index
|
||||||
#
|
#
|
||||||
do_test table-2.2 {
|
do_test table-2.2a {
|
||||||
execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)}
|
execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)}
|
||||||
set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
|
set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
|
||||||
lappend v $msg
|
lappend v $msg
|
||||||
@@ -143,7 +143,7 @@ set big_table \
|
|||||||
{CREATE TABLE big(
|
{CREATE TABLE big(
|
||||||
f1 varchar(20),
|
f1 varchar(20),
|
||||||
f2 char(10),
|
f2 char(10),
|
||||||
f3 varchar(30),
|
f3 varchar(30) primary key,
|
||||||
f4 text,
|
f4 text,
|
||||||
f5 text,
|
f5 text,
|
||||||
f6 text,
|
f6 text,
|
||||||
|
Reference in New Issue
Block a user