@ -48,7 +48,12 @@ func (w *testResponseWriter) Flush() {
}
func TestCSVInput ( t * testing . T ) {
var requestXML = [ ] byte ( `
var testTable = [ ] struct {
requestXML [ ] byte
expectedResult [ ] byte
} {
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT one , two , three from S3Object < / Expression >
@ -67,7 +72,35 @@ func TestCSVInput(t *testing.T) {
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` )
` ) , [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 235 , 0 , 0 , 0 , 67 , 213 , 243 , 57 , 141 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 253 , 105 , 8 , 216 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT COUNT ( * ) AS total_record_count from S3Object < / Expression >
< ExpressionType > SQL < / ExpressionType >
< InputSerialization >
< CompressionType > NONE < / CompressionType >
< CSV >
< FileHeaderInfo > USE < / FileHeaderInfo >
< / CSV >
< / InputSerialization >
< OutputSerialization >
< JSON >
< / JSON >
< / OutputSerialization >
< RequestProgress >
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` ) , [ ] byte {
0 , 0 , 0 , 126 , 0 , 0 , 0 , 85 , 56 , 193 , 36 , 188 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 123 , 34 , 116 , 111 , 116 , 97 , 108 , 95 , 114 , 101 , 99 , 111 , 114 , 100 , 95 , 99 , 111 , 117 , 110 , 116 , 34 , 58 , 51 , 125 , 10 , 196 , 183 , 134 , 242 , 0 , 0 , 0 , 235 , 0 , 0 , 0 , 67 , 213 , 243 , 57 , 141 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 50 , 53 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 47 , 153 , 24 , 28 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
}
var csvData = [ ] byte ( ` one , two , three
- 1 , foo , true
@ -75,32 +108,36 @@ func TestCSVInput(t *testing.T) {
2.5 , baz , true
` )
var expectedResult = [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 235 , 0 , 0 , 0 , 67 , 213 , 243 , 57 , 141 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 53 , 48 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 253 , 105 , 8 , 216 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
}
s3Select , err := NewS3Select ( bytes . NewReader ( requestXML ) )
if err != nil {
t . Fatal ( err )
}
for _ , testCase := range testTable {
s3Select , err := NewS3Select ( bytes . NewReader ( testCase . requestXML ) )
if err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( func ( offset , length int64 ) ( io . ReadCloser , error ) {
return ioutil . NopCloser ( bytes . NewReader ( csvData ) ) , nil
} ) ; err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( func ( offset , length int64 ) ( io . ReadCloser , error ) {
return ioutil . NopCloser ( bytes . NewReader ( csvData ) ) , nil
} ) ; err != nil {
t . Fatal ( err )
}
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
if ! reflect . DeepEqual ( w . response , expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
if ! reflect . DeepEqual ( w . response , testCase . expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
}
}
}
func TestJSONInput ( t * testing . T ) {
var requestXML = [ ] byte ( `
var testTable = [ ] struct {
requestXML [ ] byte
expectedResult [ ] byte
} {
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT one , two , three from S3Object < / Expression >
@ -119,39 +156,72 @@ func TestJSONInput(t *testing.T) {
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` )
` ) , [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 237 , 0 , 0 , 0 , 67 , 90 , 179 , 204 , 45 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 181 , 40 , 50 , 250 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT COUNT ( * ) AS total_record_count from S3Object < / Expression >
< ExpressionType > SQL < / ExpressionType >
< InputSerialization >
< CompressionType > NONE < / CompressionType >
< JSON >
< Type > DOCUMENT < / Type >
< / JSON >
< / InputSerialization >
< OutputSerialization >
< CSV >
< / CSV >
< / OutputSerialization >
< RequestProgress >
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` ) , [ ] byte {
0 , 0 , 0 , 103 , 0 , 0 , 0 , 85 , 85 , 49 , 209 , 79 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 51 , 10 , 175 , 58 , 213 , 152 , 0 , 0 , 0 , 236 , 0 , 0 , 0 , 67 , 103 , 211 , 229 , 157 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 52 , 192 , 77 , 114 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
}
var jsonData = [ ] byte ( ` { "three" : true , "two" : "foo" , "one" : - 1 }
{ "three" : false , "two" : "bar" , "one" : null }
{ "three" : true , "two" : "baz" , "one" : 2.5 }
` )
var expectedResult = [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 237 , 0 , 0 , 0 , 67 , 90 , 179 , 204 , 45 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 49 , 49 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 181 , 40 , 50 , 250 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
}
for _ , testCase := range testTable {
s3Select , err := NewS3Select ( bytes . NewReader ( requestXML ) )
if err != nil {
t . Fatal ( err )
}
s3Select , err := NewS3Select ( bytes . NewReader ( testCase . requestXML ) )
if err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( func ( offset , length int64 ) ( io . ReadCloser , error ) {
return ioutil . NopCloser ( bytes . NewReader ( jsonData ) ) , nil
} ) ; err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( func ( offset , length int64 ) ( io . ReadCloser , error ) {
return ioutil . NopCloser ( bytes . NewReader ( jsonData ) ) , nil
} ) ; err != nil {
t . Fatal ( err )
}
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
if ! reflect . DeepEqual ( w . response , expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
if ! reflect . DeepEqual ( w . response , testCase . expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
}
}
}
func TestParquetInput ( t * testing . T ) {
var requestXML = [ ] byte ( `
var testTable = [ ] struct {
requestXML [ ] byte
expectedResult [ ] byte
} {
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT one , two , three from S3Object < / Expression >
@ -169,49 +239,74 @@ func TestParquetInput(t *testing.T) {
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` )
getReader := func ( offset int64 , length int64 ) ( io . ReadCloser , error ) {
testdataFile := "testdata.parquet"
file , err := os . Open ( testdataFile )
if err != nil {
return nil , err
}
` ) , [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 235 , 0 , 0 , 0 , 67 , 213 , 243 , 57 , 141 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 128 , 96 , 253 , 66 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
{
[ ] byte ( `
< ? xml version = "1.0" encoding = "UTF-8" ? >
< SelectObjectContentRequest >
< Expression > SELECT COUNT ( * ) AS total_record_count from S3Object < / Expression >
< ExpressionType > SQL < / ExpressionType >
< InputSerialization >
< CompressionType > NONE < / CompressionType >
< Parquet >
< / Parquet >
< / InputSerialization >
< OutputSerialization >
< CSV >
< / CSV >
< / OutputSerialization >
< RequestProgress >
< Enabled > FALSE < / Enabled >
< / RequestProgress >
< / SelectObjectContentRequest >
` ) , [ ] byte {
0 , 0 , 0 , 103 , 0 , 0 , 0 , 85 , 85 , 49 , 209 , 79 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 51 , 10 , 175 , 58 , 213 , 152 , 0 , 0 , 0 , 234 , 0 , 0 , 0 , 67 , 232 , 147 , 16 , 61 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 50 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 190 , 146 , 162 , 21 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
} ,
} ,
}
fi , err := file . Stat ( )
if err != nil {
return nil , err
}
for _ , testCase := range testTable {
getReader := func ( offset int64 , length int64 ) ( io . ReadCloser , error ) {
testdataFile := "testdata.parquet"
file , err := os . Open ( testdataFile )
if err != nil {
return nil , err
}
if offset < 0 {
offset = fi . Size ( ) + offset
}
fi , err := file . Stat ( )
if err != nil {
return nil , err
}
if _ , err = file . Seek ( offset , os . SEEK_SET ) ; err != nil {
return nil , err
}
if offset < 0 {
offset = fi . Size ( ) + offset
}
return file , nil
}
if _ , err = file . Seek ( offset , os . SEEK_SET ) ; err != nil {
return nil , err
}
var expectedResult = [ ] byte {
0 , 0 , 0 , 137 , 0 , 0 , 0 , 85 , 194 , 213 , 168 , 241 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 24 , 97 , 112 , 112 , 108 , 105 , 99 , 97 , 116 , 105 , 111 , 110 , 47 , 111 , 99 , 116 , 101 , 116 , 45 , 115 , 116 , 114 , 101 , 97 , 109 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 7 , 82 , 101 , 99 , 111 , 114 , 100 , 115 , 45 , 49 , 44 , 102 , 111 , 111 , 44 , 116 , 114 , 117 , 101 , 10 , 44 , 98 , 97 , 114 , 44 , 102 , 97 , 108 , 115 , 101 , 10 , 50 , 46 , 53 , 44 , 98 , 97 , 122 , 44 , 116 , 114 , 117 , 101 , 10 , 75 , 182 , 193 , 80 , 0 , 0 , 0 , 235 , 0 , 0 , 0 , 67 , 213 , 243 , 57 , 141 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 13 , 58 , 99 , 111 , 110 , 116 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 8 , 116 , 101 , 120 , 116 , 47 , 120 , 109 , 108 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 83 , 116 , 97 , 116 , 115 , 60 , 63 , 120 , 109 , 108 , 32 , 118 , 101 , 114 , 115 , 105 , 111 , 110 , 61 , 34 , 49 , 46 , 48 , 34 , 32 , 101 , 110 , 99 , 111 , 100 , 105 , 110 , 103 , 61 , 34 , 85 , 84 , 70 , 45 , 56 , 34 , 63 , 62 , 60 , 83 , 116 , 97 , 116 , 115 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 83 , 99 , 97 , 110 , 110 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 45 , 49 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 80 , 114 , 111 , 99 , 101 , 115 , 115 , 101 , 100 , 62 , 60 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 51 , 54 , 60 , 47 , 66 , 121 , 116 , 101 , 115 , 82 , 101 , 116 , 117 , 114 , 110 , 101 , 100 , 62 , 60 , 47 , 83 , 116 , 97 , 116 , 115 , 62 , 128 , 96 , 253 , 66 , 0 , 0 , 0 , 56 , 0 , 0 , 0 , 40 , 193 , 198 , 132 , 212 , 13 , 58 , 109 , 101 , 115 , 115 , 97 , 103 , 101 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 5 , 101 , 118 , 101 , 110 , 116 , 11 , 58 , 101 , 118 , 101 , 110 , 116 , 45 , 116 , 121 , 112 , 101 , 7 , 0 , 3 , 69 , 110 , 100 , 207 , 151 , 211 , 146 ,
}
return file , nil
}
s3Select , err := NewS3Select ( bytes . NewReader ( requestXML ) )
if err != nil {
t . Fatal ( err )
}
s3Select , err := NewS3Select ( bytes . NewReader ( testCase . requestXML ) )
if err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( getReader ) ; err != nil {
t . Fatal ( err )
}
if err = s3Select . Open ( getReader ) ; err != nil {
t . Fatal ( err )
}
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
w := & testResponseWriter { }
s3Select . Evaluate ( w )
s3Select . Close ( )
if ! reflect . DeepEqual ( w . response , expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
if ! reflect . DeepEqual ( w . response , testCase . expectedResult ) {
t . Fatalf ( "received response does not match with expected reply" )
}
}
}