stmtInfo_t * sql_delete_parse( sqlInfo_t * db, const char ** s )
{
	deleteInfo_t * del = sql_calloc_stmt( db, sizeof(deleteInfo_t) );
	del->stmt.type	= SQL_DELETE;

	//	'FROM'
	if ( SWITCHSTRING( parse_temp( s ) ) == CS('f','r','o','m') ) {

		del->stmt.table	= find_table( db, parse_temp( s ) );
	} else
		return 0;

	
	switch ( SWITCHSTRING( parse_temp( s ) ) ) {
		//	'SEARCH'
		case CS('s','e','a','r'):
			Com_Error( ERR_FATAL, "DELETE statement does not support SEARCH.\n" );
			break;
		//	'WHERE'
		case CS('w','h','e','r'):
			{
				parseInfo_t pi = { 0 };
				pi.db		= db;
				pi.table	= del->stmt.table;
				pi.params	= del->stmt.params;

				del->where_expr = parse_expression( s, &pi );
			} break;
	}

	return &del->stmt;
}
void det_temp(){
   
   int8 store,display;
   int16 n,t;
   int16 current_temp = 0;
   int16 target_temp;
   
   switch (detector){
         case 1 : target_temp = nv_d1_temp;
            break;
         case 2 : target_temp = nv_d2_temp;
            break;
         default : target_temp = 20000;
            break;
   }
   
   t = 60;         // 5 mins = 300 sec >> delay = 300 / 5 = 60
   n = 0;
   store=FALSE;
   display=FALSE;
   
   time_stamp();
   sprintf(event_str, ",start heating,target[%Lu],actual[%Lu],readings[%Lu]\r\n",
                           target_temp,current_temp,n);
   record_event();    
      
   for (n=1; n<t; ++n){
      det_read(store, display);           // detector read ~ 2.5 sec
      current_temp=parse_temp();
      if (current_temp >= target_temp || current_temp == 0) break;  // 0=fail (no detector)
      else delay_ms(2500);                               // completes the 5.0 loop
   }
   
   sprintf(event_str, ",end heating,target[%Lu],actual[%Lu],readings[%Lu]\r\n", 
                           target_temp,current_temp,n);
   record_event();   
}
//	INSERT INTO "commodities_events" VALUES(7, 5, 3, 400, 600);
//	INSERT INTO contacts(player,npc) VALUES(?,?);
stmtInfo_t * sql_insert_parse( sqlInfo_t * db, const char ** s )
{
	columnInfo_t *	c[ MAX_COLUMNS_PER_TABLE ];
	int	i,count=0;
	tableInfo_t * table;
	insertInfo_t * insert;
	char * n;

	//	'INTO'
	parse_temp( s );


	n = parse_temp( s );

	if ( db->create_filter ) {

		if ( Q_stricmp( n, db->create_filter ) ) {
			return 0;
		}
	}

	switch ( CS(n[0],n[1],n[2],0) )
	{
	case CS('s','v','_',0):
		if ( db->memory_tag == TAG_SQL_CLIENT && !db->create_filter  )
			return 0;
		n += 3;
		break;
	case CS('c','l','_',0):
		if ( db->memory_tag == TAG_SQL_SERVER && !db->create_filter  )
			return 0;
		n += 3;
		break;
	case CS('b','g','_',0):
		n += 3;
		break;
	}


	table = find_table( db, n );
	if ( !table )
		return 0;

	ASSERT( table );

	insert = sql_calloc_stmt( db, sizeof(insertInfo_t) );
	insert->stmt.type	= SQL_INSERT;
	insert->stmt.table	= table;

	//	parse column names
	if ( parse_tofirstparam( s ) )
	{
		do
		{
			char * name = parse_temp( s );
			c[ count ] = find_column( table, name );

#ifdef DEVELOPER
			if ( c[ count ] == 0 ) {
				Com_Error( ERR_FATAL, "column '%s' does not exist on table '%s'.\n", name, table->name );
			}
#endif
			count++;

		} while( parse_tonextparam( s ) );
	} else
	{
		for ( i=0; i<table->column_count; i++ )
			c[ count++ ] = &table->columns[ i ];
	}

	//	skip VALUES keyword
	switch ( SWITCHSTRING( parse_temp( s ) ) )
	{
		case CS('s','e','l','e'):
			{
				insert->select = (selectInfo_t*)sql_select_parse( db, s );
				for ( i=0; i<count; i++ ) {
					insert->columns[ i ] = (char)c[ i ]->num;
				}
				ASSERT( count == insert->select->column_count );

			} break;
		
		case CS('v','a','l','u'):
			{
				parseInfo_t	pi = { 0 };

				pi.db		= db;
				pi.params	= insert->stmt.params;
				pi.table	= insert->stmt.table;
				pi.flags	= PARSE_ASSIGN_TO_COLUMN;
				pi.more		= 1;

				//	parse column assignments
				if ( parse_tofirstparam( s ) )
				{
					for ( i=0; pi.more; i++ ) {
						pi.column = c[ i ]->num;
						insert->values_expr[ i ] = parse_expression( s, &pi );
					}
					insert->values_count = i;
				}

				ASSERT( insert->values_count == count );

			} break;

		case CS('r','o','w','s'):
			{
				cellInfo_t * row;
				parseInfo_t	pi = { 0 };
				Expr	e;

				pi.db		= db;
				pi.params	= insert->stmt.params;
				pi.table	= insert->stmt.table;
				pi.more		= 1;

				if ( parse_tofirstparam( s ) )
				{

					while ( pi.more ) {
						row = sql_insert_begin( db, table );

						for ( i=0; i<table->column_count; i++ ) {
							
							int top = db->stmt_buffer.c->top;

							e = parse_expression( s, &pi );
							row[ i ] = sql_eval( db, e, table, 0,0,1, 0, 0 );

							if ( table->columns[ i ].format == STRING ) {
								row[ i ].string = sql_alloc_string( db, row[ i ].string );
							}

							db->stmt_buffer.c->top = top;
						}

						sql_insert_done( db, table );
					}
				}

				return 0;

			} break;
	}

	return &insert->stmt;
}