Merge branch 'master' into replication

This commit is contained in:
Alain Jobart 2014-04-11 15:30:54 -07:00
Родитель aca2b512f8 31f75ffabd
Коммит 41abf265b2
12 изменённых файлов: 422 добавлений и 293 удалений

Просмотреть файл

@ -1516,6 +1516,29 @@ update b set eid=1
"SetValue": null
}
# pk changed as qualified column name
update b set a.eid=1
{
"PlanId": "DML_SUBQUERY",
"Reason": "WHERE",
"TableName": "b",
"DisplayQuery": "update b set a.eid = ?",
"FieldQuery": null,
"FullQuery": "update b set a.eid = 1",
"OuterQuery": "update b set a.eid = 1 where eid = :0 and id = :1",
"Subquery": "select eid, id from b limit :_vtMaxResultSize for update",
"IndexUsed": "",
"ColumnNumbers": null,
"PKValues": null,
"SecondaryPKValues": [
1,
null
],
"SubqueryPKColumns": null,
"SetKey": "",
"SetValue": null
}
# complex pk change
update b set eid=foo()
{
@ -1599,6 +1622,29 @@ update a set name='foo' where eid=1 and id=1
"SetValue": null
}
# update with qualified column name
update a set a.name='foo' where eid=1 and id=1
{
"PlanId": "DML_PK",
"Reason": "DEFAULT",
"TableName": "a",
"DisplayQuery": "update a set a.name = ? where eid = ? and id = ?",
"FieldQuery": null,
"FullQuery": "update a set a.name = 'foo' where eid = 1 and id = 1",
"OuterQuery": "update a set a.name = 'foo' where eid = 1 and id = 1",
"Subquery": "select eid, id from a where eid = 1 and id = 1 limit :_vtMaxResultSize for update",
"IndexUsed": "",
"ColumnNumbers": null,
"PKValues": [
1,
1
],
"SecondaryPKValues": null,
"SubqueryPKColumns": null,
"SetKey": "",
"SetValue": null
}
# partial pk
update a set name='foo' where eid=1
{

Просмотреть файл

@ -123,6 +123,7 @@ insert /* select */ into a select b, c from d
insert /* on duplicate */ into a values (1, 2) on duplicate key update b = values(a), c = d
update /* simple */ a set b = 3
update /* a.b */ a.b set b = 3
update /* b.c */ a set b.c = 3
update /* list */ a set b = 3, c = 4
update /* expression */ a set b = 3+4
update /* where */ a set b = 3 where a = b

Просмотреть файл

@ -730,7 +730,7 @@ func (node *Node) parseList() (values interface{}, isList bool) {
func (node *Node) execAnalyzeUpdateExpressions(pkIndex *schema.Index) (pkValues []interface{}, ok bool) {
for i := 0; i < node.Len(); i++ {
columnName := string(node.At(i).At(0).Value)
columnName := string(node.At(i).At(0).execAnalyzeSelectExpression())
index := pkIndex.FindColumn(columnName)
if index == -1 {
continue

Просмотреть файл

@ -292,10 +292,10 @@ var yyExca = []int{
-1, 1,
1, -1,
-2, 0,
-1, 64,
-1, 66,
35, 43,
-2, 38,
-1, 172,
-1, 175,
35, 43,
-2, 66,
}
@ -306,113 +306,115 @@ const yyPrivate = 57344
var yyTokenNames []string
var yyStates []string
const yyLast = 549
const yyLast = 562
var yyAct = []int{
74, 67, 49, 302, 326, 268, 221, 136, 181, 242,
170, 156, 72, 145, 143, 105, 159, 66, 334, 64,
334, 135, 3, 104, 152, 62, 32, 61, 108, 109,
201, 34, 51, 266, 22, 23, 24, 25, 59, 104,
60, 104, 201, 40, 50, 54, 36, 22, 23, 24,
25, 22, 23, 24, 25, 228, 97, 99, 38, 39,
288, 287, 55, 22, 23, 24, 25, 260, 56, 37,
246, 132, 137, 198, 146, 138, 147, 259, 199, 206,
335, 77, 333, 107, 91, 294, 81, 131, 134, 86,
96, 51, 290, 150, 51, 265, 65, 78, 79, 80,
291, 257, 52, 255, 202, 70, 175, 144, 177, 84,
132, 132, 180, 285, 155, 186, 187, 258, 190, 191,
192, 193, 194, 195, 196, 197, 178, 179, 69, 200,
174, 310, 82, 83, 63, 146, 106, 147, 154, 87,
176, 203, 146, 188, 147, 209, 121, 122, 123, 308,
219, 262, 85, 108, 109, 132, 224, 210, 165, 211,
225, 102, 218, 309, 208, 283, 212, 213, 205, 207,
216, 223, 226, 320, 321, 220, 204, 282, 163, 244,
245, 166, 239, 281, 203, 189, 250, 251, 243, 153,
247, 93, 249, 240, 229, 244, 245, 279, 103, 177,
153, 201, 280, 254, 248, 232, 233, 234, 235, 236,
318, 237, 238, 297, 182, 116, 117, 118, 119, 120,
121, 122, 123, 277, 264, 210, 94, 267, 278, 46,
162, 164, 161, 230, 256, 119, 120, 121, 122, 123,
77, 275, 276, 104, 93, 81, 12, 313, 86, 22,
23, 24, 25, 173, 293, 133, 78, 79, 80, 312,
173, 149, 241, 240, 70, 142, 284, 219, 84, 171,
141, 300, 303, 299, 140, 89, 52, 173, 92, 298,
295, 133, 338, 304, 289, 286, 241, 69, 272, 271,
168, 82, 83, 167, 314, 151, 311, 100, 87, 146,
339, 147, 98, 95, 47, 57, 316, 90, 132, 203,
132, 85, 322, 327, 327, 324, 315, 296, 328, 330,
303, 45, 331, 253, 323, 342, 325, 12, 332, 12,
51, 77, 336, 157, 101, 340, 81, 106, 183, 86,
184, 185, 43, 343, 344, 77, 65, 78, 79, 80,
81, 215, 41, 86, 88, 70, 269, 307, 270, 84,
133, 78, 79, 80, 222, 12, 13, 14, 15, 70,
306, 48, 274, 84, 153, 27, 12, 341, 69, 329,
158, 33, 82, 83, 63, 227, 160, 35, 12, 87,
77, 53, 69, 58, 16, 81, 82, 83, 86, 217,
148, 261, 85, 87, 337, 133, 78, 79, 80, 81,
319, 301, 86, 305, 70, 273, 85, 71, 84, 133,
78, 79, 80, 232, 233, 234, 235, 236, 139, 237,
238, 76, 84, 73, 75, 263, 214, 69, 110, 68,
81, 82, 83, 86, 17, 18, 20, 19, 87, 172,
133, 78, 79, 80, 26, 82, 83, 231, 169, 139,
42, 85, 87, 84, 111, 115, 113, 114, 28, 29,
30, 31, 21, 44, 11, 85, 10, 9, 8, 317,
7, 6, 127, 128, 129, 130, 82, 83, 124, 125,
126, 5, 4, 87, 116, 117, 118, 119, 120, 121,
122, 123, 2, 1, 0, 0, 85, 0, 0, 0,
112, 116, 117, 118, 119, 120, 121, 122, 123, 292,
0, 0, 116, 117, 118, 119, 120, 121, 122, 123,
252, 0, 0, 116, 117, 118, 119, 120, 121, 122,
123, 116, 117, 118, 119, 120, 121, 122, 123,
76, 69, 49, 302, 326, 221, 74, 138, 268, 242,
159, 63, 173, 145, 183, 147, 334, 68, 108, 334,
66, 137, 3, 107, 154, 111, 112, 232, 233, 234,
235, 236, 52, 237, 238, 202, 64, 50, 51, 266,
61, 107, 107, 40, 202, 162, 22, 23, 24, 25,
22, 23, 24, 25, 57, 60, 55, 100, 12, 13,
14, 15, 36, 228, 102, 22, 23, 24, 25, 22,
23, 24, 25, 135, 139, 200, 260, 140, 335, 32,
37, 333, 38, 39, 34, 294, 288, 16, 284, 134,
136, 287, 56, 52, 246, 152, 52, 290, 158, 51,
110, 265, 51, 257, 255, 148, 203, 149, 259, 178,
146, 158, 291, 135, 135, 182, 285, 157, 188, 189,
97, 192, 193, 194, 195, 196, 197, 198, 199, 180,
181, 258, 148, 156, 149, 201, 93, 17, 18, 20,
19, 99, 168, 204, 177, 148, 62, 149, 210, 124,
125, 126, 52, 190, 206, 208, 308, 135, 219, 262,
212, 211, 166, 225, 109, 169, 209, 111, 112, 213,
214, 224, 217, 223, 226, 244, 245, 220, 12, 122,
123, 124, 125, 126, 179, 105, 204, 239, 250, 251,
310, 309, 247, 279, 243, 191, 240, 229, 280, 83,
249, 283, 88, 282, 254, 281, 248, 244, 245, 53,
80, 81, 82, 155, 165, 167, 164, 155, 141, 256,
277, 106, 86, 95, 202, 278, 267, 96, 211, 318,
207, 264, 79, 22, 23, 24, 25, 83, 297, 184,
88, 313, 46, 275, 276, 84, 85, 67, 80, 81,
82, 312, 89, 176, 293, 12, 72, 230, 151, 176,
86, 95, 241, 240, 144, 87, 107, 52, 174, 143,
142, 300, 303, 298, 62, 338, 299, 53, 289, 71,
286, 295, 304, 84, 85, 65, 176, 272, 91, 271,
89, 94, 171, 339, 314, 241, 311, 170, 232, 233,
234, 235, 236, 87, 237, 238, 153, 103, 135, 204,
135, 322, 316, 327, 327, 324, 101, 98, 328, 330,
303, 47, 331, 58, 323, 92, 325, 205, 315, 296,
52, 332, 336, 79, 12, 340, 51, 45, 83, 253,
342, 88, 160, 343, 344, 104, 109, 43, 53, 80,
81, 82, 41, 185, 79, 186, 187, 72, 216, 83,
26, 86, 88, 90, 269, 307, 270, 222, 306, 67,
80, 81, 82, 274, 28, 29, 30, 31, 72, 155,
71, 48, 86, 341, 84, 85, 329, 12, 12, 27,
161, 89, 148, 33, 149, 227, 163, 35, 54, 59,
218, 71, 150, 79, 87, 84, 85, 65, 83, 261,
337, 88, 89, 319, 301, 305, 273, 73, 53, 80,
81, 82, 78, 75, 79, 87, 77, 72, 263, 83,
215, 86, 88, 113, 83, 70, 175, 88, 231, 53,
80, 81, 82, 172, 53, 80, 81, 82, 72, 42,
71, 21, 86, 141, 84, 85, 44, 86, 11, 320,
321, 89, 10, 9, 8, 114, 118, 116, 117, 7,
6, 71, 5, 4, 87, 84, 85, 2, 1, 0,
84, 85, 89, 130, 131, 132, 133, 89, 0, 127,
128, 129, 0, 0, 0, 87, 0, 0, 0, 0,
87, 119, 120, 121, 122, 123, 124, 125, 126, 317,
0, 115, 119, 120, 121, 122, 123, 124, 125, 126,
0, 0, 0, 0, 119, 120, 121, 122, 123, 124,
125, 126, 292, 0, 0, 119, 120, 121, 122, 123,
124, 125, 126, 252, 0, 0, 119, 120, 121, 122,
123, 124, 125, 126, 119, 120, 121, 122, 123, 124,
125, 126,
}
var yyPact = []int{
361, -1000, -1000, 200, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -61, -44, -18,
-29, 372, 335, -1000, -1000, -1000, 324, -1000, 292, 269,
363, 241, -46, -26, -1000, -19, -1000, 270, -53, 241,
-1000, -1000, 311, -1000, 339, 269, 274, 8, 269, 138,
-1000, 181, -1000, 268, 23, 241, 267, -32, 262, 314,
97, 190, -1000, -1000, 318, 7, 88, 443, -1000, 370,
325, -1000, -1000, 415, 230, 226, -1000, 221, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, 220, -1000, 217,
241, 260, 365, 241, 370, -1000, 313, -77, 146, 258,
-1000, -1000, 255, 225, 311, 241, -1000, 67, 370, 370,
415, 170, 317, 415, 415, 118, 415, 415, 415, 415,
415, 415, 415, 415, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, 443, -3, -37, 14, -11, 443, -1000, 384,
61, 311, 372, 63, 56, -1000, 370, 370, 323, 246,
191, -1000, 352, 370, -1000, -1000, -1000, -1000, 92, 241,
-1000, -34, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 180,
369, 242, 117, -6, -1000, -1000, -1000, -1000, -1000, -1000,
473, -1000, 384, 170, 415, 415, 473, 465, -1000, 298,
164, 164, 164, 73, 73, -1000, -1000, -1000, 241, -1000,
-1000, 415, -1000, 473, -1000, -12, 311, -14, 2, -1000,
-1000, -5, -13, -1000, 87, 170, 200, -20, -1000, -1000,
352, 342, 345, 88, 254, -1000, -1000, 253, -1000, 362,
218, 218, -1000, -1000, 169, 143, 129, 123, 111, 151,
-2, 372, -1000, 250, -27, -28, 249, -23, -15, -1000,
473, 454, 415, -1000, 473, -1000, -30, -1000, -1000, -1000,
370, -1000, 287, 160, -1000, -1000, 246, 342, -1000, 415,
415, -1000, -1000, 359, 344, 369, 85, -1000, 109, -1000,
77, -1000, -1000, -1000, -1000, -1000, 133, 215, 203, -1000,
-1000, -1000, 415, 473, -1000, -1000, 285, 170, -1000, -1000,
426, 157, -1000, 147, -1000, 352, 370, 415, 370, -1000,
-1000, -1000, 241, 241, 473, 373, -1000, 415, 415, -1000,
-1000, -1000, 342, 88, 148, 88, -33, -1000, -35, 241,
473, -1000, 266, -1000, 241, -1000, 138, -1000, 371, 304,
-1000, -1000, 241, 241, -1000,
54, -1000, -1000, 184, -1000, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -8, -28, -7,
-5, 384, 335, -1000, -1000, -1000, 329, -1000, 308, 286,
373, 242, -35, 4, -1000, -33, -1000, 288, -36, 239,
-1000, -1000, 334, -1000, 348, 286, 292, 60, 286, 170,
-1000, 182, -1000, 44, 282, 74, 239, 281, -25, 272,
325, 121, -1000, 213, -1000, -1000, 327, 24, 102, 444,
-1000, 404, 383, -1000, -1000, 409, 226, 225, -1000, 220,
-1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 313,
-1000, 214, 242, 271, 370, 242, 404, 239, -1000, 322,
-48, 130, 262, -1000, -1000, 257, 224, 334, 239, -1000,
111, 404, 404, 409, 195, 332, 409, 409, 128, 409,
409, 409, 409, 409, 409, 409, 409, -1000, -1000, -1000,
-1000, -1000, -1000, -1000, -1000, 444, -40, 20, -9, 444,
-1000, 174, 212, 334, 384, 66, 53, -1000, 404, 404,
330, 242, 208, -1000, 355, 404, -1000, -1000, -1000, -1000,
-1000, 107, 239, -1000, -26, -1000, -1000, -1000, -1000, -1000,
-1000, -1000, 204, 244, 251, 145, 18, -1000, -1000, -1000,
-1000, -1000, 486, -1000, 174, 195, 409, 409, 486, 478,
-1000, 314, 108, 108, 108, 76, 76, -1000, -1000, -1000,
-1000, -1000, 409, -1000, 486, -1000, -11, 334, -12, 16,
-1000, -1000, 26, -4, -1000, 95, 195, 184, -14, -1000,
355, 350, 353, 102, 254, -1000, -1000, 252, -1000, 363,
218, 218, -1000, -1000, 166, 139, 151, 149, 147, -27,
1, 384, -1000, 245, 3, -2, 243, -18, -3, -1000,
486, 467, 409, -1000, 486, -1000, -30, -1000, -1000, -1000,
404, -1000, 299, 185, -1000, -1000, 242, 350, -1000, 409,
409, -1000, -1000, 357, 352, 244, 92, -1000, 137, -1000,
136, -1000, -1000, -1000, -1000, -1000, 113, 207, 197, -1000,
-1000, -1000, 409, 486, -1000, -1000, 297, 195, -1000, -1000,
456, 176, -1000, 433, -1000, 355, 404, 409, 404, -1000,
-1000, -1000, 239, 239, 486, 380, -1000, 409, 409, -1000,
-1000, -1000, 350, 102, 171, 102, -34, -1000, -37, 242,
486, -1000, 259, -1000, 239, -1000, 170, -1000, 377, 319,
-1000, -1000, 239, 239, -1000,
}
var yyPgo = []int{
0, 503, 502, 21, 492, 491, 481, 480, 478, 477,
476, 474, 454, 473, 472, 460, 27, 25, 19, 15,
458, 10, 457, 449, 229, 9, 24, 17, 439, 438,
436, 435, 8, 7, 1, 434, 433, 431, 14, 13,
12, 417, 415, 413, 6, 411, 3, 410, 5, 404,
401, 400, 399, 4, 2, 44, 393, 391, 387, 386,
385, 381, 380, 0, 11, 375,
0, 478, 477, 21, 473, 472, 470, 469, 464, 463,
462, 458, 360, 456, 451, 449, 11, 36, 20, 18,
443, 12, 438, 436, 242, 9, 24, 17, 435, 433,
430, 428, 14, 7, 1, 426, 423, 422, 13, 15,
6, 417, 416, 415, 5, 414, 3, 413, 8, 410,
409, 402, 400, 4, 2, 37, 399, 398, 397, 396,
395, 393, 390, 0, 10, 389,
}
var yyR1 = []int{
@ -465,23 +467,23 @@ var yyChk = []int{
85, -14, 49, 50, 51, 52, -12, -65, -12, -12,
-12, -12, 87, -61, 92, -58, 90, 87, 87, 88,
-3, 17, -15, 18, -13, 29, -24, 35, 8, -54,
-55, -63, 35, -57, 91, 88, 87, 35, -56, 91,
-63, -16, -17, 73, -18, 35, -27, -34, -28, 67,
44, -41, -40, -36, -63, -35, -37, 20, 36, 37,
38, 25, 71, 72, 48, 91, 28, 78, 15, -24,
33, 76, -24, 53, 45, 35, 67, -63, 35, 89,
35, 20, 64, 8, 53, -19, 19, 76, 65, 66,
-29, 21, 67, 23, 24, 22, 68, 69, 70, 71,
72, 73, 74, 75, 45, 46, 47, 39, 40, 41,
42, -27, -34, 35, -27, -3, -33, -34, -34, 44,
44, 44, 44, -38, -18, -39, 79, 81, -51, 44,
-54, 35, -26, 9, -55, -18, -64, 20, -62, 93,
-59, 86, 84, 32, 85, 12, 35, 35, 35, -20,
-21, 44, -23, 35, -17, -63, 73, -63, -27, -27,
-34, -32, 44, 21, 23, 24, -34, -34, 25, 67,
-34, -34, -34, -34, -34, -34, -34, -34, 76, 115,
115, 53, 115, -34, 115, -16, 18, -16, -3, 82,
-39, -38, -18, -18, -30, 28, -3, -52, -40, -63,
-55, -40, -63, 35, -57, 91, 88, 87, 35, -56,
91, -63, 35, -16, -17, 73, -18, 35, -27, -34,
-28, 67, 44, -41, -40, -36, -63, -35, -37, 20,
36, 37, 38, 25, 71, 72, 48, 91, 28, 78,
15, -24, 33, 76, -24, 53, 45, 76, 35, 67,
-63, 35, 89, 35, 20, 64, 8, 53, -19, 19,
76, 65, 66, -29, 21, 67, 23, 24, 22, 68,
69, 70, 71, 72, 73, 74, 75, 45, 46, 47,
39, 40, 41, 42, -27, -34, -27, -3, -33, -34,
-34, 44, 44, 44, 44, -38, -18, -39, 79, 81,
-51, 44, -54, 35, -26, 9, -55, -18, -63, -64,
20, -62, 93, -59, 86, 84, 32, 85, 12, 35,
35, 35, -20, -21, 44, -23, 35, -17, -63, 73,
-27, -27, -34, -32, 44, 21, 23, 24, -34, -34,
25, 67, -34, -34, -34, -34, -34, -34, -34, -34,
115, 115, 53, 115, -34, 115, -16, 18, -16, -3,
82, -39, -38, -18, -18, -30, 28, -3, -52, -40,
-26, -44, 12, -27, 64, -63, -64, -60, 89, -26,
53, -22, 54, 55, 56, 57, 58, 60, 61, -21,
-3, 44, -25, -19, 62, 63, 76, -33, -3, -32,
@ -503,23 +505,23 @@ var yyDef = []int{
0, 0, 28, 30, 31, 32, 33, 26, 0, 0,
0, 0, 167, 0, 179, 0, 170, 0, 165, 0,
12, 29, 0, 34, 25, 0, 0, 64, 0, 16,
162, 0, 182, 0, 0, 0, 0, 0, 0, 0,
0, 0, 35, 37, -2, 182, 41, 42, 71, 0,
0, 101, 102, 0, 130, 0, 118, 0, 132, 133,
134, 135, 121, 122, 123, 119, 120, 0, 27, 154,
0, 0, 69, 0, 0, 183, 0, 180, 0, 0,
22, 166, 0, 0, 0, 0, 44, 0, 0, 0,
162, 0, 130, 182, 0, 0, 0, 0, 0, 0,
0, 0, 182, 0, 35, 37, -2, 182, 41, 42,
71, 0, 0, 101, 102, 0, 130, 0, 118, 0,
132, 133, 134, 135, 121, 122, 123, 119, 120, 0,
27, 154, 0, 0, 69, 0, 0, 0, 183, 0,
180, 0, 0, 22, 166, 0, 0, 0, 0, 44,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 86, 87, 88, 89, 90, 91,
92, 74, 0, 182, 0, 0, 0, 99, 113, 0,
0, 0, 0, 0, 0, 126, 0, 0, 0, 0,
69, 65, 140, 0, 163, 164, 17, 168, 0, 0,
183, 176, 171, 172, 173, 174, 175, 21, 23, 69,
45, 0, -2, 61, 36, 39, 40, 131, 72, 73,
76, 77, 0, 0, 0, 0, 79, 0, 83, 0,
105, 106, 107, 108, 109, 110, 111, 112, 0, 75,
103, 0, 104, 99, 114, 0, 0, 0, 0, 124,
127, 0, 0, 129, 160, 0, 94, 0, 156, 130,
0, 0, 0, 0, 0, 0, 0, 86, 87, 88,
89, 90, 91, 92, 74, 0, 0, 0, 0, 99,
113, 0, 0, 0, 0, 0, 0, 126, 0, 0,
0, 0, 69, 65, 140, 0, 163, 164, 131, 17,
168, 0, 0, 183, 176, 171, 172, 173, 174, 175,
21, 23, 69, 45, 0, -2, 61, 36, 39, 40,
72, 73, 76, 77, 0, 0, 0, 0, 79, 0,
83, 0, 105, 106, 107, 108, 109, 110, 111, 112,
75, 103, 0, 104, 99, 114, 0, 0, 0, 0,
124, 127, 0, 0, 129, 160, 0, 94, 0, 156,
140, 148, 0, 70, 0, 181, 19, 0, 177, 136,
0, 0, 52, 53, 0, 0, 0, 0, 0, 0,
0, 0, 48, 0, 0, 0, 0, 0, 0, 78,

Просмотреть файл

@ -859,7 +859,7 @@ update_list:
}
update_expression:
sql_id '=' expression
column_name '=' expression
{
$$ = $2.PushTwo($1, $3)
}

Просмотреть файл

@ -4,7 +4,10 @@
package tabletserver
import "net/http"
import (
"bytes"
"net/http"
)
func startHTMLTable(w http.ResponseWriter) {
w.Write([]byte(`
@ -52,3 +55,17 @@ func endHTMLTable(w http.ResponseWriter) {
</html>
`))
}
// wrappable inserts zero-width whitespaces to make
// the string wrappable.
func wrappable(in string) string {
buf := bytes.NewBuffer(nil)
for _, ch := range in {
buf.WriteRune(ch)
if ch == ',' || ch == ')' {
// zero-width whitespace
buf.WriteRune('\u200B')
}
}
return buf.String()
}

Просмотреть файл

@ -111,7 +111,7 @@ func querylogzHandler(w http.ResponseWriter, r *http.Request) {
MySQL: strs[12],
Conn: strs[13],
PlanType: strs[6],
Sql: strings.Trim(strs[7], "\""),
Sql: wrappable(strings.Trim(strs[7], "\"")),
Queries: strs[9],
Sources: strs[11],
Rows: strs[14],

Просмотреть файл

@ -128,14 +128,15 @@ func queryzHandler(w http.ResponseWriter, r *http.Request) {
continue
}
Value := &queryzRow{
Query: plan.DisplayQuery,
Query: wrappable(plan.DisplayQuery),
Table: plan.TableName,
Plan: plan.PlanId,
}
Value.Count, Value.tm, Value.Rows, Value.Errors = plan.Stats()
if Value.tm < 10*time.Millisecond {
timepq := time.Duration(int64(Value.tm) / Value.Count)
if timepq < 10*time.Millisecond {
Value.Color = "low"
} else if Value.tm < 100*time.Millisecond {
} else if timepq < 100*time.Millisecond {
Value.Color = "medium"
} else {
Value.Color = "high"

Просмотреть файл

@ -305,7 +305,11 @@ func handleExecError(query *proto.Query, err *error, logStats *sqlQueryStats) {
if terr.ErrorType == RETRY || terr.ErrorType == TX_POOL_FULL || terr.SqlError == mysql.DUP_ENTRY {
return
}
log.Errorf("%s: %v", terr.Message, query)
if terr.ErrorType == FATAL {
log.Errorf("%s: %v", terr.Message, query)
} else {
log.Warningf("%s: %v", terr.Message, query)
}
}
}

Просмотреть файл

@ -44,8 +44,8 @@ type ResilientSrvTopoServer struct {
topoServer SrvTopoServer
counts *stats.Counters
// mu protects the cache map itself, not the individual values
// in the cache.
// mutex protects the cache map itself, not the individual
// values in the cache.
mutex sync.Mutex
srvKeyspaceNamesCache map[string]*srvKeyspaceNamesEntry
srvKeyspaceCache map[string]*srvKeyspaceEntry
@ -73,7 +73,40 @@ type endPointsEntry struct {
mutex sync.Mutex
insertionTime time.Time
value *topo.EndPoints
// Value is the end points that were returned to the client.
Value *topo.EndPoints
// OriginalValue is the end points that were returned from
// the topology server.
OriginalValue *topo.EndPoints
}
// filterUnhealthyServers removes the unhealthy servers from the list,
// unless all servers are unhealthy, then it keeps them all.
func filterUnhealthyServers(endPoints *topo.EndPoints) *topo.EndPoints {
// no endpoints, return right away
if endPoints == nil || len(endPoints.Entries) == 0 {
return endPoints
}
healthyEndPoints := make([]topo.EndPoint, 0, len(endPoints.Entries))
for _, ep := range endPoints.Entries {
// if we are behind on replication, we're not 100% healthy
if ep.Health != nil && ep.Health[health.ReplicationLag] == health.ReplicationLagHigh {
continue
}
healthyEndPoints = append(healthyEndPoints, ep)
}
// we have healthy guys, we return them
if len(healthyEndPoints) > 0 {
return &topo.EndPoints{Entries: healthyEndPoints}
}
// we only have unhealthy guys, return them
return endPoints
}
// NewResilientSrvTopoServer creates a new ResilientSrvTopoServer
@ -198,7 +231,7 @@ func (server *ResilientSrvTopoServer) GetEndPoints(cell, keyspace, shard string,
// If the entry is fresh enough, return it
if time.Now().Sub(entry.insertionTime) < *srvTopoCacheTTL {
return entry.value, nil
return entry.Value, nil
}
// not in cache or too old, get the real value
@ -208,45 +241,15 @@ func (server *ResilientSrvTopoServer) GetEndPoints(cell, keyspace, shard string,
server.counts.Add(errorCategory, 1)
log.Errorf("GetEndPoints(%v, %v, %v, %v) failed: %v (no cached value, returning error)", cell, keyspace, shard, tabletType, err)
return nil, err
} else {
server.counts.Add(cachedCategory, 1)
log.Warningf("GetEndPoints(%v, %v, %v, %v) failed: %v (returning cached value)", cell, keyspace, shard, tabletType, err)
return entry.value, nil
}
server.counts.Add(cachedCategory, 1)
log.Warningf("GetEndPoints(%v, %v, %v, %v) failed: %v (returning cached value)", cell, keyspace, shard, tabletType, err)
return entry.Value, nil
}
// filter the values to remove unhealthy servers
result = filterUnhealthyServers(result)
// save the value we got and the current time in the cache
entry.insertionTime = time.Now()
entry.value = result
return result, nil
}
// filterUnhealthyServers removes the unhealthy servers from the list,
// unless all servers are unhealthy, then it keeps them all.
func filterUnhealthyServers(endPoints *topo.EndPoints) *topo.EndPoints {
// no endpoints, return right away
if endPoints == nil || len(endPoints.Entries) == 0 {
return endPoints
}
healthyEndPoints := make([]topo.EndPoint, 0, len(endPoints.Entries))
for _, ep := range endPoints.Entries {
// if we are behind on replication, we're not 100% healthy
if ep.Health != nil && ep.Health[health.ReplicationLag] == health.ReplicationLagHigh {
continue
}
healthyEndPoints = append(healthyEndPoints, ep)
}
// we have healthy guys, we return them
if len(healthyEndPoints) > 0 {
return &topo.EndPoints{Entries: healthyEndPoints}
}
// we only have unhealthy guys, return them
return endPoints
entry.OriginalValue, entry.Value = result, filterUnhealthyServers(result)
return entry.Value, nil
}

Просмотреть файл

@ -5,139 +5,182 @@
package vtgate
import (
"reflect"
"testing"
"github.com/youtube/vitess/go/vt/health"
"github.com/youtube/vitess/go/vt/topo"
)
func TestFilterUnhealthyServersCornerCases(t *testing.T) {
{
var source *topo.EndPoints
result := filterUnhealthyServers(source)
if result != nil {
t.Fatalf("unexpected result: %v", result)
}
}
{
source := &topo.EndPoints{}
result := filterUnhealthyServers(source)
if result == nil || result.Entries != nil {
t.Fatalf("unexpected result: %v", result)
}
}
{
source := &topo.EndPoints{Entries: []topo.EndPoint{}}
result := filterUnhealthyServers(source)
if result == nil || result.Entries == nil || len(result.Entries) != 0 {
t.Fatalf("unexpected result: %v", result)
}
}
}
func TestFilterUnhealthyServersMixed(t *testing.T) {
source := &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value",
func TestFilterUnhealthy(t *testing.T) {
cases := []struct {
source *topo.EndPoints
want *topo.EndPoints
}{
{
source: nil,
want: nil,
},
{
source: &topo.EndPoints{},
want: &topo.EndPoints{Entries: nil},
},
{
source: &topo.EndPoints{Entries: []topo.EndPoint{}},
want: &topo.EndPoints{Entries: []topo.EndPoint{}},
},
{
// All are healthy and all should be returned.
source: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value1",
},
},
topo.EndPoint{
Uid: 4,
Health: nil,
},
},
},
topo.EndPoint{
Uid: 4,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
want: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value1",
},
},
topo.EndPoint{
Uid: 4,
Health: nil,
},
},
},
topo.EndPoint{
Uid: 5,
Health: nil,
},
},
}
result := filterUnhealthyServers(source)
if len(result.Entries) != 4 ||
result.Entries[0].Uid != 1 ||
result.Entries[1].Uid != 2 ||
result.Entries[2].Uid != 3 ||
result.Entries[3].Uid != 5 {
t.Fatalf("unexpected result: %v", result)
}
}
func TestFilterUnhealthyServersAllHealthy(t *testing.T) {
source := &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value",
{
// 4 is unhealthy, it should be filtered out.
source: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value2",
},
},
topo.EndPoint{
Uid: 4,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 5,
Health: nil,
},
},
},
topo.EndPoint{
Uid: 4,
Health: nil,
want: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: nil,
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
"Random": "Value2",
},
},
topo.EndPoint{
Uid: 5,
Health: nil,
},
},
},
},
}
result := filterUnhealthyServers(source)
if len(result.Entries) != 4 ||
result.Entries[0].Uid != 1 ||
result.Entries[1].Uid != 2 ||
result.Entries[2].Uid != 3 ||
result.Entries[3].Uid != 4 {
t.Fatalf("unexpected result: %v", result)
}
}
func TestFilterUnhealthyServersAllUnhealthy(t *testing.T) {
source := &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
{
// Only unhealthy servers, return all of them.
source: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
},
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
want: &topo.EndPoints{
Entries: []topo.EndPoint{
topo.EndPoint{
Uid: 1,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 2,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
topo.EndPoint{
Uid: 3,
Health: map[string]string{
health.ReplicationLag: health.ReplicationLagHigh,
},
},
},
},
},
}
result := filterUnhealthyServers(source)
if len(result.Entries) != 3 ||
result.Entries[0].Uid != 1 ||
result.Entries[1].Uid != 2 ||
result.Entries[2].Uid != 3 {
t.Fatalf("unexpected result: %v", result)
for _, c := range cases {
if got := filterUnhealthyServers(c.source); !reflect.DeepEqual(got, c.want) {
t.Errorf("filterUnhealthy(%+v)=%+v, want %+v", c.source, got, c.want)
}
}
}

Просмотреть файл

@ -441,6 +441,18 @@ cases = [
"update vtocc_a set eid=1 where id=1",
'commit']),
MultiCase(
'pk change with qualifed column name',
['begin',
Case(sql="update vtocc_a set vtocc_a.eid = 2 where eid = 1 and id = 1",
rewritten="update vtocc_a set vtocc_a.eid = 2 where eid = 1 and id = 1 /* _stream vtocc_a (eid id ) (1 1 ) (2 1 )"),
'commit',
Case(sql='select eid from vtocc_a where id = 1',
result=[(2L,)]),
'begin',
"update vtocc_a set eid=1 where id=1",
'commit']),
MultiCase(
'partial pk',
['begin',