@@ -22,7 +22,8 @@ import (
2222)
2323
2424func  (c  * MySqlConnector ) tableRowEstimate (ctx  context.Context , schema  string , table  string ) (int64 , error ) {
25- 	rs , err  :=  c .Execute (ctx , "select table_rows from information_schema.tables where table_schema=? and table_name=?" , schema , table )
25+ 	rs , err  :=  c .Execute (ctx , fmt .Sprintf ("select table_rows from information_schema.tables where table_schema='%s' and table_name='%s'" ,
26+ 		mysql .Escape (schema ), mysql .Escape (table )))
2627	if  err  !=  nil  {
2728		return  0 , fmt .Errorf ("failed to query information schema for row count estimate: %w" , err )
2829	}
@@ -61,12 +62,13 @@ func (c *MySqlConnector) GetQRepPartitions(
6162	var  minmaxQuery  string 
6263	var  minmaxHasCount  bool 
6364	if  last  !=  nil  &&  last .Range  !=  nil  {
65+ 		// partial query, append minVal later 
6466		if  numPartitions  ==  0  {
6567			minmaxHasCount  =  true 
66- 			minmaxQuery  =  fmt .Sprintf ("SELECT MIN(`%[2]s`),MAX(`%[2]s`),COUNT(*) FROM %[1]s WHERE `%[2]s` > ? " ,
68+ 			minmaxQuery  =  fmt .Sprintf ("SELECT MIN(`%[2]s`),MAX(`%[2]s`),COUNT(*) FROM %[1]s WHERE `%[2]s` > " ,
6769				parsedWatermarkTable .MySQL (), config .WatermarkColumn )
6870		} else  {
69- 			minmaxQuery  =  fmt .Sprintf ("SELECT MIN(`%[2]s`),MAX(`%[2]s`) FROM %[1]s WHERE `%[2]s` > ? " ,
71+ 			minmaxQuery  =  fmt .Sprintf ("SELECT MIN(`%[2]s`),MAX(`%[2]s`) FROM %[1]s WHERE `%[2]s` > " ,
7072				parsedWatermarkTable .MySQL (), config .WatermarkColumn )
7173		}
7274	} else  if  numPartitions  ==  0  {
@@ -94,20 +96,21 @@ func (c *MySqlConnector) GetQRepPartitions(
9496		}
9597	}
9698
97- 	var  minVal  any 
9899	var  rs  * mysql.Result 
99100	if  last  !=  nil  &&  last .Range  !=  nil  {
101+ 		var  minVal  string 
100102		switch  lastRange  :=  last .Range .Range .(type ) {
101103		case  * protos.PartitionRange_IntRange :
102- 			minVal  =  lastRange .IntRange .End 
104+ 			minVal  =  strconv . FormatInt ( lastRange .IntRange .End ,  10 ) 
103105		case  * protos.PartitionRange_UintRange :
104- 			minVal  =  lastRange .UintRange .End 
106+ 			minVal  =  strconv . FormatUint ( lastRange .UintRange .End ,  10 ) 
105107		case  * protos.PartitionRange_TimestampRange :
106- 			minVal  =  lastRange .TimestampRange .End .AsTime ().String ()
108+ 			time  :=  lastRange .TimestampRange .End .AsTime ()
109+ 			minVal  =  "'"  +  time .Format ("2006-01-02 15:04:05.999999" ) +  "'" 
107110		}
108111
109- 		c .logger .Info ("querying min/max" , slog .String ("query" , minmaxQuery ), slog .Any ("minVal" , minVal ))
110- 		rs , err  =  c .Execute (ctx , minmaxQuery ,  minVal )
112+ 		c .logger .Info ("querying min/max" , slog .String ("query" , minmaxQuery ), slog .String ("minVal" , minVal ))
113+ 		rs , err  =  c .Execute (ctx , minmaxQuery + minVal )
111114	} else  {
112115		c .logger .Info ("querying min/max" , slog .String ("query" , minmaxQuery ))
113116		rs , err  =  c .Execute (ctx , minmaxQuery )
0 commit comments