PREHOOK: query: DESCRIBE FUNCTION percentile PREHOOK: type: DESCFUNCTION POSTHOOK: query: DESCRIBE FUNCTION percentile POSTHOOK: type: DESCFUNCTION percentile(expr, pc) - Returns the percentile(s) of expr at pc (range: [0,1]).pc can be a double or double array PREHOOK: query: DESCRIBE FUNCTION EXTENDED percentile PREHOOK: type: DESCFUNCTION POSTHOOK: query: DESCRIBE FUNCTION EXTENDED percentile POSTHOOK: type: DESCFUNCTION percentile(expr, pc) - Returns the percentile(s) of expr at pc (range: [0,1]).pc can be a double or double array PREHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 0.0 4.5 9.0 [0.0,4.5,8.91,9.0] 1 10.0 15.0 19.0 [10.0,15.0,18.91,19.0] 2 20.0 26.0 28.0 [20.0,26.0,27.939999999999998,28.0] 3 30.0 35.0 37.0 [30.0,35.0,37.0,37.0] 4 41.0 42.5 47.0 [41.0,42.5,46.849999999999994,47.0] 5 51.0 54.0 58.0 [51.0,54.0,58.0,58.0] 6 64.0 66.5 69.0 [64.0,66.5,68.9,69.0] 7 70.0 73.0 78.0 [70.0,73.0,77.91000000000001,78.0] 8 80.0 84.0 87.0 [80.0,84.0,86.92,87.0] 9 90.0 95.0 98.0 [90.0,95.0,98.0,98.0] 10 100.0 103.0 105.0 [100.0,103.0,104.94,105.0] 11 111.0 117.0 119.0 [111.0,117.0,119.0,119.0] 12 120.0 127.0 129.0 [120.0,127.0,129.0,129.0] 13 131.0 137.0 138.0 [131.0,137.0,138.0,138.0] 14 143.0 146.0 149.0 [143.0,146.0,149.0,149.0] 15 150.0 154.0 158.0 [150.0,154.0,157.92999999999998,158.0] 16 160.0 166.5 169.0 [160.0,166.5,169.0,169.0] 17 170.0 175.0 179.0 [170.0,175.0,179.0,179.0] 18 180.0 186.5 189.0 [180.0,186.5,188.86,189.0] 19 190.0 194.5 199.0 [190.0,194.5,199.0,199.0] 20 200.0 205.0 209.0 [200.0,205.0,209.0,209.0] 21 213.0 216.5 219.0 [213.0,216.5,219.0,219.0] 22 221.0 224.0 229.0 [221.0,224.0,229.0,229.0] 23 230.0 234.0 239.0 [230.0,234.0,239.0,239.0] 24 241.0 244.0 249.0 [241.0,244.0,248.94,249.0] 25 252.0 256.0 258.0 [252.0,256.0,257.94,258.0] 26 260.0 264.0 266.0 [260.0,264.0,265.95,266.0] 27 272.0 275.0 278.0 [272.0,275.0,278.0,278.0] 28 280.0 283.5 289.0 [280.0,283.5,288.87,289.0] 29 291.0 297.0 298.0 [291.0,297.0,298.0,298.0] 30 302.0 307.0 309.0 [302.0,307.0,309.0,309.0] 31 310.0 316.0 318.0 [310.0,316.0,318.0,318.0] 32 321.0 324.0 327.0 [321.0,324.0,327.0,327.0] 33 331.0 333.0 339.0 [331.0,333.0,338.92,339.0] 34 341.0 345.0 348.0 [341.0,345.0,348.0,348.0] 35 351.0 353.0 356.0 [351.0,353.0,355.91,356.0] 36 360.0 367.0 369.0 [360.0,367.0,369.0,369.0] 37 373.0 376.0 379.0 [373.0,376.0,378.95,379.0] 38 382.0 384.0 389.0 [382.0,384.0,388.82,389.0] 39 392.0 396.0 399.0 [392.0,396.0,399.0,399.0] 40 400.0 403.5 409.0 [400.0,403.5,409.0,409.0] 41 411.0 415.5 419.0 [411.0,415.5,418.91,419.0] 42 421.0 425.5 429.0 [421.0,425.5,429.0,429.0] 43 430.0 435.0 439.0 [430.0,435.0,439.0,439.0] 44 443.0 446.0 449.0 [443.0,446.0,448.96,449.0] 45 452.0 455.0 459.0 [452.0,455.0,459.0,459.0] 46 460.0 467.5 469.0 [460.0,467.5,469.0,469.0] 47 470.0 477.0 479.0 [470.0,477.0,478.94,479.0] 48 480.0 484.0 489.0 [480.0,484.0,489.0,489.0] 49 490.0 494.5 498.0 [490.0,494.5,498.0,498.0] PREHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 0.0 4.5 9.0 [0.0,4.5,8.91,9.0] 1 10.0 15.0 19.0 [10.0,15.0,18.91,19.0] 2 20.0 26.0 28.0 [20.0,26.0,27.939999999999998,28.0] 3 30.0 35.0 37.0 [30.0,35.0,37.0,37.0] 4 41.0 42.5 47.0 [41.0,42.5,46.849999999999994,47.0] 5 51.0 54.0 58.0 [51.0,54.0,58.0,58.0] 6 64.0 66.5 69.0 [64.0,66.5,68.9,69.0] 7 70.0 73.0 78.0 [70.0,73.0,77.91000000000001,78.0] 8 80.0 84.0 87.0 [80.0,84.0,86.92,87.0] 9 90.0 95.0 98.0 [90.0,95.0,98.0,98.0] 10 100.0 103.0 105.0 [100.0,103.0,104.94,105.0] 11 111.0 117.0 119.0 [111.0,117.0,119.0,119.0] 12 120.0 127.0 129.0 [120.0,127.0,129.0,129.0] 13 131.0 137.0 138.0 [131.0,137.0,138.0,138.0] 14 143.0 146.0 149.0 [143.0,146.0,149.0,149.0] 15 150.0 154.0 158.0 [150.0,154.0,157.92999999999998,158.0] 16 160.0 166.5 169.0 [160.0,166.5,169.0,169.0] 17 170.0 175.0 179.0 [170.0,175.0,179.0,179.0] 18 180.0 186.5 189.0 [180.0,186.5,188.86,189.0] 19 190.0 194.5 199.0 [190.0,194.5,199.0,199.0] 20 200.0 205.0 209.0 [200.0,205.0,209.0,209.0] 21 213.0 216.5 219.0 [213.0,216.5,219.0,219.0] 22 221.0 224.0 229.0 [221.0,224.0,229.0,229.0] 23 230.0 234.0 239.0 [230.0,234.0,239.0,239.0] 24 241.0 244.0 249.0 [241.0,244.0,248.94,249.0] 25 252.0 256.0 258.0 [252.0,256.0,257.94,258.0] 26 260.0 264.0 266.0 [260.0,264.0,265.95,266.0] 27 272.0 275.0 278.0 [272.0,275.0,278.0,278.0] 28 280.0 283.5 289.0 [280.0,283.5,288.87,289.0] 29 291.0 297.0 298.0 [291.0,297.0,298.0,298.0] 30 302.0 307.0 309.0 [302.0,307.0,309.0,309.0] 31 310.0 316.0 318.0 [310.0,316.0,318.0,318.0] 32 321.0 324.0 327.0 [321.0,324.0,327.0,327.0] 33 331.0 333.0 339.0 [331.0,333.0,338.92,339.0] 34 341.0 345.0 348.0 [341.0,345.0,348.0,348.0] 35 351.0 353.0 356.0 [351.0,353.0,355.91,356.0] 36 360.0 367.0 369.0 [360.0,367.0,369.0,369.0] 37 373.0 376.0 379.0 [373.0,376.0,378.95,379.0] 38 382.0 384.0 389.0 [382.0,384.0,388.82,389.0] 39 392.0 396.0 399.0 [392.0,396.0,399.0,399.0] 40 400.0 403.5 409.0 [400.0,403.5,409.0,409.0] 41 411.0 415.5 419.0 [411.0,415.5,418.91,419.0] 42 421.0 425.5 429.0 [421.0,425.5,429.0,429.0] 43 430.0 435.0 439.0 [430.0,435.0,439.0,439.0] 44 443.0 446.0 449.0 [443.0,446.0,448.96,449.0] 45 452.0 455.0 459.0 [452.0,455.0,459.0,459.0] 46 460.0 467.5 469.0 [460.0,467.5,469.0,469.0] 47 470.0 477.0 479.0 [470.0,477.0,478.94,479.0] 48 480.0 484.0 489.0 [480.0,484.0,489.0,489.0] 49 490.0 494.5 498.0 [490.0,494.5,498.0,498.0] PREHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 0.0 4.5 9.0 [0.0,4.5,8.91,9.0] 1 10.0 15.0 19.0 [10.0,15.0,18.91,19.0] 2 20.0 26.0 28.0 [20.0,26.0,27.939999999999998,28.0] 3 30.0 35.0 37.0 [30.0,35.0,37.0,37.0] 4 41.0 42.5 47.0 [41.0,42.5,46.849999999999994,47.0] 5 51.0 54.0 58.0 [51.0,54.0,58.0,58.0] 6 64.0 66.5 69.0 [64.0,66.5,68.9,69.0] 7 70.0 73.0 78.0 [70.0,73.0,77.91000000000001,78.0] 8 80.0 84.0 87.0 [80.0,84.0,86.92,87.0] 9 90.0 95.0 98.0 [90.0,95.0,98.0,98.0] 10 100.0 103.0 105.0 [100.0,103.0,104.94,105.0] 11 111.0 117.0 119.0 [111.0,117.0,119.0,119.0] 12 120.0 127.0 129.0 [120.0,127.0,129.0,129.0] 13 131.0 137.0 138.0 [131.0,137.0,138.0,138.0] 14 143.0 146.0 149.0 [143.0,146.0,149.0,149.0] 15 150.0 154.0 158.0 [150.0,154.0,157.92999999999998,158.0] 16 160.0 166.5 169.0 [160.0,166.5,169.0,169.0] 17 170.0 175.0 179.0 [170.0,175.0,179.0,179.0] 18 180.0 186.5 189.0 [180.0,186.5,188.86,189.0] 19 190.0 194.5 199.0 [190.0,194.5,199.0,199.0] 20 200.0 205.0 209.0 [200.0,205.0,209.0,209.0] 21 213.0 216.5 219.0 [213.0,216.5,219.0,219.0] 22 221.0 224.0 229.0 [221.0,224.0,229.0,229.0] 23 230.0 234.0 239.0 [230.0,234.0,239.0,239.0] 24 241.0 244.0 249.0 [241.0,244.0,248.94,249.0] 25 252.0 256.0 258.0 [252.0,256.0,257.94,258.0] 26 260.0 264.0 266.0 [260.0,264.0,265.95,266.0] 27 272.0 275.0 278.0 [272.0,275.0,278.0,278.0] 28 280.0 283.5 289.0 [280.0,283.5,288.87,289.0] 29 291.0 297.0 298.0 [291.0,297.0,298.0,298.0] 30 302.0 307.0 309.0 [302.0,307.0,309.0,309.0] 31 310.0 316.0 318.0 [310.0,316.0,318.0,318.0] 32 321.0 324.0 327.0 [321.0,324.0,327.0,327.0] 33 331.0 333.0 339.0 [331.0,333.0,338.92,339.0] 34 341.0 345.0 348.0 [341.0,345.0,348.0,348.0] 35 351.0 353.0 356.0 [351.0,353.0,355.91,356.0] 36 360.0 367.0 369.0 [360.0,367.0,369.0,369.0] 37 373.0 376.0 379.0 [373.0,376.0,378.95,379.0] 38 382.0 384.0 389.0 [382.0,384.0,388.82,389.0] 39 392.0 396.0 399.0 [392.0,396.0,399.0,399.0] 40 400.0 403.5 409.0 [400.0,403.5,409.0,409.0] 41 411.0 415.5 419.0 [411.0,415.5,418.91,419.0] 42 421.0 425.5 429.0 [421.0,425.5,429.0,429.0] 43 430.0 435.0 439.0 [430.0,435.0,439.0,439.0] 44 443.0 446.0 449.0 [443.0,446.0,448.96,449.0] 45 452.0 455.0 459.0 [452.0,455.0,459.0,459.0] 46 460.0 467.5 469.0 [460.0,467.5,469.0,469.0] 47 470.0 477.0 479.0 [470.0,477.0,478.94,479.0] 48 480.0 484.0 489.0 [480.0,484.0,489.0,489.0] 49 490.0 494.5 498.0 [490.0,494.5,498.0,498.0] PREHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: SELECT CAST(key AS INT) DIV 10, percentile(CAST(substr(value, 5) AS INT), 0.0), percentile(CAST(substr(value, 5) AS INT), 0.5), percentile(CAST(substr(value, 5) AS INT), 1.0), percentile(CAST(substr(value, 5) AS INT), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 0.0 4.5 9.0 [0.0,4.5,8.91,9.0] 1 10.0 15.0 19.0 [10.0,15.0,18.91,19.0] 2 20.0 26.0 28.0 [20.0,26.0,27.939999999999998,28.0] 3 30.0 35.0 37.0 [30.0,35.0,37.0,37.0] 4 41.0 42.5 47.0 [41.0,42.5,46.849999999999994,47.0] 5 51.0 54.0 58.0 [51.0,54.0,58.0,58.0] 6 64.0 66.5 69.0 [64.0,66.5,68.9,69.0] 7 70.0 73.0 78.0 [70.0,73.0,77.91000000000001,78.0] 8 80.0 84.0 87.0 [80.0,84.0,86.92,87.0] 9 90.0 95.0 98.0 [90.0,95.0,98.0,98.0] 10 100.0 103.0 105.0 [100.0,103.0,104.94,105.0] 11 111.0 117.0 119.0 [111.0,117.0,119.0,119.0] 12 120.0 127.0 129.0 [120.0,127.0,129.0,129.0] 13 131.0 137.0 138.0 [131.0,137.0,138.0,138.0] 14 143.0 146.0 149.0 [143.0,146.0,149.0,149.0] 15 150.0 154.0 158.0 [150.0,154.0,157.92999999999998,158.0] 16 160.0 166.5 169.0 [160.0,166.5,169.0,169.0] 17 170.0 175.0 179.0 [170.0,175.0,179.0,179.0] 18 180.0 186.5 189.0 [180.0,186.5,188.86,189.0] 19 190.0 194.5 199.0 [190.0,194.5,199.0,199.0] 20 200.0 205.0 209.0 [200.0,205.0,209.0,209.0] 21 213.0 216.5 219.0 [213.0,216.5,219.0,219.0] 22 221.0 224.0 229.0 [221.0,224.0,229.0,229.0] 23 230.0 234.0 239.0 [230.0,234.0,239.0,239.0] 24 241.0 244.0 249.0 [241.0,244.0,248.94,249.0] 25 252.0 256.0 258.0 [252.0,256.0,257.94,258.0] 26 260.0 264.0 266.0 [260.0,264.0,265.95,266.0] 27 272.0 275.0 278.0 [272.0,275.0,278.0,278.0] 28 280.0 283.5 289.0 [280.0,283.5,288.87,289.0] 29 291.0 297.0 298.0 [291.0,297.0,298.0,298.0] 30 302.0 307.0 309.0 [302.0,307.0,309.0,309.0] 31 310.0 316.0 318.0 [310.0,316.0,318.0,318.0] 32 321.0 324.0 327.0 [321.0,324.0,327.0,327.0] 33 331.0 333.0 339.0 [331.0,333.0,338.92,339.0] 34 341.0 345.0 348.0 [341.0,345.0,348.0,348.0] 35 351.0 353.0 356.0 [351.0,353.0,355.91,356.0] 36 360.0 367.0 369.0 [360.0,367.0,369.0,369.0] 37 373.0 376.0 379.0 [373.0,376.0,378.95,379.0] 38 382.0 384.0 389.0 [382.0,384.0,388.82,389.0] 39 392.0 396.0 399.0 [392.0,396.0,399.0,399.0] 40 400.0 403.5 409.0 [400.0,403.5,409.0,409.0] 41 411.0 415.5 419.0 [411.0,415.5,418.91,419.0] 42 421.0 425.5 429.0 [421.0,425.5,429.0,429.0] 43 430.0 435.0 439.0 [430.0,435.0,439.0,439.0] 44 443.0 446.0 449.0 [443.0,446.0,448.96,449.0] 45 452.0 455.0 459.0 [452.0,455.0,459.0,459.0] 46 460.0 467.5 469.0 [460.0,467.5,469.0,469.0] 47 470.0 477.0 479.0 [470.0,477.0,478.94,479.0] 48 480.0 484.0 489.0 [480.0,484.0,489.0,489.0] 49 490.0 494.5 498.0 [490.0,494.5,498.0,498.0] PREHOOK: query: -- test null handling SELECT CAST(key AS INT) DIV 10, percentile(NULL, 0.0), percentile(NULL, array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: -- test null handling SELECT CAST(key AS INT) DIV 10, percentile(NULL, 0.0), percentile(NULL, array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 NULL null 1 NULL null 2 NULL null 3 NULL null 4 NULL null 5 NULL null 6 NULL null 7 NULL null 8 NULL null 9 NULL null 10 NULL null 11 NULL null 12 NULL null 13 NULL null 14 NULL null 15 NULL null 16 NULL null 17 NULL null 18 NULL null 19 NULL null 20 NULL null 21 NULL null 22 NULL null 23 NULL null 24 NULL null 25 NULL null 26 NULL null 27 NULL null 28 NULL null 29 NULL null 30 NULL null 31 NULL null 32 NULL null 33 NULL null 34 NULL null 35 NULL null 36 NULL null 37 NULL null 38 NULL null 39 NULL null 40 NULL null 41 NULL null 42 NULL null 43 NULL null 44 NULL null 45 NULL null 46 NULL null 47 NULL null 48 NULL null 49 NULL null PREHOOK: query: -- test empty array handling SELECT CAST(key AS INT) DIV 10, percentile(IF(CAST(key AS INT) DIV 10 < 5, 1, NULL), 0.5), percentile(IF(CAST(key AS INT) DIV 10 < 5, 1, NULL), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: -- test empty array handling SELECT CAST(key AS INT) DIV 10, percentile(IF(CAST(key AS INT) DIV 10 < 5, 1, NULL), 0.5), percentile(IF(CAST(key AS INT) DIV 10 < 5, 1, NULL), array(0.0, 0.5, 0.99, 1.0)) FROM src GROUP BY CAST(key AS INT) DIV 10 POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### 0 1.0 [1.0,1.0,1.0,1.0] 1 1.0 [1.0,1.0,1.0,1.0] 2 1.0 [1.0,1.0,1.0,1.0] 3 1.0 [1.0,1.0,1.0,1.0] 4 1.0 [1.0,1.0,1.0,1.0] 5 NULL null 6 NULL null 7 NULL null 8 NULL null 9 NULL null 10 NULL null 11 NULL null 12 NULL null 13 NULL null 14 NULL null 15 NULL null 16 NULL null 17 NULL null 18 NULL null 19 NULL null 20 NULL null 21 NULL null 22 NULL null 23 NULL null 24 NULL null 25 NULL null 26 NULL null 27 NULL null 28 NULL null 29 NULL null 30 NULL null 31 NULL null 32 NULL null 33 NULL null 34 NULL null 35 NULL null 36 NULL null 37 NULL null 38 NULL null 39 NULL null 40 NULL null 41 NULL null 42 NULL null 43 NULL null 44 NULL null 45 NULL null 46 NULL null 47 NULL null 48 NULL null 49 NULL null PREHOOK: query: select percentile(cast(key as bigint), 0.5) from src where false PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: select percentile(cast(key as bigint), 0.5) from src where false POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### NULL PREHOOK: query: -- test where percentile list is empty select percentile(cast(key as bigint), array()) from src where false PREHOOK: type: QUERY PREHOOK: Input: default@src #### A masked pattern was here #### POSTHOOK: query: -- test where percentile list is empty select percentile(cast(key as bigint), array()) from src where false POSTHOOK: type: QUERY POSTHOOK: Input: default@src #### A masked pattern was here #### null