mirror of
				https://github.com/sqlite/sqlite.git
				synced 2025-10-24 09:53:10 +03:00 
			
		
		
		
	Move the special built-in SQL functions used by ALTER TABLE out of func.c
and into alter.c. (CVS 2343) FossilOrigin-Name: dbd11a0c581b447bb2f220a1a185d9fd36933ee3
This commit is contained in:
		
							
								
								
									
										16
									
								
								manifest
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								manifest
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| C Split\sthe\slogic\sfor\sthe\sALTER\sTABLE\scommand\soff\sinto\sa\sseparate\ssource\ncode\sfile.\s(CVS\s2342) | C Move\sthe\sspecial\sbuilt-in\sSQL\sfunctions\sused\sby\sALTER\sTABLE\sout\sof\sfunc.c\nand\sinto\salter.c.\s(CVS\s2343) | ||||||
| D 2005-02-15T20:47:57 | D 2005-02-15T21:36:18 | ||||||
| F Makefile.in 76443a83549d1539105e12d13bd0054a05ab2214 | F Makefile.in 76443a83549d1539105e12d13bd0054a05ab2214 | ||||||
| F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457 | F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457 | ||||||
| F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1 | F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1 | ||||||
| @@ -27,7 +27,7 @@ F sqlite.pc.in 30552343140c53304c2a658c080fbe810cd09ca2 | |||||||
| F sqlite3.1 01fdb467ce387a83248857c92f9e801df9e4611c | F sqlite3.1 01fdb467ce387a83248857c92f9e801df9e4611c | ||||||
| F sqlite3.def dbaeb20c153e1d366e8f421b55a573f5dfc00863 | F sqlite3.def dbaeb20c153e1d366e8f421b55a573f5dfc00863 | ||||||
| F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a | F sqlite3.pc.in 985b9bf34192a549d7d370e0f0b6b34a4f61369a | ||||||
| F src/alter.c 4e38440d4491a52b55c0c42d5c9b1b1890f0a13d | F src/alter.c 6dab3d91aa4bf5c24e874145a2a547070c8c1883 | ||||||
| F src/attach.c f78f76bc6a8e5e487ca53636e21ccba2484a9a61 | F src/attach.c f78f76bc6a8e5e487ca53636e21ccba2484a9a61 | ||||||
| F src/auth.c 18c5a0befe20f3a58a41e3ddd78f372faeeefe1f | F src/auth.c 18c5a0befe20f3a58a41e3ddd78f372faeeefe1f | ||||||
| F src/btree.c 5c6e81855deec3d1eac5ae03e4c8db6c2595421f | F src/btree.c 5c6e81855deec3d1eac5ae03e4c8db6c2595421f | ||||||
| @@ -37,7 +37,7 @@ F src/date.c f3d1f5cd1503dabf426a198f3ebef5afbc122a7f | |||||||
| F src/delete.c 4b94395b52a8f7785acd71135c2ce54f3f5550b3 | F src/delete.c 4b94395b52a8f7785acd71135c2ce54f3f5550b3 | ||||||
| F src/experimental.c 8cc66b2be6a011055d75ef19ed2584bcfbb585ad | F src/experimental.c 8cc66b2be6a011055d75ef19ed2584bcfbb585ad | ||||||
| F src/expr.c e160aabb59ff3c02e8e00ca4b30d00b94664c519 | F src/expr.c e160aabb59ff3c02e8e00ca4b30d00b94664c519 | ||||||
| F src/func.c deba954e40c9bcfaafa899f382176f2c1eb8b1d6 | F src/func.c ff0673a25ec6216934e664bf9f480ae8b2c66936 | ||||||
| F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f | F src/hash.c 2b1b13f7400e179631c83a1be0c664608c8f021f | ||||||
| F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84 | F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84 | ||||||
| F src/insert.c 0456649d4d48396f918e7ea1fecbf3d66ed90816 | F src/insert.c 0456649d4d48396f918e7ea1fecbf3d66ed90816 | ||||||
| @@ -61,7 +61,7 @@ F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3 | |||||||
| F src/select.c 69e6093d52e871a243477e9746f820456538dd03 | F src/select.c 69e6093d52e871a243477e9746f820456538dd03 | ||||||
| F src/shell.c 3cb0ef124ed9cd582ce89aec59ff7c659bc6e61b | F src/shell.c 3cb0ef124ed9cd582ce89aec59ff7c659bc6e61b | ||||||
| F src/sqlite.h.in c85f6bad9ca7de29f505fe886646cfff7df4c55e | F src/sqlite.h.in c85f6bad9ca7de29f505fe886646cfff7df4c55e | ||||||
| F src/sqliteInt.h 3ebdaeee801f79950c38986639dcfb90782042ed | F src/sqliteInt.h f95cc4becd7b27293aae8f8c4ed2f6ef44830fbb | ||||||
| F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9 | F src/table.c 25b3ff2b39b7d87e8d4a5da0713d68dfc06cbee9 | ||||||
| F src/tclsqlite.c 101994a2c4c0eaa69f1de9bfe4a02167f6049e7d | F src/tclsqlite.c 101994a2c4c0eaa69f1de9bfe4a02167f6049e7d | ||||||
| F src/test1.c feac8a742aca920c8ab18a43b3208ae3a834fe9d | F src/test1.c feac8a742aca920c8ab18a43b3208ae3a834fe9d | ||||||
| @@ -272,7 +272,7 @@ F www/tclsqlite.tcl e73f8f8e5f20e8277619433f7970060ab01088fc | |||||||
| F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618 | F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618 | ||||||
| F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0 | F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0 | ||||||
| F www/whentouse.tcl 3e522a06ad41992023c80ca29a048ae2331ca5bd | F www/whentouse.tcl 3e522a06ad41992023c80ca29a048ae2331ca5bd | ||||||
| P 6610188f09d08c65c46a140685b403aa74f71a19 | P 90d6573c2631fac92b9e572e9e21698ae2480c9d | ||||||
| R d76aba4c3459eff26416d9c4987a204d | R 384fca8815ea2fd0b9f2d663a9b9c24b | ||||||
| U drh | U drh | ||||||
| Z ecefb64241ae1525534fd4f0e437a46d | Z 4a0adb18d6e3aab9863249bdabd00180 | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| 90d6573c2631fac92b9e572e9e21698ae2480c9d | dbd11a0c581b447bb2f220a1a185d9fd36933ee3 | ||||||
							
								
								
									
										152
									
								
								src/alter.c
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								src/alter.c
									
									
									
									
									
								
							| @@ -12,12 +12,160 @@ | |||||||
