@ -162,7 +162,7 @@ static bool do_connect(enum trivalue reuse_previous_specification,
static bool do_edit ( const char * filename_arg , PQExpBuffer query_buf ,
static bool do_edit ( const char * filename_arg , PQExpBuffer query_buf ,
int lineno , bool discard_on_quit , bool * edited ) ;
int lineno , bool discard_on_quit , bool * edited ) ;
static bool do_shell ( const char * command ) ;
static bool do_shell ( const char * command ) ;
static bool do_watch ( PQExpBuffer query_buf , double sleep , int iter ) ;
static bool do_watch ( PQExpBuffer query_buf , double sleep , int iter , int min_rows ) ;
static bool lookup_object_oid ( EditableObjectType obj_type , const char * desc ,
static bool lookup_object_oid ( EditableObjectType obj_type , const char * desc ,
Oid * obj_oid ) ;
Oid * obj_oid ) ;
static bool get_create_object_cmd ( EditableObjectType obj_type , Oid oid ,
static bool get_create_object_cmd ( EditableObjectType obj_type , Oid oid ,
@ -2775,13 +2775,15 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch,
{
{
bool have_sleep = false ;
bool have_sleep = false ;
bool have_iter = false ;
bool have_iter = false ;
bool have_min_rows = false ;
double sleep = 2 ;
double sleep = 2 ;
int iter = 0 ;
int iter = 0 ;
int min_rows = 0 ;
/*
/*
* Parse arguments . We allow either an unlabeled interval or
* Parse arguments . We allow either an unlabeled interval or
* " name=value " , where name is from the set ( ' i ' , ' interval ' , ' c ' ,
* " name=value " , where name is from the set ( ' i ' , ' interval ' , ' c ' ,
* ' count ' ) .
* ' count ' , ' m ' , ' min_rows ' ) .
*/
*/
while ( success )
while ( success )
{
{
@ -2838,6 +2840,26 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch,
}
}
}
}
}
}
else if ( strncmp ( " m= " , opt , strlen ( " m= " ) ) = = 0 | |
strncmp ( " min_rows= " , opt , strlen ( " min_rows= " ) ) = = 0 )
{
if ( have_min_rows )
{
pg_log_error ( " \\ watch: minimum row count specified more than once " ) ;
success = false ;
}
else
{
have_min_rows = true ;
errno = 0 ;
min_rows = strtoint ( valptr , & opt_end , 10 ) ;
if ( min_rows < = 0 | | * opt_end | | errno = = ERANGE )
{
pg_log_error ( " \\ watch: incorrect minimum row count \" %s \" " , valptr ) ;
success = false ;
}
}
}
else
else
{
{
pg_log_error ( " \\ watch: unrecognized parameter \" %s \" " , opt ) ;
pg_log_error ( " \\ watch: unrecognized parameter \" %s \" " , opt ) ;
@ -2874,7 +2896,7 @@ exec_command_watch(PsqlScanState scan_state, bool active_branch,
/* If query_buf is empty, recall and execute previous query */
/* If query_buf is empty, recall and execute previous query */
( void ) copy_previous_query ( query_buf , previous_buf ) ;
( void ) copy_previous_query ( query_buf , previous_buf ) ;
success = do_watch ( query_buf , sleep , iter ) ;
success = do_watch ( query_buf , sleep , iter , min_rows ) ;
}
}
/* Reset the query buffer as though for \r */
/* Reset the query buffer as though for \r */
@ -5144,7 +5166,7 @@ do_shell(const char *command)
* onto a bunch of exec_command ' s variables to silence stupider compilers .
* onto a bunch of exec_command ' s variables to silence stupider compilers .
*/
*/
static bool
static bool
do_watch ( PQExpBuffer query_buf , double sleep , int iter )
do_watch ( PQExpBuffer query_buf , double sleep , int iter , int min_rows )
{
{
long sleep_ms = ( long ) ( sleep * 1000 ) ;
long sleep_ms = ( long ) ( sleep * 1000 ) ;
printQueryOpt myopt = pset . popt ;
printQueryOpt myopt = pset . popt ;
@ -5274,7 +5296,7 @@ do_watch(PQExpBuffer query_buf, double sleep, int iter)
myopt . title = title ;
myopt . title = title ;
/* Run the query and print out the result */
/* Run the query and print out the result */
res = PSQLexecWatch ( query_buf - > data , & myopt , pagerpipe ) ;
res = PSQLexecWatch ( query_buf - > data , & myopt , pagerpipe , min_rows ) ;
/*
/*
* PSQLexecWatch handles the case where we can no longer repeat the
* PSQLexecWatch handles the case where we can no longer repeat the