| ** This file contains C code routines that used to generate VDBE code | ** This file contains C code routines that used to generate VDBE code | ||||||
| ** that implements the ALTER TABLE command. | ** that implements the ALTER TABLE command. | ||||||
| ** | ** | ||||||
| ** $Id: alter.c,v 1.1 2005/02/15 20:47:57 drh Exp $ | ** $Id: alter.c,v 1.2 2005/02/15 21:36:18 drh Exp $ | ||||||
| */ | */ | ||||||
| #include "sqliteInt.h" | #include "sqliteInt.h" | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** The code in this file only exists if we are not omitting the | ||||||
|  | ** ALTER TABLE logic from the build. | ||||||
|  | */ | ||||||
| #ifndef SQLITE_OMIT_ALTERTABLE | #ifndef SQLITE_OMIT_ALTERTABLE | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** This function is used by SQL generated to implement the  | ||||||
|  | ** ALTER TABLE command. The first argument is the text of a CREATE TABLE or | ||||||
|  | ** CREATE INDEX command. The second is a table name. The table name in  | ||||||
|  | ** the CREATE TABLE or CREATE INDEX statement is replaced with the second | ||||||
|  | ** argument and the result returned. Examples: | ||||||
|  | ** | ||||||
|  | ** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def') | ||||||
|  | **     -> 'CREATE TABLE def(a, b, c)' | ||||||
|  | ** | ||||||
|  | ** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def') | ||||||
|  | **     -> 'CREATE INDEX i ON def(a, b, c)' | ||||||
|  | */ | ||||||
|  | static void renameTableFunc( | ||||||
|  |   sqlite3_context *context, | ||||||
|  |   int argc, | ||||||
|  |   sqlite3_value **argv | ||||||
|  | ){ | ||||||
|  |   unsigned char const *zSql = sqlite3_value_text(argv[0]); | ||||||
|  |   unsigned char const *zTableName = sqlite3_value_text(argv[1]); | ||||||
|  |  | ||||||
|  |   int token; | ||||||
|  |   Token tname; | ||||||
|  |   char const *zCsr = zSql; | ||||||
|  |   int len = 0; | ||||||
|  |   char *zRet; | ||||||
|  |  | ||||||
|  |   /* The principle used to locate the table name in the CREATE TABLE  | ||||||
|  |   ** statement is that the table name is the first token that is immediatedly | ||||||
|  |   ** followed by a left parenthesis - TK_LP. | ||||||
|  |   */ | ||||||
|  |   if( zSql ){ | ||||||
|  |     do { | ||||||
|  |       /* Store the token that zCsr points to in tname. */ | ||||||
|  |       tname.z = zCsr; | ||||||
|  |       tname.n = len; | ||||||
|  |  | ||||||
|  |       /* Advance zCsr to the next token. Store that token type in 'token', | ||||||
|  |       ** and it's length in 'len' (to be used next iteration of this loop). | ||||||
|  |       */ | ||||||
|  |       do { | ||||||
|  |         zCsr += len; | ||||||
|  |         len = sqlite3GetToken(zCsr, &token); | ||||||
|  |       } while( token==TK_SPACE ); | ||||||
|  |       assert( len>0 ); | ||||||
|  |     } while( token!=TK_LP ); | ||||||
|  |  | ||||||
|  |     zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,  | ||||||
|  |        zTableName, tname.z+tname.n); | ||||||
|  |     sqlite3_result_text(context, zRet, -1, sqlite3FreeX); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #ifndef SQLITE_OMIT_TRIGGER | ||||||
|  | /* This function is used by SQL generated to implement the ALTER TABLE | ||||||
|  | ** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER  | ||||||
|  | ** statement. The second is a table name. The table name in the CREATE  | ||||||
|  | ** TRIGGER statement is replaced with the second argument and the result  | ||||||
|  | ** returned. This is analagous to renameTableFunc() above, except for CREATE | ||||||
|  | ** TRIGGER, not CREATE INDEX and CREATE TABLE. | ||||||
|  | */ | ||||||
|  | static void renameTriggerFunc( | ||||||
|  |   sqlite3_context *context, | ||||||
|  |   int argc, | ||||||
|  |   sqlite3_value **argv | ||||||
|  | ){ | ||||||
|  |   unsigned char const *zSql = sqlite3_value_text(argv[0]); | ||||||
|  |   unsigned char const *zTableName = sqlite3_value_text(argv[1]); | ||||||
|  |  | ||||||
|  |   int token; | ||||||
|  |   Token tname; | ||||||
|  |   int dist = 3; | ||||||
|  |   char const *zCsr = zSql; | ||||||
|  |   int len = 0; | ||||||
|  |   char *zRet; | ||||||
|  |  | ||||||
|  |   /* The principle used to locate the table name in the CREATE TRIGGER  | ||||||
|  |   ** statement is that the table name is the first token that is immediatedly | ||||||
|  |   ** preceded by either TK_ON or TK_DOT and immediatedly followed by one | ||||||
|  |   ** of TK_WHEN, TK_BEGIN or TK_FOR. | ||||||
|  |   */ | ||||||
|  |   if( zSql ){ | ||||||
|  |     do { | ||||||
|  |       /* Store the token that zCsr points to in tname. */ | ||||||
|  |       tname.z = zCsr; | ||||||
|  |       tname.n = len; | ||||||
|  |  | ||||||
|  |       /* Advance zCsr to the next token. Store that token type in 'token', | ||||||
|  |       ** and it's length in 'len' (to be used next iteration of this loop). | ||||||
|  |       */ | ||||||
|  |       do { | ||||||
|  |         zCsr += len; | ||||||
|  |         len = sqlite3GetToken(zCsr, &token); | ||||||
|  |       }while( token==TK_SPACE ); | ||||||
|  |       assert( len>0 ); | ||||||
|  |  | ||||||
|  |       /* Variable 'dist' stores the number of tokens read since the most | ||||||
|  |       ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN  | ||||||
|  |       ** token is read and 'dist' equals 2, the condition stated above | ||||||
|  |       ** to be met. | ||||||
|  |       ** | ||||||
|  |       ** Note that ON cannot be a database, table or column name, so | ||||||
|  |       ** there is no need to worry about syntax like  | ||||||
|  |       ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc. | ||||||
|  |       */ | ||||||
|  |       dist++; | ||||||
|  |       if( token==TK_DOT || token==TK_ON ){ | ||||||
|  |         dist = 0; | ||||||
|  |       } | ||||||
|  |     } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) ); | ||||||
|  |  | ||||||
|  |     /* Variable tname now contains the token that is the old table-name | ||||||
|  |     ** in the CREATE TRIGGER statement. | ||||||
|  |     */ | ||||||
|  |     zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,  | ||||||
|  |        zTableName, tname.z+tname.n); | ||||||
|  |     sqlite3_result_text(context, zRet, -1, sqlite3FreeX); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | #endif   /* !SQLITE_OMIT_TRIGGER */ | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** Register built-in functions used to help implement ALTER TABLE | ||||||
|  | */ | ||||||
|  | void sqlite3AlterFunctions(sqlite3 *db){ | ||||||
|  |   static const struct { | ||||||
|  |      char *zName; | ||||||
|  |      signed char nArg; | ||||||
|  |      void (*xFunc)(sqlite3_context*,int,sqlite3_value **); | ||||||
|  |   } aFuncs[] = { | ||||||
|  |     { "sqlite_rename_table",    2, renameTableFunc}, | ||||||
|  | #ifndef SQLITE_OMIT_TRIGGER | ||||||
|  |     { "sqlite_rename_trigger",  2, renameTriggerFunc}, | ||||||
|  | #endif | ||||||
|  |   }; | ||||||
|  |   int i; | ||||||
|  |  | ||||||
|  |   for(i=0; i<sizeof(aFuncs)/sizeof(aFuncs[0]); i++){ | ||||||
|  |     sqlite3_create_function(db, aFuncs[i].zName, aFuncs[i].nArg, | ||||||
|  |         SQLITE_UTF8, 0, aFuncs[i].xFunc, 0, 0); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy"  | ** Generate code to implement the "ALTER TABLE xxx RENAME TO yyy"  | ||||||
| ** command.  | ** command.  | ||||||
|   | |||||||
							
								
								
									
										165
									
								
								src/func.c
									
									
									
									
									
								
							
							
						
						
									
										165
									
								
								src/func.c
									
									
									
									
									
								
							| @@ -16,7 +16,7 @@ | |||||||
| ** sqliteRegisterBuildinFunctions() found at the bottom of the file. | ** sqliteRegisterBuildinFunctions() found at the bottom of the file. | ||||||
| ** All other code has file scope. | ** All other code has file scope. | ||||||
| ** | ** | ||||||
| ** $Id: func.c,v 1.95 2005/02/15 20:47:57 drh Exp $ | ** $Id: func.c,v 1.96 2005/02/15 21:36:18 drh Exp $ | ||||||
| */ | */ | ||||||
| #include "sqliteInt.h" | #include "sqliteInt.h" | ||||||
| #include <ctype.h> | #include <ctype.h> | ||||||
| @@ -533,130 +533,6 @@ static void versionFunc( | |||||||
|   sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); |   sqlite3_result_text(context, sqlite3_version, -1, SQLITE_STATIC); | ||||||
| } | } | ||||||
|  |  | ||||||
| #ifndef SQLITE_OMIT_ALTERTABLE |  | ||||||
| /* |  | ||||||
| ** This function is used by SQL generated to implement the  |  | ||||||
| ** ALTER TABLE command. The first argument is the text of a CREATE TABLE or |  | ||||||
| ** CREATE INDEX command. The second is a table name. The table name in  |  | ||||||
| ** the CREATE TABLE or CREATE INDEX statement is replaced with the second |  | ||||||
| ** argument and the result returned. Examples: |  | ||||||
| ** |  | ||||||
| ** sqlite_rename_table('CREATE TABLE abc(a, b, c)', 'def') |  | ||||||
| **     -> 'CREATE TABLE def(a, b, c)' |  | ||||||
| ** |  | ||||||
| ** sqlite_rename_table('CREATE INDEX i ON abc(a)', 'def') |  | ||||||
| **     -> 'CREATE INDEX i ON def(a, b, c)' |  | ||||||
| */ |  | ||||||
| static void renameTableFunc( |  | ||||||
|   sqlite3_context *context, |  | ||||||
|   int argc, |  | ||||||
|   sqlite3_value **argv |  | ||||||
| ){ |  | ||||||
|   unsigned char const *zSql = sqlite3_value_text(argv[0]); |  | ||||||
|   unsigned char const *zTableName = sqlite3_value_text(argv[1]); |  | ||||||
|  |  | ||||||
|   int token; |  | ||||||
|   Token tname; |  | ||||||
|   char const *zCsr = zSql; |  | ||||||
|   int len = 0; |  | ||||||
|   char *zRet; |  | ||||||
|  |  | ||||||
|   /* The principle used to locate the table name in the CREATE TABLE  |  | ||||||
|   ** statement is that the table name is the first token that is immediatedly |  | ||||||
|   ** followed by a left parenthesis - TK_LP. |  | ||||||
|   */ |  | ||||||
|   if( zSql ){ |  | ||||||
|     do { |  | ||||||
|       /* Store the token that zCsr points to in tname. */ |  | ||||||
|       tname.z = zCsr; |  | ||||||
|       tname.n = len; |  | ||||||
|  |  | ||||||
|       /* Advance zCsr to the next token. Store that token type in 'token', |  | ||||||
|       ** and it's length in 'len' (to be used next iteration of this loop). |  | ||||||
|       */ |  | ||||||
|       do { |  | ||||||
|         zCsr += len; |  | ||||||
|         len = sqlite3GetToken(zCsr, &token); |  | ||||||
|       } while( token==TK_SPACE ); |  | ||||||
|       assert( len>0 ); |  | ||||||
|     } while( token!=TK_LP ); |  | ||||||
|  |  | ||||||
|     zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,  |  | ||||||
|        zTableName, tname.z+tname.n); |  | ||||||
|     sqlite3_result_text(context, zRet, -1, sqlite3FreeX); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef SQLITE_OMIT_ALTERTABLE |  | ||||||
| #ifndef SQLITE_OMIT_TRIGGER |  | ||||||
| /* This function is used by SQL generated to implement the ALTER TABLE |  | ||||||
| ** ALTER TABLE command. The first argument is the text of a CREATE TRIGGER  |  | ||||||
| ** statement. The second is a table name. The table name in the CREATE  |  | ||||||
| ** TRIGGER statement is replaced with the second argument and the result  |  | ||||||
| ** returned. This is analagous to renameTableFunc() above, except for CREATE |  | ||||||
| ** TRIGGER, not CREATE INDEX and CREATE TABLE. |  | ||||||
| */ |  | ||||||
| static void renameTriggerFunc( |  | ||||||
|   sqlite3_context *context, |  | ||||||
|   int argc, |  | ||||||
|   sqlite3_value **argv |  | ||||||
| ){ |  | ||||||
|   unsigned char const *zSql = sqlite3_value_text(argv[0]); |  | ||||||
|   unsigned char const *zTableName = sqlite3_value_text(argv[1]); |  | ||||||
|  |  | ||||||
|   int token; |  | ||||||
|   Token tname; |  | ||||||
|   int dist = 3; |  | ||||||
|   char const *zCsr = zSql; |  | ||||||
|   int len = 0; |  | ||||||
|   char *zRet; |  | ||||||
|  |  | ||||||
|   /* The principle used to locate the table name in the CREATE TRIGGER  |  | ||||||
|   ** statement is that the table name is the first token that is immediatedly |  | ||||||
|   ** preceded by either TK_ON or TK_DOT and immediatedly followed by one |  | ||||||
|   ** of TK_WHEN, TK_BEGIN or TK_FOR. |  | ||||||
|   */ |  | ||||||
|   if( zSql ){ |  | ||||||
|     do { |  | ||||||
|       /* Store the token that zCsr points to in tname. */ |  | ||||||
|       tname.z = zCsr; |  | ||||||
|       tname.n = len; |  | ||||||
|  |  | ||||||
|       /* Advance zCsr to the next token. Store that token type in 'token', |  | ||||||
|       ** and it's length in 'len' (to be used next iteration of this loop). |  | ||||||
|       */ |  | ||||||
|       do { |  | ||||||
|         zCsr += len; |  | ||||||
|         len = sqlite3GetToken(zCsr, &token); |  | ||||||
|       }while( token==TK_SPACE ); |  | ||||||
|       assert( len>0 ); |  | ||||||
|  |  | ||||||
|       /* Variable 'dist' stores the number of tokens read since the most |  | ||||||
|       ** recent TK_DOT or TK_ON. This means that when a WHEN, FOR or BEGIN  |  | ||||||
|       ** token is read and 'dist' equals 2, the condition stated above |  | ||||||
|       ** to be met. |  | ||||||
|       ** |  | ||||||
|       ** Note that ON cannot be a database, table or column name, so |  | ||||||
|       ** there is no need to worry about syntax like  |  | ||||||
|       ** "CREATE TRIGGER ... ON ON.ON BEGIN ..." etc. |  | ||||||
|       */ |  | ||||||
|       dist++; |  | ||||||
|       if( token==TK_DOT || token==TK_ON ){ |  | ||||||
|         dist = 0; |  | ||||||
|       } |  | ||||||
|     } while( dist!=2 || (token!=TK_WHEN && token!=TK_FOR && token!=TK_BEGIN) ); |  | ||||||
|  |  | ||||||
|     /* Variable tname now contains the token that is the old table-name |  | ||||||
|     ** in the CREATE TRIGGER statement. |  | ||||||
|     */ |  | ||||||
|     zRet = sqlite3MPrintf("%.*s%Q%s", tname.z - zSql, zSql,  |  | ||||||
|        zTableName, tname.z+tname.n); |  | ||||||
|     sqlite3_result_text(context, zRet, -1, sqlite3FreeX); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| #endif   /* !SQLITE_OMIT_TRIGGER */ |  | ||||||
| #endif   /* !SQLITE_OMIT_ALTERTABLE */ |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** EXPERIMENTAL - This is not an official function.  The interface may | ** EXPERIMENTAL - This is not an official function.  The interface may | ||||||
| @@ -975,33 +851,6 @@ struct StdDevCtx { | |||||||
|   int cnt;        /* Number of terms counted */ |   int cnt;        /* Number of terms counted */ | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #if 0   /* Omit because math library is required */ |  | ||||||
| /* |  | ||||||
| ** Routines used to compute the standard deviation as an aggregate. |  | ||||||
| */ |  | ||||||
| static void stdDevStep(sqlite3_context *context, int argc, const char **argv){ |  | ||||||
|   StdDevCtx *p; |  | ||||||
|   double x; |  | ||||||
|   if( argc<1 ) return; |  | ||||||
|   p = sqlite3_aggregate_context(context, sizeof(*p)); |  | ||||||
|   if( p && argv[0] ){ |  | ||||||
|     x = sqlite3AtoF(argv[0], 0); |  | ||||||
|     p->sum += x; |  | ||||||
|     p->sum2 += x*x; |  | ||||||
|     p->cnt++; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| static void stdDevFinalize(sqlite3_context *context){ |  | ||||||
|   double rN = sqlite3_aggregate_count(context); |  | ||||||
|   StdDevCtx *p = sqlite3_aggregate_context(context, sizeof(*p)); |  | ||||||
|   if( p && p->cnt>1 ){ |  | ||||||
|     double rCnt = cnt; |  | ||||||
|     sqlite3_set_result_double(context,  |  | ||||||
|        sqrt((p->sum2 - p->sum*p->sum/rCnt)/(rCnt-1.0))); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** The following structure keeps track of state information for the | ** The following structure keeps track of state information for the | ||||||
| ** count() aggregate function. | ** count() aggregate function. | ||||||
| @@ -1122,12 +971,6 @@ void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ | |||||||
|     { "last_insert_rowid",  0, 1, SQLITE_UTF8,    0, last_insert_rowid }, |     { "last_insert_rowid",  0, 1, SQLITE_UTF8,    0, last_insert_rowid }, | ||||||
|     { "changes",            0, 1, SQLITE_UTF8,    0, changes    }, |     { "changes",            0, 1, SQLITE_UTF8,    0, changes    }, | ||||||
|     { "total_changes",      0, 1, SQLITE_UTF8,    0, total_changes }, |     { "total_changes",      0, 1, SQLITE_UTF8,    0, total_changes }, | ||||||
| #ifndef SQLITE_OMIT_ALTERTABLE |  | ||||||
|     { "sqlite_rename_table",  2, 0, SQLITE_UTF8,  0, renameTableFunc}, |  | ||||||
| #ifndef SQLITE_OMIT_TRIGGER |  | ||||||
|     { "sqlite_rename_trigger",2, 0, SQLITE_UTF8,  0, renameTriggerFunc}, |  | ||||||
| #endif |  | ||||||
| #endif |  | ||||||
| #ifdef SQLITE_SOUNDEX | #ifdef SQLITE_SOUNDEX | ||||||
|     { "soundex",            1, 0, SQLITE_UTF8, 0, soundexFunc}, |     { "soundex",            1, 0, SQLITE_UTF8, 0, soundexFunc}, | ||||||
| #endif | #endif | ||||||
| @@ -1153,9 +996,6 @@ void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ | |||||||
|     { "avg",    1, 0, 0, sumStep,      avgFinalize    }, |     { "avg",    1, 0, 0, sumStep,      avgFinalize    }, | ||||||
|     { "count",  0, 0, 0, countStep,    countFinalize  }, |     { "count",  0, 0, 0, countStep,    countFinalize  }, | ||||||
|     { "count",  1, 0, 0, countStep,    countFinalize  }, |     { "count",  1, 0, 0, countStep,    countFinalize  }, | ||||||
| #if 0 |  | ||||||
|     { "stddev", 1, 0, stdDevStep,   stdDevFinalize }, |  | ||||||
| #endif |  | ||||||
|   }; |   }; | ||||||
|   int i; |   int i; | ||||||
|  |  | ||||||
| @@ -1175,6 +1015,9 @@ void sqlite3RegisterBuiltinFunctions(sqlite3 *db){ | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | #ifndef SQLITE_OMIT_ALTERTABLE | ||||||
|  |   sqlite3AlterFunctions(db); | ||||||
|  | #endif | ||||||
|   for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){ |   for(i=0; i<sizeof(aAggs)/sizeof(aAggs[0]); i++){ | ||||||
|     void *pArg = 0; |     void *pArg = 0; | ||||||
|     switch( aAggs[i].argType ){ |     switch( aAggs[i].argType ){ | ||||||
|   | |||||||
| @@ -11,7 +11,7 @@ | |||||||
| ************************************************************************* | ************************************************************************* | ||||||
| ** Internal interface definitions for SQLite. | ** Internal interface definitions for SQLite. | ||||||
| ** | ** | ||||||
| ** @(#) $Id: sqliteInt.h,v 1.370 2005/02/09 01:40:25 danielk1977 Exp $ | ** @(#) $Id: sqliteInt.h,v 1.371 2005/02/15 21:36:18 drh Exp $ | ||||||
| */ | */ | ||||||
| #ifndef _SQLITEINT_H_ | #ifndef _SQLITEINT_H_ | ||||||
| #define _SQLITEINT_H_ | #define _SQLITEINT_H_ | ||||||
| @@ -1539,6 +1539,7 @@ sqlite3_value *sqlite3GetTransientValue(sqlite3*db); | |||||||
| extern const unsigned char sqlite3UpperToLower[]; | extern const unsigned char sqlite3UpperToLower[]; | ||||||
| void sqlite3RootPageMoved(Db*, int, int); | void sqlite3RootPageMoved(Db*, int, int); | ||||||
| void sqlite3Reindex(Parse*, Token*, Token*); | void sqlite3Reindex(Parse*, Token*, Token*); | ||||||
|  | void sqlite3AlterFunctions(sqlite3*); | ||||||
| void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); | void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); | ||||||
| int sqlite3GetToken(const unsigned char *, int *); | int sqlite3GetToken(const unsigned char *, int *); | ||||||
| void sqlite3NestedParse(Parse*, const char*, ...); | void sqlite3NestedParse(Parse*, const char*, ...); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user