From a24ca60074b7f797cf9bbbfcffde1650a09cf257 Mon Sep 17 00:00:00 2001 From: "Lu, Huayi" Date: Thu, 19 Jan 2023 13:37:49 +0000 Subject: [PATCH] DWS DEVELOPER 811 version Reviewed-by: Hasko, Vladimir Co-authored-by: Lu, Huayi Co-committed-by: Lu, Huayi --- docs/dws/dev/ALL_META.TXT.json | 9452 +++++++++++++++++ docs/dws/dev/CLASS.TXT.json | 8507 +++++++++++++++ docs/dws/dev/PARAMETERS.txt | 3 + docs/dws/dev/dws_01_0127.html | 20 + docs/dws/dev/dws_04_0001.html | 21 + docs/dws/dev/dws_04_0002.html | 20 + docs/dws/dev/dws_04_0004.html | 57 + docs/dws/dev/dws_04_0005.html | 94 + docs/dws/dev/dws_04_0006.html | 13 + docs/dws/dev/dws_04_0007.html | 20 + docs/dws/dev/dws_04_0011.html | 16 + docs/dws/dev/dws_04_0012.html | 20 + docs/dws/dev/dws_04_0015.html | 22 + docs/dws/dev/dws_04_0042.html | 246 + docs/dws/dev/dws_04_0043.html | 18 + docs/dws/dev/dws_04_0053.html | 29 + docs/dws/dev/dws_04_0054.html | 16 + docs/dws/dev/dws_04_0055.html | 23 + docs/dws/dev/dws_04_0056.html | 155 + docs/dws/dev/dws_04_0057.html | 36 + docs/dws/dev/dws_04_0058.html | 20 + docs/dws/dev/dws_04_0059.html | 52 + docs/dws/dev/dws_04_0060.html | 38 + docs/dws/dev/dws_04_0061.html | 182 + docs/dws/dev/dws_04_0062.html | 114 + docs/dws/dev/dws_04_0063.html | 19 + docs/dws/dev/dws_04_0064.html | 35 + docs/dws/dev/dws_04_0065.html | 25 + docs/dws/dev/dws_04_0066.html | 20 + docs/dws/dev/dws_04_0067.html | 202 + docs/dws/dev/dws_04_0074.html | 27 + docs/dws/dev/dws_04_0075.html | 13 + docs/dws/dev/dws_04_0076.html | 16 + docs/dws/dev/dws_04_0077.html | 23 + docs/dws/dev/dws_04_0078.html | 16 + docs/dws/dev/dws_04_0079.html | 111 + docs/dws/dev/dws_04_0080.html | 92 + docs/dws/dev/dws_04_0081.html | 21 + docs/dws/dev/dws_04_0082.html | 14 + docs/dws/dev/dws_04_0083.html | 35 + docs/dws/dev/dws_04_0084.html | 74 + docs/dws/dev/dws_04_0085.html | 21 + docs/dws/dev/dws_04_0086.html | 13 + docs/dws/dev/dws_04_0087.html | 11 + docs/dws/dev/dws_04_0088.html | 38 + docs/dws/dev/dws_04_0090.html | 16 + docs/dws/dev/dws_04_0091.html | 11 + docs/dws/dev/dws_04_0092.html | 13 + docs/dws/dev/dws_04_0093.html | 138 + docs/dws/dev/dws_04_0095.html | 131 + docs/dws/dev/dws_04_0096.html | 185 + docs/dws/dev/dws_04_0097.html | 12 + docs/dws/dev/dws_04_0098.html | 428 + docs/dws/dev/dws_04_0099.html | 409 + docs/dws/dev/dws_04_0100.html | 222 + docs/dws/dev/dws_04_0101.html | 183 + docs/dws/dev/dws_04_0102.html | 42 + docs/dws/dev/dws_04_0103.html | 123 + docs/dws/dev/dws_04_0104.html | 138 + docs/dws/dev/dws_04_0105.html | 443 + docs/dws/dev/dws_04_0106.html | 58 + docs/dws/dev/dws_04_0107.html | 165 + docs/dws/dev/dws_04_0108.html | 242 + docs/dws/dev/dws_04_0109.html | 51 + docs/dws/dev/dws_04_0110.html | 110 + docs/dws/dev/dws_04_0111.html | 65 + docs/dws/dev/dws_04_0112.html | 65 + docs/dws/dev/dws_04_0113.html | 65 + docs/dws/dev/dws_04_0114.html | 93 + docs/dws/dev/dws_04_0115.html | 30 + docs/dws/dev/dws_04_0116.html | 105 + docs/dws/dev/dws_04_0117.html | 108 + docs/dws/dev/dws_04_0118.html | 14 + docs/dws/dev/dws_04_0119.html | 309 + docs/dws/dev/dws_04_0120.html | 112 + docs/dws/dev/dws_04_0123.html | 666 ++ docs/dws/dev/dws_04_0124.html | 58 + docs/dws/dev/dws_04_0125.html | 11 + docs/dws/dev/dws_04_0126.html | 11 + docs/dws/dev/dws_04_0127.html | 56 + docs/dws/dev/dws_04_0128.html | 11 + docs/dws/dev/dws_04_0129.html | 74 + docs/dws/dev/dws_04_0130.html | 102 + docs/dws/dev/dws_04_0131.html | 81 + docs/dws/dev/dws_04_0132.html | 81 + docs/dws/dev/dws_04_0133.html | 39 + docs/dws/dev/dws_04_0134.html | 53 + docs/dws/dev/dws_04_0135.html | 39 + docs/dws/dev/dws_04_0136.html | 39 + docs/dws/dev/dws_04_0137.html | 11 + docs/dws/dev/dws_04_0138.html | 11 + docs/dws/dev/dws_04_0139.html | 48 + docs/dws/dev/dws_04_0140.html | 11 + docs/dws/dev/dws_04_0141.html | 53 + docs/dws/dev/dws_04_0142.html | 74 + docs/dws/dev/dws_04_0143.html | 152 + docs/dws/dev/dws_04_0144.html | 60 + docs/dws/dev/dws_04_0145.html | 61 + docs/dws/dev/dws_04_0146.html | 60 + docs/dws/dev/dws_04_0154.html | 27 + docs/dws/dev/dws_04_0155.html | 29 + docs/dws/dev/dws_04_0156.html | 291 + docs/dws/dev/dws_04_0157.html | 25 + docs/dws/dev/dws_04_0158.html | 30 + docs/dws/dev/dws_04_0159.html | 24 + docs/dws/dev/dws_04_0160.html | 15 + docs/dws/dev/dws_04_0161.html | 12 + docs/dws/dev/dws_04_0162.html | 11 + docs/dws/dev/dws_04_0163.html | 109 + docs/dws/dev/dws_04_0164.html | 30 + docs/dws/dev/dws_04_0179.html | 25 + docs/dws/dev/dws_04_0180.html | 121 + docs/dws/dev/dws_04_0181.html | 19 + docs/dws/dev/dws_04_0182.html | 96 + docs/dws/dev/dws_04_0183.html | 28 + docs/dws/dev/dws_04_0184.html | 104 + docs/dws/dev/dws_04_0185.html | 99 + docs/dws/dev/dws_04_0186.html | 77 + docs/dws/dev/dws_04_0187.html | 141 + docs/dws/dev/dws_04_0189.html | 29 + docs/dws/dev/dws_04_0190.html | 86 + docs/dws/dev/dws_04_0192.html | 17 + docs/dws/dev/dws_04_0193.html | 175 + docs/dws/dev/dws_04_0194.html | 114 + docs/dws/dev/dws_04_0195.html | 51 + docs/dws/dev/dws_04_0196.html | 142 + docs/dws/dev/dws_04_0197.html | 22 + docs/dws/dev/dws_04_0198.html | 254 + docs/dws/dev/dws_04_0203.html | 21 + docs/dws/dev/dws_04_0204.html | 13 + docs/dws/dev/dws_04_0205.html | 105 + docs/dws/dev/dws_04_0206.html | 222 + docs/dws/dev/dws_04_0207.html | 183 + docs/dws/dev/dws_04_0208.html | 138 + docs/dws/dev/dws_04_0209.html | 243 + docs/dws/dev/dws_04_0210.html | 28 + docs/dws/dev/dws_04_0212.html | 97 + docs/dws/dev/dws_04_0213.html | 119 + docs/dws/dev/dws_04_0214.html | 227 + docs/dws/dev/dws_04_0215.html | 80 + docs/dws/dev/dws_04_0216.html | 52 + docs/dws/dev/dws_04_0217.html | 13 + docs/dws/dev/dws_04_0219.html | 15 + docs/dws/dev/dws_04_0228.html | 188 + docs/dws/dev/dws_04_0243.html | 60 + docs/dws/dev/dws_04_0244.html | 194 + docs/dws/dev/dws_04_0245.html | 152 + docs/dws/dev/dws_04_0246.html | 81 + docs/dws/dev/dws_04_0247.html | 88 + docs/dws/dev/dws_04_0249.html | 19 + docs/dws/dev/dws_04_0250.html | 19 + docs/dws/dev/dws_04_0251.html | 73 + docs/dws/dev/dws_04_0252.html | 39 + docs/dws/dev/dws_04_0253.html | 141 + docs/dws/dev/dws_04_0254.html | 30 + docs/dws/dev/dws_04_0255.html | 265 + docs/dws/dev/dws_04_0256.html | 22 + docs/dws/dev/dws_04_0258.html | 13 + docs/dws/dev/dws_04_0259.html | 12 + docs/dws/dev/dws_04_0260.html | 109 + docs/dws/dev/dws_04_0261.html | 27 + docs/dws/dev/dws_04_0262.html | 82 + docs/dws/dev/dws_04_0263.html | 22 + docs/dws/dev/dws_04_0264.html | 12 + docs/dws/dev/dws_04_0265.html | 60 + docs/dws/dev/dws_04_0266.html | 20 + docs/dws/dev/dws_04_0267.html | 12 + docs/dws/dev/dws_04_0268.html | 167 + docs/dws/dev/dws_04_0269.html | 21 + docs/dws/dev/dws_04_0270.html | 68 + docs/dws/dev/dws_04_0271.html | 20 + docs/dws/dev/dws_04_0272.html | 115 + docs/dws/dev/dws_04_0273.html | 124 + docs/dws/dev/dws_04_0274.html | 136 + docs/dws/dev/dws_04_0275.html | 18 + docs/dws/dev/dws_04_0276.html | 87 + docs/dws/dev/dws_04_0277.html | 91 + docs/dws/dev/dws_04_0278.html | 120 + docs/dws/dev/dws_04_0279.html | 25 + docs/dws/dev/dws_04_0301.html | 21 + docs/dws/dev/dws_04_0302.html | 18 + docs/dws/dev/dws_04_0304.html | 54 + docs/dws/dev/dws_04_0305.html | 146 + docs/dws/dev/dws_04_0306.html | 1351 +++ docs/dws/dev/dws_04_0393.html | 26 + docs/dws/dev/dws_04_0394.html | 62 + docs/dws/dev/dws_04_0395.html | 71 + docs/dws/dev/dws_04_0396.html | 82 + docs/dws/dev/dws_04_0397.html | 143 + docs/dws/dev/dws_04_0398.html | 156 + docs/dws/dev/dws_04_0399.html | 122 + docs/dws/dev/dws_04_0400.html | 25 + docs/dws/dev/dws_04_0402.html | 12 + docs/dws/dev/dws_04_0403.html | 23 + docs/dws/dev/dws_04_0409.html | 66 + docs/dws/dev/dws_04_0410.html | 25 + docs/dws/dev/dws_04_0411.html | 85 + docs/dws/dev/dws_04_0412.html | 57 + docs/dws/dev/dws_04_0413.html | 53 + docs/dws/dev/dws_04_0430.html | 33 + docs/dws/dev/dws_04_0435.html | 13 + docs/dws/dev/dws_04_0436.html | 44 + docs/dws/dev/dws_04_0437.html | 27 + docs/dws/dev/dws_04_0438.html | 14 + docs/dws/dev/dws_04_0439.html | 33 + docs/dws/dev/dws_04_0440.html | 40 + docs/dws/dev/dws_04_0441.html | 27 + docs/dws/dev/dws_04_0442.html | 12 + docs/dws/dev/dws_04_0443.html | 14 + docs/dws/dev/dws_04_0444.html | 15 + docs/dws/dev/dws_04_0445.html | 26 + docs/dws/dev/dws_04_0446.html | 71 + docs/dws/dev/dws_04_0447.html | 402 + docs/dws/dev/dws_04_0448.html | 591 ++ docs/dws/dev/dws_04_0449.html | 399 + docs/dws/dev/dws_04_0450.html | 63 + docs/dws/dev/dws_04_0451.html | 297 + docs/dws/dev/dws_04_0452.html | 28 + docs/dws/dev/dws_04_0453.html | 101 + docs/dws/dev/dws_04_0454.html | 35 + docs/dws/dev/dws_04_0455.html | 115 + docs/dws/dev/dws_04_0456.html | 47 + docs/dws/dev/dws_04_0457.html | 32 + docs/dws/dev/dws_04_0458.html | 36 + docs/dws/dev/dws_04_0459.html | 30 + docs/dws/dev/dws_04_0460.html | 38 + docs/dws/dev/dws_04_0461.html | 29 + docs/dws/dev/dws_04_0462.html | 200 + docs/dws/dev/dws_04_0463.html | 27 + docs/dws/dev/dws_04_0464.html | 33 + docs/dws/dev/dws_04_0465.html | 148 + docs/dws/dev/dws_04_0466.html | 51 + docs/dws/dev/dws_04_0467.html | 36 + docs/dws/dev/dws_04_0468.html | 24 + docs/dws/dev/dws_04_0469.html | 29 + docs/dws/dev/dws_04_0470.html | 19 + docs/dws/dev/dws_04_0471.html | 17 + docs/dws/dev/dws_04_0472.html | 21 + docs/dws/dev/dws_04_0473.html | 30 + docs/dws/dev/dws_04_0474.html | 45 + docs/dws/dev/dws_04_0475.html | 42 + docs/dws/dev/dws_04_0476.html | 33 + docs/dws/dev/dws_04_0477.html | 171 + docs/dws/dev/dws_04_0478.html | 98 + docs/dws/dev/dws_04_0479.html | 237 + docs/dws/dev/dws_04_0480.html | 18 + docs/dws/dev/dws_04_0481.html | 18 + docs/dws/dev/dws_04_0482.html | 18 + docs/dws/dev/dws_04_0483.html | 20 + docs/dws/dev/dws_04_0484.html | 18 + docs/dws/dev/dws_04_0485.html | 109 + docs/dws/dev/dws_04_0486.html | 39 + docs/dws/dev/dws_04_0487.html | 62 + docs/dws/dev/dws_04_0488.html | 69 + docs/dws/dev/dws_04_0489.html | 94 + docs/dws/dev/dws_04_0490.html | 134 + docs/dws/dev/dws_04_0491.html | 24 + docs/dws/dev/dws_04_0492.html | 20 + docs/dws/dev/dws_04_0494.html | 17 + docs/dws/dev/dws_04_0495.html | 16 + docs/dws/dev/dws_04_0496.html | 17 + docs/dws/dev/dws_04_0497.html | 212 + docs/dws/dev/dws_04_0507.html | 18 + docs/dws/dev/dws_04_0509.html | 487 + docs/dws/dev/dws_04_0511.html | 18 + docs/dws/dev/dws_04_0512.html | 37 + docs/dws/dev/dws_04_0513.html | 14 + docs/dws/dev/dws_04_0514.html | 11 + docs/dws/dev/dws_04_0515.html | 159 + docs/dws/dev/dws_04_0516.html | 18 + docs/dws/dev/dws_04_0517.html | 509 + docs/dws/dev/dws_04_0518.html | 213 + docs/dws/dev/dws_04_0519.html | 19 + docs/dws/dev/dws_04_0520.html | 26 + docs/dws/dev/dws_04_0521.html | 62 + docs/dws/dev/dws_04_0522.html | 11 + docs/dws/dev/dws_04_0523.html | 19 + docs/dws/dev/dws_04_0524.html | 75 + docs/dws/dev/dws_04_0525.html | 32 + docs/dws/dev/dws_04_0526.html | 118 + docs/dws/dev/dws_04_0527.html | 21 + docs/dws/dev/dws_04_0528.html | 133 + docs/dws/dev/dws_04_0529.html | 88 + docs/dws/dev/dws_04_0530.html | 81 + docs/dws/dev/dws_04_0531.html | 59 + docs/dws/dev/dws_04_0532.html | 27 + docs/dws/dev/dws_04_0533.html | 18 + docs/dws/dev/dws_04_0534.html | 17 + docs/dws/dev/dws_04_0535.html | 97 + docs/dws/dev/dws_04_0536.html | 121 + docs/dws/dev/dws_04_0537.html | 241 + docs/dws/dev/dws_04_0538.html | 82 + docs/dws/dev/dws_04_0539.html | 33 + docs/dws/dev/dws_04_0540.html | 183 + docs/dws/dev/dws_04_0541.html | 179 + docs/dws/dev/dws_04_0542.html | 17 + docs/dws/dev/dws_04_0543.html | 11 + docs/dws/dev/dws_04_0544.html | 13 + docs/dws/dev/dws_04_0545.html | 21 + docs/dws/dev/dws_04_0546.html | 39 + docs/dws/dev/dws_04_0547.html | 243 + docs/dws/dev/dws_04_0548.html | 68 + docs/dws/dev/dws_04_0549.html | 98 + docs/dws/dev/dws_04_0550.html | 25 + docs/dws/dev/dws_04_0551.html | 870 ++ docs/dws/dev/dws_04_0552.html | 101 + docs/dws/dev/dws_04_0553.html | 121 + docs/dws/dev/dws_04_0554.html | 198 + docs/dws/dev/dws_04_0555.html | 571 + docs/dws/dev/dws_04_0556.html | 987 ++ docs/dws/dev/dws_04_0558.html | 114 + docs/dws/dev/dws_04_0559.html | 19 + docs/dws/dev/dws_04_0560.html | 15 + docs/dws/dev/dws_04_0561.html | 158 + docs/dws/dev/dws_04_0562.html | 106 + docs/dws/dev/dws_04_0564.html | 132 + docs/dws/dev/dws_04_0565.html | 187 + docs/dws/dev/dws_04_0566.html | 13 + docs/dws/dev/dws_04_0567.html | 150 + docs/dws/dev/dws_04_0568.html | 97 + docs/dws/dev/dws_04_0569.html | 313 + docs/dws/dev/dws_04_0570.html | 108 + docs/dws/dev/dws_04_0571.html | 80 + docs/dws/dev/dws_04_0572.html | 51 + docs/dws/dev/dws_04_0573.html | 187 + docs/dws/dev/dws_04_0574.html | 213 + docs/dws/dev/dws_04_0575.html | 44 + docs/dws/dev/dws_04_0576.html | 51 + docs/dws/dev/dws_04_0577.html | 60 + docs/dws/dev/dws_04_0578.html | 401 + docs/dws/dev/dws_04_0579.html | 88 + docs/dws/dev/dws_04_0580.html | 210 + docs/dws/dev/dws_04_0581.html | 97 + docs/dws/dev/dws_04_0582.html | 123 + docs/dws/dev/dws_04_0583.html | 44 + docs/dws/dev/dws_04_0584.html | 80 + docs/dws/dev/dws_04_0585.html | 132 + docs/dws/dev/dws_04_0586.html | 62 + docs/dws/dev/dws_04_0588.html | 63 + docs/dws/dev/dws_04_0589.html | 72 + docs/dws/dev/dws_04_0590.html | 88 + docs/dws/dev/dws_04_0591.html | 88 + docs/dws/dev/dws_04_0592.html | 97 + docs/dws/dev/dws_04_0593.html | 51 + docs/dws/dev/dws_04_0594.html | 150 + docs/dws/dev/dws_04_0595.html | 52 + docs/dws/dev/dws_04_0596.html | 135 + docs/dws/dev/dws_04_0597.html | 106 + docs/dws/dev/dws_04_0598.html | 54 + docs/dws/dev/dws_04_0599.html | 52 + docs/dws/dev/dws_04_0600.html | 65 + docs/dws/dev/dws_04_0601.html | 69 + docs/dws/dev/dws_04_0602.html | 106 + docs/dws/dev/dws_04_0603.html | 108 + docs/dws/dev/dws_04_0604.html | 160 + docs/dws/dev/dws_04_0605.html | 72 + docs/dws/dev/dws_04_0606.html | 224 + docs/dws/dev/dws_04_0607.html | 79 + docs/dws/dev/dws_04_0608.html | 271 + docs/dws/dev/dws_04_0609.html | 81 + docs/dws/dev/dws_04_0610.html | 102 + docs/dws/dev/dws_04_0611.html | 61 + docs/dws/dev/dws_04_0612.html | 68 + docs/dws/dev/dws_04_0613.html | 100 + docs/dws/dev/dws_04_0614.html | 81 + docs/dws/dev/dws_04_0615.html | 71 + docs/dws/dev/dws_04_0616.html | 104 + docs/dws/dev/dws_04_0617.html | 54 + docs/dws/dev/dws_04_0618.html | 64 + docs/dws/dev/dws_04_0619.html | 120 + docs/dws/dev/dws_04_0620.html | 120 + docs/dws/dev/dws_04_0621.html | 58 + docs/dws/dev/dws_04_0622.html | 58 + docs/dws/dev/dws_04_0623.html | 131 + docs/dws/dev/dws_04_0624.html | 80 + docs/dws/dev/dws_04_0625.html | 61 + docs/dws/dev/dws_04_0626.html | 80 + docs/dws/dev/dws_04_0627.html | 97 + docs/dws/dev/dws_04_0628.html | 70 + docs/dws/dev/dws_04_0629.html | 241 + docs/dws/dev/dws_04_0630.html | 62 + docs/dws/dev/dws_04_0631.html | 66 + docs/dws/dev/dws_04_0632.html | 51 + docs/dws/dev/dws_04_0633.html | 94 + docs/dws/dev/dws_04_0634.html | 74 + docs/dws/dev/dws_04_0635.html | 150 + docs/dws/dev/dws_04_0639.html | 484 + docs/dws/dev/dws_04_0640.html | 44 + docs/dws/dev/dws_04_0641.html | 59 + docs/dws/dev/dws_04_0642.html | 51 + docs/dws/dev/dws_04_0643.html | 51 + docs/dws/dev/dws_04_0644.html | 88 + docs/dws/dev/dws_04_0645.html | 65 + docs/dws/dev/dws_04_0646.html | 65 + docs/dws/dev/dws_04_0647.html | 65 + docs/dws/dev/dws_04_0648.html | 74 + docs/dws/dev/dws_04_0649.html | 37 + docs/dws/dev/dws_04_0650.html | 66 + docs/dws/dev/dws_04_0651.html | 51 + docs/dws/dev/dws_04_0652.html | 65 + docs/dws/dev/dws_04_0653.html | 100 + docs/dws/dev/dws_04_0654.html | 44 + docs/dws/dev/dws_04_0655.html | 74 + docs/dws/dev/dws_04_0656.html | 37 + docs/dws/dev/dws_04_0657.html | 51 + docs/dws/dev/dws_04_0658.html | 37 + docs/dws/dev/dws_04_0659.html | 30 + docs/dws/dev/dws_04_0660.html | 51 + docs/dws/dev/dws_04_0661.html | 59 + docs/dws/dev/dws_04_0662.html | 51 + docs/dws/dev/dws_04_0663.html | 65 + docs/dws/dev/dws_04_0664.html | 65 + docs/dws/dev/dws_04_0665.html | 72 + docs/dws/dev/dws_04_0666.html | 65 + docs/dws/dev/dws_04_0667.html | 75 + docs/dws/dev/dws_04_0668.html | 81 + docs/dws/dev/dws_04_0669.html | 74 + docs/dws/dev/dws_04_0670.html | 44 + docs/dws/dev/dws_04_0671.html | 37 + docs/dws/dev/dws_04_0672.html | 44 + docs/dws/dev/dws_04_0673.html | 65 + docs/dws/dev/dws_04_0674.html | 107 + docs/dws/dev/dws_04_0675.html | 44 + docs/dws/dev/dws_04_0676.html | 65 + docs/dws/dev/dws_04_0677.html | 74 + docs/dws/dev/dws_04_0678.html | 30 + docs/dws/dev/dws_04_0679.html | 44 + docs/dws/dev/dws_04_0680.html | 37 + docs/dws/dev/dws_04_0681.html | 30 + docs/dws/dev/dws_04_0682.html | 12 + docs/dws/dev/dws_04_0683.html | 11 + docs/dws/dev/dws_04_0684.html | 197 + docs/dws/dev/dws_04_0685.html | 79 + docs/dws/dev/dws_04_0686.html | 142 + docs/dws/dev/dws_04_0687.html | 72 + docs/dws/dev/dws_04_0688.html | 93 + docs/dws/dev/dws_04_0689.html | 72 + docs/dws/dev/dws_04_0690.html | 246 + docs/dws/dev/dws_04_0691.html | 51 + docs/dws/dev/dws_04_0692.html | 11 + docs/dws/dev/dws_04_0693.html | 86 + docs/dws/dev/dws_04_0694.html | 89 + docs/dws/dev/dws_04_0695.html | 209 + docs/dws/dev/dws_04_0696.html | 90 + docs/dws/dev/dws_04_0701.html | 11 + docs/dws/dev/dws_04_0702.html | 12 + docs/dws/dev/dws_04_0703.html | 185 + docs/dws/dev/dws_04_0704.html | 11 + docs/dws/dev/dws_04_0705.html | 342 + docs/dws/dev/dws_04_0706.html | 349 + docs/dws/dev/dws_04_0708.html | 11 + docs/dws/dev/dws_04_0709.html | 79 + docs/dws/dev/dws_04_0710.html | 142 + docs/dws/dev/dws_04_0711.html | 72 + docs/dws/dev/dws_04_0712.html | 58 + docs/dws/dev/dws_04_0713.html | 51 + docs/dws/dev/dws_04_0714.html | 45 + docs/dws/dev/dws_04_0715.html | 72 + docs/dws/dev/dws_04_0716.html | 59 + docs/dws/dev/dws_04_0717.html | 65 + docs/dws/dev/dws_04_0718.html | 79 + docs/dws/dev/dws_04_0719.html | 51 + docs/dws/dev/dws_04_0720.html | 121 + docs/dws/dev/dws_04_0721.html | 86 + docs/dws/dev/dws_04_0722.html | 74 + docs/dws/dev/dws_04_0723.html | 114 + docs/dws/dev/dws_04_0724.html | 143 + docs/dws/dev/dws_04_0725.html | 143 + docs/dws/dev/dws_04_0726.html | 30 + docs/dws/dev/dws_04_0727.html | 65 + docs/dws/dev/dws_04_0728.html | 137 + docs/dws/dev/dws_04_0729.html | 58 + docs/dws/dev/dws_04_0730.html | 121 + docs/dws/dev/dws_04_0731.html | 44 + docs/dws/dev/dws_04_0732.html | 70 + docs/dws/dev/dws_04_0733.html | 146 + docs/dws/dev/dws_04_0734.html | 37 + docs/dws/dev/dws_04_0735.html | 146 + docs/dws/dev/dws_04_0736.html | 86 + docs/dws/dev/dws_04_0737.html | 162 + docs/dws/dev/dws_04_0738.html | 72 + docs/dws/dev/dws_04_0739.html | 58 + docs/dws/dev/dws_04_0740.html | 87 + docs/dws/dev/dws_04_0741.html | 59 + docs/dws/dev/dws_04_0742.html | 70 + docs/dws/dev/dws_04_0743.html | 58 + docs/dws/dev/dws_04_0744.html | 93 + docs/dws/dev/dws_04_0745.html | 232 + docs/dws/dev/dws_04_0746.html | 51 + docs/dws/dev/dws_04_0747.html | 93 + docs/dws/dev/dws_04_0748.html | 97 + docs/dws/dev/dws_04_0749.html | 196 + docs/dws/dev/dws_04_0750.html | 87 + docs/dws/dev/dws_04_0751.html | 135 + docs/dws/dev/dws_04_0752.html | 161 + docs/dws/dev/dws_04_0753.html | 65 + docs/dws/dev/dws_04_0754.html | 163 + docs/dws/dev/dws_04_0755.html | 177 + docs/dws/dev/dws_04_0757.html | 80 + docs/dws/dev/dws_04_0758.html | 177 + docs/dws/dev/dws_04_0759.html | 79 + docs/dws/dev/dws_04_0760.html | 100 + docs/dws/dev/dws_04_0761.html | 156 + docs/dws/dev/dws_04_0762.html | 72 + docs/dws/dev/dws_04_0763.html | 80 + docs/dws/dev/dws_04_0764.html | 65 + docs/dws/dev/dws_04_0765.html | 79 + docs/dws/dev/dws_04_0766.html | 170 + docs/dws/dev/dws_04_0767.html | 128 + docs/dws/dev/dws_04_0768.html | 79 + docs/dws/dev/dws_04_0769.html | 170 + docs/dws/dev/dws_04_0770.html | 100 + docs/dws/dev/dws_04_0771.html | 100 + docs/dws/dev/dws_04_0772.html | 65 + docs/dws/dev/dws_04_0773.html | 100 + docs/dws/dev/dws_04_0774.html | 72 + docs/dws/dev/dws_04_0775.html | 58 + docs/dws/dev/dws_04_0776.html | 100 + docs/dws/dev/dws_04_0777.html | 72 + docs/dws/dev/dws_04_0778.html | 58 + docs/dws/dev/dws_04_0779.html | 100 + docs/dws/dev/dws_04_0780.html | 73 + docs/dws/dev/dws_04_0781.html | 58 + docs/dws/dev/dws_04_0782.html | 100 + docs/dws/dev/dws_04_0783.html | 1074 ++ docs/dws/dev/dws_04_0784.html | 115 + docs/dws/dev/dws_04_0785.html | 60 + docs/dws/dev/dws_04_0786.html | 44 + docs/dws/dev/dws_04_0787.html | 51 + docs/dws/dev/dws_04_0788.html | 45 + docs/dws/dev/dws_04_0789.html | 65 + docs/dws/dev/dws_04_0790.html | 148 + docs/dws/dev/dws_04_0791.html | 135 + docs/dws/dev/dws_04_0792.html | 80 + docs/dws/dev/dws_04_0793.html | 61 + docs/dws/dev/dws_04_0794.html | 102 + docs/dws/dev/dws_04_0795.html | 51 + docs/dws/dev/dws_04_0796.html | 123 + docs/dws/dev/dws_04_0797.html | 86 + docs/dws/dev/dws_04_0798.html | 74 + docs/dws/dev/dws_04_0799.html | 143 + docs/dws/dev/dws_04_0800.html | 143 + docs/dws/dev/dws_04_0801.html | 114 + docs/dws/dev/dws_04_0802.html | 185 + docs/dws/dev/dws_04_0803.html | 89 + docs/dws/dev/dws_04_0804.html | 102 + docs/dws/dev/dws_04_0805.html | 86 + docs/dws/dev/dws_04_0806.html | 65 + docs/dws/dev/dws_04_0807.html | 11 + docs/dws/dev/dws_04_0808.html | 12 + docs/dws/dev/dws_04_0809.html | 144 + docs/dws/dev/dws_04_0810.html | 72 + docs/dws/dev/dws_04_0811.html | 11 + docs/dws/dev/dws_04_0812.html | 11 + docs/dws/dev/dws_04_0813.html | 58 + docs/dws/dev/dws_04_0814.html | 30 + docs/dws/dev/dws_04_0815.html | 11 + docs/dws/dev/dws_04_0816.html | 11 + docs/dws/dev/dws_04_0817.html | 11 + docs/dws/dev/dws_04_0818.html | 93 + docs/dws/dev/dws_04_0819.html | 11 + docs/dws/dev/dws_04_0820.html | 229 + docs/dws/dev/dws_04_0821.html | 79 + docs/dws/dev/dws_04_0822.html | 11 + docs/dws/dev/dws_04_0823.html | 11 + docs/dws/dev/dws_04_0824.html | 11 + docs/dws/dev/dws_04_0825.html | 14 + docs/dws/dev/dws_04_0826.html | 152 + docs/dws/dev/dws_04_0827.html | 45 + docs/dws/dev/dws_04_0828.html | 79 + docs/dws/dev/dws_04_0829.html | 72 + docs/dws/dev/dws_04_0830.html | 79 + docs/dws/dev/dws_04_0831.html | 100 + docs/dws/dev/dws_04_0832.html | 11 + docs/dws/dev/dws_04_0836.html | 12 + docs/dws/dev/dws_04_0837.html | 12 + docs/dws/dev/dws_04_0838.html | 12 + docs/dws/dev/dws_04_0839.html | 12 + docs/dws/dev/dws_04_0840.html | 12 + docs/dws/dev/dws_04_0841.html | 12 + docs/dws/dev/dws_04_0842.html | 129 + docs/dws/dev/dws_04_0843.html | 86 + docs/dws/dev/dws_04_0844.html | 149 + docs/dws/dev/dws_04_0845.html | 79 + docs/dws/dev/dws_04_0846.html | 88 + docs/dws/dev/dws_04_0847.html | 102 + docs/dws/dev/dws_04_0848.html | 114 + docs/dws/dev/dws_04_0849.html | 46 + docs/dws/dev/dws_04_0850.html | 58 + docs/dws/dev/dws_04_0851.html | 51 + docs/dws/dev/dws_04_0852.html | 134 + docs/dws/dev/dws_04_0853.html | 58 + docs/dws/dev/dws_04_0854.html | 51 + docs/dws/dev/dws_04_0855.html | 45 + docs/dws/dev/dws_04_0856.html | 72 + docs/dws/dev/dws_04_0857.html | 107 + docs/dws/dev/dws_04_0858.html | 65 + docs/dws/dev/dws_04_0859.html | 51 + docs/dws/dev/dws_04_0860.html | 59 + docs/dws/dev/dws_04_0861.html | 51 + docs/dws/dev/dws_04_0862.html | 65 + docs/dws/dev/dws_04_0863.html | 65 + docs/dws/dev/dws_04_0864.html | 65 + docs/dws/dev/dws_04_0865.html | 72 + docs/dws/dev/dws_04_0866.html | 145 + docs/dws/dev/dws_04_0867.html | 67 + docs/dws/dev/dws_04_0868.html | 79 + docs/dws/dev/dws_04_0869.html | 72 + docs/dws/dev/dws_04_0870.html | 44 + docs/dws/dev/dws_04_0871.html | 37 + docs/dws/dev/dws_04_0872.html | 44 + docs/dws/dev/dws_04_0873.html | 58 + docs/dws/dev/dws_04_0874.html | 107 + docs/dws/dev/dws_04_0875.html | 44 + docs/dws/dev/dws_04_0876.html | 65 + docs/dws/dev/dws_04_0877.html | 74 + docs/dws/dev/dws_04_0878.html | 44 + docs/dws/dev/dws_04_0879.html | 37 + docs/dws/dev/dws_04_0880.html | 51 + docs/dws/dev/dws_04_0881.html | 51 + docs/dws/dev/dws_04_0883.html | 61 + docs/dws/dev/dws_04_0884.html | 37 + docs/dws/dev/dws_04_0885.html | 85 + docs/dws/dev/dws_04_0886.html | 14 + docs/dws/dev/dws_04_0888.html | 19 + docs/dws/dev/dws_04_0889.html | 43 + docs/dws/dev/dws_04_0890.html | 149 + docs/dws/dev/dws_04_0891.html | 126 + docs/dws/dev/dws_04_0892.html | 23 + docs/dws/dev/dws_04_0893.html | 139 + docs/dws/dev/dws_04_0894.html | 42 + docs/dws/dev/dws_04_0895.html | 17 + docs/dws/dev/dws_04_0896.html | 44 + docs/dws/dev/dws_04_0898.html | 57 + docs/dws/dev/dws_04_0899.html | 40 + docs/dws/dev/dws_04_0900.html | 19 + docs/dws/dev/dws_04_0901.html | 67 + docs/dws/dev/dws_04_0902.html | 40 + docs/dws/dev/dws_04_0903.html | 45 + docs/dws/dev/dws_04_0904.html | 17 + docs/dws/dev/dws_04_0905.html | 41 + docs/dws/dev/dws_04_0906.html | 39 + docs/dws/dev/dws_04_0908.html | 21 + docs/dws/dev/dws_04_0909.html | 198 + docs/dws/dev/dws_04_0910.html | 51 + docs/dws/dev/dws_04_0911.html | 59 + docs/dws/dev/dws_04_0912.html | 203 + docs/dws/dev/dws_04_0913.html | 19 + docs/dws/dev/dws_04_0914.html | 35 + docs/dws/dev/dws_04_0915.html | 143 + docs/dws/dev/dws_04_0916.html | 178 + docs/dws/dev/dws_04_0918.html | 27 + docs/dws/dev/dws_04_0919.html | 17 + docs/dws/dev/dws_04_0920.html | 110 + docs/dws/dev/dws_04_0921.html | 21 + docs/dws/dev/dws_04_0922.html | 251 + docs/dws/dev/dws_04_0923.html | 91 + docs/dws/dev/dws_04_0924.html | 19 + docs/dws/dev/dws_04_0925.html | 132 + docs/dws/dev/dws_04_0926.html | 96 + docs/dws/dev/dws_04_0927.html | 28 + docs/dws/dev/dws_04_0928.html | 51 + docs/dws/dev/dws_04_0929.html | 18 + docs/dws/dev/dws_04_0930.html | 75 + docs/dws/dev/dws_04_0931.html | 28 + docs/dws/dev/dws_04_0932.html | 49 + docs/dws/dev/dws_04_0933.html | 59 + docs/dws/dev/dws_04_0934.html | 80 + docs/dws/dev/dws_04_0936.html | 467 + docs/dws/dev/dws_04_0937.html | 17 + docs/dws/dev/dws_04_0938.html | 58 + docs/dws/dev/dws_04_0940.html | 226 + docs/dws/dev/dws_04_0941.html | 25 + docs/dws/dev/dws_04_0945.html | 641 ++ docs/dws/dev/dws_04_0946.html | 793 ++ docs/dws/dev/dws_04_0948.html | 58 + docs/dws/dev/dws_04_0949.html | 83 + docs/dws/dev/dws_04_0970.html | 67 + docs/dws/dev/dws_04_0971.html | 106 + docs/dws/dev/dws_04_0972.html | 33 + docs/dws/dev/dws_04_0985.html | 26 + docs/dws/dev/dws_04_0986.html | 21 + docs/dws/dev/dws_04_0987.html | 18 + docs/dws/dev/dws_04_0988.html | 18 + docs/dws/dev/dws_04_0994.html | 23 + docs/dws/dev/dws_04_0995.html | 100 + docs/dws/dev/dws_04_0998.html | 65 + docs/dws/dev/dws_04_1000.html | 43 + docs/dws/dev/dws_04_2000.html | 47 + docs/dws/dev/dws_04_3333.html | 27 + docs/dws/dev/dws_06_0001.html | 20 + docs/dws/dev/dws_06_0002.html | 22 + docs/dws/dev/dws_06_0003.html | 17 + docs/dws/dev/dws_06_0004.html | 13 + docs/dws/dev/dws_06_0005.html | 15 + docs/dws/dev/dws_06_0006.html | 14 + docs/dws/dev/dws_06_0007.html | 6505 ++++++++++++ docs/dws/dev/dws_06_0008.html | 47 + docs/dws/dev/dws_06_0009.html | 367 + docs/dws/dev/dws_06_0010.html | 46 + docs/dws/dev/dws_06_0011.html | 98 + docs/dws/dev/dws_06_0012.html | 249 + docs/dws/dev/dws_06_0013.html | 100 + docs/dws/dev/dws_06_0014.html | 732 ++ docs/dws/dev/dws_06_0015.html | 138 + docs/dws/dev/dws_06_0016.html | 167 + docs/dws/dev/dws_06_0017.html | 76 + docs/dws/dev/dws_06_0018.html | 212 + docs/dws/dev/dws_06_0019.html | 20 + docs/dws/dev/dws_06_0020.html | 12 + docs/dws/dev/dws_06_0021.html | 259 + docs/dws/dev/dws_06_0022.html | 236 + docs/dws/dev/dws_06_0023.html | 127 + docs/dws/dev/dws_06_0024.html | 219 + docs/dws/dev/dws_06_0025.html | 78 + docs/dws/dev/dws_06_0026.html | 167 + docs/dws/dev/dws_06_0027.html | 73 + docs/dws/dev/dws_06_0028.html | 96 + docs/dws/dev/dws_06_0029.html | 54 + docs/dws/dev/dws_06_0030.html | 1649 +++ docs/dws/dev/dws_06_0031.html | 179 + docs/dws/dev/dws_06_0032.html | 164 + docs/dws/dev/dws_06_0033.html | 334 + docs/dws/dev/dws_06_0034.html | 844 ++ docs/dws/dev/dws_06_0035.html | 1463 +++ docs/dws/dev/dws_06_0036.html | 846 ++ docs/dws/dev/dws_06_0037.html | 919 ++ docs/dws/dev/dws_06_0038.html | 440 + docs/dws/dev/dws_06_0039.html | 554 + docs/dws/dev/dws_06_0040.html | 46 + docs/dws/dev/dws_06_0041.html | 42 + docs/dws/dev/dws_06_0042.html | 907 ++ docs/dws/dev/dws_06_0043.html | 123 + docs/dws/dev/dws_06_0044.html | 387 + docs/dws/dev/dws_06_0045.html | 389 + docs/dws/dev/dws_06_0046.html | 933 ++ docs/dws/dev/dws_06_0047.html | 309 + docs/dws/dev/dws_06_0048.html | 584 + docs/dws/dev/dws_06_0049.html | 178 + docs/dws/dev/dws_06_0050.html | 241 + docs/dws/dev/dws_06_0051.html | 802 ++ docs/dws/dev/dws_06_0052.html | 35 + docs/dws/dev/dws_06_0053.html | 46 + docs/dws/dev/dws_06_0054.html | 170 + docs/dws/dev/dws_06_0055.html | 65 + docs/dws/dev/dws_06_0056.html | 318 + docs/dws/dev/dws_06_0057.html | 15 + docs/dws/dev/dws_06_0058.html | 107 + docs/dws/dev/dws_06_0059.html | 65 + docs/dws/dev/dws_06_0060.html | 582 + docs/dws/dev/dws_06_0061.html | 694 ++ docs/dws/dev/dws_06_0062.html | 294 + docs/dws/dev/dws_06_0063.html | 821 ++ docs/dws/dev/dws_06_0064.html | 38 + docs/dws/dev/dws_06_0065.html | 519 + docs/dws/dev/dws_06_0066.html | 57 + docs/dws/dev/dws_06_0067.html | 388 + docs/dws/dev/dws_06_0068.html | 144 + docs/dws/dev/dws_06_0069.html | 23 + docs/dws/dev/dws_06_0070.html | 146 + docs/dws/dev/dws_06_0071.html | 252 + docs/dws/dev/dws_06_0072.html | 176 + docs/dws/dev/dws_06_0073.html | 96 + docs/dws/dev/dws_06_0074.html | 28 + docs/dws/dev/dws_06_0075.html | 23 + docs/dws/dev/dws_06_0076.html | 66 + docs/dws/dev/dws_06_0077.html | 97 + docs/dws/dev/dws_06_0078.html | 97 + docs/dws/dev/dws_06_0079.html | 54 + docs/dws/dev/dws_06_0080.html | 169 + docs/dws/dev/dws_06_0081.html | 31 + docs/dws/dev/dws_06_0082.html | 21 + docs/dws/dev/dws_06_0083.html | 27 + docs/dws/dev/dws_06_0084.html | 40 + docs/dws/dev/dws_06_0085.html | 74 + docs/dws/dev/dws_06_0086.html | 15 + docs/dws/dev/dws_06_0087.html | 19 + docs/dws/dev/dws_06_0088.html | 132 + docs/dws/dev/dws_06_0089.html | 70 + docs/dws/dev/dws_06_0090.html | 46 + docs/dws/dev/dws_06_0091.html | 21 + docs/dws/dev/dws_06_0092.html | 55 + docs/dws/dev/dws_06_0093.html | 81 + docs/dws/dev/dws_06_0094.html | 126 + docs/dws/dev/dws_06_0095.html | 87 + docs/dws/dev/dws_06_0096.html | 21 + docs/dws/dev/dws_06_0097.html | 19 + docs/dws/dev/dws_06_0098.html | 57 + docs/dws/dev/dws_06_0099.html | 85 + docs/dws/dev/dws_06_0100.html | 63 + docs/dws/dev/dws_06_0101.html | 484 + docs/dws/dev/dws_06_0102.html | 28 + docs/dws/dev/dws_06_0103.html | 28 + docs/dws/dev/dws_06_0104.html | 43 + docs/dws/dev/dws_06_0105.html | 77 + docs/dws/dev/dws_06_0106.html | 191 + docs/dws/dev/dws_06_0107.html | 109 + docs/dws/dev/dws_06_0108.html | 49 + docs/dws/dev/dws_06_0109.html | 14 + docs/dws/dev/dws_06_0110.html | 144 + docs/dws/dev/dws_06_0111.html | 19 + docs/dws/dev/dws_06_0112.html | 91 + docs/dws/dev/dws_06_0113.html | 103 + docs/dws/dev/dws_06_0114.html | 35 + docs/dws/dev/dws_06_0115.html | 12 + docs/dws/dev/dws_06_0116.html | 23 + docs/dws/dev/dws_06_0117.html | 21 + docs/dws/dev/dws_06_0118.html | 197 + docs/dws/dev/dws_06_0119.html | 509 + docs/dws/dev/dws_06_0120.html | 116 + docs/dws/dev/dws_06_0123.html | 43 + docs/dws/dev/dws_06_0124.html | 103 + docs/dws/dev/dws_06_0126.html | 128 + docs/dws/dev/dws_06_0127.html | 39 + docs/dws/dev/dws_06_0128.html | 102 + docs/dws/dev/dws_06_0129.html | 29 + docs/dws/dev/dws_06_0132.html | 98 + docs/dws/dev/dws_06_0133.html | 53 + docs/dws/dev/dws_06_0134.html | 129 + docs/dws/dev/dws_06_0135.html | 52 + docs/dws/dev/dws_06_0136.html | 61 + docs/dws/dev/dws_06_0137.html | 58 + docs/dws/dev/dws_06_0138.html | 79 + docs/dws/dev/dws_06_0139.html | 71 + docs/dws/dev/dws_06_0140.html | 47 + docs/dws/dev/dws_06_0141.html | 41 + docs/dws/dev/dws_06_0142.html | 412 + docs/dws/dev/dws_06_0143.html | 243 + docs/dws/dev/dws_06_0145.html | 153 + docs/dws/dev/dws_06_0146.html | 70 + docs/dws/dev/dws_06_0147.html | 45 + docs/dws/dev/dws_06_0148.html | 137 + docs/dws/dev/dws_06_0149.html | 131 + docs/dws/dev/dws_06_0150.html | 112 + docs/dws/dev/dws_06_0151.html | 54 + docs/dws/dev/dws_06_0152.html | 31 + docs/dws/dev/dws_06_0153.html | 107 + docs/dws/dev/dws_06_0154.html | 118 + docs/dws/dev/dws_06_0155.html | 34 + docs/dws/dev/dws_06_0156.html | 91 + docs/dws/dev/dws_06_0159.html | 315 + docs/dws/dev/dws_06_0160.html | 281 + docs/dws/dev/dws_06_0161.html | 1220 +++ docs/dws/dev/dws_06_0163.html | 306 + docs/dws/dev/dws_06_0164.html | 84 + docs/dws/dev/dws_06_0165.html | 199 + docs/dws/dev/dws_06_0168.html | 69 + docs/dws/dev/dws_06_0169.html | 185 + docs/dws/dev/dws_06_0170.html | 145 + docs/dws/dev/dws_06_0171.html | 82 + docs/dws/dev/dws_06_0172.html | 191 + docs/dws/dev/dws_06_0173.html | 51 + docs/dws/dev/dws_06_0174.html | 147 + docs/dws/dev/dws_06_0175.html | 130 + docs/dws/dev/dws_06_0176.html | 127 + docs/dws/dev/dws_06_0177.html | 1284 +++ docs/dws/dev/dws_06_0178.html | 101 + docs/dws/dev/dws_06_0179.html | 646 ++ docs/dws/dev/dws_06_0182.html | 130 + docs/dws/dev/dws_06_0183.html | 96 + docs/dws/dev/dws_06_0184.html | 313 + docs/dws/dev/dws_06_0185.html | 394 + docs/dws/dev/dws_06_0186.html | 111 + docs/dws/dev/dws_06_0187.html | 77 + docs/dws/dev/dws_06_0188.html | 97 + docs/dws/dev/dws_06_0189.html | 32 + docs/dws/dev/dws_06_0192.html | 35 + docs/dws/dev/dws_06_0193.html | 38 + docs/dws/dev/dws_06_0194.html | 24 + docs/dws/dev/dws_06_0195.html | 35 + docs/dws/dev/dws_06_0198.html | 23 + docs/dws/dev/dws_06_0199.html | 32 + docs/dws/dev/dws_06_0200.html | 31 + docs/dws/dev/dws_06_0201.html | 32 + docs/dws/dev/dws_06_0202.html | 34 + docs/dws/dev/dws_06_0203.html | 32 + docs/dws/dev/dws_06_0204.html | 36 + docs/dws/dev/dws_06_0205.html | 33 + docs/dws/dev/dws_06_0206.html | 32 + docs/dws/dev/dws_06_0207.html | 34 + docs/dws/dev/dws_06_0208.html | 35 + docs/dws/dev/dws_06_0210.html | 33 + docs/dws/dev/dws_06_0211.html | 35 + docs/dws/dev/dws_06_0212.html | 35 + docs/dws/dev/dws_06_0213.html | 32 + docs/dws/dev/dws_06_0214.html | 36 + docs/dws/dev/dws_06_0215.html | 38 + docs/dws/dev/dws_06_0216.html | 127 + docs/dws/dev/dws_06_0217.html | 62 + docs/dws/dev/dws_06_0218.html | 56 + docs/dws/dev/dws_06_0219.html | 42 + docs/dws/dev/dws_06_0220.html | 78 + docs/dws/dev/dws_06_0221.html | 37 + docs/dws/dev/dws_06_0222.html | 49 + docs/dws/dev/dws_06_0223.html | 53 + docs/dws/dev/dws_06_0224.html | 55 + docs/dws/dev/dws_06_0225.html | 66 + docs/dws/dev/dws_06_0226.html | 88 + docs/dws/dev/dws_06_0227.html | 39 + docs/dws/dev/dws_06_0228.html | 25 + docs/dws/dev/dws_06_0229.html | 153 + docs/dws/dev/dws_06_0230.html | 409 + docs/dws/dev/dws_06_0231.html | 75 + docs/dws/dev/dws_06_0232.html | 260 + docs/dws/dev/dws_06_0233.html | 111 + docs/dws/dev/dws_06_0234.html | 281 + docs/dws/dev/dws_06_0235.html | 163 + docs/dws/dev/dws_06_0236.html | 228 + docs/dws/dev/dws_06_0237.html | 282 + docs/dws/dev/dws_06_0238.html | 597 ++ docs/dws/dev/dws_06_0239.html | 67 + docs/dws/dev/dws_06_0240.html | 106 + docs/dws/dev/dws_06_0241.html | 107 + docs/dws/dev/dws_06_0242.html | 39 + docs/dws/dev/dws_06_0243.html | 17 + docs/dws/dev/dws_06_0244.html | 205 + docs/dws/dev/dws_06_0245.html | 107 + docs/dws/dev/dws_06_0246.html | 26 + docs/dws/dev/dws_06_0247.html | 44 + docs/dws/dev/dws_06_0248.html | 33 + docs/dws/dev/dws_06_0249.html | 38 + docs/dws/dev/dws_06_0250.html | 291 + docs/dws/dev/dws_06_0251.html | 35 + docs/dws/dev/dws_06_0252.html | 30 + docs/dws/dev/dws_06_0253.html | 186 + docs/dws/dev/dws_06_0254.html | 42 + docs/dws/dev/dws_06_0255.html | 17 + docs/dws/dev/dws_06_0256.html | 31 + docs/dws/dev/dws_06_0257.html | 70 + docs/dws/dev/dws_06_0258.html | 28 + docs/dws/dev/dws_06_0259.html | 31 + docs/dws/dev/dws_06_0260.html | 28 + docs/dws/dev/dws_06_0262.html | 26 + docs/dws/dev/dws_06_0263.html | 56 + docs/dws/dev/dws_06_0264.html | 45 + docs/dws/dev/dws_06_0265.html | 78 + docs/dws/dev/dws_06_0266.html | 31 + docs/dws/dev/dws_06_0267.html | 42 + docs/dws/dev/dws_06_0268.html | 24 + docs/dws/dev/dws_06_0269.html | 60 + docs/dws/dev/dws_06_0270.html | 22 + docs/dws/dev/dws_06_0271.html | 14 + docs/dws/dev/dws_06_0272.html | 31 + docs/dws/dev/dws_06_0273.html | 18 + docs/dws/dev/dws_06_0274.html | 17 + docs/dws/dev/dws_06_0275.html | 21 + docs/dws/dev/dws_06_0276.html | 23 + docs/dws/dev/dws_06_0277.html | 15 + .../figure/en-us_image_0000001098655278.png | Bin 0 -> 25863 bytes .../figure/en-us_image_0000001098655292.png | Bin 0 -> 18982 bytes .../figure/en-us_image_0000001098655300.png | Bin 0 -> 4553 bytes .../figure/en-us_image_0000001098655330.png | Bin 0 -> 10493 bytes .../figure/en-us_image_0000001098655346.png | Bin 0 -> 3745 bytes .../figure/en-us_image_0000001098655364.png | Bin 0 -> 4313 bytes .../figure/en-us_image_0000001098655366.png | Bin 0 -> 27393 bytes .../figure/en-us_image_0000001098655372.png | Bin 0 -> 47024 bytes .../figure/en-us_image_0000001098655374.png | Bin 0 -> 14683 bytes .../figure/en-us_image_0000001098655390.png | Bin 0 -> 25295 bytes .../figure/en-us_image_0000001098655392.png | Bin 0 -> 50217 bytes .../figure/en-us_image_0000001098655398.jpg | Bin 0 -> 102630 bytes .../figure/en-us_image_0000001098655400.jpg | Bin 0 -> 23545 bytes .../figure/en-us_image_0000001098655422.jpg | Bin 0 -> 7459 bytes .../figure/en-us_image_0000001098655436.png | Bin 0 -> 2437 bytes .../figure/en-us_image_0000001098671216.png | Bin 0 -> 1983 bytes .../figure/en-us_image_0000001098671232.png | Bin 0 -> 32019 bytes .../figure/en-us_image_0000001098671234.png | Bin 0 -> 6086 bytes .../figure/en-us_image_0000001098671236.png | Bin 0 -> 24624 bytes .../figure/en-us_image_0000001098671238.png | Bin 0 -> 3304 bytes .../figure/en-us_image_0000001098815108.png | Bin 0 -> 34735 bytes .../figure/en-us_image_0000001098815118.png | Bin 0 -> 21464 bytes .../figure/en-us_image_0000001098815122.png | Bin 0 -> 45840 bytes .../figure/en-us_image_0000001098815148.png | Bin 0 -> 65673 bytes .../figure/en-us_image_0000001098815162.png | Bin 0 -> 9091 bytes .../figure/en-us_image_0000001098815180.png | Bin 0 -> 3142 bytes .../figure/en-us_image_0000001098815188.png | Bin 0 -> 215637 bytes .../figure/en-us_image_0000001098815194.png | Bin 0 -> 35366 bytes .../figure/en-us_image_0000001098815204.png | Bin 0 -> 71605 bytes .../figure/en-us_image_0000001098815208.png | Bin 0 -> 53355 bytes .../figure/en-us_image_0000001098815218.png | Bin 0 -> 836924 bytes .../figure/en-us_image_0000001098815222.png | Bin 0 -> 51215 bytes .../figure/en-us_image_0000001098815232.png | Bin 0 -> 5805 bytes .../figure/en-us_image_0000001098815236.png | Bin 0 -> 57480 bytes .../figure/en-us_image_0000001098815256.png | Bin 0 -> 1908 bytes .../figure/en-us_image_0000001098831044.png | Bin 0 -> 1693 bytes .../figure/en-us_image_0000001098831058.png | Bin 0 -> 7310 bytes .../figure/en-us_image_0000001098831060.png | Bin 0 -> 34830 bytes .../figure/en-us_image_0000001098831064.png | Bin 0 -> 2167 bytes .../figure/en-us_image_0000001098975108.png | Bin 0 -> 18045 bytes .../figure/en-us_image_0000001098975112.png | Bin 0 -> 3000 bytes .../figure/en-us_image_0000001098975116.png | Bin 0 -> 1051733 bytes .../figure/en-us_image_0000001098975124.png | Bin 0 -> 11011 bytes .../figure/en-us_image_0000001098975130.png | Bin 0 -> 7223 bytes .../figure/en-us_image_0000001098975134.png | Bin 0 -> 3702 bytes .../figure/en-us_image_0000001098975146.png | Bin 0 -> 76589 bytes .../figure/en-us_image_0000001098975154.png | Bin 0 -> 11506 bytes .../figure/en-us_image_0000001098975158.png | Bin 0 -> 11506 bytes .../figure/en-us_image_0000001098975164.jpg | Bin 0 -> 54209 bytes .../figure/en-us_image_0000001098975174.jpg | Bin 0 -> 2263 bytes .../figure/en-us_image_0000001098975180.jpg | Bin 0 -> 11369 bytes .../figure/en-us_image_0000001098975190.png | Bin 0 -> 9875 bytes .../figure/en-us_image_0000001098975206.png | Bin 0 -> 53845 bytes .../figure/en-us_image_0000001098975208.png | Bin 0 -> 282241 bytes .../figure/en-us_image_0000001098975214.png | Bin 0 -> 2406 bytes .../figure/en-us_image_0000001098975228.png | Bin 0 -> 4831 bytes .../figure/en-us_image_0000001098975234.png | Bin 0 -> 33893 bytes .../figure/en-us_image_0000001098991040.png | Bin 0 -> 2197 bytes .../figure/en-us_image_0000001098991054.png | Bin 0 -> 8227 bytes .../figure/en-us_image_0000001099135088.jpg | Bin 0 -> 125646 bytes .../figure/en-us_image_0000001099135094.png | Bin 0 -> 68066 bytes .../figure/en-us_image_0000001099135098.png | Bin 0 -> 38933 bytes .../figure/en-us_image_0000001099135104.png | Bin 0 -> 431038 bytes .../figure/en-us_image_0000001099135110.png | Bin 0 -> 17311 bytes .../figure/en-us_image_0000001099135134.jpg | Bin 0 -> 386665 bytes .../figure/en-us_image_0000001099135152.png | Bin 0 -> 3913 bytes .../figure/en-us_image_0000001099135168.jpg | Bin 0 -> 3457 bytes .../figure/en-us_image_0000001099135172.png | Bin 0 -> 210653 bytes .../figure/en-us_image_0000001099135180.png | Bin 0 -> 48957 bytes .../figure/en-us_image_0000001099135194.png | Bin 0 -> 259640 bytes .../figure/en-us_image_0000001099135196.jpg | Bin 0 -> 83852 bytes .../figure/en-us_image_0000001099135202.png | Bin 0 -> 2587 bytes .../figure/en-us_image_0000001099135208.png | Bin 0 -> 55723 bytes .../figure/en-us_image_0000001099135218.png | Bin 0 -> 20418 bytes .../figure/en-us_image_0000001099151022.png | Bin 0 -> 4916 bytes .../figure/en-us_image_0000001099151052.png | Bin 0 -> 56402 bytes .../figure/en-us_image_0000001099282726.png | Bin 0 -> 42437 bytes .../figure/en-us_image_0000001099480652.jpg | Bin 0 -> 64186 bytes .../figure/en-us_image_0000001099602632.png | Bin 0 -> 30510 bytes .../figure/en-us_image_0000001100340752.png | Bin 0 -> 57249 bytes .../figure/en-us_image_0000001145495111.png | Bin 0 -> 30789 bytes .../figure/en-us_image_0000001145495125.png | Bin 0 -> 892578 bytes .../figure/en-us_image_0000001145495133.png | Bin 0 -> 284989 bytes .../figure/en-us_image_0000001145495159.jpg | Bin 0 -> 66854 bytes .../figure/en-us_image_0000001145495161.png | Bin 0 -> 3905 bytes .../figure/en-us_image_0000001145495175.png | Bin 0 -> 5430 bytes .../figure/en-us_image_0000001145495193.png | Bin 0 -> 2365 bytes .../figure/en-us_image_0000001145495195.png | Bin 0 -> 32900 bytes .../figure/en-us_image_0000001145495203.png | Bin 0 -> 9581 bytes .../figure/en-us_image_0000001145495209.png | Bin 0 -> 27239 bytes .../figure/en-us_image_0000001145495219.png | Bin 0 -> 53845 bytes .../figure/en-us_image_0000001145495221.png | Bin 0 -> 45297 bytes .../figure/en-us_image_0000001145495227.jpg | Bin 0 -> 77029 bytes .../figure/en-us_image_0000001145495247.png | Bin 0 -> 45247 bytes .../figure/en-us_image_0000001145495253.png | Bin 0 -> 2823 bytes .../figure/en-us_image_0000001145495261.png | Bin 0 -> 3924 bytes .../figure/en-us_image_0000001145511041.png | Bin 0 -> 2148 bytes .../figure/en-us_image_0000001145511043.png | Bin 0 -> 4469 bytes .../figure/en-us_image_0000001145511057.png | Bin 0 -> 35946 bytes .../figure/en-us_image_0000001145695045.png | Bin 0 -> 22057 bytes .../figure/en-us_image_0000001145695049.png | Bin 0 -> 5233 bytes .../figure/en-us_image_0000001145695053.png | Bin 0 -> 40165 bytes .../figure/en-us_image_0000001145695065.png | Bin 0 -> 2805 bytes .../figure/en-us_image_0000001145695071.png | Bin 0 -> 5564 bytes .../figure/en-us_image_0000001145695083.png | Bin 0 -> 298700 bytes .../figure/en-us_image_0000001145695089.png | Bin 0 -> 4831 bytes .../figure/en-us_image_0000001145695097.png | Bin 0 -> 52705 bytes .../figure/en-us_image_0000001145695103.jpg | Bin 0 -> 175844 bytes .../figure/en-us_image_0000001145695131.png | Bin 0 -> 3274 bytes .../figure/en-us_image_0000001145695139.png | Bin 0 -> 15465 bytes .../figure/en-us_image_0000001145695143.png | Bin 0 -> 76412 bytes .../figure/en-us_image_0000001145695149.png | Bin 0 -> 14022 bytes .../figure/en-us_image_0000001145695169.jpg | Bin 0 -> 85729 bytes .../figure/en-us_image_0000001145695171.jpg | Bin 0 -> 9206 bytes .../figure/en-us_image_0000001145695177.png | Bin 0 -> 39017 bytes .../figure/en-us_image_0000001145695187.png | Bin 0 -> 3258 bytes .../figure/en-us_image_0000001145695193.png | Bin 0 -> 58368 bytes .../figure/en-us_image_0000001145710975.png | Bin 0 -> 3098 bytes .../figure/en-us_image_0000001145710989.png | Bin 0 -> 7879 bytes .../figure/en-us_image_0000001145710991.png | Bin 0 -> 14258 bytes .../figure/en-us_image_0000001145710993.png | Bin 0 -> 15867 bytes .../figure/en-us_image_0000001145710995.png | Bin 0 -> 2885 bytes .../figure/en-us_image_0000001145814971.png | Bin 0 -> 9521 bytes .../figure/en-us_image_0000001145814977.png | Bin 0 -> 4070 bytes .../figure/en-us_image_0000001145814981.png | Bin 0 -> 30236 bytes .../figure/en-us_image_0000001145814985.png | Bin 0 -> 17002 bytes .../figure/en-us_image_0000001145814991.png | Bin 0 -> 1525 bytes .../figure/en-us_image_0000001145814997.png | Bin 0 -> 3940 bytes .../figure/en-us_image_0000001145815011.png | Bin 0 -> 83041 bytes .../figure/en-us_image_0000001145815017.png | Bin 0 -> 8713 bytes .../figure/en-us_image_0000001145815021.png | Bin 0 -> 60592 bytes .../figure/en-us_image_0000001145815025.png | Bin 0 -> 2180 bytes .../figure/en-us_image_0000001145815033.png | Bin 0 -> 11070 bytes .../figure/en-us_image_0000001145815039.png | Bin 0 -> 49797 bytes .../figure/en-us_image_0000001145815045.png | Bin 0 -> 1502 bytes .../figure/en-us_image_0000001145815055.png | Bin 0 -> 16620 bytes .../figure/en-us_image_0000001145815059.png | Bin 0 -> 14162 bytes .../figure/en-us_image_0000001145815069.png | Bin 0 -> 50014 bytes .../figure/en-us_image_0000001145815079.png | Bin 0 -> 1087664 bytes .../figure/en-us_image_0000001145815093.png | Bin 0 -> 9521 bytes .../figure/en-us_image_0000001145815101.png | Bin 0 -> 34102 bytes .../figure/en-us_image_0000001145815117.png | Bin 0 -> 2002 bytes .../figure/en-us_image_0000001145830887.png | Bin 0 -> 2811 bytes .../figure/en-us_image_0000001145830893.jpg | Bin 0 -> 11302 bytes .../figure/en-us_image_0000001145830907.png | Bin 0 -> 32612 bytes .../figure/en-us_image_0000001145830909.png | Bin 0 -> 5998 bytes .../figure/en-us_image_0000001145895087.png | Bin 0 -> 44871 bytes .../figure/en-us_image_0000001145895093.png | Bin 0 -> 55674 bytes .../figure/en-us_image_0000001145895095.png | Bin 0 -> 927 bytes .../figure/en-us_image_0000001145895101.png | Bin 0 -> 98943 bytes .../figure/en-us_image_0000001145895125.png | Bin 0 -> 14398 bytes .../figure/en-us_image_0000001145895131.png | Bin 0 -> 64246 bytes .../figure/en-us_image_0000001145895139.png | Bin 0 -> 14649 bytes .../figure/en-us_image_0000001145895141.png | Bin 0 -> 3453 bytes .../figure/en-us_image_0000001145895151.png | Bin 0 -> 35718 bytes .../figure/en-us_image_0000001145895161.png | Bin 0 -> 3070 bytes .../figure/en-us_image_0000001145895173.png | Bin 0 -> 16339 bytes .../figure/en-us_image_0000001145895175.png | Bin 0 -> 38952 bytes .../figure/en-us_image_0000001145895187.png | Bin 0 -> 9930 bytes .../figure/en-us_image_0000001145895199.png | Bin 0 -> 12927 bytes .../figure/en-us_image_0000001145895219.png | Bin 0 -> 5987 bytes .../figure/en-us_image_0000001145911019.jpg | Bin 0 -> 4295 bytes .../figure/en-us_image_0000001145911035.png | Bin 0 -> 13873 bytes .../figure/en-us_image_0000001145911037.png | Bin 0 -> 12176 bytes .../figure/en-us_image_0000001145911043.png | Bin 0 -> 2970 bytes .../figure/en-us_image_0000001146480609.png | Bin 0 -> 17129 bytes .../figure/en-us_image_0000001146820617.png | Bin 0 -> 12901 bytes .../figure/en-us_image_0000001147735331.png | Bin 0 -> 196289 bytes .../figure/en-us_image_0000001217970670.png | Bin 0 -> 26426 bytes .../figure/en-us_image_0000001248721592.png | Bin 0 -> 55453 bytes .../public_sys-resources/ExpandCollapse.js | 1 + .../caution_3.0-en-us.png | Bin 0 -> 2752 bytes .../dev/public_sys-resources/commonltr.css | 1 + .../public_sys-resources/commonltr_print.css | 1 + .../dev/public_sys-resources/commonrtl.css | 2 + .../public_sys-resources/danger_3.0-en-us.png | Bin 0 -> 2771 bytes docs/dws/dev/public_sys-resources/delta.gif | Bin 0 -> 836 bytes .../dws/dev/public_sys-resources/deltaend.gif | Bin 0 -> 834 bytes .../dev/public_sys-resources/icon-arrowdn.gif | Bin 0 -> 1887 bytes .../dev/public_sys-resources/icon-arrowrt.gif | Bin 0 -> 1890 bytes .../dev/public_sys-resources/icon-caution.gif | Bin 0 -> 1086 bytes .../dev/public_sys-resources/icon-danger.gif | Bin 0 -> 1086 bytes .../dev/public_sys-resources/icon-huawei.gif | Bin 0 -> 2767 bytes .../dev/public_sys-resources/icon-note.gif | Bin 0 -> 983 bytes .../dev/public_sys-resources/icon-notice.gif | Bin 0 -> 962 bytes .../dws/dev/public_sys-resources/icon-tip.gif | Bin 0 -> 879 bytes .../dev/public_sys-resources/icon-warning.gif | Bin 0 -> 1086 bytes .../public_sys-resources/note_3.0-en-us.png | Bin 0 -> 1080 bytes .../public_sys-resources/notice_3.0-en-us.png | Bin 0 -> 1672 bytes docs/dws/dev/public_sys-resources/popup.js | 1 + .../dws/dev/public_sys-resources/pygments.css | 1 + .../warning_3.0-en-us.png | Bin 0 -> 3164 bytes 1140 files changed, 127700 insertions(+) create mode 100644 docs/dws/dev/ALL_META.TXT.json create mode 100644 docs/dws/dev/CLASS.TXT.json create mode 100644 docs/dws/dev/PARAMETERS.txt create mode 100644 docs/dws/dev/dws_01_0127.html create mode 100644 docs/dws/dev/dws_04_0001.html create mode 100644 docs/dws/dev/dws_04_0002.html create mode 100644 docs/dws/dev/dws_04_0004.html create mode 100644 docs/dws/dev/dws_04_0005.html create mode 100644 docs/dws/dev/dws_04_0006.html create mode 100644 docs/dws/dev/dws_04_0007.html create mode 100644 docs/dws/dev/dws_04_0011.html create mode 100644 docs/dws/dev/dws_04_0012.html create mode 100644 docs/dws/dev/dws_04_0015.html create mode 100644 docs/dws/dev/dws_04_0042.html create mode 100644 docs/dws/dev/dws_04_0043.html create mode 100644 docs/dws/dev/dws_04_0053.html create mode 100644 docs/dws/dev/dws_04_0054.html create mode 100644 docs/dws/dev/dws_04_0055.html create mode 100644 docs/dws/dev/dws_04_0056.html create mode 100644 docs/dws/dev/dws_04_0057.html create mode 100644 docs/dws/dev/dws_04_0058.html create mode 100644 docs/dws/dev/dws_04_0059.html create mode 100644 docs/dws/dev/dws_04_0060.html create mode 100644 docs/dws/dev/dws_04_0061.html create mode 100644 docs/dws/dev/dws_04_0062.html create mode 100644 docs/dws/dev/dws_04_0063.html create mode 100644 docs/dws/dev/dws_04_0064.html create mode 100644 docs/dws/dev/dws_04_0065.html create mode 100644 docs/dws/dev/dws_04_0066.html create mode 100644 docs/dws/dev/dws_04_0067.html create mode 100644 docs/dws/dev/dws_04_0074.html create mode 100644 docs/dws/dev/dws_04_0075.html create mode 100644 docs/dws/dev/dws_04_0076.html create mode 100644 docs/dws/dev/dws_04_0077.html create mode 100644 docs/dws/dev/dws_04_0078.html create mode 100644 docs/dws/dev/dws_04_0079.html create mode 100644 docs/dws/dev/dws_04_0080.html create mode 100644 docs/dws/dev/dws_04_0081.html create mode 100644 docs/dws/dev/dws_04_0082.html create mode 100644 docs/dws/dev/dws_04_0083.html create mode 100644 docs/dws/dev/dws_04_0084.html create mode 100644 docs/dws/dev/dws_04_0085.html create mode 100644 docs/dws/dev/dws_04_0086.html create mode 100644 docs/dws/dev/dws_04_0087.html create mode 100644 docs/dws/dev/dws_04_0088.html create mode 100644 docs/dws/dev/dws_04_0090.html create mode 100644 docs/dws/dev/dws_04_0091.html create mode 100644 docs/dws/dev/dws_04_0092.html create mode 100644 docs/dws/dev/dws_04_0093.html create mode 100644 docs/dws/dev/dws_04_0095.html create mode 100644 docs/dws/dev/dws_04_0096.html create mode 100644 docs/dws/dev/dws_04_0097.html create mode 100644 docs/dws/dev/dws_04_0098.html create mode 100644 docs/dws/dev/dws_04_0099.html create mode 100644 docs/dws/dev/dws_04_0100.html create mode 100644 docs/dws/dev/dws_04_0101.html create mode 100644 docs/dws/dev/dws_04_0102.html create mode 100644 docs/dws/dev/dws_04_0103.html create mode 100644 docs/dws/dev/dws_04_0104.html create mode 100644 docs/dws/dev/dws_04_0105.html create mode 100644 docs/dws/dev/dws_04_0106.html create mode 100644 docs/dws/dev/dws_04_0107.html create mode 100644 docs/dws/dev/dws_04_0108.html create mode 100644 docs/dws/dev/dws_04_0109.html create mode 100644 docs/dws/dev/dws_04_0110.html create mode 100644 docs/dws/dev/dws_04_0111.html create mode 100644 docs/dws/dev/dws_04_0112.html create mode 100644 docs/dws/dev/dws_04_0113.html create mode 100644 docs/dws/dev/dws_04_0114.html create mode 100644 docs/dws/dev/dws_04_0115.html create mode 100644 docs/dws/dev/dws_04_0116.html create mode 100644 docs/dws/dev/dws_04_0117.html create mode 100644 docs/dws/dev/dws_04_0118.html create mode 100644 docs/dws/dev/dws_04_0119.html create mode 100644 docs/dws/dev/dws_04_0120.html create mode 100644 docs/dws/dev/dws_04_0123.html create mode 100644 docs/dws/dev/dws_04_0124.html create mode 100644 docs/dws/dev/dws_04_0125.html create mode 100644 docs/dws/dev/dws_04_0126.html create mode 100644 docs/dws/dev/dws_04_0127.html create mode 100644 docs/dws/dev/dws_04_0128.html create mode 100644 docs/dws/dev/dws_04_0129.html create mode 100644 docs/dws/dev/dws_04_0130.html create mode 100644 docs/dws/dev/dws_04_0131.html create mode 100644 docs/dws/dev/dws_04_0132.html create mode 100644 docs/dws/dev/dws_04_0133.html create mode 100644 docs/dws/dev/dws_04_0134.html create mode 100644 docs/dws/dev/dws_04_0135.html create mode 100644 docs/dws/dev/dws_04_0136.html create mode 100644 docs/dws/dev/dws_04_0137.html create mode 100644 docs/dws/dev/dws_04_0138.html create mode 100644 docs/dws/dev/dws_04_0139.html create mode 100644 docs/dws/dev/dws_04_0140.html create mode 100644 docs/dws/dev/dws_04_0141.html create mode 100644 docs/dws/dev/dws_04_0142.html create mode 100644 docs/dws/dev/dws_04_0143.html create mode 100644 docs/dws/dev/dws_04_0144.html create mode 100644 docs/dws/dev/dws_04_0145.html create mode 100644 docs/dws/dev/dws_04_0146.html create mode 100644 docs/dws/dev/dws_04_0154.html create mode 100644 docs/dws/dev/dws_04_0155.html create mode 100644 docs/dws/dev/dws_04_0156.html create mode 100644 docs/dws/dev/dws_04_0157.html create mode 100644 docs/dws/dev/dws_04_0158.html create mode 100644 docs/dws/dev/dws_04_0159.html create mode 100644 docs/dws/dev/dws_04_0160.html create mode 100644 docs/dws/dev/dws_04_0161.html create mode 100644 docs/dws/dev/dws_04_0162.html create mode 100644 docs/dws/dev/dws_04_0163.html create mode 100644 docs/dws/dev/dws_04_0164.html create mode 100644 docs/dws/dev/dws_04_0179.html create mode 100644 docs/dws/dev/dws_04_0180.html create mode 100644 docs/dws/dev/dws_04_0181.html create mode 100644 docs/dws/dev/dws_04_0182.html create mode 100644 docs/dws/dev/dws_04_0183.html create mode 100644 docs/dws/dev/dws_04_0184.html create mode 100644 docs/dws/dev/dws_04_0185.html create mode 100644 docs/dws/dev/dws_04_0186.html create mode 100644 docs/dws/dev/dws_04_0187.html create mode 100644 docs/dws/dev/dws_04_0189.html create mode 100644 docs/dws/dev/dws_04_0190.html create mode 100644 docs/dws/dev/dws_04_0192.html create mode 100644 docs/dws/dev/dws_04_0193.html create mode 100644 docs/dws/dev/dws_04_0194.html create mode 100644 docs/dws/dev/dws_04_0195.html create mode 100644 docs/dws/dev/dws_04_0196.html create mode 100644 docs/dws/dev/dws_04_0197.html create mode 100644 docs/dws/dev/dws_04_0198.html create mode 100644 docs/dws/dev/dws_04_0203.html create mode 100644 docs/dws/dev/dws_04_0204.html create mode 100644 docs/dws/dev/dws_04_0205.html create mode 100644 docs/dws/dev/dws_04_0206.html create mode 100644 docs/dws/dev/dws_04_0207.html create mode 100644 docs/dws/dev/dws_04_0208.html create mode 100644 docs/dws/dev/dws_04_0209.html create mode 100644 docs/dws/dev/dws_04_0210.html create mode 100644 docs/dws/dev/dws_04_0212.html create mode 100644 docs/dws/dev/dws_04_0213.html create mode 100644 docs/dws/dev/dws_04_0214.html create mode 100644 docs/dws/dev/dws_04_0215.html create mode 100644 docs/dws/dev/dws_04_0216.html create mode 100644 docs/dws/dev/dws_04_0217.html create mode 100644 docs/dws/dev/dws_04_0219.html create mode 100644 docs/dws/dev/dws_04_0228.html create mode 100644 docs/dws/dev/dws_04_0243.html create mode 100644 docs/dws/dev/dws_04_0244.html create mode 100644 docs/dws/dev/dws_04_0245.html create mode 100644 docs/dws/dev/dws_04_0246.html create mode 100644 docs/dws/dev/dws_04_0247.html create mode 100644 docs/dws/dev/dws_04_0249.html create mode 100644 docs/dws/dev/dws_04_0250.html create mode 100644 docs/dws/dev/dws_04_0251.html create mode 100644 docs/dws/dev/dws_04_0252.html create mode 100644 docs/dws/dev/dws_04_0253.html create mode 100644 docs/dws/dev/dws_04_0254.html create mode 100644 docs/dws/dev/dws_04_0255.html create mode 100644 docs/dws/dev/dws_04_0256.html create mode 100644 docs/dws/dev/dws_04_0258.html create mode 100644 docs/dws/dev/dws_04_0259.html create mode 100644 docs/dws/dev/dws_04_0260.html create mode 100644 docs/dws/dev/dws_04_0261.html create mode 100644 docs/dws/dev/dws_04_0262.html create mode 100644 docs/dws/dev/dws_04_0263.html create mode 100644 docs/dws/dev/dws_04_0264.html create mode 100644 docs/dws/dev/dws_04_0265.html create mode 100644 docs/dws/dev/dws_04_0266.html create mode 100644 docs/dws/dev/dws_04_0267.html create mode 100644 docs/dws/dev/dws_04_0268.html create mode 100644 docs/dws/dev/dws_04_0269.html create mode 100644 docs/dws/dev/dws_04_0270.html create mode 100644 docs/dws/dev/dws_04_0271.html create mode 100644 docs/dws/dev/dws_04_0272.html create mode 100644 docs/dws/dev/dws_04_0273.html create mode 100644 docs/dws/dev/dws_04_0274.html create mode 100644 docs/dws/dev/dws_04_0275.html create mode 100644 docs/dws/dev/dws_04_0276.html create mode 100644 docs/dws/dev/dws_04_0277.html create mode 100644 docs/dws/dev/dws_04_0278.html create mode 100644 docs/dws/dev/dws_04_0279.html create mode 100644 docs/dws/dev/dws_04_0301.html create mode 100644 docs/dws/dev/dws_04_0302.html create mode 100644 docs/dws/dev/dws_04_0304.html create mode 100644 docs/dws/dev/dws_04_0305.html create mode 100644 docs/dws/dev/dws_04_0306.html create mode 100644 docs/dws/dev/dws_04_0393.html create mode 100644 docs/dws/dev/dws_04_0394.html create mode 100644 docs/dws/dev/dws_04_0395.html create mode 100644 docs/dws/dev/dws_04_0396.html create mode 100644 docs/dws/dev/dws_04_0397.html create mode 100644 docs/dws/dev/dws_04_0398.html create mode 100644 docs/dws/dev/dws_04_0399.html create mode 100644 docs/dws/dev/dws_04_0400.html create mode 100644 docs/dws/dev/dws_04_0402.html create mode 100644 docs/dws/dev/dws_04_0403.html create mode 100644 docs/dws/dev/dws_04_0409.html create mode 100644 docs/dws/dev/dws_04_0410.html create mode 100644 docs/dws/dev/dws_04_0411.html create mode 100644 docs/dws/dev/dws_04_0412.html create mode 100644 docs/dws/dev/dws_04_0413.html create mode 100644 docs/dws/dev/dws_04_0430.html create mode 100644 docs/dws/dev/dws_04_0435.html create mode 100644 docs/dws/dev/dws_04_0436.html create mode 100644 docs/dws/dev/dws_04_0437.html create mode 100644 docs/dws/dev/dws_04_0438.html create mode 100644 docs/dws/dev/dws_04_0439.html create mode 100644 docs/dws/dev/dws_04_0440.html create mode 100644 docs/dws/dev/dws_04_0441.html create mode 100644 docs/dws/dev/dws_04_0442.html create mode 100644 docs/dws/dev/dws_04_0443.html create mode 100644 docs/dws/dev/dws_04_0444.html create mode 100644 docs/dws/dev/dws_04_0445.html create mode 100644 docs/dws/dev/dws_04_0446.html create mode 100644 docs/dws/dev/dws_04_0447.html create mode 100644 docs/dws/dev/dws_04_0448.html create mode 100644 docs/dws/dev/dws_04_0449.html create mode 100644 docs/dws/dev/dws_04_0450.html create mode 100644 docs/dws/dev/dws_04_0451.html create mode 100644 docs/dws/dev/dws_04_0452.html create mode 100644 docs/dws/dev/dws_04_0453.html create mode 100644 docs/dws/dev/dws_04_0454.html create mode 100644 docs/dws/dev/dws_04_0455.html create mode 100644 docs/dws/dev/dws_04_0456.html create mode 100644 docs/dws/dev/dws_04_0457.html create mode 100644 docs/dws/dev/dws_04_0458.html create mode 100644 docs/dws/dev/dws_04_0459.html create mode 100644 docs/dws/dev/dws_04_0460.html create mode 100644 docs/dws/dev/dws_04_0461.html create mode 100644 docs/dws/dev/dws_04_0462.html create mode 100644 docs/dws/dev/dws_04_0463.html create mode 100644 docs/dws/dev/dws_04_0464.html create mode 100644 docs/dws/dev/dws_04_0465.html create mode 100644 docs/dws/dev/dws_04_0466.html create mode 100644 docs/dws/dev/dws_04_0467.html create mode 100644 docs/dws/dev/dws_04_0468.html create mode 100644 docs/dws/dev/dws_04_0469.html create mode 100644 docs/dws/dev/dws_04_0470.html create mode 100644 docs/dws/dev/dws_04_0471.html create mode 100644 docs/dws/dev/dws_04_0472.html create mode 100644 docs/dws/dev/dws_04_0473.html create mode 100644 docs/dws/dev/dws_04_0474.html create mode 100644 docs/dws/dev/dws_04_0475.html create mode 100644 docs/dws/dev/dws_04_0476.html create mode 100644 docs/dws/dev/dws_04_0477.html create mode 100644 docs/dws/dev/dws_04_0478.html create mode 100644 docs/dws/dev/dws_04_0479.html create mode 100644 docs/dws/dev/dws_04_0480.html create mode 100644 docs/dws/dev/dws_04_0481.html create mode 100644 docs/dws/dev/dws_04_0482.html create mode 100644 docs/dws/dev/dws_04_0483.html create mode 100644 docs/dws/dev/dws_04_0484.html create mode 100644 docs/dws/dev/dws_04_0485.html create mode 100644 docs/dws/dev/dws_04_0486.html create mode 100644 docs/dws/dev/dws_04_0487.html create mode 100644 docs/dws/dev/dws_04_0488.html create mode 100644 docs/dws/dev/dws_04_0489.html create mode 100644 docs/dws/dev/dws_04_0490.html create mode 100644 docs/dws/dev/dws_04_0491.html create mode 100644 docs/dws/dev/dws_04_0492.html create mode 100644 docs/dws/dev/dws_04_0494.html create mode 100644 docs/dws/dev/dws_04_0495.html create mode 100644 docs/dws/dev/dws_04_0496.html create mode 100644 docs/dws/dev/dws_04_0497.html create mode 100644 docs/dws/dev/dws_04_0507.html create mode 100644 docs/dws/dev/dws_04_0509.html create mode 100644 docs/dws/dev/dws_04_0511.html create mode 100644 docs/dws/dev/dws_04_0512.html create mode 100644 docs/dws/dev/dws_04_0513.html create mode 100644 docs/dws/dev/dws_04_0514.html create mode 100644 docs/dws/dev/dws_04_0515.html create mode 100644 docs/dws/dev/dws_04_0516.html create mode 100644 docs/dws/dev/dws_04_0517.html create mode 100644 docs/dws/dev/dws_04_0518.html create mode 100644 docs/dws/dev/dws_04_0519.html create mode 100644 docs/dws/dev/dws_04_0520.html create mode 100644 docs/dws/dev/dws_04_0521.html create mode 100644 docs/dws/dev/dws_04_0522.html create mode 100644 docs/dws/dev/dws_04_0523.html create mode 100644 docs/dws/dev/dws_04_0524.html create mode 100644 docs/dws/dev/dws_04_0525.html create mode 100644 docs/dws/dev/dws_04_0526.html create mode 100644 docs/dws/dev/dws_04_0527.html create mode 100644 docs/dws/dev/dws_04_0528.html create mode 100644 docs/dws/dev/dws_04_0529.html create mode 100644 docs/dws/dev/dws_04_0530.html create mode 100644 docs/dws/dev/dws_04_0531.html create mode 100644 docs/dws/dev/dws_04_0532.html create mode 100644 docs/dws/dev/dws_04_0533.html create mode 100644 docs/dws/dev/dws_04_0534.html create mode 100644 docs/dws/dev/dws_04_0535.html create mode 100644 docs/dws/dev/dws_04_0536.html create mode 100644 docs/dws/dev/dws_04_0537.html create mode 100644 docs/dws/dev/dws_04_0538.html create mode 100644 docs/dws/dev/dws_04_0539.html create mode 100644 docs/dws/dev/dws_04_0540.html create mode 100644 docs/dws/dev/dws_04_0541.html create mode 100644 docs/dws/dev/dws_04_0542.html create mode 100644 docs/dws/dev/dws_04_0543.html create mode 100644 docs/dws/dev/dws_04_0544.html create mode 100644 docs/dws/dev/dws_04_0545.html create mode 100644 docs/dws/dev/dws_04_0546.html create mode 100644 docs/dws/dev/dws_04_0547.html create mode 100644 docs/dws/dev/dws_04_0548.html create mode 100644 docs/dws/dev/dws_04_0549.html create mode 100644 docs/dws/dev/dws_04_0550.html create mode 100644 docs/dws/dev/dws_04_0551.html create mode 100644 docs/dws/dev/dws_04_0552.html create mode 100644 docs/dws/dev/dws_04_0553.html create mode 100644 docs/dws/dev/dws_04_0554.html create mode 100644 docs/dws/dev/dws_04_0555.html create mode 100644 docs/dws/dev/dws_04_0556.html create mode 100644 docs/dws/dev/dws_04_0558.html create mode 100644 docs/dws/dev/dws_04_0559.html create mode 100644 docs/dws/dev/dws_04_0560.html create mode 100644 docs/dws/dev/dws_04_0561.html create mode 100644 docs/dws/dev/dws_04_0562.html create mode 100644 docs/dws/dev/dws_04_0564.html create mode 100644 docs/dws/dev/dws_04_0565.html create mode 100644 docs/dws/dev/dws_04_0566.html create mode 100644 docs/dws/dev/dws_04_0567.html create mode 100644 docs/dws/dev/dws_04_0568.html create mode 100644 docs/dws/dev/dws_04_0569.html create mode 100644 docs/dws/dev/dws_04_0570.html create mode 100644 docs/dws/dev/dws_04_0571.html create mode 100644 docs/dws/dev/dws_04_0572.html create mode 100644 docs/dws/dev/dws_04_0573.html create mode 100644 docs/dws/dev/dws_04_0574.html create mode 100644 docs/dws/dev/dws_04_0575.html create mode 100644 docs/dws/dev/dws_04_0576.html create mode 100644 docs/dws/dev/dws_04_0577.html create mode 100644 docs/dws/dev/dws_04_0578.html create mode 100644 docs/dws/dev/dws_04_0579.html create mode 100644 docs/dws/dev/dws_04_0580.html create mode 100644 docs/dws/dev/dws_04_0581.html create mode 100644 docs/dws/dev/dws_04_0582.html create mode 100644 docs/dws/dev/dws_04_0583.html create mode 100644 docs/dws/dev/dws_04_0584.html create mode 100644 docs/dws/dev/dws_04_0585.html create mode 100644 docs/dws/dev/dws_04_0586.html create mode 100644 docs/dws/dev/dws_04_0588.html create mode 100644 docs/dws/dev/dws_04_0589.html create mode 100644 docs/dws/dev/dws_04_0590.html create mode 100644 docs/dws/dev/dws_04_0591.html create mode 100644 docs/dws/dev/dws_04_0592.html create mode 100644 docs/dws/dev/dws_04_0593.html create mode 100644 docs/dws/dev/dws_04_0594.html create mode 100644 docs/dws/dev/dws_04_0595.html create mode 100644 docs/dws/dev/dws_04_0596.html create mode 100644 docs/dws/dev/dws_04_0597.html create mode 100644 docs/dws/dev/dws_04_0598.html create mode 100644 docs/dws/dev/dws_04_0599.html create mode 100644 docs/dws/dev/dws_04_0600.html create mode 100644 docs/dws/dev/dws_04_0601.html create mode 100644 docs/dws/dev/dws_04_0602.html create mode 100644 docs/dws/dev/dws_04_0603.html create mode 100644 docs/dws/dev/dws_04_0604.html create mode 100644 docs/dws/dev/dws_04_0605.html create mode 100644 docs/dws/dev/dws_04_0606.html create mode 100644 docs/dws/dev/dws_04_0607.html create mode 100644 docs/dws/dev/dws_04_0608.html create mode 100644 docs/dws/dev/dws_04_0609.html create mode 100644 docs/dws/dev/dws_04_0610.html create mode 100644 docs/dws/dev/dws_04_0611.html create mode 100644 docs/dws/dev/dws_04_0612.html create mode 100644 docs/dws/dev/dws_04_0613.html create mode 100644 docs/dws/dev/dws_04_0614.html create mode 100644 docs/dws/dev/dws_04_0615.html create mode 100644 docs/dws/dev/dws_04_0616.html create mode 100644 docs/dws/dev/dws_04_0617.html create mode 100644 docs/dws/dev/dws_04_0618.html create mode 100644 docs/dws/dev/dws_04_0619.html create mode 100644 docs/dws/dev/dws_04_0620.html create mode 100644 docs/dws/dev/dws_04_0621.html create mode 100644 docs/dws/dev/dws_04_0622.html create mode 100644 docs/dws/dev/dws_04_0623.html create mode 100644 docs/dws/dev/dws_04_0624.html create mode 100644 docs/dws/dev/dws_04_0625.html create mode 100644 docs/dws/dev/dws_04_0626.html create mode 100644 docs/dws/dev/dws_04_0627.html create mode 100644 docs/dws/dev/dws_04_0628.html create mode 100644 docs/dws/dev/dws_04_0629.html create mode 100644 docs/dws/dev/dws_04_0630.html create mode 100644 docs/dws/dev/dws_04_0631.html create mode 100644 docs/dws/dev/dws_04_0632.html create mode 100644 docs/dws/dev/dws_04_0633.html create mode 100644 docs/dws/dev/dws_04_0634.html create mode 100644 docs/dws/dev/dws_04_0635.html create mode 100644 docs/dws/dev/dws_04_0639.html create mode 100644 docs/dws/dev/dws_04_0640.html create mode 100644 docs/dws/dev/dws_04_0641.html create mode 100644 docs/dws/dev/dws_04_0642.html create mode 100644 docs/dws/dev/dws_04_0643.html create mode 100644 docs/dws/dev/dws_04_0644.html create mode 100644 docs/dws/dev/dws_04_0645.html create mode 100644 docs/dws/dev/dws_04_0646.html create mode 100644 docs/dws/dev/dws_04_0647.html create mode 100644 docs/dws/dev/dws_04_0648.html create mode 100644 docs/dws/dev/dws_04_0649.html create mode 100644 docs/dws/dev/dws_04_0650.html create mode 100644 docs/dws/dev/dws_04_0651.html create mode 100644 docs/dws/dev/dws_04_0652.html create mode 100644 docs/dws/dev/dws_04_0653.html create mode 100644 docs/dws/dev/dws_04_0654.html create mode 100644 docs/dws/dev/dws_04_0655.html create mode 100644 docs/dws/dev/dws_04_0656.html create mode 100644 docs/dws/dev/dws_04_0657.html create mode 100644 docs/dws/dev/dws_04_0658.html create mode 100644 docs/dws/dev/dws_04_0659.html create mode 100644 docs/dws/dev/dws_04_0660.html create mode 100644 docs/dws/dev/dws_04_0661.html create mode 100644 docs/dws/dev/dws_04_0662.html create mode 100644 docs/dws/dev/dws_04_0663.html create mode 100644 docs/dws/dev/dws_04_0664.html create mode 100644 docs/dws/dev/dws_04_0665.html create mode 100644 docs/dws/dev/dws_04_0666.html create mode 100644 docs/dws/dev/dws_04_0667.html create mode 100644 docs/dws/dev/dws_04_0668.html create mode 100644 docs/dws/dev/dws_04_0669.html create mode 100644 docs/dws/dev/dws_04_0670.html create mode 100644 docs/dws/dev/dws_04_0671.html create mode 100644 docs/dws/dev/dws_04_0672.html create mode 100644 docs/dws/dev/dws_04_0673.html create mode 100644 docs/dws/dev/dws_04_0674.html create mode 100644 docs/dws/dev/dws_04_0675.html create mode 100644 docs/dws/dev/dws_04_0676.html create mode 100644 docs/dws/dev/dws_04_0677.html create mode 100644 docs/dws/dev/dws_04_0678.html create mode 100644 docs/dws/dev/dws_04_0679.html create mode 100644 docs/dws/dev/dws_04_0680.html create mode 100644 docs/dws/dev/dws_04_0681.html create mode 100644 docs/dws/dev/dws_04_0682.html create mode 100644 docs/dws/dev/dws_04_0683.html create mode 100644 docs/dws/dev/dws_04_0684.html create mode 100644 docs/dws/dev/dws_04_0685.html create mode 100644 docs/dws/dev/dws_04_0686.html create mode 100644 docs/dws/dev/dws_04_0687.html create mode 100644 docs/dws/dev/dws_04_0688.html create mode 100644 docs/dws/dev/dws_04_0689.html create mode 100644 docs/dws/dev/dws_04_0690.html create mode 100644 docs/dws/dev/dws_04_0691.html create mode 100644 docs/dws/dev/dws_04_0692.html create mode 100644 docs/dws/dev/dws_04_0693.html create mode 100644 docs/dws/dev/dws_04_0694.html create mode 100644 docs/dws/dev/dws_04_0695.html create mode 100644 docs/dws/dev/dws_04_0696.html create mode 100644 docs/dws/dev/dws_04_0701.html create mode 100644 docs/dws/dev/dws_04_0702.html create mode 100644 docs/dws/dev/dws_04_0703.html create mode 100644 docs/dws/dev/dws_04_0704.html create mode 100644 docs/dws/dev/dws_04_0705.html create mode 100644 docs/dws/dev/dws_04_0706.html create mode 100644 docs/dws/dev/dws_04_0708.html create mode 100644 docs/dws/dev/dws_04_0709.html create mode 100644 docs/dws/dev/dws_04_0710.html create mode 100644 docs/dws/dev/dws_04_0711.html create mode 100644 docs/dws/dev/dws_04_0712.html create mode 100644 docs/dws/dev/dws_04_0713.html create mode 100644 docs/dws/dev/dws_04_0714.html create mode 100644 docs/dws/dev/dws_04_0715.html create mode 100644 docs/dws/dev/dws_04_0716.html create mode 100644 docs/dws/dev/dws_04_0717.html create mode 100644 docs/dws/dev/dws_04_0718.html create mode 100644 docs/dws/dev/dws_04_0719.html create mode 100644 docs/dws/dev/dws_04_0720.html create mode 100644 docs/dws/dev/dws_04_0721.html create mode 100644 docs/dws/dev/dws_04_0722.html create mode 100644 docs/dws/dev/dws_04_0723.html create mode 100644 docs/dws/dev/dws_04_0724.html create mode 100644 docs/dws/dev/dws_04_0725.html create mode 100644 docs/dws/dev/dws_04_0726.html create mode 100644 docs/dws/dev/dws_04_0727.html create mode 100644 docs/dws/dev/dws_04_0728.html create mode 100644 docs/dws/dev/dws_04_0729.html create mode 100644 docs/dws/dev/dws_04_0730.html create mode 100644 docs/dws/dev/dws_04_0731.html create mode 100644 docs/dws/dev/dws_04_0732.html create mode 100644 docs/dws/dev/dws_04_0733.html create mode 100644 docs/dws/dev/dws_04_0734.html create mode 100644 docs/dws/dev/dws_04_0735.html create mode 100644 docs/dws/dev/dws_04_0736.html create mode 100644 docs/dws/dev/dws_04_0737.html create mode 100644 docs/dws/dev/dws_04_0738.html create mode 100644 docs/dws/dev/dws_04_0739.html create mode 100644 docs/dws/dev/dws_04_0740.html create mode 100644 docs/dws/dev/dws_04_0741.html create mode 100644 docs/dws/dev/dws_04_0742.html create mode 100644 docs/dws/dev/dws_04_0743.html create mode 100644 docs/dws/dev/dws_04_0744.html create mode 100644 docs/dws/dev/dws_04_0745.html create mode 100644 docs/dws/dev/dws_04_0746.html create mode 100644 docs/dws/dev/dws_04_0747.html create mode 100644 docs/dws/dev/dws_04_0748.html create mode 100644 docs/dws/dev/dws_04_0749.html create mode 100644 docs/dws/dev/dws_04_0750.html create mode 100644 docs/dws/dev/dws_04_0751.html create mode 100644 docs/dws/dev/dws_04_0752.html create mode 100644 docs/dws/dev/dws_04_0753.html create mode 100644 docs/dws/dev/dws_04_0754.html create mode 100644 docs/dws/dev/dws_04_0755.html create mode 100644 docs/dws/dev/dws_04_0757.html create mode 100644 docs/dws/dev/dws_04_0758.html create mode 100644 docs/dws/dev/dws_04_0759.html create mode 100644 docs/dws/dev/dws_04_0760.html create mode 100644 docs/dws/dev/dws_04_0761.html create mode 100644 docs/dws/dev/dws_04_0762.html create mode 100644 docs/dws/dev/dws_04_0763.html create mode 100644 docs/dws/dev/dws_04_0764.html create mode 100644 docs/dws/dev/dws_04_0765.html create mode 100644 docs/dws/dev/dws_04_0766.html create mode 100644 docs/dws/dev/dws_04_0767.html create mode 100644 docs/dws/dev/dws_04_0768.html create mode 100644 docs/dws/dev/dws_04_0769.html create mode 100644 docs/dws/dev/dws_04_0770.html create mode 100644 docs/dws/dev/dws_04_0771.html create mode 100644 docs/dws/dev/dws_04_0772.html create mode 100644 docs/dws/dev/dws_04_0773.html create mode 100644 docs/dws/dev/dws_04_0774.html create mode 100644 docs/dws/dev/dws_04_0775.html create mode 100644 docs/dws/dev/dws_04_0776.html create mode 100644 docs/dws/dev/dws_04_0777.html create mode 100644 docs/dws/dev/dws_04_0778.html create mode 100644 docs/dws/dev/dws_04_0779.html create mode 100644 docs/dws/dev/dws_04_0780.html create mode 100644 docs/dws/dev/dws_04_0781.html create mode 100644 docs/dws/dev/dws_04_0782.html create mode 100644 docs/dws/dev/dws_04_0783.html create mode 100644 docs/dws/dev/dws_04_0784.html create mode 100644 docs/dws/dev/dws_04_0785.html create mode 100644 docs/dws/dev/dws_04_0786.html create mode 100644 docs/dws/dev/dws_04_0787.html create mode 100644 docs/dws/dev/dws_04_0788.html create mode 100644 docs/dws/dev/dws_04_0789.html create mode 100644 docs/dws/dev/dws_04_0790.html create mode 100644 docs/dws/dev/dws_04_0791.html create mode 100644 docs/dws/dev/dws_04_0792.html create mode 100644 docs/dws/dev/dws_04_0793.html create mode 100644 docs/dws/dev/dws_04_0794.html create mode 100644 docs/dws/dev/dws_04_0795.html create mode 100644 docs/dws/dev/dws_04_0796.html create mode 100644 docs/dws/dev/dws_04_0797.html create mode 100644 docs/dws/dev/dws_04_0798.html create mode 100644 docs/dws/dev/dws_04_0799.html create mode 100644 docs/dws/dev/dws_04_0800.html create mode 100644 docs/dws/dev/dws_04_0801.html create mode 100644 docs/dws/dev/dws_04_0802.html create mode 100644 docs/dws/dev/dws_04_0803.html create mode 100644 docs/dws/dev/dws_04_0804.html create mode 100644 docs/dws/dev/dws_04_0805.html create mode 100644 docs/dws/dev/dws_04_0806.html create mode 100644 docs/dws/dev/dws_04_0807.html create mode 100644 docs/dws/dev/dws_04_0808.html create mode 100644 docs/dws/dev/dws_04_0809.html create mode 100644 docs/dws/dev/dws_04_0810.html create mode 100644 docs/dws/dev/dws_04_0811.html create mode 100644 docs/dws/dev/dws_04_0812.html create mode 100644 docs/dws/dev/dws_04_0813.html create mode 100644 docs/dws/dev/dws_04_0814.html create mode 100644 docs/dws/dev/dws_04_0815.html create mode 100644 docs/dws/dev/dws_04_0816.html create mode 100644 docs/dws/dev/dws_04_0817.html create mode 100644 docs/dws/dev/dws_04_0818.html create mode 100644 docs/dws/dev/dws_04_0819.html create mode 100644 docs/dws/dev/dws_04_0820.html create mode 100644 docs/dws/dev/dws_04_0821.html create mode 100644 docs/dws/dev/dws_04_0822.html create mode 100644 docs/dws/dev/dws_04_0823.html create mode 100644 docs/dws/dev/dws_04_0824.html create mode 100644 docs/dws/dev/dws_04_0825.html create mode 100644 docs/dws/dev/dws_04_0826.html create mode 100644 docs/dws/dev/dws_04_0827.html create mode 100644 docs/dws/dev/dws_04_0828.html create mode 100644 docs/dws/dev/dws_04_0829.html create mode 100644 docs/dws/dev/dws_04_0830.html create mode 100644 docs/dws/dev/dws_04_0831.html create mode 100644 docs/dws/dev/dws_04_0832.html create mode 100644 docs/dws/dev/dws_04_0836.html create mode 100644 docs/dws/dev/dws_04_0837.html create mode 100644 docs/dws/dev/dws_04_0838.html create mode 100644 docs/dws/dev/dws_04_0839.html create mode 100644 docs/dws/dev/dws_04_0840.html create mode 100644 docs/dws/dev/dws_04_0841.html create mode 100644 docs/dws/dev/dws_04_0842.html create mode 100644 docs/dws/dev/dws_04_0843.html create mode 100644 docs/dws/dev/dws_04_0844.html create mode 100644 docs/dws/dev/dws_04_0845.html create mode 100644 docs/dws/dev/dws_04_0846.html create mode 100644 docs/dws/dev/dws_04_0847.html create mode 100644 docs/dws/dev/dws_04_0848.html create mode 100644 docs/dws/dev/dws_04_0849.html create mode 100644 docs/dws/dev/dws_04_0850.html create mode 100644 docs/dws/dev/dws_04_0851.html create mode 100644 docs/dws/dev/dws_04_0852.html create mode 100644 docs/dws/dev/dws_04_0853.html create mode 100644 docs/dws/dev/dws_04_0854.html create mode 100644 docs/dws/dev/dws_04_0855.html create mode 100644 docs/dws/dev/dws_04_0856.html create mode 100644 docs/dws/dev/dws_04_0857.html create mode 100644 docs/dws/dev/dws_04_0858.html create mode 100644 docs/dws/dev/dws_04_0859.html create mode 100644 docs/dws/dev/dws_04_0860.html create mode 100644 docs/dws/dev/dws_04_0861.html create mode 100644 docs/dws/dev/dws_04_0862.html create mode 100644 docs/dws/dev/dws_04_0863.html create mode 100644 docs/dws/dev/dws_04_0864.html create mode 100644 docs/dws/dev/dws_04_0865.html create mode 100644 docs/dws/dev/dws_04_0866.html create mode 100644 docs/dws/dev/dws_04_0867.html create mode 100644 docs/dws/dev/dws_04_0868.html create mode 100644 docs/dws/dev/dws_04_0869.html create mode 100644 docs/dws/dev/dws_04_0870.html create mode 100644 docs/dws/dev/dws_04_0871.html create mode 100644 docs/dws/dev/dws_04_0872.html create mode 100644 docs/dws/dev/dws_04_0873.html create mode 100644 docs/dws/dev/dws_04_0874.html create mode 100644 docs/dws/dev/dws_04_0875.html create mode 100644 docs/dws/dev/dws_04_0876.html create mode 100644 docs/dws/dev/dws_04_0877.html create mode 100644 docs/dws/dev/dws_04_0878.html create mode 100644 docs/dws/dev/dws_04_0879.html create mode 100644 docs/dws/dev/dws_04_0880.html create mode 100644 docs/dws/dev/dws_04_0881.html create mode 100644 docs/dws/dev/dws_04_0883.html create mode 100644 docs/dws/dev/dws_04_0884.html create mode 100644 docs/dws/dev/dws_04_0885.html create mode 100644 docs/dws/dev/dws_04_0886.html create mode 100644 docs/dws/dev/dws_04_0888.html create mode 100644 docs/dws/dev/dws_04_0889.html create mode 100644 docs/dws/dev/dws_04_0890.html create mode 100644 docs/dws/dev/dws_04_0891.html create mode 100644 docs/dws/dev/dws_04_0892.html create mode 100644 docs/dws/dev/dws_04_0893.html create mode 100644 docs/dws/dev/dws_04_0894.html create mode 100644 docs/dws/dev/dws_04_0895.html create mode 100644 docs/dws/dev/dws_04_0896.html create mode 100644 docs/dws/dev/dws_04_0898.html create mode 100644 docs/dws/dev/dws_04_0899.html create mode 100644 docs/dws/dev/dws_04_0900.html create mode 100644 docs/dws/dev/dws_04_0901.html create mode 100644 docs/dws/dev/dws_04_0902.html create mode 100644 docs/dws/dev/dws_04_0903.html create mode 100644 docs/dws/dev/dws_04_0904.html create mode 100644 docs/dws/dev/dws_04_0905.html create mode 100644 docs/dws/dev/dws_04_0906.html create mode 100644 docs/dws/dev/dws_04_0908.html create mode 100644 docs/dws/dev/dws_04_0909.html create mode 100644 docs/dws/dev/dws_04_0910.html create mode 100644 docs/dws/dev/dws_04_0911.html create mode 100644 docs/dws/dev/dws_04_0912.html create mode 100644 docs/dws/dev/dws_04_0913.html create mode 100644 docs/dws/dev/dws_04_0914.html create mode 100644 docs/dws/dev/dws_04_0915.html create mode 100644 docs/dws/dev/dws_04_0916.html create mode 100644 docs/dws/dev/dws_04_0918.html create mode 100644 docs/dws/dev/dws_04_0919.html create mode 100644 docs/dws/dev/dws_04_0920.html create mode 100644 docs/dws/dev/dws_04_0921.html create mode 100644 docs/dws/dev/dws_04_0922.html create mode 100644 docs/dws/dev/dws_04_0923.html create mode 100644 docs/dws/dev/dws_04_0924.html create mode 100644 docs/dws/dev/dws_04_0925.html create mode 100644 docs/dws/dev/dws_04_0926.html create mode 100644 docs/dws/dev/dws_04_0927.html create mode 100644 docs/dws/dev/dws_04_0928.html create mode 100644 docs/dws/dev/dws_04_0929.html create mode 100644 docs/dws/dev/dws_04_0930.html create mode 100644 docs/dws/dev/dws_04_0931.html create mode 100644 docs/dws/dev/dws_04_0932.html create mode 100644 docs/dws/dev/dws_04_0933.html create mode 100644 docs/dws/dev/dws_04_0934.html create mode 100644 docs/dws/dev/dws_04_0936.html create mode 100644 docs/dws/dev/dws_04_0937.html create mode 100644 docs/dws/dev/dws_04_0938.html create mode 100644 docs/dws/dev/dws_04_0940.html create mode 100644 docs/dws/dev/dws_04_0941.html create mode 100644 docs/dws/dev/dws_04_0945.html create mode 100644 docs/dws/dev/dws_04_0946.html create mode 100644 docs/dws/dev/dws_04_0948.html create mode 100644 docs/dws/dev/dws_04_0949.html create mode 100644 docs/dws/dev/dws_04_0970.html create mode 100644 docs/dws/dev/dws_04_0971.html create mode 100644 docs/dws/dev/dws_04_0972.html create mode 100644 docs/dws/dev/dws_04_0985.html create mode 100644 docs/dws/dev/dws_04_0986.html create mode 100644 docs/dws/dev/dws_04_0987.html create mode 100644 docs/dws/dev/dws_04_0988.html create mode 100644 docs/dws/dev/dws_04_0994.html create mode 100644 docs/dws/dev/dws_04_0995.html create mode 100644 docs/dws/dev/dws_04_0998.html create mode 100644 docs/dws/dev/dws_04_1000.html create mode 100644 docs/dws/dev/dws_04_2000.html create mode 100644 docs/dws/dev/dws_04_3333.html create mode 100644 docs/dws/dev/dws_06_0001.html create mode 100644 docs/dws/dev/dws_06_0002.html create mode 100644 docs/dws/dev/dws_06_0003.html create mode 100644 docs/dws/dev/dws_06_0004.html create mode 100644 docs/dws/dev/dws_06_0005.html create mode 100644 docs/dws/dev/dws_06_0006.html create mode 100644 docs/dws/dev/dws_06_0007.html create mode 100644 docs/dws/dev/dws_06_0008.html create mode 100644 docs/dws/dev/dws_06_0009.html create mode 100644 docs/dws/dev/dws_06_0010.html create mode 100644 docs/dws/dev/dws_06_0011.html create mode 100644 docs/dws/dev/dws_06_0012.html create mode 100644 docs/dws/dev/dws_06_0013.html create mode 100644 docs/dws/dev/dws_06_0014.html create mode 100644 docs/dws/dev/dws_06_0015.html create mode 100644 docs/dws/dev/dws_06_0016.html create mode 100644 docs/dws/dev/dws_06_0017.html create mode 100644 docs/dws/dev/dws_06_0018.html create mode 100644 docs/dws/dev/dws_06_0019.html create mode 100644 docs/dws/dev/dws_06_0020.html create mode 100644 docs/dws/dev/dws_06_0021.html create mode 100644 docs/dws/dev/dws_06_0022.html create mode 100644 docs/dws/dev/dws_06_0023.html create mode 100644 docs/dws/dev/dws_06_0024.html create mode 100644 docs/dws/dev/dws_06_0025.html create mode 100644 docs/dws/dev/dws_06_0026.html create mode 100644 docs/dws/dev/dws_06_0027.html create mode 100644 docs/dws/dev/dws_06_0028.html create mode 100644 docs/dws/dev/dws_06_0029.html create mode 100644 docs/dws/dev/dws_06_0030.html create mode 100644 docs/dws/dev/dws_06_0031.html create mode 100644 docs/dws/dev/dws_06_0032.html create mode 100644 docs/dws/dev/dws_06_0033.html create mode 100644 docs/dws/dev/dws_06_0034.html create mode 100644 docs/dws/dev/dws_06_0035.html create mode 100644 docs/dws/dev/dws_06_0036.html create mode 100644 docs/dws/dev/dws_06_0037.html create mode 100644 docs/dws/dev/dws_06_0038.html create mode 100644 docs/dws/dev/dws_06_0039.html create mode 100644 docs/dws/dev/dws_06_0040.html create mode 100644 docs/dws/dev/dws_06_0041.html create mode 100644 docs/dws/dev/dws_06_0042.html create mode 100644 docs/dws/dev/dws_06_0043.html create mode 100644 docs/dws/dev/dws_06_0044.html create mode 100644 docs/dws/dev/dws_06_0045.html create mode 100644 docs/dws/dev/dws_06_0046.html create mode 100644 docs/dws/dev/dws_06_0047.html create mode 100644 docs/dws/dev/dws_06_0048.html create mode 100644 docs/dws/dev/dws_06_0049.html create mode 100644 docs/dws/dev/dws_06_0050.html create mode 100644 docs/dws/dev/dws_06_0051.html create mode 100644 docs/dws/dev/dws_06_0052.html create mode 100644 docs/dws/dev/dws_06_0053.html create mode 100644 docs/dws/dev/dws_06_0054.html create mode 100644 docs/dws/dev/dws_06_0055.html create mode 100644 docs/dws/dev/dws_06_0056.html create mode 100644 docs/dws/dev/dws_06_0057.html create mode 100644 docs/dws/dev/dws_06_0058.html create mode 100644 docs/dws/dev/dws_06_0059.html create mode 100644 docs/dws/dev/dws_06_0060.html create mode 100644 docs/dws/dev/dws_06_0061.html create mode 100644 docs/dws/dev/dws_06_0062.html create mode 100644 docs/dws/dev/dws_06_0063.html create mode 100644 docs/dws/dev/dws_06_0064.html create mode 100644 docs/dws/dev/dws_06_0065.html create mode 100644 docs/dws/dev/dws_06_0066.html create mode 100644 docs/dws/dev/dws_06_0067.html create mode 100644 docs/dws/dev/dws_06_0068.html create mode 100644 docs/dws/dev/dws_06_0069.html create mode 100644 docs/dws/dev/dws_06_0070.html create mode 100644 docs/dws/dev/dws_06_0071.html create mode 100644 docs/dws/dev/dws_06_0072.html create mode 100644 docs/dws/dev/dws_06_0073.html create mode 100644 docs/dws/dev/dws_06_0074.html create mode 100644 docs/dws/dev/dws_06_0075.html create mode 100644 docs/dws/dev/dws_06_0076.html create mode 100644 docs/dws/dev/dws_06_0077.html create mode 100644 docs/dws/dev/dws_06_0078.html create mode 100644 docs/dws/dev/dws_06_0079.html create mode 100644 docs/dws/dev/dws_06_0080.html create mode 100644 docs/dws/dev/dws_06_0081.html create mode 100644 docs/dws/dev/dws_06_0082.html create mode 100644 docs/dws/dev/dws_06_0083.html create mode 100644 docs/dws/dev/dws_06_0084.html create mode 100644 docs/dws/dev/dws_06_0085.html create mode 100644 docs/dws/dev/dws_06_0086.html create mode 100644 docs/dws/dev/dws_06_0087.html create mode 100644 docs/dws/dev/dws_06_0088.html create mode 100644 docs/dws/dev/dws_06_0089.html create mode 100644 docs/dws/dev/dws_06_0090.html create mode 100644 docs/dws/dev/dws_06_0091.html create mode 100644 docs/dws/dev/dws_06_0092.html create mode 100644 docs/dws/dev/dws_06_0093.html create mode 100644 docs/dws/dev/dws_06_0094.html create mode 100644 docs/dws/dev/dws_06_0095.html create mode 100644 docs/dws/dev/dws_06_0096.html create mode 100644 docs/dws/dev/dws_06_0097.html create mode 100644 docs/dws/dev/dws_06_0098.html create mode 100644 docs/dws/dev/dws_06_0099.html create mode 100644 docs/dws/dev/dws_06_0100.html create mode 100644 docs/dws/dev/dws_06_0101.html create mode 100644 docs/dws/dev/dws_06_0102.html create mode 100644 docs/dws/dev/dws_06_0103.html create mode 100644 docs/dws/dev/dws_06_0104.html create mode 100644 docs/dws/dev/dws_06_0105.html create mode 100644 docs/dws/dev/dws_06_0106.html create mode 100644 docs/dws/dev/dws_06_0107.html create mode 100644 docs/dws/dev/dws_06_0108.html create mode 100644 docs/dws/dev/dws_06_0109.html create mode 100644 docs/dws/dev/dws_06_0110.html create mode 100644 docs/dws/dev/dws_06_0111.html create mode 100644 docs/dws/dev/dws_06_0112.html create mode 100644 docs/dws/dev/dws_06_0113.html create mode 100644 docs/dws/dev/dws_06_0114.html create mode 100644 docs/dws/dev/dws_06_0115.html create mode 100644 docs/dws/dev/dws_06_0116.html create mode 100644 docs/dws/dev/dws_06_0117.html create mode 100644 docs/dws/dev/dws_06_0118.html create mode 100644 docs/dws/dev/dws_06_0119.html create mode 100644 docs/dws/dev/dws_06_0120.html create mode 100644 docs/dws/dev/dws_06_0123.html create mode 100644 docs/dws/dev/dws_06_0124.html create mode 100644 docs/dws/dev/dws_06_0126.html create mode 100644 docs/dws/dev/dws_06_0127.html create mode 100644 docs/dws/dev/dws_06_0128.html create mode 100644 docs/dws/dev/dws_06_0129.html create mode 100644 docs/dws/dev/dws_06_0132.html create mode 100644 docs/dws/dev/dws_06_0133.html create mode 100644 docs/dws/dev/dws_06_0134.html create mode 100644 docs/dws/dev/dws_06_0135.html create mode 100644 docs/dws/dev/dws_06_0136.html create mode 100644 docs/dws/dev/dws_06_0137.html create mode 100644 docs/dws/dev/dws_06_0138.html create mode 100644 docs/dws/dev/dws_06_0139.html create mode 100644 docs/dws/dev/dws_06_0140.html create mode 100644 docs/dws/dev/dws_06_0141.html create mode 100644 docs/dws/dev/dws_06_0142.html create mode 100644 docs/dws/dev/dws_06_0143.html create mode 100644 docs/dws/dev/dws_06_0145.html create mode 100644 docs/dws/dev/dws_06_0146.html create mode 100644 docs/dws/dev/dws_06_0147.html create mode 100644 docs/dws/dev/dws_06_0148.html create mode 100644 docs/dws/dev/dws_06_0149.html create mode 100644 docs/dws/dev/dws_06_0150.html create mode 100644 docs/dws/dev/dws_06_0151.html create mode 100644 docs/dws/dev/dws_06_0152.html create mode 100644 docs/dws/dev/dws_06_0153.html create mode 100644 docs/dws/dev/dws_06_0154.html create mode 100644 docs/dws/dev/dws_06_0155.html create mode 100644 docs/dws/dev/dws_06_0156.html create mode 100644 docs/dws/dev/dws_06_0159.html create mode 100644 docs/dws/dev/dws_06_0160.html create mode 100644 docs/dws/dev/dws_06_0161.html create mode 100644 docs/dws/dev/dws_06_0163.html create mode 100644 docs/dws/dev/dws_06_0164.html create mode 100644 docs/dws/dev/dws_06_0165.html create mode 100644 docs/dws/dev/dws_06_0168.html create mode 100644 docs/dws/dev/dws_06_0169.html create mode 100644 docs/dws/dev/dws_06_0170.html create mode 100644 docs/dws/dev/dws_06_0171.html create mode 100644 docs/dws/dev/dws_06_0172.html create mode 100644 docs/dws/dev/dws_06_0173.html create mode 100644 docs/dws/dev/dws_06_0174.html create mode 100644 docs/dws/dev/dws_06_0175.html create mode 100644 docs/dws/dev/dws_06_0176.html create mode 100644 docs/dws/dev/dws_06_0177.html create mode 100644 docs/dws/dev/dws_06_0178.html create mode 100644 docs/dws/dev/dws_06_0179.html create mode 100644 docs/dws/dev/dws_06_0182.html create mode 100644 docs/dws/dev/dws_06_0183.html create mode 100644 docs/dws/dev/dws_06_0184.html create mode 100644 docs/dws/dev/dws_06_0185.html create mode 100644 docs/dws/dev/dws_06_0186.html create mode 100644 docs/dws/dev/dws_06_0187.html create mode 100644 docs/dws/dev/dws_06_0188.html create mode 100644 docs/dws/dev/dws_06_0189.html create mode 100644 docs/dws/dev/dws_06_0192.html create mode 100644 docs/dws/dev/dws_06_0193.html create mode 100644 docs/dws/dev/dws_06_0194.html create mode 100644 docs/dws/dev/dws_06_0195.html create mode 100644 docs/dws/dev/dws_06_0198.html create mode 100644 docs/dws/dev/dws_06_0199.html create mode 100644 docs/dws/dev/dws_06_0200.html create mode 100644 docs/dws/dev/dws_06_0201.html create mode 100644 docs/dws/dev/dws_06_0202.html create mode 100644 docs/dws/dev/dws_06_0203.html create mode 100644 docs/dws/dev/dws_06_0204.html create mode 100644 docs/dws/dev/dws_06_0205.html create mode 100644 docs/dws/dev/dws_06_0206.html create mode 100644 docs/dws/dev/dws_06_0207.html create mode 100644 docs/dws/dev/dws_06_0208.html create mode 100644 docs/dws/dev/dws_06_0210.html create mode 100644 docs/dws/dev/dws_06_0211.html create mode 100644 docs/dws/dev/dws_06_0212.html create mode 100644 docs/dws/dev/dws_06_0213.html create mode 100644 docs/dws/dev/dws_06_0214.html create mode 100644 docs/dws/dev/dws_06_0215.html create mode 100644 docs/dws/dev/dws_06_0216.html create mode 100644 docs/dws/dev/dws_06_0217.html create mode 100644 docs/dws/dev/dws_06_0218.html create mode 100644 docs/dws/dev/dws_06_0219.html create mode 100644 docs/dws/dev/dws_06_0220.html create mode 100644 docs/dws/dev/dws_06_0221.html create mode 100644 docs/dws/dev/dws_06_0222.html create mode 100644 docs/dws/dev/dws_06_0223.html create mode 100644 docs/dws/dev/dws_06_0224.html create mode 100644 docs/dws/dev/dws_06_0225.html create mode 100644 docs/dws/dev/dws_06_0226.html create mode 100644 docs/dws/dev/dws_06_0227.html create mode 100644 docs/dws/dev/dws_06_0228.html create mode 100644 docs/dws/dev/dws_06_0229.html create mode 100644 docs/dws/dev/dws_06_0230.html create mode 100644 docs/dws/dev/dws_06_0231.html create mode 100644 docs/dws/dev/dws_06_0232.html create mode 100644 docs/dws/dev/dws_06_0233.html create mode 100644 docs/dws/dev/dws_06_0234.html create mode 100644 docs/dws/dev/dws_06_0235.html create mode 100644 docs/dws/dev/dws_06_0236.html create mode 100644 docs/dws/dev/dws_06_0237.html create mode 100644 docs/dws/dev/dws_06_0238.html create mode 100644 docs/dws/dev/dws_06_0239.html create mode 100644 docs/dws/dev/dws_06_0240.html create mode 100644 docs/dws/dev/dws_06_0241.html create mode 100644 docs/dws/dev/dws_06_0242.html create mode 100644 docs/dws/dev/dws_06_0243.html create mode 100644 docs/dws/dev/dws_06_0244.html create mode 100644 docs/dws/dev/dws_06_0245.html create mode 100644 docs/dws/dev/dws_06_0246.html create mode 100644 docs/dws/dev/dws_06_0247.html create mode 100644 docs/dws/dev/dws_06_0248.html create mode 100644 docs/dws/dev/dws_06_0249.html create mode 100644 docs/dws/dev/dws_06_0250.html create mode 100644 docs/dws/dev/dws_06_0251.html create mode 100644 docs/dws/dev/dws_06_0252.html create mode 100644 docs/dws/dev/dws_06_0253.html create mode 100644 docs/dws/dev/dws_06_0254.html create mode 100644 docs/dws/dev/dws_06_0255.html create mode 100644 docs/dws/dev/dws_06_0256.html create mode 100644 docs/dws/dev/dws_06_0257.html create mode 100644 docs/dws/dev/dws_06_0258.html create mode 100644 docs/dws/dev/dws_06_0259.html create mode 100644 docs/dws/dev/dws_06_0260.html create mode 100644 docs/dws/dev/dws_06_0262.html create mode 100644 docs/dws/dev/dws_06_0263.html create mode 100644 docs/dws/dev/dws_06_0264.html create mode 100644 docs/dws/dev/dws_06_0265.html create mode 100644 docs/dws/dev/dws_06_0266.html create mode 100644 docs/dws/dev/dws_06_0267.html create mode 100644 docs/dws/dev/dws_06_0268.html create mode 100644 docs/dws/dev/dws_06_0269.html create mode 100644 docs/dws/dev/dws_06_0270.html create mode 100644 docs/dws/dev/dws_06_0271.html create mode 100644 docs/dws/dev/dws_06_0272.html create mode 100644 docs/dws/dev/dws_06_0273.html create mode 100644 docs/dws/dev/dws_06_0274.html create mode 100644 docs/dws/dev/dws_06_0275.html create mode 100644 docs/dws/dev/dws_06_0276.html create mode 100644 docs/dws/dev/dws_06_0277.html create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655278.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655292.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655300.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655330.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655346.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655364.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655366.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655372.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655374.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655390.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655392.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655398.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655400.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655422.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098655436.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098671216.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098671232.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098671234.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098671236.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098671238.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815108.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815118.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815122.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815148.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815162.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815180.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815188.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815194.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815204.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815208.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815218.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815222.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815232.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815236.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098815256.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098831044.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098831058.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098831060.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098831064.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975108.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975112.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975116.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975124.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975130.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975134.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975146.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975154.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975158.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975164.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975174.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975180.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975190.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975206.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975208.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975214.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975228.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098975234.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098991040.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001098991054.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135088.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135094.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135098.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135104.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135110.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135134.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135152.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135168.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135172.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135180.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135194.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135196.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135202.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135208.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099135218.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099151022.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099151052.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099282726.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001099480652.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001099602632.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001100340752.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495111.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495125.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495133.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495159.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495161.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495175.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495193.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495195.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495203.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495209.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495219.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495221.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495227.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495247.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495253.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145495261.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145511041.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145511043.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145511057.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695045.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695049.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695053.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695065.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695071.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695083.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695089.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695097.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695103.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695131.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695139.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695143.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695149.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695169.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695171.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695177.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695187.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145695193.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145710975.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145710989.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145710991.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145710993.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145710995.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814971.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814977.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814981.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814985.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814991.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145814997.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815011.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815017.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815021.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815025.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815033.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815039.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815045.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815055.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815059.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815069.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815079.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815093.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815101.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145815117.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145830887.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145830893.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145830907.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145830909.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895087.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895093.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895095.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895101.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895125.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895131.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895139.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895141.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895151.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895161.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895173.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895175.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895187.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895199.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145895219.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145911019.jpg create mode 100644 docs/dws/dev/figure/en-us_image_0000001145911035.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145911037.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001145911043.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001146480609.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001146820617.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001147735331.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001217970670.png create mode 100644 docs/dws/dev/figure/en-us_image_0000001248721592.png create mode 100644 docs/dws/dev/public_sys-resources/ExpandCollapse.js create mode 100644 docs/dws/dev/public_sys-resources/caution_3.0-en-us.png create mode 100644 docs/dws/dev/public_sys-resources/commonltr.css create mode 100644 docs/dws/dev/public_sys-resources/commonltr_print.css create mode 100644 docs/dws/dev/public_sys-resources/commonrtl.css create mode 100644 docs/dws/dev/public_sys-resources/danger_3.0-en-us.png create mode 100644 docs/dws/dev/public_sys-resources/delta.gif create mode 100644 docs/dws/dev/public_sys-resources/deltaend.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-arrowdn.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-arrowrt.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-caution.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-danger.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-huawei.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-note.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-notice.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-tip.gif create mode 100644 docs/dws/dev/public_sys-resources/icon-warning.gif create mode 100644 docs/dws/dev/public_sys-resources/note_3.0-en-us.png create mode 100644 docs/dws/dev/public_sys-resources/notice_3.0-en-us.png create mode 100644 docs/dws/dev/public_sys-resources/popup.js create mode 100644 docs/dws/dev/public_sys-resources/pygments.css create mode 100644 docs/dws/dev/public_sys-resources/warning_3.0-en-us.png diff --git a/docs/dws/dev/ALL_META.TXT.json b/docs/dws/dev/ALL_META.TXT.json new file mode 100644 index 00000000..b69d9060 --- /dev/null +++ b/docs/dws/dev/ALL_META.TXT.json @@ -0,0 +1,9452 @@ +[ + { + "uri":"dws_04_1000.html", + "product_code":"dws", + "code":"1", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Developer Guide", + "title":"Developer Guide", + "githuburl":"" + }, + { + "uri":"dws_04_0001.html", + "product_code":"dws", + "code":"2", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Welcome", + "title":"Welcome", + "githuburl":"" + }, + { + "uri":"dws_04_0002.html", + "product_code":"dws", + "code":"3", + "des":"This document is intended for database designers, application developers, and database administrators, and provides information required for designing, building, querying", + "doc_type":"devg", + "kw":"Target Readers,Welcome,Developer Guide", + "title":"Target Readers", + "githuburl":"" + }, + { + "uri":"dws_04_0004.html", + "product_code":"dws", + "code":"4", + "des":"If you are a new GaussDB(DWS) user, you are advised to read the following contents first:Sections describing the features, functions, and application scenarios of GaussDB", + "doc_type":"devg", + "kw":"Reading Guide,Welcome,Developer Guide", + "title":"Reading Guide", + "githuburl":"" + }, + { + "uri":"dws_04_0005.html", + "product_code":"dws", + "code":"5", + "des":"SQL examples in this manual are developed based on the TPC-DS model. Before you execute the examples, install the TPC-DS benchmark by following the instructions on the of", + "doc_type":"devg", + "kw":"Conventions,Welcome,Developer Guide", + "title":"Conventions", + "githuburl":"" + }, + { + "uri":"dws_04_0006.html", + "product_code":"dws", + "code":"6", + "des":"Complete the following tasks before you perform operations described in this document:Create a GaussDB(DWS) cluster.Install an SQL client.Connect the SQL client to the de", + "doc_type":"devg", + "kw":"Prerequisites,Welcome,Developer Guide", + "title":"Prerequisites", + "githuburl":"" + }, + { + "uri":"dws_04_0007.html", + "product_code":"dws", + "code":"7", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"System Overview", + "title":"System Overview", + "githuburl":"" + }, + { + "uri":"dws_04_0011.html", + "product_code":"dws", + "code":"8", + "des":"GaussDB(DWS) manages cluster transactions, the basis of HA and failovers. This ensures speedy fault recovery, guarantees the Atomicity, Consistency, Isolation, Durability", + "doc_type":"devg", + "kw":"Highly Reliable Transaction Processing,System Overview,Developer Guide", + "title":"Highly Reliable Transaction Processing", + "githuburl":"" + }, + { + "uri":"dws_04_0012.html", + "product_code":"dws", + "code":"9", + "des":"The following GaussDB(DWS) features help achieve high query performance.GaussDB(DWS) is an MPP system with the shared-nothing architecture. It consists of multiple indepe", + "doc_type":"devg", + "kw":"High Query Performance,System Overview,Developer Guide", + "title":"High Query Performance", + "githuburl":"" + }, + { + "uri":"dws_04_0015.html", + "product_code":"dws", + "code":"10", + "des":"A database manages data objects and is isolated from other databases. While creating a database, you can specify a tablespace. If you do not specify it, database objects ", + "doc_type":"devg", + "kw":"Related Concepts,System Overview,Developer Guide", + "title":"Related Concepts", + "githuburl":"" + }, + { + "uri":"dws_04_0985.html", + "product_code":"dws", + "code":"11", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Data Migration", + "title":"Data Migration", + "githuburl":"" + }, + { + "uri":"dws_04_0180.html", + "product_code":"dws", + "code":"12", + "des":"GaussDB(DWS) provides flexible methods for importing data. You can import data from different sources to GaussDB(DWS). The features of each method are listed in Table 1. ", + "doc_type":"devg", + "kw":"Data Migration to GaussDB(DWS),Data Migration,Developer Guide", + "title":"Data Migration to GaussDB(DWS)", + "githuburl":"" + }, + { + "uri":"dws_04_0179.html", + "product_code":"dws", + "code":"13", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Data Import", + "title":"Data Import", + "githuburl":"" + }, + { + "uri":"dws_04_0181.html", + "product_code":"dws", + "code":"14", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Importing Data from OBS in Parallel", + "title":"Importing Data from OBS in Parallel", + "githuburl":"" + }, + { + "uri":"dws_04_0182.html", + "product_code":"dws", + "code":"15", + "des":"The object storage service (OBS) is an object-based cloud storage service, featuring data storage of high security, proven reliability, and cost-effectiveness. OBS provid", + "doc_type":"devg", + "kw":"About Parallel Data Import from OBS,Importing Data from OBS in Parallel,Developer Guide", + "title":"About Parallel Data Import from OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0154.html", + "product_code":"dws", + "code":"16", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Importing CSV/TXT Data from the OBS", + "title":"Importing CSV/TXT Data from the OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0183.html", + "product_code":"dws", + "code":"17", + "des":"In this example, OBS data is imported to GaussDB(DWS) databases. When users who have registered with the cloud platform access OBS using clients, call APIs, or SDKs, acce", + "doc_type":"devg", + "kw":"Creating Access Keys (AK and SK),Importing CSV/TXT Data from the OBS,Developer Guide", + "title":"Creating Access Keys (AK and SK)", + "githuburl":"" + }, + { + "uri":"dws_04_0184.html", + "product_code":"dws", + "code":"18", + "des":"Before importing data from OBS to a cluster, prepare source data files and upload these files to OBS. If the data files have been stored on OBS, you only need to complete", + "doc_type":"devg", + "kw":"Uploading Data to OBS,Importing CSV/TXT Data from the OBS,Developer Guide", + "title":"Uploading Data to OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0185.html", + "product_code":"dws", + "code":"19", + "des":"format: format of the source data file in the foreign table. OBS foreign tables support CSV and TEXT formats. The default value is TEXT.header: Whether the data file cont", + "doc_type":"devg", + "kw":"Creating an OBS Foreign Table,Importing CSV/TXT Data from the OBS,Developer Guide", + "title":"Creating an OBS Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0186.html", + "product_code":"dws", + "code":"20", + "des":"Before importing data, you are advised to optimize your design and deployment based on the following excellent practices, helping maximize system resource utilization and", + "doc_type":"devg", + "kw":"Importing Data,Importing CSV/TXT Data from the OBS,Developer Guide", + "title":"Importing Data", + "githuburl":"" + }, + { + "uri":"dws_04_0187.html", + "product_code":"dws", + "code":"21", + "des":"Handle errors that occurred during data import.Errors that occur when data is imported are divided into data format errors and non-data format errors.Data format errorWhe", + "doc_type":"devg", + "kw":"Handling Import Errors,Importing CSV/TXT Data from the OBS,Developer Guide", + "title":"Handling Import Errors", + "githuburl":"" + }, + { + "uri":"dws_04_0155.html", + "product_code":"dws", + "code":"22", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Importing ORC/CarbonData Data from OBS", + "title":"Importing ORC/CarbonData Data from OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0243.html", + "product_code":"dws", + "code":"23", + "des":"Before you use the SQL on OBS feature to query OBS data:You have stored the ORC data on OBS.For example, the ORC table has been created when you use the Hive or Spark com", + "doc_type":"devg", + "kw":"Preparing Data on OBS,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Preparing Data on OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0244.html", + "product_code":"dws", + "code":"24", + "des":"This section describes how to create a foreign server that is used to define the information about OBS servers and is invoked by foreign tables. For details about the syn", + "doc_type":"devg", + "kw":"Creating a Foreign Server,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Creating a Foreign Server", + "githuburl":"" + }, + { + "uri":"dws_04_0245.html", + "product_code":"dws", + "code":"25", + "des":"After performing steps in Creating a Foreign Server, create an OBS foreign table in the GaussDB(DWS) database to access the data stored in OBS. An OBS foreign table is re", + "doc_type":"devg", + "kw":"Creating a Foreign Table,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Creating a Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0246.html", + "product_code":"dws", + "code":"26", + "des":"If the data amount is small, you can directly run SELECT to query the foreign table and view the data on OBS.If the query result is the same as the data in Original Data,", + "doc_type":"devg", + "kw":"Querying Data on OBS Through Foreign Tables,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Querying Data on OBS Through Foreign Tables", + "githuburl":"" + }, + { + "uri":"dws_04_0247.html", + "product_code":"dws", + "code":"27", + "des":"After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quo", + "doc_type":"devg", + "kw":"Deleting Resources,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Deleting Resources", + "githuburl":"" + }, + { + "uri":"dws_04_0156.html", + "product_code":"dws", + "code":"28", + "des":"In the big data field, the mainstream file format is ORC, which is supported by GaussDB(DWS). You can use Hive to export data to an ORC file and use a read-only foreign t", + "doc_type":"devg", + "kw":"Supported Data Types,Importing ORC/CarbonData Data from OBS,Developer Guide", + "title":"Supported Data Types", + "githuburl":"" + }, + { + "uri":"dws_04_0189.html", + "product_code":"dws", + "code":"29", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Using GDS to Import Data from a Remote Server", + "title":"Using GDS to Import Data from a Remote Server", + "githuburl":"" + }, + { + "uri":"dws_04_0190.html", + "product_code":"dws", + "code":"30", + "des":"INSERT and COPY statements are serially executed to import a small volume of data. To import a large volume of data to GaussDB(DWS), you can use GDS to import data in par", + "doc_type":"devg", + "kw":"Importing Data In Parallel Using GDS,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Importing Data In Parallel Using GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0192.html", + "product_code":"dws", + "code":"31", + "des":"Generally, the data to be imported has been uploaded to the data server. In this case, you only need to check the communication between the data server and GaussDB(DWS), ", + "doc_type":"devg", + "kw":"Preparing Source Data,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Preparing Source Data", + "githuburl":"" + }, + { + "uri":"dws_04_0193.html", + "product_code":"dws", + "code":"32", + "des":"GaussDB(DWS) uses GDS to allocate the source data for parallel data import. Deploy GDS on the data server.If a large volume of data is stored on multiple data servers, in", + "doc_type":"devg", + "kw":"Installing, Configuring, and Starting GDS,Using GDS to Import Data from a Remote Server,Developer Gu", + "title":"Installing, Configuring, and Starting GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0194.html", + "product_code":"dws", + "code":"33", + "des":"The source data information and GDS access information are configured in a foreign table. Then, GaussDB(DWS) can import data from a data server to a database table based ", + "doc_type":"devg", + "kw":"Creating a GDS Foreign Table,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Creating a GDS Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0195.html", + "product_code":"dws", + "code":"34", + "des":"This section describes how to create tables in GaussDB(DWS) and import data to the tables.Before importing all the data from a table containing over 10 million records, y", + "doc_type":"devg", + "kw":"Importing Data,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Importing Data", + "githuburl":"" + }, + { + "uri":"dws_04_0196.html", + "product_code":"dws", + "code":"35", + "des":"Handle errors that occurred during data import.Errors that occur when data is imported are divided into data format errors and non-data format errors.Data format errorWhe", + "doc_type":"devg", + "kw":"Handling Import Errors,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Handling Import Errors", + "githuburl":"" + }, + { + "uri":"dws_04_0197.html", + "product_code":"dws", + "code":"36", + "des":"Stop GDS after data is imported successfully.If GDS is started using the gds command, perform the following operations to stop GDS:Query the GDS process ID:ps -ef|grep gd", + "doc_type":"devg", + "kw":"Stopping GDS,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Stopping GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0198.html", + "product_code":"dws", + "code":"37", + "des":"The data servers and the cluster reside on the same intranet. The IP addresses are 192.168.0.90 and 192.168.0.91. Source data files are in CSV format.Create the target ta", + "doc_type":"devg", + "kw":"Example of Importing Data Using GDS,Using GDS to Import Data from a Remote Server,Developer Guide", + "title":"Example of Importing Data Using GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0210.html", + "product_code":"dws", + "code":"38", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Importing Data from MRS to a Cluster", + "title":"Importing Data from MRS to a Cluster", + "githuburl":"" + }, + { + "uri":"dws_04_0066.html", + "product_code":"dws", + "code":"39", + "des":"MRS is a big data cluster running based on the open-source Hadoop ecosystem. It provides the industry's latest cutting-edge storage and analytical capabilities of massive", + "doc_type":"devg", + "kw":"Overview,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_04_0212.html", + "product_code":"dws", + "code":"40", + "des":"Before importing data from MRS to a GaussDB(DWS) cluster, you must have:Created an MRS cluster.Created the Hive/Spark ORC table in the MRS cluster and stored the table da", + "doc_type":"devg", + "kw":"Preparing Data in an MRS Cluster,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Preparing Data in an MRS Cluster", + "githuburl":"" + }, + { + "uri":"dws_04_0213.html", + "product_code":"dws", + "code":"41", + "des":"In the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS) for creating a foreign table, you need to specify a foreign server associated with the MRS data source connectio", + "doc_type":"devg", + "kw":"Manually Creating a Foreign Server,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Manually Creating a Foreign Server", + "githuburl":"" + }, + { + "uri":"dws_04_0214.html", + "product_code":"dws", + "code":"42", + "des":"This section describes how to create a Hadoop foreign table in the GaussDB(DWS) database to access the Hadoop structured data stored on MRS HDFS. A Hadoop foreign table i", + "doc_type":"devg", + "kw":"Creating a Foreign Table,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Creating a Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0215.html", + "product_code":"dws", + "code":"43", + "des":"If the data amount is small, you can directly run SELECT to query the foreign table and view the data in the MRS data source.If the query result is the same as the data i", + "doc_type":"devg", + "kw":"Importing Data,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Importing Data", + "githuburl":"" + }, + { + "uri":"dws_04_0216.html", + "product_code":"dws", + "code":"44", + "des":"After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quo", + "doc_type":"devg", + "kw":"Deleting Resources,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Deleting Resources", + "githuburl":"" + }, + { + "uri":"dws_04_0217.html", + "product_code":"dws", + "code":"45", + "des":"The following error information indicates that GaussDB(DWS) is to read an ORC data file but the actual file is in text format. Therefore, create a table of the Hive ORC t", + "doc_type":"devg", + "kw":"Error Handling,Importing Data from MRS to a Cluster,Developer Guide", + "title":"Error Handling", + "githuburl":"" + }, + { + "uri":"dws_04_0949.html", + "product_code":"dws", + "code":"46", + "des":"You can create foreign tables to perform associated queries and import data between clusters.Import data from one GaussDB(DWS) cluster to another.Perform associated queri", + "doc_type":"devg", + "kw":"Importing Data from One GaussDB(DWS) Cluster to Another,Data Import,Developer Guide", + "title":"Importing Data from One GaussDB(DWS) Cluster to Another", + "githuburl":"" + }, + { + "uri":"dws_04_0208.html", + "product_code":"dws", + "code":"47", + "des":"The gsql tool of GaussDB(DWS) provides the \\copy meta-command to import data.For details about the \\copy command, see Table 1.tableSpecifies the name (possibly schema-qua", + "doc_type":"devg", + "kw":"Using the gsql Meta-Command \\COPY to Import Data,Data Import,Developer Guide", + "title":"Using the gsql Meta-Command \\COPY to Import Data", + "githuburl":"" + }, + { + "uri":"dws_04_0203.html", + "product_code":"dws", + "code":"48", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Running the COPY FROM STDIN Statement to Import Data", + "title":"Running the COPY FROM STDIN Statement to Import Data", + "githuburl":"" + }, + { + "uri":"dws_04_0204.html", + "product_code":"dws", + "code":"49", + "des":"This method is applicable to low-concurrency scenarios where a small volume of data is to be imported.Use either of the following methods to write data to GaussDB(DWS) us", + "doc_type":"devg", + "kw":"Data Import Using COPY FROM STDIN,Running the COPY FROM STDIN Statement to Import Data,Developer Gui", + "title":"Data Import Using COPY FROM STDIN", + "githuburl":"" + }, + { + "uri":"dws_04_0205.html", + "product_code":"dws", + "code":"50", + "des":"CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.The CopyManager class is in the or", + "doc_type":"devg", + "kw":"Introduction to the CopyManager Class,Running the COPY FROM STDIN Statement to Import Data,Developer", + "title":"Introduction to the CopyManager Class", + "githuburl":"" + }, + { + "uri":"dws_04_0206.html", + "product_code":"dws", + "code":"51", + "des":"When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or ", + "doc_type":"devg", + "kw":"Example: Importing and Exporting Data Through Local Files,Running the COPY FROM STDIN Statement to I", + "title":"Example: Importing and Exporting Data Through Local Files", + "githuburl":"" + }, + { + "uri":"dws_04_0207.html", + "product_code":"dws", + "code":"52", + "des":"The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).", + "doc_type":"devg", + "kw":"Example: Migrating Data from MySQL to GaussDB(DWS),Running the COPY FROM STDIN Statement to Import D", + "title":"Example: Migrating Data from MySQL to GaussDB(DWS)", + "githuburl":"" + }, + { + "uri":"dws_04_0986.html", + "product_code":"dws", + "code":"53", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Full Database Migration", + "title":"Full Database Migration", + "githuburl":"" + }, + { + "uri":"dws_04_0219.html", + "product_code":"dws", + "code":"54", + "des":"You can use CDM to migrate data from other data sources (for example, MySQL) to the databases in clusters on GaussDB(DWS).For details about scenarios where CDM is used to", + "doc_type":"devg", + "kw":"Using CDM to Migrate Data to GaussDB(DWS),Full Database Migration,Developer Guide", + "title":"Using CDM to Migrate Data to GaussDB(DWS)", + "githuburl":"" + }, + { + "uri":"dws_01_0127.html", + "product_code":"dws", + "code":"55", + "des":"The DSC is a CLI tool running on the Linux or Windows OS. It is dedicated to providing customers with simple, fast, and reliable application SQL script migration services", + "doc_type":"devg", + "kw":"Using DSC to Migrate SQL Scripts,Full Database Migration,Developer Guide", + "title":"Using DSC to Migrate SQL Scripts", + "githuburl":"" + }, + { + "uri":"dws_04_0987.html", + "product_code":"dws", + "code":"56", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Metadata Migration", + "title":"Metadata Migration", + "githuburl":"" + }, + { + "uri":"dws_04_0269.html", + "product_code":"dws", + "code":"57", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Using gs_dump and gs_dumpall to Export Metadata", + "title":"Using gs_dump and gs_dumpall to Export Metadata", + "githuburl":"" + }, + { + "uri":"dws_04_0270.html", + "product_code":"dws", + "code":"58", + "des":"GaussDB(DWS) provides gs_dump and gs_dumpall to export required database objects and related information. To migrate database information, you can use a tool to import th", + "doc_type":"devg", + "kw":"Overview,Using gs_dump and gs_dumpall to Export Metadata,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_04_0271.html", + "product_code":"dws", + "code":"59", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting a Single Database", + "title":"Exporting a Single Database", + "githuburl":"" + }, + { + "uri":"dws_04_0272.html", + "product_code":"dws", + "code":"60", + "des":"You can use gs_dump to export data and all object definitions of a database from GaussDB(DWS). You can specify the information to be exported as follows:Export full infor", + "doc_type":"devg", + "kw":"Exporting a Database,Exporting a Single Database,Developer Guide", + "title":"Exporting a Database", + "githuburl":"" + }, + { + "uri":"dws_04_0273.html", + "product_code":"dws", + "code":"61", + "des":"You can use gs_dump to export data and all object definitions of a schema from GaussDB(DWS). You can export one or more specified schemas as needed. You can specify the i", + "doc_type":"devg", + "kw":"Exporting a Schema,Exporting a Single Database,Developer Guide", + "title":"Exporting a Schema", + "githuburl":"" + }, + { + "uri":"dws_04_0274.html", + "product_code":"dws", + "code":"62", + "des":"You can use gs_dump to export data and all object definitions of a table-level object from GaussDB(DWS). Views, sequences, and foreign tables are special tables. You can ", + "doc_type":"devg", + "kw":"Exporting a Table,Exporting a Single Database,Developer Guide", + "title":"Exporting a Table", + "githuburl":"" + }, + { + "uri":"dws_04_0275.html", + "product_code":"dws", + "code":"63", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting All Databases", + "title":"Exporting All Databases", + "githuburl":"" + }, + { + "uri":"dws_04_0276.html", + "product_code":"dws", + "code":"64", + "des":"You can use gs_dumpall to export full information of all databases in a cluster from GaussDB(DWS), including information about each database and global objects in the clu", + "doc_type":"devg", + "kw":"Exporting All Databases,Exporting All Databases,Developer Guide", + "title":"Exporting All Databases", + "githuburl":"" + }, + { + "uri":"dws_04_0277.html", + "product_code":"dws", + "code":"65", + "des":"You can use gs_dumpall to export global objects from GaussDB(DWS), including database users, user groups, tablespaces, and attributes (for example, global access permissi", + "doc_type":"devg", + "kw":"Exporting Global Objects,Exporting All Databases,Developer Guide", + "title":"Exporting Global Objects", + "githuburl":"" + }, + { + "uri":"dws_04_0278.html", + "product_code":"dws", + "code":"66", + "des":"gs_dump and gs_dumpall use -U to specify the user that performs the export. If the specified user does not have the required permission, data cannot be exported. In this ", + "doc_type":"devg", + "kw":"Data Export By a User Without Required Permissions,Using gs_dump and gs_dumpall to Export Metadata,D", + "title":"Data Export By a User Without Required Permissions", + "githuburl":"" + }, + { + "uri":"dws_04_0209.html", + "product_code":"dws", + "code":"67", + "des":"gs_restore is an import tool provided by GaussDB(DWS). You can use gs_restore to import the files exported by gs_dump to a database. gs_restore can import the files in .t", + "doc_type":"devg", + "kw":"Using gs_restore to Import Data,Metadata Migration,Developer Guide", + "title":"Using gs_restore to Import Data", + "githuburl":"" + }, + { + "uri":"dws_04_0249.html", + "product_code":"dws", + "code":"68", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Data Export", + "title":"Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0250.html", + "product_code":"dws", + "code":"69", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting Data to OBS", + "title":"Exporting Data to OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0251.html", + "product_code":"dws", + "code":"70", + "des":"GaussDB(DWS) databases allow you to export data in parallel using OBS foreign tables, in which the export mode and the exported data format are specified. Data is exporte", + "doc_type":"devg", + "kw":"Parallel OBS Data Export,Exporting Data to OBS,Developer Guide", + "title":"Parallel OBS Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0157.html", + "product_code":"dws", + "code":"71", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting CSV/TXT Data to OBS", + "title":"Exporting CSV/TXT Data to OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0252.html", + "product_code":"dws", + "code":"72", + "des":"Plan the storage location of exported data in OBS.You need to specify the OBS path (to directory) for storing data that you want to export. The exported data can be saved", + "doc_type":"devg", + "kw":"Planning Data Export,Exporting CSV/TXT Data to OBS,Developer Guide", + "title":"Planning Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0253.html", + "product_code":"dws", + "code":"73", + "des":"To obtain access keys, log in to the management console, click the username in the upper right corner, and select My Credential from the menu. Then choose Access Keys in ", + "doc_type":"devg", + "kw":"Creating an OBS Foreign Table,Exporting CSV/TXT Data to OBS,Developer Guide", + "title":"Creating an OBS Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0254.html", + "product_code":"dws", + "code":"74", + "des":"Example 1: Export data from table product_info_output to a data file through the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM p", + "doc_type":"devg", + "kw":"Exporting Data,Exporting CSV/TXT Data to OBS,Developer Guide", + "title":"Exporting Data", + "githuburl":"" + }, + { + "uri":"dws_04_0255.html", + "product_code":"dws", + "code":"75", + "des":"Create two foreign tables and use them to export tables from a database to two buckets in OBS.OBS and the database are in the same region. The example GaussDB(DWS) table ", + "doc_type":"devg", + "kw":"Examples,Exporting CSV/TXT Data to OBS,Developer Guide", + "title":"Examples", + "githuburl":"" + }, + { + "uri":"dws_04_0256.html", + "product_code":"dws", + "code":"76", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting ORC Data to OBS", + "title":"Exporting ORC Data to OBS", + "githuburl":"" + }, + { + "uri":"dws_04_0258.html", + "product_code":"dws", + "code":"77", + "des":"For details about exporting data to OBS, see Planning Data Export.For details about the data types that can be exported to OBS, see Table 2.For details about HDFS data ex", + "doc_type":"devg", + "kw":"Planning Data Export,Exporting ORC Data to OBS,Developer Guide", + "title":"Planning Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0259.html", + "product_code":"dws", + "code":"78", + "des":"For details about creating a foreign server on OBS, see Creating a Foreign Server.For details about creating a foreign server in HDFS, see Manually Creating a Foreign Ser", + "doc_type":"devg", + "kw":"Creating a Foreign Server,Exporting ORC Data to OBS,Developer Guide", + "title":"Creating a Foreign Server", + "githuburl":"" + }, + { + "uri":"dws_04_0260.html", + "product_code":"dws", + "code":"79", + "des":"After operations in Creating a Foreign Server are complete, create an OBS/HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in OBS/HDFS. Th", + "doc_type":"devg", + "kw":"Creating a Foreign Table,Exporting ORC Data to OBS,Developer Guide", + "title":"Creating a Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0158.html", + "product_code":"dws", + "code":"80", + "des":"Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM pro", + "doc_type":"devg", + "kw":"Exporting Data,Exporting ORC Data to OBS,Developer Guide", + "title":"Exporting Data", + "githuburl":"" + }, + { + "uri":"dws_04_0159.html", + "product_code":"dws", + "code":"81", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Exporting ORC Data to MRS", + "title":"Exporting ORC Data to MRS", + "githuburl":"" + }, + { + "uri":"dws_04_0160.html", + "product_code":"dws", + "code":"82", + "des":"GaussDB(DWS) allows you to export ORC data to MRS using an HDFS foreign table. You can specify the export mode and export data format in the foreign table. Data is export", + "doc_type":"devg", + "kw":"Overview,Exporting ORC Data to MRS,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_04_0161.html", + "product_code":"dws", + "code":"83", + "des":"For details about the data types that can be exported to MRS, see Table 2.For details about HDFS data export or MRS configuration, see the MapReduce Service User Guide.", + "doc_type":"devg", + "kw":"Planning Data Export,Exporting ORC Data to MRS,Developer Guide", + "title":"Planning Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0162.html", + "product_code":"dws", + "code":"84", + "des":"For details about creating a foreign server on HDFS, see Manually Creating a Foreign Server.", + "doc_type":"devg", + "kw":"Creating a Foreign Server,Exporting ORC Data to MRS,Developer Guide", + "title":"Creating a Foreign Server", + "githuburl":"" + }, + { + "uri":"dws_04_0163.html", + "product_code":"dws", + "code":"85", + "des":"After operations in Creating a Foreign Server are complete, create an HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in HDFS. The foreig", + "doc_type":"devg", + "kw":"Creating a Foreign Table,Exporting ORC Data to MRS,Developer Guide", + "title":"Creating a Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0164.html", + "product_code":"dws", + "code":"86", + "des":"Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM pro", + "doc_type":"devg", + "kw":"Exporting Data,Exporting ORC Data to MRS,Developer Guide", + "title":"Exporting Data", + "githuburl":"" + }, + { + "uri":"dws_04_0261.html", + "product_code":"dws", + "code":"87", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Using GDS to Export Data to a Remote Server", + "title":"Using GDS to Export Data to a Remote Server", + "githuburl":"" + }, + { + "uri":"dws_04_0262.html", + "product_code":"dws", + "code":"88", + "des":"In high-concurrency scenarios, you can use GDS to export data from a database to a common file system.In the current GDS version, data can be exported from a database to ", + "doc_type":"devg", + "kw":"Exporting Data In Parallel Using GDS,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Exporting Data In Parallel Using GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0263.html", + "product_code":"dws", + "code":"89", + "des":"Before you use GDS to export data from a cluster, prepare data to be exported and plan the export path.Remote modeIf the following information is displayed, the user and ", + "doc_type":"devg", + "kw":"Planning Data Export,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Planning Data Export", + "githuburl":"" + }, + { + "uri":"dws_04_0264.html", + "product_code":"dws", + "code":"90", + "des":"GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.For details, see Installing, Configuri", + "doc_type":"devg", + "kw":"Installing, Configuring, and Starting GDS,Using GDS to Export Data to a Remote Server,Developer Guid", + "title":"Installing, Configuring, and Starting GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0265.html", + "product_code":"dws", + "code":"91", + "des":"Remote modeSet the location parameter to the URL of the directory that stores the data files.You do not need to specify any file.For example:The IP address of the GDS dat", + "doc_type":"devg", + "kw":"Creating a GDS Foreign Table,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Creating a GDS Foreign Table", + "githuburl":"" + }, + { + "uri":"dws_04_0266.html", + "product_code":"dws", + "code":"92", + "des":"Ensure that the IP addresses and ports of servers where CNs and DNs are deployed can connect to those of the GDS server.Create batch processing scripts to export data in ", + "doc_type":"devg", + "kw":"Exporting Data,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Exporting Data", + "githuburl":"" + }, + { + "uri":"dws_04_0267.html", + "product_code":"dws", + "code":"93", + "des":"GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.For details, see Stopping GDS.", + "doc_type":"devg", + "kw":"Stopping GDS,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Stopping GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0268.html", + "product_code":"dws", + "code":"94", + "des":"The data server and the cluster reside on the same intranet, the IP address of the data server is 192.168.0.90, and data source files are in CSV format. In this scenario,", + "doc_type":"devg", + "kw":"Examples of Exporting Data Using GDS,Using GDS to Export Data to a Remote Server,Developer Guide", + "title":"Examples of Exporting Data Using GDS", + "githuburl":"" + }, + { + "uri":"dws_04_0988.html", + "product_code":"dws", + "code":"95", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Other Operations", + "title":"Other Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0279.html", + "product_code":"dws", + "code":"96", + "des":"GDS supports concurrent import and export. The gds -t parameter is used to set the size of the thread pool and control the maximum number of concurrent working threads. B", + "doc_type":"devg", + "kw":"GDS Pipe FAQs,Other Operations,Developer Guide", + "title":"GDS Pipe FAQs", + "githuburl":"" + }, + { + "uri":"dws_04_0228.html", + "product_code":"dws", + "code":"97", + "des":"Data skew causes the query performance to deteriorate. Before importing all the data from a table consisting of over 10 million records, you are advised to import some of", + "doc_type":"devg", + "kw":"Checking for Data Skew,Other Operations,Developer Guide", + "title":"Checking for Data Skew", + "githuburl":"" + }, + { + "uri":"dws_04_0042.html", + "product_code":"dws", + "code":"98", + "des":"GaussDB(DWS) is compatible with Oracle, Teradata and MySQL syntax, of which the syntax behavior is different.", + "doc_type":"devg", + "kw":"Syntax Compatibility Differences Among Oracle, Teradata, and MySQL,Developer Guide,Developer Guide", + "title":"Syntax Compatibility Differences Among Oracle, Teradata, and MySQL", + "githuburl":"" + }, + { + "uri":"dws_04_0043.html", + "product_code":"dws", + "code":"99", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Database Security Management", + "title":"Database Security Management", + "githuburl":"" + }, + { + "uri":"dws_04_0053.html", + "product_code":"dws", + "code":"100", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Managing Users and Their Permissions", + "title":"Managing Users and Their Permissions", + "githuburl":"" + }, + { + "uri":"dws_04_0054.html", + "product_code":"dws", + "code":"101", + "des":"A user who creates an object is the owner of this object. By default, Separation of Permissions is disabled after cluster installation. A database system administrator ha", + "doc_type":"devg", + "kw":"Default Permission Mechanism,Managing Users and Their Permissions,Developer Guide", + "title":"Default Permission Mechanism", + "githuburl":"" + }, + { + "uri":"dws_04_0055.html", + "product_code":"dws", + "code":"102", + "des":"A system administrator is an account with the SYSADMIN permission. After a cluster is installed, a system administrator has the permissions of all object owners by defaul", + "doc_type":"devg", + "kw":"System Administrator,Managing Users and Their Permissions,Developer Guide", + "title":"System Administrator", + "githuburl":"" + }, + { + "uri":"dws_04_0056.html", + "product_code":"dws", + "code":"103", + "des":"Descriptions in Default Permission Mechanism and System Administrator are about the initial situation after a cluster is created. By default, a system administrator with ", + "doc_type":"devg", + "kw":"Separation of Permissions,Managing Users and Their Permissions,Developer Guide", + "title":"Separation of Permissions", + "githuburl":"" + }, + { + "uri":"dws_04_0057.html", + "product_code":"dws", + "code":"104", + "des":"You can use CREATE USER and ALTER USER to create and manage database users, respectively. The database cluster has one or more named databases. Users and roles are shared", + "doc_type":"devg", + "kw":"Users,Managing Users and Their Permissions,Developer Guide", + "title":"Users", + "githuburl":"" + }, + { + "uri":"dws_04_0058.html", + "product_code":"dws", + "code":"105", + "des":"A role is a set of permissions. After a role is granted to a user through GRANT, the user will have all the permissions of the role. It is recommended that roles be used ", + "doc_type":"devg", + "kw":"Roles,Managing Users and Their Permissions,Developer Guide", + "title":"Roles", + "githuburl":"" + }, + { + "uri":"dws_04_0059.html", + "product_code":"dws", + "code":"106", + "des":"Schemas function as models. Schema management allows multiple users to use the same database without mutual impacts, to organize database objects as manageable logical gr", + "doc_type":"devg", + "kw":"Schema,Managing Users and Their Permissions,Developer Guide", + "title":"Schema", + "githuburl":"" + }, + { + "uri":"dws_04_0060.html", + "product_code":"dws", + "code":"107", + "des":"To grant the permission for an object directly to a user, use GRANT.When permissions for a table or view in a schema are granted to a user or role, the USAGE permission o", + "doc_type":"devg", + "kw":"User Permission Setting,Managing Users and Their Permissions,Developer Guide", + "title":"User Permission Setting", + "githuburl":"" + }, + { + "uri":"dws_04_0063.html", + "product_code":"dws", + "code":"108", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Setting Security Policies", + "title":"Setting Security Policies", + "githuburl":"" + }, + { + "uri":"dws_04_0064.html", + "product_code":"dws", + "code":"109", + "des":"For data security purposes, GaussDB(DWS) provides a series of security measures, such as automatically locking and unlocking accounts, manually locking and unlocking abno", + "doc_type":"devg", + "kw":"Setting Account Security Policies,Setting Security Policies,Developer Guide", + "title":"Setting Account Security Policies", + "githuburl":"" + }, + { + "uri":"dws_04_0065.html", + "product_code":"dws", + "code":"110", + "des":"When creating a user, you need to specify the validity period of the user, including the start time and end time.To enable a user not within the validity period to use it", + "doc_type":"devg", + "kw":"Setting the Validity Period of an Account,Setting Security Policies,Developer Guide", + "title":"Setting the Validity Period of an Account", + "githuburl":"" + }, + { + "uri":"dws_04_0067.html", + "product_code":"dws", + "code":"111", + "des":"User passwords are stored in the system catalog pg_authid. To prevent password leakage, GaussDB(DWS) encrypts and stores the user passwords.Password complexityThe passwor", + "doc_type":"devg", + "kw":"Setting a User Password,Setting Security Policies,Developer Guide", + "title":"Setting a User Password", + "githuburl":"" + }, + { + "uri":"dws_04_0994.html", + "product_code":"dws", + "code":"112", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Sensitive Data Management", + "title":"Sensitive Data Management", + "githuburl":"" + }, + { + "uri":"dws_04_0061.html", + "product_code":"dws", + "code":"113", + "des":"The row-level access control feature enables database access control to be accurate to each row of data tables. In this way, the same SQL query may return different resul", + "doc_type":"devg", + "kw":"Row-Level Access Control,Sensitive Data Management,Developer Guide", + "title":"Row-Level Access Control", + "githuburl":"" + }, + { + "uri":"dws_04_0062.html", + "product_code":"dws", + "code":"114", + "des":"GaussDB(DWS) provides the column-level dynamic data masking (DDM) function. For sensitive data, such as the ID card number, mobile number, and bank card number, the DDM f", + "doc_type":"devg", + "kw":"Data Redaction,Sensitive Data Management,Developer Guide", + "title":"Data Redaction", + "githuburl":"" + }, + { + "uri":"dws_04_0995.html", + "product_code":"dws", + "code":"115", + "des":"GaussDB(DWS) supports encryption and decryption of strings using the following functions:gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)Description: En", + "doc_type":"devg", + "kw":"Using Functions for Encryption and Decryption,Sensitive Data Management,Developer Guide", + "title":"Using Functions for Encryption and Decryption", + "githuburl":"" + }, + { + "uri":"dws_04_0074.html", + "product_code":"dws", + "code":"116", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Development and Design Proposal", + "title":"Development and Design Proposal", + "githuburl":"" + }, + { + "uri":"dws_04_0075.html", + "product_code":"dws", + "code":"117", + "des":"This chapter describes the design specifications for database modeling and application development. Modeling compliant with these specifications fits the distributed proc", + "doc_type":"devg", + "kw":"Development and Design Proposal,Development and Design Proposal,Developer Guide", + "title":"Development and Design Proposal", + "githuburl":"" + }, + { + "uri":"dws_04_0076.html", + "product_code":"dws", + "code":"118", + "des":"The name of a database object must contain 1 to 63 characters, start with a letter or underscore (_), and can contain letters, digits, underscores (_), dollar signs ($), ", + "doc_type":"devg", + "kw":"Database Object Naming Conventions,Development and Design Proposal,Developer Guide", + "title":"Database Object Naming Conventions", + "githuburl":"" + }, + { + "uri":"dws_04_0077.html", + "product_code":"dws", + "code":"119", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Database Object Design", + "title":"Database Object Design", + "githuburl":"" + }, + { + "uri":"dws_04_0078.html", + "product_code":"dws", + "code":"120", + "des":"In GaussDB(DWS), services can be isolated by databases and schemas. Databases share little resources and cannot directly access each other. Connections to and permissions", + "doc_type":"devg", + "kw":"Database and Schema Design,Database Object Design,Developer Guide", + "title":"Database and Schema Design", + "githuburl":"" + }, + { + "uri":"dws_04_0079.html", + "product_code":"dws", + "code":"121", + "des":"GaussDB(DWS) uses a distributed architecture. Data is distributed on DNs. Comply with the following principles to properly design a table:[Notice] Evenly distribute data ", + "doc_type":"devg", + "kw":"Table Design,Database Object Design,Developer Guide", + "title":"Table Design", + "githuburl":"" + }, + { + "uri":"dws_04_0080.html", + "product_code":"dws", + "code":"122", + "des":"Comply with the following rules to improve query efficiency when you design columns:[Proposal] Use the most efficient data types allowed.If all of the following number ty", + "doc_type":"devg", + "kw":"Column Design,Database Object Design,Developer Guide", + "title":"Column Design", + "githuburl":"" + }, + { + "uri":"dws_04_0081.html", + "product_code":"dws", + "code":"123", + "des":"[Proposal] If all the column values can be obtained from services, you are not advised to use the DEFAULT constraint, because doing so will generate unexpected results du", + "doc_type":"devg", + "kw":"Constraint Design,Database Object Design,Developer Guide", + "title":"Constraint Design", + "githuburl":"" + }, + { + "uri":"dws_04_0082.html", + "product_code":"dws", + "code":"124", + "des":"[Proposal] Do not nest views unless they have strong dependency on each other.[Proposal] Try to avoid sort operations in a view definition.[Proposal] Minimize joined colu", + "doc_type":"devg", + "kw":"View and Joined Table Design,Database Object Design,Developer Guide", + "title":"View and Joined Table Design", + "githuburl":"" + }, + { + "uri":"dws_04_0083.html", + "product_code":"dws", + "code":"125", + "des":"Currently, third-party tools are connected to GaussDB(DWS) trough JDBC. This section describes the precautions for configuring the tools.[Notice] When a third-party tool ", + "doc_type":"devg", + "kw":"JDBC Configuration,Development and Design Proposal,Developer Guide", + "title":"JDBC Configuration", + "githuburl":"" + }, + { + "uri":"dws_04_0084.html", + "product_code":"dws", + "code":"126", + "des":"[Proposal] In GaussDB(DWS), you are advised to execute DDL operations, such as creating table or making comments, separately from batch processing jobs to avoid performan", + "doc_type":"devg", + "kw":"SQL Compilation,Development and Design Proposal,Developer Guide", + "title":"SQL Compilation", + "githuburl":"" + }, + { + "uri":"dws_04_0971.html", + "product_code":"dws", + "code":"127", + "des":"[Notice] Java UDFs can perform some Java logic calculation. Do not encapsulate services in Java UDFs.[Notice] Do not connect to a database in any way (for example, by usi", + "doc_type":"devg", + "kw":"PL/Java Usage,Development and Design Proposal,Developer Guide", + "title":"PL/Java Usage", + "githuburl":"" + }, + { + "uri":"dws_04_0972.html", + "product_code":"dws", + "code":"128", + "des":"Development shall strictly comply with design documents.Program modules shall be highly cohesive and loosely coupled.Proper, comprehensive troubleshooting measures shall ", + "doc_type":"devg", + "kw":"PL/pgSQL Usage,Development and Design Proposal,Developer Guide", + "title":"PL/pgSQL Usage", + "githuburl":"" + }, + { + "uri":"dws_04_0085.html", + "product_code":"dws", + "code":"129", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Guide: JDBC- or ODBC-Based Development", + "title":"Guide: JDBC- or ODBC-Based Development", + "githuburl":"" + }, + { + "uri":"dws_04_0086.html", + "product_code":"dws", + "code":"130", + "des":"If the connection pool mechanism is used during application development, comply with the following specifications:If GUC parameters are set in the connection, before you ", + "doc_type":"devg", + "kw":"Development Specifications,Guide: JDBC- or ODBC-Based Development,Developer Guide", + "title":"Development Specifications", + "githuburl":"" + }, + { + "uri":"dws_04_0087.html", + "product_code":"dws", + "code":"131", + "des":"For details, see section \"Downloading the JDBC or ODBC Driver\" in the Data Warehouse Service User Guide.", + "doc_type":"devg", + "kw":"Downloading Drivers,Guide: JDBC- or ODBC-Based Development,Developer Guide", + "title":"Downloading Drivers", + "githuburl":"" + }, + { + "uri":"dws_04_0088.html", + "product_code":"dws", + "code":"132", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"JDBC-Based Development", + "title":"JDBC-Based Development", + "githuburl":"" + }, + { + "uri":"dws_04_0090.html", + "product_code":"dws", + "code":"133", + "des":"Obtain the package dws_8.1.x_jdbc_driver.zip from the management console. For details, see Downloading Drivers.Compressed in it is the JDBC driver JAR package:gsjdbc4.jar", + "doc_type":"devg", + "kw":"JDBC Package and Driver Class,JDBC-Based Development,Developer Guide", + "title":"JDBC Package and Driver Class", + "githuburl":"" + }, + { + "uri":"dws_04_0091.html", + "product_code":"dws", + "code":"134", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Development Process,JDBC-Based Development,Developer Guide", + "title":"Development Process", + "githuburl":"" + }, + { + "uri":"dws_04_0092.html", + "product_code":"dws", + "code":"135", + "des":"Load the database driver before creating a database connection.You can load the driver in the following ways:Implicitly loading the driver before creating a connection in", + "doc_type":"devg", + "kw":"Loading a Driver,JDBC-Based Development,Developer Guide", + "title":"Loading a Driver", + "githuburl":"" + }, + { + "uri":"dws_04_0093.html", + "product_code":"dws", + "code":"136", + "des":"After a database is connected, you can execute SQL statements in the database.If you use an open-source Java Database Connectivity (JDBC) driver, ensure that the database", + "doc_type":"devg", + "kw":"Connecting to a Database,JDBC-Based Development,Developer Guide", + "title":"Connecting to a Database", + "githuburl":"" + }, + { + "uri":"dws_04_0095.html", + "product_code":"dws", + "code":"137", + "des":"The application performs data (parameter statements do not need to be transferred) in the database by running SQL statements, and you need to perform the following steps:", + "doc_type":"devg", + "kw":"Executing SQL Statements,JDBC-Based Development,Developer Guide", + "title":"Executing SQL Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0096.html", + "product_code":"dws", + "code":"138", + "des":"Different types of result sets are applicable to different application scenarios. Applications select proper types of result sets based on requirements. Before executing ", + "doc_type":"devg", + "kw":"Processing Data in a Result Set,JDBC-Based Development,Developer Guide", + "title":"Processing Data in a Result Set", + "githuburl":"" + }, + { + "uri":"dws_04_0097.html", + "product_code":"dws", + "code":"139", + "des":"After you complete required data operations in the database, close the database connection.Call the close method to close the connection, such as, conn. close().", + "doc_type":"devg", + "kw":"Closing the Connection,JDBC-Based Development,Developer Guide", + "title":"Closing the Connection", + "githuburl":"" + }, + { + "uri":"dws_04_0098.html", + "product_code":"dws", + "code":"140", + "des":"Before completing the following example, you need to create a stored procedure.This example illustrates how to develop applications based on the GaussDB(DWS) JDBC interfa", + "doc_type":"devg", + "kw":"Example: Common Operations,JDBC-Based Development,Developer Guide", + "title":"Example: Common Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0099.html", + "product_code":"dws", + "code":"141", + "des":"If the primary DN is faulty and cannot be restored within 40s, its standby is automatically promoted to primary to ensure the normal running of the cluster. Jobs running ", + "doc_type":"devg", + "kw":"Example: Retrying SQL Queries for Applications,JDBC-Based Development,Developer Guide", + "title":"Example: Retrying SQL Queries for Applications", + "githuburl":"" + }, + { + "uri":"dws_04_0100.html", + "product_code":"dws", + "code":"142", + "des":"When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or ", + "doc_type":"devg", + "kw":"Example: Importing and Exporting Data Through Local Files,JDBC-Based Development,Developer Guide", + "title":"Example: Importing and Exporting Data Through Local Files", + "githuburl":"" + }, + { + "uri":"dws_04_0101.html", + "product_code":"dws", + "code":"143", + "des":"The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).", + "doc_type":"devg", + "kw":"Example: Migrating Data from MySQL to GaussDB(DWS),JDBC-Based Development,Developer Guide", + "title":"Example: Migrating Data from MySQL to GaussDB(DWS)", + "githuburl":"" + }, + { + "uri":"dws_04_0102.html", + "product_code":"dws", + "code":"144", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"JDBC Interface Reference", + "title":"JDBC Interface Reference", + "githuburl":"" + }, + { + "uri":"dws_04_0103.html", + "product_code":"dws", + "code":"145", + "des":"This section describes java.sql.Connection, the interface for connecting to a database.The AutoCommit mode is used by default within the interface. If you disable it runn", + "doc_type":"devg", + "kw":"java.sql.Connection,JDBC Interface Reference,Developer Guide", + "title":"java.sql.Connection", + "githuburl":"" + }, + { + "uri":"dws_04_0104.html", + "product_code":"dws", + "code":"146", + "des":"This section describes java.sql.CallableStatement, the stored procedure execution interface.The batch operation of statements containing OUT parameter is not allowed.The ", + "doc_type":"devg", + "kw":"java.sql.CallableStatement,JDBC Interface Reference,Developer Guide", + "title":"java.sql.CallableStatement", + "githuburl":"" + }, + { + "uri":"dws_04_0105.html", + "product_code":"dws", + "code":"147", + "des":"This section describes java.sql.DatabaseMetaData, the interface for defining database objects.", + "doc_type":"devg", + "kw":"java.sql.DatabaseMetaData,JDBC Interface Reference,Developer Guide", + "title":"java.sql.DatabaseMetaData", + "githuburl":"" + }, + { + "uri":"dws_04_0106.html", + "product_code":"dws", + "code":"148", + "des":"This section describes java.sql.Driver, the database driver interface.", + "doc_type":"devg", + "kw":"java.sql.Driver,JDBC Interface Reference,Developer Guide", + "title":"java.sql.Driver", + "githuburl":"" + }, + { + "uri":"dws_04_0107.html", + "product_code":"dws", + "code":"149", + "des":"This section describes java.sql.PreparedStatement, the interface for preparing statements.Execute addBatch() and execute() only after running clearBatch().Batch is not cl", + "doc_type":"devg", + "kw":"java.sql.PreparedStatement,JDBC Interface Reference,Developer Guide", + "title":"java.sql.PreparedStatement", + "githuburl":"" + }, + { + "uri":"dws_04_0108.html", + "product_code":"dws", + "code":"150", + "des":"This section describes java.sql.ResultSet, the interface for execution result sets.One Statement cannot have multiple open ResultSets.The cursor that is used for traversi", + "doc_type":"devg", + "kw":"java.sql.ResultSet,JDBC Interface Reference,Developer Guide", + "title":"java.sql.ResultSet", + "githuburl":"" + }, + { + "uri":"dws_04_0109.html", + "product_code":"dws", + "code":"151", + "des":"This section describes java.sql.ResultSetMetaData, which provides details about ResultSet object information.", + "doc_type":"devg", + "kw":"java.sql.ResultSetMetaData,JDBC Interface Reference,Developer Guide", + "title":"java.sql.ResultSetMetaData", + "githuburl":"" + }, + { + "uri":"dws_04_0110.html", + "product_code":"dws", + "code":"152", + "des":"This section describes java.sql.Statement, the interface for executing SQL statements.Using setFetchSize can reduce the memory occupied by result sets on the client. Resu", + "doc_type":"devg", + "kw":"java.sql.Statement,JDBC Interface Reference,Developer Guide", + "title":"java.sql.Statement", + "githuburl":"" + }, + { + "uri":"dws_04_0111.html", + "product_code":"dws", + "code":"153", + "des":"This section describes javax.sql.ConnectionPoolDataSource, the interface for data source connection pools.", + "doc_type":"devg", + "kw":"javax.sql.ConnectionPoolDataSource,JDBC Interface Reference,Developer Guide", + "title":"javax.sql.ConnectionPoolDataSource", + "githuburl":"" + }, + { + "uri":"dws_04_0112.html", + "product_code":"dws", + "code":"154", + "des":"This section describes javax.sql.DataSource, the interface for data sources.", + "doc_type":"devg", + "kw":"javax.sql.DataSource,JDBC Interface Reference,Developer Guide", + "title":"javax.sql.DataSource", + "githuburl":"" + }, + { + "uri":"dws_04_0113.html", + "product_code":"dws", + "code":"155", + "des":"This section describes javax.sql.PooledConnection, the connection interface created by a connection pool.", + "doc_type":"devg", + "kw":"javax.sql.PooledConnection,JDBC Interface Reference,Developer Guide", + "title":"javax.sql.PooledConnection", + "githuburl":"" + }, + { + "uri":"dws_04_0114.html", + "product_code":"dws", + "code":"156", + "des":"This section describes javax.naming.Context, the context interface for connection configuration.", + "doc_type":"devg", + "kw":"javax.naming.Context,JDBC Interface Reference,Developer Guide", + "title":"javax.naming.Context", + "githuburl":"" + }, + { + "uri":"dws_04_0115.html", + "product_code":"dws", + "code":"157", + "des":"This section describes javax.naming.spi.InitialContextFactory, the initial context factory interface.", + "doc_type":"devg", + "kw":"javax.naming.spi.InitialContextFactory,JDBC Interface Reference,Developer Guide", + "title":"javax.naming.spi.InitialContextFactory", + "githuburl":"" + }, + { + "uri":"dws_04_0116.html", + "product_code":"dws", + "code":"158", + "des":"CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.The CopyManager class is in the or", + "doc_type":"devg", + "kw":"CopyManager,JDBC Interface Reference,Developer Guide", + "title":"CopyManager", + "githuburl":"" + }, + { + "uri":"dws_04_0117.html", + "product_code":"dws", + "code":"159", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"ODBC-Based Development", + "title":"ODBC-Based Development", + "githuburl":"" + }, + { + "uri":"dws_04_0118.html", + "product_code":"dws", + "code":"160", + "des":"Obtain the dws_8.1.x_odbc_driver_for_xxx_xxx.zip package from the release package. In the Linux OS, header files (including sql.h and sqlext.h) and library (libodbc.so) a", + "doc_type":"devg", + "kw":"ODBC Package and Its Dependent Libraries and Header Files,ODBC-Based Development,Developer Guide", + "title":"ODBC Package and Its Dependent Libraries and Header Files", + "githuburl":"" + }, + { + "uri":"dws_04_0119.html", + "product_code":"dws", + "code":"161", + "des":"The ODBC DRIVER (psqlodbcw.so) provided by GaussDB(DWS) can be used after it has been configured in the data source. To configure data sources, users must configure the o", + "doc_type":"devg", + "kw":"Configuring a Data Source in the Linux OS,ODBC-Based Development,Developer Guide", + "title":"Configuring a Data Source in the Linux OS", + "githuburl":"" + }, + { + "uri":"dws_04_0120.html", + "product_code":"dws", + "code":"162", + "des":"Configure the ODBC data source using the ODBC data source manager preinstalled in the Windows OS.Decompress GaussDB-8.1.1-Windows-Odbc.tar.gz and install psqlodbc.msi (fo", + "doc_type":"devg", + "kw":"Configuring a Data Source in the Windows OS,ODBC-Based Development,Developer Guide", + "title":"Configuring a Data Source in the Windows OS", + "githuburl":"" + }, + { + "uri":"dws_04_0123.html", + "product_code":"dws", + "code":"163", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"ODBC Development Example,ODBC-Based Development,Developer Guide", + "title":"ODBC Development Example", + "githuburl":"" + }, + { + "uri":"dws_04_0124.html", + "product_code":"dws", + "code":"164", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"ODBC Interfaces", + "title":"ODBC Interfaces", + "githuburl":"" + }, + { + "uri":"dws_04_0125.html", + "product_code":"dws", + "code":"165", + "des":"In ODBC 3.x, SQLAllocEnv (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "doc_type":"devg", + "kw":"SQLAllocEnv,ODBC Interfaces,Developer Guide", + "title":"SQLAllocEnv", + "githuburl":"" + }, + { + "uri":"dws_04_0126.html", + "product_code":"dws", + "code":"166", + "des":"In ODBC 3.x, SQLAllocConnect (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "doc_type":"devg", + "kw":"SQLAllocConnect,ODBC Interfaces,Developer Guide", + "title":"SQLAllocConnect", + "githuburl":"" + }, + { + "uri":"dws_04_0127.html", + "product_code":"dws", + "code":"167", + "des":"SQLAllocHandle allocates environment, connection, or statement handles. This function is a generic function for allocating handles that replaces the deprecated ODBC 2.x f", + "doc_type":"devg", + "kw":"SQLAllocHandle,ODBC Interfaces,Developer Guide", + "title":"SQLAllocHandle", + "githuburl":"" + }, + { + "uri":"dws_04_0128.html", + "product_code":"dws", + "code":"168", + "des":"In ODBC 3.x, SQLAllocStmt was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "doc_type":"devg", + "kw":"SQLAllocStmt,ODBC Interfaces,Developer Guide", + "title":"SQLAllocStmt", + "githuburl":"" + }, + { + "uri":"dws_04_0129.html", + "product_code":"dws", + "code":"169", + "des":"SQLBindCol is used to associate (bind) columns in a result set to an application data buffer.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates", + "doc_type":"devg", + "kw":"SQLBindCol,ODBC Interfaces,Developer Guide", + "title":"SQLBindCol", + "githuburl":"" + }, + { + "uri":"dws_04_0130.html", + "product_code":"dws", + "code":"170", + "des":"SQLBindParameter is used to associate (bind) parameter markers in an SQL statement to a buffer.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicat", + "doc_type":"devg", + "kw":"SQLBindParameter,ODBC Interfaces,Developer Guide", + "title":"SQLBindParameter", + "githuburl":"" + }, + { + "uri":"dws_04_0131.html", + "product_code":"dws", + "code":"171", + "des":"SQLColAttribute returns the descriptor information about a column in the result set.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some war", + "doc_type":"devg", + "kw":"SQLColAttribute,ODBC Interfaces,Developer Guide", + "title":"SQLColAttribute", + "githuburl":"" + }, + { + "uri":"dws_04_0132.html", + "product_code":"dws", + "code":"172", + "des":"SQLConnect establishes a connection between a driver and a data source. After the connection, the connection handle can be used to access all information about the data s", + "doc_type":"devg", + "kw":"SQLConnect,ODBC Interfaces,Developer Guide", + "title":"SQLConnect", + "githuburl":"" + }, + { + "uri":"dws_04_0133.html", + "product_code":"dws", + "code":"173", + "des":"SQLDisconnect closes the connection associated with the database connection handle.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warn", + "doc_type":"devg", + "kw":"SQLDisconnect,ODBC Interfaces,Developer Guide", + "title":"SQLDisconnect", + "githuburl":"" + }, + { + "uri":"dws_04_0134.html", + "product_code":"dws", + "code":"174", + "des":"SQLExecDirect executes a prepared SQL statement specified in this parameter. This is the fastest execution method for executing only one SQL statement at a time.SQL_SUCCE", + "doc_type":"devg", + "kw":"SQLExecDirect,ODBC Interfaces,Developer Guide", + "title":"SQLExecDirect", + "githuburl":"" + }, + { + "uri":"dws_04_0135.html", + "product_code":"dws", + "code":"175", + "des":"The SQLExecute function executes a prepared SQL statement using SQLPrepare. The statement is executed using the current value of any application variables that were bound", + "doc_type":"devg", + "kw":"SQLExecute,ODBC Interfaces,Developer Guide", + "title":"SQLExecute", + "githuburl":"" + }, + { + "uri":"dws_04_0136.html", + "product_code":"dws", + "code":"176", + "des":"SQLFetch advances the cursor to the next row of the result set and retrieves any bound columns.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicat", + "doc_type":"devg", + "kw":"SQLFetch,ODBC Interfaces,Developer Guide", + "title":"SQLFetch", + "githuburl":"" + }, + { + "uri":"dws_04_0137.html", + "product_code":"dws", + "code":"177", + "des":"In ODBC 3.x, SQLFreeStmt (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "doc_type":"devg", + "kw":"SQLFreeStmt,ODBC Interfaces,Developer Guide", + "title":"SQLFreeStmt", + "githuburl":"" + }, + { + "uri":"dws_04_0138.html", + "product_code":"dws", + "code":"178", + "des":"In ODBC 3.x, SQLFreeConnect (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "doc_type":"devg", + "kw":"SQLFreeConnect,ODBC Interfaces,Developer Guide", + "title":"SQLFreeConnect", + "githuburl":"" + }, + { + "uri":"dws_04_0139.html", + "product_code":"dws", + "code":"179", + "des":"SQLFreeHandle releases resources associated with a specific environment, connection, or statement handle. It replaces the ODBC 2.x functions: SQLFreeEnv, SQLFreeConnect, ", + "doc_type":"devg", + "kw":"SQLFreeHandle,ODBC Interfaces,Developer Guide", + "title":"SQLFreeHandle", + "githuburl":"" + }, + { + "uri":"dws_04_0140.html", + "product_code":"dws", + "code":"180", + "des":"In ODBC 3.x, SQLFreeEnv (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "doc_type":"devg", + "kw":"SQLFreeEnv,ODBC Interfaces,Developer Guide", + "title":"SQLFreeEnv", + "githuburl":"" + }, + { + "uri":"dws_04_0141.html", + "product_code":"dws", + "code":"181", + "des":"SQLPrepare prepares an SQL statement to be executed.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQ", + "doc_type":"devg", + "kw":"SQLPrepare,ODBC Interfaces,Developer Guide", + "title":"SQLPrepare", + "githuburl":"" + }, + { + "uri":"dws_04_0142.html", + "product_code":"dws", + "code":"182", + "des":"SQLGetData retrieves data for a single column in the current row of the result set. It can be called for many times to retrieve data of variable lengths.SQL_SUCCESS indic", + "doc_type":"devg", + "kw":"SQLGetData,ODBC Interfaces,Developer Guide", + "title":"SQLGetData", + "githuburl":"" + }, + { + "uri":"dws_04_0143.html", + "product_code":"dws", + "code":"183", + "des":"SQLGetDiagRec returns the current values of multiple fields of a diagnostic record that contains error, warning, and status information.SQL_SUCCESS indicates that the cal", + "doc_type":"devg", + "kw":"SQLGetDiagRec,ODBC Interfaces,Developer Guide", + "title":"SQLGetDiagRec", + "githuburl":"" + }, + { + "uri":"dws_04_0144.html", + "product_code":"dws", + "code":"184", + "des":"SQLSetConnectAttr sets connection attributes.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQL_ERROR", + "doc_type":"devg", + "kw":"SQLSetConnectAttr,ODBC Interfaces,Developer Guide", + "title":"SQLSetConnectAttr", + "githuburl":"" + }, + { + "uri":"dws_04_0145.html", + "product_code":"dws", + "code":"185", + "des":"SQLSetEnvAttr sets environment attributes.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQL_ERROR in", + "doc_type":"devg", + "kw":"SQLSetEnvAttr,ODBC Interfaces,Developer Guide", + "title":"SQLSetEnvAttr", + "githuburl":"" + }, + { + "uri":"dws_04_0146.html", + "product_code":"dws", + "code":"186", + "des":"SQLSetStmtAttr sets attributes related to a statement.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.", + "doc_type":"devg", + "kw":"SQLSetStmtAttr,ODBC Interfaces,Developer Guide", + "title":"SQLSetStmtAttr", + "githuburl":"" + }, + { + "uri":"dws_04_0301.html", + "product_code":"dws", + "code":"187", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"PostGIS Extension", + "title":"PostGIS Extension", + "githuburl":"" + }, + { + "uri":"dws_04_0302.html", + "product_code":"dws", + "code":"188", + "des":"The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical ", + "doc_type":"devg", + "kw":"PostGIS,PostGIS Extension,Developer Guide", + "title":"PostGIS", + "githuburl":"" + }, + { + "uri":"dws_04_0304.html", + "product_code":"dws", + "code":"189", + "des":"The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical ", + "doc_type":"devg", + "kw":"Using PostGIS,PostGIS Extension,Developer Guide", + "title":"Using PostGIS", + "githuburl":"" + }, + { + "uri":"dws_04_0305.html", + "product_code":"dws", + "code":"190", + "des":"In GaussDB(DWS), PostGIS Extension support the following data types:box2dbox3dgeometry_dumpgeometrygeographyrasterIf PostGIS is used by a user other than the creator of t", + "doc_type":"devg", + "kw":"PostGIS Support and Constraints,PostGIS Extension,Developer Guide", + "title":"PostGIS Support and Constraints", + "githuburl":"" + }, + { + "uri":"dws_04_0306.html", + "product_code":"dws", + "code":"191", + "des":"This document contains open source software notice for the product. And this document is confidential information of copyright holder. Recipient shall protect it in due c", + "doc_type":"devg", + "kw":"OPEN SOURCE SOFTWARE NOTICE (For PostGIS),PostGIS Extension,Developer Guide", + "title":"OPEN SOURCE SOFTWARE NOTICE (For PostGIS)", + "githuburl":"" + }, + { + "uri":"dws_04_0393.html", + "product_code":"dws", + "code":"192", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Resource Monitoring", + "title":"Resource Monitoring", + "githuburl":"" + }, + { + "uri":"dws_04_0394.html", + "product_code":"dws", + "code":"193", + "des":"In the multi-tenant management framework, you can query the real-time or historical usage of all user resources (including memory, CPU cores, storage space, temporary spa", + "doc_type":"devg", + "kw":"User Resource Query,Resource Monitoring,Developer Guide", + "title":"User Resource Query", + "githuburl":"" + }, + { + "uri":"dws_04_0395.html", + "product_code":"dws", + "code":"194", + "des":"GaussDB(DWS) provides a view for monitoring the memory usage of the entire cluster.Query the pgxc_total_memory_detail view as a user with sysadmin permissions.SELECT * FR", + "doc_type":"devg", + "kw":"Monitoring Memory Resources,Resource Monitoring,Developer Guide", + "title":"Monitoring Memory Resources", + "githuburl":"" + }, + { + "uri":"dws_04_0396.html", + "product_code":"dws", + "code":"195", + "des":"GaussDB(DWS) provides system catalogs for monitoring the resource usage of CNs and DNs (including memory, CPU usage, disk I/O, process physical I/O, and process logical I", + "doc_type":"devg", + "kw":"Instance Resource Monitoring,Resource Monitoring,Developer Guide", + "title":"Instance Resource Monitoring", + "githuburl":"" + }, + { + "uri":"dws_04_0397.html", + "product_code":"dws", + "code":"196", + "des":"You can query real-time Top SQL in real-time resource monitoring views at different levels. The real-time resource monitoring view records the resource usage (including m", + "doc_type":"devg", + "kw":"Real-time TopSQL,Resource Monitoring,Developer Guide", + "title":"Real-time TopSQL", + "githuburl":"" + }, + { + "uri":"dws_04_0398.html", + "product_code":"dws", + "code":"197", + "des":"You can query historical Top SQL in historical resource monitoring views. The historical resource monitoring view records the resource usage (of memory, disk, CPU time, a", + "doc_type":"devg", + "kw":"Historical TopSQL,Resource Monitoring,Developer Guide", + "title":"Historical TopSQL", + "githuburl":"" + }, + { + "uri":"dws_04_0399.html", + "product_code":"dws", + "code":"198", + "des":"In this section, TPC-DS sample data is used as an example to describe how to query Real-time TopSQL and Historical TopSQL.To query for historical or archived resource mon", + "doc_type":"devg", + "kw":"TopSQL Query Example,Resource Monitoring,Developer Guide", + "title":"TopSQL Query Example", + "githuburl":"" + }, + { + "uri":"dws_04_0400.html", + "product_code":"dws", + "code":"199", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Query Performance Optimization", + "title":"Query Performance Optimization", + "githuburl":"" + }, + { + "uri":"dws_04_0402.html", + "product_code":"dws", + "code":"200", + "des":"The aim of SQL optimization is to maximize the utilization of resources, including CPU, memory, disk I/O, and network I/O. To maximize resource utilization is to run SQL ", + "doc_type":"devg", + "kw":"Overview of Query Performance Optimization,Query Performance Optimization,Developer Guide", + "title":"Overview of Query Performance Optimization", + "githuburl":"" + }, + { + "uri":"dws_04_0403.html", + "product_code":"dws", + "code":"201", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Query Analysis", + "title":"Query Analysis", + "githuburl":"" + }, + { + "uri":"dws_04_0409.html", + "product_code":"dws", + "code":"202", + "des":"The process from receiving SQL statements to the statement execution by the SQL engine is shown in Figure 1 and Table 1. The texts in red are steps where database adminis", + "doc_type":"devg", + "kw":"Query Execution Process,Query Analysis,Developer Guide", + "title":"Query Execution Process", + "githuburl":"" + }, + { + "uri":"dws_04_0410.html", + "product_code":"dws", + "code":"203", + "des":"The SQL execution plan is a node tree, which displays detailed procedure when GaussDB(DWS) runs an SQL statement. A database operator indicates one step.You can run the E", + "doc_type":"devg", + "kw":"Overview of the SQL Execution Plan,Query Analysis,Developer Guide", + "title":"Overview of the SQL Execution Plan", + "githuburl":"" + }, + { + "uri":"dws_04_0411.html", + "product_code":"dws", + "code":"204", + "des":"As described in Overview of the SQL Execution Plan, EXPLAIN displays the execution plan, but will not actually run SQL statements. EXPLAIN ANALYZE and EXPLAIN PERFORMANCE", + "doc_type":"devg", + "kw":"Deep Dive on the SQL Execution Plan,Query Analysis,Developer Guide", + "title":"Deep Dive on the SQL Execution Plan", + "githuburl":"" + }, + { + "uri":"dws_04_0412.html", + "product_code":"dws", + "code":"205", + "des":"This section describes how to query SQL statements whose execution takes a long time, leading to poor system performance.After the query, query statements are returned as", + "doc_type":"devg", + "kw":"Querying SQL Statements That Affect Performance Most,Query Analysis,Developer Guide", + "title":"Querying SQL Statements That Affect Performance Most", + "githuburl":"" + }, + { + "uri":"dws_04_0413.html", + "product_code":"dws", + "code":"206", + "des":"During database running, query statements are blocked in some service scenarios and run for an excessively long time. In this case, you can forcibly terminate the faulty ", + "doc_type":"devg", + "kw":"Checking Blocked Statements,Query Analysis,Developer Guide", + "title":"Checking Blocked Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0430.html", + "product_code":"dws", + "code":"207", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Query Improvement", + "title":"Query Improvement", + "githuburl":"" + }, + { + "uri":"dws_04_0435.html", + "product_code":"dws", + "code":"208", + "des":"You can analyze slow SQL statements to optimize them.", + "doc_type":"devg", + "kw":"Optimization Process,Query Improvement,Developer Guide", + "title":"Optimization Process", + "githuburl":"" + }, + { + "uri":"dws_04_0436.html", + "product_code":"dws", + "code":"209", + "des":"In a database, statistics indicate the source data of a plan generated by a planner. If no collection statistics are available or out of date, the execution plan may seri", + "doc_type":"devg", + "kw":"Updating Statistics,Query Improvement,Developer Guide", + "title":"Updating Statistics", + "githuburl":"" + }, + { + "uri":"dws_04_0437.html", + "product_code":"dws", + "code":"210", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Reviewing and Modifying a Table Definition", + "title":"Reviewing and Modifying a Table Definition", + "githuburl":"" + }, + { + "uri":"dws_04_0438.html", + "product_code":"dws", + "code":"211", + "des":"In a distributed framework, data is distributed on DNs. Data on one or more DNs is stored on a physical storage device. To properly define a table, you must:Evenly distri", + "doc_type":"devg", + "kw":"Reviewing and Modifying a Table Definition,Reviewing and Modifying a Table Definition,Developer Guid", + "title":"Reviewing and Modifying a Table Definition", + "githuburl":"" + }, + { + "uri":"dws_04_0439.html", + "product_code":"dws", + "code":"212", + "des":"During database design, some key factors about table design will greatly affect the subsequent query performance of the database. Table design affects data storage as wel", + "doc_type":"devg", + "kw":"Selecting a Storage Model,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Selecting a Storage Model", + "githuburl":"" + }, + { + "uri":"dws_04_0440.html", + "product_code":"dws", + "code":"213", + "des":"In replication mode, full data in a table is copied to each DN in the cluster. This mode is used for tables containing a small volume of data. Full data in a table stored", + "doc_type":"devg", + "kw":"Selecting a Distribution Mode,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Selecting a Distribution Mode", + "githuburl":"" + }, + { + "uri":"dws_04_0441.html", + "product_code":"dws", + "code":"214", + "des":"The distribution column in a hash table must meet the following requirements, which are ranked by priority in descending order:The value of the distribution column should", + "doc_type":"devg", + "kw":"Selecting a Distribution Column,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Selecting a Distribution Column", + "githuburl":"" + }, + { + "uri":"dws_04_0442.html", + "product_code":"dws", + "code":"215", + "des":"Partial Cluster Key is the column-based technology. It can minimize or maximize sparse indexes to quickly filter base tables. Partial cluster key can specify multiple col", + "doc_type":"devg", + "kw":"Using Partial Clustering,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Using Partial Clustering", + "githuburl":"" + }, + { + "uri":"dws_04_0443.html", + "product_code":"dws", + "code":"216", + "des":"Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific schemes. The table based on the logic is called a partit", + "doc_type":"devg", + "kw":"Using Partitioned Tables,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Using Partitioned Tables", + "githuburl":"" + }, + { + "uri":"dws_04_0444.html", + "product_code":"dws", + "code":"217", + "des":"Use the following principles to obtain efficient data types:Using the data type that can be efficiently executedGenerally, calculation of integers (including common compa", + "doc_type":"devg", + "kw":"Selecting a Data Type,Reviewing and Modifying a Table Definition,Developer Guide", + "title":"Selecting a Data Type", + "githuburl":"" + }, + { + "uri":"dws_04_0445.html", + "product_code":"dws", + "code":"218", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Typical SQL Optimization Methods", + "title":"Typical SQL Optimization Methods", + "githuburl":"" + }, + { + "uri":"dws_04_0446.html", + "product_code":"dws", + "code":"219", + "des":"Performance issues may occur when you query data or run the INSERT, DELETE, UPDATE, or CREATE TABLE AS statement. You can query the warning column in the GS_WLM_SESSION_S", + "doc_type":"devg", + "kw":"SQL Self-Diagnosis,Typical SQL Optimization Methods,Developer Guide", + "title":"SQL Self-Diagnosis", + "githuburl":"" + }, + { + "uri":"dws_04_0447.html", + "product_code":"dws", + "code":"220", + "des":"Currently, the GaussDB(DWS) optimizer can use three methods to develop statement execution policies in the distributed framework: generating a statement pushdown plan, a ", + "doc_type":"devg", + "kw":"Optimizing Statement Pushdown,Typical SQL Optimization Methods,Developer Guide", + "title":"Optimizing Statement Pushdown", + "githuburl":"" + }, + { + "uri":"dws_04_0448.html", + "product_code":"dws", + "code":"221", + "des":"When an application runs a SQL statement to operate the database, a large number of subqueries are used because they are more clear than table join. Especially in complic", + "doc_type":"devg", + "kw":"Optimizing Subqueries,Typical SQL Optimization Methods,Developer Guide", + "title":"Optimizing Subqueries", + "githuburl":"" + }, + { + "uri":"dws_04_0449.html", + "product_code":"dws", + "code":"222", + "des":"GaussDB(DWS) generates optimal execution plans based on the cost estimation. Optimizers need to estimate the number of data rows and the cost based on statistics collecte", + "doc_type":"devg", + "kw":"Optimizing Statistics,Typical SQL Optimization Methods,Developer Guide", + "title":"Optimizing Statistics", + "githuburl":"" + }, + { + "uri":"dws_04_0450.html", + "product_code":"dws", + "code":"223", + "des":"A query statement needs to go through multiple operator procedures to generate the final result. Sometimes, the overall query performance deteriorates due to long executi", + "doc_type":"devg", + "kw":"Optimizing Operators,Typical SQL Optimization Methods,Developer Guide", + "title":"Optimizing Operators", + "githuburl":"" + }, + { + "uri":"dws_04_0451.html", + "product_code":"dws", + "code":"224", + "des":"Data skew breaks the balance among nodes in the distributed MPP architecture. If the amount of data stored or processed by a node is much greater than that by other nodes", + "doc_type":"devg", + "kw":"Optimizing Data Skew,Typical SQL Optimization Methods,Developer Guide", + "title":"Optimizing Data Skew", + "githuburl":"" + }, + { + "uri":"dws_04_0452.html", + "product_code":"dws", + "code":"225", + "des":"Based on the database SQL execution mechanism and a large number of practices, summarize finds that: using rules of a certain SQL statement, on the basis of the so that t", + "doc_type":"devg", + "kw":"Experience in Rewriting SQL Statements,Query Improvement,Developer Guide", + "title":"Experience in Rewriting SQL Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0453.html", + "product_code":"dws", + "code":"226", + "des":"This section describes the key CN parameters that affect GaussDB(DWS) SQL tuning performance. For details about how to configure these parameters, see Configuring GUC Par", + "doc_type":"devg", + "kw":"Adjusting Key Parameters During SQL Tuning,Query Improvement,Developer Guide", + "title":"Adjusting Key Parameters During SQL Tuning", + "githuburl":"" + }, + { + "uri":"dws_04_0454.html", + "product_code":"dws", + "code":"227", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Hint-based Tuning", + "title":"Hint-based Tuning", + "githuburl":"" + }, + { + "uri":"dws_04_0455.html", + "product_code":"dws", + "code":"228", + "des":"In plan hints, you can specify a join order, join, stream, and scan operations, the number of rows in a result, and redistribution skew information to tune an execution p", + "doc_type":"devg", + "kw":"Plan Hint Optimization,Hint-based Tuning,Developer Guide", + "title":"Plan Hint Optimization", + "githuburl":"" + }, + { + "uri":"dws_04_0456.html", + "product_code":"dws", + "code":"229", + "des":"Theses hints specify the join order and outer/inner tables.Specify only the join order.Specify the join order and outer/inner tables. The outer/inner tables are specified", + "doc_type":"devg", + "kw":"Join Order Hints,Hint-based Tuning,Developer Guide", + "title":"Join Order Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0457.html", + "product_code":"dws", + "code":"230", + "des":"Specifies the join method. It can be nested loop join, hash join, or merge join.no indicates that the specified hint will not be used for a join.table_list specifies the ", + "doc_type":"devg", + "kw":"Join Operation Hints,Hint-based Tuning,Developer Guide", + "title":"Join Operation Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0458.html", + "product_code":"dws", + "code":"231", + "des":"These hints specify the number of rows in an intermediate result set. Both absolute values and relative values are supported.#,+,-, and * are operators used for hinting t", + "doc_type":"devg", + "kw":"Rows Hints,Hint-based Tuning,Developer Guide", + "title":"Rows Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0459.html", + "product_code":"dws", + "code":"232", + "des":"These hints specify a stream operation, which can be broadcast or redistribute.no indicates that the specified hint will not be used for a join.table_list specifies the t", + "doc_type":"devg", + "kw":"Stream Operation Hints,Hint-based Tuning,Developer Guide", + "title":"Stream Operation Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0460.html", + "product_code":"dws", + "code":"233", + "des":"These hints specify a scan operation, which can be tablescan, indexscan, or indexonlyscan.no indicates that the specified hint will not be used for a join.table specifies", + "doc_type":"devg", + "kw":"Scan Operation Hints,Hint-based Tuning,Developer Guide", + "title":"Scan Operation Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0461.html", + "product_code":"dws", + "code":"234", + "des":"These hints specify the name of a sublink block.table indicates the name you have specified for a sublink block.This hint is used by an outer query only when a sublink is", + "doc_type":"devg", + "kw":"Sublink Name Hints,Hint-based Tuning,Developer Guide", + "title":"Sublink Name Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0462.html", + "product_code":"dws", + "code":"235", + "des":"Theses hints specify redistribution keys containing skew data and skew values, and are used to optimize redistribution involving Join or HashAgg.Specify single-table skew", + "doc_type":"devg", + "kw":"Skew Hints,Hint-based Tuning,Developer Guide", + "title":"Skew Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0463.html", + "product_code":"dws", + "code":"236", + "des":"A hint, or a GUC hint, specifies a configuration parameter value when a plan is generated. Currently, only the following parameters are supported:agg_redistribute_enhance", + "doc_type":"devg", + "kw":"Configuration Parameter Hints,Hint-based Tuning,Developer Guide", + "title":"Configuration Parameter Hints", + "githuburl":"" + }, + { + "uri":"dws_04_0464.html", + "product_code":"dws", + "code":"237", + "des":"Plan hints change an execution plan. You can run EXPLAIN to view the changes.Hints containing errors are invalid and do not affect statement execution. The errors will be", + "doc_type":"devg", + "kw":"Hint Errors, Conflicts, and Other Warnings,Hint-based Tuning,Developer Guide", + "title":"Hint Errors, Conflicts, and Other Warnings", + "githuburl":"" + }, + { + "uri":"dws_04_0465.html", + "product_code":"dws", + "code":"238", + "des":"This section takes the statements in TPC-DS (Q24) as an example to describe how to optimize an execution plan by using hints in 1000X+24DN environments. For example:The o", + "doc_type":"devg", + "kw":"Plan Hint Cases,Hint-based Tuning,Developer Guide", + "title":"Plan Hint Cases", + "githuburl":"" + }, + { + "uri":"dws_04_0466.html", + "product_code":"dws", + "code":"239", + "des":"To ensure proper database running, after INSERT and DELETE operations, you need to routinely do VACUUM FULL and ANALYZE as appropriate for customer scenarios and update s", + "doc_type":"devg", + "kw":"Routinely Maintaining Tables,Query Improvement,Developer Guide", + "title":"Routinely Maintaining Tables", + "githuburl":"" + }, + { + "uri":"dws_04_0467.html", + "product_code":"dws", + "code":"240", + "des":"When data deletion is repeatedly performed in the database, index keys will be deleted from the index page, resulting in index distention. Recreating an index routinely i", + "doc_type":"devg", + "kw":"Routinely Recreating an Index,Query Improvement,Developer Guide", + "title":"Routinely Recreating an Index", + "githuburl":"" + }, + { + "uri":"dws_04_0468.html", + "product_code":"dws", + "code":"241", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Configuring the SMP", + "title":"Configuring the SMP", + "githuburl":"" + }, + { + "uri":"dws_04_0469.html", + "product_code":"dws", + "code":"242", + "des":"The SMP feature improves the performance through operator parallelism and occupies more system resources, including CPU, memory, network, and I/O. Actually, SMP is a meth", + "doc_type":"devg", + "kw":"Application Scenarios and Restrictions,Configuring the SMP,Developer Guide", + "title":"Application Scenarios and Restrictions", + "githuburl":"" + }, + { + "uri":"dws_04_0470.html", + "product_code":"dws", + "code":"243", + "des":"The SMP architecture uses abundant resources to obtain time. After the plan parallelism is executed, the resource consumption is added, including the CPU, memory, I/O, an", + "doc_type":"devg", + "kw":"Resource Impact on SMP Performance,Configuring the SMP,Developer Guide", + "title":"Resource Impact on SMP Performance", + "githuburl":"" + }, + { + "uri":"dws_04_0471.html", + "product_code":"dws", + "code":"244", + "des":"Besides resource factors, there are other factors that impact the SMP parallelism performance, such as unevenly data distributed in a partitioned table and system paralle", + "doc_type":"devg", + "kw":"Other Factors Affecting SMP Performance,Configuring the SMP,Developer Guide", + "title":"Other Factors Affecting SMP Performance", + "githuburl":"" + }, + { + "uri":"dws_04_0472.html", + "product_code":"dws", + "code":"245", + "des":"Starting from this version, SMP auto adaptation is enabled. For newly deployed clusters, the default value of query_dop is 0, and SMP parameters have been adjusted. To en", + "doc_type":"devg", + "kw":"Suggestions for SMP Parameter Settings,Configuring the SMP,Developer Guide", + "title":"Suggestions for SMP Parameter Settings", + "githuburl":"" + }, + { + "uri":"dws_04_0473.html", + "product_code":"dws", + "code":"246", + "des":"To manually optimize SMP, you need to be familiar with Suggestions for SMP Parameter Settings. This section describes how to optimize SMP.The CPU, memory, I/O, and networ", + "doc_type":"devg", + "kw":"SMP Manual Optimization Suggestions,Configuring the SMP,Developer Guide", + "title":"SMP Manual Optimization Suggestions", + "githuburl":"" + }, + { + "uri":"dws_04_0474.html", + "product_code":"dws", + "code":"247", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Optimization Cases", + "title":"Optimization Cases", + "githuburl":"" + }, + { + "uri":"dws_04_0475.html", + "product_code":"dws", + "code":"248", + "des":"Tables are defined as follows:The following query is executed:If a is the distribution column of t1 and t2:Then Streaming exists in the execution plan and the data volume", + "doc_type":"devg", + "kw":"Case: Selecting an Appropriate Distribution Column,Optimization Cases,Developer Guide", + "title":"Case: Selecting an Appropriate Distribution Column", + "githuburl":"" + }, + { + "uri":"dws_04_0476.html", + "product_code":"dws", + "code":"249", + "des":"Query the information about all personnel in the sales department.The original execution plan is as follows before creating the places.place_id and states.state_id indexe", + "doc_type":"devg", + "kw":"Case: Creating an Appropriate Index,Optimization Cases,Developer Guide", + "title":"Case: Creating an Appropriate Index", + "githuburl":"" + }, + { + "uri":"dws_04_0477.html", + "product_code":"dws", + "code":"250", + "des":"Figure 1 shows the execution plan.As shown in Figure 1, the sequential scan phase is time consuming.The JOIN performance is poor because a large number of null values exi", + "doc_type":"devg", + "kw":"Case: Adding NOT NULL for JOIN Columns,Optimization Cases,Developer Guide", + "title":"Case: Adding NOT NULL for JOIN Columns", + "githuburl":"" + }, + { + "uri":"dws_04_0478.html", + "product_code":"dws", + "code":"251", + "des":"In an execution plan, more than 95% of the execution time is spent on window agg performed on the CN. In this case, sum is performed for the two columns separately, and t", + "doc_type":"devg", + "kw":"Case: Pushing Down Sort Operations to DNs,Optimization Cases,Developer Guide", + "title":"Case: Pushing Down Sort Operations to DNs", + "githuburl":"" + }, + { + "uri":"dws_04_0479.html", + "product_code":"dws", + "code":"252", + "des":"If bit0 of cost_param is set to 1, an improved mechanism is used for estimating the selection rate of non-equi-joins. This method is more accurate for estimating the sele", + "doc_type":"devg", + "kw":"Case: Configuring cost_param for Better Query Performance,Optimization Cases,Developer Guide", + "title":"Case: Configuring cost_param for Better Query Performance", + "githuburl":"" + }, + { + "uri":"dws_04_0480.html", + "product_code":"dws", + "code":"253", + "des":"During a site test, the information is displayed after EXPLAIN ANALYZE is executed:According to the execution information, HashJoin becomes the performance bottleneck of ", + "doc_type":"devg", + "kw":"Case: Adjusting the Distribution Key,Optimization Cases,Developer Guide", + "title":"Case: Adjusting the Distribution Key", + "githuburl":"" + }, + { + "uri":"dws_04_0481.html", + "product_code":"dws", + "code":"254", + "des":"Information on the EXPLAIN PERFORMANCE at a site is as follows: As shown in the red boxes, two performance bottlenecks are scan operations in a table.After further analys", + "doc_type":"devg", + "kw":"Case: Adjusting the Partial Clustering Key,Optimization Cases,Developer Guide", + "title":"Case: Adjusting the Partial Clustering Key", + "githuburl":"" + }, + { + "uri":"dws_04_0482.html", + "product_code":"dws", + "code":"255", + "des":"In the GaussDB(DWS) database, row-store tables use the row execution engine, and column-store tables use the column execution engine. If both row-store table and column-s", + "doc_type":"devg", + "kw":"Case: Adjusting the Table Storage Mode in a Medium Table,Optimization Cases,Developer Guide", + "title":"Case: Adjusting the Table Storage Mode in a Medium Table", + "githuburl":"" + }, + { + "uri":"dws_04_0483.html", + "product_code":"dws", + "code":"256", + "des":"During the test at a site, if the following execution plan is performed, the customer expects that the performance can be improved and the result can be returned within 3", + "doc_type":"devg", + "kw":"Case: Adjusting the Local Clustering Column,Optimization Cases,Developer Guide", + "title":"Case: Adjusting the Local Clustering Column", + "githuburl":"" + }, + { + "uri":"dws_04_0484.html", + "product_code":"dws", + "code":"257", + "des":"In the following simple SQL statements, the performance bottlenecks exist in the scan operation of dwcjk.Obviously, there are date features in the cjrq field of table dat", + "doc_type":"devg", + "kw":"Case: Reconstructing Partition Tables,Optimization Cases,Developer Guide", + "title":"Case: Reconstructing Partition Tables", + "githuburl":"" + }, + { + "uri":"dws_04_0485.html", + "product_code":"dws", + "code":"258", + "des":"The t1 table is defined as follows:Assume that the distribution column of the result set provided by the agg lower-layer operator is setA, and the group by column of the ", + "doc_type":"devg", + "kw":"Case: Adjusting the GUC Parameter best_agg_plan,Optimization Cases,Developer Guide", + "title":"Case: Adjusting the GUC Parameter best_agg_plan", + "githuburl":"" + }, + { + "uri":"dws_04_0486.html", + "product_code":"dws", + "code":"259", + "des":"This SQL performance is poor. SubPlan exists in the execution plan as follows:The core of this optimization is to eliminate subqueries. Based on the service scenario anal", + "doc_type":"devg", + "kw":"Case: Rewriting SQL and Deleting Subqueries (Case 1),Optimization Cases,Developer Guide", + "title":"Case: Rewriting SQL and Deleting Subqueries (Case 1)", + "githuburl":"" + }, + { + "uri":"dws_04_0487.html", + "product_code":"dws", + "code":"260", + "des":"On a site, the customer gave the feedback saying that the execution time of the following SQL statements lasted over one day and did not end:The corresponding execution p", + "doc_type":"devg", + "kw":"Case: Rewriting SQL and Deleting Subqueries (Case 2),Optimization Cases,Developer Guide", + "title":"Case: Rewriting SQL and Deleting Subqueries (Case 2)", + "githuburl":"" + }, + { + "uri":"dws_04_0488.html", + "product_code":"dws", + "code":"261", + "des":"In a test at a site, ddw_f10_op_cust_asset_mon is a partitioned table and the partition key is year_mth whose value is a combined string of month and year values.The foll", + "doc_type":"devg", + "kw":"Case: Rewriting SQL Statements and Eliminating Prune Interference,Optimization Cases,Developer Guide", + "title":"Case: Rewriting SQL Statements and Eliminating Prune Interference", + "githuburl":"" + }, + { + "uri":"dws_04_0489.html", + "product_code":"dws", + "code":"262", + "des":"in-clause/any-clause is a common SQL statement constraint. Sometimes, the clause following in or any is a constant. For example:orSome special usages are as follows:Where", + "doc_type":"devg", + "kw":"Case: Rewriting SQL Statements and Deleting in-clause,Optimization Cases,Developer Guide", + "title":"Case: Rewriting SQL Statements and Deleting in-clause", + "githuburl":"" + }, + { + "uri":"dws_04_0490.html", + "product_code":"dws", + "code":"263", + "des":"You can add PARTIAL CLUSTER KEY(column_name[,...]) to the definition of a column-store table to set one or more columns of this table as partial cluster keys. In this way", + "doc_type":"devg", + "kw":"Case: Setting Partial Cluster Keys,Optimization Cases,Developer Guide", + "title":"Case: Setting Partial Cluster Keys", + "githuburl":"" + }, + { + "uri":"dws_04_0491.html", + "product_code":"dws", + "code":"264", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"SQL Execution Troubleshooting", + "title":"SQL Execution Troubleshooting", + "githuburl":"" + }, + { + "uri":"dws_04_0492.html", + "product_code":"dws", + "code":"265", + "des":"A query task that used to take a few milliseconds to complete is now requiring several seconds, and that used to take several seconds is now requiring even half an hour. ", + "doc_type":"devg", + "kw":"Low Query Efficiency,SQL Execution Troubleshooting,Developer Guide", + "title":"Low Query Efficiency", + "githuburl":"" + }, + { + "uri":"dws_04_0494.html", + "product_code":"dws", + "code":"266", + "des":"DROP TABLE fails to be executed in the following scenarios:A user runs the \\dt+ command using gsql and finds that the table_name table does not exist. When the user runs ", + "doc_type":"devg", + "kw":"DROP TABLE Fails to Be Executed,SQL Execution Troubleshooting,Developer Guide", + "title":"DROP TABLE Fails to Be Executed", + "githuburl":"" + }, + { + "uri":"dws_04_0495.html", + "product_code":"dws", + "code":"267", + "des":"Two users log in to the same database human_resource and run the select count(*) from areas statement separately to query the areas table, but obtain different results.Ch", + "doc_type":"devg", + "kw":"Different Data Is Displayed for the Same Table Queried By Multiple Users,SQL Execution Troubleshooti", + "title":"Different Data Is Displayed for the Same Table Queried By Multiple Users", + "githuburl":"" + }, + { + "uri":"dws_04_0496.html", + "product_code":"dws", + "code":"268", + "des":"The following error is reported during the integer conversion:Some data types cannot be converted to the target data type.Gradually narrow down the range of SQL statement", + "doc_type":"devg", + "kw":"An Error Occurs During the Integer Conversion,SQL Execution Troubleshooting,Developer Guide", + "title":"An Error Occurs During the Integer Conversion", + "githuburl":"" + }, + { + "uri":"dws_04_0497.html", + "product_code":"dws", + "code":"269", + "des":"With automatic retry (referred to as CN retry), GaussDB(DWS) retries an SQL statement when the execution of this statement fails. If an SQL statement sent from the gsql c", + "doc_type":"devg", + "kw":"Automatic Retry upon SQL Statement Execution Errors,SQL Execution Troubleshooting,Developer Guide", + "title":"Automatic Retry upon SQL Statement Execution Errors", + "githuburl":"" + }, + { + "uri":"dws_04_0970.html", + "product_code":"dws", + "code":"270", + "des":"To improve the cluster performance, you can use multiple methods to optimize the database, including hardware configuration, software driver upgrade, and internal paramet", + "doc_type":"devg", + "kw":"Common Performance Parameter Optimization Design,Query Performance Optimization,Developer Guide", + "title":"Common Performance Parameter Optimization Design", + "githuburl":"" + }, + { + "uri":"dws_04_0507.html", + "product_code":"dws", + "code":"271", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"User-Defined Functions", + "title":"User-Defined Functions", + "githuburl":"" + }, + { + "uri":"dws_04_0509.html", + "product_code":"dws", + "code":"272", + "des":"With the GaussDB(DWS) PL/Java functions, you can choose your favorite Java IDE to write Java methods and install the JAR files containing these methods into the GaussDB(D", + "doc_type":"devg", + "kw":"PL/Java Functions,User-Defined Functions,Developer Guide", + "title":"PL/Java Functions", + "githuburl":"" + }, + { + "uri":"dws_04_0511.html", + "product_code":"dws", + "code":"273", + "des":"PL/pgSQL is similar to PL/SQL of Oracle. It is a loadable procedural language.The functions created using PL/pgSQL can be used in any place where you can use built-in fun", + "doc_type":"devg", + "kw":"PL/pgSQL Functions,User-Defined Functions,Developer Guide", + "title":"PL/pgSQL Functions", + "githuburl":"" + }, + { + "uri":"dws_04_0512.html", + "product_code":"dws", + "code":"274", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Stored Procedures", + "title":"Stored Procedures", + "githuburl":"" + }, + { + "uri":"dws_04_0513.html", + "product_code":"dws", + "code":"275", + "des":"In GaussDB(DWS), business rules and logics are saved as stored procedures.A stored procedure is a combination of SQL, PL/SQL, and Java statements, enabling business rule ", + "doc_type":"devg", + "kw":"Stored Procedure,Stored Procedures,Developer Guide", + "title":"Stored Procedure", + "githuburl":"" + }, + { + "uri":"dws_04_0514.html", + "product_code":"dws", + "code":"276", + "des":"A data type refers to a value set and an operation set defined on the value set. A GaussDB(DWS) database consists of tables, each of which is defined by its own columns. ", + "doc_type":"devg", + "kw":"Data Types,Stored Procedures,Developer Guide", + "title":"Data Types", + "githuburl":"" + }, + { + "uri":"dws_04_0515.html", + "product_code":"dws", + "code":"277", + "des":"Certain data types in the database support implicit data type conversions, such as assignments and parameters invoked by functions. For other data types, you can use the ", + "doc_type":"devg", + "kw":"Data Type Conversion,Stored Procedures,Developer Guide", + "title":"Data Type Conversion", + "githuburl":"" + }, + { + "uri":"dws_04_0516.html", + "product_code":"dws", + "code":"278", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Arrays and Records", + "title":"Arrays and Records", + "githuburl":"" + }, + { + "uri":"dws_04_0517.html", + "product_code":"dws", + "code":"279", + "des":"Before the use of arrays, an array type needs to be defined:Define an array type immediately after the AS keyword in a stored procedure. Run the following statement:TYPE ", + "doc_type":"devg", + "kw":"Arrays,Arrays and Records,Developer Guide", + "title":"Arrays", + "githuburl":"" + }, + { + "uri":"dws_04_0518.html", + "product_code":"dws", + "code":"280", + "des":"Perform the following operations to create a record variable:Define a record type and use this type to declare a variable.For the syntax of the record type, see Figure 1.", + "doc_type":"devg", + "kw":"record,Arrays and Records,Developer Guide", + "title":"record", + "githuburl":"" + }, + { + "uri":"dws_04_0519.html", + "product_code":"dws", + "code":"281", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Syntax", + "title":"Syntax", + "githuburl":"" + }, + { + "uri":"dws_04_0520.html", + "product_code":"dws", + "code":"282", + "des":"A PL/SQL block can contain a sub-block which can be placed in any section. The following describes the architecture of a PL/SQL block:DECLARE: declares variables, types, ", + "doc_type":"devg", + "kw":"Basic Structure,Syntax,Developer Guide", + "title":"Basic Structure", + "githuburl":"" + }, + { + "uri":"dws_04_0521.html", + "product_code":"dws", + "code":"283", + "des":"An anonymous block applies to a script infrequently executed or a one-off activity. An anonymous block is executed in a session and is not stored.Figure 1 shows the synta", + "doc_type":"devg", + "kw":"Anonymous Block,Syntax,Developer Guide", + "title":"Anonymous Block", + "githuburl":"" + }, + { + "uri":"dws_04_0522.html", + "product_code":"dws", + "code":"284", + "des":"A subprogram stores stored procedures, functions, operators, and advanced packages. A subprogram created in a database can be called by other programs.", + "doc_type":"devg", + "kw":"Subprogram,Syntax,Developer Guide", + "title":"Subprogram", + "githuburl":"" + }, + { + "uri":"dws_04_0523.html", + "product_code":"dws", + "code":"285", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Basic Statements", + "title":"Basic Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0524.html", + "product_code":"dws", + "code":"286", + "des":"This section describes the declaration of variables in the PL/SQL and the scope of this variable in codes.For details about the variable declaration syntax, see Figure 1.", + "doc_type":"devg", + "kw":"Variable Definition Statement,Basic Statements,Developer Guide", + "title":"Variable Definition Statement", + "githuburl":"" + }, + { + "uri":"dws_04_0525.html", + "product_code":"dws", + "code":"287", + "des":"Figure 1 shows the syntax diagram for assigning a value to a variable.The above syntax diagram is explained as follows:variable_name indicates the name of a variable.valu", + "doc_type":"devg", + "kw":"Assignment Statement,Basic Statements,Developer Guide", + "title":"Assignment Statement", + "githuburl":"" + }, + { + "uri":"dws_04_0526.html", + "product_code":"dws", + "code":"288", + "des":"Figure 1 shows the syntax diagram for calling a clause.The above syntax diagram is explained as follows:procedure_name specifies the name of a stored procedure.parameter ", + "doc_type":"devg", + "kw":"Call Statement,Basic Statements,Developer Guide", + "title":"Call Statement", + "githuburl":"" + }, + { + "uri":"dws_04_0527.html", + "product_code":"dws", + "code":"289", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Dynamic Statements", + "title":"Dynamic Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0528.html", + "product_code":"dws", + "code":"290", + "des":"You can perform dynamic queries using EXECUTE IMMEDIATE or OPEN FOR in GaussDB(DWS). EXECUTE IMMEDIATE dynamically executes SELECT statements and OPEN FOR combines use of", + "doc_type":"devg", + "kw":"Executing Dynamic Query Statements,Dynamic Statements,Developer Guide", + "title":"Executing Dynamic Query Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0529.html", + "product_code":"dws", + "code":"291", + "des":"Figure 1 shows the syntax diagram.Figure 2 shows the syntax diagram for using_clause.The above syntax diagram is explained as follows:USING IN bind_argument is used to sp", + "doc_type":"devg", + "kw":"Executing Dynamic Non-query Statements,Dynamic Statements,Developer Guide", + "title":"Executing Dynamic Non-query Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0530.html", + "product_code":"dws", + "code":"292", + "des":"This section describes how to dynamically call store procedures. You must use anonymous statement blocks to package stored procedures or statement blocks and append IN an", + "doc_type":"devg", + "kw":"Dynamically Calling Stored Procedures,Dynamic Statements,Developer Guide", + "title":"Dynamically Calling Stored Procedures", + "githuburl":"" + }, + { + "uri":"dws_04_0531.html", + "product_code":"dws", + "code":"293", + "des":"This section describes how to execute anonymous blocks in dynamic statements. Append IN and OUT behind the EXECUTE IMMEDIATE...USING statement to input and output paramet", + "doc_type":"devg", + "kw":"Dynamically Calling Anonymous Blocks,Dynamic Statements,Developer Guide", + "title":"Dynamically Calling Anonymous Blocks", + "githuburl":"" + }, + { + "uri":"dws_04_0532.html", + "product_code":"dws", + "code":"294", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Control Statements", + "title":"Control Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0533.html", + "product_code":"dws", + "code":"295", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"RETURN Statements", + "title":"RETURN Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0534.html", + "product_code":"dws", + "code":"296", + "des":"Figure 1 shows the syntax diagram for a return statement.The syntax details are as follows:This statement returns control from a stored procedure or function to a caller.", + "doc_type":"devg", + "kw":"RETURN,RETURN Statements,Developer Guide", + "title":"RETURN", + "githuburl":"" + }, + { + "uri":"dws_04_0535.html", + "product_code":"dws", + "code":"297", + "des":"When creating a function, specify SETOF datatype for the return values.return_next_clause::=return_query_clause::=The syntax details are as follows:If a function needs to", + "doc_type":"devg", + "kw":"RETURN NEXT and RETURN QUERY,RETURN Statements,Developer Guide", + "title":"RETURN NEXT and RETURN QUERY", + "githuburl":"" + }, + { + "uri":"dws_04_0536.html", + "product_code":"dws", + "code":"298", + "des":"Conditional statements are used to decide whether given conditions are met. Operations are executed based on the decisions made.GaussDB(DWS) supports five usages of IF:IF", + "doc_type":"devg", + "kw":"Conditional Statements,Control Statements,Developer Guide", + "title":"Conditional Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0537.html", + "product_code":"dws", + "code":"299", + "des":"The syntax diagram is as follows.Example:The loop must be exploited together with EXIT; otherwise, a dead loop occurs.The syntax diagram is as follows.If the conditional ", + "doc_type":"devg", + "kw":"Loop Statements,Control Statements,Developer Guide", + "title":"Loop Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0538.html", + "product_code":"dws", + "code":"300", + "des":"Figure 1 shows the syntax diagram.Figure 2 shows the syntax diagram for when_clause.Parameter description:case_expression: specifies the variable or expression.when_expre", + "doc_type":"devg", + "kw":"Branch Statements,Control Statements,Developer Guide", + "title":"Branch Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0539.html", + "product_code":"dws", + "code":"301", + "des":"In PL/SQL programs, NULL statements are used to indicate \"nothing should be done\", equal to placeholders. They grant meanings to some statements and improve program reada", + "doc_type":"devg", + "kw":"NULL Statements,Control Statements,Developer Guide", + "title":"NULL Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0540.html", + "product_code":"dws", + "code":"302", + "des":"By default, any error occurring in a PL/SQL function aborts execution of the function, and indeed of the surrounding transaction as well. You can trap errors and restore ", + "doc_type":"devg", + "kw":"Error Trapping Statements,Control Statements,Developer Guide", + "title":"Error Trapping Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0541.html", + "product_code":"dws", + "code":"303", + "des":"The GOTO statement unconditionally transfers the control from the current statement to a labeled statement. The GOTO statement changes the execution logic. Therefore, use", + "doc_type":"devg", + "kw":"GOTO Statements,Control Statements,Developer Guide", + "title":"GOTO Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0542.html", + "product_code":"dws", + "code":"304", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Other Statements", + "title":"Other Statements", + "githuburl":"" + }, + { + "uri":"dws_04_0543.html", + "product_code":"dws", + "code":"305", + "des":"GaussDB(DWS) provides multiple lock modes to control concurrent accesses to table data. These modes are used when Multi-Version Concurrency Control (MVCC) cannot give exp", + "doc_type":"devg", + "kw":"Lock Operations,Other Statements,Developer Guide", + "title":"Lock Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0544.html", + "product_code":"dws", + "code":"306", + "des":"GaussDB(DWS) provides cursors as a data buffer for users to store execution results of SQL statements. Each cursor region has a name. Users can use SQL statements to obta", + "doc_type":"devg", + "kw":"Cursor Operations,Other Statements,Developer Guide", + "title":"Cursor Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0545.html", + "product_code":"dws", + "code":"307", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Cursors", + "title":"Cursors", + "githuburl":"" + }, + { + "uri":"dws_04_0546.html", + "product_code":"dws", + "code":"308", + "des":"To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers to context areas. With curs", + "doc_type":"devg", + "kw":"Overview,Cursors,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_04_0547.html", + "product_code":"dws", + "code":"309", + "des":"An explicit cursor is used to process query statements, particularly when the query results contain multiple records.An explicit cursor performs the following six PL/SQL ", + "doc_type":"devg", + "kw":"Explicit Cursor,Cursors,Developer Guide", + "title":"Explicit Cursor", + "githuburl":"" + }, + { + "uri":"dws_04_0548.html", + "product_code":"dws", + "code":"310", + "des":"The system automatically sets implicit cursors for non-query statements, such as ALTER and DROP, and creates work areas for these statements. These implicit cursors are n", + "doc_type":"devg", + "kw":"Implicit Cursor,Cursors,Developer Guide", + "title":"Implicit Cursor", + "githuburl":"" + }, + { + "uri":"dws_04_0549.html", + "product_code":"dws", + "code":"311", + "des":"The use of cursors in WHILE and LOOP statements is called a cursor loop. Generally, OPEN, FETCH, and CLOSE statements are needed in cursor loop. The following describes a", + "doc_type":"devg", + "kw":"Cursor Loop,Cursors,Developer Guide", + "title":"Cursor Loop", + "githuburl":"" + }, + { + "uri":"dws_04_0550.html", + "product_code":"dws", + "code":"312", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Advanced Packages", + "title":"Advanced Packages", + "githuburl":"" + }, + { + "uri":"dws_04_0551.html", + "product_code":"dws", + "code":"313", + "des":"Table 1 provides all interfaces supported by the DBMS_LOB package.DBMS_LOB.GETLENGTHSpecifies the length of a LOB type object obtained and returned by the stored procedur", + "doc_type":"devg", + "kw":"DBMS_LOB,Advanced Packages,Developer Guide", + "title":"DBMS_LOB", + "githuburl":"" + }, + { + "uri":"dws_04_0552.html", + "product_code":"dws", + "code":"314", + "des":"Table 1 provides all interfaces supported by the DBMS_RANDOM package.DBMS_RANDOM.SEEDThe stored procedure SEED is used to set a seed for a random number. The DBMS_RANDOM.", + "doc_type":"devg", + "kw":"DBMS_RANDOM,Advanced Packages,Developer Guide", + "title":"DBMS_RANDOM", + "githuburl":"" + }, + { + "uri":"dws_04_0553.html", + "product_code":"dws", + "code":"315", + "des":"Table 1 provides all interfaces supported by the DBMS_OUTPUT package.DBMS_OUTPUT.PUT_LINEThe PUT_LINE procedure writes a row of text carrying a line end symbol in the buf", + "doc_type":"devg", + "kw":"DBMS_OUTPUT,Advanced Packages,Developer Guide", + "title":"DBMS_OUTPUT", + "githuburl":"" + }, + { + "uri":"dws_04_0554.html", + "product_code":"dws", + "code":"316", + "des":"Table 1 provides all interfaces supported by the UTL_RAW package.The external representation of the RAW type data is hexadecimal and its internal storage form is binary. ", + "doc_type":"devg", + "kw":"UTL_RAW,Advanced Packages,Developer Guide", + "title":"UTL_RAW", + "githuburl":"" + }, + { + "uri":"dws_04_0555.html", + "product_code":"dws", + "code":"317", + "des":"Table 1 lists all interfaces supported by the DBMS_JOB package.DBMS_JOB.SUBMITThe stored procedure SUBMIT submits a job provided by the system.A prototype of the DBMS_JOB", + "doc_type":"devg", + "kw":"DBMS_JOB,Advanced Packages,Developer Guide", + "title":"DBMS_JOB", + "githuburl":"" + }, + { + "uri":"dws_04_0556.html", + "product_code":"dws", + "code":"318", + "des":"Table 1 lists interfaces supported by the DBMS_SQL package.You are advised to use dbms_sql.define_column and dbms_sql.column_value to define columns.If the size of the re", + "doc_type":"devg", + "kw":"DBMS_SQL,Advanced Packages,Developer Guide", + "title":"DBMS_SQL", + "githuburl":"" + }, + { + "uri":"dws_04_0558.html", + "product_code":"dws", + "code":"319", + "des":"RAISE has the following five syntax formats:Parameter description:The level option is used to specify the error level, that is, DEBUG, LOG, INFO, NOTICE, WARNING, or EXCE", + "doc_type":"devg", + "kw":"Debugging,Stored Procedures,Developer Guide", + "title":"Debugging", + "githuburl":"" + }, + { + "uri":"dws_04_0559.html", + "product_code":"dws", + "code":"320", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"System Catalogs and System Views", + "title":"System Catalogs and System Views", + "githuburl":"" + }, + { + "uri":"dws_04_0560.html", + "product_code":"dws", + "code":"321", + "des":"System catalogs are used by GaussDB(DWS) to store structure metadata. They are a core component the GaussDB(DWS) database system and provide control information for the d", + "doc_type":"devg", + "kw":"Overview of System Catalogs and System Views,System Catalogs and System Views,Developer Guide", + "title":"Overview of System Catalogs and System Views", + "githuburl":"" + }, + { + "uri":"dws_04_0561.html", + "product_code":"dws", + "code":"322", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"System Catalogs", + "title":"System Catalogs", + "githuburl":"" + }, + { + "uri":"dws_04_0562.html", + "product_code":"dws", + "code":"323", + "des":"GS_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table", + "doc_type":"devg", + "kw":"GS_OBSSCANINFO,System Catalogs,Developer Guide", + "title":"GS_OBSSCANINFO", + "githuburl":"" + }, + { + "uri":"dws_04_0564.html", + "product_code":"dws", + "code":"324", + "des":"The GS_WLM_INSTANCE_HISTORY system catalog stores information about resource usage related to CN or DN instances. Each record in the system table indicates the resource u", + "doc_type":"devg", + "kw":"GS_WLM_INSTANCE_HISTORY,System Catalogs,Developer Guide", + "title":"GS_WLM_INSTANCE_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0565.html", + "product_code":"dws", + "code":"325", + "des":"GS_WLM_OPERATOR_INFO records operators of completed jobs. The data is dumped from the kernel to a system catalog.This system catalog's schema is dbms_om.This system catal", + "doc_type":"devg", + "kw":"GS_WLM_OPERATOR_INFO,System Catalogs,Developer Guide", + "title":"GS_WLM_OPERATOR_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0566.html", + "product_code":"dws", + "code":"326", + "des":"GS_WLM_SESSION_INFO records load management information about a completed job executed on all CNs. The data is dumped from the kernel to a system catalog.This system cata", + "doc_type":"devg", + "kw":"GS_WLM_SESSION_INFO,System Catalogs,Developer Guide", + "title":"GS_WLM_SESSION_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0567.html", + "product_code":"dws", + "code":"327", + "des":"The GS_WLM_USER_RESOURCE_HISTORY system table stores information about resources used by users and is valid only on CNs. Each record in the system table indicates the res", + "doc_type":"devg", + "kw":"GS_WLM_USER_RESOURCE_HISTORY,System Catalogs,Developer Guide", + "title":"GS_WLM_USER_RESOURCE_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0568.html", + "product_code":"dws", + "code":"328", + "des":"pg_aggregate records information about aggregation functions. Each entry in pg_aggregate is an extension of an entry in pg_proc. The pg_proc entry carries the aggregate's", + "doc_type":"devg", + "kw":"PG_AGGREGATE,System Catalogs,Developer Guide", + "title":"PG_AGGREGATE", + "githuburl":"" + }, + { + "uri":"dws_04_0569.html", + "product_code":"dws", + "code":"329", + "des":"PG_AM records information about index access methods. There is one row for each index access method supported by the system.", + "doc_type":"devg", + "kw":"PG_AM,System Catalogs,Developer Guide", + "title":"PG_AM", + "githuburl":"" + }, + { + "uri":"dws_04_0570.html", + "product_code":"dws", + "code":"330", + "des":"PG_AMOP records information about operators associated with access method operator families. There is one row for each operator that is a member of an operator family. A ", + "doc_type":"devg", + "kw":"PG_AMOP,System Catalogs,Developer Guide", + "title":"PG_AMOP", + "githuburl":"" + }, + { + "uri":"dws_04_0571.html", + "product_code":"dws", + "code":"331", + "des":"PG_AMPROC records information about the support procedures associated with the access method operator families. There is one row for each support procedure belonging to a", + "doc_type":"devg", + "kw":"PG_AMPROC,System Catalogs,Developer Guide", + "title":"PG_AMPROC", + "githuburl":"" + }, + { + "uri":"dws_04_0572.html", + "product_code":"dws", + "code":"332", + "des":"PG_ATTRDEF stores default values of columns.", + "doc_type":"devg", + "kw":"PG_ATTRDEF,System Catalogs,Developer Guide", + "title":"PG_ATTRDEF", + "githuburl":"" + }, + { + "uri":"dws_04_0573.html", + "product_code":"dws", + "code":"333", + "des":"PG_ATTRIBUTE records information about table columns.", + "doc_type":"devg", + "kw":"PG_ATTRIBUTE,System Catalogs,Developer Guide", + "title":"PG_ATTRIBUTE", + "githuburl":"" + }, + { + "uri":"dws_04_0574.html", + "product_code":"dws", + "code":"334", + "des":"PG_AUTHID records information about the database authentication identifiers (roles). The concept of users is contained in that of roles. A user is actually a role whose r", + "doc_type":"devg", + "kw":"PG_AUTHID,System Catalogs,Developer Guide", + "title":"PG_AUTHID", + "githuburl":"" + }, + { + "uri":"dws_04_0575.html", + "product_code":"dws", + "code":"335", + "des":"PG_AUTH_HISTORY records the authentication history of the role. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"PG_AUTH_HISTORY,System Catalogs,Developer Guide", + "title":"PG_AUTH_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0576.html", + "product_code":"dws", + "code":"336", + "des":"PG_AUTH_MEMBERS records the membership relations between roles.", + "doc_type":"devg", + "kw":"PG_AUTH_MEMBERS,System Catalogs,Developer Guide", + "title":"PG_AUTH_MEMBERS", + "githuburl":"" + }, + { + "uri":"dws_04_0577.html", + "product_code":"dws", + "code":"337", + "des":"PG_CAST records conversion relationships between data types.", + "doc_type":"devg", + "kw":"PG_CAST,System Catalogs,Developer Guide", + "title":"PG_CAST", + "githuburl":"" + }, + { + "uri":"dws_04_0578.html", + "product_code":"dws", + "code":"338", + "des":"PG_CLASS records database objects and their relations.View the OID and relfilenode of a table.Count row-store tables.Count column-store tables.", + "doc_type":"devg", + "kw":"PG_CLASS,System Catalogs,Developer Guide", + "title":"PG_CLASS", + "githuburl":"" + }, + { + "uri":"dws_04_0579.html", + "product_code":"dws", + "code":"339", + "des":"PG_COLLATION records the available collations, which are essentially mappings from an SQL name to operating system locale categories.", + "doc_type":"devg", + "kw":"PG_COLLATION,System Catalogs,Developer Guide", + "title":"PG_COLLATION", + "githuburl":"" + }, + { + "uri":"dws_04_0580.html", + "product_code":"dws", + "code":"340", + "des":"PG_CONSTRAINT records check, primary key, unique, and foreign key constraints on the tables.consrc is not updated when referenced objects change; for example, it will not", + "doc_type":"devg", + "kw":"PG_CONSTRAINT,System Catalogs,Developer Guide", + "title":"PG_CONSTRAINT", + "githuburl":"" + }, + { + "uri":"dws_04_0581.html", + "product_code":"dws", + "code":"341", + "des":"PG_CONVERSION records encoding conversion information.", + "doc_type":"devg", + "kw":"PG_CONVERSION,System Catalogs,Developer Guide", + "title":"PG_CONVERSION", + "githuburl":"" + }, + { + "uri":"dws_04_0582.html", + "product_code":"dws", + "code":"342", + "des":"PG_DATABASE records information about the available databases.", + "doc_type":"devg", + "kw":"PG_DATABASE,System Catalogs,Developer Guide", + "title":"PG_DATABASE", + "githuburl":"" + }, + { + "uri":"dws_04_0583.html", + "product_code":"dws", + "code":"343", + "des":"PG_DB_ROLE_SETTING records the default values of configuration items bonded to each role and database when the database is running.", + "doc_type":"devg", + "kw":"PG_DB_ROLE_SETTING,System Catalogs,Developer Guide", + "title":"PG_DB_ROLE_SETTING", + "githuburl":"" + }, + { + "uri":"dws_04_0584.html", + "product_code":"dws", + "code":"344", + "des":"PG_DEFAULT_ACL records the initial privileges assigned to the newly created objects.Run the following command to view the initial permissions of the new user role1:You ca", + "doc_type":"devg", + "kw":"PG_DEFAULT_ACL,System Catalogs,Developer Guide", + "title":"PG_DEFAULT_ACL", + "githuburl":"" + }, + { + "uri":"dws_04_0585.html", + "product_code":"dws", + "code":"345", + "des":"PG_DEPEND records the dependency relationships between database objects. This information allows DROP commands to find which other objects must be dropped by DROP CASCADE", + "doc_type":"devg", + "kw":"PG_DEPEND,System Catalogs,Developer Guide", + "title":"PG_DEPEND", + "githuburl":"" + }, + { + "uri":"dws_04_0586.html", + "product_code":"dws", + "code":"346", + "des":"PG_DESCRIPTION records optional descriptions (comments) for each database object. Descriptions of many built-in system objects are provided in the initial contents of PG_", + "doc_type":"devg", + "kw":"PG_DESCRIPTION,System Catalogs,Developer Guide", + "title":"PG_DESCRIPTION", + "githuburl":"" + }, + { + "uri":"dws_04_0588.html", + "product_code":"dws", + "code":"347", + "des":"PG_ENUM records entries showing the values and labels for each enum type. The internal representation of a given enum value is actually the OID of its associated row in p", + "doc_type":"devg", + "kw":"PG_ENUM,System Catalogs,Developer Guide", + "title":"PG_ENUM", + "githuburl":"" + }, + { + "uri":"dws_04_0589.html", + "product_code":"dws", + "code":"348", + "des":"PG_EXTENSION records information about the installed extensions. By default, GaussDB(DWS) has 12 extensions, that is, PLPGSQL, DIST_FDW, FILE_FDW, HDFS_FDW, HSTORE, PLDBG", + "doc_type":"devg", + "kw":"PG_EXTENSION,System Catalogs,Developer Guide", + "title":"PG_EXTENSION", + "githuburl":"" + }, + { + "uri":"dws_04_0590.html", + "product_code":"dws", + "code":"349", + "des":"PG_EXTENSION_DATA_SOURCE records information about external data source. An external data source contains information about an external database, such as its password enc", + "doc_type":"devg", + "kw":"PG_EXTENSION_DATA_SOURCE,System Catalogs,Developer Guide", + "title":"PG_EXTENSION_DATA_SOURCE", + "githuburl":"" + }, + { + "uri":"dws_04_0591.html", + "product_code":"dws", + "code":"350", + "des":"PG_FOREIGN_DATA_WRAPPER records foreign-data wrapper definitions. A foreign-data wrapper is the mechanism by which external data, residing on foreign servers, is accessed", + "doc_type":"devg", + "kw":"PG_FOREIGN_DATA_WRAPPER,System Catalogs,Developer Guide", + "title":"PG_FOREIGN_DATA_WRAPPER", + "githuburl":"" + }, + { + "uri":"dws_04_0592.html", + "product_code":"dws", + "code":"351", + "des":"PG_FOREIGN_SERVER records the foreign server definitions. A foreign server describes a source of external data, such as a remote server. Foreign servers are accessed via ", + "doc_type":"devg", + "kw":"PG_FOREIGN_SERVER,System Catalogs,Developer Guide", + "title":"PG_FOREIGN_SERVER", + "githuburl":"" + }, + { + "uri":"dws_04_0593.html", + "product_code":"dws", + "code":"352", + "des":"PG_FOREIGN_TABLE records auxiliary information about foreign tables.", + "doc_type":"devg", + "kw":"PG_FOREIGN_TABLE,System Catalogs,Developer Guide", + "title":"PG_FOREIGN_TABLE", + "githuburl":"" + }, + { + "uri":"dws_04_0594.html", + "product_code":"dws", + "code":"353", + "des":"PG_INDEX records part of the information about indexes. The rest is mostly in PG_CLASS.", + "doc_type":"devg", + "kw":"PG_INDEX,System Catalogs,Developer Guide", + "title":"PG_INDEX", + "githuburl":"" + }, + { + "uri":"dws_04_0595.html", + "product_code":"dws", + "code":"354", + "des":"PG_INHERITS records information about table inheritance hierarchies. There is one entry for each direct child table in the database. Indirect inheritance can be determine", + "doc_type":"devg", + "kw":"PG_INHERITS,System Catalogs,Developer Guide", + "title":"PG_INHERITS", + "githuburl":"" + }, + { + "uri":"dws_04_0596.html", + "product_code":"dws", + "code":"355", + "des":"PG_JOBS records detailed information about jobs created by users. Dedicated threads poll the pg_jobs table and trigger jobs based on scheduled job execution time. This ta", + "doc_type":"devg", + "kw":"PG_JOBS,System Catalogs,Developer Guide", + "title":"PG_JOBS", + "githuburl":"" + }, + { + "uri":"dws_04_0597.html", + "product_code":"dws", + "code":"356", + "des":"PG_LANGUAGE records programming languages. You can use them and interfaces to write functions or stored procedures.", + "doc_type":"devg", + "kw":"PG_LANGUAGE,System Catalogs,Developer Guide", + "title":"PG_LANGUAGE", + "githuburl":"" + }, + { + "uri":"dws_04_0598.html", + "product_code":"dws", + "code":"357", + "des":"PG_LARGEOBJECT records the data making up large objects A large object is identified by an OID assigned when it is created. Each large object is broken into segments or \"", + "doc_type":"devg", + "kw":"PG_LARGEOBJECT,System Catalogs,Developer Guide", + "title":"PG_LARGEOBJECT", + "githuburl":"" + }, + { + "uri":"dws_04_0599.html", + "product_code":"dws", + "code":"358", + "des":"PG_LARGEOBJECT_METADATA records metadata associated with large objects. The actual large object data is stored in PG_LARGEOBJECT.", + "doc_type":"devg", + "kw":"PG_LARGEOBJECT_METADATA,System Catalogs,Developer Guide", + "title":"PG_LARGEOBJECT_METADATA", + "githuburl":"" + }, + { + "uri":"dws_04_0600.html", + "product_code":"dws", + "code":"359", + "des":"PG_NAMESPACE records the namespaces, that is, schema-related information.", + "doc_type":"devg", + "kw":"PG_NAMESPACE,System Catalogs,Developer Guide", + "title":"PG_NAMESPACE", + "githuburl":"" + }, + { + "uri":"dws_04_0601.html", + "product_code":"dws", + "code":"360", + "des":"PG_OBJECT records the user creation, creation time, last modification time, and last analyzing time of objects of specified types (types existing in object_type).Only nor", + "doc_type":"devg", + "kw":"PG_OBJECT,System Catalogs,Developer Guide", + "title":"PG_OBJECT", + "githuburl":"" + }, + { + "uri":"dws_04_0602.html", + "product_code":"dws", + "code":"361", + "des":"PG_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table", + "doc_type":"devg", + "kw":"PG_OBSSCANINFO,System Catalogs,Developer Guide", + "title":"PG_OBSSCANINFO", + "githuburl":"" + }, + { + "uri":"dws_04_0603.html", + "product_code":"dws", + "code":"362", + "des":"PG_OPCLASS defines index access method operator classes.Each operator class defines semantics for index columns of a particular data type and a particular index access me", + "doc_type":"devg", + "kw":"PG_OPCLASS,System Catalogs,Developer Guide", + "title":"PG_OPCLASS", + "githuburl":"" + }, + { + "uri":"dws_04_0604.html", + "product_code":"dws", + "code":"363", + "des":"PG_OPERATOR records information about operators.", + "doc_type":"devg", + "kw":"PG_OPERATOR,System Catalogs,Developer Guide", + "title":"PG_OPERATOR", + "githuburl":"" + }, + { + "uri":"dws_04_0605.html", + "product_code":"dws", + "code":"364", + "des":"PG_OPFAMILY defines operator families.Each operator family is a collection of operators and associated support routines that implement the semantics specified for a parti", + "doc_type":"devg", + "kw":"PG_OPFAMILY,System Catalogs,Developer Guide", + "title":"PG_OPFAMILY", + "githuburl":"" + }, + { + "uri":"dws_04_0606.html", + "product_code":"dws", + "code":"365", + "des":"PG_PARTITION records all partitioned tables, table partitions, toast tables on table partitions, and index partitions in the database. Partitioned index information is no", + "doc_type":"devg", + "kw":"PG_PARTITION,System Catalogs,Developer Guide", + "title":"PG_PARTITION", + "githuburl":"" + }, + { + "uri":"dws_04_0607.html", + "product_code":"dws", + "code":"366", + "des":"PG_PLTEMPLATE records template information for procedural languages.", + "doc_type":"devg", + "kw":"PG_PLTEMPLATE,System Catalogs,Developer Guide", + "title":"PG_PLTEMPLATE", + "githuburl":"" + }, + { + "uri":"dws_04_0608.html", + "product_code":"dws", + "code":"367", + "des":"PG_PROC records information about functions or procedures.Query the OID of a specified function. For example, obtain the OID 1295 of the justify_days function.Query wheth", + "doc_type":"devg", + "kw":"PG_PROC,System Catalogs,Developer Guide", + "title":"PG_PROC", + "githuburl":"" + }, + { + "uri":"dws_04_0609.html", + "product_code":"dws", + "code":"368", + "des":"PG_RANGE records information about range types.This is in addition to the types' entries in PG_TYPE.rngsubopc (plus rngcollation, if the element type is collatable) deter", + "doc_type":"devg", + "kw":"PG_RANGE,System Catalogs,Developer Guide", + "title":"PG_RANGE", + "githuburl":"" + }, + { + "uri":"dws_04_0610.html", + "product_code":"dws", + "code":"369", + "des":"PG_REDACTION_COLUMN records the information about the redacted columns.", + "doc_type":"devg", + "kw":"PG_REDACTION_COLUMN,System Catalogs,Developer Guide", + "title":"PG_REDACTION_COLUMN", + "githuburl":"" + }, + { + "uri":"dws_04_0611.html", + "product_code":"dws", + "code":"370", + "des":"PG_REDACTION_POLICY records information about the object to be redacted.", + "doc_type":"devg", + "kw":"PG_REDACTION_POLICY,System Catalogs,Developer Guide", + "title":"PG_REDACTION_POLICY", + "githuburl":"" + }, + { + "uri":"dws_04_0612.html", + "product_code":"dws", + "code":"371", + "des":"PG_RLSPOLICY displays the information about row-level access control policies.", + "doc_type":"devg", + "kw":"PG_RLSPOLICY,System Catalogs,Developer Guide", + "title":"PG_RLSPOLICY", + "githuburl":"" + }, + { + "uri":"dws_04_0613.html", + "product_code":"dws", + "code":"372", + "des":"PG_RESOURCE_POOL records the information about database resource pool.", + "doc_type":"devg", + "kw":"PG_RESOURCE_POOL,System Catalogs,Developer Guide", + "title":"PG_RESOURCE_POOL", + "githuburl":"" + }, + { + "uri":"dws_04_0614.html", + "product_code":"dws", + "code":"373", + "des":"PG_REWRITE records rewrite rules defined for tables and views.", + "doc_type":"devg", + "kw":"PG_REWRITE,System Catalogs,Developer Guide", + "title":"PG_REWRITE", + "githuburl":"" + }, + { + "uri":"dws_04_0615.html", + "product_code":"dws", + "code":"374", + "des":"PG_SECLABEL records security labels on database objects.See also PG_SHSECLABEL, which performs a similar function for security labels of database objects that are shared ", + "doc_type":"devg", + "kw":"PG_SECLABEL,System Catalogs,Developer Guide", + "title":"PG_SECLABEL", + "githuburl":"" + }, + { + "uri":"dws_04_0616.html", + "product_code":"dws", + "code":"375", + "des":"PG_SHDEPEND records the dependency relationships between database objects and shared objects, such as roles. This information allows GaussDB(DWS) to ensure that those obj", + "doc_type":"devg", + "kw":"PG_SHDEPEND,System Catalogs,Developer Guide", + "title":"PG_SHDEPEND", + "githuburl":"" + }, + { + "uri":"dws_04_0617.html", + "product_code":"dws", + "code":"376", + "des":"PG_SHDESCRIPTION records optional comments for shared database objects. Descriptions can be manipulated with the COMMENT command and viewed with psql's \\d commands.See al", + "doc_type":"devg", + "kw":"PG_SHDESCRIPTION,System Catalogs,Developer Guide", + "title":"PG_SHDESCRIPTION", + "githuburl":"" + }, + { + "uri":"dws_04_0618.html", + "product_code":"dws", + "code":"377", + "des":"PG_SHSECLABEL records security labels on shared database objects. Security labels can be manipulated with the SECURITY LABEL command.For an easier way to view security la", + "doc_type":"devg", + "kw":"PG_SHSECLABEL,System Catalogs,Developer Guide", + "title":"PG_SHSECLABEL", + "githuburl":"" + }, + { + "uri":"dws_04_0619.html", + "product_code":"dws", + "code":"378", + "des":"PG_STATISTIC records statistics about tables and index columns in a database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"PG_STATISTIC,System Catalogs,Developer Guide", + "title":"PG_STATISTIC", + "githuburl":"" + }, + { + "uri":"dws_04_0620.html", + "product_code":"dws", + "code":"379", + "des":"PG_STATISTIC_EXT records the extended statistics of tables in a database, such as statistics of multiple columns. Statistics of expressions will be supported later. You c", + "doc_type":"devg", + "kw":"PG_STATISTIC_EXT,System Catalogs,Developer Guide", + "title":"PG_STATISTIC_EXT", + "githuburl":"" + }, + { + "uri":"dws_04_0621.html", + "product_code":"dws", + "code":"380", + "des":"PG_SYNONYM records the mapping between synonym object names and other database object names.", + "doc_type":"devg", + "kw":"PG_SYNONYM,System Catalogs,Developer Guide", + "title":"PG_SYNONYM", + "githuburl":"" + }, + { + "uri":"dws_04_0622.html", + "product_code":"dws", + "code":"381", + "des":"PG_TABLESPACE records tablespace information.", + "doc_type":"devg", + "kw":"PG_TABLESPACE,System Catalogs,Developer Guide", + "title":"PG_TABLESPACE", + "githuburl":"" + }, + { + "uri":"dws_04_0623.html", + "product_code":"dws", + "code":"382", + "des":"PG_TRIGGER records the trigger information.", + "doc_type":"devg", + "kw":"PG_TRIGGER,System Catalogs,Developer Guide", + "title":"PG_TRIGGER", + "githuburl":"" + }, + { + "uri":"dws_04_0624.html", + "product_code":"dws", + "code":"383", + "des":"PG_TS_CONFIG records entries representing text search configurations. A configuration specifies a particular text search parser and a list of dictionaries to use for each", + "doc_type":"devg", + "kw":"PG_TS_CONFIG,System Catalogs,Developer Guide", + "title":"PG_TS_CONFIG", + "githuburl":"" + }, + { + "uri":"dws_04_0625.html", + "product_code":"dws", + "code":"384", + "des":"PG_TS_CONFIG_MAP records entries showing which text search dictionaries should be consulted, and in what order, for each output token type of each text search configurati", + "doc_type":"devg", + "kw":"PG_TS_CONFIG_MAP,System Catalogs,Developer Guide", + "title":"PG_TS_CONFIG_MAP", + "githuburl":"" + }, + { + "uri":"dws_04_0626.html", + "product_code":"dws", + "code":"385", + "des":"PG_TS_DICT records entries that define text search dictionaries. A dictionary depends on a text search template, which specifies all the implementation functions needed. ", + "doc_type":"devg", + "kw":"PG_TS_DICT,System Catalogs,Developer Guide", + "title":"PG_TS_DICT", + "githuburl":"" + }, + { + "uri":"dws_04_0627.html", + "product_code":"dws", + "code":"386", + "des":"PG_TS_PARSER records entries defining text search parsers. A parser splits input text into lexemes and assigns a token type to each lexeme. Since a parser must be impleme", + "doc_type":"devg", + "kw":"PG_TS_PARSER,System Catalogs,Developer Guide", + "title":"PG_TS_PARSER", + "githuburl":"" + }, + { + "uri":"dws_04_0628.html", + "product_code":"dws", + "code":"387", + "des":"PG_TS_TEMPLATE records entries defining text search templates. A template provides a framework for text search dictionaries. Since a template must be implemented by C fun", + "doc_type":"devg", + "kw":"PG_TS_TEMPLATE,System Catalogs,Developer Guide", + "title":"PG_TS_TEMPLATE", + "githuburl":"" + }, + { + "uri":"dws_04_0629.html", + "product_code":"dws", + "code":"388", + "des":"PG_TYPE records the information about data types.", + "doc_type":"devg", + "kw":"PG_TYPE,System Catalogs,Developer Guide", + "title":"PG_TYPE", + "githuburl":"" + }, + { + "uri":"dws_04_0630.html", + "product_code":"dws", + "code":"389", + "des":"PG_USER_MAPPING records the mappings from local users to remote.It is accessible only to users with system administrator rights. You can use view PG_USER_MAPPINGS to quer", + "doc_type":"devg", + "kw":"PG_USER_MAPPING,System Catalogs,Developer Guide", + "title":"PG_USER_MAPPING", + "githuburl":"" + }, + { + "uri":"dws_04_0631.html", + "product_code":"dws", + "code":"390", + "des":"PG_USER_STATUS records the states of users that access to the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"PG_USER_STATUS,System Catalogs,Developer Guide", + "title":"PG_USER_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0632.html", + "product_code":"dws", + "code":"391", + "des":"PG_WORKLOAD_ACTION records information about query_band.", + "doc_type":"devg", + "kw":"PG_WORKLOAD_ACTION,System Catalogs,Developer Guide", + "title":"PG_WORKLOAD_ACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0633.html", + "product_code":"dws", + "code":"392", + "des":"PGXC_CLASS records the replicated or distributed information for each table.", + "doc_type":"devg", + "kw":"PGXC_CLASS,System Catalogs,Developer Guide", + "title":"PGXC_CLASS", + "githuburl":"" + }, + { + "uri":"dws_04_0634.html", + "product_code":"dws", + "code":"393", + "des":"PGXC_GROUP records information about node groups.", + "doc_type":"devg", + "kw":"PGXC_GROUP,System Catalogs,Developer Guide", + "title":"PGXC_GROUP", + "githuburl":"" + }, + { + "uri":"dws_04_0635.html", + "product_code":"dws", + "code":"394", + "des":"PGXC_NODE records information about cluster nodes.Query the CN and DN information of the cluster:", + "doc_type":"devg", + "kw":"PGXC_NODE,System Catalogs,Developer Guide", + "title":"PGXC_NODE", + "githuburl":"" + }, + { + "uri":"dws_04_0639.html", + "product_code":"dws", + "code":"395", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"System Views", + "title":"System Views", + "githuburl":"" + }, + { + "uri":"dws_04_0640.html", + "product_code":"dws", + "code":"396", + "des":"ALL_ALL_TABLES displays the tables or views accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_ALL_TABLES,System Views,Developer Guide", + "title":"ALL_ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0641.html", + "product_code":"dws", + "code":"397", + "des":"ALL_CONSTRAINTS displays information about constraints accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_CONSTRAINTS,System Views,Developer Guide", + "title":"ALL_CONSTRAINTS", + "githuburl":"" + }, + { + "uri":"dws_04_0642.html", + "product_code":"dws", + "code":"398", + "des":"ALL_CONS_COLUMNS displays information about constraint columns accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_CONS_COLUMNS,System Views,Developer Guide", + "title":"ALL_CONS_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0643.html", + "product_code":"dws", + "code":"399", + "des":"ALL_COL_COMMENTS displays the comment information about table columns accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_COL_COMMENTS,System Views,Developer Guide", + "title":"ALL_COL_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0644.html", + "product_code":"dws", + "code":"400", + "des":"ALL_DEPENDENCIES displays dependencies between functions and advanced packages accessible to the current user.Currently in GaussDB(DWS), this table is empty without any r", + "doc_type":"devg", + "kw":"ALL_DEPENDENCIES,System Views,Developer Guide", + "title":"ALL_DEPENDENCIES", + "githuburl":"" + }, + { + "uri":"dws_04_0645.html", + "product_code":"dws", + "code":"401", + "des":"ALL_IND_COLUMNS displays all index columns accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_IND_COLUMNS,System Views,Developer Guide", + "title":"ALL_IND_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0646.html", + "product_code":"dws", + "code":"402", + "des":"ALL_IND_EXPRESSIONS displays information about the expression indexes accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_IND_EXPRESSIONS,System Views,Developer Guide", + "title":"ALL_IND_EXPRESSIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0647.html", + "product_code":"dws", + "code":"403", + "des":"ALL_INDEXES displays information about indexes accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_INDEXES,System Views,Developer Guide", + "title":"ALL_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0648.html", + "product_code":"dws", + "code":"404", + "des":"ALL_OBJECTS displays all database objects accessible to the current user.For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.", + "doc_type":"devg", + "kw":"ALL_OBJECTS,System Views,Developer Guide", + "title":"ALL_OBJECTS", + "githuburl":"" + }, + { + "uri":"dws_04_0649.html", + "product_code":"dws", + "code":"405", + "des":"ALL_PROCEDURES displays information about all stored procedures or functions accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_PROCEDURES,System Views,Developer Guide", + "title":"ALL_PROCEDURES", + "githuburl":"" + }, + { + "uri":"dws_04_0650.html", + "product_code":"dws", + "code":"406", + "des":"ALL_SEQUENCES displays all sequences accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_SEQUENCES,System Views,Developer Guide", + "title":"ALL_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0651.html", + "product_code":"dws", + "code":"407", + "des":"ALL_SOURCE displays information about stored procedures or functions accessible to the current user, and provides the columns defined by the stored procedures and functio", + "doc_type":"devg", + "kw":"ALL_SOURCE,System Views,Developer Guide", + "title":"ALL_SOURCE", + "githuburl":"" + }, + { + "uri":"dws_04_0652.html", + "product_code":"dws", + "code":"408", + "des":"ALL_SYNONYMS displays all synonyms accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_SYNONYMS,System Views,Developer Guide", + "title":"ALL_SYNONYMS", + "githuburl":"" + }, + { + "uri":"dws_04_0653.html", + "product_code":"dws", + "code":"409", + "des":"ALL_TAB_COLUMNS displays description information about columns of the tables accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_TAB_COLUMNS,System Views,Developer Guide", + "title":"ALL_TAB_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0654.html", + "product_code":"dws", + "code":"410", + "des":"ALL_TAB_COMMENTS displays comments about all tables and views accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_TAB_COMMENTS,System Views,Developer Guide", + "title":"ALL_TAB_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0655.html", + "product_code":"dws", + "code":"411", + "des":"ALL_TABLES displays all the tables accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_TABLES,System Views,Developer Guide", + "title":"ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0656.html", + "product_code":"dws", + "code":"412", + "des":"ALL_USERS displays all users of the database visible to the current user, however, it does not describe the users.", + "doc_type":"devg", + "kw":"ALL_USERS,System Views,Developer Guide", + "title":"ALL_USERS", + "githuburl":"" + }, + { + "uri":"dws_04_0657.html", + "product_code":"dws", + "code":"413", + "des":"ALL_VIEWS displays the description about all views accessible to the current user.", + "doc_type":"devg", + "kw":"ALL_VIEWS,System Views,Developer Guide", + "title":"ALL_VIEWS", + "githuburl":"" + }, + { + "uri":"dws_04_0658.html", + "product_code":"dws", + "code":"414", + "des":"DBA_DATA_FILES displays the description of database files. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_DATA_FILES,System Views,Developer Guide", + "title":"DBA_DATA_FILES", + "githuburl":"" + }, + { + "uri":"dws_04_0659.html", + "product_code":"dws", + "code":"415", + "des":"DBA_USERS displays all user names in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_USERS,System Views,Developer Guide", + "title":"DBA_USERS", + "githuburl":"" + }, + { + "uri":"dws_04_0660.html", + "product_code":"dws", + "code":"416", + "des":"DBA_COL_COMMENTS displays information about table colum comments in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_COL_COMMENTS,System Views,Developer Guide", + "title":"DBA_COL_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0661.html", + "product_code":"dws", + "code":"417", + "des":"DBA_CONSTRAINTS displays information about table constraints in database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_CONSTRAINTS,System Views,Developer Guide", + "title":"DBA_CONSTRAINTS", + "githuburl":"" + }, + { + "uri":"dws_04_0662.html", + "product_code":"dws", + "code":"418", + "des":"DBA_CONS_COLUMNS displays information about constraint columns in database tables. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_CONS_COLUMNS,System Views,Developer Guide", + "title":"DBA_CONS_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0663.html", + "product_code":"dws", + "code":"419", + "des":"DBA_IND_COLUMNS displays column information about all indexes in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_IND_COLUMNS,System Views,Developer Guide", + "title":"DBA_IND_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0664.html", + "product_code":"dws", + "code":"420", + "des":"DBA_IND_EXPRESSIONS displays the information about expression indexes in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_IND_EXPRESSIONS,System Views,Developer Guide", + "title":"DBA_IND_EXPRESSIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0665.html", + "product_code":"dws", + "code":"421", + "des":"DBA_IND_PARTITIONS displays information about all index partitions in the database. Each index partition of a partitioned table in the database, if present, has a row of ", + "doc_type":"devg", + "kw":"DBA_IND_PARTITIONS,System Views,Developer Guide", + "title":"DBA_IND_PARTITIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0666.html", + "product_code":"dws", + "code":"422", + "des":"DBA_INDEXES displays all indexes in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_INDEXES,System Views,Developer Guide", + "title":"DBA_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0667.html", + "product_code":"dws", + "code":"423", + "des":"DBA_OBJECTS displays all database objects in the database. It is accessible only to users with system administrator rights.For details about the value ranges of last_ddl_", + "doc_type":"devg", + "kw":"DBA_OBJECTS,System Views,Developer Guide", + "title":"DBA_OBJECTS", + "githuburl":"" + }, + { + "uri":"dws_04_0668.html", + "product_code":"dws", + "code":"424", + "des":"DBA_PART_INDEXES displays information about all partitioned table indexes in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_PART_INDEXES,System Views,Developer Guide", + "title":"DBA_PART_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0669.html", + "product_code":"dws", + "code":"425", + "des":"DBA_PART_TABLES displays information about all partitioned tables in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_PART_TABLES,System Views,Developer Guide", + "title":"DBA_PART_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0670.html", + "product_code":"dws", + "code":"426", + "des":"DBA_PROCEDURES displays information about all stored procedures and functions in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_PROCEDURES,System Views,Developer Guide", + "title":"DBA_PROCEDURES", + "githuburl":"" + }, + { + "uri":"dws_04_0671.html", + "product_code":"dws", + "code":"427", + "des":"DBA_SEQUENCES displays information about all sequences in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_SEQUENCES,System Views,Developer Guide", + "title":"DBA_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0672.html", + "product_code":"dws", + "code":"428", + "des":"DBA_SOURCE displays all stored procedures or functions in the database, and it provides the columns defined by the stored procedures or functions. It is accessible only t", + "doc_type":"devg", + "kw":"DBA_SOURCE,System Views,Developer Guide", + "title":"DBA_SOURCE", + "githuburl":"" + }, + { + "uri":"dws_04_0673.html", + "product_code":"dws", + "code":"429", + "des":"DBA_SYNONYMS displays all synonyms in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_SYNONYMS,System Views,Developer Guide", + "title":"DBA_SYNONYMS", + "githuburl":"" + }, + { + "uri":"dws_04_0674.html", + "product_code":"dws", + "code":"430", + "des":"DBA_TAB_COLUMNS displays the columns of tables. Each column of a table in the database has a row in DBA_TAB_COLUMNS. It is accessible only to users with system administra", + "doc_type":"devg", + "kw":"DBA_TAB_COLUMNS,System Views,Developer Guide", + "title":"DBA_TAB_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0675.html", + "product_code":"dws", + "code":"431", + "des":"DBA_TAB_COMMENTS displays comments about all tables and views in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_TAB_COMMENTS,System Views,Developer Guide", + "title":"DBA_TAB_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0676.html", + "product_code":"dws", + "code":"432", + "des":"DBA_TAB_PARTITIONS displays information about all partitions in the database.", + "doc_type":"devg", + "kw":"DBA_TAB_PARTITIONS,System Views,Developer Guide", + "title":"DBA_TAB_PARTITIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0677.html", + "product_code":"dws", + "code":"433", + "des":"DBA_TABLES displays all tables in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_TABLES,System Views,Developer Guide", + "title":"DBA_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0678.html", + "product_code":"dws", + "code":"434", + "des":"DBA_TABLESPACES displays information about available tablespaces. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_TABLESPACES,System Views,Developer Guide", + "title":"DBA_TABLESPACES", + "githuburl":"" + }, + { + "uri":"dws_04_0679.html", + "product_code":"dws", + "code":"435", + "des":"DBA_TRIGGERS displays information about triggers in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_TRIGGERS,System Views,Developer Guide", + "title":"DBA_TRIGGERS", + "githuburl":"" + }, + { + "uri":"dws_04_0680.html", + "product_code":"dws", + "code":"436", + "des":"DBA_VIEWS displays views in the database. It is accessible only to users with system administrator rights.", + "doc_type":"devg", + "kw":"DBA_VIEWS,System Views,Developer Guide", + "title":"DBA_VIEWS", + "githuburl":"" + }, + { + "uri":"dws_04_0681.html", + "product_code":"dws", + "code":"437", + "des":"DUAL is automatically created by the database based on the data dictionary. It has only one text column in only one row for storing expression calculation results. It is ", + "doc_type":"devg", + "kw":"DUAL,System Views,Developer Guide", + "title":"DUAL", + "githuburl":"" + }, + { + "uri":"dws_04_0682.html", + "product_code":"dws", + "code":"438", + "des":"GLOBAL_REDO_STAT displays the total statistics of XLOG redo operations on all nodes in a cluster. Except the avgiotim column (indicating the average redo write time of al", + "doc_type":"devg", + "kw":"GLOBAL_REDO_STAT,System Views,Developer Guide", + "title":"GLOBAL_REDO_STAT", + "githuburl":"" + }, + { + "uri":"dws_04_0683.html", + "product_code":"dws", + "code":"439", + "des":"GLOBAL_REL_IOSTAT displays the total disk I/O statistics of all nodes in a cluster. The name of each column in this view is the same as that in the GS_REL_IOSTAT view, bu", + "doc_type":"devg", + "kw":"GLOBAL_REL_IOSTAT,System Views,Developer Guide", + "title":"GLOBAL_REL_IOSTAT", + "githuburl":"" + }, + { + "uri":"dws_04_0684.html", + "product_code":"dws", + "code":"440", + "des":"GLOBAL_STAT_DATABASE displays the status and statistics of databases on all nodes in a cluster.When you query the GLOBAL_STAT_DATABASE view on a CN, the respective values", + "doc_type":"devg", + "kw":"GLOBAL_STAT_DATABASE,System Views,Developer Guide", + "title":"GLOBAL_STAT_DATABASE", + "githuburl":"" + }, + { + "uri":"dws_04_0685.html", + "product_code":"dws", + "code":"441", + "des":"GLOBAL_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in all workload Cgroups in a cluster, including the number of SELECT, UPDATE, INSER", + "doc_type":"devg", + "kw":"GLOBAL_WORKLOAD_SQL_COUNT,System Views,Developer Guide", + "title":"GLOBAL_WORKLOAD_SQL_COUNT", + "githuburl":"" + }, + { + "uri":"dws_04_0686.html", + "product_code":"dws", + "code":"442", + "des":"GLOBAL_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in all workload Cgroups in a cluster, including the maximum, minimum, average, ", + "doc_type":"devg", + "kw":"GLOBAL_WORKLOAD_SQL_ELAPSE_TIME,System Views,Developer Guide", + "title":"GLOBAL_WORKLOAD_SQL_ELAPSE_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0687.html", + "product_code":"dws", + "code":"443", + "des":"GLOBAL_WORKLOAD_TRANSACTION provides the total transaction information about workload Cgroups on all CNs in the cluster. This view is accessible only to users with system", + "doc_type":"devg", + "kw":"GLOBAL_WORKLOAD_TRANSACTION,System Views,Developer Guide", + "title":"GLOBAL_WORKLOAD_TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0688.html", + "product_code":"dws", + "code":"444", + "des":"GS_ALL_CONTROL_GROUP_INFO displays all Cgroup information in a database.", + "doc_type":"devg", + "kw":"GS_ALL_CONTROL_GROUP_INFO,System Views,Developer Guide", + "title":"GS_ALL_CONTROL_GROUP_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0689.html", + "product_code":"dws", + "code":"445", + "des":"GS_CLUSTER_RESOURCE_INFO displays a DN resource summary.", + "doc_type":"devg", + "kw":"GS_CLUSTER_RESOURCE_INFO,System Views,Developer Guide", + "title":"GS_CLUSTER_RESOURCE_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0690.html", + "product_code":"dws", + "code":"446", + "des":"The database parses each received SQL text string and generates an internal parsing tree. The database traverses the parsing tree and ignores constant values in the parsi", + "doc_type":"devg", + "kw":"GS_INSTR_UNIQUE_SQL,System Views,Developer Guide", + "title":"GS_INSTR_UNIQUE_SQL", + "githuburl":"" + }, + { + "uri":"dws_04_0691.html", + "product_code":"dws", + "code":"447", + "des":"GS_REL_IOSTAT displays disk I/O statistics on the current node. In the current version, only one page is read or written in each read or write operation. Therefore, the n", + "doc_type":"devg", + "kw":"GS_REL_IOSTAT,System Views,Developer Guide", + "title":"GS_REL_IOSTAT", + "githuburl":"" + }, + { + "uri":"dws_04_0692.html", + "product_code":"dws", + "code":"448", + "des":"The GS_NODE_STAT_RESET_TIME view provides the reset time of statistics on the current node and returns the timestamp with the time zone. For details, see the get_node_sta", + "doc_type":"devg", + "kw":"GS_NODE_STAT_RESET_TIME,System Views,Developer Guide", + "title":"GS_NODE_STAT_RESET_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0693.html", + "product_code":"dws", + "code":"449", + "des":"GS_SESSION_CPU_STATISTICS displays load management information about CPU usage of ongoing complex jobs executed by the current user.", + "doc_type":"devg", + "kw":"GS_SESSION_CPU_STATISTICS,System Views,Developer Guide", + "title":"GS_SESSION_CPU_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0694.html", + "product_code":"dws", + "code":"450", + "des":"GS_SESSION_MEMORY_STATISTICS displays load management information about memory usage of ongoing complex jobs executed by the current user.", + "doc_type":"devg", + "kw":"GS_SESSION_MEMORY_STATISTICS,System Views,Developer Guide", + "title":"GS_SESSION_MEMORY_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0695.html", + "product_code":"dws", + "code":"451", + "des":"GS_SQL_COUNT displays statistics about the five types of statements (SELECT, INSERT, UPDATE, DELETE, and MERGE INTO) executed on the current node of the database, includi", + "doc_type":"devg", + "kw":"GS_SQL_COUNT,System Views,Developer Guide", + "title":"GS_SQL_COUNT", + "githuburl":"" + }, + { + "uri":"dws_04_0696.html", + "product_code":"dws", + "code":"452", + "des":"GS_WAIT_EVENTS displays statistics about waiting status and events on the current node.The values of statistical columns in this view are accumulated only when the enable", + "doc_type":"devg", + "kw":"GS_WAIT_EVENTS,System Views,Developer Guide", + "title":"GS_WAIT_EVENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0701.html", + "product_code":"dws", + "code":"453", + "des":"This view displays the execution information about operators in the query statements that have been executed on the current CN. The information comes from the system cata", + "doc_type":"devg", + "kw":"GS_WLM_OPERAROR_INFO,System Views,Developer Guide", + "title":"GS_WLM_OPERAROR_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0702.html", + "product_code":"dws", + "code":"454", + "des":"This view displays the records of operators in jobs that have been executed by the current user on the current CN.This view is used by Database Manager to query data from", + "doc_type":"devg", + "kw":"GS_WLM_OPERATOR_HISTORY,System Views,Developer Guide", + "title":"GS_WLM_OPERATOR_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0703.html", + "product_code":"dws", + "code":"455", + "des":"GS_WLM_OPERATOR_STATISTICS displays the operators of the jobs that are being executed by the current user.", + "doc_type":"devg", + "kw":"GS_WLM_OPERATOR_STATISTICS,System Views,Developer Guide", + "title":"GS_WLM_OPERATOR_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0704.html", + "product_code":"dws", + "code":"456", + "des":"This view displays the execution information about the query statements that have been executed on the current CN. The information comes from the system catalog dbms_om. ", + "doc_type":"devg", + "kw":"GS_WLM_SESSION_INFO,System Views,Developer Guide", + "title":"GS_WLM_SESSION_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0705.html", + "product_code":"dws", + "code":"457", + "des":"GS_WLM_SESSION_HISTORY displays load management information about a completed job executed by the current user on the current CN. This view is used by Database Manager to", + "doc_type":"devg", + "kw":"GS_WLM_SESSION_HISTORY,System Views,Developer Guide", + "title":"GS_WLM_SESSION_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0706.html", + "product_code":"dws", + "code":"458", + "des":"GS_WLM_SESSION_STATISTICS displays load management information about jobs being executed by the current user on the current CN.", + "doc_type":"devg", + "kw":"GS_WLM_SESSION_STATISTICS,System Views,Developer Guide", + "title":"GS_WLM_SESSION_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0708.html", + "product_code":"dws", + "code":"459", + "des":"GS_WLM_SQL_ALLOW displays the configured resource management SQL whitelist, including the default SQL whitelist and the SQL whitelist configured using the GUC parameter w", + "doc_type":"devg", + "kw":"GS_WLM_SQL_ALLOW,System Views,Developer Guide", + "title":"GS_WLM_SQL_ALLOW", + "githuburl":"" + }, + { + "uri":"dws_04_0709.html", + "product_code":"dws", + "code":"460", + "des":"GS_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on the current node, including the number of SELECT, UPDATE, INSERT", + "doc_type":"devg", + "kw":"GS_WORKLOAD_SQL_COUNT,System Views,Developer Guide", + "title":"GS_WORKLOAD_SQL_COUNT", + "githuburl":"" + }, + { + "uri":"dws_04_0710.html", + "product_code":"dws", + "code":"461", + "des":"GS_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on the current node, including the maximum, minimum, average, a", + "doc_type":"devg", + "kw":"GS_WORKLOAD_SQL_ELAPSE_TIME,System Views,Developer Guide", + "title":"GS_WORKLOAD_SQL_ELAPSE_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0711.html", + "product_code":"dws", + "code":"462", + "des":"GS_WORKLOAD_TRANSACTION provides transaction information about workload cgroups on a single CN. The database records the number of times that each workload Cgroup commits", + "doc_type":"devg", + "kw":"GS_WORKLOAD_TRANSACTION,System Views,Developer Guide", + "title":"GS_WORKLOAD_TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0712.html", + "product_code":"dws", + "code":"463", + "des":"GS_STAT_DB_CU displsys CU hits in a database and in each node in a cluster. You can clear it using gs_stat_reset().", + "doc_type":"devg", + "kw":"GS_STAT_DB_CU,System Views,Developer Guide", + "title":"GS_STAT_DB_CU", + "githuburl":"" + }, + { + "uri":"dws_04_0713.html", + "product_code":"dws", + "code":"464", + "des":"GS_STAT_SESSION_CU displays the CU hit rate of running sessions on each node in a cluster. This data about a session is cleared when you exit this session or restart the ", + "doc_type":"devg", + "kw":"GS_STAT_SESSION_CU,System Views,Developer Guide", + "title":"GS_STAT_SESSION_CU", + "githuburl":"" + }, + { + "uri":"dws_04_0714.html", + "product_code":"dws", + "code":"465", + "des":"GS_TOTAL_NODEGROUP_MEMORY_DETAIL displays statistics about memory usage of the logical cluster that the current database belongs to in the unit of MB.", + "doc_type":"devg", + "kw":"GS_TOTAL_NODEGROUP_MEMORY_DETAIL,System Views,Developer Guide", + "title":"GS_TOTAL_NODEGROUP_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0715.html", + "product_code":"dws", + "code":"466", + "des":"GS_USER_TRANSACTION provides transaction information about users on a single CN. The database records the number of times that each user commits and rolls back transactio", + "doc_type":"devg", + "kw":"GS_USER_TRANSACTION,System Views,Developer Guide", + "title":"GS_USER_TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0716.html", + "product_code":"dws", + "code":"467", + "des":"GS_VIEW_DEPENDENCY allows you to query the direct dependencies of all views visible to the current user.", + "doc_type":"devg", + "kw":"GS_VIEW_DEPENDENCY,System Views,Developer Guide", + "title":"GS_VIEW_DEPENDENCY", + "githuburl":"" + }, + { + "uri":"dws_04_0948.html", + "product_code":"dws", + "code":"468", + "des":"GS_VIEW_DEPENDENCY_PATH allows you to query the direct dependencies of all views visible to the current user. If the base table on which the view depends exists and the d", + "doc_type":"devg", + "kw":"GS_VIEW_DEPENDENCY_PATH,System Views,Developer Guide", + "title":"GS_VIEW_DEPENDENCY_PATH", + "githuburl":"" + }, + { + "uri":"dws_04_0717.html", + "product_code":"dws", + "code":"469", + "des":"GS_VIEW_INVALID queries all unavailable views visible to the current user. If the base table, function, or synonym that the view depends on is abnormal, the validtype col", + "doc_type":"devg", + "kw":"GS_VIEW_INVALID,System Views,Developer Guide", + "title":"GS_VIEW_INVALID", + "githuburl":"" + }, + { + "uri":"dws_04_0998.html", + "product_code":"dws", + "code":"470", + "des":"MPP_TABLES displays information about tables in PGXC_CLASS.", + "doc_type":"devg", + "kw":"MPP_TABLES,System Views,Developer Guide", + "title":"MPP_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0718.html", + "product_code":"dws", + "code":"471", + "des":"PG_AVAILABLE_EXTENSION_VERSIONS displays the extension versions of certain database features.", + "doc_type":"devg", + "kw":"PG_AVAILABLE_EXTENSION_VERSIONS,System Views,Developer Guide", + "title":"PG_AVAILABLE_EXTENSION_VERSIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0719.html", + "product_code":"dws", + "code":"472", + "des":"PG_AVAILABLE_EXTENSIONS displays the extended information about certain database features.", + "doc_type":"devg", + "kw":"PG_AVAILABLE_EXTENSIONS,System Views,Developer Guide", + "title":"PG_AVAILABLE_EXTENSIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0720.html", + "product_code":"dws", + "code":"473", + "des":"On any normal node in a cluster, PG_BULKLOAD_STATISTICS displays the execution status of the import and export services. Each import or export service corresponds to a re", + "doc_type":"devg", + "kw":"PG_BULKLOAD_STATISTICS,System Views,Developer Guide", + "title":"PG_BULKLOAD_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0721.html", + "product_code":"dws", + "code":"474", + "des":"PG_COMM_CLIENT_INFO stores the client connection information of a single node. (You can query this view on a DN to view the information about the connection between the C", + "doc_type":"devg", + "kw":"PG_COMM_CLIENT_INFO,System Views,Developer Guide", + "title":"PG_COMM_CLIENT_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0722.html", + "product_code":"dws", + "code":"475", + "des":"PG_COMM_DELAY displays the communication library delay status for a single DN.", + "doc_type":"devg", + "kw":"PG_COMM_DELAY,System Views,Developer Guide", + "title":"PG_COMM_DELAY", + "githuburl":"" + }, + { + "uri":"dws_04_0723.html", + "product_code":"dws", + "code":"476", + "des":"PG_COMM_STATUS displays the communication library status for a single DN.", + "doc_type":"devg", + "kw":"PG_COMM_STATUS,System Views,Developer Guide", + "title":"PG_COMM_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0724.html", + "product_code":"dws", + "code":"477", + "des":"PG_COMM_RECV_STREAM displays the receiving stream status of all the communication libraries for a single DN.", + "doc_type":"devg", + "kw":"PG_COMM_RECV_STREAM,System Views,Developer Guide", + "title":"PG_COMM_RECV_STREAM", + "githuburl":"" + }, + { + "uri":"dws_04_0725.html", + "product_code":"dws", + "code":"478", + "des":"PG_COMM_SEND_STREAM displays the sending stream status of all the communication libraries for a single DN.", + "doc_type":"devg", + "kw":"PG_COMM_SEND_STREAM,System Views,Developer Guide", + "title":"PG_COMM_SEND_STREAM", + "githuburl":"" + }, + { + "uri":"dws_04_0726.html", + "product_code":"dws", + "code":"479", + "des":"PG_CONTROL_GROUP_CONFIG displays the Cgroup configuration information in the system.", + "doc_type":"devg", + "kw":"PG_CONTROL_GROUP_CONFIG,System Views,Developer Guide", + "title":"PG_CONTROL_GROUP_CONFIG", + "githuburl":"" + }, + { + "uri":"dws_04_0727.html", + "product_code":"dws", + "code":"480", + "des":"PG_CURSORS displays the cursors that are currently available.", + "doc_type":"devg", + "kw":"PG_CURSORS,System Views,Developer Guide", + "title":"PG_CURSORS", + "githuburl":"" + }, + { + "uri":"dws_04_0728.html", + "product_code":"dws", + "code":"481", + "des":"PG_EXT_STATS displays extension statistics stored in the PG_STATISTIC_EXT table. The extension statistics means multiple columns of statistics.", + "doc_type":"devg", + "kw":"PG_EXT_STATS,System Views,Developer Guide", + "title":"PG_EXT_STATS", + "githuburl":"" + }, + { + "uri":"dws_04_0729.html", + "product_code":"dws", + "code":"482", + "des":"PG_GET_INVALID_BACKENDS displays the information about backend threads on the CN that are connected to the current standby DN.", + "doc_type":"devg", + "kw":"PG_GET_INVALID_BACKENDS,System Views,Developer Guide", + "title":"PG_GET_INVALID_BACKENDS", + "githuburl":"" + }, + { + "uri":"dws_04_0730.html", + "product_code":"dws", + "code":"483", + "des":"PG_GET_SENDERS_CATCHUP_TIME displays the catchup information of the currently active primary/standby instance sending thread on a single DN.", + "doc_type":"devg", + "kw":"PG_GET_SENDERS_CATCHUP_TIME,System Views,Developer Guide", + "title":"PG_GET_SENDERS_CATCHUP_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0731.html", + "product_code":"dws", + "code":"484", + "des":"PG_GROUP displays the database role authentication and the relationship between roles.", + "doc_type":"devg", + "kw":"PG_GROUP,System Views,Developer Guide", + "title":"PG_GROUP", + "githuburl":"" + }, + { + "uri":"dws_04_0732.html", + "product_code":"dws", + "code":"485", + "des":"PG_INDEXES displays access to useful information about each index in the database.", + "doc_type":"devg", + "kw":"PG_INDEXES,System Views,Developer Guide", + "title":"PG_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0733.html", + "product_code":"dws", + "code":"486", + "des":"The PG_JOB view replaces the PG_JOB system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB system catalog is cha", + "doc_type":"devg", + "kw":"PG_JOB,System Views,Developer Guide", + "title":"PG_JOB", + "githuburl":"" + }, + { + "uri":"dws_04_0734.html", + "product_code":"dws", + "code":"487", + "des":"The PG_JOB_PROC view replaces the PG_JOB_PROC system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB_PROC and PG", + "doc_type":"devg", + "kw":"PG_JOB_PROC,System Views,Developer Guide", + "title":"PG_JOB_PROC", + "githuburl":"" + }, + { + "uri":"dws_04_0735.html", + "product_code":"dws", + "code":"488", + "des":"PG_JOB_SINGLE displays job information about the current node.", + "doc_type":"devg", + "kw":"PG_JOB_SINGLE,System Views,Developer Guide", + "title":"PG_JOB_SINGLE", + "githuburl":"" + }, + { + "uri":"dws_04_0736.html", + "product_code":"dws", + "code":"489", + "des":"PG_LIFECYCLE_DATA_DISTRIBUTE displays the distribution of cold and hot data in a multi-temperature table of OBS.", + "doc_type":"devg", + "kw":"PG_LIFECYCLE_DATA_DISTRIBUTE,System Views,Developer Guide", + "title":"PG_LIFECYCLE_DATA_DISTRIBUTE", + "githuburl":"" + }, + { + "uri":"dws_04_0737.html", + "product_code":"dws", + "code":"490", + "des":"PG_LOCKS displays information about the locks held by open transactions.", + "doc_type":"devg", + "kw":"PG_LOCKS,System Views,Developer Guide", + "title":"PG_LOCKS", + "githuburl":"" + }, + { + "uri":"dws_04_0738.html", + "product_code":"dws", + "code":"491", + "des":"PG_NODE_ENVO displays the environmental variable information about the current node.", + "doc_type":"devg", + "kw":"PG_NODE_ENV,System Views,Developer Guide", + "title":"PG_NODE_ENV", + "githuburl":"" + }, + { + "uri":"dws_04_0739.html", + "product_code":"dws", + "code":"492", + "des":"PG_OS_THREADS displays the status information about all the threads under the current node.", + "doc_type":"devg", + "kw":"PG_OS_THREADS,System Views,Developer Guide", + "title":"PG_OS_THREADS", + "githuburl":"" + }, + { + "uri":"dws_04_0740.html", + "product_code":"dws", + "code":"493", + "des":"PG_POOLER_STATUS displays the cache connection status in the pooler. PG_POOLER_STATUS can only query on the CN, and displays the connection cache information about the po", + "doc_type":"devg", + "kw":"PG_POOLER_STATUS,System Views,Developer Guide", + "title":"PG_POOLER_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0741.html", + "product_code":"dws", + "code":"494", + "des":"PG_PREPARED_STATEMENTS displays all prepared statements that are available in the current session.", + "doc_type":"devg", + "kw":"PG_PREPARED_STATEMENTS,System Views,Developer Guide", + "title":"PG_PREPARED_STATEMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0742.html", + "product_code":"dws", + "code":"495", + "des":"PG_PREPARED_XACTS displays information about transactions that are currently prepared for two-phase commit.", + "doc_type":"devg", + "kw":"PG_PREPARED_XACTS,System Views,Developer Guide", + "title":"PG_PREPARED_XACTS", + "githuburl":"" + }, + { + "uri":"dws_04_0743.html", + "product_code":"dws", + "code":"496", + "des":"PG_QUERYBAND_ACTION displays information about the object associated with query_band and the query_band query order.", + "doc_type":"devg", + "kw":"PG_QUERYBAND_ACTION,System Views,Developer Guide", + "title":"PG_QUERYBAND_ACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0744.html", + "product_code":"dws", + "code":"497", + "des":"PG_REPLICATION_SLOTS displays the replication node information.", + "doc_type":"devg", + "kw":"PG_REPLICATION_SLOTS,System Views,Developer Guide", + "title":"PG_REPLICATION_SLOTS", + "githuburl":"" + }, + { + "uri":"dws_04_0745.html", + "product_code":"dws", + "code":"498", + "des":"PG_ROLES displays information about database roles.", + "doc_type":"devg", + "kw":"PG_ROLES,System Views,Developer Guide", + "title":"PG_ROLES", + "githuburl":"" + }, + { + "uri":"dws_04_0746.html", + "product_code":"dws", + "code":"499", + "des":"PG_RULES displays information about rewrite rules.", + "doc_type":"devg", + "kw":"PG_RULES,System Views,Developer Guide", + "title":"PG_RULES", + "githuburl":"" + }, + { + "uri":"dws_04_0747.html", + "product_code":"dws", + "code":"500", + "des":"PG_RUNNING_XACTS displays the running transaction information on the current node.", + "doc_type":"devg", + "kw":"PG_RUNNING_XACTS,System Views,Developer Guide", + "title":"PG_RUNNING_XACTS", + "githuburl":"" + }, + { + "uri":"dws_04_0748.html", + "product_code":"dws", + "code":"501", + "des":"PG_SECLABELS displays information about security labels.", + "doc_type":"devg", + "kw":"PG_SECLABELS,System Views,Developer Guide", + "title":"PG_SECLABELS", + "githuburl":"" + }, + { + "uri":"dws_04_0749.html", + "product_code":"dws", + "code":"502", + "des":"PG_SESSION_WLMSTAT displays the corresponding load management information about the task currently executed by the user.", + "doc_type":"devg", + "kw":"PG_SESSION_WLMSTAT,System Views,Developer Guide", + "title":"PG_SESSION_WLMSTAT", + "githuburl":"" + }, + { + "uri":"dws_04_0750.html", + "product_code":"dws", + "code":"503", + "des":"PG_SESSION_IOSTAT displays the I/O load management information about the task currently executed by the user.IOPS is counted by ones for column storage and by thousands f", + "doc_type":"devg", + "kw":"PG_SESSION_IOSTAT,System Views,Developer Guide", + "title":"PG_SESSION_IOSTAT", + "githuburl":"" + }, + { + "uri":"dws_04_0751.html", + "product_code":"dws", + "code":"504", + "des":"PG_SETTINGS displays information about parameters of the running database.", + "doc_type":"devg", + "kw":"PG_SETTINGS,System Views,Developer Guide", + "title":"PG_SETTINGS", + "githuburl":"" + }, + { + "uri":"dws_04_0752.html", + "product_code":"dws", + "code":"505", + "des":"PG_SHADOW displays properties of all roles that are marked as rolcanlogin in PG_AUTHID.The name stems from the fact that this table should not be readable by the public s", + "doc_type":"devg", + "kw":"PG_SHADOW,System Views,Developer Guide", + "title":"PG_SHADOW", + "githuburl":"" + }, + { + "uri":"dws_04_0753.html", + "product_code":"dws", + "code":"506", + "des":"PG_SHARED_MEMORY_DETAIL displays usage information about all the shared memory contexts.", + "doc_type":"devg", + "kw":"PG_SHARED_MEMORY_DETAIL,System Views,Developer Guide", + "title":"PG_SHARED_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0754.html", + "product_code":"dws", + "code":"507", + "des":"PG_STATS displays the single-column statistics stored in the pg_statistic table.", + "doc_type":"devg", + "kw":"PG_STATS,System Views,Developer Guide", + "title":"PG_STATS", + "githuburl":"" + }, + { + "uri":"dws_04_0755.html", + "product_code":"dws", + "code":"508", + "des":"PG_STAT_ACTIVITY displays information about the current user's queries.", + "doc_type":"devg", + "kw":"PG_STAT_ACTIVITY,System Views,Developer Guide", + "title":"PG_STAT_ACTIVITY", + "githuburl":"" + }, + { + "uri":"dws_04_0757.html", + "product_code":"dws", + "code":"509", + "des":"PG_STAT_ALL_INDEXES displays access informaton about all indexes in the database, with information about each index displayed in a row.Indexes can be used via either simp", + "doc_type":"devg", + "kw":"PG_STAT_ALL_INDEXES,System Views,Developer Guide", + "title":"PG_STAT_ALL_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0758.html", + "product_code":"dws", + "code":"510", + "des":"PG_STAT_ALL_TABLES displays access information about all rows in all tables (including TOAST tables) in the database.", + "doc_type":"devg", + "kw":"PG_STAT_ALL_TABLES,System Views,Developer Guide", + "title":"PG_STAT_ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0759.html", + "product_code":"dws", + "code":"511", + "des":"PG_STAT_BAD_BLOCK displays statistics about page or CU verification failures after a node is started.", + "doc_type":"devg", + "kw":"PG_STAT_BAD_BLOCK,System Views,Developer Guide", + "title":"PG_STAT_BAD_BLOCK", + "githuburl":"" + }, + { + "uri":"dws_04_0760.html", + "product_code":"dws", + "code":"512", + "des":"PG_STAT_BGWRITER displays statistics about the background writer process's activity.", + "doc_type":"devg", + "kw":"PG_STAT_BGWRITER,System Views,Developer Guide", + "title":"PG_STAT_BGWRITER", + "githuburl":"" + }, + { + "uri":"dws_04_0761.html", + "product_code":"dws", + "code":"513", + "des":"PG_STAT_DATABASE displays the status and statistics of each database on the current node.", + "doc_type":"devg", + "kw":"PG_STAT_DATABASE,System Views,Developer Guide", + "title":"PG_STAT_DATABASE", + "githuburl":"" + }, + { + "uri":"dws_04_0762.html", + "product_code":"dws", + "code":"514", + "des":"PG_STAT_DATABASE_CONFLICTS displays statistics about database conflicts.", + "doc_type":"devg", + "kw":"PG_STAT_DATABASE_CONFLICTS,System Views,Developer Guide", + "title":"PG_STAT_DATABASE_CONFLICTS", + "githuburl":"" + }, + { + "uri":"dws_04_0763.html", + "product_code":"dws", + "code":"515", + "des":"PG_STAT_GET_MEM_MBYTES_RESERVED displays the current activity information of a thread stored in memory. You need to specify the thread ID (pid in PG_STAT_ACTIVITY) for qu", + "doc_type":"devg", + "kw":"PG_STAT_GET_MEM_MBYTES_RESERVED,System Views,Developer Guide", + "title":"PG_STAT_GET_MEM_MBYTES_RESERVED", + "githuburl":"" + }, + { + "uri":"dws_04_0764.html", + "product_code":"dws", + "code":"516", + "des":"PG_STAT_USER_FUNCTIONS displays user-defined function status information in the namespace. (The language of the function is non-internal language.)", + "doc_type":"devg", + "kw":"PG_STAT_USER_FUNCTIONS,System Views,Developer Guide", + "title":"PG_STAT_USER_FUNCTIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0765.html", + "product_code":"dws", + "code":"517", + "des":"PG_STAT_USER_INDEXES displays information about the index status of user-defined ordinary tables and TOAST tables.", + "doc_type":"devg", + "kw":"PG_STAT_USER_INDEXES,System Views,Developer Guide", + "title":"PG_STAT_USER_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0766.html", + "product_code":"dws", + "code":"518", + "des":"PG_STAT_USER_TABLES displays status information about user-defined ordinary tables and TOAST tables in all namespaces.", + "doc_type":"devg", + "kw":"PG_STAT_USER_TABLES,System Views,Developer Guide", + "title":"PG_STAT_USER_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0767.html", + "product_code":"dws", + "code":"519", + "des":"PG_STAT_REPLICATION displays information about log synchronization status, such as the locations of the sender sending logs and the receiver receiving logs.", + "doc_type":"devg", + "kw":"PG_STAT_REPLICATION,System Views,Developer Guide", + "title":"PG_STAT_REPLICATION", + "githuburl":"" + }, + { + "uri":"dws_04_0768.html", + "product_code":"dws", + "code":"520", + "des":"PG_STAT_SYS_INDEXES displays the index status information about all the system catalogs in the pg_catalog and information_schema schemas.", + "doc_type":"devg", + "kw":"PG_STAT_SYS_INDEXES,System Views,Developer Guide", + "title":"PG_STAT_SYS_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0769.html", + "product_code":"dws", + "code":"521", + "des":"PG_STAT_SYS_TABLES displays the statistics about the system catalogs of all the namespaces in pg_catalog and information_schema schemas.", + "doc_type":"devg", + "kw":"PG_STAT_SYS_TABLES,System Views,Developer Guide", + "title":"PG_STAT_SYS_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0770.html", + "product_code":"dws", + "code":"522", + "des":"PG_STAT_XACT_ALL_TABLES displays the transaction status information about all ordinary tables and TOAST tables in the namespaces.", + "doc_type":"devg", + "kw":"PG_STAT_XACT_ALL_TABLES,System Views,Developer Guide", + "title":"PG_STAT_XACT_ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0771.html", + "product_code":"dws", + "code":"523", + "des":"PG_STAT_XACT_SYS_TABLES displays the transaction status information of the system catalog in the namespace.", + "doc_type":"devg", + "kw":"PG_STAT_XACT_SYS_TABLES,System Views,Developer Guide", + "title":"PG_STAT_XACT_SYS_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0772.html", + "product_code":"dws", + "code":"524", + "des":"PG_STAT_XACT_USER_FUNCTIONS displays statistics about function executions, with statistics about each execution displayed in a row.", + "doc_type":"devg", + "kw":"PG_STAT_XACT_USER_FUNCTIONS,System Views,Developer Guide", + "title":"PG_STAT_XACT_USER_FUNCTIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0773.html", + "product_code":"dws", + "code":"525", + "des":"PG_STAT_XACT_USER_TABLES displays the transaction status information of the user table in the namespace.", + "doc_type":"devg", + "kw":"PG_STAT_XACT_USER_TABLES,System Views,Developer Guide", + "title":"PG_STAT_XACT_USER_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0774.html", + "product_code":"dws", + "code":"526", + "des":"PG_STATIO_ALL_INDEXES contains each row of each index in the current database, showing I/O statistics about accesses to that specific index.", + "doc_type":"devg", + "kw":"PG_STATIO_ALL_INDEXES,System Views,Developer Guide", + "title":"PG_STATIO_ALL_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0775.html", + "product_code":"dws", + "code":"527", + "des":"PG_STATIO_ALL_SEQUENCES contains each row of each sequence in the current database, showing I/O statistics about accesses to that specific sequence.", + "doc_type":"devg", + "kw":"PG_STATIO_ALL_SEQUENCES,System Views,Developer Guide", + "title":"PG_STATIO_ALL_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0776.html", + "product_code":"dws", + "code":"528", + "des":"PG_STATIO_ALL_TABLES contains one row for each table in the current database (including TOAST tables), showing I/O statistics about accesses to that specific table.", + "doc_type":"devg", + "kw":"PG_STATIO_ALL_TABLES,System Views,Developer Guide", + "title":"PG_STATIO_ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0777.html", + "product_code":"dws", + "code":"529", + "des":"PG_STATIO_SYS_INDEXES displays the I/O status information about all system catalog indexes in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_SYS_INDEXES,System Views,Developer Guide", + "title":"PG_STATIO_SYS_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0778.html", + "product_code":"dws", + "code":"530", + "des":"PG_STATIO_SYS_SEQUENCES displays the I/O status information about all the system sequences in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_SYS_SEQUENCES,System Views,Developer Guide", + "title":"PG_STATIO_SYS_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0779.html", + "product_code":"dws", + "code":"531", + "des":"PG_STATIO_SYS_TABLES displays the I/O status information about all the system catalogs in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_SYS_TABLES,System Views,Developer Guide", + "title":"PG_STATIO_SYS_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0780.html", + "product_code":"dws", + "code":"532", + "des":"PG_STATIO_USER_INDEXES displays the I/O status information about all the user relationship table indexes in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_USER_INDEXES,System Views,Developer Guide", + "title":"PG_STATIO_USER_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0781.html", + "product_code":"dws", + "code":"533", + "des":"PG_STATIO_USER_SEQUENCES displays the I/O status information about all the user relation table sequences in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_USER_SEQUENCES,System Views,Developer Guide", + "title":"PG_STATIO_USER_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0782.html", + "product_code":"dws", + "code":"534", + "des":"PG_STATIO_USER_TABLES displays the I/O status information about all the user relation tables in the namespace.", + "doc_type":"devg", + "kw":"PG_STATIO_USER_TABLES,System Views,Developer Guide", + "title":"PG_STATIO_USER_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0783.html", + "product_code":"dws", + "code":"535", + "des":"PG_THREAD_WAIT_STATUS allows you to test the block waiting status about the backend thread and auxiliary thread of the current instance.The waiting statuses in the wait_s", + "doc_type":"devg", + "kw":"PG_THREAD_WAIT_STATUS,System Views,Developer Guide", + "title":"PG_THREAD_WAIT_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0784.html", + "product_code":"dws", + "code":"536", + "des":"PG_TABLES displays access to each table in the database.", + "doc_type":"devg", + "kw":"PG_TABLES,System Views,Developer Guide", + "title":"PG_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0785.html", + "product_code":"dws", + "code":"537", + "des":"PG_TDE_INFO displays the encryption information about the current cluster.Check whether the current cluster is encrypted, and check the encryption algorithm (if any) used", + "doc_type":"devg", + "kw":"PG_TDE_INFO,System Views,Developer Guide", + "title":"PG_TDE_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0786.html", + "product_code":"dws", + "code":"538", + "des":"PG_TIMEZONE_ABBREVS displays all time zone abbreviations that can be recognized by the input routines.", + "doc_type":"devg", + "kw":"PG_TIMEZONE_ABBREVS,System Views,Developer Guide", + "title":"PG_TIMEZONE_ABBREVS", + "githuburl":"" + }, + { + "uri":"dws_04_0787.html", + "product_code":"dws", + "code":"539", + "des":"PG_TIMEZONE_NAMES displays all time zone names that can be recognized by SET TIMEZONE, along with their associated abbreviations, UTC offsets, and daylight saving time st", + "doc_type":"devg", + "kw":"PG_TIMEZONE_NAMES,System Views,Developer Guide", + "title":"PG_TIMEZONE_NAMES", + "githuburl":"" + }, + { + "uri":"dws_04_0788.html", + "product_code":"dws", + "code":"540", + "des":"PG_TOTAL_MEMORY_DETAIL displays the memory usage of a certain node in the database.", + "doc_type":"devg", + "kw":"PG_TOTAL_MEMORY_DETAIL,System Views,Developer Guide", + "title":"PG_TOTAL_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0789.html", + "product_code":"dws", + "code":"541", + "des":"PG_TOTAL_SCHEMA_INFO displays the storage usage of all schemas in each database. This view is valid only if use_workload_manager is set to on.", + "doc_type":"devg", + "kw":"PG_TOTAL_SCHEMA_INFO,System Views,Developer Guide", + "title":"PG_TOTAL_SCHEMA_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0790.html", + "product_code":"dws", + "code":"542", + "des":"PG_TOTAL_USER_RESOURCE_INFO displays the resource usage of all users. Only administrators can query this view. This view is valid only if use_workload_manager is set to o", + "doc_type":"devg", + "kw":"PG_TOTAL_USER_RESOURCE_INFO,System Views,Developer Guide", + "title":"PG_TOTAL_USER_RESOURCE_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0791.html", + "product_code":"dws", + "code":"543", + "des":"PG_USER displays information about users who can access the database.", + "doc_type":"devg", + "kw":"PG_USER,System Views,Developer Guide", + "title":"PG_USER", + "githuburl":"" + }, + { + "uri":"dws_04_0792.html", + "product_code":"dws", + "code":"544", + "des":"PG_USER_MAPPINGS displays information about user mappings.This is essentially a publicly readable view of PG_USER_MAPPING that leaves out the options column if the user h", + "doc_type":"devg", + "kw":"PG_USER_MAPPINGS,System Views,Developer Guide", + "title":"PG_USER_MAPPINGS", + "githuburl":"" + }, + { + "uri":"dws_04_0793.html", + "product_code":"dws", + "code":"545", + "des":"PG_VIEWS displays basic information about each view in the database.", + "doc_type":"devg", + "kw":"PG_VIEWS,System Views,Developer Guide", + "title":"PG_VIEWS", + "githuburl":"" + }, + { + "uri":"dws_04_0794.html", + "product_code":"dws", + "code":"546", + "des":"PG_WLM_STATISTICS displays information about workload management after the task is complete or the exception has been handled.", + "doc_type":"devg", + "kw":"PG_WLM_STATISTICS,System Views,Developer Guide", + "title":"PG_WLM_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0795.html", + "product_code":"dws", + "code":"547", + "des":"PGXC_BULKLOAD_PROGRESS displays the progress of the service import. Only GDS common files can be imported. This view is accessible only to users with system administrator", + "doc_type":"devg", + "kw":"PGXC_BULKLOAD_PROGRESS,System Views,Developer Guide", + "title":"PGXC_BULKLOAD_PROGRESS", + "githuburl":"" + }, + { + "uri":"dws_04_0796.html", + "product_code":"dws", + "code":"548", + "des":"PGXC_BULKLOAD_STATISTICS displays real-time statistics about service execution, such as GDS, COPY, and \\COPY, on a CN. This view summarizes the real-time execution status", + "doc_type":"devg", + "kw":"PGXC_BULKLOAD_STATISTICS,System Views,Developer Guide", + "title":"PGXC_BULKLOAD_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0797.html", + "product_code":"dws", + "code":"549", + "des":"PGXC_COMM_CLIENT_INFO stores the client connection information of all nodes. (You can query this view on a DN to view the information about the connection between the CN ", + "doc_type":"devg", + "kw":"PGXC_COMM_CLIENT_INFO,System Views,Developer Guide", + "title":"PGXC_COMM_CLIENT_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0798.html", + "product_code":"dws", + "code":"550", + "des":"PGXC_COMM_STATUS displays the communication library delay status for all the DNs.", + "doc_type":"devg", + "kw":"PGXC_COMM_DELAY,System Views,Developer Guide", + "title":"PGXC_COMM_DELAY", + "githuburl":"" + }, + { + "uri":"dws_04_0799.html", + "product_code":"dws", + "code":"551", + "des":"PG_COMM_RECV_STREAM displays the receiving stream status of the communication libraries for all the DNs.", + "doc_type":"devg", + "kw":"PGXC_COMM_RECV_STREAM,System Views,Developer Guide", + "title":"PGXC_COMM_RECV_STREAM", + "githuburl":"" + }, + { + "uri":"dws_04_0800.html", + "product_code":"dws", + "code":"552", + "des":"PGXC_COMM_SEND_STREAM displays the sending stream status of the communication libraries for all the DNs.", + "doc_type":"devg", + "kw":"PGXC_COMM_SEND_STREAM,System Views,Developer Guide", + "title":"PGXC_COMM_SEND_STREAM", + "githuburl":"" + }, + { + "uri":"dws_04_0801.html", + "product_code":"dws", + "code":"553", + "des":"PGXC_COMM_STATUS displays the communication library status for all the DNs.", + "doc_type":"devg", + "kw":"PGXC_COMM_STATUS,System Views,Developer Guide", + "title":"PGXC_COMM_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0802.html", + "product_code":"dws", + "code":"554", + "des":"PGXC_DEADLOCK displays lock wait information generated due to distributed deadlocks.Currently, PGXC_DEADLOCK collects only lock wait information about locks whose locktyp", + "doc_type":"devg", + "kw":"PGXC_DEADLOCK,System Views,Developer Guide", + "title":"PGXC_DEADLOCK", + "githuburl":"" + }, + { + "uri":"dws_04_0803.html", + "product_code":"dws", + "code":"555", + "des":"PGXC_GET_STAT_ALL_TABLES displays information about insertion, update, and deletion operations on tables and the dirty page rate of tables.Before running VACUUM FULL to a", + "doc_type":"devg", + "kw":"PGXC_GET_STAT_ALL_TABLES,System Views,Developer Guide", + "title":"PGXC_GET_STAT_ALL_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0804.html", + "product_code":"dws", + "code":"556", + "des":"PGXC_GET_STAT_ALL_PARTITIONS displays information about insertion, update, and deletion operations on partitions of partitioned tables and the dirty page rate of tables.T", + "doc_type":"devg", + "kw":"PGXC_GET_STAT_ALL_PARTITIONS,System Views,Developer Guide", + "title":"PGXC_GET_STAT_ALL_PARTITIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0805.html", + "product_code":"dws", + "code":"557", + "des":"PGXC_GET_TABLE_SKEWNESS displays the data skew on tables in the current database.", + "doc_type":"devg", + "kw":"PGXC_GET_TABLE_SKEWNESS,System Views,Developer Guide", + "title":"PGXC_GET_TABLE_SKEWNESS", + "githuburl":"" + }, + { + "uri":"dws_04_0806.html", + "product_code":"dws", + "code":"558", + "des":"PGXC_GTM_SNAPSHOT_STATUS displays transaction information on the current GTM.", + "doc_type":"devg", + "kw":"PGXC_GTM_SNAPSHOT_STATUS,System Views,Developer Guide", + "title":"PGXC_GTM_SNAPSHOT_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0807.html", + "product_code":"dws", + "code":"559", + "des":"PGXC_INSTANCE_TIME displays the running time of processes on each node in the cluster and the time consumed in each execution phase. Except the node_name column, the othe", + "doc_type":"devg", + "kw":"PGXC_INSTANCE_TIME,System Views,Developer Guide", + "title":"PGXC_INSTANCE_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0808.html", + "product_code":"dws", + "code":"560", + "des":"PGXC_INSTR_UNIQUE_SQL displays the complete Unique SQL statistics of all CN nodes in the cluster.Only the system administrator can access this view. For details about the", + "doc_type":"devg", + "kw":"PGXC_INSTR_UNIQUE_SQL,System Views,Developer Guide", + "title":"PGXC_INSTR_UNIQUE_SQL", + "githuburl":"" + }, + { + "uri":"dws_04_0809.html", + "product_code":"dws", + "code":"561", + "des":"PGXC_LOCK_CONFLICTS displays information about conflicting locks in the cluster.When a lock is waiting for another lock or another lock is waiting for this one, a lock co", + "doc_type":"devg", + "kw":"PGXC_LOCK_CONFLICTS,System Views,Developer Guide", + "title":"PGXC_LOCK_CONFLICTS", + "githuburl":"" + }, + { + "uri":"dws_04_0810.html", + "product_code":"dws", + "code":"562", + "des":"PGXC_NODE_ENV displays the environmental variables information about all nodes in a cluster.", + "doc_type":"devg", + "kw":"PGXC_NODE_ENV,System Views,Developer Guide", + "title":"PGXC_NODE_ENV", + "githuburl":"" + }, + { + "uri":"dws_04_0811.html", + "product_code":"dws", + "code":"563", + "des":"PGXC_NODE_STAT_RESET_TIME displays the time when statistics of each node in the cluster are reset. All columns except node_name are the same as those in the GS_NODE_STAT_", + "doc_type":"devg", + "kw":"PGXC_NODE_STAT_RESET_TIME,System Views,Developer Guide", + "title":"PGXC_NODE_STAT_RESET_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0812.html", + "product_code":"dws", + "code":"564", + "des":"PGXC_OS_RUN_INFO displays the OS running status of each node in the cluster. All columns except node_name are the same as those in the PV_OS_RUN_INFO view. This view is a", + "doc_type":"devg", + "kw":"PGXC_OS_RUN_INFO,System Views,Developer Guide", + "title":"PGXC_OS_RUN_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0813.html", + "product_code":"dws", + "code":"565", + "des":"PGXC_OS_THREADS displays thread status information under all normal nodes in the current cluster.", + "doc_type":"devg", + "kw":"PGXC_OS_THREADS,System Views,Developer Guide", + "title":"PGXC_OS_THREADS", + "githuburl":"" + }, + { + "uri":"dws_04_0814.html", + "product_code":"dws", + "code":"566", + "des":"PGXC_PREPARED_XACTS displays the two-phase transactions in the prepared phase.", + "doc_type":"devg", + "kw":"PGXC_PREPARED_XACTS,System Views,Developer Guide", + "title":"PGXC_PREPARED_XACTS", + "githuburl":"" + }, + { + "uri":"dws_04_0815.html", + "product_code":"dws", + "code":"567", + "des":"PGXC_REDO_STAT displays statistics on redoing Xlogs of each node in the cluster. All columns except node_name are the same as those in the PV_REDO_STAT view. This view is", + "doc_type":"devg", + "kw":"PGXC_REDO_STAT,System Views,Developer Guide", + "title":"PGXC_REDO_STAT", + "githuburl":"" + }, + { + "uri":"dws_04_0816.html", + "product_code":"dws", + "code":"568", + "des":"PGXC_REL_IOSTAT displays statistics on disk read and write of each node in the cluster. All columns except node_name are the same as those in the GS_REL_IOSTAT view. This", + "doc_type":"devg", + "kw":"PGXC_REL_IOSTAT,System Views,Developer Guide", + "title":"PGXC_REL_IOSTAT", + "githuburl":"" + }, + { + "uri":"dws_04_0817.html", + "product_code":"dws", + "code":"569", + "des":"PGXC_REPLICATION_SLOTS displays the replication information of DNs in the cluster. All columns except node_name are the same as those in the PG_REPLICATION_SLOTS view. Th", + "doc_type":"devg", + "kw":"PGXC_REPLICATION_SLOTS,System Views,Developer Guide", + "title":"PGXC_REPLICATION_SLOTS", + "githuburl":"" + }, + { + "uri":"dws_04_0818.html", + "product_code":"dws", + "code":"570", + "des":"PGXC_RUNNING_XACTS displays information about running transactions on each node in the cluster. The content is the same as that displayed in PG_RUNNING_XACTS.", + "doc_type":"devg", + "kw":"PGXC_RUNNING_XACTS,System Views,Developer Guide", + "title":"PGXC_RUNNING_XACTS", + "githuburl":"" + }, + { + "uri":"dws_04_0819.html", + "product_code":"dws", + "code":"571", + "des":"PGXC_SETTINGS displays the database running status of each node in the cluster. All columns except node_name are the same as those in the PG_SETTINGS view. This view is a", + "doc_type":"devg", + "kw":"PGXC_SETTINGS,System Views,Developer Guide", + "title":"PGXC_SETTINGS", + "githuburl":"" + }, + { + "uri":"dws_04_0820.html", + "product_code":"dws", + "code":"572", + "des":"PGXC_STAT_ACTIVITY displays information about the query performed by the current user on all the CNs in the current cluster.Run the following command to view blocked quer", + "doc_type":"devg", + "kw":"PGXC_STAT_ACTIVITY,System Views,Developer Guide", + "title":"PGXC_STAT_ACTIVITY", + "githuburl":"" + }, + { + "uri":"dws_04_0821.html", + "product_code":"dws", + "code":"573", + "des":"PGXC_STAT_BAD_BLOCK displays statistics about page or CU verification failures after all nodes in a cluster are started.", + "doc_type":"devg", + "kw":"PGXC_STAT_BAD_BLOCK,System Views,Developer Guide", + "title":"PGXC_STAT_BAD_BLOCK", + "githuburl":"" + }, + { + "uri":"dws_04_0822.html", + "product_code":"dws", + "code":"574", + "des":"PGXC_STAT_BGWRITER displays statistics on the background writer of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_BGWRITER vi", + "doc_type":"devg", + "kw":"PGXC_STAT_BGWRITER,System Views,Developer Guide", + "title":"PGXC_STAT_BGWRITER", + "githuburl":"" + }, + { + "uri":"dws_04_0823.html", + "product_code":"dws", + "code":"575", + "des":"PGXC_STAT_DATABASE displays the database status and statistics of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_DATABASE vie", + "doc_type":"devg", + "kw":"PGXC_STAT_DATABASE,System Views,Developer Guide", + "title":"PGXC_STAT_DATABASE", + "githuburl":"" + }, + { + "uri":"dws_04_0824.html", + "product_code":"dws", + "code":"576", + "des":"PGXC_STAT_REPLICATION displays the log synchronization status of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_REPLICATION v", + "doc_type":"devg", + "kw":"PGXC_STAT_REPLICATION,System Views,Developer Guide", + "title":"PGXC_STAT_REPLICATION", + "githuburl":"" + }, + { + "uri":"dws_04_0825.html", + "product_code":"dws", + "code":"577", + "des":"PGXC_SQL_COUNT displays the node-level and user-level statistics for the SQL statements of SELECT, INSERT, UPDATE, DELETE, and MERGE INTO and DDL, DML, and DCL statements", + "doc_type":"devg", + "kw":"PGXC_SQL_COUNT,System Views,Developer Guide", + "title":"PGXC_SQL_COUNT", + "githuburl":"" + }, + { + "uri":"dws_04_0826.html", + "product_code":"dws", + "code":"578", + "des":"PGXC_THREAD_WAIT_STATUS displays all the call layer hierarchy relationship between threads of the SQL statements on all the nodes in a cluster, and the waiting status of ", + "doc_type":"devg", + "kw":"PGXC_THREAD_WAIT_STATUS,System Views,Developer Guide", + "title":"PGXC_THREAD_WAIT_STATUS", + "githuburl":"" + }, + { + "uri":"dws_04_0827.html", + "product_code":"dws", + "code":"579", + "des":"PGXC_TOTAL_MEMORY_DETAIL displays the memory usage in the cluster.", + "doc_type":"devg", + "kw":"PGXC_TOTAL_MEMORY_DETAIL,System Views,Developer Guide", + "title":"PGXC_TOTAL_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0828.html", + "product_code":"dws", + "code":"580", + "des":"PGXC_TOTAL_SCHEMA_INFO displays the schema space information of all instances in the cluster, providing visibility into the schema space usage of each instance. This view", + "doc_type":"devg", + "kw":"PGXC_TOTAL_SCHEMA_INFO,System Views,Developer Guide", + "title":"PGXC_TOTAL_SCHEMA_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0829.html", + "product_code":"dws", + "code":"581", + "des":"PGXC_TOTAL_SCHEMA_INFO_ANALYZE displays the overall schema space information of the cluster, including the total cluster space, average space of instances, skew ratio, ma", + "doc_type":"devg", + "kw":"PGXC_TOTAL_SCHEMA_INFO_ANALYZE,System Views,Developer Guide", + "title":"PGXC_TOTAL_SCHEMA_INFO_ANALYZE", + "githuburl":"" + }, + { + "uri":"dws_04_0830.html", + "product_code":"dws", + "code":"582", + "des":"PGXC_USER_TRANSACTION provides transaction information about users on all CNs. It is accessible only to users with system administrator rights. This view is valid only wh", + "doc_type":"devg", + "kw":"PGXC_USER_TRANSACTION,System Views,Developer Guide", + "title":"PGXC_USER_TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0831.html", + "product_code":"dws", + "code":"583", + "des":"PGXC_VARIABLE_INFO displays information about transaction IDs and OIDs of all nodes in a cluster.", + "doc_type":"devg", + "kw":"PGXC_VARIABLE_INFO,System Views,Developer Guide", + "title":"PGXC_VARIABLE_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0832.html", + "product_code":"dws", + "code":"584", + "des":"PGXC_WAIT_EVENTS displays statistics on the waiting status and events of each node in the cluster. The content is the same as that displayed in GS_WAIT_EVENTS. This view ", + "doc_type":"devg", + "kw":"PGXC_WAIT_EVENTS,System Views,Developer Guide", + "title":"PGXC_WAIT_EVENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0836.html", + "product_code":"dws", + "code":"585", + "des":"PGXC_WLM_OPERATOR_HISTORYdisplays the operator information of completed jobs executed on all CNs. This view is used by Database Manager to query data from a database. Dat", + "doc_type":"devg", + "kw":"PGXC_WLM_OPERATOR_HISTORY,System Views,Developer Guide", + "title":"PGXC_WLM_OPERATOR_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0837.html", + "product_code":"dws", + "code":"586", + "des":"PGXC_WLM_OPERATOR_INFO displays the operator information of completed jobs executed on CNs. The data in this view is obtained from GS_WLM_OPERATOR_INFO.This view is acces", + "doc_type":"devg", + "kw":"PGXC_WLM_OPERATOR_INFO,System Views,Developer Guide", + "title":"PGXC_WLM_OPERATOR_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0838.html", + "product_code":"dws", + "code":"587", + "des":"PGXC_WLM_OPERATOR_STATISTICS displays the operator information of jobs being executed on CNs.This view is accessible only to users with system administrators rights. For ", + "doc_type":"devg", + "kw":"PGXC_WLM_OPERATOR_STATISTICS,System Views,Developer Guide", + "title":"PGXC_WLM_OPERATOR_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0839.html", + "product_code":"dws", + "code":"588", + "des":"PGXC_WLM_SESSION_INFO displays load management information for completed jobs executed on all CNs. The data in this view is obtained from GS_WLM_SESSION_INFO.This view is", + "doc_type":"devg", + "kw":"PGXC_WLM_SESSION_INFO,System Views,Developer Guide", + "title":"PGXC_WLM_SESSION_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0840.html", + "product_code":"dws", + "code":"589", + "des":"PGXC_WLM_SESSION_HISTORY displays load management information for completed jobs executed on all CNs. This view is used by Data Manager to query data from a database. Dat", + "doc_type":"devg", + "kw":"PGXC_WLM_SESSION_HISTORY,System Views,Developer Guide", + "title":"PGXC_WLM_SESSION_HISTORY", + "githuburl":"" + }, + { + "uri":"dws_04_0841.html", + "product_code":"dws", + "code":"590", + "des":"PGXC_WLM_SESSION_STATISTICS displays load management information about jobs that are being executed on CNs.This view is accessible only to users with system administrator", + "doc_type":"devg", + "kw":"PGXC_WLM_SESSION_STATISTICS,System Views,Developer Guide", + "title":"PGXC_WLM_SESSION_STATISTICS", + "githuburl":"" + }, + { + "uri":"dws_04_0842.html", + "product_code":"dws", + "code":"591", + "des":"PGXC_WLM_WORKLOAD_RECORDS displays the status of job executed by the current user on CNs. It is accessible only to users with system administrator rights. This view is av", + "doc_type":"devg", + "kw":"PGXC_WLM_WORKLOAD_RECORDS,System Views,Developer Guide", + "title":"PGXC_WLM_WORKLOAD_RECORDS", + "githuburl":"" + }, + { + "uri":"dws_04_0843.html", + "product_code":"dws", + "code":"592", + "des":"PGXC_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on all CNs in a cluster, including the number of SELECT, UPDATE, ", + "doc_type":"devg", + "kw":"PGXC_WORKLOAD_SQL_COUNT,System Views,Developer Guide", + "title":"PGXC_WORKLOAD_SQL_COUNT", + "githuburl":"" + }, + { + "uri":"dws_04_0844.html", + "product_code":"dws", + "code":"593", + "des":"PGXC_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on all CNs in a cluster, including the maximum, minimum, aver", + "doc_type":"devg", + "kw":"PGXC_WORKLOAD_SQL_ELAPSE_TIME,System Views,Developer Guide", + "title":"PGXC_WORKLOAD_SQL_ELAPSE_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0845.html", + "product_code":"dws", + "code":"594", + "des":"PGXC_WORKLOAD_TRANSACTION provides transaction information about workload Cgroups on all CNs. It is accessible only to users with system administrator rights. This view i", + "doc_type":"devg", + "kw":"PGXC_WORKLOAD_TRANSACTION,System Views,Developer Guide", + "title":"PGXC_WORKLOAD_TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_04_0846.html", + "product_code":"dws", + "code":"595", + "des":"PLAN_TABLE displays the plan information collected by EXPLAIN PLAN. Plan information is in a session-level life cycle. After the session exits, the data will be deleted. ", + "doc_type":"devg", + "kw":"PLAN_TABLE,System Views,Developer Guide", + "title":"PLAN_TABLE", + "githuburl":"" + }, + { + "uri":"dws_04_0847.html", + "product_code":"dws", + "code":"596", + "des":"PLAN_TABLE_DATA displays the plan information collected by EXPLAIN PLAN. Different from the PLAN_TABLE view, the system catalog PLAN_TABLE_DATA stores the plan informatio", + "doc_type":"devg", + "kw":"PLAN_TABLE_DATA,System Views,Developer Guide", + "title":"PLAN_TABLE_DATA", + "githuburl":"" + }, + { + "uri":"dws_04_0848.html", + "product_code":"dws", + "code":"597", + "des":"By collecting statistics about the data file I/Os, PV_FILE_STAT displays the I/O performance of the data to detect the performance problems, such as abnormal I/O operatio", + "doc_type":"devg", + "kw":"PV_FILE_STAT,System Views,Developer Guide", + "title":"PV_FILE_STAT", + "githuburl":"" + }, + { + "uri":"dws_04_0849.html", + "product_code":"dws", + "code":"598", + "des":"PV_INSTANCE_TIME collects statistics on the running time of processes and the time consumed in each execution phase, in microseconds.PV_INSTANCE_TIME records time consump", + "doc_type":"devg", + "kw":"PV_INSTANCE_TIME,System Views,Developer Guide", + "title":"PV_INSTANCE_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0850.html", + "product_code":"dws", + "code":"599", + "des":"PV_OS_RUN_INFO displays the running status of the current operating system.", + "doc_type":"devg", + "kw":"PV_OS_RUN_INFO,System Views,Developer Guide", + "title":"PV_OS_RUN_INFO", + "githuburl":"" + }, + { + "uri":"dws_04_0851.html", + "product_code":"dws", + "code":"600", + "des":"PV_SESSION_MEMORY displays statistics about memory usage at the session level in the unit of MB, including all the memory allocated to Postgres and Stream threads on DNs ", + "doc_type":"devg", + "kw":"PV_SESSION_MEMORY,System Views,Developer Guide", + "title":"PV_SESSION_MEMORY", + "githuburl":"" + }, + { + "uri":"dws_04_0852.html", + "product_code":"dws", + "code":"601", + "des":"PV_SESSION_MEMORY_DETAIL displays statistics about thread memory usage by memory context.The memory context TempSmallContextGroup collects information about all memory co", + "doc_type":"devg", + "kw":"PV_SESSION_MEMORY_DETAIL,System Views,Developer Guide", + "title":"PV_SESSION_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0853.html", + "product_code":"dws", + "code":"602", + "des":"PV_SESSION_STAT displays session state statistics based on session threads or the AutoVacuum thread.", + "doc_type":"devg", + "kw":"PV_SESSION_STAT,System Views,Developer Guide", + "title":"PV_SESSION_STAT", + "githuburl":"" + }, + { + "uri":"dws_04_0854.html", + "product_code":"dws", + "code":"603", + "des":"PV_SESSION_TIME displays statistics about the running time of session threads and time consumed in each execution phase, in microseconds.", + "doc_type":"devg", + "kw":"PV_SESSION_TIME,System Views,Developer Guide", + "title":"PV_SESSION_TIME", + "githuburl":"" + }, + { + "uri":"dws_04_0855.html", + "product_code":"dws", + "code":"604", + "des":"PV_TOTAL_MEMORY_DETAIL displays statistics about memory usage of the current database node in the unit of MB.", + "doc_type":"devg", + "kw":"PV_TOTAL_MEMORY_DETAIL,System Views,Developer Guide", + "title":"PV_TOTAL_MEMORY_DETAIL", + "githuburl":"" + }, + { + "uri":"dws_04_0856.html", + "product_code":"dws", + "code":"605", + "des":"PV_REDO_STAT displays statistics on redoing Xlogs on the current node.", + "doc_type":"devg", + "kw":"PV_REDO_STAT,System Views,Developer Guide", + "title":"PV_REDO_STAT", + "githuburl":"" + }, + { + "uri":"dws_04_0857.html", + "product_code":"dws", + "code":"606", + "des":"REDACTION_COLUMNS displays information about all redaction columns in the current database.", + "doc_type":"devg", + "kw":"REDACTION_COLUMNS,System Views,Developer Guide", + "title":"REDACTION_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0858.html", + "product_code":"dws", + "code":"607", + "des":"REDACTION_POLICIES displays information about all redaction objects in the current database.", + "doc_type":"devg", + "kw":"REDACTION_POLICIES,System Views,Developer Guide", + "title":"REDACTION_POLICIES", + "githuburl":"" + }, + { + "uri":"dws_04_0859.html", + "product_code":"dws", + "code":"608", + "des":"USER_COL_COMMENTS displays the column comments of the table accessible to the current user.", + "doc_type":"devg", + "kw":"USER_COL_COMMENTS,System Views,Developer Guide", + "title":"USER_COL_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0860.html", + "product_code":"dws", + "code":"609", + "des":"USER_CONSTRAINTS displays the table constraint information accessible to the current user.", + "doc_type":"devg", + "kw":"USER_CONSTRAINTS,System Views,Developer Guide", + "title":"USER_CONSTRAINTS", + "githuburl":"" + }, + { + "uri":"dws_04_0861.html", + "product_code":"dws", + "code":"610", + "des":"USER_CONSTRAINTS displays the information about constraint columns of the tables accessible to the current user.", + "doc_type":"devg", + "kw":"USER_CONS_COLUMNS,System Views,Developer Guide", + "title":"USER_CONS_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0862.html", + "product_code":"dws", + "code":"611", + "des":"USER_INDEXES displays index information in the current schema.", + "doc_type":"devg", + "kw":"USER_INDEXES,System Views,Developer Guide", + "title":"USER_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0863.html", + "product_code":"dws", + "code":"612", + "des":"USER_IND_COLUMNS displays column information about all indexes accessible to the current user.", + "doc_type":"devg", + "kw":"USER_IND_COLUMNS,System Views,Developer Guide", + "title":"USER_IND_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0864.html", + "product_code":"dws", + "code":"613", + "des":"USER_IND_EXPRESSIONSdisplays information about the function-based expression index accessible to the current user.", + "doc_type":"devg", + "kw":"USER_IND_EXPRESSIONS,System Views,Developer Guide", + "title":"USER_IND_EXPRESSIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0865.html", + "product_code":"dws", + "code":"614", + "des":"USER_IND_PARTITIONS displays information about index partitions accessible to the current user.", + "doc_type":"devg", + "kw":"USER_IND_PARTITIONS,System Views,Developer Guide", + "title":"USER_IND_PARTITIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0866.html", + "product_code":"dws", + "code":"615", + "des":"USER_JOBS displays all jobs owned by the user.", + "doc_type":"devg", + "kw":"USER_JOBS,System Views,Developer Guide", + "title":"USER_JOBS", + "githuburl":"" + }, + { + "uri":"dws_04_0867.html", + "product_code":"dws", + "code":"616", + "des":"USER_OBJECTS displays all database objects accessible to the current user.For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.", + "doc_type":"devg", + "kw":"USER_OBJECTS,System Views,Developer Guide", + "title":"USER_OBJECTS", + "githuburl":"" + }, + { + "uri":"dws_04_0868.html", + "product_code":"dws", + "code":"617", + "des":"USER_PART_INDEXES displays information about partitioned table indexes accessible to the current user.", + "doc_type":"devg", + "kw":"USER_PART_INDEXES,System Views,Developer Guide", + "title":"USER_PART_INDEXES", + "githuburl":"" + }, + { + "uri":"dws_04_0869.html", + "product_code":"dws", + "code":"618", + "des":"USER_PART_TABLES displays information about partitioned tables accessible to the current user.", + "doc_type":"devg", + "kw":"USER_PART_TABLES,System Views,Developer Guide", + "title":"USER_PART_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0870.html", + "product_code":"dws", + "code":"619", + "des":"USER_PROCEDURES displays information about all stored procedures and functions in the current schema.", + "doc_type":"devg", + "kw":"USER_PROCEDURES,System Views,Developer Guide", + "title":"USER_PROCEDURES", + "githuburl":"" + }, + { + "uri":"dws_04_0871.html", + "product_code":"dws", + "code":"620", + "des":"USER_SEQUENCES displays sequence information in the current schema.", + "doc_type":"devg", + "kw":"USER_SEQUENCES,System Views,Developer Guide", + "title":"USER_SEQUENCES", + "githuburl":"" + }, + { + "uri":"dws_04_0872.html", + "product_code":"dws", + "code":"621", + "des":"USER_SOURCE displays information about stored procedures or functions in this mode, and provides the columns defined by the stored procedures or the functions.", + "doc_type":"devg", + "kw":"USER_SOURCE,System Views,Developer Guide", + "title":"USER_SOURCE", + "githuburl":"" + }, + { + "uri":"dws_04_0873.html", + "product_code":"dws", + "code":"622", + "des":"USER_SYNONYMS displays synonyms accessible to the current user.", + "doc_type":"devg", + "kw":"USER_SYNONYMS,System Views,Developer Guide", + "title":"USER_SYNONYMS", + "githuburl":"" + }, + { + "uri":"dws_04_0874.html", + "product_code":"dws", + "code":"623", + "des":"USER_TAB_COLUMNS displays information about table columns accessible to the current user.", + "doc_type":"devg", + "kw":"USER_TAB_COLUMNS,System Views,Developer Guide", + "title":"USER_TAB_COLUMNS", + "githuburl":"" + }, + { + "uri":"dws_04_0875.html", + "product_code":"dws", + "code":"624", + "des":"USER_TAB_COMMENTS displays comments about all tables and views accessible to the current user.", + "doc_type":"devg", + "kw":"USER_TAB_COMMENTS,System Views,Developer Guide", + "title":"USER_TAB_COMMENTS", + "githuburl":"" + }, + { + "uri":"dws_04_0876.html", + "product_code":"dws", + "code":"625", + "des":"USER_TAB_PARTITIONS displays all table partitions accessible to the current user. Each partition of a partitioned table accessible to the current user has a piece of reco", + "doc_type":"devg", + "kw":"USER_TAB_PARTITIONS,System Views,Developer Guide", + "title":"USER_TAB_PARTITIONS", + "githuburl":"" + }, + { + "uri":"dws_04_0877.html", + "product_code":"dws", + "code":"626", + "des":"USER_TABLES displays table information in the current schema.", + "doc_type":"devg", + "kw":"USER_TABLES,System Views,Developer Guide", + "title":"USER_TABLES", + "githuburl":"" + }, + { + "uri":"dws_04_0878.html", + "product_code":"dws", + "code":"627", + "des":"USER_TRIGGERS displays the information about triggers accessible to the current user.", + "doc_type":"devg", + "kw":"USER_TRIGGERS,System Views,Developer Guide", + "title":"USER_TRIGGERS", + "githuburl":"" + }, + { + "uri":"dws_04_0879.html", + "product_code":"dws", + "code":"628", + "des":"USER_VIEWS displays information about all views in the current schema.", + "doc_type":"devg", + "kw":"USER_VIEWS,System Views,Developer Guide", + "title":"USER_VIEWS", + "githuburl":"" + }, + { + "uri":"dws_04_0880.html", + "product_code":"dws", + "code":"629", + "des":"V$SESSION displays all session information about the current session.", + "doc_type":"devg", + "kw":"V$SESSION,System Views,Developer Guide", + "title":"V$SESSION", + "githuburl":"" + }, + { + "uri":"dws_04_0881.html", + "product_code":"dws", + "code":"630", + "des":"V$SESSION_LONGOPS displays the progress of ongoing operations.", + "doc_type":"devg", + "kw":"V$SESSION_LONGOPS,System Views,Developer Guide", + "title":"V$SESSION_LONGOPS", + "githuburl":"" + }, + { + "uri":"dws_04_0883.html", + "product_code":"dws", + "code":"631", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"GUC Parameters", + "title":"GUC Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0884.html", + "product_code":"dws", + "code":"632", + "des":"GaussDB(DWS) GUC parameters can control database system behaviors. You can check and adjust the GUC parameters based on your business scenario and data volume.After a clu", + "doc_type":"devg", + "kw":"Viewing GUC Parameters,GUC Parameters,Developer Guide", + "title":"Viewing GUC Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0885.html", + "product_code":"dws", + "code":"633", + "des":"To ensure the optimal performance of GaussDB(DWS), you can adjust the GUC parameters in the database.The GUC parameters of GaussDB(DWS) are classified into the following ", + "doc_type":"devg", + "kw":"Configuring GUC Parameters,GUC Parameters,Developer Guide", + "title":"Configuring GUC Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0886.html", + "product_code":"dws", + "code":"634", + "des":"The database provides many operation parameters. Configuration of these parameters affects the behavior of the database system. Before modifying these parameters, learn t", + "doc_type":"devg", + "kw":"GUC Parameter Usage,GUC Parameters,Developer Guide", + "title":"GUC Parameter Usage", + "githuburl":"" + }, + { + "uri":"dws_04_0888.html", + "product_code":"dws", + "code":"635", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Connection and Authentication", + "title":"Connection and Authentication", + "githuburl":"" + }, + { + "uri":"dws_04_0889.html", + "product_code":"dws", + "code":"636", + "des":"This section describes parameters related to the connection mode between the client and server.Parameter description: Specifies the maximum number of allowed parallel con", + "doc_type":"devg", + "kw":"Connection Settings,Connection and Authentication,Developer Guide", + "title":"Connection Settings", + "githuburl":"" + }, + { + "uri":"dws_04_0890.html", + "product_code":"dws", + "code":"637", + "des":"This section describes parameters about how to securely authenticate the client and server.Parameter description: Specifies the longest duration to wait before the client", + "doc_type":"devg", + "kw":"Security and Authentication (postgresql.conf),Connection and Authentication,Developer Guide", + "title":"Security and Authentication (postgresql.conf)", + "githuburl":"" + }, + { + "uri":"dws_04_0891.html", + "product_code":"dws", + "code":"638", + "des":"This section describes parameter settings and value ranges for communication libraries.Parameter description: Specifies whether the communication library uses the TCP or ", + "doc_type":"devg", + "kw":"Communication Library Parameters,Connection and Authentication,Developer Guide", + "title":"Communication Library Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0892.html", + "product_code":"dws", + "code":"639", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Resource Consumption", + "title":"Resource Consumption", + "githuburl":"" + }, + { + "uri":"dws_04_0893.html", + "product_code":"dws", + "code":"640", + "des":"This section describes memory parameters.Parameters described in this section take effect only after the database service restarts.Parameter description: Specifies whethe", + "doc_type":"devg", + "kw":"Memory,Resource Consumption,Developer Guide", + "title":"Memory", + "githuburl":"" + }, + { + "uri":"dws_04_0894.html", + "product_code":"dws", + "code":"641", + "des":"This section describes parameters related to statement disk space control, which are used to limit the disk space usage of statements.Parameter description: Specifies the", + "doc_type":"devg", + "kw":"Statement Disk Space Control,Resource Consumption,Developer Guide", + "title":"Statement Disk Space Control", + "githuburl":"" + }, + { + "uri":"dws_04_0895.html", + "product_code":"dws", + "code":"642", + "des":"This section describes kernel resource parameters. Whether these parameters take effect depends on OS settings.Parameter description: Specifies the maximum number of simu", + "doc_type":"devg", + "kw":"Kernel Resources,Resource Consumption,Developer Guide", + "title":"Kernel Resources", + "githuburl":"" + }, + { + "uri":"dws_04_0896.html", + "product_code":"dws", + "code":"643", + "des":"This feature allows administrators to reduce the I/O impact of the VACUUM and ANALYZE statements on concurrent database activities. It is often more important to prevent ", + "doc_type":"devg", + "kw":"Cost-based Vacuum Delay,Resource Consumption,Developer Guide", + "title":"Cost-based Vacuum Delay", + "githuburl":"" + }, + { + "uri":"dws_04_0898.html", + "product_code":"dws", + "code":"644", + "des":"Parameter description: Specifies whether O&M personnel are allowed to generate some ADIO logs to locate ADIO issues. This parameter is used only by developers. Common use", + "doc_type":"devg", + "kw":"Asynchronous I/O Operations,Resource Consumption,Developer Guide", + "title":"Asynchronous I/O Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0899.html", + "product_code":"dws", + "code":"645", + "des":"GaussDB(DWS) provides a parallel data import function that enables a large amount of data to be imported in a fast and efficient manner. This section describes parameters", + "doc_type":"devg", + "kw":"Parallel Data Import,GUC Parameters,Developer Guide", + "title":"Parallel Data Import", + "githuburl":"" + }, + { + "uri":"dws_04_0900.html", + "product_code":"dws", + "code":"646", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Write Ahead Logs", + "title":"Write Ahead Logs", + "githuburl":"" + }, + { + "uri":"dws_04_0901.html", + "product_code":"dws", + "code":"647", + "des":"Parameter description: Specifies the level of the information that is written to WALs.Type: POSTMASTERValue range: enumerated valuesminimalAdvantages: Certain bulk operat", + "doc_type":"devg", + "kw":"Settings,Write Ahead Logs,Developer Guide", + "title":"Settings", + "githuburl":"" + }, + { + "uri":"dws_04_0902.html", + "product_code":"dws", + "code":"648", + "des":"Parameter description: Specifies the minimum number of WAL segment files in the period specified by checkpoint_timeout. The size of each log file is 16 MB.Type: SIGHUPVal", + "doc_type":"devg", + "kw":"Checkpoints,Write Ahead Logs,Developer Guide", + "title":"Checkpoints", + "githuburl":"" + }, + { + "uri":"dws_04_0903.html", + "product_code":"dws", + "code":"649", + "des":"Parameter description: When archive_mode is enabled, completed WAL segments are sent to archive storage by setting archive_command.Type: SIGHUPValue range: Booleanon: The", + "doc_type":"devg", + "kw":"Archiving,Write Ahead Logs,Developer Guide", + "title":"Archiving", + "githuburl":"" + }, + { + "uri":"dws_04_0904.html", + "product_code":"dws", + "code":"650", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"HA Replication", + "title":"HA Replication", + "githuburl":"" + }, + { + "uri":"dws_04_0905.html", + "product_code":"dws", + "code":"651", + "des":"Parameter description: Specifies the number of Xlog file segments. Specifies the minimum number of transaction log files stored in the pg_xlog directory. The standby serv", + "doc_type":"devg", + "kw":"Sending Server,HA Replication,Developer Guide", + "title":"Sending Server", + "githuburl":"" + }, + { + "uri":"dws_04_0906.html", + "product_code":"dws", + "code":"652", + "des":"Parameter description: Specifies the number of transactions by which VACUUM will defer the cleanup of invalid row-store table records, so that VACUUM and VACUUM FULL do n", + "doc_type":"devg", + "kw":"Primary Server,HA Replication,Developer Guide", + "title":"Primary Server", + "githuburl":"" + }, + { + "uri":"dws_04_0908.html", + "product_code":"dws", + "code":"653", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Query Planning", + "title":"Query Planning", + "githuburl":"" + }, + { + "uri":"dws_04_0909.html", + "product_code":"dws", + "code":"654", + "des":"These configuration parameters provide a crude method of influencing the query plans chosen by the query optimizer. If the default plan chosen by the optimizer for a part", + "doc_type":"devg", + "kw":"Optimizer Method Configuration,Query Planning,Developer Guide", + "title":"Optimizer Method Configuration", + "githuburl":"" + }, + { + "uri":"dws_04_0910.html", + "product_code":"dws", + "code":"655", + "des":"This section describes the optimizer cost constants. The cost variables described in this section are measured on an arbitrary scale. Only their relative values matter, t", + "doc_type":"devg", + "kw":"Optimizer Cost Constants,Query Planning,Developer Guide", + "title":"Optimizer Cost Constants", + "githuburl":"" + }, + { + "uri":"dws_04_0911.html", + "product_code":"dws", + "code":"656", + "des":"This section describes parameters related to genetic query optimizer. The genetic query optimizer (GEQO) is an algorithm that plans queries by using heuristic searching. ", + "doc_type":"devg", + "kw":"Genetic Query Optimizer,Query Planning,Developer Guide", + "title":"Genetic Query Optimizer", + "githuburl":"" + }, + { + "uri":"dws_04_0912.html", + "product_code":"dws", + "code":"657", + "des":"Parameter description: Specifies the default statistics target for table columns without a column-specific target set via ALTER TABLE SET STATISTICS. If this parameter is", + "doc_type":"devg", + "kw":"Other Optimizer Options,Query Planning,Developer Guide", + "title":"Other Optimizer Options", + "githuburl":"" + }, + { + "uri":"dws_04_0913.html", + "product_code":"dws", + "code":"658", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Error Reporting and Logging", + "title":"Error Reporting and Logging", + "githuburl":"" + }, + { + "uri":"dws_04_0914.html", + "product_code":"dws", + "code":"659", + "des":"Parameter description: Specifies the writing mode of the log files when logging_collector is set to on.Type: SIGHUPValue range: Booleanon indicates that GaussDB(DWS) over", + "doc_type":"devg", + "kw":"Logging Destination,Error Reporting and Logging,Developer Guide", + "title":"Logging Destination", + "githuburl":"" + }, + { + "uri":"dws_04_0915.html", + "product_code":"dws", + "code":"660", + "des":"Parameter description: Specifies which level of messages are sent to the client. Each level covers all the levels following it. The lower the level is, the fewer messages", + "doc_type":"devg", + "kw":"Logging Time,Error Reporting and Logging,Developer Guide", + "title":"Logging Time", + "githuburl":"" + }, + { + "uri":"dws_04_0916.html", + "product_code":"dws", + "code":"661", + "des":"Parameter description: Specifies whether to print parsing tree results.Type: SIGHUPValue range: Booleanon indicates the printing result function is enabled.off indicates ", + "doc_type":"devg", + "kw":"Logging Content,Error Reporting and Logging,Developer Guide", + "title":"Logging Content", + "githuburl":"" + }, + { + "uri":"dws_04_0918.html", + "product_code":"dws", + "code":"662", + "des":"During cluster running, error scenarios can be detected in a timely manner to inform users as soon as possible.Parameter description: Enables the alarm detection thread t", + "doc_type":"devg", + "kw":"Alarm Detection,GUC Parameters,Developer Guide", + "title":"Alarm Detection", + "githuburl":"" + }, + { + "uri":"dws_04_0919.html", + "product_code":"dws", + "code":"663", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Statistics During the Database Running", + "title":"Statistics During the Database Running", + "githuburl":"" + }, + { + "uri":"dws_04_0920.html", + "product_code":"dws", + "code":"664", + "des":"The query and index statistics collector is used to collect statistics during database running. The statistics include the times of inserting and updating a table and an ", + "doc_type":"devg", + "kw":"Query and Index Statistics Collector,Statistics During the Database Running,Developer Guide", + "title":"Query and Index Statistics Collector", + "githuburl":"" + }, + { + "uri":"dws_04_0921.html", + "product_code":"dws", + "code":"665", + "des":"During the running of the database, the lock access, disk I/O operation, and invalid message process are involved. All these operations are the bottleneck of the database", + "doc_type":"devg", + "kw":"Performance Statistics,Statistics During the Database Running,Developer Guide", + "title":"Performance Statistics", + "githuburl":"" + }, + { + "uri":"dws_04_0922.html", + "product_code":"dws", + "code":"666", + "des":"If database resource usage is not controlled, concurrent tasks easily preempt resources. As a result, the OS will be overloaded and cannot respond to user tasks; or even ", + "doc_type":"devg", + "kw":"Workload Management,GUC Parameters,Developer Guide", + "title":"Workload Management", + "githuburl":"" + }, + { + "uri":"dws_04_0923.html", + "product_code":"dws", + "code":"667", + "des":"The automatic cleanup process (autovacuum) in the system automatically runs the VACUUM and ANALYZE commands to recycle the record space marked by the deleted status and u", + "doc_type":"devg", + "kw":"Automatic Cleanup,GUC Parameters,Developer Guide", + "title":"Automatic Cleanup", + "githuburl":"" + }, + { + "uri":"dws_04_0924.html", + "product_code":"dws", + "code":"668", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Default Settings of Client Connection", + "title":"Default Settings of Client Connection", + "githuburl":"" + }, + { + "uri":"dws_04_0925.html", + "product_code":"dws", + "code":"669", + "des":"This section describes related default parameters involved in the execution of SQL statements.Parameter description: Specifies the order in which schemas are searched whe", + "doc_type":"devg", + "kw":"Statement Behavior,Default Settings of Client Connection,Developer Guide", + "title":"Statement Behavior", + "githuburl":"" + }, + { + "uri":"dws_04_0926.html", + "product_code":"dws", + "code":"670", + "des":"This section describes parameters related to the time format setting.Parameter description: Specifies the display format for date and time values, as well as the rules fo", + "doc_type":"devg", + "kw":"Zone and Formatting,Default Settings of Client Connection,Developer Guide", + "title":"Zone and Formatting", + "githuburl":"" + }, + { + "uri":"dws_04_0927.html", + "product_code":"dws", + "code":"671", + "des":"This section describes the default database loading parameters of the database system.Parameter description: Specifies the path for saving the shared database files that ", + "doc_type":"devg", + "kw":"Other Default Parameters,Default Settings of Client Connection,Developer Guide", + "title":"Other Default Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0928.html", + "product_code":"dws", + "code":"672", + "des":"In GaussDB(DWS), a deadlock may occur when concurrently executed transactions compete for resources. This section describes parameters used for managing transaction lock ", + "doc_type":"devg", + "kw":"Lock Management,GUC Parameters,Developer Guide", + "title":"Lock Management", + "githuburl":"" + }, + { + "uri":"dws_04_0929.html", + "product_code":"dws", + "code":"673", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Version and Platform Compatibility", + "title":"Version and Platform Compatibility", + "githuburl":"" + }, + { + "uri":"dws_04_0930.html", + "product_code":"dws", + "code":"674", + "des":"This section describes the parameter control of the downward compatibility and external compatibility features of GaussDB(DWS). Backward compatibility of the database sys", + "doc_type":"devg", + "kw":"Compatibility with Earlier Versions,Version and Platform Compatibility,Developer Guide", + "title":"Compatibility with Earlier Versions", + "githuburl":"" + }, + { + "uri":"dws_04_0931.html", + "product_code":"dws", + "code":"675", + "des":"Many platforms use the database system. External compatibility of the database system provides a lot of convenience for platforms.Parameter description: Determines whethe", + "doc_type":"devg", + "kw":"Platform and Client Compatibility,Version and Platform Compatibility,Developer Guide", + "title":"Platform and Client Compatibility", + "githuburl":"" + }, + { + "uri":"dws_04_0932.html", + "product_code":"dws", + "code":"676", + "des":"This section describes parameters used for controlling the methods that the server processes an error occurring in the database system.Parameter description: Specifies wh", + "doc_type":"devg", + "kw":"Fault Tolerance,GUC Parameters,Developer Guide", + "title":"Fault Tolerance", + "githuburl":"" + }, + { + "uri":"dws_04_0933.html", + "product_code":"dws", + "code":"677", + "des":"When a connection pool is used to access the database, database connections are established and then stored in the memory as objects during system running. When you need ", + "doc_type":"devg", + "kw":"Connection Pool Parameters,GUC Parameters,Developer Guide", + "title":"Connection Pool Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0934.html", + "product_code":"dws", + "code":"678", + "des":"This section describes the settings and value ranges of cluster transaction parameters.Parameter description: Specifies the isolation level of the current transaction.Typ", + "doc_type":"devg", + "kw":"Cluster Transaction Parameters,GUC Parameters,Developer Guide", + "title":"Cluster Transaction Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0936.html", + "product_code":"dws", + "code":"679", + "des":"Parameter description: Specifies whether to enable the lightweight column-store update.Type: USERSETValue range: Booleanon indicates that the lightweight column-store upd", + "doc_type":"devg", + "kw":"Developer Operations,GUC Parameters,Developer Guide", + "title":"Developer Operations", + "githuburl":"" + }, + { + "uri":"dws_04_0937.html", + "product_code":"dws", + "code":"680", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Auditing", + "title":"Auditing", + "githuburl":"" + }, + { + "uri":"dws_04_0938.html", + "product_code":"dws", + "code":"681", + "des":"Parameter description: Specifies whether to enable or disable the audit process. After the audit process is enabled, the auditing information written by the background pr", + "doc_type":"devg", + "kw":"Audit Switch,Auditing,Developer Guide", + "title":"Audit Switch", + "githuburl":"" + }, + { + "uri":"dws_04_0940.html", + "product_code":"dws", + "code":"682", + "des":"Parameter description: Specifies whether to audit successful operations in GaussDB(DWS). Set this parameter as required.Type: SIGHUPValue range: a stringnone: indicates t", + "doc_type":"devg", + "kw":"Operation Audit,Auditing,Developer Guide", + "title":"Operation Audit", + "githuburl":"" + }, + { + "uri":"dws_04_0941.html", + "product_code":"dws", + "code":"683", + "des":"The automatic rollback transaction can be monitored and its statement problems can be located by setting the transaction timeout warning. In addition, the statements with", + "doc_type":"devg", + "kw":"Transaction Monitoring,GUC Parameters,Developer Guide", + "title":"Transaction Monitoring", + "githuburl":"" + }, + { + "uri":"dws_04_0945.html", + "product_code":"dws", + "code":"684", + "des":"Parameter description: If an SQL statement involves tables belonging to different groups, you can enable this parameter to push the execution plan of the statement to imp", + "doc_type":"devg", + "kw":"Miscellaneous Parameters,GUC Parameters,Developer Guide", + "title":"Miscellaneous Parameters", + "githuburl":"" + }, + { + "uri":"dws_04_0946.html", + "product_code":"dws", + "code":"685", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Glossary,Developer Guide,Developer Guide", + "title":"Glossary", + "githuburl":"" + }, + { + "uri":"dws_04_2000.html", + "product_code":"dws", + "code":"686", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"SQL Syntax Reference", + "title":"SQL Syntax Reference", + "githuburl":"" + }, + { + "uri":"dws_06_0001.html", + "product_code":"dws", + "code":"687", + "des":"SQL is a standard computer language used to control the access to databases and manage data in databases.SQL provides different statements to enable you to:Query data.Ins", + "doc_type":"devg", + "kw":"GaussDB(DWS) SQL,SQL Syntax Reference,Developer Guide", + "title":"GaussDB(DWS) SQL", + "githuburl":"" + }, + { + "uri":"dws_06_0002.html", + "product_code":"dws", + "code":"688", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Differences Between GaussDB(DWS) and PostgreSQL", + "title":"Differences Between GaussDB(DWS) and PostgreSQL", + "githuburl":"" + }, + { + "uri":"dws_06_0003.html", + "product_code":"dws", + "code":"689", + "des":"GaussDB(DWS) gsql differs from PostgreSQL psql in that the former has made the following changes to enhance security:User passwords cannot be set by running the \\password", + "doc_type":"devg", + "kw":"GaussDB(DWS) gsql, PostgreSQL psql, and libpq,Differences Between GaussDB(DWS) and PostgreSQL,Develo", + "title":"GaussDB(DWS) gsql, PostgreSQL psql, and libpq", + "githuburl":"" + }, + { + "uri":"dws_06_0004.html", + "product_code":"dws", + "code":"690", + "des":"For details about supported data types by GaussDB(DWS), see Data Types.The following PostgreSQL data type is not supported:Lines, a geometric typepg_node_tree", + "doc_type":"devg", + "kw":"Data Type Differences,Differences Between GaussDB(DWS) and PostgreSQL,Developer Guide", + "title":"Data Type Differences", + "githuburl":"" + }, + { + "uri":"dws_06_0005.html", + "product_code":"dws", + "code":"691", + "des":"For details about the functions supported by GaussDB(DWS), see Functions and Operators.The following PostgreSQL functions are not supported:Enum support functionsAccess p", + "doc_type":"devg", + "kw":"Function Differences,Differences Between GaussDB(DWS) and PostgreSQL,Developer Guide", + "title":"Function Differences", + "githuburl":"" + }, + { + "uri":"dws_06_0006.html", + "product_code":"dws", + "code":"692", + "des":"Table inheritanceTable creation features:Use REFERENCES reftable [ (refcolumn) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] t", + "doc_type":"devg", + "kw":"PostgreSQL Features Unsupported by GaussDB(DWS),Differences Between GaussDB(DWS) and PostgreSQL,Deve", + "title":"PostgreSQL Features Unsupported by GaussDB(DWS)", + "githuburl":"" + }, + { + "uri":"dws_06_0007.html", + "product_code":"dws", + "code":"693", + "des":"The SQL contains reserved and non-reserved words. Standards require that reserved keywords not be used as other identifiers. Non-reserved keywords have special meanings o", + "doc_type":"devg", + "kw":"Keyword,SQL Syntax Reference,Developer Guide", + "title":"Keyword", + "githuburl":"" + }, + { + "uri":"dws_06_0008.html", + "product_code":"dws", + "code":"694", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Data Types", + "title":"Data Types", + "githuburl":"" + }, + { + "uri":"dws_06_0009.html", + "product_code":"dws", + "code":"695", + "des":"Numeric types consist of two-, four-, and eight-byte integers, four- and eight-byte floating-point numbers, and selectable-precision decimals.For details about numeric op", + "doc_type":"devg", + "kw":"Numeric Types,Data Types,Developer Guide", + "title":"Numeric Types", + "githuburl":"" + }, + { + "uri":"dws_06_0010.html", + "product_code":"dws", + "code":"696", + "des":"The money type stores a currency amount with fixed fractional precision. The range shown in Table 1 assumes there are two fractional digits. Input is accepted in a variet", + "doc_type":"devg", + "kw":"Monetary Types,Data Types,Developer Guide", + "title":"Monetary Types", + "githuburl":"" + }, + { + "uri":"dws_06_0011.html", + "product_code":"dws", + "code":"697", + "des":"Valid literal values for the \"true\" state are:TRUE, 't', 'true', 'y', 'yes', '1'Valid literal values for the \"false\" state include:FALSE, 'f', 'false', 'n', 'no', '0'TRUE", + "doc_type":"devg", + "kw":"Boolean Type,Data Types,Developer Guide", + "title":"Boolean Type", + "githuburl":"" + }, + { + "uri":"dws_06_0012.html", + "product_code":"dws", + "code":"698", + "des":"Table 1 lists the character types that can be used in GaussDB(DWS). For string operators and related built-in functions, see Character Processing Functions and Operators.", + "doc_type":"devg", + "kw":"Character Types,Data Types,Developer Guide", + "title":"Character Types", + "githuburl":"" + }, + { + "uri":"dws_06_0013.html", + "product_code":"dws", + "code":"699", + "des":"Table 1 lists the binary data types that can be used in GaussDB(DWS).In addition to the size limitation on each column, the total size of each tuple is 8203 bytes less th", + "doc_type":"devg", + "kw":"Binary Data Types,Data Types,Developer Guide", + "title":"Binary Data Types", + "githuburl":"" + }, + { + "uri":"dws_06_0014.html", + "product_code":"dws", + "code":"700", + "des":"Table 1 lists date and time types supported by GaussDB(DWS). For the operators and built-in functions of the types, see Date and Time Processing Functions and Operators.I", + "doc_type":"devg", + "kw":"Date/Time Types,Data Types,Developer Guide", + "title":"Date/Time Types", + "githuburl":"" + }, + { + "uri":"dws_06_0015.html", + "product_code":"dws", + "code":"701", + "des":"Table 1 lists the geometric types that can be used in GaussDB(DWS). The most fundamental type, the point, forms the basis for all of the other types.A rich set of functio", + "doc_type":"devg", + "kw":"Geometric Types,Data Types,Developer Guide", + "title":"Geometric Types", + "githuburl":"" + }, + { + "uri":"dws_06_0016.html", + "product_code":"dws", + "code":"702", + "des":"GaussDB(DWS) offers data types to store IPv4, IPv6, and MAC addresses.It is better to use network address types instead of plaintext types to store IPv4, IPv6, and MAC ad", + "doc_type":"devg", + "kw":"Network Address Types,Data Types,Developer Guide", + "title":"Network Address Types", + "githuburl":"" + }, + { + "uri":"dws_06_0017.html", + "product_code":"dws", + "code":"703", + "des":"Bit strings are strings of 1's and 0's. They can be used to store bit masks.GaussDB(DWS) supports two SQL bit types: bit(n) and bit varying(n), where n is a positive inte", + "doc_type":"devg", + "kw":"Bit String Types,Data Types,Developer Guide", + "title":"Bit String Types", + "githuburl":"" + }, + { + "uri":"dws_06_0018.html", + "product_code":"dws", + "code":"704", + "des":"GaussDB(DWS) offers two data types that are designed to support full text search. The tsvector type represents a document in a form optimized for text search. The tsquery", + "doc_type":"devg", + "kw":"Text Search Types,Data Types,Developer Guide", + "title":"Text Search Types", + "githuburl":"" + }, + { + "uri":"dws_06_0019.html", + "product_code":"dws", + "code":"705", + "des":"The data type UUID stores Universally Unique Identifiers (UUID) as defined by RFC 4122, ISO/IEF 9834-8:2005, and related standards. This identifier is a 128-bit quantity ", + "doc_type":"devg", + "kw":"UUID Type,Data Types,Developer Guide", + "title":"UUID Type", + "githuburl":"" + }, + { + "uri":"dws_06_0020.html", + "product_code":"dws", + "code":"706", + "des":"JSON data types are for storing JavaScript Object Notation (JSON) data. Such data can also be stored as TEXT, but the JSON data type has the advantage of checking that ea", + "doc_type":"devg", + "kw":"JSON Types,Data Types,Developer Guide", + "title":"JSON Types", + "githuburl":"" + }, + { + "uri":"dws_06_0021.html", + "product_code":"dws", + "code":"707", + "des":"HyperLoglog (HLL) is an approximation algorithm for efficiently counting the number of distinct values in a data set. It features faster computing and lower space usage. ", + "doc_type":"devg", + "kw":"HLL Data Types,Data Types,Developer Guide", + "title":"HLL Data Types", + "githuburl":"" + }, + { + "uri":"dws_06_0022.html", + "product_code":"dws", + "code":"708", + "des":"Object identifiers (OIDs) are used internally by GaussDB(DWS) as primary keys for various system catalogs. OIDs are not added to user-created tables by the system. The OI", + "doc_type":"devg", + "kw":"Object Identifier Types,Data Types,Developer Guide", + "title":"Object Identifier Types", + "githuburl":"" + }, + { + "uri":"dws_06_0023.html", + "product_code":"dws", + "code":"709", + "des":"GaussDB(DWS) has a number of special-purpose entries that are collectively called pseudo-types. A pseudo-type cannot be used as a column data type, but it can be used to ", + "doc_type":"devg", + "kw":"Pseudo-Types,Data Types,Developer Guide", + "title":"Pseudo-Types", + "githuburl":"" + }, + { + "uri":"dws_06_0024.html", + "product_code":"dws", + "code":"710", + "des":"Table 1 lists the data types supported by column-store tables.", + "doc_type":"devg", + "kw":"Data Types Supported by Column-Store Tables,Data Types,Developer Guide", + "title":"Data Types Supported by Column-Store Tables", + "githuburl":"" + }, + { + "uri":"dws_06_0025.html", + "product_code":"dws", + "code":"711", + "des":"XML data type stores Extensible Markup Language (XML) formatted data. Such data can also be stored as text, but the advantage of the XML data type is that it checks wheth", + "doc_type":"devg", + "kw":"XML,Data Types,Developer Guide", + "title":"XML", + "githuburl":"" + }, + { + "uri":"dws_06_0026.html", + "product_code":"dws", + "code":"712", + "des":"Table 1 lists the constants and macros that can be used in GaussDB(DWS).", + "doc_type":"devg", + "kw":"Constant and Macro,SQL Syntax Reference,Developer Guide", + "title":"Constant and Macro", + "githuburl":"" + }, + { + "uri":"dws_06_0027.html", + "product_code":"dws", + "code":"713", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Functions and Operators", + "title":"Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0028.html", + "product_code":"dws", + "code":"714", + "des":"The usual logical operators include AND, OR, and NOT. SQL uses a three-valued logical system with true, false, and null, which represents \"unknown\". Their priorities are ", + "doc_type":"devg", + "kw":"Logical Operators,Functions and Operators,Developer Guide", + "title":"Logical Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0029.html", + "product_code":"dws", + "code":"715", + "des":"Comparison operators are available for all data types and return Boolean values.All comparison operators are binary operators. Only data types that are the same or can be", + "doc_type":"devg", + "kw":"Comparison Operators,Functions and Operators,Developer Guide", + "title":"Comparison Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0030.html", + "product_code":"dws", + "code":"716", + "des":"String functions and operators provided by GaussDB(DWS) are for concatenating strings with each other, concatenating strings with non-strings, and matching the patterns o", + "doc_type":"devg", + "kw":"Character Processing Functions and Operators,Functions and Operators,Developer Guide", + "title":"Character Processing Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0031.html", + "product_code":"dws", + "code":"717", + "des":"SQL defines some string functions that use keywords, rather than commas, to separate arguments.octet_length(string)Description: Number of bytes in binary stringReturn typ", + "doc_type":"devg", + "kw":"Binary String Functions and Operators,Functions and Operators,Developer Guide", + "title":"Binary String Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0032.html", + "product_code":"dws", + "code":"718", + "des":"Aside from the usual comparison operators, the following operators can be used. Bit string operands of &, |, and # must be of equal length. When bit shifting, the origina", + "doc_type":"devg", + "kw":"Bit String Functions and Operators,Functions and Operators,Developer Guide", + "title":"Bit String Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0033.html", + "product_code":"dws", + "code":"719", + "des":"There are three separate approaches to pattern matching provided by the database: the traditional SQL LIKE operator, the more recent SIMILAR TO operator, and POSIX-style ", + "doc_type":"devg", + "kw":"Pattern Matching Operators,Functions and Operators,Developer Guide", + "title":"Pattern Matching Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0034.html", + "product_code":"dws", + "code":"720", + "des":"+Description: AdditionFor example:SELECT 2+3 AS RESULT;\n result \n--------\n 5\n(1 row)Description: AdditionFor example:-Description: SubtractionFor example:SELECT 2-3 ", + "doc_type":"devg", + "kw":"Mathematical Functions and Operators,Functions and Operators,Developer Guide", + "title":"Mathematical Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0035.html", + "product_code":"dws", + "code":"721", + "des":"When the user uses date/time operators, explicit type prefixes are modified for corresponding operands to ensure that the operands parsed by the database are consistent w", + "doc_type":"devg", + "kw":"Date and Time Processing Functions and Operators,Functions and Operators,Developer Guide", + "title":"Date and Time Processing Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0036.html", + "product_code":"dws", + "code":"722", + "des":"cast(x as y)Description: Converts x into the type specified by y.For example:SELECT cast('22-oct-1997' as timestamp);\n timestamp \n---------------------\n 1997-10", + "doc_type":"devg", + "kw":"Type Conversion Functions,Functions and Operators,Developer Guide", + "title":"Type Conversion Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0037.html", + "product_code":"dws", + "code":"723", + "des":"+Description: TranslationFor example:SELECT box '((0,0),(1,1))' + point '(2.0,0)' AS RESULT;\n result \n-------------\n (3,1),(2,0)\n(1 row)Description: TranslationFor e", + "doc_type":"devg", + "kw":"Geometric Functions and Operators,Functions and Operators,Developer Guide", + "title":"Geometric Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0038.html", + "product_code":"dws", + "code":"724", + "des":"The operators <<, <<=, >>, and >>= test for subnet inclusion. They consider only the network parts of the two addresses (ignoring any host part) and determine whether one", + "doc_type":"devg", + "kw":"Network Address Functions and Operators,Functions and Operators,Developer Guide", + "title":"Network Address Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0039.html", + "product_code":"dws", + "code":"725", + "des":"@@Description: Specifies whether the tsvector-typed words match the tsquery-typed words.For example:SELECT to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') AS ", + "doc_type":"devg", + "kw":"Text Search Functions and Operators,Functions and Operators,Developer Guide", + "title":"Text Search Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0040.html", + "product_code":"dws", + "code":"726", + "des":"UUID functions are used to generate UUID data (see UUID Type).uuid_generate_v1()Description: Generates a UUID sequence number.Return type: UUIDExample:SELECT uuid_generat", + "doc_type":"devg", + "kw":"UUID Functions,Functions and Operators,Developer Guide", + "title":"UUID Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0041.html", + "product_code":"dws", + "code":"727", + "des":"JSON functions are used to generate JSON data (see JSON Types).array_to_json(anyarray [, pretty_bool])Description: Returns the array as JSON. A multi-dimensional array be", + "doc_type":"devg", + "kw":"JSON Functions,Functions and Operators,Developer Guide", + "title":"JSON Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0042.html", + "product_code":"dws", + "code":"728", + "des":"hll_hash_boolean(bool)Description: Hashes data of the bool type.Return type: hll_hashvalFor example:SELECT hll_hash_boolean(FALSE);\n hll_hash_boolean \n----------------", + "doc_type":"devg", + "kw":"HLL Functions and Operators,Functions and Operators,Developer Guide", + "title":"HLL Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0043.html", + "product_code":"dws", + "code":"729", + "des":"The sequence functions provide a simple method to ensure security of multiple users for users to obtain sequence values from sequence objects.The hybrid data warehouse (s", + "doc_type":"devg", + "kw":"SEQUENCE Functions,Functions and Operators,Developer Guide", + "title":"SEQUENCE Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0044.html", + "product_code":"dws", + "code":"730", + "des":"=Description: Specifies whether two arrays are equal.For example:SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] AS RESULT ;\n result \n--------\n t\n(1 row)Description: Spec", + "doc_type":"devg", + "kw":"Array Functions and Operators,Functions and Operators,Developer Guide", + "title":"Array Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0045.html", + "product_code":"dws", + "code":"731", + "des":"=Description: EqualsFor example:SELECT int4range(1,5) = '[1,4]'::int4range AS RESULT;\n result\n--------\n t\n(1 row)Description: EqualsFor example:<>Description: Does not eq", + "doc_type":"devg", + "kw":"Range Functions and Operators,Functions and Operators,Developer Guide", + "title":"Range Functions and Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0046.html", + "product_code":"dws", + "code":"732", + "des":"sum(expression)Description: Sum of expression across all input valuesReturn type:Generally, same as the argument data type. In the following cases, type conversion occurs", + "doc_type":"devg", + "kw":"Aggregate Functions,Functions and Operators,Developer Guide", + "title":"Aggregate Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0047.html", + "product_code":"dws", + "code":"733", + "des":"Regular aggregate functions return a single value calculated from values in a row, or group all rows into a single output row. Window functions perform a calculation acro", + "doc_type":"devg", + "kw":"Window Functions,Functions and Operators,Developer Guide", + "title":"Window Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0048.html", + "product_code":"dws", + "code":"734", + "des":"gs_password_deadline()Description: Indicates the number of remaining days before the password of the current user expires. After the password expires, the system prompts ", + "doc_type":"devg", + "kw":"Security Functions,Functions and Operators,Developer Guide", + "title":"Security Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0049.html", + "product_code":"dws", + "code":"735", + "des":"generate_series(start, stop)Description: Generates a series of values, from start to stop with a step size of one.Parameter type: int, bigint, or numericReturn type: seto", + "doc_type":"devg", + "kw":"Set Returning Functions,Functions and Operators,Developer Guide", + "title":"Set Returning Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0050.html", + "product_code":"dws", + "code":"736", + "des":"coalesce(expr1, expr2, ..., exprn)Description: Returns the first argument that is not NULL in the argument list.COALESCE(expr1, expr2) is equivalent to CASE WHEN expr1 IS", + "doc_type":"devg", + "kw":"Conditional Expression Functions,Functions and Operators,Developer Guide", + "title":"Conditional Expression Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0051.html", + "product_code":"dws", + "code":"737", + "des":"current_catalogDescription: Name of the current database (called \"catalog\" in the SQL standard)Return type: nameFor example:SELECT current_catalog;\n current_database\n----", + "doc_type":"devg", + "kw":"System Information Functions,Functions and Operators,Developer Guide", + "title":"System Information Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0052.html", + "product_code":"dws", + "code":"738", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"System Administration Functions", + "title":"System Administration Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0053.html", + "product_code":"dws", + "code":"739", + "des":"Configuration setting functions are used for querying and modifying configuration parameters during running.current_setting(setting_name)Description: Specifies the curren", + "doc_type":"devg", + "kw":"Configuration Settings Functions,System Administration Functions,Developer Guide", + "title":"Configuration Settings Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0054.html", + "product_code":"dws", + "code":"740", + "des":"Universal file access functions provide local access interfaces for files on a database server. Only files in the database cluster directory and the log_directory directo", + "doc_type":"devg", + "kw":"Universal File Access Functions,System Administration Functions,Developer Guide", + "title":"Universal File Access Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0055.html", + "product_code":"dws", + "code":"741", + "des":"Server signaling functions send control signals to other server processes. Only system administrators can use these functions.pg_cancel_backend(pid int)Description: Cance", + "doc_type":"devg", + "kw":"Server Signaling Functions,System Administration Functions,Developer Guide", + "title":"Server Signaling Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0056.html", + "product_code":"dws", + "code":"742", + "des":"Backup control functions help online backup.pg_create_restore_point(name text)Description: Creates a named point for performing the restore operation (restricted to syste", + "doc_type":"devg", + "kw":"Backup and Restoration Control Functions,System Administration Functions,Developer Guide", + "title":"Backup and Restoration Control Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0057.html", + "product_code":"dws", + "code":"743", + "des":"Snapshot synchronization functions save the current snapshot and return its identifier.pg_export_snapshot()Description: Saves the current snapshot and returns its identif", + "doc_type":"devg", + "kw":"Snapshot Synchronization Functions,System Administration Functions,Developer Guide", + "title":"Snapshot Synchronization Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0058.html", + "product_code":"dws", + "code":"744", + "des":"Database object size functions calculate the actual disk space used by database objects.pg_column_size(any)Description: Specifies the number of bytes used to store a part", + "doc_type":"devg", + "kw":"Database Object Functions,System Administration Functions,Developer Guide", + "title":"Database Object Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0059.html", + "product_code":"dws", + "code":"745", + "des":"Advisory lock functions manage advisory locks. These functions are only for internal use currently.pg_advisory_lock(key bigint)Description: Obtains an exclusive session-l", + "doc_type":"devg", + "kw":"Advisory Lock Functions,System Administration Functions,Developer Guide", + "title":"Advisory Lock Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0060.html", + "product_code":"dws", + "code":"746", + "des":"pg_get_residualfiles()Description: Obtains all residual file records of the current node. This function is an instance-level function and is irrelevant to the current dat", + "doc_type":"devg", + "kw":"Residual File Management Functions,System Administration Functions,Developer Guide", + "title":"Residual File Management Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0061.html", + "product_code":"dws", + "code":"747", + "des":"A replication function synchronizes logs and data between instances. It is a statistics or operation method provided by the system to implement HA.Replication functions e", + "doc_type":"devg", + "kw":"Replication Functions,System Administration Functions,Developer Guide", + "title":"Replication Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0062.html", + "product_code":"dws", + "code":"748", + "des":"pgxc_pool_check()Description: Checks whether the connection data buffered in the pool is consistent with pgxc_node.Return type: booleanDescription: Checks whether the con", + "doc_type":"devg", + "kw":"Other Functions,System Administration Functions,Developer Guide", + "title":"Other Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0063.html", + "product_code":"dws", + "code":"749", + "des":"This section describes the functions of the resource management module.gs_wlm_readjust_user_space(oid)Description: This function calibrates the permanent storage space of", + "doc_type":"devg", + "kw":"Resource Management Functions,System Administration Functions,Developer Guide", + "title":"Resource Management Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0064.html", + "product_code":"dws", + "code":"750", + "des":"Data redaction functions are used to mask and protect sensitive data. Generally, you are advised to bind these functions to the columns to be redacted based on the data r", + "doc_type":"devg", + "kw":"Data Redaction Functions,Functions and Operators,Developer Guide", + "title":"Data Redaction Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0065.html", + "product_code":"dws", + "code":"751", + "des":"Statistics information functions are divided into the following two categories: functions that access databases, using the OID of each table or index in a database to mar", + "doc_type":"devg", + "kw":"Statistics Information Functions,Functions and Operators,Developer Guide", + "title":"Statistics Information Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0066.html", + "product_code":"dws", + "code":"752", + "des":"pg_get_triggerdef(oid)Description: Obtains the definition information of a trigger.Parameter: OID of the trigger to be queriedReturn type: textExample:select pg_get_trigg", + "doc_type":"devg", + "kw":"Trigger Functions,Functions and Operators,Developer Guide", + "title":"Trigger Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0067.html", + "product_code":"dws", + "code":"753", + "des":"XMLPARSE ( { DOCUMENT | CONTENT } value)Description: Generates an XML value from character data.Return type: XMLExample:XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS typ", + "doc_type":"devg", + "kw":"XML Functions,Functions and Operators,Developer Guide", + "title":"XML Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0068.html", + "product_code":"dws", + "code":"754", + "des":"The pv_memory_profiling(type int) and environment variable MALLOC_CONF are used by GaussDB(DWS) to control the enabling and disabling of the memory allocation call stack ", + "doc_type":"devg", + "kw":"Call Stack Recording Functions,Functions and Operators,Developer Guide", + "title":"Call Stack Recording Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0069.html", + "product_code":"dws", + "code":"755", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Expressions", + "title":"Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0070.html", + "product_code":"dws", + "code":"756", + "des":"Logical Operators lists the operators and calculation rules of logical expressions.Comparison Operators lists the common comparative operators.In addition to comparative ", + "doc_type":"devg", + "kw":"Simple Expressions,Expressions,Developer Guide", + "title":"Simple Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0071.html", + "product_code":"dws", + "code":"757", + "des":"Data that meets the requirements specified by conditional expressions are filtered during SQL statement execution.Conditional expressions include the following types:CASE", + "doc_type":"devg", + "kw":"Conditional Expressions,Expressions,Developer Guide", + "title":"Conditional Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0072.html", + "product_code":"dws", + "code":"758", + "des":"Subquery expressions include the following types:EXISTS/NOT EXISTSFigure 1 shows the syntax of an EXISTS/NOT EXISTS expression.EXISTS/NOT EXISTS::=The parameter of an EXI", + "doc_type":"devg", + "kw":"Subquery Expressions,Expressions,Developer Guide", + "title":"Subquery Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0073.html", + "product_code":"dws", + "code":"759", + "des":"expressionIN(value [, ...])The parentheses on the right contain an expression list. The expression result on the left is compared with the content in the expression list.", + "doc_type":"devg", + "kw":"Array Expressions,Expressions,Developer Guide", + "title":"Array Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0074.html", + "product_code":"dws", + "code":"760", + "des":"Syntax:row_constructor operator row_constructorBoth sides of the row expression are row constructors. The values of both rows must have the same number of fields and they", + "doc_type":"devg", + "kw":"Row Expressions,Expressions,Developer Guide", + "title":"Row Expressions", + "githuburl":"" + }, + { + "uri":"dws_06_0075.html", + "product_code":"dws", + "code":"761", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Type Conversion", + "title":"Type Conversion", + "githuburl":"" + }, + { + "uri":"dws_06_0076.html", + "product_code":"dws", + "code":"762", + "des":"SQL is a typed language. That is, every data item has an associated data type which determines its behavior and allowed usage. GaussDB(DWS) has an extensible type system ", + "doc_type":"devg", + "kw":"Overview,Type Conversion,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0077.html", + "product_code":"dws", + "code":"763", + "des":"Select the operators to be considered from the pg_operator system catalog. Considered operators are those with the matching name and argument count. If the search path fi", + "doc_type":"devg", + "kw":"Operators,Type Conversion,Developer Guide", + "title":"Operators", + "githuburl":"" + }, + { + "uri":"dws_06_0078.html", + "product_code":"dws", + "code":"764", + "des":"Select the functions to be considered from the pg_proc system catalog. If a non-schema-qualified function name was used, the functions in the current search path are cons", + "doc_type":"devg", + "kw":"Functions,Type Conversion,Developer Guide", + "title":"Functions", + "githuburl":"" + }, + { + "uri":"dws_06_0079.html", + "product_code":"dws", + "code":"765", + "des":"Search for an exact match with the target column.Try to convert the expression to the target type. This will succeed if there is a registered cast between the two types. ", + "doc_type":"devg", + "kw":"Value Storage,Type Conversion,Developer Guide", + "title":"Value Storage", + "githuburl":"" + }, + { + "uri":"dws_06_0080.html", + "product_code":"dws", + "code":"766", + "des":"SQL UNION constructs must match up possibly dissimilar types to become a single result set. Since all query results from a SELECT UNION statement must appear in a single ", + "doc_type":"devg", + "kw":"UNION, CASE, and Related Constructs,Type Conversion,Developer Guide", + "title":"UNION, CASE, and Related Constructs", + "githuburl":"" + }, + { + "uri":"dws_06_0081.html", + "product_code":"dws", + "code":"767", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Full Text Search", + "title":"Full Text Search", + "githuburl":"" + }, + { + "uri":"dws_06_0082.html", + "product_code":"dws", + "code":"768", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Introduction", + "title":"Introduction", + "githuburl":"" + }, + { + "uri":"dws_06_0083.html", + "product_code":"dws", + "code":"769", + "des":"Textual search operators have been used in databases for years. GaussDB(DWS) has ~, ~*, LIKE, and ILIKE operators for textual data types, but they lack many essential pro", + "doc_type":"devg", + "kw":"Full-Text Retrieval,Introduction,Developer Guide", + "title":"Full-Text Retrieval", + "githuburl":"" + }, + { + "uri":"dws_06_0084.html", + "product_code":"dws", + "code":"770", + "des":"A document is the unit of searching in a full text search system; for example, a magazine article or email message. The text search engine must be able to parse documents", + "doc_type":"devg", + "kw":"What Is a Document?,Introduction,Developer Guide", + "title":"What Is a Document?", + "githuburl":"" + }, + { + "uri":"dws_06_0085.html", + "product_code":"dws", + "code":"771", + "des":"Full text search in GaussDB(DWS) is based on the match operator @@, which returns true if a tsvector (document) matches a tsquery (query). It does not matter which data t", + "doc_type":"devg", + "kw":"Basic Text Matching,Introduction,Developer Guide", + "title":"Basic Text Matching", + "githuburl":"" + }, + { + "uri":"dws_06_0086.html", + "product_code":"dws", + "code":"772", + "des":"Full text search functionality includes the ability to do many more things: skip indexing certain words (stop words), process synonyms, and use sophisticated parsing, for", + "doc_type":"devg", + "kw":"Configurations,Introduction,Developer Guide", + "title":"Configurations", + "githuburl":"" + }, + { + "uri":"dws_06_0087.html", + "product_code":"dws", + "code":"773", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Table and index", + "title":"Table and index", + "githuburl":"" + }, + { + "uri":"dws_06_0088.html", + "product_code":"dws", + "code":"774", + "des":"It is possible to do a full text search without an index.A simple query to print each row that contains the word science in its body column is as follows:DROP SCHEMA IF E", + "doc_type":"devg", + "kw":"Searching a Table,Table and index,Developer Guide", + "title":"Searching a Table", + "githuburl":"" + }, + { + "uri":"dws_06_0089.html", + "product_code":"dws", + "code":"775", + "des":"You can create a GIN index to speed up text searches:The to_tsvector() function accepts one or two augments.If the one-augment version of the index is used, the system wi", + "doc_type":"devg", + "kw":"Creating an Index,Table and index,Developer Guide", + "title":"Creating an Index", + "githuburl":"" + }, + { + "uri":"dws_06_0090.html", + "product_code":"dws", + "code":"776", + "des":"The following is an example of using an index. Run the following statements in a database that uses the UTF-8 or GBK encoding:In this example, table1 has two GIN indexes ", + "doc_type":"devg", + "kw":"Constraints on Index Use,Table and index,Developer Guide", + "title":"Constraints on Index Use", + "githuburl":"" + }, + { + "uri":"dws_06_0091.html", + "product_code":"dws", + "code":"777", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Controlling Text Search", + "title":"Controlling Text Search", + "githuburl":"" + }, + { + "uri":"dws_06_0092.html", + "product_code":"dws", + "code":"778", + "des":"GaussDB(DWS) provides function to_tsvector for converting a document to the tsvector data type.to_tsvector parses a textual document into tokens, reduces the tokens to le", + "doc_type":"devg", + "kw":"Parsing Documents,Controlling Text Search,Developer Guide", + "title":"Parsing Documents", + "githuburl":"" + }, + { + "uri":"dws_06_0093.html", + "product_code":"dws", + "code":"779", + "des":"GaussDB(DWS) provides functions to_tsquery and plainto_tsquery for converting a query to the tsquery data type. to_tsquery offers access to more features than plainto_tsq", + "doc_type":"devg", + "kw":"Parsing Queries,Controlling Text Search,Developer Guide", + "title":"Parsing Queries", + "githuburl":"" + }, + { + "uri":"dws_06_0094.html", + "product_code":"dws", + "code":"780", + "des":"Ranking attempts to measure how relevant documents are to a particular query, so that when there are many matches the most relevant ones can be shown first. GaussDB(DWS) ", + "doc_type":"devg", + "kw":"Ranking Search Results,Controlling Text Search,Developer Guide", + "title":"Ranking Search Results", + "githuburl":"" + }, + { + "uri":"dws_06_0095.html", + "product_code":"dws", + "code":"781", + "des":"To present search results it is ideal to show a part of each document and how it is related to the query. Usually, search engines show fragments of the document with mark", + "doc_type":"devg", + "kw":"Highlighting Results,Controlling Text Search,Developer Guide", + "title":"Highlighting Results", + "githuburl":"" + }, + { + "uri":"dws_06_0096.html", + "product_code":"dws", + "code":"782", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Additional Features", + "title":"Additional Features", + "githuburl":"" + }, + { + "uri":"dws_06_0097.html", + "product_code":"dws", + "code":"783", + "des":"GaussDB(DWS) provides functions and operators that can be used to manipulate documents that are already in tsvector type.tsvector || tsvectorThe tsvector concatenation op", + "doc_type":"devg", + "kw":"Manipulating tsvector,Additional Features,Developer Guide", + "title":"Manipulating tsvector", + "githuburl":"" + }, + { + "uri":"dws_06_0098.html", + "product_code":"dws", + "code":"784", + "des":"GaussDB(DWS) provides functions and operators that can be used to manipulate queries that are already in tsquery type.tsquery && tsqueryReturns the AND-combination of the", + "doc_type":"devg", + "kw":"Manipulating Queries,Additional Features,Developer Guide", + "title":"Manipulating Queries", + "githuburl":"" + }, + { + "uri":"dws_06_0099.html", + "product_code":"dws", + "code":"785", + "des":"The ts_rewrite family of functions searches a given tsquery for occurrences of a target subquery, and replace each occurrence with a substitute subquery. In essence this ", + "doc_type":"devg", + "kw":"Rewriting Queries,Additional Features,Developer Guide", + "title":"Rewriting Queries", + "githuburl":"" + }, + { + "uri":"dws_06_0100.html", + "product_code":"dws", + "code":"786", + "des":"The function ts_stat is useful for checking your configuration and for finding stop-word candidates.sqlquery is a text value containing an SQL query which must return a s", + "doc_type":"devg", + "kw":"Gathering Document Statistics,Additional Features,Developer Guide", + "title":"Gathering Document Statistics", + "githuburl":"" + }, + { + "uri":"dws_06_0101.html", + "product_code":"dws", + "code":"787", + "des":"Text search parsers are responsible for splitting raw document text into tokens and identifying each token's type, where the set of types is defined by the parser itself.", + "doc_type":"devg", + "kw":"Parsers,Full Text Search,Developer Guide", + "title":"Parsers", + "githuburl":"" + }, + { + "uri":"dws_06_0102.html", + "product_code":"dws", + "code":"788", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Dictionaries", + "title":"Dictionaries", + "githuburl":"" + }, + { + "uri":"dws_06_0103.html", + "product_code":"dws", + "code":"789", + "des":"A dictionary is used to define stop words, that is, words to be ignored in full-text retrieval.A dictionary can also be used to normalize words so that different derived ", + "doc_type":"devg", + "kw":"Overview,Dictionaries,Developer Guide", + "title":"Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0104.html", + "product_code":"dws", + "code":"790", + "des":"Stop words are words that are very common, appear in almost every document, and have no discrimination value. Therefore, they can be ignored in the context of full text s", + "doc_type":"devg", + "kw":"Stop Words,Dictionaries,Developer Guide", + "title":"Stop Words", + "githuburl":"" + }, + { + "uri":"dws_06_0105.html", + "product_code":"dws", + "code":"791", + "des":"A Simple dictionary operates by converting the input token to lower case and checking it against a list of stop words. If the token is found in the list, an empty array w", + "doc_type":"devg", + "kw":"Simple Dictionary,Dictionaries,Developer Guide", + "title":"Simple Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0106.html", + "product_code":"dws", + "code":"792", + "des":"A synonym dictionary is used to define, identify, and convert synonyms of tokens. Phrases are not supported (use the thesaurus dictionary in Thesaurus Dictionary).A synon", + "doc_type":"devg", + "kw":"Synonym Dictionary,Dictionaries,Developer Guide", + "title":"Synonym Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0107.html", + "product_code":"dws", + "code":"793", + "des":"A thesaurus dictionary (sometimes abbreviated as TZ) is a collection of words that include relationships between words and phrases, such as broader terms (BT), narrower t", + "doc_type":"devg", + "kw":"Thesaurus Dictionary,Dictionaries,Developer Guide", + "title":"Thesaurus Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0108.html", + "product_code":"dws", + "code":"794", + "des":"The Ispell dictionary template supports morphological dictionaries, which can normalize many different linguistic forms of a word into the same lexeme. For example, an En", + "doc_type":"devg", + "kw":"Ispell Dictionary,Dictionaries,Developer Guide", + "title":"Ispell Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0109.html", + "product_code":"dws", + "code":"795", + "des":"A Snowball dictionary is based on a project by Martin Porter and is used for stem analysis, providing stemming algorithms for many languages. GaussDB(DWS) provides predef", + "doc_type":"devg", + "kw":"Snowball Dictionary,Dictionaries,Developer Guide", + "title":"Snowball Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0110.html", + "product_code":"dws", + "code":"796", + "des":"Text search configuration specifies the following components required for converting a document into a tsvector:A parser, decomposes a text into tokens.Dictionary list, c", + "doc_type":"devg", + "kw":"Configuration Examples,Full Text Search,Developer Guide", + "title":"Configuration Examples", + "githuburl":"" + }, + { + "uri":"dws_06_0111.html", + "product_code":"dws", + "code":"797", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Testing and Debugging Text Search", + "title":"Testing and Debugging Text Search", + "githuburl":"" + }, + { + "uri":"dws_06_0112.html", + "product_code":"dws", + "code":"798", + "des":"The function ts_debug allows easy testing of a text search configuration.ts_debug displays information about every token of document as produced by the parser and process", + "doc_type":"devg", + "kw":"Testing a Configuration,Testing and Debugging Text Search,Developer Guide", + "title":"Testing a Configuration", + "githuburl":"" + }, + { + "uri":"dws_06_0113.html", + "product_code":"dws", + "code":"799", + "des":"The ts_parse function allows direct testing of a text search parser.ts_parse parses the given document and returns a series of records, one for each token produced by par", + "doc_type":"devg", + "kw":"Testing a Parser,Testing and Debugging Text Search,Developer Guide", + "title":"Testing a Parser", + "githuburl":"" + }, + { + "uri":"dws_06_0114.html", + "product_code":"dws", + "code":"800", + "des":"The ts_lexize function facilitates dictionary testing.ts_lexize(dict regdictionary, token text) returns text[] ts_lexize returns an array of lexemes if the input token is", + "doc_type":"devg", + "kw":"Testing a Dictionary,Testing and Debugging Text Search,Developer Guide", + "title":"Testing a Dictionary", + "githuburl":"" + }, + { + "uri":"dws_06_0115.html", + "product_code":"dws", + "code":"801", + "des":"The current limitations of GaussDB(DWS)'s full text search are:The length of each lexeme must be less than 2 KB.The length of a tsvector (lexemes + positions) must be les", + "doc_type":"devg", + "kw":"Limitations,Full Text Search,Developer Guide", + "title":"Limitations", + "githuburl":"" + }, + { + "uri":"dws_06_0116.html", + "product_code":"dws", + "code":"802", + "des":"GaussDB(DWS) runs SQL statements to perform different system operations, such as setting variables, displaying the execution plan, and collecting garbage data.For details", + "doc_type":"devg", + "kw":"System Operation,SQL Syntax Reference,Developer Guide", + "title":"System Operation", + "githuburl":"" + }, + { + "uri":"dws_06_0117.html", + "product_code":"dws", + "code":"803", + "des":"A transaction is a user-defined sequence of database operations, which form an integral unit of work.GaussDB(DWS) starts a transaction using START TRANSACTION and BEGIN. ", + "doc_type":"devg", + "kw":"Controlling Transactions,SQL Syntax Reference,Developer Guide", + "title":"Controlling Transactions", + "githuburl":"" + }, + { + "uri":"dws_06_0118.html", + "product_code":"dws", + "code":"804", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"DDL Syntax", + "title":"DDL Syntax", + "githuburl":"" + }, + { + "uri":"dws_06_0119.html", + "product_code":"dws", + "code":"805", + "des":"Data definition language (DDL) is used to define or modify an object in a database, such as a table, index, or view.GaussDB(DWS) does not support DDL if its CN is unavail", + "doc_type":"devg", + "kw":"DDL Syntax Overview,DDL Syntax,Developer Guide", + "title":"DDL Syntax Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0120.html", + "product_code":"dws", + "code":"806", + "des":"This command is used to modify the attributes of a database, including the database name, owner, maximum number of connections, and object isolation attribute.Only the ow", + "doc_type":"devg", + "kw":"ALTER DATABASE,DDL Syntax,Developer Guide", + "title":"ALTER DATABASE", + "githuburl":"" + }, + { + "uri":"dws_06_0123.html", + "product_code":"dws", + "code":"807", + "des":"ALTER FOREIGN TABLE modifies a foreign table.NoneSet the attributes of a foreign table.ALTER FOREIGN TABLE [ IF EXISTS ] table_name\n OPTIONS ( {[ ADD | SET | DROP ] o", + "doc_type":"devg", + "kw":"ALTER FOREIGN TABLE (for GDS),DDL Syntax,Developer Guide", + "title":"ALTER FOREIGN TABLE (for GDS)", + "githuburl":"" + }, + { + "uri":"dws_06_0124.html", + "product_code":"dws", + "code":"808", + "des":"ALTER FOREIGN TABLE modifies an HDFS or OBS foreign table.NoneSet a foreign table's attributes.ALTER FOREIGN TABLE [ IF EXISTS ] table_name\n OPTIONS ( {[ ADD | SET | ", + "doc_type":"devg", + "kw":"ALTER FOREIGN TABLE (for HDFS or OBS),DDL Syntax,Developer Guide", + "title":"ALTER FOREIGN TABLE (for HDFS or OBS)", + "githuburl":"" + }, + { + "uri":"dws_06_0126.html", + "product_code":"dws", + "code":"809", + "des":"ALTER FUNCTION modifies the attributes of a customized function.Only the owner of a function or a system administrator can run this statement. If a function involves oper", + "doc_type":"devg", + "kw":"ALTER FUNCTION,DDL Syntax,Developer Guide", + "title":"ALTER FUNCTION", + "githuburl":"" + }, + { + "uri":"dws_06_0127.html", + "product_code":"dws", + "code":"810", + "des":"ALTER GROUP modifies the attributes of a user group.ALTER GROUP is an alias for ALTER ROLE, and it is not a standard SQL command and not recommended. Users can use ALTER ", + "doc_type":"devg", + "kw":"ALTER GROUP,DDL Syntax,Developer Guide", + "title":"ALTER GROUP", + "githuburl":"" + }, + { + "uri":"dws_06_0128.html", + "product_code":"dws", + "code":"811", + "des":"ALTER INDEX modifies the definition of an existing index.There are several sub-forms:IF EXISTSIf the specified index does not exist, a notice instead of an error is sent.", + "doc_type":"devg", + "kw":"ALTER INDEX,DDL Syntax,Developer Guide", + "title":"ALTER INDEX", + "githuburl":"" + }, + { + "uri":"dws_06_0129.html", + "product_code":"dws", + "code":"812", + "des":"ALTER LARGE OBJECT modifies the definition of a large object. It can only assign a new owner to a large object.Only the administrator or the owner of the to-be-modified l", + "doc_type":"devg", + "kw":"ALTER LARGE OBJECT,DDL Syntax,Developer Guide", + "title":"ALTER LARGE OBJECT", + "githuburl":"" + }, + { + "uri":"dws_06_0132.html", + "product_code":"dws", + "code":"813", + "des":"ALTER REDACTION POLICY modifies a data redaction policy applied to a specified table.Only the owner of the table to which the redaction policy is applied has the permissi", + "doc_type":"devg", + "kw":"ALTER REDACTION POLICY,DDL Syntax,Developer Guide", + "title":"ALTER REDACTION POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0133.html", + "product_code":"dws", + "code":"814", + "des":"ALTER RESOURCE POOL changes the Cgroup of a resource pool.Users having the ALTER permission can modify resource pools.pool_nameSpecifies the name of the resource pool.The", + "doc_type":"devg", + "kw":"ALTER RESOURCE POOL,DDL Syntax,Developer Guide", + "title":"ALTER RESOURCE POOL", + "githuburl":"" + }, + { + "uri":"dws_06_0134.html", + "product_code":"dws", + "code":"815", + "des":"ALTER ROLE changes the attributes of a role.NoneModifying the Rights of a RoleALTER ROLE role_name [ [ WITH ] option [ ... ] ];The option clause for granting rights is as", + "doc_type":"devg", + "kw":"ALTER ROLE,DDL Syntax,Developer Guide", + "title":"ALTER ROLE", + "githuburl":"" + }, + { + "uri":"dws_06_0135.html", + "product_code":"dws", + "code":"816", + "des":"ALTER ROW LEVEL SECURITY POLICY modifies an existing row-level access control policy, including the policy name and the users and expressions affected by the policy.Only ", + "doc_type":"devg", + "kw":"ALTER ROW LEVEL SECURITY POLICY,DDL Syntax,Developer Guide", + "title":"ALTER ROW LEVEL SECURITY POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0136.html", + "product_code":"dws", + "code":"817", + "des":"ALTER SCHEMA changes the attributes of a schema.Only the owner of an index or a system administrator can run this statement.Rename a schema.ALTER SCHEMA schema_name \n ", + "doc_type":"devg", + "kw":"ALTER SCHEMA,DDL Syntax,Developer Guide", + "title":"ALTER SCHEMA", + "githuburl":"" + }, + { + "uri":"dws_06_0137.html", + "product_code":"dws", + "code":"818", + "des":"ALTER SEQUENCE modifies the parameters of an existing sequence.You must be the owner of the sequence to use ALTER SEQUENCE.In the current version, you can modify only the", + "doc_type":"devg", + "kw":"ALTER SEQUENCE,DDL Syntax,Developer Guide", + "title":"ALTER SEQUENCE", + "githuburl":"" + }, + { + "uri":"dws_06_0138.html", + "product_code":"dws", + "code":"819", + "des":"ALTER SERVER adds, modifies, or deletes the parameters of an existing server. You can query existing servers from the pg_foreign_server system catalog.Only the owner of a", + "doc_type":"devg", + "kw":"ALTER SERVER,DDL Syntax,Developer Guide", + "title":"ALTER SERVER", + "githuburl":"" + }, + { + "uri":"dws_06_0139.html", + "product_code":"dws", + "code":"820", + "des":"ALTER SESSION defines or modifies the conditions or parameters that affect the current session. Modified session parameters are kept until the current session is disconne", + "doc_type":"devg", + "kw":"ALTER SESSION,DDL Syntax,Developer Guide", + "title":"ALTER SESSION", + "githuburl":"" + }, + { + "uri":"dws_06_0140.html", + "product_code":"dws", + "code":"821", + "des":"ALTER SYNONYM is used to modify the attribute of a synonym.Only the synonym owner can be changed.Only the system administrator and the synonym owner has the permission to", + "doc_type":"devg", + "kw":"ALTER SYNONYM,DDL Syntax,Developer Guide", + "title":"ALTER SYNONYM", + "githuburl":"" + }, + { + "uri":"dws_06_0141.html", + "product_code":"dws", + "code":"822", + "des":"ALTER SYSTEM KILL SESSION ends a session.Nonesession_sid, serialSpecifies SID and SERIAL of a session (see examples for format).Value range: The SIDs and SERIALs of all s", + "doc_type":"devg", + "kw":"ALTER SYSTEM KILL SESSION,DDL Syntax,Developer Guide", + "title":"ALTER SYSTEM KILL SESSION", + "githuburl":"" + }, + { + "uri":"dws_06_0142.html", + "product_code":"dws", + "code":"823", + "des":"ALTER TABLE is used to modify tables, including modifying table definitions, renaming tables, renaming specified columns in tables, renaming table constraints, setting ta", + "doc_type":"devg", + "kw":"ALTER TABLE,DDL Syntax,Developer Guide", + "title":"ALTER TABLE", + "githuburl":"" + }, + { + "uri":"dws_06_0143.html", + "product_code":"dws", + "code":"824", + "des":"ALTER TABLE PARTITION modifies table partitioning, including adding, deleting, splitting, merging partitions, and modifying partition attributes.The name of the added par", + "doc_type":"devg", + "kw":"ALTER TABLE PARTITION,DDL Syntax,Developer Guide", + "title":"ALTER TABLE PARTITION", + "githuburl":"" + }, + { + "uri":"dws_06_0145.html", + "product_code":"dws", + "code":"825", + "des":"ALTER TEXT SEARCH CONFIGURATION modifies the definition of a text search configuration. You can modify its mappings from token types to dictionaries, change the configura", + "doc_type":"devg", + "kw":"ALTER TEXT SEARCH CONFIGURATION,DDL Syntax,Developer Guide", + "title":"ALTER TEXT SEARCH CONFIGURATION", + "githuburl":"" + }, + { + "uri":"dws_06_0146.html", + "product_code":"dws", + "code":"826", + "des":"ALTER TEXT SEARCH DICTIONARY modifies the definition of a full-text retrieval dictionary, including its parameters, name, owner, and schema.ALTER is not supported by pred", + "doc_type":"devg", + "kw":"ALTER TEXT SEARCH DICTIONARY,DDL Syntax,Developer Guide", + "title":"ALTER TEXT SEARCH DICTIONARY", + "githuburl":"" + }, + { + "uri":"dws_06_0147.html", + "product_code":"dws", + "code":"827", + "des":"ALTER TRIGGER modifies the definition of a trigger.Only the owner of a table where a trigger is created and system administrators can run the ALTER TRIGGER statement.trig", + "doc_type":"devg", + "kw":"ALTER TRIGGER,DDL Syntax,Developer Guide", + "title":"ALTER TRIGGER", + "githuburl":"" + }, + { + "uri":"dws_06_0148.html", + "product_code":"dws", + "code":"828", + "des":"ALTER TYPE modifies the definition of a type.Modify a type.ALTER TYPE name action [, ... ]\nALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }\nALTER TYPE", + "doc_type":"devg", + "kw":"ALTER TYPE,DDL Syntax,Developer Guide", + "title":"ALTER TYPE", + "githuburl":"" + }, + { + "uri":"dws_06_0149.html", + "product_code":"dws", + "code":"829", + "des":"ALTER USER modifies the attributes of a database user.Session parameters modified by ALTER USER apply to a specified user and take effect in the next session.Modify user ", + "doc_type":"devg", + "kw":"ALTER USER,DDL Syntax,Developer Guide", + "title":"ALTER USER", + "githuburl":"" + }, + { + "uri":"dws_06_0150.html", + "product_code":"dws", + "code":"830", + "des":"ALTER VIEW modifies all auxiliary attributes of a view. (To modify the query definition of a view, use CREATE OR REPLACE VIEW.)Only the view owner can modify a view by ru", + "doc_type":"devg", + "kw":"ALTER VIEW,DDL Syntax,Developer Guide", + "title":"ALTER VIEW", + "githuburl":"" + }, + { + "uri":"dws_06_0151.html", + "product_code":"dws", + "code":"831", + "des":"CLEAN CONNECTION clears database connections when a database is abnormal. You may use this statement to delete a specific user's connections to a specified database.NoneC", + "doc_type":"devg", + "kw":"CLEAN CONNECTION,DDL Syntax,Developer Guide", + "title":"CLEAN CONNECTION", + "githuburl":"" + }, + { + "uri":"dws_06_0152.html", + "product_code":"dws", + "code":"832", + "des":"CLOSE frees the resources associated with an open cursor.After a cursor is closed, no subsequent operations are allowed on it.A cursor should be closed when it is no long", + "doc_type":"devg", + "kw":"CLOSE,DDL Syntax,Developer Guide", + "title":"CLOSE", + "githuburl":"" + }, + { + "uri":"dws_06_0153.html", + "product_code":"dws", + "code":"833", + "des":"Cluster a table according to an index.CLUSTER instructs GaussDB(DWS) to cluster the table specified by table_name based on the index specified by index_name. The index mu", + "doc_type":"devg", + "kw":"CLUSTER,DDL Syntax,Developer Guide", + "title":"CLUSTER", + "githuburl":"" + }, + { + "uri":"dws_06_0154.html", + "product_code":"dws", + "code":"834", + "des":"COMMENT defines or changes the comment of an object.Only one comment string is stored for each object. To modify a comment, issue a new COMMENT command for the same objec", + "doc_type":"devg", + "kw":"COMMENT,DDL Syntax,Developer Guide", + "title":"COMMENT", + "githuburl":"" + }, + { + "uri":"dws_06_0155.html", + "product_code":"dws", + "code":"835", + "des":"Creates a barrier for cluster nodes. The barrier can be used for data restoration.Before creating a barrier, ensure that gtm_backup_barrier and enable_cbm_tracking are se", + "doc_type":"devg", + "kw":"CREATE BARRIER,DDL Syntax,Developer Guide", + "title":"CREATE BARRIER", + "githuburl":"" + }, + { + "uri":"dws_06_0156.html", + "product_code":"dws", + "code":"836", + "des":"CREATE DATABASE creates a database. By default, the new database will be created by cloning the standard system database template1. A different template can be specified ", + "doc_type":"devg", + "kw":"CREATE DATABASE,DDL Syntax,Developer Guide", + "title":"CREATE DATABASE", + "githuburl":"" + }, + { + "uri":"dws_06_0159.html", + "product_code":"dws", + "code":"837", + "des":"CREATE FOREIGN TABLE creates a GDS foreign table.CREATE FOREIGN TABLE creates a GDS foreign table in the current database for concurrent data import and export. The GDS f", + "doc_type":"devg", + "kw":"CREATE FOREIGN TABLE (for GDS Import and Export),DDL Syntax,Developer Guide", + "title":"CREATE FOREIGN TABLE (for GDS Import and Export)", + "githuburl":"" + }, + { + "uri":"dws_06_0161.html", + "product_code":"dws", + "code":"838", + "des":"CREATE FOREIGN TABLE creates an HDFS or OBS foreign table in the current database to access or export structured data stored on HDFS or OBS. You can also export data in O", + "doc_type":"devg", + "kw":"CREATE FOREIGN TABLE (SQL on OBS or Hadoop),DDL Syntax,Developer Guide", + "title":"CREATE FOREIGN TABLE (SQL on OBS or Hadoop)", + "githuburl":"" + }, + { + "uri":"dws_06_0160.html", + "product_code":"dws", + "code":"839", + "des":"CREATE FOREIGN TABLE creates a foreign table in the current database for parallel data import and export of OBS data. The server used is gsmpp_server, which is created by", + "doc_type":"devg", + "kw":"CREATE FOREIGN TABLE (for OBS Import and Export),DDL Syntax,Developer Guide", + "title":"CREATE FOREIGN TABLE (for OBS Import and Export)", + "githuburl":"" + }, + { + "uri":"dws_06_0163.html", + "product_code":"dws", + "code":"840", + "des":"CREATE FUNCTION creates a function.The precision values (if any) of the parameters or return values of a function are not checked.When creating a function, you are advise", + "doc_type":"devg", + "kw":"CREATE FUNCTION,DDL Syntax,Developer Guide", + "title":"CREATE FUNCTION", + "githuburl":"" + }, + { + "uri":"dws_06_0164.html", + "product_code":"dws", + "code":"841", + "des":"CREATE GROUP creates a user group.CREATE GROUP is an alias for CREATE ROLE, and it is not a standard SQL command and not recommended. Users can use CREATE ROLE directly.T", + "doc_type":"devg", + "kw":"CREATE GROUP,DDL Syntax,Developer Guide", + "title":"CREATE GROUP", + "githuburl":"" + }, + { + "uri":"dws_06_0165.html", + "product_code":"dws", + "code":"842", + "des":"CREATE INDEX-bak defines a new index.Indexes are primarily used to enhance database performance (though inappropriate use can result in slower database performance). You ", + "doc_type":"devg", + "kw":"CREATE INDEX,DDL Syntax,Developer Guide", + "title":"CREATE INDEX", + "githuburl":"" + }, + { + "uri":"dws_06_0168.html", + "product_code":"dws", + "code":"843", + "des":"CREATE REDACTION POLICY creates a data redaction policy for a table.Only the table owner has the permission to create a data redaction policy.You can create data redactio", + "doc_type":"devg", + "kw":"CREATE REDACTION POLICY,DDL Syntax,Developer Guide", + "title":"CREATE REDACTION POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0169.html", + "product_code":"dws", + "code":"844", + "des":"CREATE ROW LEVEL SECURITY POLICY creates a row-level access control policy for a table.The policy takes effect only after row-level access control is enabled (by running ", + "doc_type":"devg", + "kw":"CREATE ROW LEVEL SECURITY POLICY,DDL Syntax,Developer Guide", + "title":"CREATE ROW LEVEL SECURITY POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0170.html", + "product_code":"dws", + "code":"845", + "des":"CREATE PROCEDURE creates a stored procedure.The precision values (if any) of the parameters or return values of a stored procedure are not checked.When creating a stored ", + "doc_type":"devg", + "kw":"CREATE PROCEDURE,DDL Syntax,Developer Guide", + "title":"CREATE PROCEDURE", + "githuburl":"" + }, + { + "uri":"dws_06_0171.html", + "product_code":"dws", + "code":"846", + "des":"CREATE RESOURCE POOL creates a resource pool and specifies the Cgroup for the resource pool.As long as the current user has CREATE permission, it can create a resource po", + "doc_type":"devg", + "kw":"CREATE RESOURCE POOL,DDL Syntax,Developer Guide", + "title":"CREATE RESOURCE POOL", + "githuburl":"" + }, + { + "uri":"dws_06_0172.html", + "product_code":"dws", + "code":"847", + "des":"Create a role.A role is an entity that has own database objects and permissions. In different environments, a role can be considered a user, a group, or both.CREATE ROLE ", + "doc_type":"devg", + "kw":"CREATE ROLE,DDL Syntax,Developer Guide", + "title":"CREATE ROLE", + "githuburl":"" + }, + { + "uri":"dws_06_0173.html", + "product_code":"dws", + "code":"848", + "des":"CREATE SCHEMA creates a schema.Named objects are accessed either by \"qualifying\" their names with the schema name as a prefix, or by setting a search path that includes t", + "doc_type":"devg", + "kw":"CREATE SCHEMA,DDL Syntax,Developer Guide", + "title":"CREATE SCHEMA", + "githuburl":"" + }, + { + "uri":"dws_06_0174.html", + "product_code":"dws", + "code":"849", + "des":"CREATE SEQUENCE adds a sequence to the current database. The owner of a sequence is the user who creates the sequence.A sequence is a special table that stores arithmetic", + "doc_type":"devg", + "kw":"CREATE SEQUENCE,DDL Syntax,Developer Guide", + "title":"CREATE SEQUENCE", + "githuburl":"" + }, + { + "uri":"dws_06_0175.html", + "product_code":"dws", + "code":"850", + "des":"CREATE SERVER creates an external server.An external server stores information of HDFS clusters, OBS servers, DLI connections, or other homogeneous clusters.By default, o", + "doc_type":"devg", + "kw":"CREATE SERVER,DDL Syntax,Developer Guide", + "title":"CREATE SERVER", + "githuburl":"" + }, + { + "uri":"dws_06_0176.html", + "product_code":"dws", + "code":"851", + "des":"CREATE SYNONYM is used to create a synonym object. A synonym is an alias of a database object and is used to record the mapping between database object names. You can use", + "doc_type":"devg", + "kw":"CREATE SYNONYM,DDL Syntax,Developer Guide", + "title":"CREATE SYNONYM", + "githuburl":"" + }, + { + "uri":"dws_06_0177.html", + "product_code":"dws", + "code":"852", + "des":"CREATE TABLE creates a table in the current database. The table will be owned by the user who created it.For details about the data types supported by column-store tables", + "doc_type":"devg", + "kw":"CREATE TABLE,DDL Syntax,Developer Guide", + "title":"CREATE TABLE", + "githuburl":"" + }, + { + "uri":"dws_06_0178.html", + "product_code":"dws", + "code":"853", + "des":"CREATE TABLE AS creates a table based on the results of a query.It creates a table and fills it with data obtained using SELECT. The table columns have the names and data", + "doc_type":"devg", + "kw":"CREATE TABLE AS,DDL Syntax,Developer Guide", + "title":"CREATE TABLE AS", + "githuburl":"" + }, + { + "uri":"dws_06_0179.html", + "product_code":"dws", + "code":"854", + "des":"CREATE TABLE PARTITION creates a partitioned table. Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific sche", + "doc_type":"devg", + "kw":"CREATE TABLE PARTITION,DDL Syntax,Developer Guide", + "title":"CREATE TABLE PARTITION", + "githuburl":"" + }, + { + "uri":"dws_06_0182.html", + "product_code":"dws", + "code":"855", + "des":"CREATE TEXT SEARCH CONFIGURATION creates a text search configuration. A text search configuration specifies a text search parser that can divide a string into tokens, plu", + "doc_type":"devg", + "kw":"CREATE TEXT SEARCH CONFIGURATION,DDL Syntax,Developer Guide", + "title":"CREATE TEXT SEARCH CONFIGURATION", + "githuburl":"" + }, + { + "uri":"dws_06_0183.html", + "product_code":"dws", + "code":"856", + "des":"CREATE TEXT SEARCH DICTIONARY creates a full-text search dictionary. A dictionary is used to identify and process specified words during full-text search.Dictionaries are", + "doc_type":"devg", + "kw":"CREATE TEXT SEARCH DICTIONARY,DDL Syntax,Developer Guide", + "title":"CREATE TEXT SEARCH DICTIONARY", + "githuburl":"" + }, + { + "uri":"dws_06_0184.html", + "product_code":"dws", + "code":"857", + "des":"CREATE TRIGGER creates a trigger. The trigger will be associated with a specified table or view, and will execute a specified function when certain events occur.Currently", + "doc_type":"devg", + "kw":"CREATE TRIGGER,DDL Syntax,Developer Guide", + "title":"CREATE TRIGGER", + "githuburl":"" + }, + { + "uri":"dws_06_0185.html", + "product_code":"dws", + "code":"858", + "des":"CREATE TYPE defines a new data type in the current database. The user who defines a new data type becomes its owner. Types are designed only for row-store tables.Four typ", + "doc_type":"devg", + "kw":"CREATE TYPE,DDL Syntax,Developer Guide", + "title":"CREATE TYPE", + "githuburl":"" + }, + { + "uri":"dws_06_0186.html", + "product_code":"dws", + "code":"859", + "des":"CREATE USER creates a user.A user created using the CREATE USER statement has the LOGIN permission by default.A schema named after the user is automatically created in th", + "doc_type":"devg", + "kw":"CREATE USER,DDL Syntax,Developer Guide", + "title":"CREATE USER", + "githuburl":"" + }, + { + "uri":"dws_06_0187.html", + "product_code":"dws", + "code":"860", + "des":"CREATE VIEW creates a view. A view is a virtual table, not a base table. A database only stores the definition of a view and does not store its data. The data is still st", + "doc_type":"devg", + "kw":"CREATE VIEW,DDL Syntax,Developer Guide", + "title":"CREATE VIEW", + "githuburl":"" + }, + { + "uri":"dws_06_0188.html", + "product_code":"dws", + "code":"861", + "des":"CURSOR defines a cursor. This command retrieves few rows of data in a query.To process SQL statements, the stored procedure process assigns a memory segment to store cont", + "doc_type":"devg", + "kw":"CURSOR,DDL Syntax,Developer Guide", + "title":"CURSOR", + "githuburl":"" + }, + { + "uri":"dws_06_0189.html", + "product_code":"dws", + "code":"862", + "des":"DROP DATABASE deletes a database.Only the owner of a database or a system administrator has the permission to run the DROP DATABASE command.DROP DATABASE does not take ef", + "doc_type":"devg", + "kw":"DROP DATABASE,DDL Syntax,Developer Guide", + "title":"DROP DATABASE", + "githuburl":"" + }, + { + "uri":"dws_06_0192.html", + "product_code":"dws", + "code":"863", + "des":"DROP FOREIGN TABLE deletes a specified foreign table.DROP FOREIGN TABLE forcibly deletes a specified table. After a table is deleted, any indexes that exist for the table", + "doc_type":"devg", + "kw":"DROP FOREIGN TABLE,DDL Syntax,Developer Guide", + "title":"DROP FOREIGN TABLE", + "githuburl":"" + }, + { + "uri":"dws_06_0193.html", + "product_code":"dws", + "code":"864", + "des":"DROP FUNCTION deletes an existing function.If a function involves operations on temporary tables, the function cannot be deleted by running DROP FUNCTION.IF EXISTSSends a", + "doc_type":"devg", + "kw":"DROP FUNCTION,DDL Syntax,Developer Guide", + "title":"DROP FUNCTION", + "githuburl":"" + }, + { + "uri":"dws_06_0194.html", + "product_code":"dws", + "code":"865", + "des":"DROP GROUP deletes a user group.DROP GROUP is the alias for DROP ROLE.DROP GROUP is the internal interface encapsulated in the gs_om tool. You are not advised to use this", + "doc_type":"devg", + "kw":"DROP GROUP,DDL Syntax,Developer Guide", + "title":"DROP GROUP", + "githuburl":"" + }, + { + "uri":"dws_06_0195.html", + "product_code":"dws", + "code":"866", + "des":"DROP INDEX deletes an index.Only the owner of an index or a system administrator can run DROP INDEX command.IF EXISTSSends a notice instead of an error if the specified i", + "doc_type":"devg", + "kw":"DROP INDEX,DDL Syntax,Developer Guide", + "title":"DROP INDEX", + "githuburl":"" + }, + { + "uri":"dws_06_0198.html", + "product_code":"dws", + "code":"867", + "des":"DROP OWNED deletes the database objects of a database role.The role's permissions on all the database objects in the current database and shared objects (databases and ta", + "doc_type":"devg", + "kw":"DROP OWNED,DDL Syntax,Developer Guide", + "title":"DROP OWNED", + "githuburl":"" + }, + { + "uri":"dws_06_0199.html", + "product_code":"dws", + "code":"868", + "des":"DROP REDACTION POLICY deletes a data redaction policy applied to a specified table.Only the table owner has the permission to delete a data redaction policy.IF EXISTSSend", + "doc_type":"devg", + "kw":"DROP REDACTION POLICY,DDL Syntax,Developer Guide", + "title":"DROP REDACTION POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0200.html", + "product_code":"dws", + "code":"869", + "des":"DROP ROW LEVEL SECURITY POLICY deletes a row-level access control policy from a table.Only the table owner or administrators can delete a row-level access control policy ", + "doc_type":"devg", + "kw":"DROP ROW LEVEL SECURITY POLICY,DDL Syntax,Developer Guide", + "title":"DROP ROW LEVEL SECURITY POLICY", + "githuburl":"" + }, + { + "uri":"dws_06_0201.html", + "product_code":"dws", + "code":"870", + "des":"DROP PROCEDURE deletes an existing stored procedure.None.IF EXISTSSends a notice instead of an error if the stored procedure does not exist.Sends a notice instead of an e", + "doc_type":"devg", + "kw":"DROP PROCEDURE,DDL Syntax,Developer Guide", + "title":"DROP PROCEDURE", + "githuburl":"" + }, + { + "uri":"dws_06_0202.html", + "product_code":"dws", + "code":"871", + "des":"DROP RESOURCE POOL deletes a resource pool.The resource pool cannot be deleted if it is associated with a role.The user must have the DROP permission in order to delete a", + "doc_type":"devg", + "kw":"DROP RESOURCE POOL,DDL Syntax,Developer Guide", + "title":"DROP RESOURCE POOL", + "githuburl":"" + }, + { + "uri":"dws_06_0203.html", + "product_code":"dws", + "code":"872", + "des":"DROP ROLE deletes a specified role.If a \"role is being used by other users\" error is displayed when you run DROP ROLE, it might be that threads cannot respond to signals ", + "doc_type":"devg", + "kw":"DROP ROLE,DDL Syntax,Developer Guide", + "title":"DROP ROLE", + "githuburl":"" + }, + { + "uri":"dws_06_0204.html", + "product_code":"dws", + "code":"873", + "des":"DROP SCHEMA deletes a schema in a database.Only a schema owner or a system administrator can run the DROP SCHEMA command.IF EXISTSSends a notice instead of an error if th", + "doc_type":"devg", + "kw":"DROP SCHEMA,DDL Syntax,Developer Guide", + "title":"DROP SCHEMA", + "githuburl":"" + }, + { + "uri":"dws_06_0205.html", + "product_code":"dws", + "code":"874", + "des":"DROP SEQUENCE deletes a sequence from the current database.Only a sequence owner or a system administrator can delete a sequence.IF EXISTSSends a notice instead of an err", + "doc_type":"devg", + "kw":"DROP SEQUENCE,DDL Syntax,Developer Guide", + "title":"DROP SEQUENCE", + "githuburl":"" + }, + { + "uri":"dws_06_0206.html", + "product_code":"dws", + "code":"875", + "des":"DROP SERVER deletes an existing data server.Only the server owner can delete a server.IF EXISTSSends a notice instead of an error if the specified table does not exist.Se", + "doc_type":"devg", + "kw":"DROP SERVER,DDL Syntax,Developer Guide", + "title":"DROP SERVER", + "githuburl":"" + }, + { + "uri":"dws_06_0207.html", + "product_code":"dws", + "code":"876", + "des":"DROP SYNONYM is used to delete a synonym object.Only a synonym owner or a system administrator can run the DROP SYNONYM command.IF EXISTSSend a notice instead of reportin", + "doc_type":"devg", + "kw":"DROP SYNONYM,DDL Syntax,Developer Guide", + "title":"DROP SYNONYM", + "githuburl":"" + }, + { + "uri":"dws_06_0208.html", + "product_code":"dws", + "code":"877", + "des":"DROP TABLE deletes a specified table.Only the table owner, schema owner, and system administrator have the permission to delete a table. To delete all the rows in a table", + "doc_type":"devg", + "kw":"DROP TABLE,DDL Syntax,Developer Guide", + "title":"DROP TABLE", + "githuburl":"" + }, + { + "uri":"dws_06_0210.html", + "product_code":"dws", + "code":"878", + "des":"DROP TEXT SEARCH CONFIGURATION deletes an existing text search configuration.To run the DROP TEXT SEARCH CONFIGURATION command, you must be the owner of the text search c", + "doc_type":"devg", + "kw":"DROP TEXT SEARCH CONFIGURATION,DDL Syntax,Developer Guide", + "title":"DROP TEXT SEARCH CONFIGURATION", + "githuburl":"" + }, + { + "uri":"dws_06_0211.html", + "product_code":"dws", + "code":"879", + "des":"DROPTEXT SEARCHDICTIONARY deletes a full-text retrieval dictionary.DROP is not supported by predefined dictionaries.Only the owner of a dictionary can do DROP to the dict", + "doc_type":"devg", + "kw":"DROP TEXT SEARCH DICTIONARY,DDL Syntax,Developer Guide", + "title":"DROP TEXT SEARCH DICTIONARY", + "githuburl":"" + }, + { + "uri":"dws_06_0212.html", + "product_code":"dws", + "code":"880", + "des":"DROP TRIGGER deletes a trigger.Only the owner of a trigger and system administrators can run the DROP TRIGGER statement.IF EXISTSSends a notice instead of an error if the", + "doc_type":"devg", + "kw":"DROP TRIGGER,DDL Syntax,Developer Guide", + "title":"DROP TRIGGER", + "githuburl":"" + }, + { + "uri":"dws_06_0213.html", + "product_code":"dws", + "code":"881", + "des":"DROP TYPE deletes a user-defined data type. Only the type owner has permission to run this statement.IF EXISTSSends a notice instead of an error if the specified type doe", + "doc_type":"devg", + "kw":"DROP TYPE,DDL Syntax,Developer Guide", + "title":"DROP TYPE", + "githuburl":"" + }, + { + "uri":"dws_06_0214.html", + "product_code":"dws", + "code":"882", + "des":"Deleting a user will also delete the schema having the same name as the user.CASCADE is used to delete objects (excluding databases) that depend on the user. CASCADE cann", + "doc_type":"devg", + "kw":"DROP USER,DDL Syntax,Developer Guide", + "title":"DROP USER", + "githuburl":"" + }, + { + "uri":"dws_06_0215.html", + "product_code":"dws", + "code":"883", + "des":"DROP VIEW forcibly deletes an existing view in a database.Only a view owner or a system administrator can run DROP VIEW command.IF EXISTSSends a notice instead of an erro", + "doc_type":"devg", + "kw":"DROP VIEW,DDL Syntax,Developer Guide", + "title":"DROP VIEW", + "githuburl":"" + }, + { + "uri":"dws_06_0216.html", + "product_code":"dws", + "code":"884", + "des":"FETCH retrieves data using a previously-created cursor.A cursor has an associated position, which is used by FETCH. The cursor position can be before the first row of the", + "doc_type":"devg", + "kw":"FETCH,DDL Syntax,Developer Guide", + "title":"FETCH", + "githuburl":"" + }, + { + "uri":"dws_06_0217.html", + "product_code":"dws", + "code":"885", + "des":"MOVE repositions a cursor without retrieving any data. MOVE works exactly like the FETCH command, except it only repositions the cursor and does not return rows.NoneThe d", + "doc_type":"devg", + "kw":"MOVE,DDL Syntax,Developer Guide", + "title":"MOVE", + "githuburl":"" + }, + { + "uri":"dws_06_0218.html", + "product_code":"dws", + "code":"886", + "des":"REINDEX rebuilds an index using the data stored in the index's table, replacing the old copy of the index.There are several scenarios in which REINDEX can be used:An inde", + "doc_type":"devg", + "kw":"REINDEX,DDL Syntax,Developer Guide", + "title":"REINDEX", + "githuburl":"" + }, + { + "uri":"dws_06_0219.html", + "product_code":"dws", + "code":"887", + "des":"RESET restores run-time parameters to their default values. The default values are parameter default values complied in the postgresql.conf configuration file.RESET is an", + "doc_type":"devg", + "kw":"RESET,DDL Syntax,Developer Guide", + "title":"RESET", + "githuburl":"" + }, + { + "uri":"dws_06_0220.html", + "product_code":"dws", + "code":"888", + "des":"SET modifies a run-time parameter.Most run-time parameters can be modified by executing SET. Some parameters cannot be modified after a server or session starts.Set the s", + "doc_type":"devg", + "kw":"SET,DDL Syntax,Developer Guide", + "title":"SET", + "githuburl":"" + }, + { + "uri":"dws_06_0221.html", + "product_code":"dws", + "code":"889", + "des":"SET CONSTRAINTS sets the behavior of constraint checking within the current transaction.IMMEDIATE constraints are checked at the end of each statement. DEFERRED constrain", + "doc_type":"devg", + "kw":"SET CONSTRAINTS,DDL Syntax,Developer Guide", + "title":"SET CONSTRAINTS", + "githuburl":"" + }, + { + "uri":"dws_06_0222.html", + "product_code":"dws", + "code":"890", + "des":"SET ROLE sets the current user identifier of the current session.Users of the current session must be members of specified rolename, but the system administrator can choo", + "doc_type":"devg", + "kw":"SET ROLE,DDL Syntax,Developer Guide", + "title":"SET ROLE", + "githuburl":"" + }, + { + "uri":"dws_06_0223.html", + "product_code":"dws", + "code":"891", + "des":"SET SESSION AUTHORIZATION sets the session user identifier and the current user identifier of the current SQL session to a specified user.The session identifier can be ch", + "doc_type":"devg", + "kw":"SET SESSION AUTHORIZATION,DDL Syntax,Developer Guide", + "title":"SET SESSION AUTHORIZATION", + "githuburl":"" + }, + { + "uri":"dws_06_0224.html", + "product_code":"dws", + "code":"892", + "des":"SHOW shows the current value of a run-time parameter. You can use the SET statement to set these parameters.Some parameters that can be viewed by SHOW are read-only. You ", + "doc_type":"devg", + "kw":"SHOW,DDL Syntax,Developer Guide", + "title":"SHOW", + "githuburl":"" + }, + { + "uri":"dws_06_0225.html", + "product_code":"dws", + "code":"893", + "des":"TRUNCATE quickly removes all rows from a database table.It has the same effect as an unqualified DELETE on each table, but it is faster since it does not actually scan th", + "doc_type":"devg", + "kw":"TRUNCATE,DDL Syntax,Developer Guide", + "title":"TRUNCATE", + "githuburl":"" + }, + { + "uri":"dws_06_0226.html", + "product_code":"dws", + "code":"894", + "des":"VACUUM reclaims storage space occupied by tables or B-tree indexes. In normal database operation, rows that have been deleted or obsoleted by an update are not physically", + "doc_type":"devg", + "kw":"VACUUM,DDL Syntax,Developer Guide", + "title":"VACUUM", + "githuburl":"" + }, + { + "uri":"dws_06_0227.html", + "product_code":"dws", + "code":"895", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"DML Syntax", + "title":"DML Syntax", + "githuburl":"" + }, + { + "uri":"dws_06_0228.html", + "product_code":"dws", + "code":"896", + "des":"Data Manipulation Language (DML) is used to perform operations on data in database tables, such as inserting, updating, querying, or deleting data.Inserting data refers t", + "doc_type":"devg", + "kw":"DML Syntax Overview,DML Syntax,Developer Guide", + "title":"DML Syntax Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0229.html", + "product_code":"dws", + "code":"897", + "des":"CALL calls defined functions or stored procedures.NoneschemaSpecifies the name of the schema where a function or stored procedure is located.Specifies the name of the sch", + "doc_type":"devg", + "kw":"CALL,DML Syntax,Developer Guide", + "title":"CALL", + "githuburl":"" + }, + { + "uri":"dws_06_0230.html", + "product_code":"dws", + "code":"898", + "des":"COPY copies data between tables and files.COPY FROM copies data from a file to a table. COPY TO copies data from a table to a file.If CNs and DNs are enabled in security ", + "doc_type":"devg", + "kw":"COPY,DML Syntax,Developer Guide", + "title":"COPY", + "githuburl":"" + }, + { + "uri":"dws_06_0231.html", + "product_code":"dws", + "code":"899", + "des":"DELETE deletes rows that satisfy the WHERE clause from the specified table. If the WHERE clause does not exist, all rows in the table will be deleted. The result is a val", + "doc_type":"devg", + "kw":"DELETE,DML Syntax,Developer Guide", + "title":"DELETE", + "githuburl":"" + }, + { + "uri":"dws_06_0232.html", + "product_code":"dws", + "code":"900", + "des":"EXPLAIN shows the execution plan of an SQL statement.The execution plan shows how the tables referenced by the SQL statement will be scanned, for example, by plain sequen", + "doc_type":"devg", + "kw":"EXPLAIN,DML Syntax,Developer Guide", + "title":"EXPLAIN", + "githuburl":"" + }, + { + "uri":"dws_06_0233.html", + "product_code":"dws", + "code":"901", + "des":"You can run the EXPLAIN PLAN statement to save the information about an execution plan to the PLAN_TABLE table. Different from the EXPLAIN statement, EXPLAIN PLAN only st", + "doc_type":"devg", + "kw":"EXPLAIN PLAN,DML Syntax,Developer Guide", + "title":"EXPLAIN PLAN", + "githuburl":"" + }, + { + "uri":"dws_06_0234.html", + "product_code":"dws", + "code":"902", + "des":"LOCK TABLE obtains a table-level lock.GaussDB(DWS) always tries to select the lock mode with minimum constraints when automatically requesting a lock for a command refere", + "doc_type":"devg", + "kw":"LOCK,DML Syntax,Developer Guide", + "title":"LOCK", + "githuburl":"" + }, + { + "uri":"dws_06_0235.html", + "product_code":"dws", + "code":"903", + "des":"The MERGE INTO statement is used to conditionally match data in a target table with that in a source table. If data matches, UPDATE is executed on the target table; if da", + "doc_type":"devg", + "kw":"MERGE INTO,DML Syntax,Developer Guide", + "title":"MERGE INTO", + "githuburl":"" + }, + { + "uri":"dws_06_0275.html", + "product_code":"dws", + "code":"904", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"INSERT and UPSERT", + "title":"INSERT and UPSERT", + "githuburl":"" + }, + { + "uri":"dws_06_0236.html", + "product_code":"dws", + "code":"905", + "des":"INSERT inserts new rows into a table.You must have the INSERT permission on a table in order to insert into it.Use of the RETURNING clause requires the SELECT permission ", + "doc_type":"devg", + "kw":"INSERT,INSERT and UPSERT,Developer Guide", + "title":"INSERT", + "githuburl":"" + }, + { + "uri":"dws_06_0237.html", + "product_code":"dws", + "code":"906", + "des":"UPSERT inserts rows into a table. When a row duplicates an existing primary key or unique key value, the row will be ignored or updated.The UPSERT syntax is supported onl", + "doc_type":"devg", + "kw":"UPSERT,INSERT and UPSERT,Developer Guide", + "title":"UPSERT", + "githuburl":"" + }, + { + "uri":"dws_06_0240.html", + "product_code":"dws", + "code":"907", + "des":"UPDATE updates data in a table. UPDATE changes the values of the specified columns in all rows that satisfy the condition. The WHERE clause clarifies conditions. The colu", + "doc_type":"devg", + "kw":"UPDATE,DML Syntax,Developer Guide", + "title":"UPDATE", + "githuburl":"" + }, + { + "uri":"dws_06_0241.html", + "product_code":"dws", + "code":"908", + "des":"VALUES computes a row or a set of rows based on given values. It is most commonly used to generate a constant table within a large command.VALUES lists with large numbers", + "doc_type":"devg", + "kw":"VALUES,DML Syntax,Developer Guide", + "title":"VALUES", + "githuburl":"" + }, + { + "uri":"dws_06_0242.html", + "product_code":"dws", + "code":"909", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"DCL Syntax", + "title":"DCL Syntax", + "githuburl":"" + }, + { + "uri":"dws_06_0243.html", + "product_code":"dws", + "code":"910", + "des":"Data control language (DCL) is used to set or modify database users or role rights.GaussDB(DWS) provides a statement for granting rights to data objects and roles. For de", + "doc_type":"devg", + "kw":"DCL Syntax Overview,DCL Syntax,Developer Guide", + "title":"DCL Syntax Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0244.html", + "product_code":"dws", + "code":"911", + "des":"ALTER DEFAULT PRIVILEGES allows you to set the permissions that will be used for objects to be created. It does not affect permissions assigned to existing objects.To iso", + "doc_type":"devg", + "kw":"ALTER DEFAULT PRIVILEGES,DCL Syntax,Developer Guide", + "title":"ALTER DEFAULT PRIVILEGES", + "githuburl":"" + }, + { + "uri":"dws_06_0245.html", + "product_code":"dws", + "code":"912", + "des":"ANALYZE collects statistics about ordinary tables in a database, and stores the results in the PG_STATISTIC system catalog. The execution plan generator uses these statis", + "doc_type":"devg", + "kw":"ANALYZE | ANALYSE,DCL Syntax,Developer Guide", + "title":"ANALYZE | ANALYSE", + "githuburl":"" + }, + { + "uri":"dws_06_0246.html", + "product_code":"dws", + "code":"913", + "des":"DEALLOCATE deallocates a previously prepared statement. If you do not explicitly deallocate a prepared statement, it is deallocated when the session ends.The PREPARE key ", + "doc_type":"devg", + "kw":"DEALLOCATE,DCL Syntax,Developer Guide", + "title":"DEALLOCATE", + "githuburl":"" + }, + { + "uri":"dws_06_0247.html", + "product_code":"dws", + "code":"914", + "des":"DO executes an anonymous code block.A code block is a function body without parameters that returns void. It is analyzed and executed at the same time.Before using a prog", + "doc_type":"devg", + "kw":"DO,DCL Syntax,Developer Guide", + "title":"DO", + "githuburl":"" + }, + { + "uri":"dws_06_0248.html", + "product_code":"dws", + "code":"915", + "des":"EXECUTE executes a prepared statement. A prepared statement only exists in the lifecycle of a session. Therefore, only prepared statements created using PREPARE earlier i", + "doc_type":"devg", + "kw":"EXECUTE,DCL Syntax,Developer Guide", + "title":"EXECUTE", + "githuburl":"" + }, + { + "uri":"dws_06_0249.html", + "product_code":"dws", + "code":"916", + "des":"EXECUTE DIRECT executes an SQL statement on a specified node. Generally, the cluster automatically allocates an SQL statement to proper nodes. EXECUTE DIRECT is mainly us", + "doc_type":"devg", + "kw":"EXECUTE DIRECT,DCL Syntax,Developer Guide", + "title":"EXECUTE DIRECT", + "githuburl":"" + }, + { + "uri":"dws_06_0250.html", + "product_code":"dws", + "code":"917", + "des":"GRANT grants permissions to roles and users.GRANT is used in the following scenarios:Granting system permissions to roles or usersSystem permissions are also called user ", + "doc_type":"devg", + "kw":"GRANT,DCL Syntax,Developer Guide", + "title":"GRANT", + "githuburl":"" + }, + { + "uri":"dws_06_0251.html", + "product_code":"dws", + "code":"918", + "des":"PREPARE creates a prepared statement.A prepared statement is a performance optimizing object on the server. When the PREPARE statement is executed, the specified query is", + "doc_type":"devg", + "kw":"PREPARE,DCL Syntax,Developer Guide", + "title":"PREPARE", + "githuburl":"" + }, + { + "uri":"dws_06_0252.html", + "product_code":"dws", + "code":"919", + "des":"REASSIGN OWNED changes the owner of a database.REASSIGN OWNED requires that the system change owners of all the database objects owned by old_roles to new_role.REASSIGN O", + "doc_type":"devg", + "kw":"REASSIGN OWNED,DCL Syntax,Developer Guide", + "title":"REASSIGN OWNED", + "githuburl":"" + }, + { + "uri":"dws_06_0253.html", + "product_code":"dws", + "code":"920", + "des":"REVOKE revokes rights from one or more roles.If a non-owner user of an object attempts to REVOKE rights on the object, the command is executed based on the following rule", + "doc_type":"devg", + "kw":"REVOKE,DCL Syntax,Developer Guide", + "title":"REVOKE", + "githuburl":"" + }, + { + "uri":"dws_06_0276.html", + "product_code":"dws", + "code":"921", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"DQL Syntax", + "title":"DQL Syntax", + "githuburl":"" + }, + { + "uri":"dws_06_0277.html", + "product_code":"dws", + "code":"922", + "des":"Data Query Language (DQL) can obtain data from tables or views.GaussDB(DWS) provides statements for obtaining data from tables or views. For details, see SELECT.GaussDB(D", + "doc_type":"devg", + "kw":"DQL Syntax Overview,DQL Syntax,Developer Guide", + "title":"DQL Syntax Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0238.html", + "product_code":"dws", + "code":"923", + "des":"SELECT retrieves data from a table or view.Serving as an overlaid filter for a database table, SELECT using SQL keywords retrieves required data from data tables.Using SE", + "doc_type":"devg", + "kw":"SELECT,DQL Syntax,Developer Guide", + "title":"SELECT", + "githuburl":"" + }, + { + "uri":"dws_06_0239.html", + "product_code":"dws", + "code":"924", + "des":"SELECT INTO defines a new table based on a query result and insert data obtained by query to the new table.Different from SELECT, data found by SELECT INTO is not returne", + "doc_type":"devg", + "kw":"SELECT INTO,DQL Syntax,Developer Guide", + "title":"SELECT INTO", + "githuburl":"" + }, + { + "uri":"dws_06_0254.html", + "product_code":"dws", + "code":"925", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"TCL Syntax", + "title":"TCL Syntax", + "githuburl":"" + }, + { + "uri":"dws_06_0255.html", + "product_code":"dws", + "code":"926", + "des":"Transaction Control Language (TCL) controls the time and effect of database transactions and monitors the database.GaussDB(DWS) uses the COMMIT or END statement to commit", + "doc_type":"devg", + "kw":"TCL Syntax Overview,TCL Syntax,Developer Guide", + "title":"TCL Syntax Overview", + "githuburl":"" + }, + { + "uri":"dws_06_0256.html", + "product_code":"dws", + "code":"927", + "des":"ABORT rolls back the current transaction and cancels the changes in the transaction.This command is equivalent to ROLLBACK, and is present only for historical reasons. No", + "doc_type":"devg", + "kw":"ABORT,TCL Syntax,Developer Guide", + "title":"ABORT", + "githuburl":"" + }, + { + "uri":"dws_06_0257.html", + "product_code":"dws", + "code":"928", + "des":"BEGIN may be used to initiate an anonymous block or a single transaction. This section describes the syntax of BEGIN used to initiate an anonymous block. For details abou", + "doc_type":"devg", + "kw":"BEGIN,TCL Syntax,Developer Guide", + "title":"BEGIN", + "githuburl":"" + }, + { + "uri":"dws_06_0258.html", + "product_code":"dws", + "code":"929", + "des":"A checkpoint is a point in the transaction log sequence at which all data files have been updated to reflect the information in the log. All data files will be flushed to", + "doc_type":"devg", + "kw":"CHECKPOINT,TCL Syntax,Developer Guide", + "title":"CHECKPOINT", + "githuburl":"" + }, + { + "uri":"dws_06_0259.html", + "product_code":"dws", + "code":"930", + "des":"COMMIT or END commits all operations of a transaction.Only the transaction creators or system administrators can run the COMMIT command. The creation and commit operation", + "doc_type":"devg", + "kw":"COMMIT | END,TCL Syntax,Developer Guide", + "title":"COMMIT | END", + "githuburl":"" + }, + { + "uri":"dws_06_0260.html", + "product_code":"dws", + "code":"931", + "des":"COMMIT PREPARED commits a prepared two-phase transaction.The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). Exercise cauti", + "doc_type":"devg", + "kw":"COMMIT PREPARED,TCL Syntax,Developer Guide", + "title":"COMMIT PREPARED", + "githuburl":"" + }, + { + "uri":"dws_06_0262.html", + "product_code":"dws", + "code":"932", + "des":"PREPARE TRANSACTION prepares the current transaction for two-phase commit.After this command, the transaction is no longer associated with the current session; instead, i", + "doc_type":"devg", + "kw":"PREPARE TRANSACTION,TCL Syntax,Developer Guide", + "title":"PREPARE TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_06_0263.html", + "product_code":"dws", + "code":"933", + "des":"SAVEPOINT establishes a new savepoint within the current transaction.A savepoint is a special mark inside a transaction that rolls back all commands that are executed aft", + "doc_type":"devg", + "kw":"SAVEPOINT,TCL Syntax,Developer Guide", + "title":"SAVEPOINT", + "githuburl":"" + }, + { + "uri":"dws_06_0264.html", + "product_code":"dws", + "code":"934", + "des":"SET TRANSACTION sets the characteristics of the current transaction. It has no effect on any subsequent transactions. Available transaction characteristics include the tr", + "doc_type":"devg", + "kw":"SET TRANSACTION,TCL Syntax,Developer Guide", + "title":"SET TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_06_0265.html", + "product_code":"dws", + "code":"935", + "des":"START TRANSACTION starts a transaction. If the isolation level, read/write mode, or deferrable mode is specified, a new transaction will have those characteristics. You c", + "doc_type":"devg", + "kw":"START TRANSACTION,TCL Syntax,Developer Guide", + "title":"START TRANSACTION", + "githuburl":"" + }, + { + "uri":"dws_06_0266.html", + "product_code":"dws", + "code":"936", + "des":"Rolls back the current transaction and backs out all updates in the transaction.ROLLBACK backs out of all changes that a transaction makes to a database if the transactio", + "doc_type":"devg", + "kw":"ROLLBACK,TCL Syntax,Developer Guide", + "title":"ROLLBACK", + "githuburl":"" + }, + { + "uri":"dws_06_0267.html", + "product_code":"dws", + "code":"937", + "des":"RELEASE SAVEPOINT destroys a savepoint previously defined in the current transaction.Destroying a savepoint makes it unavailable as a rollback point, but it has no other ", + "doc_type":"devg", + "kw":"RELEASE SAVEPOINT,TCL Syntax,Developer Guide", + "title":"RELEASE SAVEPOINT", + "githuburl":"" + }, + { + "uri":"dws_06_0268.html", + "product_code":"dws", + "code":"938", + "des":"ROLLBACK PREPARED cancels a transaction ready for two-phase committing.The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). ", + "doc_type":"devg", + "kw":"ROLLBACK PREPARED,TCL Syntax,Developer Guide", + "title":"ROLLBACK PREPARED", + "githuburl":"" + }, + { + "uri":"dws_06_0269.html", + "product_code":"dws", + "code":"939", + "des":"ROLLBACK TO SAVEPOINT rolls back to a savepoint. It implicitly destroys all savepoints that were established after the named savepoint.Rolls back all commands that were e", + "doc_type":"devg", + "kw":"ROLLBACK TO SAVEPOINT,TCL Syntax,Developer Guide", + "title":"ROLLBACK TO SAVEPOINT", + "githuburl":"" + }, + { + "uri":"dws_06_0270.html", + "product_code":"dws", + "code":"940", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"GIN Indexes", + "title":"GIN Indexes", + "githuburl":"" + }, + { + "uri":"dws_06_0271.html", + "product_code":"dws", + "code":"941", + "des":"Generalized Inverted Index (GIN) is designed for handling cases where the items to be indexed are composite values, and the queries to be handled by the index need to sea", + "doc_type":"devg", + "kw":"Introduction,GIN Indexes,Developer Guide", + "title":"Introduction", + "githuburl":"" + }, + { + "uri":"dws_06_0272.html", + "product_code":"dws", + "code":"942", + "des":"The GIN interface has a high level of abstraction, requiring the access method implementer only to implement the semantics of the data type being accessed. The GIN layer ", + "doc_type":"devg", + "kw":"Scalability,GIN Indexes,Developer Guide", + "title":"Scalability", + "githuburl":"" + }, + { + "uri":"dws_06_0273.html", + "product_code":"dws", + "code":"943", + "des":"Internally, a GIN index contains a B-tree index constructed over keys, where each key is an element of one or more indexed items (a member of an array, for example) and w", + "doc_type":"devg", + "kw":"Implementation,GIN Indexes,Developer Guide", + "title":"Implementation", + "githuburl":"" + }, + { + "uri":"dws_06_0274.html", + "product_code":"dws", + "code":"944", + "des":"Create vs. InsertInsertion into a GIN index can be slow due to the likelihood of many keys being inserted for each item. So, for bulk insertions into a table, it is advis", + "doc_type":"devg", + "kw":"GIN Tips and Tricks,GIN Indexes,Developer Guide", + "title":"GIN Tips and Tricks", + "githuburl":"" + }, + { + "uri":"dws_04_3333.html", + "product_code":"dws", + "code":"945", + "des":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "doc_type":"devg", + "kw":"Change History,Developer Guide", + "title":"Change History", + "githuburl":"" + } +] \ No newline at end of file diff --git a/docs/dws/dev/CLASS.TXT.json b/docs/dws/dev/CLASS.TXT.json new file mode 100644 index 00000000..0dc84935 --- /dev/null +++ b/docs/dws/dev/CLASS.TXT.json @@ -0,0 +1,8507 @@ +[ + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Developer Guide", + "uri":"dws_04_1000.html", + "doc_type":"devg", + "p_code":"", + "code":"1" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Welcome", + "uri":"dws_04_0001.html", + "doc_type":"devg", + "p_code":"1", + "code":"2" + }, + { + "desc":"This document is intended for database designers, application developers, and database administrators, and provides information required for designing, building, querying", + "product_code":"dws", + "title":"Target Readers", + "uri":"dws_04_0002.html", + "doc_type":"devg", + "p_code":"2", + "code":"3" + }, + { + "desc":"If you are a new GaussDB(DWS) user, you are advised to read the following contents first:Sections describing the features, functions, and application scenarios of GaussDB", + "product_code":"dws", + "title":"Reading Guide", + "uri":"dws_04_0004.html", + "doc_type":"devg", + "p_code":"2", + "code":"4" + }, + { + "desc":"SQL examples in this manual are developed based on the TPC-DS model. Before you execute the examples, install the TPC-DS benchmark by following the instructions on the of", + "product_code":"dws", + "title":"Conventions", + "uri":"dws_04_0005.html", + "doc_type":"devg", + "p_code":"2", + "code":"5" + }, + { + "desc":"Complete the following tasks before you perform operations described in this document:Create a GaussDB(DWS) cluster.Install an SQL client.Connect the SQL client to the de", + "product_code":"dws", + "title":"Prerequisites", + "uri":"dws_04_0006.html", + "doc_type":"devg", + "p_code":"2", + "code":"6" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"System Overview", + "uri":"dws_04_0007.html", + "doc_type":"devg", + "p_code":"1", + "code":"7" + }, + { + "desc":"GaussDB(DWS) manages cluster transactions, the basis of HA and failovers. This ensures speedy fault recovery, guarantees the Atomicity, Consistency, Isolation, Durability", + "product_code":"dws", + "title":"Highly Reliable Transaction Processing", + "uri":"dws_04_0011.html", + "doc_type":"devg", + "p_code":"7", + "code":"8" + }, + { + "desc":"The following GaussDB(DWS) features help achieve high query performance.GaussDB(DWS) is an MPP system with the shared-nothing architecture. It consists of multiple indepe", + "product_code":"dws", + "title":"High Query Performance", + "uri":"dws_04_0012.html", + "doc_type":"devg", + "p_code":"7", + "code":"9" + }, + { + "desc":"A database manages data objects and is isolated from other databases. While creating a database, you can specify a tablespace. If you do not specify it, database objects ", + "product_code":"dws", + "title":"Related Concepts", + "uri":"dws_04_0015.html", + "doc_type":"devg", + "p_code":"7", + "code":"10" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Data Migration", + "uri":"dws_04_0985.html", + "doc_type":"devg", + "p_code":"1", + "code":"11" + }, + { + "desc":"GaussDB(DWS) provides flexible methods for importing data. You can import data from different sources to GaussDB(DWS). The features of each method are listed in Table 1. ", + "product_code":"dws", + "title":"Data Migration to GaussDB(DWS)", + "uri":"dws_04_0180.html", + "doc_type":"devg", + "p_code":"11", + "code":"12" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Data Import", + "uri":"dws_04_0179.html", + "doc_type":"devg", + "p_code":"11", + "code":"13" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Importing Data from OBS in Parallel", + "uri":"dws_04_0181.html", + "doc_type":"devg", + "p_code":"13", + "code":"14" + }, + { + "desc":"The object storage service (OBS) is an object-based cloud storage service, featuring data storage of high security, proven reliability, and cost-effectiveness. OBS provid", + "product_code":"dws", + "title":"About Parallel Data Import from OBS", + "uri":"dws_04_0182.html", + "doc_type":"devg", + "p_code":"14", + "code":"15" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Importing CSV/TXT Data from the OBS", + "uri":"dws_04_0154.html", + "doc_type":"devg", + "p_code":"14", + "code":"16" + }, + { + "desc":"In this example, OBS data is imported to GaussDB(DWS) databases. When users who have registered with the cloud platform access OBS using clients, call APIs, or SDKs, acce", + "product_code":"dws", + "title":"Creating Access Keys (AK and SK)", + "uri":"dws_04_0183.html", + "doc_type":"devg", + "p_code":"16", + "code":"17" + }, + { + "desc":"Before importing data from OBS to a cluster, prepare source data files and upload these files to OBS. If the data files have been stored on OBS, you only need to complete", + "product_code":"dws", + "title":"Uploading Data to OBS", + "uri":"dws_04_0184.html", + "doc_type":"devg", + "p_code":"16", + "code":"18" + }, + { + "desc":"format: format of the source data file in the foreign table. OBS foreign tables support CSV and TEXT formats. The default value is TEXT.header: Whether the data file cont", + "product_code":"dws", + "title":"Creating an OBS Foreign Table", + "uri":"dws_04_0185.html", + "doc_type":"devg", + "p_code":"16", + "code":"19" + }, + { + "desc":"Before importing data, you are advised to optimize your design and deployment based on the following excellent practices, helping maximize system resource utilization and", + "product_code":"dws", + "title":"Importing Data", + "uri":"dws_04_0186.html", + "doc_type":"devg", + "p_code":"16", + "code":"20" + }, + { + "desc":"Handle errors that occurred during data import.Errors that occur when data is imported are divided into data format errors and non-data format errors.Data format errorWhe", + "product_code":"dws", + "title":"Handling Import Errors", + "uri":"dws_04_0187.html", + "doc_type":"devg", + "p_code":"16", + "code":"21" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Importing ORC/CarbonData Data from OBS", + "uri":"dws_04_0155.html", + "doc_type":"devg", + "p_code":"14", + "code":"22" + }, + { + "desc":"Before you use the SQL on OBS feature to query OBS data:You have stored the ORC data on OBS.For example, the ORC table has been created when you use the Hive or Spark com", + "product_code":"dws", + "title":"Preparing Data on OBS", + "uri":"dws_04_0243.html", + "doc_type":"devg", + "p_code":"22", + "code":"23" + }, + { + "desc":"This section describes how to create a foreign server that is used to define the information about OBS servers and is invoked by foreign tables. For details about the syn", + "product_code":"dws", + "title":"Creating a Foreign Server", + "uri":"dws_04_0244.html", + "doc_type":"devg", + "p_code":"22", + "code":"24" + }, + { + "desc":"After performing steps in Creating a Foreign Server, create an OBS foreign table in the GaussDB(DWS) database to access the data stored in OBS. An OBS foreign table is re", + "product_code":"dws", + "title":"Creating a Foreign Table", + "uri":"dws_04_0245.html", + "doc_type":"devg", + "p_code":"22", + "code":"25" + }, + { + "desc":"If the data amount is small, you can directly run SELECT to query the foreign table and view the data on OBS.If the query result is the same as the data in Original Data,", + "product_code":"dws", + "title":"Querying Data on OBS Through Foreign Tables", + "uri":"dws_04_0246.html", + "doc_type":"devg", + "p_code":"22", + "code":"26" + }, + { + "desc":"After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quo", + "product_code":"dws", + "title":"Deleting Resources", + "uri":"dws_04_0247.html", + "doc_type":"devg", + "p_code":"22", + "code":"27" + }, + { + "desc":"In the big data field, the mainstream file format is ORC, which is supported by GaussDB(DWS). You can use Hive to export data to an ORC file and use a read-only foreign t", + "product_code":"dws", + "title":"Supported Data Types", + "uri":"dws_04_0156.html", + "doc_type":"devg", + "p_code":"22", + "code":"28" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Using GDS to Import Data from a Remote Server", + "uri":"dws_04_0189.html", + "doc_type":"devg", + "p_code":"13", + "code":"29" + }, + { + "desc":"INSERT and COPY statements are serially executed to import a small volume of data. To import a large volume of data to GaussDB(DWS), you can use GDS to import data in par", + "product_code":"dws", + "title":"Importing Data In Parallel Using GDS", + "uri":"dws_04_0190.html", + "doc_type":"devg", + "p_code":"29", + "code":"30" + }, + { + "desc":"Generally, the data to be imported has been uploaded to the data server. In this case, you only need to check the communication between the data server and GaussDB(DWS), ", + "product_code":"dws", + "title":"Preparing Source Data", + "uri":"dws_04_0192.html", + "doc_type":"devg", + "p_code":"29", + "code":"31" + }, + { + "desc":"GaussDB(DWS) uses GDS to allocate the source data for parallel data import. Deploy GDS on the data server.If a large volume of data is stored on multiple data servers, in", + "product_code":"dws", + "title":"Installing, Configuring, and Starting GDS", + "uri":"dws_04_0193.html", + "doc_type":"devg", + "p_code":"29", + "code":"32" + }, + { + "desc":"The source data information and GDS access information are configured in a foreign table. Then, GaussDB(DWS) can import data from a data server to a database table based ", + "product_code":"dws", + "title":"Creating a GDS Foreign Table", + "uri":"dws_04_0194.html", + "doc_type":"devg", + "p_code":"29", + "code":"33" + }, + { + "desc":"This section describes how to create tables in GaussDB(DWS) and import data to the tables.Before importing all the data from a table containing over 10 million records, y", + "product_code":"dws", + "title":"Importing Data", + "uri":"dws_04_0195.html", + "doc_type":"devg", + "p_code":"29", + "code":"34" + }, + { + "desc":"Handle errors that occurred during data import.Errors that occur when data is imported are divided into data format errors and non-data format errors.Data format errorWhe", + "product_code":"dws", + "title":"Handling Import Errors", + "uri":"dws_04_0196.html", + "doc_type":"devg", + "p_code":"29", + "code":"35" + }, + { + "desc":"Stop GDS after data is imported successfully.If GDS is started using the gds command, perform the following operations to stop GDS:Query the GDS process ID:ps -ef|grep gd", + "product_code":"dws", + "title":"Stopping GDS", + "uri":"dws_04_0197.html", + "doc_type":"devg", + "p_code":"29", + "code":"36" + }, + { + "desc":"The data servers and the cluster reside on the same intranet. The IP addresses are 192.168.0.90 and 192.168.0.91. Source data files are in CSV format.Create the target ta", + "product_code":"dws", + "title":"Example of Importing Data Using GDS", + "uri":"dws_04_0198.html", + "doc_type":"devg", + "p_code":"29", + "code":"37" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Importing Data from MRS to a Cluster", + "uri":"dws_04_0210.html", + "doc_type":"devg", + "p_code":"13", + "code":"38" + }, + { + "desc":"MRS is a big data cluster running based on the open-source Hadoop ecosystem. It provides the industry's latest cutting-edge storage and analytical capabilities of massive", + "product_code":"dws", + "title":"Overview", + "uri":"dws_04_0066.html", + "doc_type":"devg", + "p_code":"38", + "code":"39" + }, + { + "desc":"Before importing data from MRS to a GaussDB(DWS) cluster, you must have:Created an MRS cluster.Created the Hive/Spark ORC table in the MRS cluster and stored the table da", + "product_code":"dws", + "title":"Preparing Data in an MRS Cluster", + "uri":"dws_04_0212.html", + "doc_type":"devg", + "p_code":"38", + "code":"40" + }, + { + "desc":"In the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS) for creating a foreign table, you need to specify a foreign server associated with the MRS data source connectio", + "product_code":"dws", + "title":"Manually Creating a Foreign Server", + "uri":"dws_04_0213.html", + "doc_type":"devg", + "p_code":"38", + "code":"41" + }, + { + "desc":"This section describes how to create a Hadoop foreign table in the GaussDB(DWS) database to access the Hadoop structured data stored on MRS HDFS. A Hadoop foreign table i", + "product_code":"dws", + "title":"Creating a Foreign Table", + "uri":"dws_04_0214.html", + "doc_type":"devg", + "p_code":"38", + "code":"42" + }, + { + "desc":"If the data amount is small, you can directly run SELECT to query the foreign table and view the data in the MRS data source.If the query result is the same as the data i", + "product_code":"dws", + "title":"Importing Data", + "uri":"dws_04_0215.html", + "doc_type":"devg", + "p_code":"38", + "code":"43" + }, + { + "desc":"After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quo", + "product_code":"dws", + "title":"Deleting Resources", + "uri":"dws_04_0216.html", + "doc_type":"devg", + "p_code":"38", + "code":"44" + }, + { + "desc":"The following error information indicates that GaussDB(DWS) is to read an ORC data file but the actual file is in text format. Therefore, create a table of the Hive ORC t", + "product_code":"dws", + "title":"Error Handling", + "uri":"dws_04_0217.html", + "doc_type":"devg", + "p_code":"38", + "code":"45" + }, + { + "desc":"You can create foreign tables to perform associated queries and import data between clusters.Import data from one GaussDB(DWS) cluster to another.Perform associated queri", + "product_code":"dws", + "title":"Importing Data from One GaussDB(DWS) Cluster to Another", + "uri":"dws_04_0949.html", + "doc_type":"devg", + "p_code":"13", + "code":"46" + }, + { + "desc":"The gsql tool of GaussDB(DWS) provides the \\copy meta-command to import data.For details about the \\copy command, see Table 1.tableSpecifies the name (possibly schema-qua", + "product_code":"dws", + "title":"Using the gsql Meta-Command \\COPY to Import Data", + "uri":"dws_04_0208.html", + "doc_type":"devg", + "p_code":"13", + "code":"47" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Running the COPY FROM STDIN Statement to Import Data", + "uri":"dws_04_0203.html", + "doc_type":"devg", + "p_code":"13", + "code":"48" + }, + { + "desc":"This method is applicable to low-concurrency scenarios where a small volume of data is to be imported.Use either of the following methods to write data to GaussDB(DWS) us", + "product_code":"dws", + "title":"Data Import Using COPY FROM STDIN", + "uri":"dws_04_0204.html", + "doc_type":"devg", + "p_code":"48", + "code":"49" + }, + { + "desc":"CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.The CopyManager class is in the or", + "product_code":"dws", + "title":"Introduction to the CopyManager Class", + "uri":"dws_04_0205.html", + "doc_type":"devg", + "p_code":"48", + "code":"50" + }, + { + "desc":"When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or ", + "product_code":"dws", + "title":"Example: Importing and Exporting Data Through Local Files", + "uri":"dws_04_0206.html", + "doc_type":"devg", + "p_code":"48", + "code":"51" + }, + { + "desc":"The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).", + "product_code":"dws", + "title":"Example: Migrating Data from MySQL to GaussDB(DWS)", + "uri":"dws_04_0207.html", + "doc_type":"devg", + "p_code":"48", + "code":"52" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Full Database Migration", + "uri":"dws_04_0986.html", + "doc_type":"devg", + "p_code":"11", + "code":"53" + }, + { + "desc":"You can use CDM to migrate data from other data sources (for example, MySQL) to the databases in clusters on GaussDB(DWS).For details about scenarios where CDM is used to", + "product_code":"dws", + "title":"Using CDM to Migrate Data to GaussDB(DWS)", + "uri":"dws_04_0219.html", + "doc_type":"devg", + "p_code":"53", + "code":"54" + }, + { + "desc":"The DSC is a CLI tool running on the Linux or Windows OS. It is dedicated to providing customers with simple, fast, and reliable application SQL script migration services", + "product_code":"dws", + "title":"Using DSC to Migrate SQL Scripts", + "uri":"dws_01_0127.html", + "doc_type":"devg", + "p_code":"53", + "code":"55" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Metadata Migration", + "uri":"dws_04_0987.html", + "doc_type":"devg", + "p_code":"11", + "code":"56" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Using gs_dump and gs_dumpall to Export Metadata", + "uri":"dws_04_0269.html", + "doc_type":"devg", + "p_code":"56", + "code":"57" + }, + { + "desc":"GaussDB(DWS) provides gs_dump and gs_dumpall to export required database objects and related information. To migrate database information, you can use a tool to import th", + "product_code":"dws", + "title":"Overview", + "uri":"dws_04_0270.html", + "doc_type":"devg", + "p_code":"57", + "code":"58" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting a Single Database", + "uri":"dws_04_0271.html", + "doc_type":"devg", + "p_code":"57", + "code":"59" + }, + { + "desc":"You can use gs_dump to export data and all object definitions of a database from GaussDB(DWS). You can specify the information to be exported as follows:Export full infor", + "product_code":"dws", + "title":"Exporting a Database", + "uri":"dws_04_0272.html", + "doc_type":"devg", + "p_code":"59", + "code":"60" + }, + { + "desc":"You can use gs_dump to export data and all object definitions of a schema from GaussDB(DWS). You can export one or more specified schemas as needed. You can specify the i", + "product_code":"dws", + "title":"Exporting a Schema", + "uri":"dws_04_0273.html", + "doc_type":"devg", + "p_code":"59", + "code":"61" + }, + { + "desc":"You can use gs_dump to export data and all object definitions of a table-level object from GaussDB(DWS). Views, sequences, and foreign tables are special tables. You can ", + "product_code":"dws", + "title":"Exporting a Table", + "uri":"dws_04_0274.html", + "doc_type":"devg", + "p_code":"59", + "code":"62" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting All Databases", + "uri":"dws_04_0275.html", + "doc_type":"devg", + "p_code":"57", + "code":"63" + }, + { + "desc":"You can use gs_dumpall to export full information of all databases in a cluster from GaussDB(DWS), including information about each database and global objects in the clu", + "product_code":"dws", + "title":"Exporting All Databases", + "uri":"dws_04_0276.html", + "doc_type":"devg", + "p_code":"63", + "code":"64" + }, + { + "desc":"You can use gs_dumpall to export global objects from GaussDB(DWS), including database users, user groups, tablespaces, and attributes (for example, global access permissi", + "product_code":"dws", + "title":"Exporting Global Objects", + "uri":"dws_04_0277.html", + "doc_type":"devg", + "p_code":"63", + "code":"65" + }, + { + "desc":"gs_dump and gs_dumpall use -U to specify the user that performs the export. If the specified user does not have the required permission, data cannot be exported. In this ", + "product_code":"dws", + "title":"Data Export By a User Without Required Permissions", + "uri":"dws_04_0278.html", + "doc_type":"devg", + "p_code":"57", + "code":"66" + }, + { + "desc":"gs_restore is an import tool provided by GaussDB(DWS). You can use gs_restore to import the files exported by gs_dump to a database. gs_restore can import the files in .t", + "product_code":"dws", + "title":"Using gs_restore to Import Data", + "uri":"dws_04_0209.html", + "doc_type":"devg", + "p_code":"56", + "code":"67" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Data Export", + "uri":"dws_04_0249.html", + "doc_type":"devg", + "p_code":"11", + "code":"68" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting Data to OBS", + "uri":"dws_04_0250.html", + "doc_type":"devg", + "p_code":"68", + "code":"69" + }, + { + "desc":"GaussDB(DWS) databases allow you to export data in parallel using OBS foreign tables, in which the export mode and the exported data format are specified. Data is exporte", + "product_code":"dws", + "title":"Parallel OBS Data Export", + "uri":"dws_04_0251.html", + "doc_type":"devg", + "p_code":"69", + "code":"70" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting CSV/TXT Data to OBS", + "uri":"dws_04_0157.html", + "doc_type":"devg", + "p_code":"69", + "code":"71" + }, + { + "desc":"Plan the storage location of exported data in OBS.You need to specify the OBS path (to directory) for storing data that you want to export. The exported data can be saved", + "product_code":"dws", + "title":"Planning Data Export", + "uri":"dws_04_0252.html", + "doc_type":"devg", + "p_code":"71", + "code":"72" + }, + { + "desc":"To obtain access keys, log in to the management console, click the username in the upper right corner, and select My Credential from the menu. Then choose Access Keys in ", + "product_code":"dws", + "title":"Creating an OBS Foreign Table", + "uri":"dws_04_0253.html", + "doc_type":"devg", + "p_code":"71", + "code":"73" + }, + { + "desc":"Example 1: Export data from table product_info_output to a data file through the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM p", + "product_code":"dws", + "title":"Exporting Data", + "uri":"dws_04_0254.html", + "doc_type":"devg", + "p_code":"71", + "code":"74" + }, + { + "desc":"Create two foreign tables and use them to export tables from a database to two buckets in OBS.OBS and the database are in the same region. The example GaussDB(DWS) table ", + "product_code":"dws", + "title":"Examples", + "uri":"dws_04_0255.html", + "doc_type":"devg", + "p_code":"71", + "code":"75" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting ORC Data to OBS", + "uri":"dws_04_0256.html", + "doc_type":"devg", + "p_code":"69", + "code":"76" + }, + { + "desc":"For details about exporting data to OBS, see Planning Data Export.For details about the data types that can be exported to OBS, see Table 2.For details about HDFS data ex", + "product_code":"dws", + "title":"Planning Data Export", + "uri":"dws_04_0258.html", + "doc_type":"devg", + "p_code":"76", + "code":"77" + }, + { + "desc":"For details about creating a foreign server on OBS, see Creating a Foreign Server.For details about creating a foreign server in HDFS, see Manually Creating a Foreign Ser", + "product_code":"dws", + "title":"Creating a Foreign Server", + "uri":"dws_04_0259.html", + "doc_type":"devg", + "p_code":"76", + "code":"78" + }, + { + "desc":"After operations in Creating a Foreign Server are complete, create an OBS/HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in OBS/HDFS. Th", + "product_code":"dws", + "title":"Creating a Foreign Table", + "uri":"dws_04_0260.html", + "doc_type":"devg", + "p_code":"76", + "code":"79" + }, + { + "desc":"Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM pro", + "product_code":"dws", + "title":"Exporting Data", + "uri":"dws_04_0158.html", + "doc_type":"devg", + "p_code":"76", + "code":"80" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Exporting ORC Data to MRS", + "uri":"dws_04_0159.html", + "doc_type":"devg", + "p_code":"68", + "code":"81" + }, + { + "desc":"GaussDB(DWS) allows you to export ORC data to MRS using an HDFS foreign table. You can specify the export mode and export data format in the foreign table. Data is export", + "product_code":"dws", + "title":"Overview", + "uri":"dws_04_0160.html", + "doc_type":"devg", + "p_code":"81", + "code":"82" + }, + { + "desc":"For details about the data types that can be exported to MRS, see Table 2.For details about HDFS data export or MRS configuration, see the MapReduce Service User Guide.", + "product_code":"dws", + "title":"Planning Data Export", + "uri":"dws_04_0161.html", + "doc_type":"devg", + "p_code":"81", + "code":"83" + }, + { + "desc":"For details about creating a foreign server on HDFS, see Manually Creating a Foreign Server.", + "product_code":"dws", + "title":"Creating a Foreign Server", + "uri":"dws_04_0162.html", + "doc_type":"devg", + "p_code":"81", + "code":"84" + }, + { + "desc":"After operations in Creating a Foreign Server are complete, create an HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in HDFS. The foreig", + "product_code":"dws", + "title":"Creating a Foreign Table", + "uri":"dws_04_0163.html", + "doc_type":"devg", + "p_code":"81", + "code":"85" + }, + { + "desc":"Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.INSERT INTO product_info_output_ext SELECT * FROM pro", + "product_code":"dws", + "title":"Exporting Data", + "uri":"dws_04_0164.html", + "doc_type":"devg", + "p_code":"81", + "code":"86" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Using GDS to Export Data to a Remote Server", + "uri":"dws_04_0261.html", + "doc_type":"devg", + "p_code":"68", + "code":"87" + }, + { + "desc":"In high-concurrency scenarios, you can use GDS to export data from a database to a common file system.In the current GDS version, data can be exported from a database to ", + "product_code":"dws", + "title":"Exporting Data In Parallel Using GDS", + "uri":"dws_04_0262.html", + "doc_type":"devg", + "p_code":"87", + "code":"88" + }, + { + "desc":"Before you use GDS to export data from a cluster, prepare data to be exported and plan the export path.Remote modeIf the following information is displayed, the user and ", + "product_code":"dws", + "title":"Planning Data Export", + "uri":"dws_04_0263.html", + "doc_type":"devg", + "p_code":"87", + "code":"89" + }, + { + "desc":"GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.For details, see Installing, Configuri", + "product_code":"dws", + "title":"Installing, Configuring, and Starting GDS", + "uri":"dws_04_0264.html", + "doc_type":"devg", + "p_code":"87", + "code":"90" + }, + { + "desc":"Remote modeSet the location parameter to the URL of the directory that stores the data files.You do not need to specify any file.For example:The IP address of the GDS dat", + "product_code":"dws", + "title":"Creating a GDS Foreign Table", + "uri":"dws_04_0265.html", + "doc_type":"devg", + "p_code":"87", + "code":"91" + }, + { + "desc":"Ensure that the IP addresses and ports of servers where CNs and DNs are deployed can connect to those of the GDS server.Create batch processing scripts to export data in ", + "product_code":"dws", + "title":"Exporting Data", + "uri":"dws_04_0266.html", + "doc_type":"devg", + "p_code":"87", + "code":"92" + }, + { + "desc":"GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.For details, see Stopping GDS.", + "product_code":"dws", + "title":"Stopping GDS", + "uri":"dws_04_0267.html", + "doc_type":"devg", + "p_code":"87", + "code":"93" + }, + { + "desc":"The data server and the cluster reside on the same intranet, the IP address of the data server is 192.168.0.90, and data source files are in CSV format. In this scenario,", + "product_code":"dws", + "title":"Examples of Exporting Data Using GDS", + "uri":"dws_04_0268.html", + "doc_type":"devg", + "p_code":"87", + "code":"94" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Other Operations", + "uri":"dws_04_0988.html", + "doc_type":"devg", + "p_code":"11", + "code":"95" + }, + { + "desc":"GDS supports concurrent import and export. The gds -t parameter is used to set the size of the thread pool and control the maximum number of concurrent working threads. B", + "product_code":"dws", + "title":"GDS Pipe FAQs", + "uri":"dws_04_0279.html", + "doc_type":"devg", + "p_code":"95", + "code":"96" + }, + { + "desc":"Data skew causes the query performance to deteriorate. Before importing all the data from a table consisting of over 10 million records, you are advised to import some of", + "product_code":"dws", + "title":"Checking for Data Skew", + "uri":"dws_04_0228.html", + "doc_type":"devg", + "p_code":"95", + "code":"97" + }, + { + "desc":"GaussDB(DWS) is compatible with Oracle, Teradata and MySQL syntax, of which the syntax behavior is different.", + "product_code":"dws", + "title":"Syntax Compatibility Differences Among Oracle, Teradata, and MySQL", + "uri":"dws_04_0042.html", + "doc_type":"devg", + "p_code":"1", + "code":"98" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Database Security Management", + "uri":"dws_04_0043.html", + "doc_type":"devg", + "p_code":"1", + "code":"99" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Managing Users and Their Permissions", + "uri":"dws_04_0053.html", + "doc_type":"devg", + "p_code":"99", + "code":"100" + }, + { + "desc":"A user who creates an object is the owner of this object. By default, Separation of Permissions is disabled after cluster installation. A database system administrator ha", + "product_code":"dws", + "title":"Default Permission Mechanism", + "uri":"dws_04_0054.html", + "doc_type":"devg", + "p_code":"100", + "code":"101" + }, + { + "desc":"A system administrator is an account with the SYSADMIN permission. After a cluster is installed, a system administrator has the permissions of all object owners by defaul", + "product_code":"dws", + "title":"System Administrator", + "uri":"dws_04_0055.html", + "doc_type":"devg", + "p_code":"100", + "code":"102" + }, + { + "desc":"Descriptions in Default Permission Mechanism and System Administrator are about the initial situation after a cluster is created. By default, a system administrator with ", + "product_code":"dws", + "title":"Separation of Permissions", + "uri":"dws_04_0056.html", + "doc_type":"devg", + "p_code":"100", + "code":"103" + }, + { + "desc":"You can use CREATE USER and ALTER USER to create and manage database users, respectively. The database cluster has one or more named databases. Users and roles are shared", + "product_code":"dws", + "title":"Users", + "uri":"dws_04_0057.html", + "doc_type":"devg", + "p_code":"100", + "code":"104" + }, + { + "desc":"A role is a set of permissions. After a role is granted to a user through GRANT, the user will have all the permissions of the role. It is recommended that roles be used ", + "product_code":"dws", + "title":"Roles", + "uri":"dws_04_0058.html", + "doc_type":"devg", + "p_code":"100", + "code":"105" + }, + { + "desc":"Schemas function as models. Schema management allows multiple users to use the same database without mutual impacts, to organize database objects as manageable logical gr", + "product_code":"dws", + "title":"Schema", + "uri":"dws_04_0059.html", + "doc_type":"devg", + "p_code":"100", + "code":"106" + }, + { + "desc":"To grant the permission for an object directly to a user, use GRANT.When permissions for a table or view in a schema are granted to a user or role, the USAGE permission o", + "product_code":"dws", + "title":"User Permission Setting", + "uri":"dws_04_0060.html", + "doc_type":"devg", + "p_code":"100", + "code":"107" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Setting Security Policies", + "uri":"dws_04_0063.html", + "doc_type":"devg", + "p_code":"100", + "code":"108" + }, + { + "desc":"For data security purposes, GaussDB(DWS) provides a series of security measures, such as automatically locking and unlocking accounts, manually locking and unlocking abno", + "product_code":"dws", + "title":"Setting Account Security Policies", + "uri":"dws_04_0064.html", + "doc_type":"devg", + "p_code":"108", + "code":"109" + }, + { + "desc":"When creating a user, you need to specify the validity period of the user, including the start time and end time.To enable a user not within the validity period to use it", + "product_code":"dws", + "title":"Setting the Validity Period of an Account", + "uri":"dws_04_0065.html", + "doc_type":"devg", + "p_code":"108", + "code":"110" + }, + { + "desc":"User passwords are stored in the system catalog pg_authid. To prevent password leakage, GaussDB(DWS) encrypts and stores the user passwords.Password complexityThe passwor", + "product_code":"dws", + "title":"Setting a User Password", + "uri":"dws_04_0067.html", + "doc_type":"devg", + "p_code":"108", + "code":"111" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Sensitive Data Management", + "uri":"dws_04_0994.html", + "doc_type":"devg", + "p_code":"99", + "code":"112" + }, + { + "desc":"The row-level access control feature enables database access control to be accurate to each row of data tables. In this way, the same SQL query may return different resul", + "product_code":"dws", + "title":"Row-Level Access Control", + "uri":"dws_04_0061.html", + "doc_type":"devg", + "p_code":"112", + "code":"113" + }, + { + "desc":"GaussDB(DWS) provides the column-level dynamic data masking (DDM) function. For sensitive data, such as the ID card number, mobile number, and bank card number, the DDM f", + "product_code":"dws", + "title":"Data Redaction", + "uri":"dws_04_0062.html", + "doc_type":"devg", + "p_code":"112", + "code":"114" + }, + { + "desc":"GaussDB(DWS) supports encryption and decryption of strings using the following functions:gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)Description: En", + "product_code":"dws", + "title":"Using Functions for Encryption and Decryption", + "uri":"dws_04_0995.html", + "doc_type":"devg", + "p_code":"112", + "code":"115" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Development and Design Proposal", + "uri":"dws_04_0074.html", + "doc_type":"devg", + "p_code":"1", + "code":"116" + }, + { + "desc":"This chapter describes the design specifications for database modeling and application development. Modeling compliant with these specifications fits the distributed proc", + "product_code":"dws", + "title":"Development and Design Proposal", + "uri":"dws_04_0075.html", + "doc_type":"devg", + "p_code":"116", + "code":"117" + }, + { + "desc":"The name of a database object must contain 1 to 63 characters, start with a letter or underscore (_), and can contain letters, digits, underscores (_), dollar signs ($), ", + "product_code":"dws", + "title":"Database Object Naming Conventions", + "uri":"dws_04_0076.html", + "doc_type":"devg", + "p_code":"116", + "code":"118" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Database Object Design", + "uri":"dws_04_0077.html", + "doc_type":"devg", + "p_code":"116", + "code":"119" + }, + { + "desc":"In GaussDB(DWS), services can be isolated by databases and schemas. Databases share little resources and cannot directly access each other. Connections to and permissions", + "product_code":"dws", + "title":"Database and Schema Design", + "uri":"dws_04_0078.html", + "doc_type":"devg", + "p_code":"119", + "code":"120" + }, + { + "desc":"GaussDB(DWS) uses a distributed architecture. Data is distributed on DNs. Comply with the following principles to properly design a table:[Notice] Evenly distribute data ", + "product_code":"dws", + "title":"Table Design", + "uri":"dws_04_0079.html", + "doc_type":"devg", + "p_code":"119", + "code":"121" + }, + { + "desc":"Comply with the following rules to improve query efficiency when you design columns:[Proposal] Use the most efficient data types allowed.If all of the following number ty", + "product_code":"dws", + "title":"Column Design", + "uri":"dws_04_0080.html", + "doc_type":"devg", + "p_code":"119", + "code":"122" + }, + { + "desc":"[Proposal] If all the column values can be obtained from services, you are not advised to use the DEFAULT constraint, because doing so will generate unexpected results du", + "product_code":"dws", + "title":"Constraint Design", + "uri":"dws_04_0081.html", + "doc_type":"devg", + "p_code":"119", + "code":"123" + }, + { + "desc":"[Proposal] Do not nest views unless they have strong dependency on each other.[Proposal] Try to avoid sort operations in a view definition.[Proposal] Minimize joined colu", + "product_code":"dws", + "title":"View and Joined Table Design", + "uri":"dws_04_0082.html", + "doc_type":"devg", + "p_code":"119", + "code":"124" + }, + { + "desc":"Currently, third-party tools are connected to GaussDB(DWS) trough JDBC. This section describes the precautions for configuring the tools.[Notice] When a third-party tool ", + "product_code":"dws", + "title":"JDBC Configuration", + "uri":"dws_04_0083.html", + "doc_type":"devg", + "p_code":"116", + "code":"125" + }, + { + "desc":"[Proposal] In GaussDB(DWS), you are advised to execute DDL operations, such as creating table or making comments, separately from batch processing jobs to avoid performan", + "product_code":"dws", + "title":"SQL Compilation", + "uri":"dws_04_0084.html", + "doc_type":"devg", + "p_code":"116", + "code":"126" + }, + { + "desc":"[Notice] Java UDFs can perform some Java logic calculation. Do not encapsulate services in Java UDFs.[Notice] Do not connect to a database in any way (for example, by usi", + "product_code":"dws", + "title":"PL/Java Usage", + "uri":"dws_04_0971.html", + "doc_type":"devg", + "p_code":"116", + "code":"127" + }, + { + "desc":"Development shall strictly comply with design documents.Program modules shall be highly cohesive and loosely coupled.Proper, comprehensive troubleshooting measures shall ", + "product_code":"dws", + "title":"PL/pgSQL Usage", + "uri":"dws_04_0972.html", + "doc_type":"devg", + "p_code":"116", + "code":"128" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Guide: JDBC- or ODBC-Based Development", + "uri":"dws_04_0085.html", + "doc_type":"devg", + "p_code":"1", + "code":"129" + }, + { + "desc":"If the connection pool mechanism is used during application development, comply with the following specifications:If GUC parameters are set in the connection, before you ", + "product_code":"dws", + "title":"Development Specifications", + "uri":"dws_04_0086.html", + "doc_type":"devg", + "p_code":"129", + "code":"130" + }, + { + "desc":"For details, see section \"Downloading the JDBC or ODBC Driver\" in the Data Warehouse Service User Guide.", + "product_code":"dws", + "title":"Downloading Drivers", + "uri":"dws_04_0087.html", + "doc_type":"devg", + "p_code":"129", + "code":"131" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"JDBC-Based Development", + "uri":"dws_04_0088.html", + "doc_type":"devg", + "p_code":"129", + "code":"132" + }, + { + "desc":"Obtain the package dws_8.1.x_jdbc_driver.zip from the management console. For details, see Downloading Drivers.Compressed in it is the JDBC driver JAR package:gsjdbc4.jar", + "product_code":"dws", + "title":"JDBC Package and Driver Class", + "uri":"dws_04_0090.html", + "doc_type":"devg", + "p_code":"132", + "code":"133" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Development Process", + "uri":"dws_04_0091.html", + "doc_type":"devg", + "p_code":"132", + "code":"134" + }, + { + "desc":"Load the database driver before creating a database connection.You can load the driver in the following ways:Implicitly loading the driver before creating a connection in", + "product_code":"dws", + "title":"Loading a Driver", + "uri":"dws_04_0092.html", + "doc_type":"devg", + "p_code":"132", + "code":"135" + }, + { + "desc":"After a database is connected, you can execute SQL statements in the database.If you use an open-source Java Database Connectivity (JDBC) driver, ensure that the database", + "product_code":"dws", + "title":"Connecting to a Database", + "uri":"dws_04_0093.html", + "doc_type":"devg", + "p_code":"132", + "code":"136" + }, + { + "desc":"The application performs data (parameter statements do not need to be transferred) in the database by running SQL statements, and you need to perform the following steps:", + "product_code":"dws", + "title":"Executing SQL Statements", + "uri":"dws_04_0095.html", + "doc_type":"devg", + "p_code":"132", + "code":"137" + }, + { + "desc":"Different types of result sets are applicable to different application scenarios. Applications select proper types of result sets based on requirements. Before executing ", + "product_code":"dws", + "title":"Processing Data in a Result Set", + "uri":"dws_04_0096.html", + "doc_type":"devg", + "p_code":"132", + "code":"138" + }, + { + "desc":"After you complete required data operations in the database, close the database connection.Call the close method to close the connection, such as, conn. close().", + "product_code":"dws", + "title":"Closing the Connection", + "uri":"dws_04_0097.html", + "doc_type":"devg", + "p_code":"132", + "code":"139" + }, + { + "desc":"Before completing the following example, you need to create a stored procedure.This example illustrates how to develop applications based on the GaussDB(DWS) JDBC interfa", + "product_code":"dws", + "title":"Example: Common Operations", + "uri":"dws_04_0098.html", + "doc_type":"devg", + "p_code":"132", + "code":"140" + }, + { + "desc":"If the primary DN is faulty and cannot be restored within 40s, its standby is automatically promoted to primary to ensure the normal running of the cluster. Jobs running ", + "product_code":"dws", + "title":"Example: Retrying SQL Queries for Applications", + "uri":"dws_04_0099.html", + "doc_type":"devg", + "p_code":"132", + "code":"141" + }, + { + "desc":"When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or ", + "product_code":"dws", + "title":"Example: Importing and Exporting Data Through Local Files", + "uri":"dws_04_0100.html", + "doc_type":"devg", + "p_code":"132", + "code":"142" + }, + { + "desc":"The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).", + "product_code":"dws", + "title":"Example: Migrating Data from MySQL to GaussDB(DWS)", + "uri":"dws_04_0101.html", + "doc_type":"devg", + "p_code":"132", + "code":"143" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"JDBC Interface Reference", + "uri":"dws_04_0102.html", + "doc_type":"devg", + "p_code":"132", + "code":"144" + }, + { + "desc":"This section describes java.sql.Connection, the interface for connecting to a database.The AutoCommit mode is used by default within the interface. If you disable it runn", + "product_code":"dws", + "title":"java.sql.Connection", + "uri":"dws_04_0103.html", + "doc_type":"devg", + "p_code":"144", + "code":"145" + }, + { + "desc":"This section describes java.sql.CallableStatement, the stored procedure execution interface.The batch operation of statements containing OUT parameter is not allowed.The ", + "product_code":"dws", + "title":"java.sql.CallableStatement", + "uri":"dws_04_0104.html", + "doc_type":"devg", + "p_code":"144", + "code":"146" + }, + { + "desc":"This section describes java.sql.DatabaseMetaData, the interface for defining database objects.", + "product_code":"dws", + "title":"java.sql.DatabaseMetaData", + "uri":"dws_04_0105.html", + "doc_type":"devg", + "p_code":"144", + "code":"147" + }, + { + "desc":"This section describes java.sql.Driver, the database driver interface.", + "product_code":"dws", + "title":"java.sql.Driver", + "uri":"dws_04_0106.html", + "doc_type":"devg", + "p_code":"144", + "code":"148" + }, + { + "desc":"This section describes java.sql.PreparedStatement, the interface for preparing statements.Execute addBatch() and execute() only after running clearBatch().Batch is not cl", + "product_code":"dws", + "title":"java.sql.PreparedStatement", + "uri":"dws_04_0107.html", + "doc_type":"devg", + "p_code":"144", + "code":"149" + }, + { + "desc":"This section describes java.sql.ResultSet, the interface for execution result sets.One Statement cannot have multiple open ResultSets.The cursor that is used for traversi", + "product_code":"dws", + "title":"java.sql.ResultSet", + "uri":"dws_04_0108.html", + "doc_type":"devg", + "p_code":"144", + "code":"150" + }, + { + "desc":"This section describes java.sql.ResultSetMetaData, which provides details about ResultSet object information.", + "product_code":"dws", + "title":"java.sql.ResultSetMetaData", + "uri":"dws_04_0109.html", + "doc_type":"devg", + "p_code":"144", + "code":"151" + }, + { + "desc":"This section describes java.sql.Statement, the interface for executing SQL statements.Using setFetchSize can reduce the memory occupied by result sets on the client. Resu", + "product_code":"dws", + "title":"java.sql.Statement", + "uri":"dws_04_0110.html", + "doc_type":"devg", + "p_code":"144", + "code":"152" + }, + { + "desc":"This section describes javax.sql.ConnectionPoolDataSource, the interface for data source connection pools.", + "product_code":"dws", + "title":"javax.sql.ConnectionPoolDataSource", + "uri":"dws_04_0111.html", + "doc_type":"devg", + "p_code":"144", + "code":"153" + }, + { + "desc":"This section describes javax.sql.DataSource, the interface for data sources.", + "product_code":"dws", + "title":"javax.sql.DataSource", + "uri":"dws_04_0112.html", + "doc_type":"devg", + "p_code":"144", + "code":"154" + }, + { + "desc":"This section describes javax.sql.PooledConnection, the connection interface created by a connection pool.", + "product_code":"dws", + "title":"javax.sql.PooledConnection", + "uri":"dws_04_0113.html", + "doc_type":"devg", + "p_code":"144", + "code":"155" + }, + { + "desc":"This section describes javax.naming.Context, the context interface for connection configuration.", + "product_code":"dws", + "title":"javax.naming.Context", + "uri":"dws_04_0114.html", + "doc_type":"devg", + "p_code":"144", + "code":"156" + }, + { + "desc":"This section describes javax.naming.spi.InitialContextFactory, the initial context factory interface.", + "product_code":"dws", + "title":"javax.naming.spi.InitialContextFactory", + "uri":"dws_04_0115.html", + "doc_type":"devg", + "p_code":"144", + "code":"157" + }, + { + "desc":"CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.The CopyManager class is in the or", + "product_code":"dws", + "title":"CopyManager", + "uri":"dws_04_0116.html", + "doc_type":"devg", + "p_code":"144", + "code":"158" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"ODBC-Based Development", + "uri":"dws_04_0117.html", + "doc_type":"devg", + "p_code":"129", + "code":"159" + }, + { + "desc":"Obtain the dws_8.1.x_odbc_driver_for_xxx_xxx.zip package from the release package. In the Linux OS, header files (including sql.h and sqlext.h) and library (libodbc.so) a", + "product_code":"dws", + "title":"ODBC Package and Its Dependent Libraries and Header Files", + "uri":"dws_04_0118.html", + "doc_type":"devg", + "p_code":"159", + "code":"160" + }, + { + "desc":"The ODBC DRIVER (psqlodbcw.so) provided by GaussDB(DWS) can be used after it has been configured in the data source. To configure data sources, users must configure the o", + "product_code":"dws", + "title":"Configuring a Data Source in the Linux OS", + "uri":"dws_04_0119.html", + "doc_type":"devg", + "p_code":"159", + "code":"161" + }, + { + "desc":"Configure the ODBC data source using the ODBC data source manager preinstalled in the Windows OS.Decompress GaussDB-8.1.1-Windows-Odbc.tar.gz and install psqlodbc.msi (fo", + "product_code":"dws", + "title":"Configuring a Data Source in the Windows OS", + "uri":"dws_04_0120.html", + "doc_type":"devg", + "p_code":"159", + "code":"162" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"ODBC Development Example", + "uri":"dws_04_0123.html", + "doc_type":"devg", + "p_code":"159", + "code":"163" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"ODBC Interfaces", + "uri":"dws_04_0124.html", + "doc_type":"devg", + "p_code":"159", + "code":"164" + }, + { + "desc":"In ODBC 3.x, SQLAllocEnv (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "product_code":"dws", + "title":"SQLAllocEnv", + "uri":"dws_04_0125.html", + "doc_type":"devg", + "p_code":"164", + "code":"165" + }, + { + "desc":"In ODBC 3.x, SQLAllocConnect (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "product_code":"dws", + "title":"SQLAllocConnect", + "uri":"dws_04_0126.html", + "doc_type":"devg", + "p_code":"164", + "code":"166" + }, + { + "desc":"SQLAllocHandle allocates environment, connection, or statement handles. This function is a generic function for allocating handles that replaces the deprecated ODBC 2.x f", + "product_code":"dws", + "title":"SQLAllocHandle", + "uri":"dws_04_0127.html", + "doc_type":"devg", + "p_code":"164", + "code":"167" + }, + { + "desc":"In ODBC 3.x, SQLAllocStmt was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.", + "product_code":"dws", + "title":"SQLAllocStmt", + "uri":"dws_04_0128.html", + "doc_type":"devg", + "p_code":"164", + "code":"168" + }, + { + "desc":"SQLBindCol is used to associate (bind) columns in a result set to an application data buffer.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates", + "product_code":"dws", + "title":"SQLBindCol", + "uri":"dws_04_0129.html", + "doc_type":"devg", + "p_code":"164", + "code":"169" + }, + { + "desc":"SQLBindParameter is used to associate (bind) parameter markers in an SQL statement to a buffer.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicat", + "product_code":"dws", + "title":"SQLBindParameter", + "uri":"dws_04_0130.html", + "doc_type":"devg", + "p_code":"164", + "code":"170" + }, + { + "desc":"SQLColAttribute returns the descriptor information about a column in the result set.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some war", + "product_code":"dws", + "title":"SQLColAttribute", + "uri":"dws_04_0131.html", + "doc_type":"devg", + "p_code":"164", + "code":"171" + }, + { + "desc":"SQLConnect establishes a connection between a driver and a data source. After the connection, the connection handle can be used to access all information about the data s", + "product_code":"dws", + "title":"SQLConnect", + "uri":"dws_04_0132.html", + "doc_type":"devg", + "p_code":"164", + "code":"172" + }, + { + "desc":"SQLDisconnect closes the connection associated with the database connection handle.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warn", + "product_code":"dws", + "title":"SQLDisconnect", + "uri":"dws_04_0133.html", + "doc_type":"devg", + "p_code":"164", + "code":"173" + }, + { + "desc":"SQLExecDirect executes a prepared SQL statement specified in this parameter. This is the fastest execution method for executing only one SQL statement at a time.SQL_SUCCE", + "product_code":"dws", + "title":"SQLExecDirect", + "uri":"dws_04_0134.html", + "doc_type":"devg", + "p_code":"164", + "code":"174" + }, + { + "desc":"The SQLExecute function executes a prepared SQL statement using SQLPrepare. The statement is executed using the current value of any application variables that were bound", + "product_code":"dws", + "title":"SQLExecute", + "uri":"dws_04_0135.html", + "doc_type":"devg", + "p_code":"164", + "code":"175" + }, + { + "desc":"SQLFetch advances the cursor to the next row of the result set and retrieves any bound columns.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicat", + "product_code":"dws", + "title":"SQLFetch", + "uri":"dws_04_0136.html", + "doc_type":"devg", + "p_code":"164", + "code":"176" + }, + { + "desc":"In ODBC 3.x, SQLFreeStmt (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "product_code":"dws", + "title":"SQLFreeStmt", + "uri":"dws_04_0137.html", + "doc_type":"devg", + "p_code":"164", + "code":"177" + }, + { + "desc":"In ODBC 3.x, SQLFreeConnect (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "product_code":"dws", + "title":"SQLFreeConnect", + "uri":"dws_04_0138.html", + "doc_type":"devg", + "p_code":"164", + "code":"178" + }, + { + "desc":"SQLFreeHandle releases resources associated with a specific environment, connection, or statement handle. It replaces the ODBC 2.x functions: SQLFreeEnv, SQLFreeConnect, ", + "product_code":"dws", + "title":"SQLFreeHandle", + "uri":"dws_04_0139.html", + "doc_type":"devg", + "p_code":"164", + "code":"179" + }, + { + "desc":"In ODBC 3.x, SQLFreeEnv (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.", + "product_code":"dws", + "title":"SQLFreeEnv", + "uri":"dws_04_0140.html", + "doc_type":"devg", + "p_code":"164", + "code":"180" + }, + { + "desc":"SQLPrepare prepares an SQL statement to be executed.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQ", + "product_code":"dws", + "title":"SQLPrepare", + "uri":"dws_04_0141.html", + "doc_type":"devg", + "p_code":"164", + "code":"181" + }, + { + "desc":"SQLGetData retrieves data for a single column in the current row of the result set. It can be called for many times to retrieve data of variable lengths.SQL_SUCCESS indic", + "product_code":"dws", + "title":"SQLGetData", + "uri":"dws_04_0142.html", + "doc_type":"devg", + "p_code":"164", + "code":"182" + }, + { + "desc":"SQLGetDiagRec returns the current values of multiple fields of a diagnostic record that contains error, warning, and status information.SQL_SUCCESS indicates that the cal", + "product_code":"dws", + "title":"SQLGetDiagRec", + "uri":"dws_04_0143.html", + "doc_type":"devg", + "p_code":"164", + "code":"183" + }, + { + "desc":"SQLSetConnectAttr sets connection attributes.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQL_ERROR", + "product_code":"dws", + "title":"SQLSetConnectAttr", + "uri":"dws_04_0144.html", + "doc_type":"devg", + "p_code":"164", + "code":"184" + }, + { + "desc":"SQLSetEnvAttr sets environment attributes.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.SQL_ERROR in", + "product_code":"dws", + "title":"SQLSetEnvAttr", + "uri":"dws_04_0145.html", + "doc_type":"devg", + "p_code":"164", + "code":"185" + }, + { + "desc":"SQLSetStmtAttr sets attributes related to a statement.SQL_SUCCESS indicates that the call succeeded.SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.", + "product_code":"dws", + "title":"SQLSetStmtAttr", + "uri":"dws_04_0146.html", + "doc_type":"devg", + "p_code":"164", + "code":"186" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"PostGIS Extension", + "uri":"dws_04_0301.html", + "doc_type":"devg", + "p_code":"1", + "code":"187" + }, + { + "desc":"The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical ", + "product_code":"dws", + "title":"PostGIS", + "uri":"dws_04_0302.html", + "doc_type":"devg", + "p_code":"187", + "code":"188" + }, + { + "desc":"The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical ", + "product_code":"dws", + "title":"Using PostGIS", + "uri":"dws_04_0304.html", + "doc_type":"devg", + "p_code":"187", + "code":"189" + }, + { + "desc":"In GaussDB(DWS), PostGIS Extension support the following data types:box2dbox3dgeometry_dumpgeometrygeographyrasterIf PostGIS is used by a user other than the creator of t", + "product_code":"dws", + "title":"PostGIS Support and Constraints", + "uri":"dws_04_0305.html", + "doc_type":"devg", + "p_code":"187", + "code":"190" + }, + { + "desc":"This document contains open source software notice for the product. And this document is confidential information of copyright holder. Recipient shall protect it in due c", + "product_code":"dws", + "title":"OPEN SOURCE SOFTWARE NOTICE (For PostGIS)", + "uri":"dws_04_0306.html", + "doc_type":"devg", + "p_code":"187", + "code":"191" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Resource Monitoring", + "uri":"dws_04_0393.html", + "doc_type":"devg", + "p_code":"1", + "code":"192" + }, + { + "desc":"In the multi-tenant management framework, you can query the real-time or historical usage of all user resources (including memory, CPU cores, storage space, temporary spa", + "product_code":"dws", + "title":"User Resource Query", + "uri":"dws_04_0394.html", + "doc_type":"devg", + "p_code":"192", + "code":"193" + }, + { + "desc":"GaussDB(DWS) provides a view for monitoring the memory usage of the entire cluster.Query the pgxc_total_memory_detail view as a user with sysadmin permissions.SELECT * FR", + "product_code":"dws", + "title":"Monitoring Memory Resources", + "uri":"dws_04_0395.html", + "doc_type":"devg", + "p_code":"192", + "code":"194" + }, + { + "desc":"GaussDB(DWS) provides system catalogs for monitoring the resource usage of CNs and DNs (including memory, CPU usage, disk I/O, process physical I/O, and process logical I", + "product_code":"dws", + "title":"Instance Resource Monitoring", + "uri":"dws_04_0396.html", + "doc_type":"devg", + "p_code":"192", + "code":"195" + }, + { + "desc":"You can query real-time Top SQL in real-time resource monitoring views at different levels. The real-time resource monitoring view records the resource usage (including m", + "product_code":"dws", + "title":"Real-time TopSQL", + "uri":"dws_04_0397.html", + "doc_type":"devg", + "p_code":"192", + "code":"196" + }, + { + "desc":"You can query historical Top SQL in historical resource monitoring views. The historical resource monitoring view records the resource usage (of memory, disk, CPU time, a", + "product_code":"dws", + "title":"Historical TopSQL", + "uri":"dws_04_0398.html", + "doc_type":"devg", + "p_code":"192", + "code":"197" + }, + { + "desc":"In this section, TPC-DS sample data is used as an example to describe how to query Real-time TopSQL and Historical TopSQL.To query for historical or archived resource mon", + "product_code":"dws", + "title":"TopSQL Query Example", + "uri":"dws_04_0399.html", + "doc_type":"devg", + "p_code":"192", + "code":"198" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Query Performance Optimization", + "uri":"dws_04_0400.html", + "doc_type":"devg", + "p_code":"1", + "code":"199" + }, + { + "desc":"The aim of SQL optimization is to maximize the utilization of resources, including CPU, memory, disk I/O, and network I/O. To maximize resource utilization is to run SQL ", + "product_code":"dws", + "title":"Overview of Query Performance Optimization", + "uri":"dws_04_0402.html", + "doc_type":"devg", + "p_code":"199", + "code":"200" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Query Analysis", + "uri":"dws_04_0403.html", + "doc_type":"devg", + "p_code":"199", + "code":"201" + }, + { + "desc":"The process from receiving SQL statements to the statement execution by the SQL engine is shown in Figure 1 and Table 1. The texts in red are steps where database adminis", + "product_code":"dws", + "title":"Query Execution Process", + "uri":"dws_04_0409.html", + "doc_type":"devg", + "p_code":"201", + "code":"202" + }, + { + "desc":"The SQL execution plan is a node tree, which displays detailed procedure when GaussDB(DWS) runs an SQL statement. A database operator indicates one step.You can run the E", + "product_code":"dws", + "title":"Overview of the SQL Execution Plan", + "uri":"dws_04_0410.html", + "doc_type":"devg", + "p_code":"201", + "code":"203" + }, + { + "desc":"As described in Overview of the SQL Execution Plan, EXPLAIN displays the execution plan, but will not actually run SQL statements. EXPLAIN ANALYZE and EXPLAIN PERFORMANCE", + "product_code":"dws", + "title":"Deep Dive on the SQL Execution Plan", + "uri":"dws_04_0411.html", + "doc_type":"devg", + "p_code":"201", + "code":"204" + }, + { + "desc":"This section describes how to query SQL statements whose execution takes a long time, leading to poor system performance.After the query, query statements are returned as", + "product_code":"dws", + "title":"Querying SQL Statements That Affect Performance Most", + "uri":"dws_04_0412.html", + "doc_type":"devg", + "p_code":"201", + "code":"205" + }, + { + "desc":"During database running, query statements are blocked in some service scenarios and run for an excessively long time. In this case, you can forcibly terminate the faulty ", + "product_code":"dws", + "title":"Checking Blocked Statements", + "uri":"dws_04_0413.html", + "doc_type":"devg", + "p_code":"201", + "code":"206" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Query Improvement", + "uri":"dws_04_0430.html", + "doc_type":"devg", + "p_code":"199", + "code":"207" + }, + { + "desc":"You can analyze slow SQL statements to optimize them.", + "product_code":"dws", + "title":"Optimization Process", + "uri":"dws_04_0435.html", + "doc_type":"devg", + "p_code":"207", + "code":"208" + }, + { + "desc":"In a database, statistics indicate the source data of a plan generated by a planner. If no collection statistics are available or out of date, the execution plan may seri", + "product_code":"dws", + "title":"Updating Statistics", + "uri":"dws_04_0436.html", + "doc_type":"devg", + "p_code":"207", + "code":"209" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Reviewing and Modifying a Table Definition", + "uri":"dws_04_0437.html", + "doc_type":"devg", + "p_code":"207", + "code":"210" + }, + { + "desc":"In a distributed framework, data is distributed on DNs. Data on one or more DNs is stored on a physical storage device. To properly define a table, you must:Evenly distri", + "product_code":"dws", + "title":"Reviewing and Modifying a Table Definition", + "uri":"dws_04_0438.html", + "doc_type":"devg", + "p_code":"210", + "code":"211" + }, + { + "desc":"During database design, some key factors about table design will greatly affect the subsequent query performance of the database. Table design affects data storage as wel", + "product_code":"dws", + "title":"Selecting a Storage Model", + "uri":"dws_04_0439.html", + "doc_type":"devg", + "p_code":"210", + "code":"212" + }, + { + "desc":"In replication mode, full data in a table is copied to each DN in the cluster. This mode is used for tables containing a small volume of data. Full data in a table stored", + "product_code":"dws", + "title":"Selecting a Distribution Mode", + "uri":"dws_04_0440.html", + "doc_type":"devg", + "p_code":"210", + "code":"213" + }, + { + "desc":"The distribution column in a hash table must meet the following requirements, which are ranked by priority in descending order:The value of the distribution column should", + "product_code":"dws", + "title":"Selecting a Distribution Column", + "uri":"dws_04_0441.html", + "doc_type":"devg", + "p_code":"210", + "code":"214" + }, + { + "desc":"Partial Cluster Key is the column-based technology. It can minimize or maximize sparse indexes to quickly filter base tables. Partial cluster key can specify multiple col", + "product_code":"dws", + "title":"Using Partial Clustering", + "uri":"dws_04_0442.html", + "doc_type":"devg", + "p_code":"210", + "code":"215" + }, + { + "desc":"Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific schemes. The table based on the logic is called a partit", + "product_code":"dws", + "title":"Using Partitioned Tables", + "uri":"dws_04_0443.html", + "doc_type":"devg", + "p_code":"210", + "code":"216" + }, + { + "desc":"Use the following principles to obtain efficient data types:Using the data type that can be efficiently executedGenerally, calculation of integers (including common compa", + "product_code":"dws", + "title":"Selecting a Data Type", + "uri":"dws_04_0444.html", + "doc_type":"devg", + "p_code":"210", + "code":"217" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Typical SQL Optimization Methods", + "uri":"dws_04_0445.html", + "doc_type":"devg", + "p_code":"207", + "code":"218" + }, + { + "desc":"Performance issues may occur when you query data or run the INSERT, DELETE, UPDATE, or CREATE TABLE AS statement. You can query the warning column in the GS_WLM_SESSION_S", + "product_code":"dws", + "title":"SQL Self-Diagnosis", + "uri":"dws_04_0446.html", + "doc_type":"devg", + "p_code":"218", + "code":"219" + }, + { + "desc":"Currently, the GaussDB(DWS) optimizer can use three methods to develop statement execution policies in the distributed framework: generating a statement pushdown plan, a ", + "product_code":"dws", + "title":"Optimizing Statement Pushdown", + "uri":"dws_04_0447.html", + "doc_type":"devg", + "p_code":"218", + "code":"220" + }, + { + "desc":"When an application runs a SQL statement to operate the database, a large number of subqueries are used because they are more clear than table join. Especially in complic", + "product_code":"dws", + "title":"Optimizing Subqueries", + "uri":"dws_04_0448.html", + "doc_type":"devg", + "p_code":"218", + "code":"221" + }, + { + "desc":"GaussDB(DWS) generates optimal execution plans based on the cost estimation. Optimizers need to estimate the number of data rows and the cost based on statistics collecte", + "product_code":"dws", + "title":"Optimizing Statistics", + "uri":"dws_04_0449.html", + "doc_type":"devg", + "p_code":"218", + "code":"222" + }, + { + "desc":"A query statement needs to go through multiple operator procedures to generate the final result. Sometimes, the overall query performance deteriorates due to long executi", + "product_code":"dws", + "title":"Optimizing Operators", + "uri":"dws_04_0450.html", + "doc_type":"devg", + "p_code":"218", + "code":"223" + }, + { + "desc":"Data skew breaks the balance among nodes in the distributed MPP architecture. If the amount of data stored or processed by a node is much greater than that by other nodes", + "product_code":"dws", + "title":"Optimizing Data Skew", + "uri":"dws_04_0451.html", + "doc_type":"devg", + "p_code":"218", + "code":"224" + }, + { + "desc":"Based on the database SQL execution mechanism and a large number of practices, summarize finds that: using rules of a certain SQL statement, on the basis of the so that t", + "product_code":"dws", + "title":"Experience in Rewriting SQL Statements", + "uri":"dws_04_0452.html", + "doc_type":"devg", + "p_code":"207", + "code":"225" + }, + { + "desc":"This section describes the key CN parameters that affect GaussDB(DWS) SQL tuning performance. For details about how to configure these parameters, see Configuring GUC Par", + "product_code":"dws", + "title":"Adjusting Key Parameters During SQL Tuning", + "uri":"dws_04_0453.html", + "doc_type":"devg", + "p_code":"207", + "code":"226" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Hint-based Tuning", + "uri":"dws_04_0454.html", + "doc_type":"devg", + "p_code":"207", + "code":"227" + }, + { + "desc":"In plan hints, you can specify a join order, join, stream, and scan operations, the number of rows in a result, and redistribution skew information to tune an execution p", + "product_code":"dws", + "title":"Plan Hint Optimization", + "uri":"dws_04_0455.html", + "doc_type":"devg", + "p_code":"227", + "code":"228" + }, + { + "desc":"Theses hints specify the join order and outer/inner tables.Specify only the join order.Specify the join order and outer/inner tables. The outer/inner tables are specified", + "product_code":"dws", + "title":"Join Order Hints", + "uri":"dws_04_0456.html", + "doc_type":"devg", + "p_code":"227", + "code":"229" + }, + { + "desc":"Specifies the join method. It can be nested loop join, hash join, or merge join.no indicates that the specified hint will not be used for a join.table_list specifies the ", + "product_code":"dws", + "title":"Join Operation Hints", + "uri":"dws_04_0457.html", + "doc_type":"devg", + "p_code":"227", + "code":"230" + }, + { + "desc":"These hints specify the number of rows in an intermediate result set. Both absolute values and relative values are supported.#,+,-, and * are operators used for hinting t", + "product_code":"dws", + "title":"Rows Hints", + "uri":"dws_04_0458.html", + "doc_type":"devg", + "p_code":"227", + "code":"231" + }, + { + "desc":"These hints specify a stream operation, which can be broadcast or redistribute.no indicates that the specified hint will not be used for a join.table_list specifies the t", + "product_code":"dws", + "title":"Stream Operation Hints", + "uri":"dws_04_0459.html", + "doc_type":"devg", + "p_code":"227", + "code":"232" + }, + { + "desc":"These hints specify a scan operation, which can be tablescan, indexscan, or indexonlyscan.no indicates that the specified hint will not be used for a join.table specifies", + "product_code":"dws", + "title":"Scan Operation Hints", + "uri":"dws_04_0460.html", + "doc_type":"devg", + "p_code":"227", + "code":"233" + }, + { + "desc":"These hints specify the name of a sublink block.table indicates the name you have specified for a sublink block.This hint is used by an outer query only when a sublink is", + "product_code":"dws", + "title":"Sublink Name Hints", + "uri":"dws_04_0461.html", + "doc_type":"devg", + "p_code":"227", + "code":"234" + }, + { + "desc":"Theses hints specify redistribution keys containing skew data and skew values, and are used to optimize redistribution involving Join or HashAgg.Specify single-table skew", + "product_code":"dws", + "title":"Skew Hints", + "uri":"dws_04_0462.html", + "doc_type":"devg", + "p_code":"227", + "code":"235" + }, + { + "desc":"A hint, or a GUC hint, specifies a configuration parameter value when a plan is generated. Currently, only the following parameters are supported:agg_redistribute_enhance", + "product_code":"dws", + "title":"Configuration Parameter Hints", + "uri":"dws_04_0463.html", + "doc_type":"devg", + "p_code":"227", + "code":"236" + }, + { + "desc":"Plan hints change an execution plan. You can run EXPLAIN to view the changes.Hints containing errors are invalid and do not affect statement execution. The errors will be", + "product_code":"dws", + "title":"Hint Errors, Conflicts, and Other Warnings", + "uri":"dws_04_0464.html", + "doc_type":"devg", + "p_code":"227", + "code":"237" + }, + { + "desc":"This section takes the statements in TPC-DS (Q24) as an example to describe how to optimize an execution plan by using hints in 1000X+24DN environments. For example:The o", + "product_code":"dws", + "title":"Plan Hint Cases", + "uri":"dws_04_0465.html", + "doc_type":"devg", + "p_code":"227", + "code":"238" + }, + { + "desc":"To ensure proper database running, after INSERT and DELETE operations, you need to routinely do VACUUM FULL and ANALYZE as appropriate for customer scenarios and update s", + "product_code":"dws", + "title":"Routinely Maintaining Tables", + "uri":"dws_04_0466.html", + "doc_type":"devg", + "p_code":"207", + "code":"239" + }, + { + "desc":"When data deletion is repeatedly performed in the database, index keys will be deleted from the index page, resulting in index distention. Recreating an index routinely i", + "product_code":"dws", + "title":"Routinely Recreating an Index", + "uri":"dws_04_0467.html", + "doc_type":"devg", + "p_code":"207", + "code":"240" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Configuring the SMP", + "uri":"dws_04_0468.html", + "doc_type":"devg", + "p_code":"207", + "code":"241" + }, + { + "desc":"The SMP feature improves the performance through operator parallelism and occupies more system resources, including CPU, memory, network, and I/O. Actually, SMP is a meth", + "product_code":"dws", + "title":"Application Scenarios and Restrictions", + "uri":"dws_04_0469.html", + "doc_type":"devg", + "p_code":"241", + "code":"242" + }, + { + "desc":"The SMP architecture uses abundant resources to obtain time. After the plan parallelism is executed, the resource consumption is added, including the CPU, memory, I/O, an", + "product_code":"dws", + "title":"Resource Impact on SMP Performance", + "uri":"dws_04_0470.html", + "doc_type":"devg", + "p_code":"241", + "code":"243" + }, + { + "desc":"Besides resource factors, there are other factors that impact the SMP parallelism performance, such as unevenly data distributed in a partitioned table and system paralle", + "product_code":"dws", + "title":"Other Factors Affecting SMP Performance", + "uri":"dws_04_0471.html", + "doc_type":"devg", + "p_code":"241", + "code":"244" + }, + { + "desc":"Starting from this version, SMP auto adaptation is enabled. For newly deployed clusters, the default value of query_dop is 0, and SMP parameters have been adjusted. To en", + "product_code":"dws", + "title":"Suggestions for SMP Parameter Settings", + "uri":"dws_04_0472.html", + "doc_type":"devg", + "p_code":"241", + "code":"245" + }, + { + "desc":"To manually optimize SMP, you need to be familiar with Suggestions for SMP Parameter Settings. This section describes how to optimize SMP.The CPU, memory, I/O, and networ", + "product_code":"dws", + "title":"SMP Manual Optimization Suggestions", + "uri":"dws_04_0473.html", + "doc_type":"devg", + "p_code":"241", + "code":"246" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Optimization Cases", + "uri":"dws_04_0474.html", + "doc_type":"devg", + "p_code":"199", + "code":"247" + }, + { + "desc":"Tables are defined as follows:The following query is executed:If a is the distribution column of t1 and t2:Then Streaming exists in the execution plan and the data volume", + "product_code":"dws", + "title":"Case: Selecting an Appropriate Distribution Column", + "uri":"dws_04_0475.html", + "doc_type":"devg", + "p_code":"247", + "code":"248" + }, + { + "desc":"Query the information about all personnel in the sales department.The original execution plan is as follows before creating the places.place_id and states.state_id indexe", + "product_code":"dws", + "title":"Case: Creating an Appropriate Index", + "uri":"dws_04_0476.html", + "doc_type":"devg", + "p_code":"247", + "code":"249" + }, + { + "desc":"Figure 1 shows the execution plan.As shown in Figure 1, the sequential scan phase is time consuming.The JOIN performance is poor because a large number of null values exi", + "product_code":"dws", + "title":"Case: Adding NOT NULL for JOIN Columns", + "uri":"dws_04_0477.html", + "doc_type":"devg", + "p_code":"247", + "code":"250" + }, + { + "desc":"In an execution plan, more than 95% of the execution time is spent on window agg performed on the CN. In this case, sum is performed for the two columns separately, and t", + "product_code":"dws", + "title":"Case: Pushing Down Sort Operations to DNs", + "uri":"dws_04_0478.html", + "doc_type":"devg", + "p_code":"247", + "code":"251" + }, + { + "desc":"If bit0 of cost_param is set to 1, an improved mechanism is used for estimating the selection rate of non-equi-joins. This method is more accurate for estimating the sele", + "product_code":"dws", + "title":"Case: Configuring cost_param for Better Query Performance", + "uri":"dws_04_0479.html", + "doc_type":"devg", + "p_code":"247", + "code":"252" + }, + { + "desc":"During a site test, the information is displayed after EXPLAIN ANALYZE is executed:According to the execution information, HashJoin becomes the performance bottleneck of ", + "product_code":"dws", + "title":"Case: Adjusting the Distribution Key", + "uri":"dws_04_0480.html", + "doc_type":"devg", + "p_code":"247", + "code":"253" + }, + { + "desc":"Information on the EXPLAIN PERFORMANCE at a site is as follows: As shown in the red boxes, two performance bottlenecks are scan operations in a table.After further analys", + "product_code":"dws", + "title":"Case: Adjusting the Partial Clustering Key", + "uri":"dws_04_0481.html", + "doc_type":"devg", + "p_code":"247", + "code":"254" + }, + { + "desc":"In the GaussDB(DWS) database, row-store tables use the row execution engine, and column-store tables use the column execution engine. If both row-store table and column-s", + "product_code":"dws", + "title":"Case: Adjusting the Table Storage Mode in a Medium Table", + "uri":"dws_04_0482.html", + "doc_type":"devg", + "p_code":"247", + "code":"255" + }, + { + "desc":"During the test at a site, if the following execution plan is performed, the customer expects that the performance can be improved and the result can be returned within 3", + "product_code":"dws", + "title":"Case: Adjusting the Local Clustering Column", + "uri":"dws_04_0483.html", + "doc_type":"devg", + "p_code":"247", + "code":"256" + }, + { + "desc":"In the following simple SQL statements, the performance bottlenecks exist in the scan operation of dwcjk.Obviously, there are date features in the cjrq field of table dat", + "product_code":"dws", + "title":"Case: Reconstructing Partition Tables", + "uri":"dws_04_0484.html", + "doc_type":"devg", + "p_code":"247", + "code":"257" + }, + { + "desc":"The t1 table is defined as follows:Assume that the distribution column of the result set provided by the agg lower-layer operator is setA, and the group by column of the ", + "product_code":"dws", + "title":"Case: Adjusting the GUC Parameter best_agg_plan", + "uri":"dws_04_0485.html", + "doc_type":"devg", + "p_code":"247", + "code":"258" + }, + { + "desc":"This SQL performance is poor. SubPlan exists in the execution plan as follows:The core of this optimization is to eliminate subqueries. Based on the service scenario anal", + "product_code":"dws", + "title":"Case: Rewriting SQL and Deleting Subqueries (Case 1)", + "uri":"dws_04_0486.html", + "doc_type":"devg", + "p_code":"247", + "code":"259" + }, + { + "desc":"On a site, the customer gave the feedback saying that the execution time of the following SQL statements lasted over one day and did not end:The corresponding execution p", + "product_code":"dws", + "title":"Case: Rewriting SQL and Deleting Subqueries (Case 2)", + "uri":"dws_04_0487.html", + "doc_type":"devg", + "p_code":"247", + "code":"260" + }, + { + "desc":"In a test at a site, ddw_f10_op_cust_asset_mon is a partitioned table and the partition key is year_mth whose value is a combined string of month and year values.The foll", + "product_code":"dws", + "title":"Case: Rewriting SQL Statements and Eliminating Prune Interference", + "uri":"dws_04_0488.html", + "doc_type":"devg", + "p_code":"247", + "code":"261" + }, + { + "desc":"in-clause/any-clause is a common SQL statement constraint. Sometimes, the clause following in or any is a constant. For example:orSome special usages are as follows:Where", + "product_code":"dws", + "title":"Case: Rewriting SQL Statements and Deleting in-clause", + "uri":"dws_04_0489.html", + "doc_type":"devg", + "p_code":"247", + "code":"262" + }, + { + "desc":"You can add PARTIAL CLUSTER KEY(column_name[,...]) to the definition of a column-store table to set one or more columns of this table as partial cluster keys. In this way", + "product_code":"dws", + "title":"Case: Setting Partial Cluster Keys", + "uri":"dws_04_0490.html", + "doc_type":"devg", + "p_code":"247", + "code":"263" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"SQL Execution Troubleshooting", + "uri":"dws_04_0491.html", + "doc_type":"devg", + "p_code":"199", + "code":"264" + }, + { + "desc":"A query task that used to take a few milliseconds to complete is now requiring several seconds, and that used to take several seconds is now requiring even half an hour. ", + "product_code":"dws", + "title":"Low Query Efficiency", + "uri":"dws_04_0492.html", + "doc_type":"devg", + "p_code":"264", + "code":"265" + }, + { + "desc":"DROP TABLE fails to be executed in the following scenarios:A user runs the \\dt+ command using gsql and finds that the table_name table does not exist. When the user runs ", + "product_code":"dws", + "title":"DROP TABLE Fails to Be Executed", + "uri":"dws_04_0494.html", + "doc_type":"devg", + "p_code":"264", + "code":"266" + }, + { + "desc":"Two users log in to the same database human_resource and run the select count(*) from areas statement separately to query the areas table, but obtain different results.Ch", + "product_code":"dws", + "title":"Different Data Is Displayed for the Same Table Queried By Multiple Users", + "uri":"dws_04_0495.html", + "doc_type":"devg", + "p_code":"264", + "code":"267" + }, + { + "desc":"The following error is reported during the integer conversion:Some data types cannot be converted to the target data type.Gradually narrow down the range of SQL statement", + "product_code":"dws", + "title":"An Error Occurs During the Integer Conversion", + "uri":"dws_04_0496.html", + "doc_type":"devg", + "p_code":"264", + "code":"268" + }, + { + "desc":"With automatic retry (referred to as CN retry), GaussDB(DWS) retries an SQL statement when the execution of this statement fails. If an SQL statement sent from the gsql c", + "product_code":"dws", + "title":"Automatic Retry upon SQL Statement Execution Errors", + "uri":"dws_04_0497.html", + "doc_type":"devg", + "p_code":"264", + "code":"269" + }, + { + "desc":"To improve the cluster performance, you can use multiple methods to optimize the database, including hardware configuration, software driver upgrade, and internal paramet", + "product_code":"dws", + "title":"Common Performance Parameter Optimization Design", + "uri":"dws_04_0970.html", + "doc_type":"devg", + "p_code":"199", + "code":"270" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"User-Defined Functions", + "uri":"dws_04_0507.html", + "doc_type":"devg", + "p_code":"1", + "code":"271" + }, + { + "desc":"With the GaussDB(DWS) PL/Java functions, you can choose your favorite Java IDE to write Java methods and install the JAR files containing these methods into the GaussDB(D", + "product_code":"dws", + "title":"PL/Java Functions", + "uri":"dws_04_0509.html", + "doc_type":"devg", + "p_code":"271", + "code":"272" + }, + { + "desc":"PL/pgSQL is similar to PL/SQL of Oracle. It is a loadable procedural language.The functions created using PL/pgSQL can be used in any place where you can use built-in fun", + "product_code":"dws", + "title":"PL/pgSQL Functions", + "uri":"dws_04_0511.html", + "doc_type":"devg", + "p_code":"271", + "code":"273" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Stored Procedures", + "uri":"dws_04_0512.html", + "doc_type":"devg", + "p_code":"1", + "code":"274" + }, + { + "desc":"In GaussDB(DWS), business rules and logics are saved as stored procedures.A stored procedure is a combination of SQL, PL/SQL, and Java statements, enabling business rule ", + "product_code":"dws", + "title":"Stored Procedure", + "uri":"dws_04_0513.html", + "doc_type":"devg", + "p_code":"274", + "code":"275" + }, + { + "desc":"A data type refers to a value set and an operation set defined on the value set. A GaussDB(DWS) database consists of tables, each of which is defined by its own columns. ", + "product_code":"dws", + "title":"Data Types", + "uri":"dws_04_0514.html", + "doc_type":"devg", + "p_code":"274", + "code":"276" + }, + { + "desc":"Certain data types in the database support implicit data type conversions, such as assignments and parameters invoked by functions. For other data types, you can use the ", + "product_code":"dws", + "title":"Data Type Conversion", + "uri":"dws_04_0515.html", + "doc_type":"devg", + "p_code":"274", + "code":"277" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Arrays and Records", + "uri":"dws_04_0516.html", + "doc_type":"devg", + "p_code":"274", + "code":"278" + }, + { + "desc":"Before the use of arrays, an array type needs to be defined:Define an array type immediately after the AS keyword in a stored procedure. Run the following statement:TYPE ", + "product_code":"dws", + "title":"Arrays", + "uri":"dws_04_0517.html", + "doc_type":"devg", + "p_code":"278", + "code":"279" + }, + { + "desc":"Perform the following operations to create a record variable:Define a record type and use this type to declare a variable.For the syntax of the record type, see Figure 1.", + "product_code":"dws", + "title":"record", + "uri":"dws_04_0518.html", + "doc_type":"devg", + "p_code":"278", + "code":"280" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Syntax", + "uri":"dws_04_0519.html", + "doc_type":"devg", + "p_code":"274", + "code":"281" + }, + { + "desc":"A PL/SQL block can contain a sub-block which can be placed in any section. The following describes the architecture of a PL/SQL block:DECLARE: declares variables, types, ", + "product_code":"dws", + "title":"Basic Structure", + "uri":"dws_04_0520.html", + "doc_type":"devg", + "p_code":"281", + "code":"282" + }, + { + "desc":"An anonymous block applies to a script infrequently executed or a one-off activity. An anonymous block is executed in a session and is not stored.Figure 1 shows the synta", + "product_code":"dws", + "title":"Anonymous Block", + "uri":"dws_04_0521.html", + "doc_type":"devg", + "p_code":"281", + "code":"283" + }, + { + "desc":"A subprogram stores stored procedures, functions, operators, and advanced packages. A subprogram created in a database can be called by other programs.", + "product_code":"dws", + "title":"Subprogram", + "uri":"dws_04_0522.html", + "doc_type":"devg", + "p_code":"281", + "code":"284" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Basic Statements", + "uri":"dws_04_0523.html", + "doc_type":"devg", + "p_code":"274", + "code":"285" + }, + { + "desc":"This section describes the declaration of variables in the PL/SQL and the scope of this variable in codes.For details about the variable declaration syntax, see Figure 1.", + "product_code":"dws", + "title":"Variable Definition Statement", + "uri":"dws_04_0524.html", + "doc_type":"devg", + "p_code":"285", + "code":"286" + }, + { + "desc":"Figure 1 shows the syntax diagram for assigning a value to a variable.The above syntax diagram is explained as follows:variable_name indicates the name of a variable.valu", + "product_code":"dws", + "title":"Assignment Statement", + "uri":"dws_04_0525.html", + "doc_type":"devg", + "p_code":"285", + "code":"287" + }, + { + "desc":"Figure 1 shows the syntax diagram for calling a clause.The above syntax diagram is explained as follows:procedure_name specifies the name of a stored procedure.parameter ", + "product_code":"dws", + "title":"Call Statement", + "uri":"dws_04_0526.html", + "doc_type":"devg", + "p_code":"285", + "code":"288" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Dynamic Statements", + "uri":"dws_04_0527.html", + "doc_type":"devg", + "p_code":"274", + "code":"289" + }, + { + "desc":"You can perform dynamic queries using EXECUTE IMMEDIATE or OPEN FOR in GaussDB(DWS). EXECUTE IMMEDIATE dynamically executes SELECT statements and OPEN FOR combines use of", + "product_code":"dws", + "title":"Executing Dynamic Query Statements", + "uri":"dws_04_0528.html", + "doc_type":"devg", + "p_code":"289", + "code":"290" + }, + { + "desc":"Figure 1 shows the syntax diagram.Figure 2 shows the syntax diagram for using_clause.The above syntax diagram is explained as follows:USING IN bind_argument is used to sp", + "product_code":"dws", + "title":"Executing Dynamic Non-query Statements", + "uri":"dws_04_0529.html", + "doc_type":"devg", + "p_code":"289", + "code":"291" + }, + { + "desc":"This section describes how to dynamically call store procedures. You must use anonymous statement blocks to package stored procedures or statement blocks and append IN an", + "product_code":"dws", + "title":"Dynamically Calling Stored Procedures", + "uri":"dws_04_0530.html", + "doc_type":"devg", + "p_code":"289", + "code":"292" + }, + { + "desc":"This section describes how to execute anonymous blocks in dynamic statements. Append IN and OUT behind the EXECUTE IMMEDIATE...USING statement to input and output paramet", + "product_code":"dws", + "title":"Dynamically Calling Anonymous Blocks", + "uri":"dws_04_0531.html", + "doc_type":"devg", + "p_code":"289", + "code":"293" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Control Statements", + "uri":"dws_04_0532.html", + "doc_type":"devg", + "p_code":"274", + "code":"294" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"RETURN Statements", + "uri":"dws_04_0533.html", + "doc_type":"devg", + "p_code":"294", + "code":"295" + }, + { + "desc":"Figure 1 shows the syntax diagram for a return statement.The syntax details are as follows:This statement returns control from a stored procedure or function to a caller.", + "product_code":"dws", + "title":"RETURN", + "uri":"dws_04_0534.html", + "doc_type":"devg", + "p_code":"295", + "code":"296" + }, + { + "desc":"When creating a function, specify SETOF datatype for the return values.return_next_clause::=return_query_clause::=The syntax details are as follows:If a function needs to", + "product_code":"dws", + "title":"RETURN NEXT and RETURN QUERY", + "uri":"dws_04_0535.html", + "doc_type":"devg", + "p_code":"295", + "code":"297" + }, + { + "desc":"Conditional statements are used to decide whether given conditions are met. Operations are executed based on the decisions made.GaussDB(DWS) supports five usages of IF:IF", + "product_code":"dws", + "title":"Conditional Statements", + "uri":"dws_04_0536.html", + "doc_type":"devg", + "p_code":"294", + "code":"298" + }, + { + "desc":"The syntax diagram is as follows.Example:The loop must be exploited together with EXIT; otherwise, a dead loop occurs.The syntax diagram is as follows.If the conditional ", + "product_code":"dws", + "title":"Loop Statements", + "uri":"dws_04_0537.html", + "doc_type":"devg", + "p_code":"294", + "code":"299" + }, + { + "desc":"Figure 1 shows the syntax diagram.Figure 2 shows the syntax diagram for when_clause.Parameter description:case_expression: specifies the variable or expression.when_expre", + "product_code":"dws", + "title":"Branch Statements", + "uri":"dws_04_0538.html", + "doc_type":"devg", + "p_code":"294", + "code":"300" + }, + { + "desc":"In PL/SQL programs, NULL statements are used to indicate \"nothing should be done\", equal to placeholders. They grant meanings to some statements and improve program reada", + "product_code":"dws", + "title":"NULL Statements", + "uri":"dws_04_0539.html", + "doc_type":"devg", + "p_code":"294", + "code":"301" + }, + { + "desc":"By default, any error occurring in a PL/SQL function aborts execution of the function, and indeed of the surrounding transaction as well. You can trap errors and restore ", + "product_code":"dws", + "title":"Error Trapping Statements", + "uri":"dws_04_0540.html", + "doc_type":"devg", + "p_code":"294", + "code":"302" + }, + { + "desc":"The GOTO statement unconditionally transfers the control from the current statement to a labeled statement. The GOTO statement changes the execution logic. Therefore, use", + "product_code":"dws", + "title":"GOTO Statements", + "uri":"dws_04_0541.html", + "doc_type":"devg", + "p_code":"294", + "code":"303" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Other Statements", + "uri":"dws_04_0542.html", + "doc_type":"devg", + "p_code":"274", + "code":"304" + }, + { + "desc":"GaussDB(DWS) provides multiple lock modes to control concurrent accesses to table data. These modes are used when Multi-Version Concurrency Control (MVCC) cannot give exp", + "product_code":"dws", + "title":"Lock Operations", + "uri":"dws_04_0543.html", + "doc_type":"devg", + "p_code":"304", + "code":"305" + }, + { + "desc":"GaussDB(DWS) provides cursors as a data buffer for users to store execution results of SQL statements. Each cursor region has a name. Users can use SQL statements to obta", + "product_code":"dws", + "title":"Cursor Operations", + "uri":"dws_04_0544.html", + "doc_type":"devg", + "p_code":"304", + "code":"306" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Cursors", + "uri":"dws_04_0545.html", + "doc_type":"devg", + "p_code":"274", + "code":"307" + }, + { + "desc":"To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers to context areas. With curs", + "product_code":"dws", + "title":"Overview", + "uri":"dws_04_0546.html", + "doc_type":"devg", + "p_code":"307", + "code":"308" + }, + { + "desc":"An explicit cursor is used to process query statements, particularly when the query results contain multiple records.An explicit cursor performs the following six PL/SQL ", + "product_code":"dws", + "title":"Explicit Cursor", + "uri":"dws_04_0547.html", + "doc_type":"devg", + "p_code":"307", + "code":"309" + }, + { + "desc":"The system automatically sets implicit cursors for non-query statements, such as ALTER and DROP, and creates work areas for these statements. These implicit cursors are n", + "product_code":"dws", + "title":"Implicit Cursor", + "uri":"dws_04_0548.html", + "doc_type":"devg", + "p_code":"307", + "code":"310" + }, + { + "desc":"The use of cursors in WHILE and LOOP statements is called a cursor loop. Generally, OPEN, FETCH, and CLOSE statements are needed in cursor loop. The following describes a", + "product_code":"dws", + "title":"Cursor Loop", + "uri":"dws_04_0549.html", + "doc_type":"devg", + "p_code":"307", + "code":"311" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Advanced Packages", + "uri":"dws_04_0550.html", + "doc_type":"devg", + "p_code":"274", + "code":"312" + }, + { + "desc":"Table 1 provides all interfaces supported by the DBMS_LOB package.DBMS_LOB.GETLENGTHSpecifies the length of a LOB type object obtained and returned by the stored procedur", + "product_code":"dws", + "title":"DBMS_LOB", + "uri":"dws_04_0551.html", + "doc_type":"devg", + "p_code":"312", + "code":"313" + }, + { + "desc":"Table 1 provides all interfaces supported by the DBMS_RANDOM package.DBMS_RANDOM.SEEDThe stored procedure SEED is used to set a seed for a random number. The DBMS_RANDOM.", + "product_code":"dws", + "title":"DBMS_RANDOM", + "uri":"dws_04_0552.html", + "doc_type":"devg", + "p_code":"312", + "code":"314" + }, + { + "desc":"Table 1 provides all interfaces supported by the DBMS_OUTPUT package.DBMS_OUTPUT.PUT_LINEThe PUT_LINE procedure writes a row of text carrying a line end symbol in the buf", + "product_code":"dws", + "title":"DBMS_OUTPUT", + "uri":"dws_04_0553.html", + "doc_type":"devg", + "p_code":"312", + "code":"315" + }, + { + "desc":"Table 1 provides all interfaces supported by the UTL_RAW package.The external representation of the RAW type data is hexadecimal and its internal storage form is binary. ", + "product_code":"dws", + "title":"UTL_RAW", + "uri":"dws_04_0554.html", + "doc_type":"devg", + "p_code":"312", + "code":"316" + }, + { + "desc":"Table 1 lists all interfaces supported by the DBMS_JOB package.DBMS_JOB.SUBMITThe stored procedure SUBMIT submits a job provided by the system.A prototype of the DBMS_JOB", + "product_code":"dws", + "title":"DBMS_JOB", + "uri":"dws_04_0555.html", + "doc_type":"devg", + "p_code":"312", + "code":"317" + }, + { + "desc":"Table 1 lists interfaces supported by the DBMS_SQL package.You are advised to use dbms_sql.define_column and dbms_sql.column_value to define columns.If the size of the re", + "product_code":"dws", + "title":"DBMS_SQL", + "uri":"dws_04_0556.html", + "doc_type":"devg", + "p_code":"312", + "code":"318" + }, + { + "desc":"RAISE has the following five syntax formats:Parameter description:The level option is used to specify the error level, that is, DEBUG, LOG, INFO, NOTICE, WARNING, or EXCE", + "product_code":"dws", + "title":"Debugging", + "uri":"dws_04_0558.html", + "doc_type":"devg", + "p_code":"274", + "code":"319" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"System Catalogs and System Views", + "uri":"dws_04_0559.html", + "doc_type":"devg", + "p_code":"1", + "code":"320" + }, + { + "desc":"System catalogs are used by GaussDB(DWS) to store structure metadata. They are a core component the GaussDB(DWS) database system and provide control information for the d", + "product_code":"dws", + "title":"Overview of System Catalogs and System Views", + "uri":"dws_04_0560.html", + "doc_type":"devg", + "p_code":"320", + "code":"321" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"System Catalogs", + "uri":"dws_04_0561.html", + "doc_type":"devg", + "p_code":"320", + "code":"322" + }, + { + "desc":"GS_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table", + "product_code":"dws", + "title":"GS_OBSSCANINFO", + "uri":"dws_04_0562.html", + "doc_type":"devg", + "p_code":"322", + "code":"323" + }, + { + "desc":"The GS_WLM_INSTANCE_HISTORY system catalog stores information about resource usage related to CN or DN instances. Each record in the system table indicates the resource u", + "product_code":"dws", + "title":"GS_WLM_INSTANCE_HISTORY", + "uri":"dws_04_0564.html", + "doc_type":"devg", + "p_code":"322", + "code":"324" + }, + { + "desc":"GS_WLM_OPERATOR_INFO records operators of completed jobs. The data is dumped from the kernel to a system catalog.This system catalog's schema is dbms_om.This system catal", + "product_code":"dws", + "title":"GS_WLM_OPERATOR_INFO", + "uri":"dws_04_0565.html", + "doc_type":"devg", + "p_code":"322", + "code":"325" + }, + { + "desc":"GS_WLM_SESSION_INFO records load management information about a completed job executed on all CNs. The data is dumped from the kernel to a system catalog.This system cata", + "product_code":"dws", + "title":"GS_WLM_SESSION_INFO", + "uri":"dws_04_0566.html", + "doc_type":"devg", + "p_code":"322", + "code":"326" + }, + { + "desc":"The GS_WLM_USER_RESOURCE_HISTORY system table stores information about resources used by users and is valid only on CNs. Each record in the system table indicates the res", + "product_code":"dws", + "title":"GS_WLM_USER_RESOURCE_HISTORY", + "uri":"dws_04_0567.html", + "doc_type":"devg", + "p_code":"322", + "code":"327" + }, + { + "desc":"pg_aggregate records information about aggregation functions. Each entry in pg_aggregate is an extension of an entry in pg_proc. The pg_proc entry carries the aggregate's", + "product_code":"dws", + "title":"PG_AGGREGATE", + "uri":"dws_04_0568.html", + "doc_type":"devg", + "p_code":"322", + "code":"328" + }, + { + "desc":"PG_AM records information about index access methods. There is one row for each index access method supported by the system.", + "product_code":"dws", + "title":"PG_AM", + "uri":"dws_04_0569.html", + "doc_type":"devg", + "p_code":"322", + "code":"329" + }, + { + "desc":"PG_AMOP records information about operators associated with access method operator families. There is one row for each operator that is a member of an operator family. A ", + "product_code":"dws", + "title":"PG_AMOP", + "uri":"dws_04_0570.html", + "doc_type":"devg", + "p_code":"322", + "code":"330" + }, + { + "desc":"PG_AMPROC records information about the support procedures associated with the access method operator families. There is one row for each support procedure belonging to a", + "product_code":"dws", + "title":"PG_AMPROC", + "uri":"dws_04_0571.html", + "doc_type":"devg", + "p_code":"322", + "code":"331" + }, + { + "desc":"PG_ATTRDEF stores default values of columns.", + "product_code":"dws", + "title":"PG_ATTRDEF", + "uri":"dws_04_0572.html", + "doc_type":"devg", + "p_code":"322", + "code":"332" + }, + { + "desc":"PG_ATTRIBUTE records information about table columns.", + "product_code":"dws", + "title":"PG_ATTRIBUTE", + "uri":"dws_04_0573.html", + "doc_type":"devg", + "p_code":"322", + "code":"333" + }, + { + "desc":"PG_AUTHID records information about the database authentication identifiers (roles). The concept of users is contained in that of roles. A user is actually a role whose r", + "product_code":"dws", + "title":"PG_AUTHID", + "uri":"dws_04_0574.html", + "doc_type":"devg", + "p_code":"322", + "code":"334" + }, + { + "desc":"PG_AUTH_HISTORY records the authentication history of the role. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"PG_AUTH_HISTORY", + "uri":"dws_04_0575.html", + "doc_type":"devg", + "p_code":"322", + "code":"335" + }, + { + "desc":"PG_AUTH_MEMBERS records the membership relations between roles.", + "product_code":"dws", + "title":"PG_AUTH_MEMBERS", + "uri":"dws_04_0576.html", + "doc_type":"devg", + "p_code":"322", + "code":"336" + }, + { + "desc":"PG_CAST records conversion relationships between data types.", + "product_code":"dws", + "title":"PG_CAST", + "uri":"dws_04_0577.html", + "doc_type":"devg", + "p_code":"322", + "code":"337" + }, + { + "desc":"PG_CLASS records database objects and their relations.View the OID and relfilenode of a table.Count row-store tables.Count column-store tables.", + "product_code":"dws", + "title":"PG_CLASS", + "uri":"dws_04_0578.html", + "doc_type":"devg", + "p_code":"322", + "code":"338" + }, + { + "desc":"PG_COLLATION records the available collations, which are essentially mappings from an SQL name to operating system locale categories.", + "product_code":"dws", + "title":"PG_COLLATION", + "uri":"dws_04_0579.html", + "doc_type":"devg", + "p_code":"322", + "code":"339" + }, + { + "desc":"PG_CONSTRAINT records check, primary key, unique, and foreign key constraints on the tables.consrc is not updated when referenced objects change; for example, it will not", + "product_code":"dws", + "title":"PG_CONSTRAINT", + "uri":"dws_04_0580.html", + "doc_type":"devg", + "p_code":"322", + "code":"340" + }, + { + "desc":"PG_CONVERSION records encoding conversion information.", + "product_code":"dws", + "title":"PG_CONVERSION", + "uri":"dws_04_0581.html", + "doc_type":"devg", + "p_code":"322", + "code":"341" + }, + { + "desc":"PG_DATABASE records information about the available databases.", + "product_code":"dws", + "title":"PG_DATABASE", + "uri":"dws_04_0582.html", + "doc_type":"devg", + "p_code":"322", + "code":"342" + }, + { + "desc":"PG_DB_ROLE_SETTING records the default values of configuration items bonded to each role and database when the database is running.", + "product_code":"dws", + "title":"PG_DB_ROLE_SETTING", + "uri":"dws_04_0583.html", + "doc_type":"devg", + "p_code":"322", + "code":"343" + }, + { + "desc":"PG_DEFAULT_ACL records the initial privileges assigned to the newly created objects.Run the following command to view the initial permissions of the new user role1:You ca", + "product_code":"dws", + "title":"PG_DEFAULT_ACL", + "uri":"dws_04_0584.html", + "doc_type":"devg", + "p_code":"322", + "code":"344" + }, + { + "desc":"PG_DEPEND records the dependency relationships between database objects. This information allows DROP commands to find which other objects must be dropped by DROP CASCADE", + "product_code":"dws", + "title":"PG_DEPEND", + "uri":"dws_04_0585.html", + "doc_type":"devg", + "p_code":"322", + "code":"345" + }, + { + "desc":"PG_DESCRIPTION records optional descriptions (comments) for each database object. Descriptions of many built-in system objects are provided in the initial contents of PG_", + "product_code":"dws", + "title":"PG_DESCRIPTION", + "uri":"dws_04_0586.html", + "doc_type":"devg", + "p_code":"322", + "code":"346" + }, + { + "desc":"PG_ENUM records entries showing the values and labels for each enum type. The internal representation of a given enum value is actually the OID of its associated row in p", + "product_code":"dws", + "title":"PG_ENUM", + "uri":"dws_04_0588.html", + "doc_type":"devg", + "p_code":"322", + "code":"347" + }, + { + "desc":"PG_EXTENSION records information about the installed extensions. By default, GaussDB(DWS) has 12 extensions, that is, PLPGSQL, DIST_FDW, FILE_FDW, HDFS_FDW, HSTORE, PLDBG", + "product_code":"dws", + "title":"PG_EXTENSION", + "uri":"dws_04_0589.html", + "doc_type":"devg", + "p_code":"322", + "code":"348" + }, + { + "desc":"PG_EXTENSION_DATA_SOURCE records information about external data source. An external data source contains information about an external database, such as its password enc", + "product_code":"dws", + "title":"PG_EXTENSION_DATA_SOURCE", + "uri":"dws_04_0590.html", + "doc_type":"devg", + "p_code":"322", + "code":"349" + }, + { + "desc":"PG_FOREIGN_DATA_WRAPPER records foreign-data wrapper definitions. A foreign-data wrapper is the mechanism by which external data, residing on foreign servers, is accessed", + "product_code":"dws", + "title":"PG_FOREIGN_DATA_WRAPPER", + "uri":"dws_04_0591.html", + "doc_type":"devg", + "p_code":"322", + "code":"350" + }, + { + "desc":"PG_FOREIGN_SERVER records the foreign server definitions. A foreign server describes a source of external data, such as a remote server. Foreign servers are accessed via ", + "product_code":"dws", + "title":"PG_FOREIGN_SERVER", + "uri":"dws_04_0592.html", + "doc_type":"devg", + "p_code":"322", + "code":"351" + }, + { + "desc":"PG_FOREIGN_TABLE records auxiliary information about foreign tables.", + "product_code":"dws", + "title":"PG_FOREIGN_TABLE", + "uri":"dws_04_0593.html", + "doc_type":"devg", + "p_code":"322", + "code":"352" + }, + { + "desc":"PG_INDEX records part of the information about indexes. The rest is mostly in PG_CLASS.", + "product_code":"dws", + "title":"PG_INDEX", + "uri":"dws_04_0594.html", + "doc_type":"devg", + "p_code":"322", + "code":"353" + }, + { + "desc":"PG_INHERITS records information about table inheritance hierarchies. There is one entry for each direct child table in the database. Indirect inheritance can be determine", + "product_code":"dws", + "title":"PG_INHERITS", + "uri":"dws_04_0595.html", + "doc_type":"devg", + "p_code":"322", + "code":"354" + }, + { + "desc":"PG_JOBS records detailed information about jobs created by users. Dedicated threads poll the pg_jobs table and trigger jobs based on scheduled job execution time. This ta", + "product_code":"dws", + "title":"PG_JOBS", + "uri":"dws_04_0596.html", + "doc_type":"devg", + "p_code":"322", + "code":"355" + }, + { + "desc":"PG_LANGUAGE records programming languages. You can use them and interfaces to write functions or stored procedures.", + "product_code":"dws", + "title":"PG_LANGUAGE", + "uri":"dws_04_0597.html", + "doc_type":"devg", + "p_code":"322", + "code":"356" + }, + { + "desc":"PG_LARGEOBJECT records the data making up large objects A large object is identified by an OID assigned when it is created. Each large object is broken into segments or \"", + "product_code":"dws", + "title":"PG_LARGEOBJECT", + "uri":"dws_04_0598.html", + "doc_type":"devg", + "p_code":"322", + "code":"357" + }, + { + "desc":"PG_LARGEOBJECT_METADATA records metadata associated with large objects. The actual large object data is stored in PG_LARGEOBJECT.", + "product_code":"dws", + "title":"PG_LARGEOBJECT_METADATA", + "uri":"dws_04_0599.html", + "doc_type":"devg", + "p_code":"322", + "code":"358" + }, + { + "desc":"PG_NAMESPACE records the namespaces, that is, schema-related information.", + "product_code":"dws", + "title":"PG_NAMESPACE", + "uri":"dws_04_0600.html", + "doc_type":"devg", + "p_code":"322", + "code":"359" + }, + { + "desc":"PG_OBJECT records the user creation, creation time, last modification time, and last analyzing time of objects of specified types (types existing in object_type).Only nor", + "product_code":"dws", + "title":"PG_OBJECT", + "uri":"dws_04_0601.html", + "doc_type":"devg", + "p_code":"322", + "code":"360" + }, + { + "desc":"PG_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table", + "product_code":"dws", + "title":"PG_OBSSCANINFO", + "uri":"dws_04_0602.html", + "doc_type":"devg", + "p_code":"322", + "code":"361" + }, + { + "desc":"PG_OPCLASS defines index access method operator classes.Each operator class defines semantics for index columns of a particular data type and a particular index access me", + "product_code":"dws", + "title":"PG_OPCLASS", + "uri":"dws_04_0603.html", + "doc_type":"devg", + "p_code":"322", + "code":"362" + }, + { + "desc":"PG_OPERATOR records information about operators.", + "product_code":"dws", + "title":"PG_OPERATOR", + "uri":"dws_04_0604.html", + "doc_type":"devg", + "p_code":"322", + "code":"363" + }, + { + "desc":"PG_OPFAMILY defines operator families.Each operator family is a collection of operators and associated support routines that implement the semantics specified for a parti", + "product_code":"dws", + "title":"PG_OPFAMILY", + "uri":"dws_04_0605.html", + "doc_type":"devg", + "p_code":"322", + "code":"364" + }, + { + "desc":"PG_PARTITION records all partitioned tables, table partitions, toast tables on table partitions, and index partitions in the database. Partitioned index information is no", + "product_code":"dws", + "title":"PG_PARTITION", + "uri":"dws_04_0606.html", + "doc_type":"devg", + "p_code":"322", + "code":"365" + }, + { + "desc":"PG_PLTEMPLATE records template information for procedural languages.", + "product_code":"dws", + "title":"PG_PLTEMPLATE", + "uri":"dws_04_0607.html", + "doc_type":"devg", + "p_code":"322", + "code":"366" + }, + { + "desc":"PG_PROC records information about functions or procedures.Query the OID of a specified function. For example, obtain the OID 1295 of the justify_days function.Query wheth", + "product_code":"dws", + "title":"PG_PROC", + "uri":"dws_04_0608.html", + "doc_type":"devg", + "p_code":"322", + "code":"367" + }, + { + "desc":"PG_RANGE records information about range types.This is in addition to the types' entries in PG_TYPE.rngsubopc (plus rngcollation, if the element type is collatable) deter", + "product_code":"dws", + "title":"PG_RANGE", + "uri":"dws_04_0609.html", + "doc_type":"devg", + "p_code":"322", + "code":"368" + }, + { + "desc":"PG_REDACTION_COLUMN records the information about the redacted columns.", + "product_code":"dws", + "title":"PG_REDACTION_COLUMN", + "uri":"dws_04_0610.html", + "doc_type":"devg", + "p_code":"322", + "code":"369" + }, + { + "desc":"PG_REDACTION_POLICY records information about the object to be redacted.", + "product_code":"dws", + "title":"PG_REDACTION_POLICY", + "uri":"dws_04_0611.html", + "doc_type":"devg", + "p_code":"322", + "code":"370" + }, + { + "desc":"PG_RLSPOLICY displays the information about row-level access control policies.", + "product_code":"dws", + "title":"PG_RLSPOLICY", + "uri":"dws_04_0612.html", + "doc_type":"devg", + "p_code":"322", + "code":"371" + }, + { + "desc":"PG_RESOURCE_POOL records the information about database resource pool.", + "product_code":"dws", + "title":"PG_RESOURCE_POOL", + "uri":"dws_04_0613.html", + "doc_type":"devg", + "p_code":"322", + "code":"372" + }, + { + "desc":"PG_REWRITE records rewrite rules defined for tables and views.", + "product_code":"dws", + "title":"PG_REWRITE", + "uri":"dws_04_0614.html", + "doc_type":"devg", + "p_code":"322", + "code":"373" + }, + { + "desc":"PG_SECLABEL records security labels on database objects.See also PG_SHSECLABEL, which performs a similar function for security labels of database objects that are shared ", + "product_code":"dws", + "title":"PG_SECLABEL", + "uri":"dws_04_0615.html", + "doc_type":"devg", + "p_code":"322", + "code":"374" + }, + { + "desc":"PG_SHDEPEND records the dependency relationships between database objects and shared objects, such as roles. This information allows GaussDB(DWS) to ensure that those obj", + "product_code":"dws", + "title":"PG_SHDEPEND", + "uri":"dws_04_0616.html", + "doc_type":"devg", + "p_code":"322", + "code":"375" + }, + { + "desc":"PG_SHDESCRIPTION records optional comments for shared database objects. Descriptions can be manipulated with the COMMENT command and viewed with psql's \\d commands.See al", + "product_code":"dws", + "title":"PG_SHDESCRIPTION", + "uri":"dws_04_0617.html", + "doc_type":"devg", + "p_code":"322", + "code":"376" + }, + { + "desc":"PG_SHSECLABEL records security labels on shared database objects. Security labels can be manipulated with the SECURITY LABEL command.For an easier way to view security la", + "product_code":"dws", + "title":"PG_SHSECLABEL", + "uri":"dws_04_0618.html", + "doc_type":"devg", + "p_code":"322", + "code":"377" + }, + { + "desc":"PG_STATISTIC records statistics about tables and index columns in a database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"PG_STATISTIC", + "uri":"dws_04_0619.html", + "doc_type":"devg", + "p_code":"322", + "code":"378" + }, + { + "desc":"PG_STATISTIC_EXT records the extended statistics of tables in a database, such as statistics of multiple columns. Statistics of expressions will be supported later. You c", + "product_code":"dws", + "title":"PG_STATISTIC_EXT", + "uri":"dws_04_0620.html", + "doc_type":"devg", + "p_code":"322", + "code":"379" + }, + { + "desc":"PG_SYNONYM records the mapping between synonym object names and other database object names.", + "product_code":"dws", + "title":"PG_SYNONYM", + "uri":"dws_04_0621.html", + "doc_type":"devg", + "p_code":"322", + "code":"380" + }, + { + "desc":"PG_TABLESPACE records tablespace information.", + "product_code":"dws", + "title":"PG_TABLESPACE", + "uri":"dws_04_0622.html", + "doc_type":"devg", + "p_code":"322", + "code":"381" + }, + { + "desc":"PG_TRIGGER records the trigger information.", + "product_code":"dws", + "title":"PG_TRIGGER", + "uri":"dws_04_0623.html", + "doc_type":"devg", + "p_code":"322", + "code":"382" + }, + { + "desc":"PG_TS_CONFIG records entries representing text search configurations. A configuration specifies a particular text search parser and a list of dictionaries to use for each", + "product_code":"dws", + "title":"PG_TS_CONFIG", + "uri":"dws_04_0624.html", + "doc_type":"devg", + "p_code":"322", + "code":"383" + }, + { + "desc":"PG_TS_CONFIG_MAP records entries showing which text search dictionaries should be consulted, and in what order, for each output token type of each text search configurati", + "product_code":"dws", + "title":"PG_TS_CONFIG_MAP", + "uri":"dws_04_0625.html", + "doc_type":"devg", + "p_code":"322", + "code":"384" + }, + { + "desc":"PG_TS_DICT records entries that define text search dictionaries. A dictionary depends on a text search template, which specifies all the implementation functions needed. ", + "product_code":"dws", + "title":"PG_TS_DICT", + "uri":"dws_04_0626.html", + "doc_type":"devg", + "p_code":"322", + "code":"385" + }, + { + "desc":"PG_TS_PARSER records entries defining text search parsers. A parser splits input text into lexemes and assigns a token type to each lexeme. Since a parser must be impleme", + "product_code":"dws", + "title":"PG_TS_PARSER", + "uri":"dws_04_0627.html", + "doc_type":"devg", + "p_code":"322", + "code":"386" + }, + { + "desc":"PG_TS_TEMPLATE records entries defining text search templates. A template provides a framework for text search dictionaries. Since a template must be implemented by C fun", + "product_code":"dws", + "title":"PG_TS_TEMPLATE", + "uri":"dws_04_0628.html", + "doc_type":"devg", + "p_code":"322", + "code":"387" + }, + { + "desc":"PG_TYPE records the information about data types.", + "product_code":"dws", + "title":"PG_TYPE", + "uri":"dws_04_0629.html", + "doc_type":"devg", + "p_code":"322", + "code":"388" + }, + { + "desc":"PG_USER_MAPPING records the mappings from local users to remote.It is accessible only to users with system administrator rights. You can use view PG_USER_MAPPINGS to quer", + "product_code":"dws", + "title":"PG_USER_MAPPING", + "uri":"dws_04_0630.html", + "doc_type":"devg", + "p_code":"322", + "code":"389" + }, + { + "desc":"PG_USER_STATUS records the states of users that access to the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"PG_USER_STATUS", + "uri":"dws_04_0631.html", + "doc_type":"devg", + "p_code":"322", + "code":"390" + }, + { + "desc":"PG_WORKLOAD_ACTION records information about query_band.", + "product_code":"dws", + "title":"PG_WORKLOAD_ACTION", + "uri":"dws_04_0632.html", + "doc_type":"devg", + "p_code":"322", + "code":"391" + }, + { + "desc":"PGXC_CLASS records the replicated or distributed information for each table.", + "product_code":"dws", + "title":"PGXC_CLASS", + "uri":"dws_04_0633.html", + "doc_type":"devg", + "p_code":"322", + "code":"392" + }, + { + "desc":"PGXC_GROUP records information about node groups.", + "product_code":"dws", + "title":"PGXC_GROUP", + "uri":"dws_04_0634.html", + "doc_type":"devg", + "p_code":"322", + "code":"393" + }, + { + "desc":"PGXC_NODE records information about cluster nodes.Query the CN and DN information of the cluster:", + "product_code":"dws", + "title":"PGXC_NODE", + "uri":"dws_04_0635.html", + "doc_type":"devg", + "p_code":"322", + "code":"394" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"System Views", + "uri":"dws_04_0639.html", + "doc_type":"devg", + "p_code":"320", + "code":"395" + }, + { + "desc":"ALL_ALL_TABLES displays the tables or views accessible to the current user.", + "product_code":"dws", + "title":"ALL_ALL_TABLES", + "uri":"dws_04_0640.html", + "doc_type":"devg", + "p_code":"395", + "code":"396" + }, + { + "desc":"ALL_CONSTRAINTS displays information about constraints accessible to the current user.", + "product_code":"dws", + "title":"ALL_CONSTRAINTS", + "uri":"dws_04_0641.html", + "doc_type":"devg", + "p_code":"395", + "code":"397" + }, + { + "desc":"ALL_CONS_COLUMNS displays information about constraint columns accessible to the current user.", + "product_code":"dws", + "title":"ALL_CONS_COLUMNS", + "uri":"dws_04_0642.html", + "doc_type":"devg", + "p_code":"395", + "code":"398" + }, + { + "desc":"ALL_COL_COMMENTS displays the comment information about table columns accessible to the current user.", + "product_code":"dws", + "title":"ALL_COL_COMMENTS", + "uri":"dws_04_0643.html", + "doc_type":"devg", + "p_code":"395", + "code":"399" + }, + { + "desc":"ALL_DEPENDENCIES displays dependencies between functions and advanced packages accessible to the current user.Currently in GaussDB(DWS), this table is empty without any r", + "product_code":"dws", + "title":"ALL_DEPENDENCIES", + "uri":"dws_04_0644.html", + "doc_type":"devg", + "p_code":"395", + "code":"400" + }, + { + "desc":"ALL_IND_COLUMNS displays all index columns accessible to the current user.", + "product_code":"dws", + "title":"ALL_IND_COLUMNS", + "uri":"dws_04_0645.html", + "doc_type":"devg", + "p_code":"395", + "code":"401" + }, + { + "desc":"ALL_IND_EXPRESSIONS displays information about the expression indexes accessible to the current user.", + "product_code":"dws", + "title":"ALL_IND_EXPRESSIONS", + "uri":"dws_04_0646.html", + "doc_type":"devg", + "p_code":"395", + "code":"402" + }, + { + "desc":"ALL_INDEXES displays information about indexes accessible to the current user.", + "product_code":"dws", + "title":"ALL_INDEXES", + "uri":"dws_04_0647.html", + "doc_type":"devg", + "p_code":"395", + "code":"403" + }, + { + "desc":"ALL_OBJECTS displays all database objects accessible to the current user.For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.", + "product_code":"dws", + "title":"ALL_OBJECTS", + "uri":"dws_04_0648.html", + "doc_type":"devg", + "p_code":"395", + "code":"404" + }, + { + "desc":"ALL_PROCEDURES displays information about all stored procedures or functions accessible to the current user.", + "product_code":"dws", + "title":"ALL_PROCEDURES", + "uri":"dws_04_0649.html", + "doc_type":"devg", + "p_code":"395", + "code":"405" + }, + { + "desc":"ALL_SEQUENCES displays all sequences accessible to the current user.", + "product_code":"dws", + "title":"ALL_SEQUENCES", + "uri":"dws_04_0650.html", + "doc_type":"devg", + "p_code":"395", + "code":"406" + }, + { + "desc":"ALL_SOURCE displays information about stored procedures or functions accessible to the current user, and provides the columns defined by the stored procedures and functio", + "product_code":"dws", + "title":"ALL_SOURCE", + "uri":"dws_04_0651.html", + "doc_type":"devg", + "p_code":"395", + "code":"407" + }, + { + "desc":"ALL_SYNONYMS displays all synonyms accessible to the current user.", + "product_code":"dws", + "title":"ALL_SYNONYMS", + "uri":"dws_04_0652.html", + "doc_type":"devg", + "p_code":"395", + "code":"408" + }, + { + "desc":"ALL_TAB_COLUMNS displays description information about columns of the tables accessible to the current user.", + "product_code":"dws", + "title":"ALL_TAB_COLUMNS", + "uri":"dws_04_0653.html", + "doc_type":"devg", + "p_code":"395", + "code":"409" + }, + { + "desc":"ALL_TAB_COMMENTS displays comments about all tables and views accessible to the current user.", + "product_code":"dws", + "title":"ALL_TAB_COMMENTS", + "uri":"dws_04_0654.html", + "doc_type":"devg", + "p_code":"395", + "code":"410" + }, + { + "desc":"ALL_TABLES displays all the tables accessible to the current user.", + "product_code":"dws", + "title":"ALL_TABLES", + "uri":"dws_04_0655.html", + "doc_type":"devg", + "p_code":"395", + "code":"411" + }, + { + "desc":"ALL_USERS displays all users of the database visible to the current user, however, it does not describe the users.", + "product_code":"dws", + "title":"ALL_USERS", + "uri":"dws_04_0656.html", + "doc_type":"devg", + "p_code":"395", + "code":"412" + }, + { + "desc":"ALL_VIEWS displays the description about all views accessible to the current user.", + "product_code":"dws", + "title":"ALL_VIEWS", + "uri":"dws_04_0657.html", + "doc_type":"devg", + "p_code":"395", + "code":"413" + }, + { + "desc":"DBA_DATA_FILES displays the description of database files. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_DATA_FILES", + "uri":"dws_04_0658.html", + "doc_type":"devg", + "p_code":"395", + "code":"414" + }, + { + "desc":"DBA_USERS displays all user names in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_USERS", + "uri":"dws_04_0659.html", + "doc_type":"devg", + "p_code":"395", + "code":"415" + }, + { + "desc":"DBA_COL_COMMENTS displays information about table colum comments in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_COL_COMMENTS", + "uri":"dws_04_0660.html", + "doc_type":"devg", + "p_code":"395", + "code":"416" + }, + { + "desc":"DBA_CONSTRAINTS displays information about table constraints in database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_CONSTRAINTS", + "uri":"dws_04_0661.html", + "doc_type":"devg", + "p_code":"395", + "code":"417" + }, + { + "desc":"DBA_CONS_COLUMNS displays information about constraint columns in database tables. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_CONS_COLUMNS", + "uri":"dws_04_0662.html", + "doc_type":"devg", + "p_code":"395", + "code":"418" + }, + { + "desc":"DBA_IND_COLUMNS displays column information about all indexes in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_IND_COLUMNS", + "uri":"dws_04_0663.html", + "doc_type":"devg", + "p_code":"395", + "code":"419" + }, + { + "desc":"DBA_IND_EXPRESSIONS displays the information about expression indexes in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_IND_EXPRESSIONS", + "uri":"dws_04_0664.html", + "doc_type":"devg", + "p_code":"395", + "code":"420" + }, + { + "desc":"DBA_IND_PARTITIONS displays information about all index partitions in the database. Each index partition of a partitioned table in the database, if present, has a row of ", + "product_code":"dws", + "title":"DBA_IND_PARTITIONS", + "uri":"dws_04_0665.html", + "doc_type":"devg", + "p_code":"395", + "code":"421" + }, + { + "desc":"DBA_INDEXES displays all indexes in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_INDEXES", + "uri":"dws_04_0666.html", + "doc_type":"devg", + "p_code":"395", + "code":"422" + }, + { + "desc":"DBA_OBJECTS displays all database objects in the database. It is accessible only to users with system administrator rights.For details about the value ranges of last_ddl_", + "product_code":"dws", + "title":"DBA_OBJECTS", + "uri":"dws_04_0667.html", + "doc_type":"devg", + "p_code":"395", + "code":"423" + }, + { + "desc":"DBA_PART_INDEXES displays information about all partitioned table indexes in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_PART_INDEXES", + "uri":"dws_04_0668.html", + "doc_type":"devg", + "p_code":"395", + "code":"424" + }, + { + "desc":"DBA_PART_TABLES displays information about all partitioned tables in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_PART_TABLES", + "uri":"dws_04_0669.html", + "doc_type":"devg", + "p_code":"395", + "code":"425" + }, + { + "desc":"DBA_PROCEDURES displays information about all stored procedures and functions in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_PROCEDURES", + "uri":"dws_04_0670.html", + "doc_type":"devg", + "p_code":"395", + "code":"426" + }, + { + "desc":"DBA_SEQUENCES displays information about all sequences in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_SEQUENCES", + "uri":"dws_04_0671.html", + "doc_type":"devg", + "p_code":"395", + "code":"427" + }, + { + "desc":"DBA_SOURCE displays all stored procedures or functions in the database, and it provides the columns defined by the stored procedures or functions. It is accessible only t", + "product_code":"dws", + "title":"DBA_SOURCE", + "uri":"dws_04_0672.html", + "doc_type":"devg", + "p_code":"395", + "code":"428" + }, + { + "desc":"DBA_SYNONYMS displays all synonyms in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_SYNONYMS", + "uri":"dws_04_0673.html", + "doc_type":"devg", + "p_code":"395", + "code":"429" + }, + { + "desc":"DBA_TAB_COLUMNS displays the columns of tables. Each column of a table in the database has a row in DBA_TAB_COLUMNS. It is accessible only to users with system administra", + "product_code":"dws", + "title":"DBA_TAB_COLUMNS", + "uri":"dws_04_0674.html", + "doc_type":"devg", + "p_code":"395", + "code":"430" + }, + { + "desc":"DBA_TAB_COMMENTS displays comments about all tables and views in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_TAB_COMMENTS", + "uri":"dws_04_0675.html", + "doc_type":"devg", + "p_code":"395", + "code":"431" + }, + { + "desc":"DBA_TAB_PARTITIONS displays information about all partitions in the database.", + "product_code":"dws", + "title":"DBA_TAB_PARTITIONS", + "uri":"dws_04_0676.html", + "doc_type":"devg", + "p_code":"395", + "code":"432" + }, + { + "desc":"DBA_TABLES displays all tables in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_TABLES", + "uri":"dws_04_0677.html", + "doc_type":"devg", + "p_code":"395", + "code":"433" + }, + { + "desc":"DBA_TABLESPACES displays information about available tablespaces. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_TABLESPACES", + "uri":"dws_04_0678.html", + "doc_type":"devg", + "p_code":"395", + "code":"434" + }, + { + "desc":"DBA_TRIGGERS displays information about triggers in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_TRIGGERS", + "uri":"dws_04_0679.html", + "doc_type":"devg", + "p_code":"395", + "code":"435" + }, + { + "desc":"DBA_VIEWS displays views in the database. It is accessible only to users with system administrator rights.", + "product_code":"dws", + "title":"DBA_VIEWS", + "uri":"dws_04_0680.html", + "doc_type":"devg", + "p_code":"395", + "code":"436" + }, + { + "desc":"DUAL is automatically created by the database based on the data dictionary. It has only one text column in only one row for storing expression calculation results. It is ", + "product_code":"dws", + "title":"DUAL", + "uri":"dws_04_0681.html", + "doc_type":"devg", + "p_code":"395", + "code":"437" + }, + { + "desc":"GLOBAL_REDO_STAT displays the total statistics of XLOG redo operations on all nodes in a cluster. Except the avgiotim column (indicating the average redo write time of al", + "product_code":"dws", + "title":"GLOBAL_REDO_STAT", + "uri":"dws_04_0682.html", + "doc_type":"devg", + "p_code":"395", + "code":"438" + }, + { + "desc":"GLOBAL_REL_IOSTAT displays the total disk I/O statistics of all nodes in a cluster. The name of each column in this view is the same as that in the GS_REL_IOSTAT view, bu", + "product_code":"dws", + "title":"GLOBAL_REL_IOSTAT", + "uri":"dws_04_0683.html", + "doc_type":"devg", + "p_code":"395", + "code":"439" + }, + { + "desc":"GLOBAL_STAT_DATABASE displays the status and statistics of databases on all nodes in a cluster.When you query the GLOBAL_STAT_DATABASE view on a CN, the respective values", + "product_code":"dws", + "title":"GLOBAL_STAT_DATABASE", + "uri":"dws_04_0684.html", + "doc_type":"devg", + "p_code":"395", + "code":"440" + }, + { + "desc":"GLOBAL_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in all workload Cgroups in a cluster, including the number of SELECT, UPDATE, INSER", + "product_code":"dws", + "title":"GLOBAL_WORKLOAD_SQL_COUNT", + "uri":"dws_04_0685.html", + "doc_type":"devg", + "p_code":"395", + "code":"441" + }, + { + "desc":"GLOBAL_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in all workload Cgroups in a cluster, including the maximum, minimum, average, ", + "product_code":"dws", + "title":"GLOBAL_WORKLOAD_SQL_ELAPSE_TIME", + "uri":"dws_04_0686.html", + "doc_type":"devg", + "p_code":"395", + "code":"442" + }, + { + "desc":"GLOBAL_WORKLOAD_TRANSACTION provides the total transaction information about workload Cgroups on all CNs in the cluster. This view is accessible only to users with system", + "product_code":"dws", + "title":"GLOBAL_WORKLOAD_TRANSACTION", + "uri":"dws_04_0687.html", + "doc_type":"devg", + "p_code":"395", + "code":"443" + }, + { + "desc":"GS_ALL_CONTROL_GROUP_INFO displays all Cgroup information in a database.", + "product_code":"dws", + "title":"GS_ALL_CONTROL_GROUP_INFO", + "uri":"dws_04_0688.html", + "doc_type":"devg", + "p_code":"395", + "code":"444" + }, + { + "desc":"GS_CLUSTER_RESOURCE_INFO displays a DN resource summary.", + "product_code":"dws", + "title":"GS_CLUSTER_RESOURCE_INFO", + "uri":"dws_04_0689.html", + "doc_type":"devg", + "p_code":"395", + "code":"445" + }, + { + "desc":"The database parses each received SQL text string and generates an internal parsing tree. The database traverses the parsing tree and ignores constant values in the parsi", + "product_code":"dws", + "title":"GS_INSTR_UNIQUE_SQL", + "uri":"dws_04_0690.html", + "doc_type":"devg", + "p_code":"395", + "code":"446" + }, + { + "desc":"GS_REL_IOSTAT displays disk I/O statistics on the current node. In the current version, only one page is read or written in each read or write operation. Therefore, the n", + "product_code":"dws", + "title":"GS_REL_IOSTAT", + "uri":"dws_04_0691.html", + "doc_type":"devg", + "p_code":"395", + "code":"447" + }, + { + "desc":"The GS_NODE_STAT_RESET_TIME view provides the reset time of statistics on the current node and returns the timestamp with the time zone. For details, see the get_node_sta", + "product_code":"dws", + "title":"GS_NODE_STAT_RESET_TIME", + "uri":"dws_04_0692.html", + "doc_type":"devg", + "p_code":"395", + "code":"448" + }, + { + "desc":"GS_SESSION_CPU_STATISTICS displays load management information about CPU usage of ongoing complex jobs executed by the current user.", + "product_code":"dws", + "title":"GS_SESSION_CPU_STATISTICS", + "uri":"dws_04_0693.html", + "doc_type":"devg", + "p_code":"395", + "code":"449" + }, + { + "desc":"GS_SESSION_MEMORY_STATISTICS displays load management information about memory usage of ongoing complex jobs executed by the current user.", + "product_code":"dws", + "title":"GS_SESSION_MEMORY_STATISTICS", + "uri":"dws_04_0694.html", + "doc_type":"devg", + "p_code":"395", + "code":"450" + }, + { + "desc":"GS_SQL_COUNT displays statistics about the five types of statements (SELECT, INSERT, UPDATE, DELETE, and MERGE INTO) executed on the current node of the database, includi", + "product_code":"dws", + "title":"GS_SQL_COUNT", + "uri":"dws_04_0695.html", + "doc_type":"devg", + "p_code":"395", + "code":"451" + }, + { + "desc":"GS_WAIT_EVENTS displays statistics about waiting status and events on the current node.The values of statistical columns in this view are accumulated only when the enable", + "product_code":"dws", + "title":"GS_WAIT_EVENTS", + "uri":"dws_04_0696.html", + "doc_type":"devg", + "p_code":"395", + "code":"452" + }, + { + "desc":"This view displays the execution information about operators in the query statements that have been executed on the current CN. The information comes from the system cata", + "product_code":"dws", + "title":"GS_WLM_OPERAROR_INFO", + "uri":"dws_04_0701.html", + "doc_type":"devg", + "p_code":"395", + "code":"453" + }, + { + "desc":"This view displays the records of operators in jobs that have been executed by the current user on the current CN.This view is used by Database Manager to query data from", + "product_code":"dws", + "title":"GS_WLM_OPERATOR_HISTORY", + "uri":"dws_04_0702.html", + "doc_type":"devg", + "p_code":"395", + "code":"454" + }, + { + "desc":"GS_WLM_OPERATOR_STATISTICS displays the operators of the jobs that are being executed by the current user.", + "product_code":"dws", + "title":"GS_WLM_OPERATOR_STATISTICS", + "uri":"dws_04_0703.html", + "doc_type":"devg", + "p_code":"395", + "code":"455" + }, + { + "desc":"This view displays the execution information about the query statements that have been executed on the current CN. The information comes from the system catalog dbms_om. ", + "product_code":"dws", + "title":"GS_WLM_SESSION_INFO", + "uri":"dws_04_0704.html", + "doc_type":"devg", + "p_code":"395", + "code":"456" + }, + { + "desc":"GS_WLM_SESSION_HISTORY displays load management information about a completed job executed by the current user on the current CN. This view is used by Database Manager to", + "product_code":"dws", + "title":"GS_WLM_SESSION_HISTORY", + "uri":"dws_04_0705.html", + "doc_type":"devg", + "p_code":"395", + "code":"457" + }, + { + "desc":"GS_WLM_SESSION_STATISTICS displays load management information about jobs being executed by the current user on the current CN.", + "product_code":"dws", + "title":"GS_WLM_SESSION_STATISTICS", + "uri":"dws_04_0706.html", + "doc_type":"devg", + "p_code":"395", + "code":"458" + }, + { + "desc":"GS_WLM_SQL_ALLOW displays the configured resource management SQL whitelist, including the default SQL whitelist and the SQL whitelist configured using the GUC parameter w", + "product_code":"dws", + "title":"GS_WLM_SQL_ALLOW", + "uri":"dws_04_0708.html", + "doc_type":"devg", + "p_code":"395", + "code":"459" + }, + { + "desc":"GS_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on the current node, including the number of SELECT, UPDATE, INSERT", + "product_code":"dws", + "title":"GS_WORKLOAD_SQL_COUNT", + "uri":"dws_04_0709.html", + "doc_type":"devg", + "p_code":"395", + "code":"460" + }, + { + "desc":"GS_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on the current node, including the maximum, minimum, average, a", + "product_code":"dws", + "title":"GS_WORKLOAD_SQL_ELAPSE_TIME", + "uri":"dws_04_0710.html", + "doc_type":"devg", + "p_code":"395", + "code":"461" + }, + { + "desc":"GS_WORKLOAD_TRANSACTION provides transaction information about workload cgroups on a single CN. The database records the number of times that each workload Cgroup commits", + "product_code":"dws", + "title":"GS_WORKLOAD_TRANSACTION", + "uri":"dws_04_0711.html", + "doc_type":"devg", + "p_code":"395", + "code":"462" + }, + { + "desc":"GS_STAT_DB_CU displsys CU hits in a database and in each node in a cluster. You can clear it using gs_stat_reset().", + "product_code":"dws", + "title":"GS_STAT_DB_CU", + "uri":"dws_04_0712.html", + "doc_type":"devg", + "p_code":"395", + "code":"463" + }, + { + "desc":"GS_STAT_SESSION_CU displays the CU hit rate of running sessions on each node in a cluster. This data about a session is cleared when you exit this session or restart the ", + "product_code":"dws", + "title":"GS_STAT_SESSION_CU", + "uri":"dws_04_0713.html", + "doc_type":"devg", + "p_code":"395", + "code":"464" + }, + { + "desc":"GS_TOTAL_NODEGROUP_MEMORY_DETAIL displays statistics about memory usage of the logical cluster that the current database belongs to in the unit of MB.", + "product_code":"dws", + "title":"GS_TOTAL_NODEGROUP_MEMORY_DETAIL", + "uri":"dws_04_0714.html", + "doc_type":"devg", + "p_code":"395", + "code":"465" + }, + { + "desc":"GS_USER_TRANSACTION provides transaction information about users on a single CN. The database records the number of times that each user commits and rolls back transactio", + "product_code":"dws", + "title":"GS_USER_TRANSACTION", + "uri":"dws_04_0715.html", + "doc_type":"devg", + "p_code":"395", + "code":"466" + }, + { + "desc":"GS_VIEW_DEPENDENCY allows you to query the direct dependencies of all views visible to the current user.", + "product_code":"dws", + "title":"GS_VIEW_DEPENDENCY", + "uri":"dws_04_0716.html", + "doc_type":"devg", + "p_code":"395", + "code":"467" + }, + { + "desc":"GS_VIEW_DEPENDENCY_PATH allows you to query the direct dependencies of all views visible to the current user. If the base table on which the view depends exists and the d", + "product_code":"dws", + "title":"GS_VIEW_DEPENDENCY_PATH", + "uri":"dws_04_0948.html", + "doc_type":"devg", + "p_code":"395", + "code":"468" + }, + { + "desc":"GS_VIEW_INVALID queries all unavailable views visible to the current user. If the base table, function, or synonym that the view depends on is abnormal, the validtype col", + "product_code":"dws", + "title":"GS_VIEW_INVALID", + "uri":"dws_04_0717.html", + "doc_type":"devg", + "p_code":"395", + "code":"469" + }, + { + "desc":"MPP_TABLES displays information about tables in PGXC_CLASS.", + "product_code":"dws", + "title":"MPP_TABLES", + "uri":"dws_04_0998.html", + "doc_type":"devg", + "p_code":"395", + "code":"470" + }, + { + "desc":"PG_AVAILABLE_EXTENSION_VERSIONS displays the extension versions of certain database features.", + "product_code":"dws", + "title":"PG_AVAILABLE_EXTENSION_VERSIONS", + "uri":"dws_04_0718.html", + "doc_type":"devg", + "p_code":"395", + "code":"471" + }, + { + "desc":"PG_AVAILABLE_EXTENSIONS displays the extended information about certain database features.", + "product_code":"dws", + "title":"PG_AVAILABLE_EXTENSIONS", + "uri":"dws_04_0719.html", + "doc_type":"devg", + "p_code":"395", + "code":"472" + }, + { + "desc":"On any normal node in a cluster, PG_BULKLOAD_STATISTICS displays the execution status of the import and export services. Each import or export service corresponds to a re", + "product_code":"dws", + "title":"PG_BULKLOAD_STATISTICS", + "uri":"dws_04_0720.html", + "doc_type":"devg", + "p_code":"395", + "code":"473" + }, + { + "desc":"PG_COMM_CLIENT_INFO stores the client connection information of a single node. (You can query this view on a DN to view the information about the connection between the C", + "product_code":"dws", + "title":"PG_COMM_CLIENT_INFO", + "uri":"dws_04_0721.html", + "doc_type":"devg", + "p_code":"395", + "code":"474" + }, + { + "desc":"PG_COMM_DELAY displays the communication library delay status for a single DN.", + "product_code":"dws", + "title":"PG_COMM_DELAY", + "uri":"dws_04_0722.html", + "doc_type":"devg", + "p_code":"395", + "code":"475" + }, + { + "desc":"PG_COMM_STATUS displays the communication library status for a single DN.", + "product_code":"dws", + "title":"PG_COMM_STATUS", + "uri":"dws_04_0723.html", + "doc_type":"devg", + "p_code":"395", + "code":"476" + }, + { + "desc":"PG_COMM_RECV_STREAM displays the receiving stream status of all the communication libraries for a single DN.", + "product_code":"dws", + "title":"PG_COMM_RECV_STREAM", + "uri":"dws_04_0724.html", + "doc_type":"devg", + "p_code":"395", + "code":"477" + }, + { + "desc":"PG_COMM_SEND_STREAM displays the sending stream status of all the communication libraries for a single DN.", + "product_code":"dws", + "title":"PG_COMM_SEND_STREAM", + "uri":"dws_04_0725.html", + "doc_type":"devg", + "p_code":"395", + "code":"478" + }, + { + "desc":"PG_CONTROL_GROUP_CONFIG displays the Cgroup configuration information in the system.", + "product_code":"dws", + "title":"PG_CONTROL_GROUP_CONFIG", + "uri":"dws_04_0726.html", + "doc_type":"devg", + "p_code":"395", + "code":"479" + }, + { + "desc":"PG_CURSORS displays the cursors that are currently available.", + "product_code":"dws", + "title":"PG_CURSORS", + "uri":"dws_04_0727.html", + "doc_type":"devg", + "p_code":"395", + "code":"480" + }, + { + "desc":"PG_EXT_STATS displays extension statistics stored in the PG_STATISTIC_EXT table. The extension statistics means multiple columns of statistics.", + "product_code":"dws", + "title":"PG_EXT_STATS", + "uri":"dws_04_0728.html", + "doc_type":"devg", + "p_code":"395", + "code":"481" + }, + { + "desc":"PG_GET_INVALID_BACKENDS displays the information about backend threads on the CN that are connected to the current standby DN.", + "product_code":"dws", + "title":"PG_GET_INVALID_BACKENDS", + "uri":"dws_04_0729.html", + "doc_type":"devg", + "p_code":"395", + "code":"482" + }, + { + "desc":"PG_GET_SENDERS_CATCHUP_TIME displays the catchup information of the currently active primary/standby instance sending thread on a single DN.", + "product_code":"dws", + "title":"PG_GET_SENDERS_CATCHUP_TIME", + "uri":"dws_04_0730.html", + "doc_type":"devg", + "p_code":"395", + "code":"483" + }, + { + "desc":"PG_GROUP displays the database role authentication and the relationship between roles.", + "product_code":"dws", + "title":"PG_GROUP", + "uri":"dws_04_0731.html", + "doc_type":"devg", + "p_code":"395", + "code":"484" + }, + { + "desc":"PG_INDEXES displays access to useful information about each index in the database.", + "product_code":"dws", + "title":"PG_INDEXES", + "uri":"dws_04_0732.html", + "doc_type":"devg", + "p_code":"395", + "code":"485" + }, + { + "desc":"The PG_JOB view replaces the PG_JOB system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB system catalog is cha", + "product_code":"dws", + "title":"PG_JOB", + "uri":"dws_04_0733.html", + "doc_type":"devg", + "p_code":"395", + "code":"486" + }, + { + "desc":"The PG_JOB_PROC view replaces the PG_JOB_PROC system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB_PROC and PG", + "product_code":"dws", + "title":"PG_JOB_PROC", + "uri":"dws_04_0734.html", + "doc_type":"devg", + "p_code":"395", + "code":"487" + }, + { + "desc":"PG_JOB_SINGLE displays job information about the current node.", + "product_code":"dws", + "title":"PG_JOB_SINGLE", + "uri":"dws_04_0735.html", + "doc_type":"devg", + "p_code":"395", + "code":"488" + }, + { + "desc":"PG_LIFECYCLE_DATA_DISTRIBUTE displays the distribution of cold and hot data in a multi-temperature table of OBS.", + "product_code":"dws", + "title":"PG_LIFECYCLE_DATA_DISTRIBUTE", + "uri":"dws_04_0736.html", + "doc_type":"devg", + "p_code":"395", + "code":"489" + }, + { + "desc":"PG_LOCKS displays information about the locks held by open transactions.", + "product_code":"dws", + "title":"PG_LOCKS", + "uri":"dws_04_0737.html", + "doc_type":"devg", + "p_code":"395", + "code":"490" + }, + { + "desc":"PG_NODE_ENVO displays the environmental variable information about the current node.", + "product_code":"dws", + "title":"PG_NODE_ENV", + "uri":"dws_04_0738.html", + "doc_type":"devg", + "p_code":"395", + "code":"491" + }, + { + "desc":"PG_OS_THREADS displays the status information about all the threads under the current node.", + "product_code":"dws", + "title":"PG_OS_THREADS", + "uri":"dws_04_0739.html", + "doc_type":"devg", + "p_code":"395", + "code":"492" + }, + { + "desc":"PG_POOLER_STATUS displays the cache connection status in the pooler. PG_POOLER_STATUS can only query on the CN, and displays the connection cache information about the po", + "product_code":"dws", + "title":"PG_POOLER_STATUS", + "uri":"dws_04_0740.html", + "doc_type":"devg", + "p_code":"395", + "code":"493" + }, + { + "desc":"PG_PREPARED_STATEMENTS displays all prepared statements that are available in the current session.", + "product_code":"dws", + "title":"PG_PREPARED_STATEMENTS", + "uri":"dws_04_0741.html", + "doc_type":"devg", + "p_code":"395", + "code":"494" + }, + { + "desc":"PG_PREPARED_XACTS displays information about transactions that are currently prepared for two-phase commit.", + "product_code":"dws", + "title":"PG_PREPARED_XACTS", + "uri":"dws_04_0742.html", + "doc_type":"devg", + "p_code":"395", + "code":"495" + }, + { + "desc":"PG_QUERYBAND_ACTION displays information about the object associated with query_band and the query_band query order.", + "product_code":"dws", + "title":"PG_QUERYBAND_ACTION", + "uri":"dws_04_0743.html", + "doc_type":"devg", + "p_code":"395", + "code":"496" + }, + { + "desc":"PG_REPLICATION_SLOTS displays the replication node information.", + "product_code":"dws", + "title":"PG_REPLICATION_SLOTS", + "uri":"dws_04_0744.html", + "doc_type":"devg", + "p_code":"395", + "code":"497" + }, + { + "desc":"PG_ROLES displays information about database roles.", + "product_code":"dws", + "title":"PG_ROLES", + "uri":"dws_04_0745.html", + "doc_type":"devg", + "p_code":"395", + "code":"498" + }, + { + "desc":"PG_RULES displays information about rewrite rules.", + "product_code":"dws", + "title":"PG_RULES", + "uri":"dws_04_0746.html", + "doc_type":"devg", + "p_code":"395", + "code":"499" + }, + { + "desc":"PG_RUNNING_XACTS displays the running transaction information on the current node.", + "product_code":"dws", + "title":"PG_RUNNING_XACTS", + "uri":"dws_04_0747.html", + "doc_type":"devg", + "p_code":"395", + "code":"500" + }, + { + "desc":"PG_SECLABELS displays information about security labels.", + "product_code":"dws", + "title":"PG_SECLABELS", + "uri":"dws_04_0748.html", + "doc_type":"devg", + "p_code":"395", + "code":"501" + }, + { + "desc":"PG_SESSION_WLMSTAT displays the corresponding load management information about the task currently executed by the user.", + "product_code":"dws", + "title":"PG_SESSION_WLMSTAT", + "uri":"dws_04_0749.html", + "doc_type":"devg", + "p_code":"395", + "code":"502" + }, + { + "desc":"PG_SESSION_IOSTAT displays the I/O load management information about the task currently executed by the user.IOPS is counted by ones for column storage and by thousands f", + "product_code":"dws", + "title":"PG_SESSION_IOSTAT", + "uri":"dws_04_0750.html", + "doc_type":"devg", + "p_code":"395", + "code":"503" + }, + { + "desc":"PG_SETTINGS displays information about parameters of the running database.", + "product_code":"dws", + "title":"PG_SETTINGS", + "uri":"dws_04_0751.html", + "doc_type":"devg", + "p_code":"395", + "code":"504" + }, + { + "desc":"PG_SHADOW displays properties of all roles that are marked as rolcanlogin in PG_AUTHID.The name stems from the fact that this table should not be readable by the public s", + "product_code":"dws", + "title":"PG_SHADOW", + "uri":"dws_04_0752.html", + "doc_type":"devg", + "p_code":"395", + "code":"505" + }, + { + "desc":"PG_SHARED_MEMORY_DETAIL displays usage information about all the shared memory contexts.", + "product_code":"dws", + "title":"PG_SHARED_MEMORY_DETAIL", + "uri":"dws_04_0753.html", + "doc_type":"devg", + "p_code":"395", + "code":"506" + }, + { + "desc":"PG_STATS displays the single-column statistics stored in the pg_statistic table.", + "product_code":"dws", + "title":"PG_STATS", + "uri":"dws_04_0754.html", + "doc_type":"devg", + "p_code":"395", + "code":"507" + }, + { + "desc":"PG_STAT_ACTIVITY displays information about the current user's queries.", + "product_code":"dws", + "title":"PG_STAT_ACTIVITY", + "uri":"dws_04_0755.html", + "doc_type":"devg", + "p_code":"395", + "code":"508" + }, + { + "desc":"PG_STAT_ALL_INDEXES displays access informaton about all indexes in the database, with information about each index displayed in a row.Indexes can be used via either simp", + "product_code":"dws", + "title":"PG_STAT_ALL_INDEXES", + "uri":"dws_04_0757.html", + "doc_type":"devg", + "p_code":"395", + "code":"509" + }, + { + "desc":"PG_STAT_ALL_TABLES displays access information about all rows in all tables (including TOAST tables) in the database.", + "product_code":"dws", + "title":"PG_STAT_ALL_TABLES", + "uri":"dws_04_0758.html", + "doc_type":"devg", + "p_code":"395", + "code":"510" + }, + { + "desc":"PG_STAT_BAD_BLOCK displays statistics about page or CU verification failures after a node is started.", + "product_code":"dws", + "title":"PG_STAT_BAD_BLOCK", + "uri":"dws_04_0759.html", + "doc_type":"devg", + "p_code":"395", + "code":"511" + }, + { + "desc":"PG_STAT_BGWRITER displays statistics about the background writer process's activity.", + "product_code":"dws", + "title":"PG_STAT_BGWRITER", + "uri":"dws_04_0760.html", + "doc_type":"devg", + "p_code":"395", + "code":"512" + }, + { + "desc":"PG_STAT_DATABASE displays the status and statistics of each database on the current node.", + "product_code":"dws", + "title":"PG_STAT_DATABASE", + "uri":"dws_04_0761.html", + "doc_type":"devg", + "p_code":"395", + "code":"513" + }, + { + "desc":"PG_STAT_DATABASE_CONFLICTS displays statistics about database conflicts.", + "product_code":"dws", + "title":"PG_STAT_DATABASE_CONFLICTS", + "uri":"dws_04_0762.html", + "doc_type":"devg", + "p_code":"395", + "code":"514" + }, + { + "desc":"PG_STAT_GET_MEM_MBYTES_RESERVED displays the current activity information of a thread stored in memory. You need to specify the thread ID (pid in PG_STAT_ACTIVITY) for qu", + "product_code":"dws", + "title":"PG_STAT_GET_MEM_MBYTES_RESERVED", + "uri":"dws_04_0763.html", + "doc_type":"devg", + "p_code":"395", + "code":"515" + }, + { + "desc":"PG_STAT_USER_FUNCTIONS displays user-defined function status information in the namespace. (The language of the function is non-internal language.)", + "product_code":"dws", + "title":"PG_STAT_USER_FUNCTIONS", + "uri":"dws_04_0764.html", + "doc_type":"devg", + "p_code":"395", + "code":"516" + }, + { + "desc":"PG_STAT_USER_INDEXES displays information about the index status of user-defined ordinary tables and TOAST tables.", + "product_code":"dws", + "title":"PG_STAT_USER_INDEXES", + "uri":"dws_04_0765.html", + "doc_type":"devg", + "p_code":"395", + "code":"517" + }, + { + "desc":"PG_STAT_USER_TABLES displays status information about user-defined ordinary tables and TOAST tables in all namespaces.", + "product_code":"dws", + "title":"PG_STAT_USER_TABLES", + "uri":"dws_04_0766.html", + "doc_type":"devg", + "p_code":"395", + "code":"518" + }, + { + "desc":"PG_STAT_REPLICATION displays information about log synchronization status, such as the locations of the sender sending logs and the receiver receiving logs.", + "product_code":"dws", + "title":"PG_STAT_REPLICATION", + "uri":"dws_04_0767.html", + "doc_type":"devg", + "p_code":"395", + "code":"519" + }, + { + "desc":"PG_STAT_SYS_INDEXES displays the index status information about all the system catalogs in the pg_catalog and information_schema schemas.", + "product_code":"dws", + "title":"PG_STAT_SYS_INDEXES", + "uri":"dws_04_0768.html", + "doc_type":"devg", + "p_code":"395", + "code":"520" + }, + { + "desc":"PG_STAT_SYS_TABLES displays the statistics about the system catalogs of all the namespaces in pg_catalog and information_schema schemas.", + "product_code":"dws", + "title":"PG_STAT_SYS_TABLES", + "uri":"dws_04_0769.html", + "doc_type":"devg", + "p_code":"395", + "code":"521" + }, + { + "desc":"PG_STAT_XACT_ALL_TABLES displays the transaction status information about all ordinary tables and TOAST tables in the namespaces.", + "product_code":"dws", + "title":"PG_STAT_XACT_ALL_TABLES", + "uri":"dws_04_0770.html", + "doc_type":"devg", + "p_code":"395", + "code":"522" + }, + { + "desc":"PG_STAT_XACT_SYS_TABLES displays the transaction status information of the system catalog in the namespace.", + "product_code":"dws", + "title":"PG_STAT_XACT_SYS_TABLES", + "uri":"dws_04_0771.html", + "doc_type":"devg", + "p_code":"395", + "code":"523" + }, + { + "desc":"PG_STAT_XACT_USER_FUNCTIONS displays statistics about function executions, with statistics about each execution displayed in a row.", + "product_code":"dws", + "title":"PG_STAT_XACT_USER_FUNCTIONS", + "uri":"dws_04_0772.html", + "doc_type":"devg", + "p_code":"395", + "code":"524" + }, + { + "desc":"PG_STAT_XACT_USER_TABLES displays the transaction status information of the user table in the namespace.", + "product_code":"dws", + "title":"PG_STAT_XACT_USER_TABLES", + "uri":"dws_04_0773.html", + "doc_type":"devg", + "p_code":"395", + "code":"525" + }, + { + "desc":"PG_STATIO_ALL_INDEXES contains each row of each index in the current database, showing I/O statistics about accesses to that specific index.", + "product_code":"dws", + "title":"PG_STATIO_ALL_INDEXES", + "uri":"dws_04_0774.html", + "doc_type":"devg", + "p_code":"395", + "code":"526" + }, + { + "desc":"PG_STATIO_ALL_SEQUENCES contains each row of each sequence in the current database, showing I/O statistics about accesses to that specific sequence.", + "product_code":"dws", + "title":"PG_STATIO_ALL_SEQUENCES", + "uri":"dws_04_0775.html", + "doc_type":"devg", + "p_code":"395", + "code":"527" + }, + { + "desc":"PG_STATIO_ALL_TABLES contains one row for each table in the current database (including TOAST tables), showing I/O statistics about accesses to that specific table.", + "product_code":"dws", + "title":"PG_STATIO_ALL_TABLES", + "uri":"dws_04_0776.html", + "doc_type":"devg", + "p_code":"395", + "code":"528" + }, + { + "desc":"PG_STATIO_SYS_INDEXES displays the I/O status information about all system catalog indexes in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_SYS_INDEXES", + "uri":"dws_04_0777.html", + "doc_type":"devg", + "p_code":"395", + "code":"529" + }, + { + "desc":"PG_STATIO_SYS_SEQUENCES displays the I/O status information about all the system sequences in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_SYS_SEQUENCES", + "uri":"dws_04_0778.html", + "doc_type":"devg", + "p_code":"395", + "code":"530" + }, + { + "desc":"PG_STATIO_SYS_TABLES displays the I/O status information about all the system catalogs in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_SYS_TABLES", + "uri":"dws_04_0779.html", + "doc_type":"devg", + "p_code":"395", + "code":"531" + }, + { + "desc":"PG_STATIO_USER_INDEXES displays the I/O status information about all the user relationship table indexes in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_USER_INDEXES", + "uri":"dws_04_0780.html", + "doc_type":"devg", + "p_code":"395", + "code":"532" + }, + { + "desc":"PG_STATIO_USER_SEQUENCES displays the I/O status information about all the user relation table sequences in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_USER_SEQUENCES", + "uri":"dws_04_0781.html", + "doc_type":"devg", + "p_code":"395", + "code":"533" + }, + { + "desc":"PG_STATIO_USER_TABLES displays the I/O status information about all the user relation tables in the namespace.", + "product_code":"dws", + "title":"PG_STATIO_USER_TABLES", + "uri":"dws_04_0782.html", + "doc_type":"devg", + "p_code":"395", + "code":"534" + }, + { + "desc":"PG_THREAD_WAIT_STATUS allows you to test the block waiting status about the backend thread and auxiliary thread of the current instance.The waiting statuses in the wait_s", + "product_code":"dws", + "title":"PG_THREAD_WAIT_STATUS", + "uri":"dws_04_0783.html", + "doc_type":"devg", + "p_code":"395", + "code":"535" + }, + { + "desc":"PG_TABLES displays access to each table in the database.", + "product_code":"dws", + "title":"PG_TABLES", + "uri":"dws_04_0784.html", + "doc_type":"devg", + "p_code":"395", + "code":"536" + }, + { + "desc":"PG_TDE_INFO displays the encryption information about the current cluster.Check whether the current cluster is encrypted, and check the encryption algorithm (if any) used", + "product_code":"dws", + "title":"PG_TDE_INFO", + "uri":"dws_04_0785.html", + "doc_type":"devg", + "p_code":"395", + "code":"537" + }, + { + "desc":"PG_TIMEZONE_ABBREVS displays all time zone abbreviations that can be recognized by the input routines.", + "product_code":"dws", + "title":"PG_TIMEZONE_ABBREVS", + "uri":"dws_04_0786.html", + "doc_type":"devg", + "p_code":"395", + "code":"538" + }, + { + "desc":"PG_TIMEZONE_NAMES displays all time zone names that can be recognized by SET TIMEZONE, along with their associated abbreviations, UTC offsets, and daylight saving time st", + "product_code":"dws", + "title":"PG_TIMEZONE_NAMES", + "uri":"dws_04_0787.html", + "doc_type":"devg", + "p_code":"395", + "code":"539" + }, + { + "desc":"PG_TOTAL_MEMORY_DETAIL displays the memory usage of a certain node in the database.", + "product_code":"dws", + "title":"PG_TOTAL_MEMORY_DETAIL", + "uri":"dws_04_0788.html", + "doc_type":"devg", + "p_code":"395", + "code":"540" + }, + { + "desc":"PG_TOTAL_SCHEMA_INFO displays the storage usage of all schemas in each database. This view is valid only if use_workload_manager is set to on.", + "product_code":"dws", + "title":"PG_TOTAL_SCHEMA_INFO", + "uri":"dws_04_0789.html", + "doc_type":"devg", + "p_code":"395", + "code":"541" + }, + { + "desc":"PG_TOTAL_USER_RESOURCE_INFO displays the resource usage of all users. Only administrators can query this view. This view is valid only if use_workload_manager is set to o", + "product_code":"dws", + "title":"PG_TOTAL_USER_RESOURCE_INFO", + "uri":"dws_04_0790.html", + "doc_type":"devg", + "p_code":"395", + "code":"542" + }, + { + "desc":"PG_USER displays information about users who can access the database.", + "product_code":"dws", + "title":"PG_USER", + "uri":"dws_04_0791.html", + "doc_type":"devg", + "p_code":"395", + "code":"543" + }, + { + "desc":"PG_USER_MAPPINGS displays information about user mappings.This is essentially a publicly readable view of PG_USER_MAPPING that leaves out the options column if the user h", + "product_code":"dws", + "title":"PG_USER_MAPPINGS", + "uri":"dws_04_0792.html", + "doc_type":"devg", + "p_code":"395", + "code":"544" + }, + { + "desc":"PG_VIEWS displays basic information about each view in the database.", + "product_code":"dws", + "title":"PG_VIEWS", + "uri":"dws_04_0793.html", + "doc_type":"devg", + "p_code":"395", + "code":"545" + }, + { + "desc":"PG_WLM_STATISTICS displays information about workload management after the task is complete or the exception has been handled.", + "product_code":"dws", + "title":"PG_WLM_STATISTICS", + "uri":"dws_04_0794.html", + "doc_type":"devg", + "p_code":"395", + "code":"546" + }, + { + "desc":"PGXC_BULKLOAD_PROGRESS displays the progress of the service import. Only GDS common files can be imported. This view is accessible only to users with system administrator", + "product_code":"dws", + "title":"PGXC_BULKLOAD_PROGRESS", + "uri":"dws_04_0795.html", + "doc_type":"devg", + "p_code":"395", + "code":"547" + }, + { + "desc":"PGXC_BULKLOAD_STATISTICS displays real-time statistics about service execution, such as GDS, COPY, and \\COPY, on a CN. This view summarizes the real-time execution status", + "product_code":"dws", + "title":"PGXC_BULKLOAD_STATISTICS", + "uri":"dws_04_0796.html", + "doc_type":"devg", + "p_code":"395", + "code":"548" + }, + { + "desc":"PGXC_COMM_CLIENT_INFO stores the client connection information of all nodes. (You can query this view on a DN to view the information about the connection between the CN ", + "product_code":"dws", + "title":"PGXC_COMM_CLIENT_INFO", + "uri":"dws_04_0797.html", + "doc_type":"devg", + "p_code":"395", + "code":"549" + }, + { + "desc":"PGXC_COMM_STATUS displays the communication library delay status for all the DNs.", + "product_code":"dws", + "title":"PGXC_COMM_DELAY", + "uri":"dws_04_0798.html", + "doc_type":"devg", + "p_code":"395", + "code":"550" + }, + { + "desc":"PG_COMM_RECV_STREAM displays the receiving stream status of the communication libraries for all the DNs.", + "product_code":"dws", + "title":"PGXC_COMM_RECV_STREAM", + "uri":"dws_04_0799.html", + "doc_type":"devg", + "p_code":"395", + "code":"551" + }, + { + "desc":"PGXC_COMM_SEND_STREAM displays the sending stream status of the communication libraries for all the DNs.", + "product_code":"dws", + "title":"PGXC_COMM_SEND_STREAM", + "uri":"dws_04_0800.html", + "doc_type":"devg", + "p_code":"395", + "code":"552" + }, + { + "desc":"PGXC_COMM_STATUS displays the communication library status for all the DNs.", + "product_code":"dws", + "title":"PGXC_COMM_STATUS", + "uri":"dws_04_0801.html", + "doc_type":"devg", + "p_code":"395", + "code":"553" + }, + { + "desc":"PGXC_DEADLOCK displays lock wait information generated due to distributed deadlocks.Currently, PGXC_DEADLOCK collects only lock wait information about locks whose locktyp", + "product_code":"dws", + "title":"PGXC_DEADLOCK", + "uri":"dws_04_0802.html", + "doc_type":"devg", + "p_code":"395", + "code":"554" + }, + { + "desc":"PGXC_GET_STAT_ALL_TABLES displays information about insertion, update, and deletion operations on tables and the dirty page rate of tables.Before running VACUUM FULL to a", + "product_code":"dws", + "title":"PGXC_GET_STAT_ALL_TABLES", + "uri":"dws_04_0803.html", + "doc_type":"devg", + "p_code":"395", + "code":"555" + }, + { + "desc":"PGXC_GET_STAT_ALL_PARTITIONS displays information about insertion, update, and deletion operations on partitions of partitioned tables and the dirty page rate of tables.T", + "product_code":"dws", + "title":"PGXC_GET_STAT_ALL_PARTITIONS", + "uri":"dws_04_0804.html", + "doc_type":"devg", + "p_code":"395", + "code":"556" + }, + { + "desc":"PGXC_GET_TABLE_SKEWNESS displays the data skew on tables in the current database.", + "product_code":"dws", + "title":"PGXC_GET_TABLE_SKEWNESS", + "uri":"dws_04_0805.html", + "doc_type":"devg", + "p_code":"395", + "code":"557" + }, + { + "desc":"PGXC_GTM_SNAPSHOT_STATUS displays transaction information on the current GTM.", + "product_code":"dws", + "title":"PGXC_GTM_SNAPSHOT_STATUS", + "uri":"dws_04_0806.html", + "doc_type":"devg", + "p_code":"395", + "code":"558" + }, + { + "desc":"PGXC_INSTANCE_TIME displays the running time of processes on each node in the cluster and the time consumed in each execution phase. Except the node_name column, the othe", + "product_code":"dws", + "title":"PGXC_INSTANCE_TIME", + "uri":"dws_04_0807.html", + "doc_type":"devg", + "p_code":"395", + "code":"559" + }, + { + "desc":"PGXC_INSTR_UNIQUE_SQL displays the complete Unique SQL statistics of all CN nodes in the cluster.Only the system administrator can access this view. For details about the", + "product_code":"dws", + "title":"PGXC_INSTR_UNIQUE_SQL", + "uri":"dws_04_0808.html", + "doc_type":"devg", + "p_code":"395", + "code":"560" + }, + { + "desc":"PGXC_LOCK_CONFLICTS displays information about conflicting locks in the cluster.When a lock is waiting for another lock or another lock is waiting for this one, a lock co", + "product_code":"dws", + "title":"PGXC_LOCK_CONFLICTS", + "uri":"dws_04_0809.html", + "doc_type":"devg", + "p_code":"395", + "code":"561" + }, + { + "desc":"PGXC_NODE_ENV displays the environmental variables information about all nodes in a cluster.", + "product_code":"dws", + "title":"PGXC_NODE_ENV", + "uri":"dws_04_0810.html", + "doc_type":"devg", + "p_code":"395", + "code":"562" + }, + { + "desc":"PGXC_NODE_STAT_RESET_TIME displays the time when statistics of each node in the cluster are reset. All columns except node_name are the same as those in the GS_NODE_STAT_", + "product_code":"dws", + "title":"PGXC_NODE_STAT_RESET_TIME", + "uri":"dws_04_0811.html", + "doc_type":"devg", + "p_code":"395", + "code":"563" + }, + { + "desc":"PGXC_OS_RUN_INFO displays the OS running status of each node in the cluster. All columns except node_name are the same as those in the PV_OS_RUN_INFO view. This view is a", + "product_code":"dws", + "title":"PGXC_OS_RUN_INFO", + "uri":"dws_04_0812.html", + "doc_type":"devg", + "p_code":"395", + "code":"564" + }, + { + "desc":"PGXC_OS_THREADS displays thread status information under all normal nodes in the current cluster.", + "product_code":"dws", + "title":"PGXC_OS_THREADS", + "uri":"dws_04_0813.html", + "doc_type":"devg", + "p_code":"395", + "code":"565" + }, + { + "desc":"PGXC_PREPARED_XACTS displays the two-phase transactions in the prepared phase.", + "product_code":"dws", + "title":"PGXC_PREPARED_XACTS", + "uri":"dws_04_0814.html", + "doc_type":"devg", + "p_code":"395", + "code":"566" + }, + { + "desc":"PGXC_REDO_STAT displays statistics on redoing Xlogs of each node in the cluster. All columns except node_name are the same as those in the PV_REDO_STAT view. This view is", + "product_code":"dws", + "title":"PGXC_REDO_STAT", + "uri":"dws_04_0815.html", + "doc_type":"devg", + "p_code":"395", + "code":"567" + }, + { + "desc":"PGXC_REL_IOSTAT displays statistics on disk read and write of each node in the cluster. All columns except node_name are the same as those in the GS_REL_IOSTAT view. This", + "product_code":"dws", + "title":"PGXC_REL_IOSTAT", + "uri":"dws_04_0816.html", + "doc_type":"devg", + "p_code":"395", + "code":"568" + }, + { + "desc":"PGXC_REPLICATION_SLOTS displays the replication information of DNs in the cluster. All columns except node_name are the same as those in the PG_REPLICATION_SLOTS view. Th", + "product_code":"dws", + "title":"PGXC_REPLICATION_SLOTS", + "uri":"dws_04_0817.html", + "doc_type":"devg", + "p_code":"395", + "code":"569" + }, + { + "desc":"PGXC_RUNNING_XACTS displays information about running transactions on each node in the cluster. The content is the same as that displayed in PG_RUNNING_XACTS.", + "product_code":"dws", + "title":"PGXC_RUNNING_XACTS", + "uri":"dws_04_0818.html", + "doc_type":"devg", + "p_code":"395", + "code":"570" + }, + { + "desc":"PGXC_SETTINGS displays the database running status of each node in the cluster. All columns except node_name are the same as those in the PG_SETTINGS view. This view is a", + "product_code":"dws", + "title":"PGXC_SETTINGS", + "uri":"dws_04_0819.html", + "doc_type":"devg", + "p_code":"395", + "code":"571" + }, + { + "desc":"PGXC_STAT_ACTIVITY displays information about the query performed by the current user on all the CNs in the current cluster.Run the following command to view blocked quer", + "product_code":"dws", + "title":"PGXC_STAT_ACTIVITY", + "uri":"dws_04_0820.html", + "doc_type":"devg", + "p_code":"395", + "code":"572" + }, + { + "desc":"PGXC_STAT_BAD_BLOCK displays statistics about page or CU verification failures after all nodes in a cluster are started.", + "product_code":"dws", + "title":"PGXC_STAT_BAD_BLOCK", + "uri":"dws_04_0821.html", + "doc_type":"devg", + "p_code":"395", + "code":"573" + }, + { + "desc":"PGXC_STAT_BGWRITER displays statistics on the background writer of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_BGWRITER vi", + "product_code":"dws", + "title":"PGXC_STAT_BGWRITER", + "uri":"dws_04_0822.html", + "doc_type":"devg", + "p_code":"395", + "code":"574" + }, + { + "desc":"PGXC_STAT_DATABASE displays the database status and statistics of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_DATABASE vie", + "product_code":"dws", + "title":"PGXC_STAT_DATABASE", + "uri":"dws_04_0823.html", + "doc_type":"devg", + "p_code":"395", + "code":"575" + }, + { + "desc":"PGXC_STAT_REPLICATION displays the log synchronization status of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_REPLICATION v", + "product_code":"dws", + "title":"PGXC_STAT_REPLICATION", + "uri":"dws_04_0824.html", + "doc_type":"devg", + "p_code":"395", + "code":"576" + }, + { + "desc":"PGXC_SQL_COUNT displays the node-level and user-level statistics for the SQL statements of SELECT, INSERT, UPDATE, DELETE, and MERGE INTO and DDL, DML, and DCL statements", + "product_code":"dws", + "title":"PGXC_SQL_COUNT", + "uri":"dws_04_0825.html", + "doc_type":"devg", + "p_code":"395", + "code":"577" + }, + { + "desc":"PGXC_THREAD_WAIT_STATUS displays all the call layer hierarchy relationship between threads of the SQL statements on all the nodes in a cluster, and the waiting status of ", + "product_code":"dws", + "title":"PGXC_THREAD_WAIT_STATUS", + "uri":"dws_04_0826.html", + "doc_type":"devg", + "p_code":"395", + "code":"578" + }, + { + "desc":"PGXC_TOTAL_MEMORY_DETAIL displays the memory usage in the cluster.", + "product_code":"dws", + "title":"PGXC_TOTAL_MEMORY_DETAIL", + "uri":"dws_04_0827.html", + "doc_type":"devg", + "p_code":"395", + "code":"579" + }, + { + "desc":"PGXC_TOTAL_SCHEMA_INFO displays the schema space information of all instances in the cluster, providing visibility into the schema space usage of each instance. This view", + "product_code":"dws", + "title":"PGXC_TOTAL_SCHEMA_INFO", + "uri":"dws_04_0828.html", + "doc_type":"devg", + "p_code":"395", + "code":"580" + }, + { + "desc":"PGXC_TOTAL_SCHEMA_INFO_ANALYZE displays the overall schema space information of the cluster, including the total cluster space, average space of instances, skew ratio, ma", + "product_code":"dws", + "title":"PGXC_TOTAL_SCHEMA_INFO_ANALYZE", + "uri":"dws_04_0829.html", + "doc_type":"devg", + "p_code":"395", + "code":"581" + }, + { + "desc":"PGXC_USER_TRANSACTION provides transaction information about users on all CNs. It is accessible only to users with system administrator rights. This view is valid only wh", + "product_code":"dws", + "title":"PGXC_USER_TRANSACTION", + "uri":"dws_04_0830.html", + "doc_type":"devg", + "p_code":"395", + "code":"582" + }, + { + "desc":"PGXC_VARIABLE_INFO displays information about transaction IDs and OIDs of all nodes in a cluster.", + "product_code":"dws", + "title":"PGXC_VARIABLE_INFO", + "uri":"dws_04_0831.html", + "doc_type":"devg", + "p_code":"395", + "code":"583" + }, + { + "desc":"PGXC_WAIT_EVENTS displays statistics on the waiting status and events of each node in the cluster. The content is the same as that displayed in GS_WAIT_EVENTS. This view ", + "product_code":"dws", + "title":"PGXC_WAIT_EVENTS", + "uri":"dws_04_0832.html", + "doc_type":"devg", + "p_code":"395", + "code":"584" + }, + { + "desc":"PGXC_WLM_OPERATOR_HISTORYdisplays the operator information of completed jobs executed on all CNs. This view is used by Database Manager to query data from a database. Dat", + "product_code":"dws", + "title":"PGXC_WLM_OPERATOR_HISTORY", + "uri":"dws_04_0836.html", + "doc_type":"devg", + "p_code":"395", + "code":"585" + }, + { + "desc":"PGXC_WLM_OPERATOR_INFO displays the operator information of completed jobs executed on CNs. The data in this view is obtained from GS_WLM_OPERATOR_INFO.This view is acces", + "product_code":"dws", + "title":"PGXC_WLM_OPERATOR_INFO", + "uri":"dws_04_0837.html", + "doc_type":"devg", + "p_code":"395", + "code":"586" + }, + { + "desc":"PGXC_WLM_OPERATOR_STATISTICS displays the operator information of jobs being executed on CNs.This view is accessible only to users with system administrators rights. For ", + "product_code":"dws", + "title":"PGXC_WLM_OPERATOR_STATISTICS", + "uri":"dws_04_0838.html", + "doc_type":"devg", + "p_code":"395", + "code":"587" + }, + { + "desc":"PGXC_WLM_SESSION_INFO displays load management information for completed jobs executed on all CNs. The data in this view is obtained from GS_WLM_SESSION_INFO.This view is", + "product_code":"dws", + "title":"PGXC_WLM_SESSION_INFO", + "uri":"dws_04_0839.html", + "doc_type":"devg", + "p_code":"395", + "code":"588" + }, + { + "desc":"PGXC_WLM_SESSION_HISTORY displays load management information for completed jobs executed on all CNs. This view is used by Data Manager to query data from a database. Dat", + "product_code":"dws", + "title":"PGXC_WLM_SESSION_HISTORY", + "uri":"dws_04_0840.html", + "doc_type":"devg", + "p_code":"395", + "code":"589" + }, + { + "desc":"PGXC_WLM_SESSION_STATISTICS displays load management information about jobs that are being executed on CNs.This view is accessible only to users with system administrator", + "product_code":"dws", + "title":"PGXC_WLM_SESSION_STATISTICS", + "uri":"dws_04_0841.html", + "doc_type":"devg", + "p_code":"395", + "code":"590" + }, + { + "desc":"PGXC_WLM_WORKLOAD_RECORDS displays the status of job executed by the current user on CNs. It is accessible only to users with system administrator rights. This view is av", + "product_code":"dws", + "title":"PGXC_WLM_WORKLOAD_RECORDS", + "uri":"dws_04_0842.html", + "doc_type":"devg", + "p_code":"395", + "code":"591" + }, + { + "desc":"PGXC_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on all CNs in a cluster, including the number of SELECT, UPDATE, ", + "product_code":"dws", + "title":"PGXC_WORKLOAD_SQL_COUNT", + "uri":"dws_04_0843.html", + "doc_type":"devg", + "p_code":"395", + "code":"592" + }, + { + "desc":"PGXC_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on all CNs in a cluster, including the maximum, minimum, aver", + "product_code":"dws", + "title":"PGXC_WORKLOAD_SQL_ELAPSE_TIME", + "uri":"dws_04_0844.html", + "doc_type":"devg", + "p_code":"395", + "code":"593" + }, + { + "desc":"PGXC_WORKLOAD_TRANSACTION provides transaction information about workload Cgroups on all CNs. It is accessible only to users with system administrator rights. This view i", + "product_code":"dws", + "title":"PGXC_WORKLOAD_TRANSACTION", + "uri":"dws_04_0845.html", + "doc_type":"devg", + "p_code":"395", + "code":"594" + }, + { + "desc":"PLAN_TABLE displays the plan information collected by EXPLAIN PLAN. Plan information is in a session-level life cycle. After the session exits, the data will be deleted. ", + "product_code":"dws", + "title":"PLAN_TABLE", + "uri":"dws_04_0846.html", + "doc_type":"devg", + "p_code":"395", + "code":"595" + }, + { + "desc":"PLAN_TABLE_DATA displays the plan information collected by EXPLAIN PLAN. Different from the PLAN_TABLE view, the system catalog PLAN_TABLE_DATA stores the plan informatio", + "product_code":"dws", + "title":"PLAN_TABLE_DATA", + "uri":"dws_04_0847.html", + "doc_type":"devg", + "p_code":"395", + "code":"596" + }, + { + "desc":"By collecting statistics about the data file I/Os, PV_FILE_STAT displays the I/O performance of the data to detect the performance problems, such as abnormal I/O operatio", + "product_code":"dws", + "title":"PV_FILE_STAT", + "uri":"dws_04_0848.html", + "doc_type":"devg", + "p_code":"395", + "code":"597" + }, + { + "desc":"PV_INSTANCE_TIME collects statistics on the running time of processes and the time consumed in each execution phase, in microseconds.PV_INSTANCE_TIME records time consump", + "product_code":"dws", + "title":"PV_INSTANCE_TIME", + "uri":"dws_04_0849.html", + "doc_type":"devg", + "p_code":"395", + "code":"598" + }, + { + "desc":"PV_OS_RUN_INFO displays the running status of the current operating system.", + "product_code":"dws", + "title":"PV_OS_RUN_INFO", + "uri":"dws_04_0850.html", + "doc_type":"devg", + "p_code":"395", + "code":"599" + }, + { + "desc":"PV_SESSION_MEMORY displays statistics about memory usage at the session level in the unit of MB, including all the memory allocated to Postgres and Stream threads on DNs ", + "product_code":"dws", + "title":"PV_SESSION_MEMORY", + "uri":"dws_04_0851.html", + "doc_type":"devg", + "p_code":"395", + "code":"600" + }, + { + "desc":"PV_SESSION_MEMORY_DETAIL displays statistics about thread memory usage by memory context.The memory context TempSmallContextGroup collects information about all memory co", + "product_code":"dws", + "title":"PV_SESSION_MEMORY_DETAIL", + "uri":"dws_04_0852.html", + "doc_type":"devg", + "p_code":"395", + "code":"601" + }, + { + "desc":"PV_SESSION_STAT displays session state statistics based on session threads or the AutoVacuum thread.", + "product_code":"dws", + "title":"PV_SESSION_STAT", + "uri":"dws_04_0853.html", + "doc_type":"devg", + "p_code":"395", + "code":"602" + }, + { + "desc":"PV_SESSION_TIME displays statistics about the running time of session threads and time consumed in each execution phase, in microseconds.", + "product_code":"dws", + "title":"PV_SESSION_TIME", + "uri":"dws_04_0854.html", + "doc_type":"devg", + "p_code":"395", + "code":"603" + }, + { + "desc":"PV_TOTAL_MEMORY_DETAIL displays statistics about memory usage of the current database node in the unit of MB.", + "product_code":"dws", + "title":"PV_TOTAL_MEMORY_DETAIL", + "uri":"dws_04_0855.html", + "doc_type":"devg", + "p_code":"395", + "code":"604" + }, + { + "desc":"PV_REDO_STAT displays statistics on redoing Xlogs on the current node.", + "product_code":"dws", + "title":"PV_REDO_STAT", + "uri":"dws_04_0856.html", + "doc_type":"devg", + "p_code":"395", + "code":"605" + }, + { + "desc":"REDACTION_COLUMNS displays information about all redaction columns in the current database.", + "product_code":"dws", + "title":"REDACTION_COLUMNS", + "uri":"dws_04_0857.html", + "doc_type":"devg", + "p_code":"395", + "code":"606" + }, + { + "desc":"REDACTION_POLICIES displays information about all redaction objects in the current database.", + "product_code":"dws", + "title":"REDACTION_POLICIES", + "uri":"dws_04_0858.html", + "doc_type":"devg", + "p_code":"395", + "code":"607" + }, + { + "desc":"USER_COL_COMMENTS displays the column comments of the table accessible to the current user.", + "product_code":"dws", + "title":"USER_COL_COMMENTS", + "uri":"dws_04_0859.html", + "doc_type":"devg", + "p_code":"395", + "code":"608" + }, + { + "desc":"USER_CONSTRAINTS displays the table constraint information accessible to the current user.", + "product_code":"dws", + "title":"USER_CONSTRAINTS", + "uri":"dws_04_0860.html", + "doc_type":"devg", + "p_code":"395", + "code":"609" + }, + { + "desc":"USER_CONSTRAINTS displays the information about constraint columns of the tables accessible to the current user.", + "product_code":"dws", + "title":"USER_CONS_COLUMNS", + "uri":"dws_04_0861.html", + "doc_type":"devg", + "p_code":"395", + "code":"610" + }, + { + "desc":"USER_INDEXES displays index information in the current schema.", + "product_code":"dws", + "title":"USER_INDEXES", + "uri":"dws_04_0862.html", + "doc_type":"devg", + "p_code":"395", + "code":"611" + }, + { + "desc":"USER_IND_COLUMNS displays column information about all indexes accessible to the current user.", + "product_code":"dws", + "title":"USER_IND_COLUMNS", + "uri":"dws_04_0863.html", + "doc_type":"devg", + "p_code":"395", + "code":"612" + }, + { + "desc":"USER_IND_EXPRESSIONSdisplays information about the function-based expression index accessible to the current user.", + "product_code":"dws", + "title":"USER_IND_EXPRESSIONS", + "uri":"dws_04_0864.html", + "doc_type":"devg", + "p_code":"395", + "code":"613" + }, + { + "desc":"USER_IND_PARTITIONS displays information about index partitions accessible to the current user.", + "product_code":"dws", + "title":"USER_IND_PARTITIONS", + "uri":"dws_04_0865.html", + "doc_type":"devg", + "p_code":"395", + "code":"614" + }, + { + "desc":"USER_JOBS displays all jobs owned by the user.", + "product_code":"dws", + "title":"USER_JOBS", + "uri":"dws_04_0866.html", + "doc_type":"devg", + "p_code":"395", + "code":"615" + }, + { + "desc":"USER_OBJECTS displays all database objects accessible to the current user.For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.", + "product_code":"dws", + "title":"USER_OBJECTS", + "uri":"dws_04_0867.html", + "doc_type":"devg", + "p_code":"395", + "code":"616" + }, + { + "desc":"USER_PART_INDEXES displays information about partitioned table indexes accessible to the current user.", + "product_code":"dws", + "title":"USER_PART_INDEXES", + "uri":"dws_04_0868.html", + "doc_type":"devg", + "p_code":"395", + "code":"617" + }, + { + "desc":"USER_PART_TABLES displays information about partitioned tables accessible to the current user.", + "product_code":"dws", + "title":"USER_PART_TABLES", + "uri":"dws_04_0869.html", + "doc_type":"devg", + "p_code":"395", + "code":"618" + }, + { + "desc":"USER_PROCEDURES displays information about all stored procedures and functions in the current schema.", + "product_code":"dws", + "title":"USER_PROCEDURES", + "uri":"dws_04_0870.html", + "doc_type":"devg", + "p_code":"395", + "code":"619" + }, + { + "desc":"USER_SEQUENCES displays sequence information in the current schema.", + "product_code":"dws", + "title":"USER_SEQUENCES", + "uri":"dws_04_0871.html", + "doc_type":"devg", + "p_code":"395", + "code":"620" + }, + { + "desc":"USER_SOURCE displays information about stored procedures or functions in this mode, and provides the columns defined by the stored procedures or the functions.", + "product_code":"dws", + "title":"USER_SOURCE", + "uri":"dws_04_0872.html", + "doc_type":"devg", + "p_code":"395", + "code":"621" + }, + { + "desc":"USER_SYNONYMS displays synonyms accessible to the current user.", + "product_code":"dws", + "title":"USER_SYNONYMS", + "uri":"dws_04_0873.html", + "doc_type":"devg", + "p_code":"395", + "code":"622" + }, + { + "desc":"USER_TAB_COLUMNS displays information about table columns accessible to the current user.", + "product_code":"dws", + "title":"USER_TAB_COLUMNS", + "uri":"dws_04_0874.html", + "doc_type":"devg", + "p_code":"395", + "code":"623" + }, + { + "desc":"USER_TAB_COMMENTS displays comments about all tables and views accessible to the current user.", + "product_code":"dws", + "title":"USER_TAB_COMMENTS", + "uri":"dws_04_0875.html", + "doc_type":"devg", + "p_code":"395", + "code":"624" + }, + { + "desc":"USER_TAB_PARTITIONS displays all table partitions accessible to the current user. Each partition of a partitioned table accessible to the current user has a piece of reco", + "product_code":"dws", + "title":"USER_TAB_PARTITIONS", + "uri":"dws_04_0876.html", + "doc_type":"devg", + "p_code":"395", + "code":"625" + }, + { + "desc":"USER_TABLES displays table information in the current schema.", + "product_code":"dws", + "title":"USER_TABLES", + "uri":"dws_04_0877.html", + "doc_type":"devg", + "p_code":"395", + "code":"626" + }, + { + "desc":"USER_TRIGGERS displays the information about triggers accessible to the current user.", + "product_code":"dws", + "title":"USER_TRIGGERS", + "uri":"dws_04_0878.html", + "doc_type":"devg", + "p_code":"395", + "code":"627" + }, + { + "desc":"USER_VIEWS displays information about all views in the current schema.", + "product_code":"dws", + "title":"USER_VIEWS", + "uri":"dws_04_0879.html", + "doc_type":"devg", + "p_code":"395", + "code":"628" + }, + { + "desc":"V$SESSION displays all session information about the current session.", + "product_code":"dws", + "title":"V$SESSION", + "uri":"dws_04_0880.html", + "doc_type":"devg", + "p_code":"395", + "code":"629" + }, + { + "desc":"V$SESSION_LONGOPS displays the progress of ongoing operations.", + "product_code":"dws", + "title":"V$SESSION_LONGOPS", + "uri":"dws_04_0881.html", + "doc_type":"devg", + "p_code":"395", + "code":"630" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"GUC Parameters", + "uri":"dws_04_0883.html", + "doc_type":"devg", + "p_code":"1", + "code":"631" + }, + { + "desc":"GaussDB(DWS) GUC parameters can control database system behaviors. You can check and adjust the GUC parameters based on your business scenario and data volume.After a clu", + "product_code":"dws", + "title":"Viewing GUC Parameters", + "uri":"dws_04_0884.html", + "doc_type":"devg", + "p_code":"631", + "code":"632" + }, + { + "desc":"To ensure the optimal performance of GaussDB(DWS), you can adjust the GUC parameters in the database.The GUC parameters of GaussDB(DWS) are classified into the following ", + "product_code":"dws", + "title":"Configuring GUC Parameters", + "uri":"dws_04_0885.html", + "doc_type":"devg", + "p_code":"631", + "code":"633" + }, + { + "desc":"The database provides many operation parameters. Configuration of these parameters affects the behavior of the database system. Before modifying these parameters, learn t", + "product_code":"dws", + "title":"GUC Parameter Usage", + "uri":"dws_04_0886.html", + "doc_type":"devg", + "p_code":"631", + "code":"634" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Connection and Authentication", + "uri":"dws_04_0888.html", + "doc_type":"devg", + "p_code":"631", + "code":"635" + }, + { + "desc":"This section describes parameters related to the connection mode between the client and server.Parameter description: Specifies the maximum number of allowed parallel con", + "product_code":"dws", + "title":"Connection Settings", + "uri":"dws_04_0889.html", + "doc_type":"devg", + "p_code":"635", + "code":"636" + }, + { + "desc":"This section describes parameters about how to securely authenticate the client and server.Parameter description: Specifies the longest duration to wait before the client", + "product_code":"dws", + "title":"Security and Authentication (postgresql.conf)", + "uri":"dws_04_0890.html", + "doc_type":"devg", + "p_code":"635", + "code":"637" + }, + { + "desc":"This section describes parameter settings and value ranges for communication libraries.Parameter description: Specifies whether the communication library uses the TCP or ", + "product_code":"dws", + "title":"Communication Library Parameters", + "uri":"dws_04_0891.html", + "doc_type":"devg", + "p_code":"635", + "code":"638" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Resource Consumption", + "uri":"dws_04_0892.html", + "doc_type":"devg", + "p_code":"631", + "code":"639" + }, + { + "desc":"This section describes memory parameters.Parameters described in this section take effect only after the database service restarts.Parameter description: Specifies whethe", + "product_code":"dws", + "title":"Memory", + "uri":"dws_04_0893.html", + "doc_type":"devg", + "p_code":"639", + "code":"640" + }, + { + "desc":"This section describes parameters related to statement disk space control, which are used to limit the disk space usage of statements.Parameter description: Specifies the", + "product_code":"dws", + "title":"Statement Disk Space Control", + "uri":"dws_04_0894.html", + "doc_type":"devg", + "p_code":"639", + "code":"641" + }, + { + "desc":"This section describes kernel resource parameters. Whether these parameters take effect depends on OS settings.Parameter description: Specifies the maximum number of simu", + "product_code":"dws", + "title":"Kernel Resources", + "uri":"dws_04_0895.html", + "doc_type":"devg", + "p_code":"639", + "code":"642" + }, + { + "desc":"This feature allows administrators to reduce the I/O impact of the VACUUM and ANALYZE statements on concurrent database activities. It is often more important to prevent ", + "product_code":"dws", + "title":"Cost-based Vacuum Delay", + "uri":"dws_04_0896.html", + "doc_type":"devg", + "p_code":"639", + "code":"643" + }, + { + "desc":"Parameter description: Specifies whether O&M personnel are allowed to generate some ADIO logs to locate ADIO issues. This parameter is used only by developers. Common use", + "product_code":"dws", + "title":"Asynchronous I/O Operations", + "uri":"dws_04_0898.html", + "doc_type":"devg", + "p_code":"639", + "code":"644" + }, + { + "desc":"GaussDB(DWS) provides a parallel data import function that enables a large amount of data to be imported in a fast and efficient manner. This section describes parameters", + "product_code":"dws", + "title":"Parallel Data Import", + "uri":"dws_04_0899.html", + "doc_type":"devg", + "p_code":"631", + "code":"645" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Write Ahead Logs", + "uri":"dws_04_0900.html", + "doc_type":"devg", + "p_code":"631", + "code":"646" + }, + { + "desc":"Parameter description: Specifies the level of the information that is written to WALs.Type: POSTMASTERValue range: enumerated valuesminimalAdvantages: Certain bulk operat", + "product_code":"dws", + "title":"Settings", + "uri":"dws_04_0901.html", + "doc_type":"devg", + "p_code":"646", + "code":"647" + }, + { + "desc":"Parameter description: Specifies the minimum number of WAL segment files in the period specified by checkpoint_timeout. The size of each log file is 16 MB.Type: SIGHUPVal", + "product_code":"dws", + "title":"Checkpoints", + "uri":"dws_04_0902.html", + "doc_type":"devg", + "p_code":"646", + "code":"648" + }, + { + "desc":"Parameter description: When archive_mode is enabled, completed WAL segments are sent to archive storage by setting archive_command.Type: SIGHUPValue range: Booleanon: The", + "product_code":"dws", + "title":"Archiving", + "uri":"dws_04_0903.html", + "doc_type":"devg", + "p_code":"646", + "code":"649" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"HA Replication", + "uri":"dws_04_0904.html", + "doc_type":"devg", + "p_code":"631", + "code":"650" + }, + { + "desc":"Parameter description: Specifies the number of Xlog file segments. Specifies the minimum number of transaction log files stored in the pg_xlog directory. The standby serv", + "product_code":"dws", + "title":"Sending Server", + "uri":"dws_04_0905.html", + "doc_type":"devg", + "p_code":"650", + "code":"651" + }, + { + "desc":"Parameter description: Specifies the number of transactions by which VACUUM will defer the cleanup of invalid row-store table records, so that VACUUM and VACUUM FULL do n", + "product_code":"dws", + "title":"Primary Server", + "uri":"dws_04_0906.html", + "doc_type":"devg", + "p_code":"650", + "code":"652" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Query Planning", + "uri":"dws_04_0908.html", + "doc_type":"devg", + "p_code":"631", + "code":"653" + }, + { + "desc":"These configuration parameters provide a crude method of influencing the query plans chosen by the query optimizer. If the default plan chosen by the optimizer for a part", + "product_code":"dws", + "title":"Optimizer Method Configuration", + "uri":"dws_04_0909.html", + "doc_type":"devg", + "p_code":"653", + "code":"654" + }, + { + "desc":"This section describes the optimizer cost constants. The cost variables described in this section are measured on an arbitrary scale. Only their relative values matter, t", + "product_code":"dws", + "title":"Optimizer Cost Constants", + "uri":"dws_04_0910.html", + "doc_type":"devg", + "p_code":"653", + "code":"655" + }, + { + "desc":"This section describes parameters related to genetic query optimizer. The genetic query optimizer (GEQO) is an algorithm that plans queries by using heuristic searching. ", + "product_code":"dws", + "title":"Genetic Query Optimizer", + "uri":"dws_04_0911.html", + "doc_type":"devg", + "p_code":"653", + "code":"656" + }, + { + "desc":"Parameter description: Specifies the default statistics target for table columns without a column-specific target set via ALTER TABLE SET STATISTICS. If this parameter is", + "product_code":"dws", + "title":"Other Optimizer Options", + "uri":"dws_04_0912.html", + "doc_type":"devg", + "p_code":"653", + "code":"657" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Error Reporting and Logging", + "uri":"dws_04_0913.html", + "doc_type":"devg", + "p_code":"631", + "code":"658" + }, + { + "desc":"Parameter description: Specifies the writing mode of the log files when logging_collector is set to on.Type: SIGHUPValue range: Booleanon indicates that GaussDB(DWS) over", + "product_code":"dws", + "title":"Logging Destination", + "uri":"dws_04_0914.html", + "doc_type":"devg", + "p_code":"658", + "code":"659" + }, + { + "desc":"Parameter description: Specifies which level of messages are sent to the client. Each level covers all the levels following it. The lower the level is, the fewer messages", + "product_code":"dws", + "title":"Logging Time", + "uri":"dws_04_0915.html", + "doc_type":"devg", + "p_code":"658", + "code":"660" + }, + { + "desc":"Parameter description: Specifies whether to print parsing tree results.Type: SIGHUPValue range: Booleanon indicates the printing result function is enabled.off indicates ", + "product_code":"dws", + "title":"Logging Content", + "uri":"dws_04_0916.html", + "doc_type":"devg", + "p_code":"658", + "code":"661" + }, + { + "desc":"During cluster running, error scenarios can be detected in a timely manner to inform users as soon as possible.Parameter description: Enables the alarm detection thread t", + "product_code":"dws", + "title":"Alarm Detection", + "uri":"dws_04_0918.html", + "doc_type":"devg", + "p_code":"631", + "code":"662" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Statistics During the Database Running", + "uri":"dws_04_0919.html", + "doc_type":"devg", + "p_code":"631", + "code":"663" + }, + { + "desc":"The query and index statistics collector is used to collect statistics during database running. The statistics include the times of inserting and updating a table and an ", + "product_code":"dws", + "title":"Query and Index Statistics Collector", + "uri":"dws_04_0920.html", + "doc_type":"devg", + "p_code":"663", + "code":"664" + }, + { + "desc":"During the running of the database, the lock access, disk I/O operation, and invalid message process are involved. All these operations are the bottleneck of the database", + "product_code":"dws", + "title":"Performance Statistics", + "uri":"dws_04_0921.html", + "doc_type":"devg", + "p_code":"663", + "code":"665" + }, + { + "desc":"If database resource usage is not controlled, concurrent tasks easily preempt resources. As a result, the OS will be overloaded and cannot respond to user tasks; or even ", + "product_code":"dws", + "title":"Workload Management", + "uri":"dws_04_0922.html", + "doc_type":"devg", + "p_code":"631", + "code":"666" + }, + { + "desc":"The automatic cleanup process (autovacuum) in the system automatically runs the VACUUM and ANALYZE commands to recycle the record space marked by the deleted status and u", + "product_code":"dws", + "title":"Automatic Cleanup", + "uri":"dws_04_0923.html", + "doc_type":"devg", + "p_code":"631", + "code":"667" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Default Settings of Client Connection", + "uri":"dws_04_0924.html", + "doc_type":"devg", + "p_code":"631", + "code":"668" + }, + { + "desc":"This section describes related default parameters involved in the execution of SQL statements.Parameter description: Specifies the order in which schemas are searched whe", + "product_code":"dws", + "title":"Statement Behavior", + "uri":"dws_04_0925.html", + "doc_type":"devg", + "p_code":"668", + "code":"669" + }, + { + "desc":"This section describes parameters related to the time format setting.Parameter description: Specifies the display format for date and time values, as well as the rules fo", + "product_code":"dws", + "title":"Zone and Formatting", + "uri":"dws_04_0926.html", + "doc_type":"devg", + "p_code":"668", + "code":"670" + }, + { + "desc":"This section describes the default database loading parameters of the database system.Parameter description: Specifies the path for saving the shared database files that ", + "product_code":"dws", + "title":"Other Default Parameters", + "uri":"dws_04_0927.html", + "doc_type":"devg", + "p_code":"668", + "code":"671" + }, + { + "desc":"In GaussDB(DWS), a deadlock may occur when concurrently executed transactions compete for resources. This section describes parameters used for managing transaction lock ", + "product_code":"dws", + "title":"Lock Management", + "uri":"dws_04_0928.html", + "doc_type":"devg", + "p_code":"631", + "code":"672" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Version and Platform Compatibility", + "uri":"dws_04_0929.html", + "doc_type":"devg", + "p_code":"631", + "code":"673" + }, + { + "desc":"This section describes the parameter control of the downward compatibility and external compatibility features of GaussDB(DWS). Backward compatibility of the database sys", + "product_code":"dws", + "title":"Compatibility with Earlier Versions", + "uri":"dws_04_0930.html", + "doc_type":"devg", + "p_code":"673", + "code":"674" + }, + { + "desc":"Many platforms use the database system. External compatibility of the database system provides a lot of convenience for platforms.Parameter description: Determines whethe", + "product_code":"dws", + "title":"Platform and Client Compatibility", + "uri":"dws_04_0931.html", + "doc_type":"devg", + "p_code":"673", + "code":"675" + }, + { + "desc":"This section describes parameters used for controlling the methods that the server processes an error occurring in the database system.Parameter description: Specifies wh", + "product_code":"dws", + "title":"Fault Tolerance", + "uri":"dws_04_0932.html", + "doc_type":"devg", + "p_code":"631", + "code":"676" + }, + { + "desc":"When a connection pool is used to access the database, database connections are established and then stored in the memory as objects during system running. When you need ", + "product_code":"dws", + "title":"Connection Pool Parameters", + "uri":"dws_04_0933.html", + "doc_type":"devg", + "p_code":"631", + "code":"677" + }, + { + "desc":"This section describes the settings and value ranges of cluster transaction parameters.Parameter description: Specifies the isolation level of the current transaction.Typ", + "product_code":"dws", + "title":"Cluster Transaction Parameters", + "uri":"dws_04_0934.html", + "doc_type":"devg", + "p_code":"631", + "code":"678" + }, + { + "desc":"Parameter description: Specifies whether to enable the lightweight column-store update.Type: USERSETValue range: Booleanon indicates that the lightweight column-store upd", + "product_code":"dws", + "title":"Developer Operations", + "uri":"dws_04_0936.html", + "doc_type":"devg", + "p_code":"631", + "code":"679" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Auditing", + "uri":"dws_04_0937.html", + "doc_type":"devg", + "p_code":"631", + "code":"680" + }, + { + "desc":"Parameter description: Specifies whether to enable or disable the audit process. After the audit process is enabled, the auditing information written by the background pr", + "product_code":"dws", + "title":"Audit Switch", + "uri":"dws_04_0938.html", + "doc_type":"devg", + "p_code":"680", + "code":"681" + }, + { + "desc":"Parameter description: Specifies whether to audit successful operations in GaussDB(DWS). Set this parameter as required.Type: SIGHUPValue range: a stringnone: indicates t", + "product_code":"dws", + "title":"Operation Audit", + "uri":"dws_04_0940.html", + "doc_type":"devg", + "p_code":"680", + "code":"682" + }, + { + "desc":"The automatic rollback transaction can be monitored and its statement problems can be located by setting the transaction timeout warning. In addition, the statements with", + "product_code":"dws", + "title":"Transaction Monitoring", + "uri":"dws_04_0941.html", + "doc_type":"devg", + "p_code":"631", + "code":"683" + }, + { + "desc":"Parameter description: If an SQL statement involves tables belonging to different groups, you can enable this parameter to push the execution plan of the statement to imp", + "product_code":"dws", + "title":"Miscellaneous Parameters", + "uri":"dws_04_0945.html", + "doc_type":"devg", + "p_code":"631", + "code":"684" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Glossary", + "uri":"dws_04_0946.html", + "doc_type":"devg", + "p_code":"1", + "code":"685" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"SQL Syntax Reference", + "uri":"dws_04_2000.html", + "doc_type":"devg", + "p_code":"", + "code":"686" + }, + { + "desc":"SQL is a standard computer language used to control the access to databases and manage data in databases.SQL provides different statements to enable you to:Query data.Ins", + "product_code":"dws", + "title":"GaussDB(DWS) SQL", + "uri":"dws_06_0001.html", + "doc_type":"devg", + "p_code":"686", + "code":"687" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Differences Between GaussDB(DWS) and PostgreSQL", + "uri":"dws_06_0002.html", + "doc_type":"devg", + "p_code":"686", + "code":"688" + }, + { + "desc":"GaussDB(DWS) gsql differs from PostgreSQL psql in that the former has made the following changes to enhance security:User passwords cannot be set by running the \\password", + "product_code":"dws", + "title":"GaussDB(DWS) gsql, PostgreSQL psql, and libpq", + "uri":"dws_06_0003.html", + "doc_type":"devg", + "p_code":"688", + "code":"689" + }, + { + "desc":"For details about supported data types by GaussDB(DWS), see Data Types.The following PostgreSQL data type is not supported:Lines, a geometric typepg_node_tree", + "product_code":"dws", + "title":"Data Type Differences", + "uri":"dws_06_0004.html", + "doc_type":"devg", + "p_code":"688", + "code":"690" + }, + { + "desc":"For details about the functions supported by GaussDB(DWS), see Functions and Operators.The following PostgreSQL functions are not supported:Enum support functionsAccess p", + "product_code":"dws", + "title":"Function Differences", + "uri":"dws_06_0005.html", + "doc_type":"devg", + "p_code":"688", + "code":"691" + }, + { + "desc":"Table inheritanceTable creation features:Use REFERENCES reftable [ (refcolumn) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] t", + "product_code":"dws", + "title":"PostgreSQL Features Unsupported by GaussDB(DWS)", + "uri":"dws_06_0006.html", + "doc_type":"devg", + "p_code":"688", + "code":"692" + }, + { + "desc":"The SQL contains reserved and non-reserved words. Standards require that reserved keywords not be used as other identifiers. Non-reserved keywords have special meanings o", + "product_code":"dws", + "title":"Keyword", + "uri":"dws_06_0007.html", + "doc_type":"devg", + "p_code":"686", + "code":"693" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Data Types", + "uri":"dws_06_0008.html", + "doc_type":"devg", + "p_code":"686", + "code":"694" + }, + { + "desc":"Numeric types consist of two-, four-, and eight-byte integers, four- and eight-byte floating-point numbers, and selectable-precision decimals.For details about numeric op", + "product_code":"dws", + "title":"Numeric Types", + "uri":"dws_06_0009.html", + "doc_type":"devg", + "p_code":"694", + "code":"695" + }, + { + "desc":"The money type stores a currency amount with fixed fractional precision. The range shown in Table 1 assumes there are two fractional digits. Input is accepted in a variet", + "product_code":"dws", + "title":"Monetary Types", + "uri":"dws_06_0010.html", + "doc_type":"devg", + "p_code":"694", + "code":"696" + }, + { + "desc":"Valid literal values for the \"true\" state are:TRUE, 't', 'true', 'y', 'yes', '1'Valid literal values for the \"false\" state include:FALSE, 'f', 'false', 'n', 'no', '0'TRUE", + "product_code":"dws", + "title":"Boolean Type", + "uri":"dws_06_0011.html", + "doc_type":"devg", + "p_code":"694", + "code":"697" + }, + { + "desc":"Table 1 lists the character types that can be used in GaussDB(DWS). For string operators and related built-in functions, see Character Processing Functions and Operators.", + "product_code":"dws", + "title":"Character Types", + "uri":"dws_06_0012.html", + "doc_type":"devg", + "p_code":"694", + "code":"698" + }, + { + "desc":"Table 1 lists the binary data types that can be used in GaussDB(DWS).In addition to the size limitation on each column, the total size of each tuple is 8203 bytes less th", + "product_code":"dws", + "title":"Binary Data Types", + "uri":"dws_06_0013.html", + "doc_type":"devg", + "p_code":"694", + "code":"699" + }, + { + "desc":"Table 1 lists date and time types supported by GaussDB(DWS). For the operators and built-in functions of the types, see Date and Time Processing Functions and Operators.I", + "product_code":"dws", + "title":"Date/Time Types", + "uri":"dws_06_0014.html", + "doc_type":"devg", + "p_code":"694", + "code":"700" + }, + { + "desc":"Table 1 lists the geometric types that can be used in GaussDB(DWS). The most fundamental type, the point, forms the basis for all of the other types.A rich set of functio", + "product_code":"dws", + "title":"Geometric Types", + "uri":"dws_06_0015.html", + "doc_type":"devg", + "p_code":"694", + "code":"701" + }, + { + "desc":"GaussDB(DWS) offers data types to store IPv4, IPv6, and MAC addresses.It is better to use network address types instead of plaintext types to store IPv4, IPv6, and MAC ad", + "product_code":"dws", + "title":"Network Address Types", + "uri":"dws_06_0016.html", + "doc_type":"devg", + "p_code":"694", + "code":"702" + }, + { + "desc":"Bit strings are strings of 1's and 0's. They can be used to store bit masks.GaussDB(DWS) supports two SQL bit types: bit(n) and bit varying(n), where n is a positive inte", + "product_code":"dws", + "title":"Bit String Types", + "uri":"dws_06_0017.html", + "doc_type":"devg", + "p_code":"694", + "code":"703" + }, + { + "desc":"GaussDB(DWS) offers two data types that are designed to support full text search. The tsvector type represents a document in a form optimized for text search. The tsquery", + "product_code":"dws", + "title":"Text Search Types", + "uri":"dws_06_0018.html", + "doc_type":"devg", + "p_code":"694", + "code":"704" + }, + { + "desc":"The data type UUID stores Universally Unique Identifiers (UUID) as defined by RFC 4122, ISO/IEF 9834-8:2005, and related standards. This identifier is a 128-bit quantity ", + "product_code":"dws", + "title":"UUID Type", + "uri":"dws_06_0019.html", + "doc_type":"devg", + "p_code":"694", + "code":"705" + }, + { + "desc":"JSON data types are for storing JavaScript Object Notation (JSON) data. Such data can also be stored as TEXT, but the JSON data type has the advantage of checking that ea", + "product_code":"dws", + "title":"JSON Types", + "uri":"dws_06_0020.html", + "doc_type":"devg", + "p_code":"694", + "code":"706" + }, + { + "desc":"HyperLoglog (HLL) is an approximation algorithm for efficiently counting the number of distinct values in a data set. It features faster computing and lower space usage. ", + "product_code":"dws", + "title":"HLL Data Types", + "uri":"dws_06_0021.html", + "doc_type":"devg", + "p_code":"694", + "code":"707" + }, + { + "desc":"Object identifiers (OIDs) are used internally by GaussDB(DWS) as primary keys for various system catalogs. OIDs are not added to user-created tables by the system. The OI", + "product_code":"dws", + "title":"Object Identifier Types", + "uri":"dws_06_0022.html", + "doc_type":"devg", + "p_code":"694", + "code":"708" + }, + { + "desc":"GaussDB(DWS) has a number of special-purpose entries that are collectively called pseudo-types. A pseudo-type cannot be used as a column data type, but it can be used to ", + "product_code":"dws", + "title":"Pseudo-Types", + "uri":"dws_06_0023.html", + "doc_type":"devg", + "p_code":"694", + "code":"709" + }, + { + "desc":"Table 1 lists the data types supported by column-store tables.", + "product_code":"dws", + "title":"Data Types Supported by Column-Store Tables", + "uri":"dws_06_0024.html", + "doc_type":"devg", + "p_code":"694", + "code":"710" + }, + { + "desc":"XML data type stores Extensible Markup Language (XML) formatted data. Such data can also be stored as text, but the advantage of the XML data type is that it checks wheth", + "product_code":"dws", + "title":"XML", + "uri":"dws_06_0025.html", + "doc_type":"devg", + "p_code":"694", + "code":"711" + }, + { + "desc":"Table 1 lists the constants and macros that can be used in GaussDB(DWS).", + "product_code":"dws", + "title":"Constant and Macro", + "uri":"dws_06_0026.html", + "doc_type":"devg", + "p_code":"686", + "code":"712" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Functions and Operators", + "uri":"dws_06_0027.html", + "doc_type":"devg", + "p_code":"686", + "code":"713" + }, + { + "desc":"The usual logical operators include AND, OR, and NOT. SQL uses a three-valued logical system with true, false, and null, which represents \"unknown\". Their priorities are ", + "product_code":"dws", + "title":"Logical Operators", + "uri":"dws_06_0028.html", + "doc_type":"devg", + "p_code":"713", + "code":"714" + }, + { + "desc":"Comparison operators are available for all data types and return Boolean values.All comparison operators are binary operators. Only data types that are the same or can be", + "product_code":"dws", + "title":"Comparison Operators", + "uri":"dws_06_0029.html", + "doc_type":"devg", + "p_code":"713", + "code":"715" + }, + { + "desc":"String functions and operators provided by GaussDB(DWS) are for concatenating strings with each other, concatenating strings with non-strings, and matching the patterns o", + "product_code":"dws", + "title":"Character Processing Functions and Operators", + "uri":"dws_06_0030.html", + "doc_type":"devg", + "p_code":"713", + "code":"716" + }, + { + "desc":"SQL defines some string functions that use keywords, rather than commas, to separate arguments.octet_length(string)Description: Number of bytes in binary stringReturn typ", + "product_code":"dws", + "title":"Binary String Functions and Operators", + "uri":"dws_06_0031.html", + "doc_type":"devg", + "p_code":"713", + "code":"717" + }, + { + "desc":"Aside from the usual comparison operators, the following operators can be used. Bit string operands of &, |, and # must be of equal length. When bit shifting, the origina", + "product_code":"dws", + "title":"Bit String Functions and Operators", + "uri":"dws_06_0032.html", + "doc_type":"devg", + "p_code":"713", + "code":"718" + }, + { + "desc":"There are three separate approaches to pattern matching provided by the database: the traditional SQL LIKE operator, the more recent SIMILAR TO operator, and POSIX-style ", + "product_code":"dws", + "title":"Pattern Matching Operators", + "uri":"dws_06_0033.html", + "doc_type":"devg", + "p_code":"713", + "code":"719" + }, + { + "desc":"+Description: AdditionFor example:SELECT 2+3 AS RESULT;\n result \n--------\n 5\n(1 row)Description: AdditionFor example:-Description: SubtractionFor example:SELECT 2-3 ", + "product_code":"dws", + "title":"Mathematical Functions and Operators", + "uri":"dws_06_0034.html", + "doc_type":"devg", + "p_code":"713", + "code":"720" + }, + { + "desc":"When the user uses date/time operators, explicit type prefixes are modified for corresponding operands to ensure that the operands parsed by the database are consistent w", + "product_code":"dws", + "title":"Date and Time Processing Functions and Operators", + "uri":"dws_06_0035.html", + "doc_type":"devg", + "p_code":"713", + "code":"721" + }, + { + "desc":"cast(x as y)Description: Converts x into the type specified by y.For example:SELECT cast('22-oct-1997' as timestamp);\n timestamp \n---------------------\n 1997-10", + "product_code":"dws", + "title":"Type Conversion Functions", + "uri":"dws_06_0036.html", + "doc_type":"devg", + "p_code":"713", + "code":"722" + }, + { + "desc":"+Description: TranslationFor example:SELECT box '((0,0),(1,1))' + point '(2.0,0)' AS RESULT;\n result \n-------------\n (3,1),(2,0)\n(1 row)Description: TranslationFor e", + "product_code":"dws", + "title":"Geometric Functions and Operators", + "uri":"dws_06_0037.html", + "doc_type":"devg", + "p_code":"713", + "code":"723" + }, + { + "desc":"The operators <<, <<=, >>, and >>= test for subnet inclusion. They consider only the network parts of the two addresses (ignoring any host part) and determine whether one", + "product_code":"dws", + "title":"Network Address Functions and Operators", + "uri":"dws_06_0038.html", + "doc_type":"devg", + "p_code":"713", + "code":"724" + }, + { + "desc":"@@Description: Specifies whether the tsvector-typed words match the tsquery-typed words.For example:SELECT to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') AS ", + "product_code":"dws", + "title":"Text Search Functions and Operators", + "uri":"dws_06_0039.html", + "doc_type":"devg", + "p_code":"713", + "code":"725" + }, + { + "desc":"UUID functions are used to generate UUID data (see UUID Type).uuid_generate_v1()Description: Generates a UUID sequence number.Return type: UUIDExample:SELECT uuid_generat", + "product_code":"dws", + "title":"UUID Functions", + "uri":"dws_06_0040.html", + "doc_type":"devg", + "p_code":"713", + "code":"726" + }, + { + "desc":"JSON functions are used to generate JSON data (see JSON Types).array_to_json(anyarray [, pretty_bool])Description: Returns the array as JSON. A multi-dimensional array be", + "product_code":"dws", + "title":"JSON Functions", + "uri":"dws_06_0041.html", + "doc_type":"devg", + "p_code":"713", + "code":"727" + }, + { + "desc":"hll_hash_boolean(bool)Description: Hashes data of the bool type.Return type: hll_hashvalFor example:SELECT hll_hash_boolean(FALSE);\n hll_hash_boolean \n----------------", + "product_code":"dws", + "title":"HLL Functions and Operators", + "uri":"dws_06_0042.html", + "doc_type":"devg", + "p_code":"713", + "code":"728" + }, + { + "desc":"The sequence functions provide a simple method to ensure security of multiple users for users to obtain sequence values from sequence objects.The hybrid data warehouse (s", + "product_code":"dws", + "title":"SEQUENCE Functions", + "uri":"dws_06_0043.html", + "doc_type":"devg", + "p_code":"713", + "code":"729" + }, + { + "desc":"=Description: Specifies whether two arrays are equal.For example:SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] AS RESULT ;\n result \n--------\n t\n(1 row)Description: Spec", + "product_code":"dws", + "title":"Array Functions and Operators", + "uri":"dws_06_0044.html", + "doc_type":"devg", + "p_code":"713", + "code":"730" + }, + { + "desc":"=Description: EqualsFor example:SELECT int4range(1,5) = '[1,4]'::int4range AS RESULT;\n result\n--------\n t\n(1 row)Description: EqualsFor example:<>Description: Does not eq", + "product_code":"dws", + "title":"Range Functions and Operators", + "uri":"dws_06_0045.html", + "doc_type":"devg", + "p_code":"713", + "code":"731" + }, + { + "desc":"sum(expression)Description: Sum of expression across all input valuesReturn type:Generally, same as the argument data type. In the following cases, type conversion occurs", + "product_code":"dws", + "title":"Aggregate Functions", + "uri":"dws_06_0046.html", + "doc_type":"devg", + "p_code":"713", + "code":"732" + }, + { + "desc":"Regular aggregate functions return a single value calculated from values in a row, or group all rows into a single output row. Window functions perform a calculation acro", + "product_code":"dws", + "title":"Window Functions", + "uri":"dws_06_0047.html", + "doc_type":"devg", + "p_code":"713", + "code":"733" + }, + { + "desc":"gs_password_deadline()Description: Indicates the number of remaining days before the password of the current user expires. After the password expires, the system prompts ", + "product_code":"dws", + "title":"Security Functions", + "uri":"dws_06_0048.html", + "doc_type":"devg", + "p_code":"713", + "code":"734" + }, + { + "desc":"generate_series(start, stop)Description: Generates a series of values, from start to stop with a step size of one.Parameter type: int, bigint, or numericReturn type: seto", + "product_code":"dws", + "title":"Set Returning Functions", + "uri":"dws_06_0049.html", + "doc_type":"devg", + "p_code":"713", + "code":"735" + }, + { + "desc":"coalesce(expr1, expr2, ..., exprn)Description: Returns the first argument that is not NULL in the argument list.COALESCE(expr1, expr2) is equivalent to CASE WHEN expr1 IS", + "product_code":"dws", + "title":"Conditional Expression Functions", + "uri":"dws_06_0050.html", + "doc_type":"devg", + "p_code":"713", + "code":"736" + }, + { + "desc":"current_catalogDescription: Name of the current database (called \"catalog\" in the SQL standard)Return type: nameFor example:SELECT current_catalog;\n current_database\n----", + "product_code":"dws", + "title":"System Information Functions", + "uri":"dws_06_0051.html", + "doc_type":"devg", + "p_code":"713", + "code":"737" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"System Administration Functions", + "uri":"dws_06_0052.html", + "doc_type":"devg", + "p_code":"713", + "code":"738" + }, + { + "desc":"Configuration setting functions are used for querying and modifying configuration parameters during running.current_setting(setting_name)Description: Specifies the curren", + "product_code":"dws", + "title":"Configuration Settings Functions", + "uri":"dws_06_0053.html", + "doc_type":"devg", + "p_code":"738", + "code":"739" + }, + { + "desc":"Universal file access functions provide local access interfaces for files on a database server. Only files in the database cluster directory and the log_directory directo", + "product_code":"dws", + "title":"Universal File Access Functions", + "uri":"dws_06_0054.html", + "doc_type":"devg", + "p_code":"738", + "code":"740" + }, + { + "desc":"Server signaling functions send control signals to other server processes. Only system administrators can use these functions.pg_cancel_backend(pid int)Description: Cance", + "product_code":"dws", + "title":"Server Signaling Functions", + "uri":"dws_06_0055.html", + "doc_type":"devg", + "p_code":"738", + "code":"741" + }, + { + "desc":"Backup control functions help online backup.pg_create_restore_point(name text)Description: Creates a named point for performing the restore operation (restricted to syste", + "product_code":"dws", + "title":"Backup and Restoration Control Functions", + "uri":"dws_06_0056.html", + "doc_type":"devg", + "p_code":"738", + "code":"742" + }, + { + "desc":"Snapshot synchronization functions save the current snapshot and return its identifier.pg_export_snapshot()Description: Saves the current snapshot and returns its identif", + "product_code":"dws", + "title":"Snapshot Synchronization Functions", + "uri":"dws_06_0057.html", + "doc_type":"devg", + "p_code":"738", + "code":"743" + }, + { + "desc":"Database object size functions calculate the actual disk space used by database objects.pg_column_size(any)Description: Specifies the number of bytes used to store a part", + "product_code":"dws", + "title":"Database Object Functions", + "uri":"dws_06_0058.html", + "doc_type":"devg", + "p_code":"738", + "code":"744" + }, + { + "desc":"Advisory lock functions manage advisory locks. These functions are only for internal use currently.pg_advisory_lock(key bigint)Description: Obtains an exclusive session-l", + "product_code":"dws", + "title":"Advisory Lock Functions", + "uri":"dws_06_0059.html", + "doc_type":"devg", + "p_code":"738", + "code":"745" + }, + { + "desc":"pg_get_residualfiles()Description: Obtains all residual file records of the current node. This function is an instance-level function and is irrelevant to the current dat", + "product_code":"dws", + "title":"Residual File Management Functions", + "uri":"dws_06_0060.html", + "doc_type":"devg", + "p_code":"738", + "code":"746" + }, + { + "desc":"A replication function synchronizes logs and data between instances. It is a statistics or operation method provided by the system to implement HA.Replication functions e", + "product_code":"dws", + "title":"Replication Functions", + "uri":"dws_06_0061.html", + "doc_type":"devg", + "p_code":"738", + "code":"747" + }, + { + "desc":"pgxc_pool_check()Description: Checks whether the connection data buffered in the pool is consistent with pgxc_node.Return type: booleanDescription: Checks whether the con", + "product_code":"dws", + "title":"Other Functions", + "uri":"dws_06_0062.html", + "doc_type":"devg", + "p_code":"738", + "code":"748" + }, + { + "desc":"This section describes the functions of the resource management module.gs_wlm_readjust_user_space(oid)Description: This function calibrates the permanent storage space of", + "product_code":"dws", + "title":"Resource Management Functions", + "uri":"dws_06_0063.html", + "doc_type":"devg", + "p_code":"738", + "code":"749" + }, + { + "desc":"Data redaction functions are used to mask and protect sensitive data. Generally, you are advised to bind these functions to the columns to be redacted based on the data r", + "product_code":"dws", + "title":"Data Redaction Functions", + "uri":"dws_06_0064.html", + "doc_type":"devg", + "p_code":"713", + "code":"750" + }, + { + "desc":"Statistics information functions are divided into the following two categories: functions that access databases, using the OID of each table or index in a database to mar", + "product_code":"dws", + "title":"Statistics Information Functions", + "uri":"dws_06_0065.html", + "doc_type":"devg", + "p_code":"713", + "code":"751" + }, + { + "desc":"pg_get_triggerdef(oid)Description: Obtains the definition information of a trigger.Parameter: OID of the trigger to be queriedReturn type: textExample:select pg_get_trigg", + "product_code":"dws", + "title":"Trigger Functions", + "uri":"dws_06_0066.html", + "doc_type":"devg", + "p_code":"713", + "code":"752" + }, + { + "desc":"XMLPARSE ( { DOCUMENT | CONTENT } value)Description: Generates an XML value from character data.Return type: XMLExample:XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS typ", + "product_code":"dws", + "title":"XML Functions", + "uri":"dws_06_0067.html", + "doc_type":"devg", + "p_code":"713", + "code":"753" + }, + { + "desc":"The pv_memory_profiling(type int) and environment variable MALLOC_CONF are used by GaussDB(DWS) to control the enabling and disabling of the memory allocation call stack ", + "product_code":"dws", + "title":"Call Stack Recording Functions", + "uri":"dws_06_0068.html", + "doc_type":"devg", + "p_code":"713", + "code":"754" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Expressions", + "uri":"dws_06_0069.html", + "doc_type":"devg", + "p_code":"686", + "code":"755" + }, + { + "desc":"Logical Operators lists the operators and calculation rules of logical expressions.Comparison Operators lists the common comparative operators.In addition to comparative ", + "product_code":"dws", + "title":"Simple Expressions", + "uri":"dws_06_0070.html", + "doc_type":"devg", + "p_code":"755", + "code":"756" + }, + { + "desc":"Data that meets the requirements specified by conditional expressions are filtered during SQL statement execution.Conditional expressions include the following types:CASE", + "product_code":"dws", + "title":"Conditional Expressions", + "uri":"dws_06_0071.html", + "doc_type":"devg", + "p_code":"755", + "code":"757" + }, + { + "desc":"Subquery expressions include the following types:EXISTS/NOT EXISTSFigure 1 shows the syntax of an EXISTS/NOT EXISTS expression.EXISTS/NOT EXISTS::=The parameter of an EXI", + "product_code":"dws", + "title":"Subquery Expressions", + "uri":"dws_06_0072.html", + "doc_type":"devg", + "p_code":"755", + "code":"758" + }, + { + "desc":"expressionIN(value [, ...])The parentheses on the right contain an expression list. The expression result on the left is compared with the content in the expression list.", + "product_code":"dws", + "title":"Array Expressions", + "uri":"dws_06_0073.html", + "doc_type":"devg", + "p_code":"755", + "code":"759" + }, + { + "desc":"Syntax:row_constructor operator row_constructorBoth sides of the row expression are row constructors. The values of both rows must have the same number of fields and they", + "product_code":"dws", + "title":"Row Expressions", + "uri":"dws_06_0074.html", + "doc_type":"devg", + "p_code":"755", + "code":"760" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Type Conversion", + "uri":"dws_06_0075.html", + "doc_type":"devg", + "p_code":"686", + "code":"761" + }, + { + "desc":"SQL is a typed language. That is, every data item has an associated data type which determines its behavior and allowed usage. GaussDB(DWS) has an extensible type system ", + "product_code":"dws", + "title":"Overview", + "uri":"dws_06_0076.html", + "doc_type":"devg", + "p_code":"761", + "code":"762" + }, + { + "desc":"Select the operators to be considered from the pg_operator system catalog. Considered operators are those with the matching name and argument count. If the search path fi", + "product_code":"dws", + "title":"Operators", + "uri":"dws_06_0077.html", + "doc_type":"devg", + "p_code":"761", + "code":"763" + }, + { + "desc":"Select the functions to be considered from the pg_proc system catalog. If a non-schema-qualified function name was used, the functions in the current search path are cons", + "product_code":"dws", + "title":"Functions", + "uri":"dws_06_0078.html", + "doc_type":"devg", + "p_code":"761", + "code":"764" + }, + { + "desc":"Search for an exact match with the target column.Try to convert the expression to the target type. This will succeed if there is a registered cast between the two types. ", + "product_code":"dws", + "title":"Value Storage", + "uri":"dws_06_0079.html", + "doc_type":"devg", + "p_code":"761", + "code":"765" + }, + { + "desc":"SQL UNION constructs must match up possibly dissimilar types to become a single result set. Since all query results from a SELECT UNION statement must appear in a single ", + "product_code":"dws", + "title":"UNION, CASE, and Related Constructs", + "uri":"dws_06_0080.html", + "doc_type":"devg", + "p_code":"761", + "code":"766" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Full Text Search", + "uri":"dws_06_0081.html", + "doc_type":"devg", + "p_code":"686", + "code":"767" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Introduction", + "uri":"dws_06_0082.html", + "doc_type":"devg", + "p_code":"767", + "code":"768" + }, + { + "desc":"Textual search operators have been used in databases for years. GaussDB(DWS) has ~, ~*, LIKE, and ILIKE operators for textual data types, but they lack many essential pro", + "product_code":"dws", + "title":"Full-Text Retrieval", + "uri":"dws_06_0083.html", + "doc_type":"devg", + "p_code":"768", + "code":"769" + }, + { + "desc":"A document is the unit of searching in a full text search system; for example, a magazine article or email message. The text search engine must be able to parse documents", + "product_code":"dws", + "title":"What Is a Document?", + "uri":"dws_06_0084.html", + "doc_type":"devg", + "p_code":"768", + "code":"770" + }, + { + "desc":"Full text search in GaussDB(DWS) is based on the match operator @@, which returns true if a tsvector (document) matches a tsquery (query). It does not matter which data t", + "product_code":"dws", + "title":"Basic Text Matching", + "uri":"dws_06_0085.html", + "doc_type":"devg", + "p_code":"768", + "code":"771" + }, + { + "desc":"Full text search functionality includes the ability to do many more things: skip indexing certain words (stop words), process synonyms, and use sophisticated parsing, for", + "product_code":"dws", + "title":"Configurations", + "uri":"dws_06_0086.html", + "doc_type":"devg", + "p_code":"768", + "code":"772" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Table and index", + "uri":"dws_06_0087.html", + "doc_type":"devg", + "p_code":"767", + "code":"773" + }, + { + "desc":"It is possible to do a full text search without an index.A simple query to print each row that contains the word science in its body column is as follows:DROP SCHEMA IF E", + "product_code":"dws", + "title":"Searching a Table", + "uri":"dws_06_0088.html", + "doc_type":"devg", + "p_code":"773", + "code":"774" + }, + { + "desc":"You can create a GIN index to speed up text searches:The to_tsvector() function accepts one or two augments.If the one-augment version of the index is used, the system wi", + "product_code":"dws", + "title":"Creating an Index", + "uri":"dws_06_0089.html", + "doc_type":"devg", + "p_code":"773", + "code":"775" + }, + { + "desc":"The following is an example of using an index. Run the following statements in a database that uses the UTF-8 or GBK encoding:In this example, table1 has two GIN indexes ", + "product_code":"dws", + "title":"Constraints on Index Use", + "uri":"dws_06_0090.html", + "doc_type":"devg", + "p_code":"773", + "code":"776" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Controlling Text Search", + "uri":"dws_06_0091.html", + "doc_type":"devg", + "p_code":"767", + "code":"777" + }, + { + "desc":"GaussDB(DWS) provides function to_tsvector for converting a document to the tsvector data type.to_tsvector parses a textual document into tokens, reduces the tokens to le", + "product_code":"dws", + "title":"Parsing Documents", + "uri":"dws_06_0092.html", + "doc_type":"devg", + "p_code":"777", + "code":"778" + }, + { + "desc":"GaussDB(DWS) provides functions to_tsquery and plainto_tsquery for converting a query to the tsquery data type. to_tsquery offers access to more features than plainto_tsq", + "product_code":"dws", + "title":"Parsing Queries", + "uri":"dws_06_0093.html", + "doc_type":"devg", + "p_code":"777", + "code":"779" + }, + { + "desc":"Ranking attempts to measure how relevant documents are to a particular query, so that when there are many matches the most relevant ones can be shown first. GaussDB(DWS) ", + "product_code":"dws", + "title":"Ranking Search Results", + "uri":"dws_06_0094.html", + "doc_type":"devg", + "p_code":"777", + "code":"780" + }, + { + "desc":"To present search results it is ideal to show a part of each document and how it is related to the query. Usually, search engines show fragments of the document with mark", + "product_code":"dws", + "title":"Highlighting Results", + "uri":"dws_06_0095.html", + "doc_type":"devg", + "p_code":"777", + "code":"781" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Additional Features", + "uri":"dws_06_0096.html", + "doc_type":"devg", + "p_code":"767", + "code":"782" + }, + { + "desc":"GaussDB(DWS) provides functions and operators that can be used to manipulate documents that are already in tsvector type.tsvector || tsvectorThe tsvector concatenation op", + "product_code":"dws", + "title":"Manipulating tsvector", + "uri":"dws_06_0097.html", + "doc_type":"devg", + "p_code":"782", + "code":"783" + }, + { + "desc":"GaussDB(DWS) provides functions and operators that can be used to manipulate queries that are already in tsquery type.tsquery && tsqueryReturns the AND-combination of the", + "product_code":"dws", + "title":"Manipulating Queries", + "uri":"dws_06_0098.html", + "doc_type":"devg", + "p_code":"782", + "code":"784" + }, + { + "desc":"The ts_rewrite family of functions searches a given tsquery for occurrences of a target subquery, and replace each occurrence with a substitute subquery. In essence this ", + "product_code":"dws", + "title":"Rewriting Queries", + "uri":"dws_06_0099.html", + "doc_type":"devg", + "p_code":"782", + "code":"785" + }, + { + "desc":"The function ts_stat is useful for checking your configuration and for finding stop-word candidates.sqlquery is a text value containing an SQL query which must return a s", + "product_code":"dws", + "title":"Gathering Document Statistics", + "uri":"dws_06_0100.html", + "doc_type":"devg", + "p_code":"782", + "code":"786" + }, + { + "desc":"Text search parsers are responsible for splitting raw document text into tokens and identifying each token's type, where the set of types is defined by the parser itself.", + "product_code":"dws", + "title":"Parsers", + "uri":"dws_06_0101.html", + "doc_type":"devg", + "p_code":"767", + "code":"787" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Dictionaries", + "uri":"dws_06_0102.html", + "doc_type":"devg", + "p_code":"767", + "code":"788" + }, + { + "desc":"A dictionary is used to define stop words, that is, words to be ignored in full-text retrieval.A dictionary can also be used to normalize words so that different derived ", + "product_code":"dws", + "title":"Overview", + "uri":"dws_06_0103.html", + "doc_type":"devg", + "p_code":"788", + "code":"789" + }, + { + "desc":"Stop words are words that are very common, appear in almost every document, and have no discrimination value. Therefore, they can be ignored in the context of full text s", + "product_code":"dws", + "title":"Stop Words", + "uri":"dws_06_0104.html", + "doc_type":"devg", + "p_code":"788", + "code":"790" + }, + { + "desc":"A Simple dictionary operates by converting the input token to lower case and checking it against a list of stop words. If the token is found in the list, an empty array w", + "product_code":"dws", + "title":"Simple Dictionary", + "uri":"dws_06_0105.html", + "doc_type":"devg", + "p_code":"788", + "code":"791" + }, + { + "desc":"A synonym dictionary is used to define, identify, and convert synonyms of tokens. Phrases are not supported (use the thesaurus dictionary in Thesaurus Dictionary).A synon", + "product_code":"dws", + "title":"Synonym Dictionary", + "uri":"dws_06_0106.html", + "doc_type":"devg", + "p_code":"788", + "code":"792" + }, + { + "desc":"A thesaurus dictionary (sometimes abbreviated as TZ) is a collection of words that include relationships between words and phrases, such as broader terms (BT), narrower t", + "product_code":"dws", + "title":"Thesaurus Dictionary", + "uri":"dws_06_0107.html", + "doc_type":"devg", + "p_code":"788", + "code":"793" + }, + { + "desc":"The Ispell dictionary template supports morphological dictionaries, which can normalize many different linguistic forms of a word into the same lexeme. For example, an En", + "product_code":"dws", + "title":"Ispell Dictionary", + "uri":"dws_06_0108.html", + "doc_type":"devg", + "p_code":"788", + "code":"794" + }, + { + "desc":"A Snowball dictionary is based on a project by Martin Porter and is used for stem analysis, providing stemming algorithms for many languages. GaussDB(DWS) provides predef", + "product_code":"dws", + "title":"Snowball Dictionary", + "uri":"dws_06_0109.html", + "doc_type":"devg", + "p_code":"788", + "code":"795" + }, + { + "desc":"Text search configuration specifies the following components required for converting a document into a tsvector:A parser, decomposes a text into tokens.Dictionary list, c", + "product_code":"dws", + "title":"Configuration Examples", + "uri":"dws_06_0110.html", + "doc_type":"devg", + "p_code":"767", + "code":"796" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Testing and Debugging Text Search", + "uri":"dws_06_0111.html", + "doc_type":"devg", + "p_code":"767", + "code":"797" + }, + { + "desc":"The function ts_debug allows easy testing of a text search configuration.ts_debug displays information about every token of document as produced by the parser and process", + "product_code":"dws", + "title":"Testing a Configuration", + "uri":"dws_06_0112.html", + "doc_type":"devg", + "p_code":"797", + "code":"798" + }, + { + "desc":"The ts_parse function allows direct testing of a text search parser.ts_parse parses the given document and returns a series of records, one for each token produced by par", + "product_code":"dws", + "title":"Testing a Parser", + "uri":"dws_06_0113.html", + "doc_type":"devg", + "p_code":"797", + "code":"799" + }, + { + "desc":"The ts_lexize function facilitates dictionary testing.ts_lexize(dict regdictionary, token text) returns text[] ts_lexize returns an array of lexemes if the input token is", + "product_code":"dws", + "title":"Testing a Dictionary", + "uri":"dws_06_0114.html", + "doc_type":"devg", + "p_code":"797", + "code":"800" + }, + { + "desc":"The current limitations of GaussDB(DWS)'s full text search are:The length of each lexeme must be less than 2 KB.The length of a tsvector (lexemes + positions) must be les", + "product_code":"dws", + "title":"Limitations", + "uri":"dws_06_0115.html", + "doc_type":"devg", + "p_code":"767", + "code":"801" + }, + { + "desc":"GaussDB(DWS) runs SQL statements to perform different system operations, such as setting variables, displaying the execution plan, and collecting garbage data.For details", + "product_code":"dws", + "title":"System Operation", + "uri":"dws_06_0116.html", + "doc_type":"devg", + "p_code":"686", + "code":"802" + }, + { + "desc":"A transaction is a user-defined sequence of database operations, which form an integral unit of work.GaussDB(DWS) starts a transaction using START TRANSACTION and BEGIN. ", + "product_code":"dws", + "title":"Controlling Transactions", + "uri":"dws_06_0117.html", + "doc_type":"devg", + "p_code":"686", + "code":"803" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"DDL Syntax", + "uri":"dws_06_0118.html", + "doc_type":"devg", + "p_code":"686", + "code":"804" + }, + { + "desc":"Data definition language (DDL) is used to define or modify an object in a database, such as a table, index, or view.GaussDB(DWS) does not support DDL if its CN is unavail", + "product_code":"dws", + "title":"DDL Syntax Overview", + "uri":"dws_06_0119.html", + "doc_type":"devg", + "p_code":"804", + "code":"805" + }, + { + "desc":"This command is used to modify the attributes of a database, including the database name, owner, maximum number of connections, and object isolation attribute.Only the ow", + "product_code":"dws", + "title":"ALTER DATABASE", + "uri":"dws_06_0120.html", + "doc_type":"devg", + "p_code":"804", + "code":"806" + }, + { + "desc":"ALTER FOREIGN TABLE modifies a foreign table.NoneSet the attributes of a foreign table.ALTER FOREIGN TABLE [ IF EXISTS ] table_name\n OPTIONS ( {[ ADD | SET | DROP ] o", + "product_code":"dws", + "title":"ALTER FOREIGN TABLE (for GDS)", + "uri":"dws_06_0123.html", + "doc_type":"devg", + "p_code":"804", + "code":"807" + }, + { + "desc":"ALTER FOREIGN TABLE modifies an HDFS or OBS foreign table.NoneSet a foreign table's attributes.ALTER FOREIGN TABLE [ IF EXISTS ] table_name\n OPTIONS ( {[ ADD | SET | ", + "product_code":"dws", + "title":"ALTER FOREIGN TABLE (for HDFS or OBS)", + "uri":"dws_06_0124.html", + "doc_type":"devg", + "p_code":"804", + "code":"808" + }, + { + "desc":"ALTER FUNCTION modifies the attributes of a customized function.Only the owner of a function or a system administrator can run this statement. If a function involves oper", + "product_code":"dws", + "title":"ALTER FUNCTION", + "uri":"dws_06_0126.html", + "doc_type":"devg", + "p_code":"804", + "code":"809" + }, + { + "desc":"ALTER GROUP modifies the attributes of a user group.ALTER GROUP is an alias for ALTER ROLE, and it is not a standard SQL command and not recommended. Users can use ALTER ", + "product_code":"dws", + "title":"ALTER GROUP", + "uri":"dws_06_0127.html", + "doc_type":"devg", + "p_code":"804", + "code":"810" + }, + { + "desc":"ALTER INDEX modifies the definition of an existing index.There are several sub-forms:IF EXISTSIf the specified index does not exist, a notice instead of an error is sent.", + "product_code":"dws", + "title":"ALTER INDEX", + "uri":"dws_06_0128.html", + "doc_type":"devg", + "p_code":"804", + "code":"811" + }, + { + "desc":"ALTER LARGE OBJECT modifies the definition of a large object. It can only assign a new owner to a large object.Only the administrator or the owner of the to-be-modified l", + "product_code":"dws", + "title":"ALTER LARGE OBJECT", + "uri":"dws_06_0129.html", + "doc_type":"devg", + "p_code":"804", + "code":"812" + }, + { + "desc":"ALTER REDACTION POLICY modifies a data redaction policy applied to a specified table.Only the owner of the table to which the redaction policy is applied has the permissi", + "product_code":"dws", + "title":"ALTER REDACTION POLICY", + "uri":"dws_06_0132.html", + "doc_type":"devg", + "p_code":"804", + "code":"813" + }, + { + "desc":"ALTER RESOURCE POOL changes the Cgroup of a resource pool.Users having the ALTER permission can modify resource pools.pool_nameSpecifies the name of the resource pool.The", + "product_code":"dws", + "title":"ALTER RESOURCE POOL", + "uri":"dws_06_0133.html", + "doc_type":"devg", + "p_code":"804", + "code":"814" + }, + { + "desc":"ALTER ROLE changes the attributes of a role.NoneModifying the Rights of a RoleALTER ROLE role_name [ [ WITH ] option [ ... ] ];The option clause for granting rights is as", + "product_code":"dws", + "title":"ALTER ROLE", + "uri":"dws_06_0134.html", + "doc_type":"devg", + "p_code":"804", + "code":"815" + }, + { + "desc":"ALTER ROW LEVEL SECURITY POLICY modifies an existing row-level access control policy, including the policy name and the users and expressions affected by the policy.Only ", + "product_code":"dws", + "title":"ALTER ROW LEVEL SECURITY POLICY", + "uri":"dws_06_0135.html", + "doc_type":"devg", + "p_code":"804", + "code":"816" + }, + { + "desc":"ALTER SCHEMA changes the attributes of a schema.Only the owner of an index or a system administrator can run this statement.Rename a schema.ALTER SCHEMA schema_name \n ", + "product_code":"dws", + "title":"ALTER SCHEMA", + "uri":"dws_06_0136.html", + "doc_type":"devg", + "p_code":"804", + "code":"817" + }, + { + "desc":"ALTER SEQUENCE modifies the parameters of an existing sequence.You must be the owner of the sequence to use ALTER SEQUENCE.In the current version, you can modify only the", + "product_code":"dws", + "title":"ALTER SEQUENCE", + "uri":"dws_06_0137.html", + "doc_type":"devg", + "p_code":"804", + "code":"818" + }, + { + "desc":"ALTER SERVER adds, modifies, or deletes the parameters of an existing server. You can query existing servers from the pg_foreign_server system catalog.Only the owner of a", + "product_code":"dws", + "title":"ALTER SERVER", + "uri":"dws_06_0138.html", + "doc_type":"devg", + "p_code":"804", + "code":"819" + }, + { + "desc":"ALTER SESSION defines or modifies the conditions or parameters that affect the current session. Modified session parameters are kept until the current session is disconne", + "product_code":"dws", + "title":"ALTER SESSION", + "uri":"dws_06_0139.html", + "doc_type":"devg", + "p_code":"804", + "code":"820" + }, + { + "desc":"ALTER SYNONYM is used to modify the attribute of a synonym.Only the synonym owner can be changed.Only the system administrator and the synonym owner has the permission to", + "product_code":"dws", + "title":"ALTER SYNONYM", + "uri":"dws_06_0140.html", + "doc_type":"devg", + "p_code":"804", + "code":"821" + }, + { + "desc":"ALTER SYSTEM KILL SESSION ends a session.Nonesession_sid, serialSpecifies SID and SERIAL of a session (see examples for format).Value range: The SIDs and SERIALs of all s", + "product_code":"dws", + "title":"ALTER SYSTEM KILL SESSION", + "uri":"dws_06_0141.html", + "doc_type":"devg", + "p_code":"804", + "code":"822" + }, + { + "desc":"ALTER TABLE is used to modify tables, including modifying table definitions, renaming tables, renaming specified columns in tables, renaming table constraints, setting ta", + "product_code":"dws", + "title":"ALTER TABLE", + "uri":"dws_06_0142.html", + "doc_type":"devg", + "p_code":"804", + "code":"823" + }, + { + "desc":"ALTER TABLE PARTITION modifies table partitioning, including adding, deleting, splitting, merging partitions, and modifying partition attributes.The name of the added par", + "product_code":"dws", + "title":"ALTER TABLE PARTITION", + "uri":"dws_06_0143.html", + "doc_type":"devg", + "p_code":"804", + "code":"824" + }, + { + "desc":"ALTER TEXT SEARCH CONFIGURATION modifies the definition of a text search configuration. You can modify its mappings from token types to dictionaries, change the configura", + "product_code":"dws", + "title":"ALTER TEXT SEARCH CONFIGURATION", + "uri":"dws_06_0145.html", + "doc_type":"devg", + "p_code":"804", + "code":"825" + }, + { + "desc":"ALTER TEXT SEARCH DICTIONARY modifies the definition of a full-text retrieval dictionary, including its parameters, name, owner, and schema.ALTER is not supported by pred", + "product_code":"dws", + "title":"ALTER TEXT SEARCH DICTIONARY", + "uri":"dws_06_0146.html", + "doc_type":"devg", + "p_code":"804", + "code":"826" + }, + { + "desc":"ALTER TRIGGER modifies the definition of a trigger.Only the owner of a table where a trigger is created and system administrators can run the ALTER TRIGGER statement.trig", + "product_code":"dws", + "title":"ALTER TRIGGER", + "uri":"dws_06_0147.html", + "doc_type":"devg", + "p_code":"804", + "code":"827" + }, + { + "desc":"ALTER TYPE modifies the definition of a type.Modify a type.ALTER TYPE name action [, ... ]\nALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }\nALTER TYPE", + "product_code":"dws", + "title":"ALTER TYPE", + "uri":"dws_06_0148.html", + "doc_type":"devg", + "p_code":"804", + "code":"828" + }, + { + "desc":"ALTER USER modifies the attributes of a database user.Session parameters modified by ALTER USER apply to a specified user and take effect in the next session.Modify user ", + "product_code":"dws", + "title":"ALTER USER", + "uri":"dws_06_0149.html", + "doc_type":"devg", + "p_code":"804", + "code":"829" + }, + { + "desc":"ALTER VIEW modifies all auxiliary attributes of a view. (To modify the query definition of a view, use CREATE OR REPLACE VIEW.)Only the view owner can modify a view by ru", + "product_code":"dws", + "title":"ALTER VIEW", + "uri":"dws_06_0150.html", + "doc_type":"devg", + "p_code":"804", + "code":"830" + }, + { + "desc":"CLEAN CONNECTION clears database connections when a database is abnormal. You may use this statement to delete a specific user's connections to a specified database.NoneC", + "product_code":"dws", + "title":"CLEAN CONNECTION", + "uri":"dws_06_0151.html", + "doc_type":"devg", + "p_code":"804", + "code":"831" + }, + { + "desc":"CLOSE frees the resources associated with an open cursor.After a cursor is closed, no subsequent operations are allowed on it.A cursor should be closed when it is no long", + "product_code":"dws", + "title":"CLOSE", + "uri":"dws_06_0152.html", + "doc_type":"devg", + "p_code":"804", + "code":"832" + }, + { + "desc":"Cluster a table according to an index.CLUSTER instructs GaussDB(DWS) to cluster the table specified by table_name based on the index specified by index_name. The index mu", + "product_code":"dws", + "title":"CLUSTER", + "uri":"dws_06_0153.html", + "doc_type":"devg", + "p_code":"804", + "code":"833" + }, + { + "desc":"COMMENT defines or changes the comment of an object.Only one comment string is stored for each object. To modify a comment, issue a new COMMENT command for the same objec", + "product_code":"dws", + "title":"COMMENT", + "uri":"dws_06_0154.html", + "doc_type":"devg", + "p_code":"804", + "code":"834" + }, + { + "desc":"Creates a barrier for cluster nodes. The barrier can be used for data restoration.Before creating a barrier, ensure that gtm_backup_barrier and enable_cbm_tracking are se", + "product_code":"dws", + "title":"CREATE BARRIER", + "uri":"dws_06_0155.html", + "doc_type":"devg", + "p_code":"804", + "code":"835" + }, + { + "desc":"CREATE DATABASE creates a database. By default, the new database will be created by cloning the standard system database template1. A different template can be specified ", + "product_code":"dws", + "title":"CREATE DATABASE", + "uri":"dws_06_0156.html", + "doc_type":"devg", + "p_code":"804", + "code":"836" + }, + { + "desc":"CREATE FOREIGN TABLE creates a GDS foreign table.CREATE FOREIGN TABLE creates a GDS foreign table in the current database for concurrent data import and export. The GDS f", + "product_code":"dws", + "title":"CREATE FOREIGN TABLE (for GDS Import and Export)", + "uri":"dws_06_0159.html", + "doc_type":"devg", + "p_code":"804", + "code":"837" + }, + { + "desc":"CREATE FOREIGN TABLE creates an HDFS or OBS foreign table in the current database to access or export structured data stored on HDFS or OBS. You can also export data in O", + "product_code":"dws", + "title":"CREATE FOREIGN TABLE (SQL on OBS or Hadoop)", + "uri":"dws_06_0161.html", + "doc_type":"devg", + "p_code":"804", + "code":"838" + }, + { + "desc":"CREATE FOREIGN TABLE creates a foreign table in the current database for parallel data import and export of OBS data. The server used is gsmpp_server, which is created by", + "product_code":"dws", + "title":"CREATE FOREIGN TABLE (for OBS Import and Export)", + "uri":"dws_06_0160.html", + "doc_type":"devg", + "p_code":"804", + "code":"839" + }, + { + "desc":"CREATE FUNCTION creates a function.The precision values (if any) of the parameters or return values of a function are not checked.When creating a function, you are advise", + "product_code":"dws", + "title":"CREATE FUNCTION", + "uri":"dws_06_0163.html", + "doc_type":"devg", + "p_code":"804", + "code":"840" + }, + { + "desc":"CREATE GROUP creates a user group.CREATE GROUP is an alias for CREATE ROLE, and it is not a standard SQL command and not recommended. Users can use CREATE ROLE directly.T", + "product_code":"dws", + "title":"CREATE GROUP", + "uri":"dws_06_0164.html", + "doc_type":"devg", + "p_code":"804", + "code":"841" + }, + { + "desc":"CREATE INDEX-bak defines a new index.Indexes are primarily used to enhance database performance (though inappropriate use can result in slower database performance). You ", + "product_code":"dws", + "title":"CREATE INDEX", + "uri":"dws_06_0165.html", + "doc_type":"devg", + "p_code":"804", + "code":"842" + }, + { + "desc":"CREATE REDACTION POLICY creates a data redaction policy for a table.Only the table owner has the permission to create a data redaction policy.You can create data redactio", + "product_code":"dws", + "title":"CREATE REDACTION POLICY", + "uri":"dws_06_0168.html", + "doc_type":"devg", + "p_code":"804", + "code":"843" + }, + { + "desc":"CREATE ROW LEVEL SECURITY POLICY creates a row-level access control policy for a table.The policy takes effect only after row-level access control is enabled (by running ", + "product_code":"dws", + "title":"CREATE ROW LEVEL SECURITY POLICY", + "uri":"dws_06_0169.html", + "doc_type":"devg", + "p_code":"804", + "code":"844" + }, + { + "desc":"CREATE PROCEDURE creates a stored procedure.The precision values (if any) of the parameters or return values of a stored procedure are not checked.When creating a stored ", + "product_code":"dws", + "title":"CREATE PROCEDURE", + "uri":"dws_06_0170.html", + "doc_type":"devg", + "p_code":"804", + "code":"845" + }, + { + "desc":"CREATE RESOURCE POOL creates a resource pool and specifies the Cgroup for the resource pool.As long as the current user has CREATE permission, it can create a resource po", + "product_code":"dws", + "title":"CREATE RESOURCE POOL", + "uri":"dws_06_0171.html", + "doc_type":"devg", + "p_code":"804", + "code":"846" + }, + { + "desc":"Create a role.A role is an entity that has own database objects and permissions. In different environments, a role can be considered a user, a group, or both.CREATE ROLE ", + "product_code":"dws", + "title":"CREATE ROLE", + "uri":"dws_06_0172.html", + "doc_type":"devg", + "p_code":"804", + "code":"847" + }, + { + "desc":"CREATE SCHEMA creates a schema.Named objects are accessed either by \"qualifying\" their names with the schema name as a prefix, or by setting a search path that includes t", + "product_code":"dws", + "title":"CREATE SCHEMA", + "uri":"dws_06_0173.html", + "doc_type":"devg", + "p_code":"804", + "code":"848" + }, + { + "desc":"CREATE SEQUENCE adds a sequence to the current database. The owner of a sequence is the user who creates the sequence.A sequence is a special table that stores arithmetic", + "product_code":"dws", + "title":"CREATE SEQUENCE", + "uri":"dws_06_0174.html", + "doc_type":"devg", + "p_code":"804", + "code":"849" + }, + { + "desc":"CREATE SERVER creates an external server.An external server stores information of HDFS clusters, OBS servers, DLI connections, or other homogeneous clusters.By default, o", + "product_code":"dws", + "title":"CREATE SERVER", + "uri":"dws_06_0175.html", + "doc_type":"devg", + "p_code":"804", + "code":"850" + }, + { + "desc":"CREATE SYNONYM is used to create a synonym object. A synonym is an alias of a database object and is used to record the mapping between database object names. You can use", + "product_code":"dws", + "title":"CREATE SYNONYM", + "uri":"dws_06_0176.html", + "doc_type":"devg", + "p_code":"804", + "code":"851" + }, + { + "desc":"CREATE TABLE creates a table in the current database. The table will be owned by the user who created it.For details about the data types supported by column-store tables", + "product_code":"dws", + "title":"CREATE TABLE", + "uri":"dws_06_0177.html", + "doc_type":"devg", + "p_code":"804", + "code":"852" + }, + { + "desc":"CREATE TABLE AS creates a table based on the results of a query.It creates a table and fills it with data obtained using SELECT. The table columns have the names and data", + "product_code":"dws", + "title":"CREATE TABLE AS", + "uri":"dws_06_0178.html", + "doc_type":"devg", + "p_code":"804", + "code":"853" + }, + { + "desc":"CREATE TABLE PARTITION creates a partitioned table. Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific sche", + "product_code":"dws", + "title":"CREATE TABLE PARTITION", + "uri":"dws_06_0179.html", + "doc_type":"devg", + "p_code":"804", + "code":"854" + }, + { + "desc":"CREATE TEXT SEARCH CONFIGURATION creates a text search configuration. A text search configuration specifies a text search parser that can divide a string into tokens, plu", + "product_code":"dws", + "title":"CREATE TEXT SEARCH CONFIGURATION", + "uri":"dws_06_0182.html", + "doc_type":"devg", + "p_code":"804", + "code":"855" + }, + { + "desc":"CREATE TEXT SEARCH DICTIONARY creates a full-text search dictionary. A dictionary is used to identify and process specified words during full-text search.Dictionaries are", + "product_code":"dws", + "title":"CREATE TEXT SEARCH DICTIONARY", + "uri":"dws_06_0183.html", + "doc_type":"devg", + "p_code":"804", + "code":"856" + }, + { + "desc":"CREATE TRIGGER creates a trigger. The trigger will be associated with a specified table or view, and will execute a specified function when certain events occur.Currently", + "product_code":"dws", + "title":"CREATE TRIGGER", + "uri":"dws_06_0184.html", + "doc_type":"devg", + "p_code":"804", + "code":"857" + }, + { + "desc":"CREATE TYPE defines a new data type in the current database. The user who defines a new data type becomes its owner. Types are designed only for row-store tables.Four typ", + "product_code":"dws", + "title":"CREATE TYPE", + "uri":"dws_06_0185.html", + "doc_type":"devg", + "p_code":"804", + "code":"858" + }, + { + "desc":"CREATE USER creates a user.A user created using the CREATE USER statement has the LOGIN permission by default.A schema named after the user is automatically created in th", + "product_code":"dws", + "title":"CREATE USER", + "uri":"dws_06_0186.html", + "doc_type":"devg", + "p_code":"804", + "code":"859" + }, + { + "desc":"CREATE VIEW creates a view. A view is a virtual table, not a base table. A database only stores the definition of a view and does not store its data. The data is still st", + "product_code":"dws", + "title":"CREATE VIEW", + "uri":"dws_06_0187.html", + "doc_type":"devg", + "p_code":"804", + "code":"860" + }, + { + "desc":"CURSOR defines a cursor. This command retrieves few rows of data in a query.To process SQL statements, the stored procedure process assigns a memory segment to store cont", + "product_code":"dws", + "title":"CURSOR", + "uri":"dws_06_0188.html", + "doc_type":"devg", + "p_code":"804", + "code":"861" + }, + { + "desc":"DROP DATABASE deletes a database.Only the owner of a database or a system administrator has the permission to run the DROP DATABASE command.DROP DATABASE does not take ef", + "product_code":"dws", + "title":"DROP DATABASE", + "uri":"dws_06_0189.html", + "doc_type":"devg", + "p_code":"804", + "code":"862" + }, + { + "desc":"DROP FOREIGN TABLE deletes a specified foreign table.DROP FOREIGN TABLE forcibly deletes a specified table. After a table is deleted, any indexes that exist for the table", + "product_code":"dws", + "title":"DROP FOREIGN TABLE", + "uri":"dws_06_0192.html", + "doc_type":"devg", + "p_code":"804", + "code":"863" + }, + { + "desc":"DROP FUNCTION deletes an existing function.If a function involves operations on temporary tables, the function cannot be deleted by running DROP FUNCTION.IF EXISTSSends a", + "product_code":"dws", + "title":"DROP FUNCTION", + "uri":"dws_06_0193.html", + "doc_type":"devg", + "p_code":"804", + "code":"864" + }, + { + "desc":"DROP GROUP deletes a user group.DROP GROUP is the alias for DROP ROLE.DROP GROUP is the internal interface encapsulated in the gs_om tool. You are not advised to use this", + "product_code":"dws", + "title":"DROP GROUP", + "uri":"dws_06_0194.html", + "doc_type":"devg", + "p_code":"804", + "code":"865" + }, + { + "desc":"DROP INDEX deletes an index.Only the owner of an index or a system administrator can run DROP INDEX command.IF EXISTSSends a notice instead of an error if the specified i", + "product_code":"dws", + "title":"DROP INDEX", + "uri":"dws_06_0195.html", + "doc_type":"devg", + "p_code":"804", + "code":"866" + }, + { + "desc":"DROP OWNED deletes the database objects of a database role.The role's permissions on all the database objects in the current database and shared objects (databases and ta", + "product_code":"dws", + "title":"DROP OWNED", + "uri":"dws_06_0198.html", + "doc_type":"devg", + "p_code":"804", + "code":"867" + }, + { + "desc":"DROP REDACTION POLICY deletes a data redaction policy applied to a specified table.Only the table owner has the permission to delete a data redaction policy.IF EXISTSSend", + "product_code":"dws", + "title":"DROP REDACTION POLICY", + "uri":"dws_06_0199.html", + "doc_type":"devg", + "p_code":"804", + "code":"868" + }, + { + "desc":"DROP ROW LEVEL SECURITY POLICY deletes a row-level access control policy from a table.Only the table owner or administrators can delete a row-level access control policy ", + "product_code":"dws", + "title":"DROP ROW LEVEL SECURITY POLICY", + "uri":"dws_06_0200.html", + "doc_type":"devg", + "p_code":"804", + "code":"869" + }, + { + "desc":"DROP PROCEDURE deletes an existing stored procedure.None.IF EXISTSSends a notice instead of an error if the stored procedure does not exist.Sends a notice instead of an e", + "product_code":"dws", + "title":"DROP PROCEDURE", + "uri":"dws_06_0201.html", + "doc_type":"devg", + "p_code":"804", + "code":"870" + }, + { + "desc":"DROP RESOURCE POOL deletes a resource pool.The resource pool cannot be deleted if it is associated with a role.The user must have the DROP permission in order to delete a", + "product_code":"dws", + "title":"DROP RESOURCE POOL", + "uri":"dws_06_0202.html", + "doc_type":"devg", + "p_code":"804", + "code":"871" + }, + { + "desc":"DROP ROLE deletes a specified role.If a \"role is being used by other users\" error is displayed when you run DROP ROLE, it might be that threads cannot respond to signals ", + "product_code":"dws", + "title":"DROP ROLE", + "uri":"dws_06_0203.html", + "doc_type":"devg", + "p_code":"804", + "code":"872" + }, + { + "desc":"DROP SCHEMA deletes a schema in a database.Only a schema owner or a system administrator can run the DROP SCHEMA command.IF EXISTSSends a notice instead of an error if th", + "product_code":"dws", + "title":"DROP SCHEMA", + "uri":"dws_06_0204.html", + "doc_type":"devg", + "p_code":"804", + "code":"873" + }, + { + "desc":"DROP SEQUENCE deletes a sequence from the current database.Only a sequence owner or a system administrator can delete a sequence.IF EXISTSSends a notice instead of an err", + "product_code":"dws", + "title":"DROP SEQUENCE", + "uri":"dws_06_0205.html", + "doc_type":"devg", + "p_code":"804", + "code":"874" + }, + { + "desc":"DROP SERVER deletes an existing data server.Only the server owner can delete a server.IF EXISTSSends a notice instead of an error if the specified table does not exist.Se", + "product_code":"dws", + "title":"DROP SERVER", + "uri":"dws_06_0206.html", + "doc_type":"devg", + "p_code":"804", + "code":"875" + }, + { + "desc":"DROP SYNONYM is used to delete a synonym object.Only a synonym owner or a system administrator can run the DROP SYNONYM command.IF EXISTSSend a notice instead of reportin", + "product_code":"dws", + "title":"DROP SYNONYM", + "uri":"dws_06_0207.html", + "doc_type":"devg", + "p_code":"804", + "code":"876" + }, + { + "desc":"DROP TABLE deletes a specified table.Only the table owner, schema owner, and system administrator have the permission to delete a table. To delete all the rows in a table", + "product_code":"dws", + "title":"DROP TABLE", + "uri":"dws_06_0208.html", + "doc_type":"devg", + "p_code":"804", + "code":"877" + }, + { + "desc":"DROP TEXT SEARCH CONFIGURATION deletes an existing text search configuration.To run the DROP TEXT SEARCH CONFIGURATION command, you must be the owner of the text search c", + "product_code":"dws", + "title":"DROP TEXT SEARCH CONFIGURATION", + "uri":"dws_06_0210.html", + "doc_type":"devg", + "p_code":"804", + "code":"878" + }, + { + "desc":"DROPTEXT SEARCHDICTIONARY deletes a full-text retrieval dictionary.DROP is not supported by predefined dictionaries.Only the owner of a dictionary can do DROP to the dict", + "product_code":"dws", + "title":"DROP TEXT SEARCH DICTIONARY", + "uri":"dws_06_0211.html", + "doc_type":"devg", + "p_code":"804", + "code":"879" + }, + { + "desc":"DROP TRIGGER deletes a trigger.Only the owner of a trigger and system administrators can run the DROP TRIGGER statement.IF EXISTSSends a notice instead of an error if the", + "product_code":"dws", + "title":"DROP TRIGGER", + "uri":"dws_06_0212.html", + "doc_type":"devg", + "p_code":"804", + "code":"880" + }, + { + "desc":"DROP TYPE deletes a user-defined data type. Only the type owner has permission to run this statement.IF EXISTSSends a notice instead of an error if the specified type doe", + "product_code":"dws", + "title":"DROP TYPE", + "uri":"dws_06_0213.html", + "doc_type":"devg", + "p_code":"804", + "code":"881" + }, + { + "desc":"Deleting a user will also delete the schema having the same name as the user.CASCADE is used to delete objects (excluding databases) that depend on the user. CASCADE cann", + "product_code":"dws", + "title":"DROP USER", + "uri":"dws_06_0214.html", + "doc_type":"devg", + "p_code":"804", + "code":"882" + }, + { + "desc":"DROP VIEW forcibly deletes an existing view in a database.Only a view owner or a system administrator can run DROP VIEW command.IF EXISTSSends a notice instead of an erro", + "product_code":"dws", + "title":"DROP VIEW", + "uri":"dws_06_0215.html", + "doc_type":"devg", + "p_code":"804", + "code":"883" + }, + { + "desc":"FETCH retrieves data using a previously-created cursor.A cursor has an associated position, which is used by FETCH. The cursor position can be before the first row of the", + "product_code":"dws", + "title":"FETCH", + "uri":"dws_06_0216.html", + "doc_type":"devg", + "p_code":"804", + "code":"884" + }, + { + "desc":"MOVE repositions a cursor without retrieving any data. MOVE works exactly like the FETCH command, except it only repositions the cursor and does not return rows.NoneThe d", + "product_code":"dws", + "title":"MOVE", + "uri":"dws_06_0217.html", + "doc_type":"devg", + "p_code":"804", + "code":"885" + }, + { + "desc":"REINDEX rebuilds an index using the data stored in the index's table, replacing the old copy of the index.There are several scenarios in which REINDEX can be used:An inde", + "product_code":"dws", + "title":"REINDEX", + "uri":"dws_06_0218.html", + "doc_type":"devg", + "p_code":"804", + "code":"886" + }, + { + "desc":"RESET restores run-time parameters to their default values. The default values are parameter default values complied in the postgresql.conf configuration file.RESET is an", + "product_code":"dws", + "title":"RESET", + "uri":"dws_06_0219.html", + "doc_type":"devg", + "p_code":"804", + "code":"887" + }, + { + "desc":"SET modifies a run-time parameter.Most run-time parameters can be modified by executing SET. Some parameters cannot be modified after a server or session starts.Set the s", + "product_code":"dws", + "title":"SET", + "uri":"dws_06_0220.html", + "doc_type":"devg", + "p_code":"804", + "code":"888" + }, + { + "desc":"SET CONSTRAINTS sets the behavior of constraint checking within the current transaction.IMMEDIATE constraints are checked at the end of each statement. DEFERRED constrain", + "product_code":"dws", + "title":"SET CONSTRAINTS", + "uri":"dws_06_0221.html", + "doc_type":"devg", + "p_code":"804", + "code":"889" + }, + { + "desc":"SET ROLE sets the current user identifier of the current session.Users of the current session must be members of specified rolename, but the system administrator can choo", + "product_code":"dws", + "title":"SET ROLE", + "uri":"dws_06_0222.html", + "doc_type":"devg", + "p_code":"804", + "code":"890" + }, + { + "desc":"SET SESSION AUTHORIZATION sets the session user identifier and the current user identifier of the current SQL session to a specified user.The session identifier can be ch", + "product_code":"dws", + "title":"SET SESSION AUTHORIZATION", + "uri":"dws_06_0223.html", + "doc_type":"devg", + "p_code":"804", + "code":"891" + }, + { + "desc":"SHOW shows the current value of a run-time parameter. You can use the SET statement to set these parameters.Some parameters that can be viewed by SHOW are read-only. You ", + "product_code":"dws", + "title":"SHOW", + "uri":"dws_06_0224.html", + "doc_type":"devg", + "p_code":"804", + "code":"892" + }, + { + "desc":"TRUNCATE quickly removes all rows from a database table.It has the same effect as an unqualified DELETE on each table, but it is faster since it does not actually scan th", + "product_code":"dws", + "title":"TRUNCATE", + "uri":"dws_06_0225.html", + "doc_type":"devg", + "p_code":"804", + "code":"893" + }, + { + "desc":"VACUUM reclaims storage space occupied by tables or B-tree indexes. In normal database operation, rows that have been deleted or obsoleted by an update are not physically", + "product_code":"dws", + "title":"VACUUM", + "uri":"dws_06_0226.html", + "doc_type":"devg", + "p_code":"804", + "code":"894" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"DML Syntax", + "uri":"dws_06_0227.html", + "doc_type":"devg", + "p_code":"686", + "code":"895" + }, + { + "desc":"Data Manipulation Language (DML) is used to perform operations on data in database tables, such as inserting, updating, querying, or deleting data.Inserting data refers t", + "product_code":"dws", + "title":"DML Syntax Overview", + "uri":"dws_06_0228.html", + "doc_type":"devg", + "p_code":"895", + "code":"896" + }, + { + "desc":"CALL calls defined functions or stored procedures.NoneschemaSpecifies the name of the schema where a function or stored procedure is located.Specifies the name of the sch", + "product_code":"dws", + "title":"CALL", + "uri":"dws_06_0229.html", + "doc_type":"devg", + "p_code":"895", + "code":"897" + }, + { + "desc":"COPY copies data between tables and files.COPY FROM copies data from a file to a table. COPY TO copies data from a table to a file.If CNs and DNs are enabled in security ", + "product_code":"dws", + "title":"COPY", + "uri":"dws_06_0230.html", + "doc_type":"devg", + "p_code":"895", + "code":"898" + }, + { + "desc":"DELETE deletes rows that satisfy the WHERE clause from the specified table. If the WHERE clause does not exist, all rows in the table will be deleted. The result is a val", + "product_code":"dws", + "title":"DELETE", + "uri":"dws_06_0231.html", + "doc_type":"devg", + "p_code":"895", + "code":"899" + }, + { + "desc":"EXPLAIN shows the execution plan of an SQL statement.The execution plan shows how the tables referenced by the SQL statement will be scanned, for example, by plain sequen", + "product_code":"dws", + "title":"EXPLAIN", + "uri":"dws_06_0232.html", + "doc_type":"devg", + "p_code":"895", + "code":"900" + }, + { + "desc":"You can run the EXPLAIN PLAN statement to save the information about an execution plan to the PLAN_TABLE table. Different from the EXPLAIN statement, EXPLAIN PLAN only st", + "product_code":"dws", + "title":"EXPLAIN PLAN", + "uri":"dws_06_0233.html", + "doc_type":"devg", + "p_code":"895", + "code":"901" + }, + { + "desc":"LOCK TABLE obtains a table-level lock.GaussDB(DWS) always tries to select the lock mode with minimum constraints when automatically requesting a lock for a command refere", + "product_code":"dws", + "title":"LOCK", + "uri":"dws_06_0234.html", + "doc_type":"devg", + "p_code":"895", + "code":"902" + }, + { + "desc":"The MERGE INTO statement is used to conditionally match data in a target table with that in a source table. If data matches, UPDATE is executed on the target table; if da", + "product_code":"dws", + "title":"MERGE INTO", + "uri":"dws_06_0235.html", + "doc_type":"devg", + "p_code":"895", + "code":"903" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"INSERT and UPSERT", + "uri":"dws_06_0275.html", + "doc_type":"devg", + "p_code":"895", + "code":"904" + }, + { + "desc":"INSERT inserts new rows into a table.You must have the INSERT permission on a table in order to insert into it.Use of the RETURNING clause requires the SELECT permission ", + "product_code":"dws", + "title":"INSERT", + "uri":"dws_06_0236.html", + "doc_type":"devg", + "p_code":"904", + "code":"905" + }, + { + "desc":"UPSERT inserts rows into a table. When a row duplicates an existing primary key or unique key value, the row will be ignored or updated.The UPSERT syntax is supported onl", + "product_code":"dws", + "title":"UPSERT", + "uri":"dws_06_0237.html", + "doc_type":"devg", + "p_code":"904", + "code":"906" + }, + { + "desc":"UPDATE updates data in a table. UPDATE changes the values of the specified columns in all rows that satisfy the condition. The WHERE clause clarifies conditions. The colu", + "product_code":"dws", + "title":"UPDATE", + "uri":"dws_06_0240.html", + "doc_type":"devg", + "p_code":"895", + "code":"907" + }, + { + "desc":"VALUES computes a row or a set of rows based on given values. It is most commonly used to generate a constant table within a large command.VALUES lists with large numbers", + "product_code":"dws", + "title":"VALUES", + "uri":"dws_06_0241.html", + "doc_type":"devg", + "p_code":"895", + "code":"908" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"DCL Syntax", + "uri":"dws_06_0242.html", + "doc_type":"devg", + "p_code":"686", + "code":"909" + }, + { + "desc":"Data control language (DCL) is used to set or modify database users or role rights.GaussDB(DWS) provides a statement for granting rights to data objects and roles. For de", + "product_code":"dws", + "title":"DCL Syntax Overview", + "uri":"dws_06_0243.html", + "doc_type":"devg", + "p_code":"909", + "code":"910" + }, + { + "desc":"ALTER DEFAULT PRIVILEGES allows you to set the permissions that will be used for objects to be created. It does not affect permissions assigned to existing objects.To iso", + "product_code":"dws", + "title":"ALTER DEFAULT PRIVILEGES", + "uri":"dws_06_0244.html", + "doc_type":"devg", + "p_code":"909", + "code":"911" + }, + { + "desc":"ANALYZE collects statistics about ordinary tables in a database, and stores the results in the PG_STATISTIC system catalog. The execution plan generator uses these statis", + "product_code":"dws", + "title":"ANALYZE | ANALYSE", + "uri":"dws_06_0245.html", + "doc_type":"devg", + "p_code":"909", + "code":"912" + }, + { + "desc":"DEALLOCATE deallocates a previously prepared statement. If you do not explicitly deallocate a prepared statement, it is deallocated when the session ends.The PREPARE key ", + "product_code":"dws", + "title":"DEALLOCATE", + "uri":"dws_06_0246.html", + "doc_type":"devg", + "p_code":"909", + "code":"913" + }, + { + "desc":"DO executes an anonymous code block.A code block is a function body without parameters that returns void. It is analyzed and executed at the same time.Before using a prog", + "product_code":"dws", + "title":"DO", + "uri":"dws_06_0247.html", + "doc_type":"devg", + "p_code":"909", + "code":"914" + }, + { + "desc":"EXECUTE executes a prepared statement. A prepared statement only exists in the lifecycle of a session. Therefore, only prepared statements created using PREPARE earlier i", + "product_code":"dws", + "title":"EXECUTE", + "uri":"dws_06_0248.html", + "doc_type":"devg", + "p_code":"909", + "code":"915" + }, + { + "desc":"EXECUTE DIRECT executes an SQL statement on a specified node. Generally, the cluster automatically allocates an SQL statement to proper nodes. EXECUTE DIRECT is mainly us", + "product_code":"dws", + "title":"EXECUTE DIRECT", + "uri":"dws_06_0249.html", + "doc_type":"devg", + "p_code":"909", + "code":"916" + }, + { + "desc":"GRANT grants permissions to roles and users.GRANT is used in the following scenarios:Granting system permissions to roles or usersSystem permissions are also called user ", + "product_code":"dws", + "title":"GRANT", + "uri":"dws_06_0250.html", + "doc_type":"devg", + "p_code":"909", + "code":"917" + }, + { + "desc":"PREPARE creates a prepared statement.A prepared statement is a performance optimizing object on the server. When the PREPARE statement is executed, the specified query is", + "product_code":"dws", + "title":"PREPARE", + "uri":"dws_06_0251.html", + "doc_type":"devg", + "p_code":"909", + "code":"918" + }, + { + "desc":"REASSIGN OWNED changes the owner of a database.REASSIGN OWNED requires that the system change owners of all the database objects owned by old_roles to new_role.REASSIGN O", + "product_code":"dws", + "title":"REASSIGN OWNED", + "uri":"dws_06_0252.html", + "doc_type":"devg", + "p_code":"909", + "code":"919" + }, + { + "desc":"REVOKE revokes rights from one or more roles.If a non-owner user of an object attempts to REVOKE rights on the object, the command is executed based on the following rule", + "product_code":"dws", + "title":"REVOKE", + "uri":"dws_06_0253.html", + "doc_type":"devg", + "p_code":"909", + "code":"920" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"DQL Syntax", + "uri":"dws_06_0276.html", + "doc_type":"devg", + "p_code":"686", + "code":"921" + }, + { + "desc":"Data Query Language (DQL) can obtain data from tables or views.GaussDB(DWS) provides statements for obtaining data from tables or views. For details, see SELECT.GaussDB(D", + "product_code":"dws", + "title":"DQL Syntax Overview", + "uri":"dws_06_0277.html", + "doc_type":"devg", + "p_code":"921", + "code":"922" + }, + { + "desc":"SELECT retrieves data from a table or view.Serving as an overlaid filter for a database table, SELECT using SQL keywords retrieves required data from data tables.Using SE", + "product_code":"dws", + "title":"SELECT", + "uri":"dws_06_0238.html", + "doc_type":"devg", + "p_code":"921", + "code":"923" + }, + { + "desc":"SELECT INTO defines a new table based on a query result and insert data obtained by query to the new table.Different from SELECT, data found by SELECT INTO is not returne", + "product_code":"dws", + "title":"SELECT INTO", + "uri":"dws_06_0239.html", + "doc_type":"devg", + "p_code":"921", + "code":"924" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"TCL Syntax", + "uri":"dws_06_0254.html", + "doc_type":"devg", + "p_code":"686", + "code":"925" + }, + { + "desc":"Transaction Control Language (TCL) controls the time and effect of database transactions and monitors the database.GaussDB(DWS) uses the COMMIT or END statement to commit", + "product_code":"dws", + "title":"TCL Syntax Overview", + "uri":"dws_06_0255.html", + "doc_type":"devg", + "p_code":"925", + "code":"926" + }, + { + "desc":"ABORT rolls back the current transaction and cancels the changes in the transaction.This command is equivalent to ROLLBACK, and is present only for historical reasons. No", + "product_code":"dws", + "title":"ABORT", + "uri":"dws_06_0256.html", + "doc_type":"devg", + "p_code":"925", + "code":"927" + }, + { + "desc":"BEGIN may be used to initiate an anonymous block or a single transaction. This section describes the syntax of BEGIN used to initiate an anonymous block. For details abou", + "product_code":"dws", + "title":"BEGIN", + "uri":"dws_06_0257.html", + "doc_type":"devg", + "p_code":"925", + "code":"928" + }, + { + "desc":"A checkpoint is a point in the transaction log sequence at which all data files have been updated to reflect the information in the log. All data files will be flushed to", + "product_code":"dws", + "title":"CHECKPOINT", + "uri":"dws_06_0258.html", + "doc_type":"devg", + "p_code":"925", + "code":"929" + }, + { + "desc":"COMMIT or END commits all operations of a transaction.Only the transaction creators or system administrators can run the COMMIT command. The creation and commit operation", + "product_code":"dws", + "title":"COMMIT | END", + "uri":"dws_06_0259.html", + "doc_type":"devg", + "p_code":"925", + "code":"930" + }, + { + "desc":"COMMIT PREPARED commits a prepared two-phase transaction.The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). Exercise cauti", + "product_code":"dws", + "title":"COMMIT PREPARED", + "uri":"dws_06_0260.html", + "doc_type":"devg", + "p_code":"925", + "code":"931" + }, + { + "desc":"PREPARE TRANSACTION prepares the current transaction for two-phase commit.After this command, the transaction is no longer associated with the current session; instead, i", + "product_code":"dws", + "title":"PREPARE TRANSACTION", + "uri":"dws_06_0262.html", + "doc_type":"devg", + "p_code":"925", + "code":"932" + }, + { + "desc":"SAVEPOINT establishes a new savepoint within the current transaction.A savepoint is a special mark inside a transaction that rolls back all commands that are executed aft", + "product_code":"dws", + "title":"SAVEPOINT", + "uri":"dws_06_0263.html", + "doc_type":"devg", + "p_code":"925", + "code":"933" + }, + { + "desc":"SET TRANSACTION sets the characteristics of the current transaction. It has no effect on any subsequent transactions. Available transaction characteristics include the tr", + "product_code":"dws", + "title":"SET TRANSACTION", + "uri":"dws_06_0264.html", + "doc_type":"devg", + "p_code":"925", + "code":"934" + }, + { + "desc":"START TRANSACTION starts a transaction. If the isolation level, read/write mode, or deferrable mode is specified, a new transaction will have those characteristics. You c", + "product_code":"dws", + "title":"START TRANSACTION", + "uri":"dws_06_0265.html", + "doc_type":"devg", + "p_code":"925", + "code":"935" + }, + { + "desc":"Rolls back the current transaction and backs out all updates in the transaction.ROLLBACK backs out of all changes that a transaction makes to a database if the transactio", + "product_code":"dws", + "title":"ROLLBACK", + "uri":"dws_06_0266.html", + "doc_type":"devg", + "p_code":"925", + "code":"936" + }, + { + "desc":"RELEASE SAVEPOINT destroys a savepoint previously defined in the current transaction.Destroying a savepoint makes it unavailable as a rollback point, but it has no other ", + "product_code":"dws", + "title":"RELEASE SAVEPOINT", + "uri":"dws_06_0267.html", + "doc_type":"devg", + "p_code":"925", + "code":"937" + }, + { + "desc":"ROLLBACK PREPARED cancels a transaction ready for two-phase committing.The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). ", + "product_code":"dws", + "title":"ROLLBACK PREPARED", + "uri":"dws_06_0268.html", + "doc_type":"devg", + "p_code":"925", + "code":"938" + }, + { + "desc":"ROLLBACK TO SAVEPOINT rolls back to a savepoint. It implicitly destroys all savepoints that were established after the named savepoint.Rolls back all commands that were e", + "product_code":"dws", + "title":"ROLLBACK TO SAVEPOINT", + "uri":"dws_06_0269.html", + "doc_type":"devg", + "p_code":"925", + "code":"939" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"GIN Indexes", + "uri":"dws_06_0270.html", + "doc_type":"devg", + "p_code":"686", + "code":"940" + }, + { + "desc":"Generalized Inverted Index (GIN) is designed for handling cases where the items to be indexed are composite values, and the queries to be handled by the index need to sea", + "product_code":"dws", + "title":"Introduction", + "uri":"dws_06_0271.html", + "doc_type":"devg", + "p_code":"940", + "code":"941" + }, + { + "desc":"The GIN interface has a high level of abstraction, requiring the access method implementer only to implement the semantics of the data type being accessed. The GIN layer ", + "product_code":"dws", + "title":"Scalability", + "uri":"dws_06_0272.html", + "doc_type":"devg", + "p_code":"940", + "code":"942" + }, + { + "desc":"Internally, a GIN index contains a B-tree index constructed over keys, where each key is an element of one or more indexed items (a member of an array, for example) and w", + "product_code":"dws", + "title":"Implementation", + "uri":"dws_06_0273.html", + "doc_type":"devg", + "p_code":"940", + "code":"943" + }, + { + "desc":"Create vs. InsertInsertion into a GIN index can be slow due to the likelihood of many keys being inserted for each item. So, for bulk insertions into a table, it is advis", + "product_code":"dws", + "title":"GIN Tips and Tricks", + "uri":"dws_06_0274.html", + "doc_type":"devg", + "p_code":"940", + "code":"944" + }, + { + "desc":"HUAWEI CLOUD Help Center presents technical documents to help you quickly get started with HUAWEI CLOUD services. The technical documents include Service Overview, Price Details, Purchase Guide, User Guide, API Reference, Best Practices, FAQs, and Videos.", + "product_code":"dws", + "title":"Change History", + "uri":"dws_04_3333.html", + "doc_type":"devg", + "p_code":"", + "code":"945" + } +] \ No newline at end of file diff --git a/docs/dws/dev/PARAMETERS.txt b/docs/dws/dev/PARAMETERS.txt new file mode 100644 index 00000000..6da8d5f0 --- /dev/null +++ b/docs/dws/dev/PARAMETERS.txt @@ -0,0 +1,3 @@ +version="" +language="en-us" +type="" \ No newline at end of file diff --git a/docs/dws/dev/dws_01_0127.html b/docs/dws/dev/dws_01_0127.html new file mode 100644 index 00000000..9681f16c --- /dev/null +++ b/docs/dws/dev/dws_01_0127.html @@ -0,0 +1,20 @@ + + +

Using DSC to Migrate SQL Scripts

+

The DSC is a CLI tool running on the Linux or Windows OS. It is dedicated to providing customers with simple, fast, and reliable application SQL script migration services. It parses the SQL scripts of source database applications using the built-in syntax migration logic, and converts them to SQL scripts applicable to GaussDB(DWS) databases. You do not need to connect the DSC to a database. It can migrate data in offline mode without service interruption. In GaussDB(DWS), you can run the migrated SQL scripts to restore the database, thereby easily migrating offline databases to the cloud.

+

The DSC can migrate SQL scripts of Teradata, Oracle, Netezza, MySQL, and DB2 databases.

+

Downloading the DSC SQL Migration Tool

  1. Log in to the GaussDB(DWS) management console.
  2. In the navigation tree on the left, click Connection Management.
  3. In the Download Client and Driver area, click here to download the DSC migration tool.

    If you have clusters of different versions, the system displays a dialog box, prompting you to select the cluster version and download the client corresponding to the cluster version. In the cluster list on the Cluster Management page, click the name of the specified cluster and click the Basic Information tab to view the cluster version.

    +
    Figure 1 Downloading the tool
    +

    +

  4. After downloading the DSC tool to the local PC, use WinSCP to upload it to a Linux host.

    The user who uploads the tool must have the full control permission on the target directory of the Linux host.

    +

+
+

Operation Guide for the DSC SQL Syntax Migration Tool

For details, see "DSC - SQL Syntax Migration Tool" in the Data Warehouse Service Tool Guide.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0001.html b/docs/dws/dev/dws_04_0001.html new file mode 100644 index 00000000..1a251b98 --- /dev/null +++ b/docs/dws/dev/dws_04_0001.html @@ -0,0 +1,21 @@ + + +

Welcome

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0002.html b/docs/dws/dev/dws_04_0002.html new file mode 100644 index 00000000..f4c59221 --- /dev/null +++ b/docs/dws/dev/dws_04_0002.html @@ -0,0 +1,20 @@ + + +

Target Readers

+

This document is intended for database designers, application developers, and database administrators, and provides information required for designing, building, querying and maintaining data warehouses.

+

As a database administrator or application developer, you need to be familiar with:

+
  • Knowledge about OSs, which is the basis for everything.
  • SQL syntax, which is the necessary skill for database operation.
+

Statement

When writing documents, the writers of GaussDB(DWS) try their best to provide guidance from the perspective of commercial use, application scenarios, and task completion. Even so, references to PostgreSQL content may still exist in the document. For this type of content, the following PostgreSQL Copyright is applicable:

+

Postgres-XC is Copyright © 1996-2013 by the PostgreSQL Global Development Group.

+

PostgreSQL is Copyright © 1996-2013 by the PostgreSQL Global Development Group.

+

Postgres95 is Copyright © 1994-5 by the Regents of the University of California.

+

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

+

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS-IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0004.html b/docs/dws/dev/dws_04_0004.html new file mode 100644 index 00000000..07e319a3 --- /dev/null +++ b/docs/dws/dev/dws_04_0004.html @@ -0,0 +1,57 @@ + + +

Reading Guide

+

If you are a new GaussDB(DWS) user, you are advised to read the following contents first:

+
  • Sections describing the features, functions, and application scenarios of GaussDB(DWS).
  • "Getting Started": guides you through creating a data warehouse cluster, creating a database table, uploading data, and testing queries.
+

If you intend to or are migrating applications from other data warehouses to GaussDB(DWS), you might want to know how GaussDB(DWS) differs from them.

+

You can find useful information from the following table for GaussDB(DWS) database application development.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +

If you want to...

+

Query Suggestions

+

Quickly get started with GaussDB(DWS).

+

Deploy a cluster, connect to the database, and perform some queries by following the instructions provided in "Getting Started" in the Data Warehouse Service (DWS) User Guide.

+

When you are ready to construct a database, load data to tables and compile the query content to operate the data in the data warehouse. Then, you can return to the Data Warehouse Service Database Developer Guide.

+

Understand the internal architecture of a GaussDB(DWS) data warehouse.

+

To know more about GaussDB(DWS), go to the GaussDB(DWS) home page.

+

Learn how to design tables to achieve the excellent performance.

+

Development and Design Proposal introduces the design specifications that should be complied with during the development of database applications. Modeling compliant with these specifications fits the distributed processing architecture of GaussDB(DWS) and provides efficient SQL code.

+

To facilitate service execution through optimization, you can refer to Query Performance Optimization. Successful performance optimization depends more on database administrators' experience and judgment than on instructions and explanation. However, Query Performance Optimization still tries to systematically illustrate the performance optimization methods for application development personnel and new GaussDB(DWS) database administrators.

+

Load data.

+

Data Import describes how to import data to GaussDB(DWS).

+

Manage users, groups, and database security.

+

Database Security Management covers database security topics.

+

Monitor and optimize system performance.

+

System Catalogs and System Views describes the system catalogs where you can query the database status and monitor the query content and process.

+

You can learn how to check the system running status and monitoring metrics on the GaussDB(DWS) console by referring to "Monitoring Clusters" in the Data Warehouse Service (DWS) User Guide.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0005.html b/docs/dws/dev/dws_04_0005.html new file mode 100644 index 00000000..2d775112 --- /dev/null +++ b/docs/dws/dev/dws_04_0005.html @@ -0,0 +1,94 @@ + + +

Conventions

+

Example Conventions

+
+ + + + + + + + + + +

Example

+

Description

+

dbadmin

+

Indicates the user operating and maintaining GaussDB(DWS) appointed when the cluster is created.

+

8000

+

Indicates the port number used by GaussDB(DWS) to monitor connection requests from the client.

+
+
+

SQL examples in this manual are developed based on the TPC-DS model. Before you execute the examples, install the TPC-DS benchmark by following the instructions on the official website https://www.tpc.org/tpcds/.

+
+

SQL Syntax Text Conventions

To better understand the syntax usage, you can refer to the SQL syntax text conventions described as follows:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Format

+

Description

+

Uppercase characters

+

Indicates that keywords must be in uppercase.

+

Lowercase characters

+

Indicates that parameters must be in lowercase.

+

[ ]

+

Indicates that the items in brackets [] are optional.

+

...

+

Indicates that preceding elements can appear repeatedly.

+

[ x | y | ... ]

+

Indicates that one item is selected from two or more options or no item is selected.

+

{ x | y | ... }

+

Indicates that one item is selected from two or more options.

+

[x | y | ... ] [ ... ]

+

Indicates that multiple parameters or no parameter can be selected. If multiple parameters are selected, separate them with spaces.

+

[ x | y | ... ] [ ,... ]

+

Indicates that multiple parameters or no parameter can be selected. If multiple parameters are selected, separate them with commas (,).

+

{ x | y | ... } [ ... ]

+

Indicates that at least one parameter can be selected. If multiple parameters are selected, separate them with spaces.

+

{ x | y | ... } [ ,... ]

+

Indicates that at least one parameter can be selected. If multiple parameters are selected, separate them with commas (,).

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0006.html b/docs/dws/dev/dws_04_0006.html new file mode 100644 index 00000000..547a9cc5 --- /dev/null +++ b/docs/dws/dev/dws_04_0006.html @@ -0,0 +1,13 @@ + + +

Prerequisites

+

Complete the following tasks before you perform operations described in this document:

+
  • Create a GaussDB(DWS) cluster.
  • Install an SQL client.
  • Connect the SQL client to the default database of the cluster.
+

For details about the preceding tasks, see "Getting Started" in the Data Warehouse Service (DWS) User Guide.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0007.html b/docs/dws/dev/dws_04_0007.html new file mode 100644 index 00000000..61c48b17 --- /dev/null +++ b/docs/dws/dev/dws_04_0007.html @@ -0,0 +1,20 @@ + + +

System Overview

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0011.html b/docs/dws/dev/dws_04_0011.html new file mode 100644 index 00000000..b91e6713 --- /dev/null +++ b/docs/dws/dev/dws_04_0011.html @@ -0,0 +1,16 @@ + + +

Highly Reliable Transaction Processing

+

GaussDB(DWS) manages cluster transactions, the basis of HA and failovers. This ensures speedy fault recovery, guarantees the Atomicity, Consistency, Isolation, Durability (ACID) properties for transactions and after a recovery, and enables concurrent control.

+

Fault Rectification

+

GaussDB(DWS) provides an HA mechanism to reduce the service interruption time when a cluster is faulty. It protects key user programs to continuously provide external services, minimizing the impact of hardware, software, and human faults on services and ensuring service continuity.

+
  • Hardware HA: Disk RAID, switch stacking, NIC bond, and uninterruptible power supply (UPS)
  • Software HA: HA mechanism used for instances in the GaussDB(DWS) cluster, such as CNs, GTMs, and DNs)
+

Transaction Management

+
  • Transaction blocks are supported. You can run start transaction to make the startup of a transaction block explicit.
  • Single-statement transactions are supported. If you do not explicitly start a transaction, a single statement is processed as a transaction.
  • Distributed transaction management and global transaction information management are supported. This includes gxid, snapshot, timestamp management, distributed transaction status management, and gxid overflow processing.
  • Distributed transactions have ACID properties.
  • Deadlocks are prevented in the distributed system. A transaction will be unlocked immediately after a deadlock (if any).
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0012.html b/docs/dws/dev/dws_04_0012.html new file mode 100644 index 00000000..68717d7c --- /dev/null +++ b/docs/dws/dev/dws_04_0012.html @@ -0,0 +1,20 @@ + + +

High Query Performance

+

The following GaussDB(DWS) features help achieve high query performance.

+

Fully Parallel Query

GaussDB(DWS) is an MPP system with the shared-nothing architecture. It consists of multiple independent logical nodes that do not share system resources, such as the CPU, memory, and storage units. In such a system architecture, service data is separately stored on numerous nodes. Data analysis tasks are executed in parallel on the nodes where data is stored. The massively parallel data processing significantly improves response speed.

+

In addition, GaussDB(DWS) improves data query performance by executing operators in parallel, executing commands in registers in parallel, and using LLVM to dynamically compile the logical conditions of redundancy prune.

+
+

Hybrid Row-Column Storage

GaussDB(DWS) supports both the row and column storage models. You can choose a row- or column-store table as needed.

+

The hybrid row-column storage engine achieves higher data compression ratio (column storage), index performance (column storage), and point update and point query (row storage) performance.

+
+

Data Compression in Column Storage

You can compress old, inactive data to free up space, reducing procurement and O&M costs.

+

In GaussDB(DWS), data can be compressed using the Delta Value Encoding, Dictionary, RLE, LZ4, and ZLIB algorithms. The system automatically selects a compression algorithm based on data characteristics. The average compression ratio is 7:1. Compressed data can be directly accessed and is transparent to services, greatly reducing the preparation time before accessing historical data.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0015.html b/docs/dws/dev/dws_04_0015.html new file mode 100644 index 00000000..084c2b82 --- /dev/null +++ b/docs/dws/dev/dws_04_0015.html @@ -0,0 +1,22 @@ + + +

Related Concepts

+

Database

A database manages data objects and is isolated from other databases. While creating a database, you can specify a tablespace. If you do not specify it, database objects will be saved to the PG_DEFAULT by default. Objects managed by a database can be distributed to multiple tablespaces.

+
+

Instance

In GaussDB(DWS), instances are a group of database processes running in the memory. An instance can manage one or more databases that form a cluster. A cluster is an area in the storage disk. This area is initialized during installation and composed of a directory. The directory, called data directory, stores all data and is created by initdb. Theoretically, one server can start multiple instances on different ports, but GaussDB(DWS) manages only one instance at a time. The start and stop of an instance rely on the specific data directory. For compatibility purposes, the concept of instance name may be introduced.

+
+

Tablespaces

In GaussDB(DWS), a tablespace is a directory storing physical files of the databases the tablespace contains. Multiple tablespaces can coexist. Files are physically isolated using tablespaces and managed by a file system.

+
+

schema

GaussDB(DWS) schemas logically separate databases. All database objects are created under certain schemas. In GaussDB(DWS), schemas and users are loosely bound. When you create a user, a schema with the same name as the user will be created automatically. You can also create a schema or specify another schema.

+
+

User and Role

GaussDB(DWS) uses users and roles to control the access to databases. A role can be a database user or a group of database users, depending on role settings. In GaussDB(DWS), the difference between roles and users is that a role does not have the LOGIN permission by default. In GaussDB(DWS), one user can have only one role, but you can put a user's role under a parent role to grant multiple permissions to the user.

+
+

Transaction Management

In GaussDB(DWS), transactions are managed by multi-version concurrency control (MVCC) and two-phase locking (2PL). It enables smooth data reads and writes. In GaussDB(DWS), MVCC saves historical version data together with the current tuple version. GaussDB(DWS) uses the VACUUM process instead of rollback segments to routinely delete historical version data. Unless in performance optimization, you do not need to pay attention to the VACUUM process. Transactions are automatically submitted in GaussDB(DWS).

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0042.html b/docs/dws/dev/dws_04_0042.html new file mode 100644 index 00000000..faa3efb3 --- /dev/null +++ b/docs/dws/dev/dws_04_0042.html @@ -0,0 +1,246 @@ + + +

Syntax Compatibility Differences Among Oracle, Teradata, and MySQL

+

GaussDB(DWS) is compatible with Oracle, Teradata and MySQL syntax, of which the syntax behavior is different.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Compatibility differences

Compatibility Item

+

Oracle

+

Teradata

+

MySQL

+

Empty string

+

An empty string is treated as NULL.

+

An empty string is distinguished from NULL.

+

An empty string is distinguished from NULL.

+

Conversion of an empty string to a number

+

NULL

+

0

+

0

+

Automatic truncation of overlong characters

+

Not supported

+

Supported (set GUC parameter td_compatible_truncation to ON)

+

Not supported

+

NULL concatenation

+

Returns a non-NULL object after combining a non-NULL object with NULL.

+

For example, 'abc'||NULL returns 'abc'.

+

The strict_text_concat_td option is added to the GUC parameter behavior_compat_options to be compatible with the Teradata behavior. After the NULL type is concatenated, NULL is returned.

+

For example, 'abc'||NULL returns NULL.

+

Is compatible with MySQL behavior. After the NULL type is concatenated, NULL is returned.

+

For example, 'abc'||NULL returns NULL.

+

Concatenation of the char(n) type

+

Removes spaces and placeholders on the right when the char(n) type is concatenated.

+

For example, cast('a' as char(3))||'b' returns 'ab'.

+

After the bpchar_text_without_rtrim option is added to the GUC parameter behavior_compat_options, when the char(n) type is concatenated, spaces are reserved and supplemented to the specified length n.

+

Currently, ignoring spaces at the end of a string for comparison is not supported. If the concatenated string contains spaces at the end, the comparison is space-sensitive.

+

For example, cast('a' as char(3))||'b' returns 'a b'.

+

Removes spaces and placeholders on the right.

+

concat(str1,str2)

+

Returns the concatenation of all non-NULL strings.

+

Returns the concatenation of all non-NULL strings.

+

If an input parameter is NULL, NULL is returned.

+

left and right processing of negative values

+

Returns all characters except the first and last |n| characters.

+

Returns all characters except the first and last |n| characters.

+

Returns an empty string.

+

lpad(string text, length int [, fill text])

+

rpad(string text, length int [, fill text])

+

Fills up the string to the specified length by appending the fill characters (a space by default). If the string is already longer than length then it is truncated (on the right). If fill is an empty string or length is a negative number, null is returned.

+

If fill is an empty string and the string length is less than the specified length, the original string is returned. If length is a negative number, an empty string is returned.

+

If fill is an empty string and the string length is less than the specified length, an empty string is returned. If length is a negative number, null is returned.

+

log(x)

+

Returns the logarithm with 10 as the base.

+

Returns the logarithm with 10 as the base.

+

Returns the natural logarithm.

+

mod(x, 0)

+

Returns x if the divisor is 0.

+

Returns x if the divisor is 0.

+

Reports an error if the divisor is 0.

+

Data type DATE

+

Converts the DATE data type to the TIMESTAMP data type which stores year, month, day, hour, minute, and second values.

+

Stores year and month values.

+

Stores year and month values.

+

to_char(date)

+

The maximum value of the input parameter can only be the maximum value of the timestamp type. The maximum value of the date type is not supported. The return value is of the timestamp type.

+

The maximum value of the input parameter can only be the maximum value of the timestamp type. The maximum value of the date type is not supported. The return value is of the date type in YYYY/MM/DD format. (The GUC parameter convert_empty_str_to_null_td is enabled.)

+

The maximum value of the input parameter can only be the maximum value of the timestamp type. The maximum value of the date type is not supported. The return value is of the date type.

+

to_date, to_timestamp, and to_number processing of empty strings

+

Returns NULL.

+

Returns NULL. (The convert_empty_str_to_null_td parameter is enabled.)

+

to_date and to_timestamp returns NULL. If the parameter passed to to_number is an empty string, 0 is returned.

+

Return value types of last_day and next_day

+

Returns values of the timestamp type.

+

Returns values of the timestamp type.

+

Returns values of the date type.

+

Return value type of add_months

+

Returns values of the timestamp type.

+

Returns values of the timestamp type.

+

If the input parameter is of the date type, the return value is of the date type.

+

If the input parameter is of the timestamp type, the return value is of the timestamp type.

+

If the input parameter is of the timestamptz type, the return value is of the timestamptz type.

+

CURRENT_TIME

+

CURRENT_TIME(p)

+

Obtains the time of the current transaction. The return value type is timetz.

+

Obtains the time of the current transaction. The return value type is timetz.

+

Obtains the execution time of the current statement. The return value type is time.

+

CURRENT_TIMESTAMP

+

CURRENT_TIMESTAMP(p)

+

Obtains the execution time of the current statement. The return value type is timestamptz.

+

Obtains the execution time of the current statement. The return value type is timestamptz.

+

Obtains the execution time of the current statement. The return value type is timestamp.

+

LOCALTIME

+

LOCALTIME(p)

+

Obtains the time of the current transaction. The return value type is time.

+

Obtains the time of the current transaction. The return value type is time.

+

Obtains the execution time of the current statement. The return value type is time.

+

LOCALTIMESTAMP

+

LOCALTIMESTAMP(p)

+

Obtains the time of the current transaction. The return value type is timestamp.

+

Obtains the time of the current transaction. The return value type is timestamp.

+

Obtains the execution time of the current statement. The return value type is timestamp.

+

SYSDATE

+

SYSDATE(p)

+

Obtains the execution time of the current statement. The return value type is timestamp(0).

+

Obtains the execution time of the current statement. The return value type is timestamp(0).

+

Obtains the current system time. The return value type is timestamp(0).

+

NOW()

+

Obtains the time of the current transaction. The return value type is timestamptz.

+

Obtains the time of the current transaction. The return value type is timestamptz.

+

Obtains the statement execution time. The return value type is timestamptz.

+

Operator ^

+

Performs exponentiation.

+

Performs exponentiation.

+

Performs the exclusive OR operation.

+

Different input parameter types of CASE, COALESCE, IF, and IFNULL expressions

+

Reports error.

+

Is compatible with behavior of Teradata and supports type conversion between digits and strings. For example, if input parameters for COALESCE are of INT and VARCHAR types, the parameters are resolved as VARCHAR type.

+

Is compatible with behavior of MySQL and supports type conversion between strings and other types. For example, if input parameters for COALESCE are of DATE, INT, and VARCHAR types, the parameters are resolved as VARCHAR type.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0043.html b/docs/dws/dev/dws_04_0043.html new file mode 100644 index 00000000..7b520a0c --- /dev/null +++ b/docs/dws/dev/dws_04_0043.html @@ -0,0 +1,18 @@ + + +

Database Security Management

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0053.html b/docs/dws/dev/dws_04_0053.html new file mode 100644 index 00000000..f682daaa --- /dev/null +++ b/docs/dws/dev/dws_04_0053.html @@ -0,0 +1,29 @@ + + +

Managing Users and Their Permissions

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0054.html b/docs/dws/dev/dws_04_0054.html new file mode 100644 index 00000000..d0a13347 --- /dev/null +++ b/docs/dws/dev/dws_04_0054.html @@ -0,0 +1,16 @@ + + +

Default Permission Mechanism

+

A user who creates an object is the owner of this object. By default, Separation of Permissions is disabled after cluster installation. A database system administrator has the same permissions as object owners. After an object is created, only the object owner or system administrator can query, modify, and delete the object, and grant permissions for the object to other users through GRANT by default.

+

To enable another user to use the object, grant required permissions to the user or the role that contains the user.

+

GaussDB(DWS) supports the following permissions: SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, CREATE, CONNECT, EXECUTE, USAGE and ANALYZE|ANALYSE. Permission types are associated with object types. For permission details, see GRANT.

+

To remove permissions, use REVOKE. Object owner permissions such as ALTER, DROP, GRANT, and REVOKE are implicit and cannot be granted or revoked. That is, you have the implicit permissions for an object if you are the owner of the object. Object owners can remove their own common permissions, for example, making tables read-only to themselves or others.

+

System catalogs and views are visible to either system administrators or all users. System catalogs and views that require system administrator permissions can be queried only by system administrators. For details, see System Catalogs and System Views.

+

The database provides the object isolation feature. If this feature is enabled, users can view only the objects (tables, views, columns, and functions) that they have the permission to access. System administrators are not affected by this feature. For details, see ALTER DATABASE.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0055.html b/docs/dws/dev/dws_04_0055.html new file mode 100644 index 00000000..c5b21c9f --- /dev/null +++ b/docs/dws/dev/dws_04_0055.html @@ -0,0 +1,23 @@ + + +

System Administrator

+

A system administrator is an account with the SYSADMIN permission. After a cluster is installed, a system administrator has the permissions of all object owners by default.

+

The user dbadmin created upon GaussDB(DWS) startup is a system administrator.

+

To create a database administrator, connect to the database as an administrator and run the CREATE USER or ALTER statement with SYSADMIN specified.

+
1
CREATE USER sysadmin WITH SYSADMIN password 'password';
+
+ +
+

Alternatively, you can run the following statement:

+
1
ALTER USER joe SYSADMIN;
+
+ +
+

To run the ALTER USER statement, the user must exist.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0056.html b/docs/dws/dev/dws_04_0056.html new file mode 100644 index 00000000..ef665f3d --- /dev/null +++ b/docs/dws/dev/dws_04_0056.html @@ -0,0 +1,155 @@ + + +

Separation of Permissions

+

Descriptions in Default Permission Mechanism and System Administrator are about the initial situation after a cluster is created. By default, a system administrator with the SYSADMIN attribute has the highest-level permissions.

+

To avoid risks caused by centralized permissions, you can enable the separation of permissions to delegate system administrator permissions to security administrators and audit administrators.

+

After the separation of permissions is enabled, a system administrator does not have the CREATEROLE attribute (security administrator) and AUDITADMIN attribute (audit administrator). That is, you do not have the permissions for creating roles and users and the permissions for viewing and maintaining database audit logs. For details about the CREATEROLE and AUDITADMIN attributes, see CREATE ROLE.

+

After the separation of permissions is enabled, system administrators have the permissions only for the objects owned by them.

+

For details, see Separating Rights of Roles.

+

For details about permission changes before and after enabling the separation of permissions, see Table 1 and Table 2.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Default user permissions

Object

+

System Administrator

+

Security Administrator

+

Audit Administrator

+

Common User

+

Tablespace

+

Can create, modify, delete, access, and allocate tablespaces.

+

Cannot create, modify, delete, or allocate tablespaces, with authorization required for accessing tablespaces.

+

Table

+

Has permissions for all tables.

+

Has permissions for its own tables, but does not have permissions for other users' tables.

+

Index

+

Can create indexes on all tables.

+

Can create indexes on their own tables.

+

Schema

+

Has permissions for all schemas.

+

Has all permissions for its own schemas, but does not have permissions for other users' schemas.

+

Function

+

Has permissions for all functions.

+

Has permissions for its own functions, has the call permission for other users' functions in the public schema, but does not have permissions for other users' functions in other schemas.

+

Customized view

+

Has permissions for all views.

+

Has permissions for its own views, but does not have permissions for other users' views.

+

System catalog and system view

+

Has permissions for querying all system catalogs and views.

+

Has permissions for querying only some system catalogs and views. For details, see System Catalogs and System Views.

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Changes in permissions after the separation of permissions

Object

+

System Administrator

+

Security Administrator

+

Audit Administrator

+

Common User

+

Tablespace

+

No change

+

No change

+

Table

+

Permissions reduced

+

Has all permissions for its own tables, but does not have permissions for other users' tables in their schemas.

+

No change

+

Index

+

Permissions reduced

+

Can create indexes on its own tables.

+

No change

+

Schema

+

Permissions reduced

+

Has all permissions for its own schemas, but does not have permissions for other users' schemas.

+

No change

+

Function

+

Permissions reduced

+

Has all permissions for its own functions, but does not have permissions for other users' functions in their schemas.

+

No change

+

Customized view

+

Permissions reduced

+

Has all permissions for its own views and other users' views in the public schema, but does not have permissions for other users' views in their schemas.

+

No change

+

System catalog and system view

+

No change

+

No change

+

No change

+

Has no permission for viewing any system catalogs or views.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0057.html b/docs/dws/dev/dws_04_0057.html new file mode 100644 index 00000000..d0e680cc --- /dev/null +++ b/docs/dws/dev/dws_04_0057.html @@ -0,0 +1,36 @@ + + +

Users

+

You can use CREATE USER and ALTER USER to create and manage database users, respectively. The database cluster has one or more named databases. Users and roles are shared within the entire cluster, but their data is not shared. That is, a user can connect to any database, but after the connection is successful, any user can access only the database declared in the connection request.

+

In non-separation-of-duty scenarios, a GaussDB(DWS) user account can be created and deleted only by a system administrator or a security administrator with the CREATEROLE attribute. In separation-of-duty scenarios, a user account can be created only by a security administrator.

+

When a user logs in, GaussDB(DWS) authenticates the user. A user can own databases and database objects (such as tables), and grant permissions of these objects to other users and roles. In addition to system administrators, users with the CREATEDB attribute can create databases and grant permissions to these databases.

+

Adding, Modifying, and Deleting Users

  • To create a user, use the SQL CREATE USER statement.
    For example, create a user joe and set the CREATEDB attribute for the user.
    1
    CREATE USER joe WITH CREATEDB PASSWORD 'password';
    +
    + +
    +
    +
  • To create a system administrator, use the CREATE USER statement with the SYSADMIN parameter.
  • To delete an existing user, use the DROP USER statement.
  • To change a user account (for example, rename the user or change the password), use the ALTER USER statement.
  • To view a user list, query the PG_USER view.
    1
    SELECT * FROM pg_user; 
    +
    + +
    +
  • To view user attributes, query the system catalog PG_AUTHID.
    1
    SELECT * FROM pg_authid; 
    +
    + +
    +
+
+

Private Users

If multiple service departments use different database user accounts to perform service operations and a database maintenance department at the same level uses database administrator accounts to perform maintenance operations, service departments may require that database administrators, without specific authorization, can manage (DROP, ALTER, and TRUNCATE) their data but cannot access (INSERT, DELETE, UPDATE, SELECT, and COPY) the data. That is, the management permissions of database administrators for tables need to be isolated from their access permissions to improve the data security of common users.

+

In Separation of Permissions mode, a database administrator does not have permissions for the tables in schemas of other users. In this case, database administrators have neither management permissions nor access permissions, which does not meet the requirements of the service departments mentioned above. Therefore, GaussDB(DWS) provides private users to solve the problem. That is, create private users with the INDEPENDENT attribute in non-separation-of-duties mode.

+
1
CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY "password";
+
+ +
+

Database administrators can manage (DROP, ALTER, and TRUNCATE) objects of private users but cannot access (INSERT, DELETE, SELECT, UPDATE, COPY, GRANT, REVOKE, and ALTER OWNER the objects before being authorized.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0058.html b/docs/dws/dev/dws_04_0058.html new file mode 100644 index 00000000..01883662 --- /dev/null +++ b/docs/dws/dev/dws_04_0058.html @@ -0,0 +1,20 @@ + + +

Roles

+

A role is a set of permissions. After a role is granted to a user through GRANT, the user will have all the permissions of the role. It is recommended that roles be used to efficiently grant permissions. For example, you can create different roles of design, development, and maintenance personnel, grant the roles to users, and then grant specific data permissions required by different users. When permissions are granted or revoked at the role level, these changes take effect on all members of the role.

+

GaussDB(DWS) provides an implicitly defined group PUBLIC that contains all roles. By default, all new users and roles have the permissions of PUBLIC. For details about the default permissions of PUBLIC, see GRANT. To revoke permissions of PUBLIC from a user or role, or re-grant these permissions to them, add the PUBLIC keyword in the REVOKE or GRANT statement.

+

To view all roles, query the system catalog PG_ROLES.

+
1
SELECT * FROM PG_ROLES;
+
+ +
+

Adding, Modifying, and Deleting Roles

In non-separation-of-duty scenarios, a role can be created, modified, and deleted only by a system administrator or a user with the CREATEROLE attribute. In separation-of-duty scenarios, a role can be created, modified, and deleted only by a user with the CREATEROLE attribute.

+
  • To create a role, use CREATE ROLE.
  • To add or delete users in an existing role, use ALTER ROLE.
  • To delete a role, use DROP ROLE. DROP ROLE deletes only a role, rather than member users in the role.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0059.html b/docs/dws/dev/dws_04_0059.html new file mode 100644 index 00000000..afbf34f7 --- /dev/null +++ b/docs/dws/dev/dws_04_0059.html @@ -0,0 +1,52 @@ + + +

Schema

+

Schemas function as models. Schema management allows multiple users to use the same database without mutual impacts, to organize database objects as manageable logical groups, and to add third-party applications to the same schema without causing conflicts.

+

Each database has one or more schemas. Each schema contains tables and other types of objects. When a database is created, a schema named public is created by default, and all users have permissions for this schema. You can group database objects by schema. A schema is similar to an OS directory but cannot be nested.

+

The same database object name can be used in different schemas of the same database without causing conflicts. For example, both a_schema and b_schema can contain a table named mytable. Users with required permissions can access objects across multiple schemas of the same database.

+

If a user is created, a schema named after the user will also be created in the current database.

+

Database objects are generally created in the first schema in a database search path. For details about the first schema and how to change the schema order, see Search Path.

+

Creating, Modifying, and Deleting Schemas

  • To create a schema, use CREATE SCHEMA. Any user can create a schema.
  • To change the name or owner of a schema, use ALTER SCHEMA. Only the schema owner can do so.
  • To delete a schema and its objects, use DROP SCHEMA. Only the schema owner can do so.
  • To create a table in a schema, use the schema_name.table_name format to specify the table. If schema_name is not specified, the table will be created in the first schema in Search Path.
  • To view the owner of a schema, perform the following join query on the system catalogs PG_NAMESPACE and PG_USER. Replace schema_name in the statement with the name of the schema to be queried.
    1
    SELECT s.nspname,u.usename AS nspowner FROM pg_namespace s, pg_user u WHERE nspname='schema_name' AND s.nspowner = u.usesysid;
    +
    + +
    +
  • To view a list of all schemas, query the system catalog PG_NAMESPACE.
    1
    SELECT * FROM pg_namespace;
    +
    + +
    +
  • To view a list of tables in a schema, query the system catalog PG_TABLES. For example, the following query will return a table list from PG_CATALOG in the schema.
    1
    SELECT distinct(tablename),schemaname from pg_tables where schemaname = 'pg_catalog';
    +
    + +
    +
+
+

Search Path

A search path is defined in the search_path parameter. The parameter value is a list of schema names separated by commas (,). If no target schema is specified during object creation, the object will be added to the first schema listed in the search path. If there are objects with the same name across different schemas and no schema is specified for an object query, the object will be returned from the first schema containing the object in the search path.

+
  • To view the current search path, use SHOW.
    1
    +2
    +3
    +4
    +5
    SHOW SEARCH_PATH;
    + search_path
    +----------------
    + "$user",public
    +(1 row)
    +
    + +
    +

    The default value of search_path is "$user",public. $user indicates the name of the schema with the same name as the current session user. If the schema does not exist, $user will be ignored. By default, after a user connects to a database that has schemas with the same name, objects will be added to all the schemas. If there are no such schemas, objects will be added to only to the public schema.

    +
  • To change the default schema of the current session, run the SET statement.
    Run the following command to set search_path to myschema and public (myschema will be searched first):
    1
    +2
    SET SEARCH_PATH TO myschema, public;
    +SET
    +
    + +
    +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0060.html b/docs/dws/dev/dws_04_0060.html new file mode 100644 index 00000000..e6c6ffb2 --- /dev/null +++ b/docs/dws/dev/dws_04_0060.html @@ -0,0 +1,38 @@ + + +

User Permission Setting

+
  • To grant the permission for an object directly to a user, use GRANT.

    When permissions for a table or view in a schema are granted to a user or role, the USAGE permission of the schema must be granted together. Otherwise, the user or role can only see the names of the objects but cannot actually access them.

    +

    In the following example, permissions for the schema tpcds are first granted to the user joe, and then the SELECT permission for the tpcds.web_returns table is also granted.

    +
    1
    +2
    GRANT USAGE ON SCHEMA tpcds TO joe;
    +GRANT SELECT ON TABLE tpcds.web_returns to joe;
    +
    + +
    +
  • Granting a role to a user allows the user to inherit the object permissions of the role.
    1. Create a role.

      Create a role lily and grant the system permission CREATEDB to the role.

      +
      1
      CREATE ROLE lily WITH CREATEDB PASSWORD 'password';
      +
      + +
      +
    2. To grant object permissions to a role, use GRANT.

      For example, first grant permissions for the schema tpcds to the role lily, and then grant the SELECT permission of the tpcds.web_returns table to lily.

      +
      1
      +2
      GRANT USAGE ON SCHEMA tpcds TO lily;
      +GRANT SELECT ON TABLE tpcds.web_returns to lily;
      +
      + +
      +
    3. Grant the role permissions to a user.
      1
      GRANT lily to joe;
      +
      + +
      +

      When the permissions of a role are granted to a user, the attributes of the role are not transferred together.

      +
      +
    +
  • To revoke user permissions, use REVOKE.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0061.html b/docs/dws/dev/dws_04_0061.html new file mode 100644 index 00000000..28f1ee91 --- /dev/null +++ b/docs/dws/dev/dws_04_0061.html @@ -0,0 +1,182 @@ + + +

Row-Level Access Control

+

The row-level access control feature enables database access control to be accurate to each row of data tables. In this way, the same SQL query may return different results for different users.

+

You can create a row-level access control policy for a data table. The policy defines an expression that takes effect only for specific database users and SQL operations. When a database user accesses the data table, if a SQL statement meets the specified row-level access control policies of the data table, the expressions that meet the specified condition will be combined by using AND or OR based on the attribute type (PERMISSIVE | RESTRICTIVE) and applied to the execution plan in the query optimization phase.

+

Row-level access control is used to control the visibility of row-level data in tables. By predefining filters for data tables, the expressions that meet the specified condition can be applied to execution plans in the query optimization phase, which will affect the final execution result. Currently, the SQL statements that can be affected include SELECT, UPDATE, and DELETE.

+

Scenario 1: A table summarizes the data of different users. Users can view only their own data.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
-- Create users alice, bob, and peter.
+CREATE ROLE alice PASSWORD 'password';
+CREATE ROLE bob PASSWORD 'password';
+CREATE ROLE peter PASSWORD 'password';
+
+-- Create the public.all_data table that contains user information.
+CREATE TABLE public.all_data(id int, role varchar(100), data varchar(100));
+
+-- Insert data into the data table.
+INSERT INTO all_data VALUES(1, 'alice', 'alice data');
+INSERT INTO all_data VALUES(2, 'bob', 'bob data');
+INSERT INTO all_data VALUES(3, 'peter', 'peter data');
+
+-- Grant the read permission for the all_data table to users alice, bob, and peter.
+GRANT SELECT ON all_data TO alice, bob, peter;
+
+-- Enable row-level access control.
+ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;
+
+-- Create a row-level access control policy to specify that the current user can view only their own data.
+CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER);
+
+-- View table details.
+\d+ all_data
+                               Table "public.all_data"
+ Column |          Type          | Modifiers | Storage  | Stats target | Description
+--------+------------------------+-----------+----------+--------------+-------------
+ id     | integer                |           | plain    |              |
+ role   | character varying(100) |           | extended |              |
+ data   | character varying(100) |           | extended |              |
+Row Level Security Policies:
+    POLICY "all_data_rls"
+      USING (((role)::name = "current_user"()))
+Has OIDs: no
+Distribute By: HASH(id)
+Location Nodes: ALL DATANODES
+Options: orientation=row, compression=no, enable_rowsecurity=true
+
+-- Switch to user alice and run SELECT * FROM all_data.
+SET ROLE alice PASSWORD 'password';
+SELECT * FROM all_data;
+ id | role  |    data
+----+-------+------------
+  1 | alice | alice data
+(1 row)
+
+EXPLAIN(COSTS OFF) SELECT * FROM all_data;
+                           QUERY PLAN
+----------------------------------------------------------------
+  id |          operation
+ ----+------------------------------
+   1 | ->  Streaming (type: GATHER)
+   2 |    ->  Seq Scan on all_data
+
+         Predicate Information (identified by plan id)
+ --------------------------------------------------------------
+   2 --Seq Scan on all_data
+         Filter: ((role)::name = 'alice'::name)
+ Notice: This query is influenced by row level security feature
+(10 rows)
+
+-- Switch to user peter and run SELECT * FROM .all_data.
+SET ROLE peter PASSWORD 'password';
+SELECT * FROM all_data;
+ id | role  |    data
+----+-------+------------
+  3 | peter | peter data
+(1 row)
+
+EXPLAIN(COSTS OFF) SELECT * FROM all_data;
+                           QUERY PLAN
+----------------------------------------------------------------
+  id |          operation
+ ----+------------------------------
+   1 | ->  Streaming (type: GATHER)
+   2 |    ->  Seq Scan on all_data
+
+         Predicate Information (identified by plan id)
+ --------------------------------------------------------------
+   2 --Seq Scan on all_data
+         Filter: ((role)::name = 'peter'::name)
+ Notice: This query is influenced by row level security feature
+(10 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0062.html b/docs/dws/dev/dws_04_0062.html new file mode 100644 index 00000000..7eb887e5 --- /dev/null +++ b/docs/dws/dev/dws_04_0062.html @@ -0,0 +1,114 @@ + + +

Data Redaction

+

GaussDB(DWS) provides the column-level dynamic data masking (DDM) function. For sensitive data, such as the ID card number, mobile number, and bank card number, the DDM function is used to redact the original data to protect data security and user privacy.

+
  • You can create a redaction policy for a specified table object and set the effective scope of the policy. For details, see section "CREATE REDACTION POLICY" in SQL Syntax Reference.
  • You can modify a redaction policy using the provided syntax, including modifying expressions for the policy to take effect, renaming the policy, and adding, modifying, and deleting redacted columns. For details, see section "ALTER REDACTION POLICY" in SQL Syntax Reference.
  • You can delete a redaction policy by deleting data redaction function information of the policy from all columns of a table. For details, see "DROP REDACTION POLICY" in SQL Syntax Reference.
  • You can use the built-in masking functions MASK_NONE, MASK_FULL, and MASK_PARTIAL, or create your own masking functions by using PL/pgSQL. For details, see "Data Masking Functions" in SQL Syntax Reference.
  • Redaction policy information is stored in the system catalog PG_REDACTION_POLICY, and redacted column information is stored in the system catalog PG_REDACTION_COLUMN.
  • You can view information about the redaction policy and redacted columns in the system views REDACTION_POLICIES and REDACTION_COLUMNS.
+
  • Generally, you can execute a SELECT statement to view the data redaction result. If the statement has the following features, sensitive data may be deliberately obtained. In this case, an error will be reported during statement execution.
    • The GROUP BY clause references a Target Entry that contains redacted columns as the target column.
    • The DISTINCT clause is executed on the output redacted columns.
    • The statement contains CTE.
    • Set operations are involved.
    • The target columns of a subquery are not redacted columns of the base table, but are the expressions or function calls for the redacted columns of the base table.
    +
  • You can use COPY TO or GDS to export the redacted data. As the redacted data is irreversible, any secondary operation on the redacted data is meaningless.
  • The target columns of UPDATE, MERGE INTO, and DELETE statements cannot contain redacted columns.
  • The UPSERT statement allows you to update data using EXCLUDED. If data in the base table is updated by referencing redacted columns, the data may be modified by mistake. As a result, an error will be reported during the execution.
+
+

Examples

The following uses the employee table emp, administrator alice, and common users matu and july as examples to describe the data redaction process. The user alice is the owner of the emp table. The emp table contains private data such as the employee name, mobile number, email address, bank card number, and salary.

+
  1. Create users alice, matu, and july:
    CREATE ROLE alice PASSWORD 'password';
    +CREATE ROLE matu PASSWORD 'password';
    +CREATE ROLE july PASSWORD 'password';
    +
  2. Create the emp table as user alice, and insert three employee records into the table.
    CREATE TABLE emp(id int, name varchar(20), phone_no varchar(11), card_no number, card_string varchar(19), email text, salary numeric(100, 4), birthday date);
    +
    +INSERT INTO emp VALUES(1, 'anny', '13420002340', 1234123412341234, '1234-1234-1234-1234', 'smithWu@163.com', 10000.00, '1999-10-02');
    +INSERT INTO emp VALUES(2, 'bob', '18299023211', 3456345634563456, '3456-3456-3456-3456', '66allen_mm@qq.com', 9999.99, '1989-12-12');
    +INSERT INTO emp VALUES(3, 'cici', '15512231233', NULL, NULL, 'jonesishere@sina.com', NULL, '1992-11-06');
    +
  3. User alice grants the emp table read permission to users matu and july.
    GRANT SELECT ON emp TO matu, july;
    +
  4. Only user alice can view all employee information. Users matu and july cannot view bank card numbers and salary data of the employees. Create a redaction policy for the emp table and bind the redaction function to card_no, card_string, and salary columns, respectively.
    CREATE REDACTION POLICY mask_emp ON emp WHEN (current_user IN ('matu', 'july'))
    +ADD COLUMN card_no WITH mask_full(card_no),
    +ADD COLUMN card_string WITH mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV','VVVV-VVVV-VVVV-VVVV','#',1,12),
    +ADD COLUMN salary WITH mask_partial(salary, '9', 1, length(salary) - 2);
    +
  5. Switch to users matu and july and view the emp table, respectively.
    SET ROLE matu PASSWORD 'password';
    +SELECT * FROM emp;
    + id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday       
    +----+------+-------------+---------+---------------------+----------------------+------------+---------------------
    +  1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00
    +  2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00
    +  3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00
    +(3 rows)
    +
    +SET ROLE july PASSWORD 'password';
    +SELECT * FROM emp;
    + id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday       
    +----+------+-------------+---------+---------------------+----------------------+------------+---------------------
    +  1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00
    +  2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00
    +  3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00
    +(3 rows)
    +
  6. User matu also has the permission for viewing all employee information, but user july does not. Modify the effective scope of the redaction policy.
    ALTER REDACTION POLICY mask_emp ON emp WHEN(current_user = 'july');
    +
  7. Switch to users matu and july and view the emp table again, respectively.
    SET ROLE matu PASSWORD 'password';
    +SELECT * FROM emp;
    + id | name |  phone_no   |     card_no      |     card_string     |        email         |   salary   |      birthday       
    +----+------+-------------+------------------+---------------------+----------------------+------------+---------------------
    +  1 | anny | 13420002340 | 1234123412341234 | 1234-1234-1234-1234 | smithWu@163.com      | 10000.0000 | 1999-10-02 00:00:00
    +  2 | bob  | 18299023211 | 3456345634563456 | 3456-3456-3456-3456 | 66allen_mm@qq.com    |  9999.9900 | 1989-12-12 00:00:00
    +  3 | cici | 15512231233 |                  |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00
    +(3 rows)
    +
    +SET ROLE july PASSWORD 'password';
    +SELECT * FROM emp;
    + id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday       
    +----+------+-------------+---------+---------------------+----------------------+------------+---------------------
    +  1 | anny | 13420002340 |       0 | ####-####-####-1234 | smithWu@163.com      | 99999.9990 | 1999-10-02 00:00:00
    +  2 | bob  | 18299023211 |       0 | ####-####-####-3456 | 66allen_mm@qq.com    |  9999.9990 | 1989-12-12 00:00:00
    +  3 | cici | 15512231233 |         |                     | jonesishere@sina.com |            | 1992-11-06 00:00:00
    +(3 rows)
    +
  8. The information in the phone_no, email, and birthday columns is private data. Update the redaction policy mask_emp and add three redacted columns.
    ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN phone_no WITH mask_partial(phone_no, '*', 4);
    +ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN email WITH mask_partial(email, '*', 1, position('@' in email));
    +ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN birthday WITH mask_full(birthday);
    +
  9. Switch to user july and view the emp table data.
    SET ROLE july PASSWORD 'password';
    +SELECT * FROM emp;
    + id | name |  phone_no   | card_no |     card_string     |        email         |   salary   |      birthday       
    +----+------+-------------+---------+---------------------+----------------------+------------+---------------------
    +  1 | anny | 134******** |       0 | ####-####-####-1234 | ********163.com      | 99999.9990 | 1970-01-01 00:00:00
    +  2 | bob  | 182******** |       0 | ####-####-####-3456 | ***********qq.com    |  9999.9990 | 1970-01-01 00:00:00
    +  3 | cici | 155******** |         |                     | ************sina.com |            | 1970-01-01 00:00:00
    +(3 rows)
    +
  10. Query redaction_policies and redaction_columns to view details about the current redaction policy mask_emp.
    SELECT * FROM redaction_policies;
    + object_schema | object_owner | object_name | policy_name |            expression             | enable | policy_description 
    +---------------+--------------+-------------+-------------+-----------------------------------+--------+--------------------
    + public        | alice        | emp         | mask_emp    | ("current_user"() = 'july'::name) | t      | 
    +(1 row)
    +
    +SELECT object_name, column_name, function_info FROM redaction_columns;
    + object_name | column_name |                                             function_info                                             
    +-------------+-------------+-------------------------------------------------------------------------------------------------------
    + emp         | card_no     | mask_full(card_no)
    + emp         | card_string | mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV'::text, 'VVVV-VVVV-VVVV-VVVV'::text, '#'::text, 1, 12)
    + emp         | email       | mask_partial(email, '*'::text, 1, "position"(email, '@'::text))
    + emp         | salary      | mask_partial(salary, '9'::text, 1, (length((salary)::text) - 2))
    + emp         | birthday    | mask_full(birthday)
    + emp         | phone_no    | mask_partial(phone_no, '*'::text, 4)
    +(6 rows)
    +
  11. Add the salary_info column. To replace the salary information in text format with *.*, you can create a user-defined redaction function. In this step, you can use the PL/pgSQL to define the redaction function mask_regexp_salary. To create a redaction column, you simply need to customize the function name and parameter list. For details, see User-Defined Functions.
    ALTER TABLE emp ADD COLUMN salary_info TEXT;
    +UPDATE emp SET salary_info = salary::text;
    +
    +CREATE FUNCTION mask_regexp_salary(salary_info text) RETURNS text AS
    +$$
    + SELECT regexp_replace($1, '[0-9]+','*','g');
    +$$
    +LANGUAGE SQL
    +STRICT SHIPPABLE;
    +
    +ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN salary_info WITH mask_regexp_salary(salary_info);
    +
    +SET ROLE july PASSWORD 'password';
    +SELECT id, name, salary_info FROM emp;
    + id | name | salary_info 
    +----+------+-------------
    +  1 | anny | *.*
    +  2 | bob  | *.*
    +  3 | cici | 
    +(3 rows)
    +
  12. If there is no need to set a redaction policy for the emp table, delete the redaction policy mask_emp.
    DROP REDACTION POLICY mask_emp ON emp;
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0063.html b/docs/dws/dev/dws_04_0063.html new file mode 100644 index 00000000..7bc8e0e7 --- /dev/null +++ b/docs/dws/dev/dws_04_0063.html @@ -0,0 +1,19 @@ + + +

Setting Security Policies

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0064.html b/docs/dws/dev/dws_04_0064.html new file mode 100644 index 00000000..39a31ca3 --- /dev/null +++ b/docs/dws/dev/dws_04_0064.html @@ -0,0 +1,35 @@ + + +

Setting Account Security Policies

+

Background

For data security purposes, GaussDB(DWS) provides a series of security measures, such as automatically locking and unlocking accounts, manually locking and unlocking abnormal accounts, and deleting accounts that are no longer used.

+
+

Automatically Locking and Unlocking Accounts

  • If a user fails to enter the correct password for over 10 times during database connection, the system automatically locks the account.
  • An account is automatically unlocked one day after it was locked.
+
+

Manually Locking and Unlocking Accounts

If administrators detect an abnormal account that may be stolen or illegally accesses the database, they can manually lock the account.

+

The administrator can also manually unlock the account if the account becomes normal again.

+

For details about how to create a user, see Users. To manually lock and unlock user joe, run commands in the following format:

+
  • To manually lock the user:
    1
    ALTER USER joe ACCOUNT LOCK;
    +
    + +
    +
  • To manually unlock the user:
    1
    ALTER USER joe ACCOUNT UNLOCK;
    +
    + +
    +
+
+

Deleting Accounts that Are No Longer Used

An administrator can delete an account that is no longer used. This operation cannot be rolled back.

+

When an account to be deleted is in the active state, it is deleted after the session is disconnected.

+

For example, if you want to delete account joe, run the command in the following format:

+
1
DROP USER joe CASCADE;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0065.html b/docs/dws/dev/dws_04_0065.html new file mode 100644 index 00000000..9e4f6ac8 --- /dev/null +++ b/docs/dws/dev/dws_04_0065.html @@ -0,0 +1,25 @@ + + +

Setting the Validity Period of an Account

+

Precautions

When creating a user, you need to specify the validity period of the user, including the start time and end time.

+

To enable a user not within the validity period to use its account, set a new validity period.

+
+

Procedure

  1. Run the following command to create a user and specify the start time and end time.

    1
    CREATE USER joe WITH PASSWORD 'password' VALID BEGIN '2015-10-10 08:00:00' VALID UNTIL '2016-10-10 08:00:00';
    +
    + +
    +

  2. If the user is not within the specified validity period, run the following command to set the start time and end time of a new validity period.

    1
    ALTER USER joe WITH VALID BEGIN '2016-11-10 08:00:00' VALID UNTIL '2017-11-10 08:00:00';
    +
    + +
    +

+

If VALID BEGIN is not specified in the CREATE ROLE or ALTER ROLE statement, the start time of the validity period is not limited. If VALID UNTIL is not specified, the end time of the validity period is not limited. If both of the parameters are not specified, the user is always valid.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0066.html b/docs/dws/dev/dws_04_0066.html new file mode 100644 index 00000000..afd91c73 --- /dev/null +++ b/docs/dws/dev/dws_04_0066.html @@ -0,0 +1,20 @@ + + +

Overview

+

MRS is a big data cluster running based on the open-source Hadoop ecosystem. It provides the industry's latest cutting-edge storage and analytical capabilities of massive volumes of data, satisfying your data storage and processing requirements. For details, see the MapReduce Service User Guide.

+

You can use Hive/Spark (analysis cluster of MRS) to store massive volumes of service data. Hive/Spark data files are stored on HDFS. On GaussDB(DWS), you can connect a GaussDB(DWS) cluster to an MRS cluster, read data from HDFS files, and write the data to GaussDB(DWS) when the clusters are on the same network.

+

Ensure that MRS can communicate with DWS:

+

Scenario 1: If MRS and DWS are in the same region and VPC, they can communicate with each other by default.

+

Scenario 2: If MRS and DWS are in the same region but in different VPCs, you need to create a VPC peering connection. For details, see "VPC Peering Connection Overview" in Virtual Private Cloud User Guide.

+

Scenario 3: If MRS and DWS are not in the same region. You need to use Cloud Connect (CC) to create network connections. For details, see the user guide of the corresponding service.

+

Scenario 4: If MRS is deployed on-premises, you need to use Direct Connect (DC) or Virtual Private Network (VPN) to create network connections. For details, see the user guide of the corresponding service.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0067.html b/docs/dws/dev/dws_04_0067.html new file mode 100644 index 00000000..70892859 --- /dev/null +++ b/docs/dws/dev/dws_04_0067.html @@ -0,0 +1,202 @@ + + +

Setting a User Password

+

User passwords are stored in the system catalog pg_authid. To prevent password leakage, GaussDB(DWS) encrypts and stores the user passwords.

+
  • Password complexity

    The password complexity requirements are as follows:

    +
    • The number of uppercase letters (A–Z) ranges from 0 to 999, the number of lowercase letters (a–z) ranges from 0 to 999, the number of digits ranges from 0 to 999, and the number of special characters ranges from 0 to 999. For details about the special characters, see Table 1.

      A password must contain at least three types of the preceding characters (uppercase letters, lowercase letters, digits, and special characters).

      +
      +
    • A password must contain at least 6 characters, and the default length is 8 characters.
    • A password can contain a maximum of 999 characters, and the default length is 32 characters.
    • A password must differ from the username or the username in reverse order.
    • A new password must be different from the current password or the current password in reverse order.
    +
  • Password reuse

    When a user changes the password, the user can reuse a password only if it has not been used for over 60 days.

    +
  • Password validity period

    A validity period (90 days by default) is set for each database user password. If the password is about to expire (in seven days), the system displays a message reminding the user to change it upon login.

    +

    Considering the usage and service continuity of a database, the database still allows a user to log in after the password expires. A password change notification is displayed every time the user logs in to the database until the password is changed.

    +
    +
  • Password change
    • During database installation, an OS user named the same as the initial user is created. The password of the OS user needs to be changed periodically to ensure account security.
      If the password of the user user1 needs to be changed, run the following command:
      passwd user1
      +
      +

      Change the password as prompted.

      +
    • Both system administrators and common users need to periodically change their passwords to prevent the accounts from being stolen.

      For example, to change the password of the user user1, connect to the database as the administrator and run the following command:

      +
      1
      ALTER USER user1 IDENTIFIED BY "1234@abc" REPLACE "5678@def";
      +
      + +
      +

      1234@abc and 5678@def represent the new password and the original password of the user user1, respectively. The new password must conform to the complexity rules. Otherwise, the new password is invalid.

      +
      +
    • An administrator can change its own password and other accounts' passwords. With the permission for changing other accounts' passwords, the administrator can resolve a login failure when a user forgets its password.

      To change the password of the user joe, run the following command:

      +
      1
      ALTER USER joe IDENTIFIED BY 'password';
      +
      + +
      +
    +
    • System administrators are not allowed to change passwords for each other.
    • When a system administrator changes the password of a common user, the original password is not required.
    • However, when a system administrator changes its own password, the original password is required.
    +
    +
  • Password verification

    Password verification is required when you set the user or role in the current session. If the entered password is inconsistent with the stored password of the user, an error is reported.

    +

    To set the password of the user joe, run the following command:

    +
    1
    SET ROLE joe PASSWORD 'password';
    +
    + +
    +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Special characters

No.

+

Character

+

No.

+

Character

+

No.

+

Character

+

No.

+

Character

+

1

+

~

+

9

+

*

+

17

+

|

+

25

+

<

+

2

+

!

+

10

+

(

+

18

+

[

+

26

+

.

+

3

+

@

+

11

+

)

+

19

+

{

+

27

+

>

+

4

+

#

+

12

+

-

+

20

+

}

+

28

+

/

+

5

+

$

+

13

+

_

+

21

+

]

+

29

+

?

+

6

+

%

+

14

+

=

+

22

+

;

+

-

+

-

+

7

+

^

+

15

+

+

+

23

+

:

+

-

+

-

+

8

+

&

+

16

+

\

+

24

+

,

+

-

+

-

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0074.html b/docs/dws/dev/dws_04_0074.html new file mode 100644 index 00000000..6cdc50b3 --- /dev/null +++ b/docs/dws/dev/dws_04_0074.html @@ -0,0 +1,27 @@ + + +

Development and Design Proposal

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0075.html b/docs/dws/dev/dws_04_0075.html new file mode 100644 index 00000000..ea886ac8 --- /dev/null +++ b/docs/dws/dev/dws_04_0075.html @@ -0,0 +1,13 @@ + + +

Development and Design Proposal

+

This chapter describes the design specifications for database modeling and application development. Modeling compliant with these specifications fits the distributed processing architecture of GaussDB(DWS) and provides efficient SQL code.

+

The meaning of "Proposal" and "Notice" in this chapter is as follows:

+
  • Proposal: Design rules. Services compliant with the rules can run efficiently, and those violating the rules may have low performance or logic errors.
  • Notice: Details requiring attention during service development. This term identifies SQL behavior that complies with SQL standards but users may have misconceptions about, and default behavior that users may be unaware of in a program.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0076.html b/docs/dws/dev/dws_04_0076.html new file mode 100644 index 00000000..b491d1ad --- /dev/null +++ b/docs/dws/dev/dws_04_0076.html @@ -0,0 +1,16 @@ + + +

Database Object Naming Conventions

+

The name of a database object must contain 1 to 63 characters, start with a letter or underscore (_), and can contain letters, digits, underscores (_), dollar signs ($), and number signs (#).

+
  • [Proposal] Do not use reserved or non-reserved keywords to name database objects.

    To query the keywords of GaussDB(DWS), run select * from pg_get_keywords() or refer to section "Keyword."

    +
    +
  • [Proposal] Do not use a string enclosed in double quotation marks ("") to define the database object name, unless you need to specify its capitalization. Case sensitivity of database object names makes problem location difficult.
  • [Proposal] Use the same naming format for database objects.
    • In a system undergoing incremental development or service migration, you are advised to comply with its historical naming conventions.
    • A database object name consists of letters, digits, and underscores (_); and cannot start with a digit. You are advised to use multiple words separated with hyphens (-).
    • You are advised to use intelligible names and common acronyms or abbreviations for database objects. Acronyms or abbreviations that are generally understood are recommended. For example, you can use English words indicating actual business terms. The naming format should be consistent within a cluster.
    • A variable name must be descriptive and meaningful. It must have a prefix indicating its type.
    +
  • [Proposal] The name of a table object should indicate its main characteristics, for example, whether it is an ordinary, temporary, or unlogged table.
    • An ordinary table name should indicate the business relevant to a data set.
    • Temporary tables are named in the format of tmp_Suffix.
    • Unlogged tables are named in the format of ul_Suffix.
    • Foreign tables are named in the format of f_Suffix.
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0077.html b/docs/dws/dev/dws_04_0077.html new file mode 100644 index 00000000..ed25866a --- /dev/null +++ b/docs/dws/dev/dws_04_0077.html @@ -0,0 +1,23 @@ + + +

Database Object Design

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0078.html b/docs/dws/dev/dws_04_0078.html new file mode 100644 index 00000000..fb33fc70 --- /dev/null +++ b/docs/dws/dev/dws_04_0078.html @@ -0,0 +1,16 @@ + + +

Database and Schema Design

+

In GaussDB(DWS), services can be isolated by databases and schemas. Databases share little resources and cannot directly access each other. Connections to and permissions on them are also isolated. Schemas share more resources than databases do. User permissions on schemas and subordinate objects can be controlled using the GRANT and REVOKE syntax.

+
  • You are advised to use schemas to isolate services for convenience and resource sharing.
  • It is recommended that system administrators create schemas and databases and then assign required permissions to users.
+

Database Design Suggestions

  • Create databases as required. Do not use the default gaussdb database of a cluster.
  • Create a maximum of three user-defined databases in a cluster.
  • To make your database encoding compatible with most characters, you are advised to use the UTF-8 encoding when creating a database.
  • Exercise caution when you set ENCODING and DBCOMPATIBILITY configuration items during database creation. In GaussDB(DWS), DBCOMPATIBILITY can be set to TD, Oracle, or MySQL to be compatible with Teradata, Oracle, or MySQL syntax, respectively. Syntax behavior may vary with the three modes. For details, see Syntax Compatibility Differences Among Oracle, Teradata, and MySQL.
  • By default, a database owner has all permissions for all objects in the database, including the deletion permission. Exercise caution when using the deletion permission.
+
+

Schema Design Suggestions

  • To let a user access an object in a schema, grant the usage permission and the permissions for the object to the user, unless the user has the sysadmin permission or is the schema owner.
  • To let a user create an object in the schema, grant the create permission for the schema to the user.
  • By default, a schema owner has all permissions for all objects in the schema, including the deletion permission. Exercise caution when using the deletion permission.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0079.html b/docs/dws/dev/dws_04_0079.html new file mode 100644 index 00000000..de397c74 --- /dev/null +++ b/docs/dws/dev/dws_04_0079.html @@ -0,0 +1,111 @@ + + +

Table Design

+

GaussDB(DWS) uses a distributed architecture. Data is distributed on DNs. Comply with the following principles to properly design a table:

+
  • [Notice] Evenly distribute data on each DN to prevent data skew. If most data is stored on several DNs, the effective capacity of a cluster decreases. Select a proper distribution column to avoid data skew.
  • [Notice] Evenly scan each DN when querying tables. Otherwise, DNs most frequently scanned will become the performance bottleneck. For example, when you use equivalent filter conditions on a fact table, the nodes are not evenly scanned.
  • [Notice] Reduce the amount of data to be scanned. You can use the pruning mechanism of a partitioned table.
  • [Notice] Minimize random I/O. By clustering or local clustering, you can sequentially store hot data, converting random I/O to sequential I/O to reduce the cost of I/O scanning.
  • [Notice] Try to avoid data shuffling. To shuffle data is to physically transfer it from one node to another. This unnecessarily occupies many network resources. To reduce network pressure, locally process data, and to improve cluster performance and concurrency, you can minimize data shuffling by using proper association and grouping conditions.
+

Selecting a Storage Mode

[Proposal] Selecting a storage mode is the first step in defining a table. The storage mode mainly depends on the customer's service type. For details, see Table 1.

+ +
+ + + + + + + + + + +
Table 1 Table storage modes and scenarios

Storage Mode

+

Application Scenarios

+

Row storage

+
  • Point queries (simple index-based queries that only return a few records)
  • Scenarios requiring frequent addition, deletion, and modification
+

Column storage

+
  • Statistical analysis queries (requiring a large number of association and grouping operations)
  • Ad hoc queries (using uncertain query conditions and unable to utilize indexes to scan row-store tables)
+
+
+
+

Selecting a Distribution Mode

[Proposal] Comply with the following rules to distribute table data. +
+ + + + + + + + + + + + + +
Table 2 Table distribution modes and scenarios

Distribution Mode

+

Description

+

Application Scenarios

+

Hash

+

Table data is distributed on all DNs in a cluster by hash.

+

Fact tables containing a large amount of data

+

Replication

+

Full data in a table is stored on every DN in a cluster.

+

Dimension tables and fact tables containing a small amount of data

+
+
+
+
+

Selecting a Partitioning Mode

Comply with the following rules to partition a table containing a large amount of data:

+
  • [Proposal] Create partitions on columns that indicate certain ranges, such as dates and regions.
  • [Proposal] A partition name should show the data characteristics of a partition. For example, its format can be Keyword+Range characteristics.
  • [Proposal] Set the upper limit of a partition to MAXVALUE to prevent data overflow.
+

The example of a partitioned table definition is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
CREATE TABLE staffS_p1
+(
+  staff_ID       NUMBER(6) not null,
+  FIRST_NAME     VARCHAR2(20),
+  LAST_NAME      VARCHAR2(25),
+  EMAIL          VARCHAR2(25),
+  PHONE_NUMBER   VARCHAR2(20),
+  HIRE_DATE      DATE,
+  employment_ID  VARCHAR2(10),
+  SALARY         NUMBER(8,2),
+  COMMISSION_PCT NUMBER(4,2),
+  MANAGER_ID     NUMBER(6),
+  section_ID     NUMBER(4)
+)
+PARTITION BY RANGE (HIRE_DATE)
+( 
+   PARTITION HIRE_19950501 VALUES LESS THAN ('1995-05-01 00:00:00'),
+   PARTITION HIRE_19950502 VALUES LESS THAN ('1995-05-02 00:00:00'),
+   PARTITION HIRE_maxvalue VALUES LESS THAN (MAXVALUE)
+);
+
+ +
+
+

Selecting a Distribution Key

Selecting a distribution key is important for a hash table. An improper distribution key may cause data skew. As a result, the I/O load is heavy on several DNs, affecting the overall query performance. After you select a distribution policy for a hash table, check for data skew to ensure that data is evenly distributed. Comply with the following rules to select a distribution key:

+
  • [Proposal] Select a column containing discrete data as the distribution key, so that data can be evenly distributed on each DN. If a single column is not discrete enough, consider using multiple columns as distribution keys. You can select the primary key of a table as the distribution key. For example, in an employee information table, select the certificate number column as the distribution key.
  • [Proposal] If the first rule is met, do not select a column having constant filter conditions as the distribution key. For example, in a query on the dwcjk table, if the zqdh column contains the constant filter condition zqdh='000001', avoid selecting the zqdh column as the distribution key.
  • [Proposal] If the first and second rules are met, select the join conditions in a query as distribution keys. If a join condition is used as a distribution key, the data involved in a join task is locally distributed on DNs, which greatly reduces the data flow cost among DNs.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0080.html b/docs/dws/dev/dws_04_0080.html new file mode 100644 index 00000000..25ce142d --- /dev/null +++ b/docs/dws/dev/dws_04_0080.html @@ -0,0 +1,92 @@ + + +

Column Design

+

Selecting a Data Type

Comply with the following rules to improve query efficiency when you design columns:

+
  • [Proposal] Use the most efficient data types allowed.

    If all of the following number types provide the required service precision, they are recommended in descending order of priority: integer, floating point, and numeric.

    +
  • [Proposal] In tables that are logically related, columns having the same meaning should use the same data type.
  • [Proposal] For string data, you are advised to use variable-length strings and specify the maximum length. To avoid truncation, ensure that the specified maximum length is greater than the maximum number of characters to be stored. You are not advised to use CHAR(n), BPCHAR(n), NCHAR(n), or CHARACTER(n), unless you know that the string length is fixed.

    For details about string types, see Common String Types.

    +
+
+

Common String Types

Every column requires a data type suitable for its data characteristics. The following table lists common string types in GaussDB(DWS).

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Common string types

Parameter

+

Description

+

Max. Storage Capacity

+

CHAR(n)

+

Fixed-length string, where n indicates the stored bytes. If the length of an input string is smaller than n, the string is automatically padded to n bytes using NULL characters.

+

10 MB

+

CHARACTER(n)

+

Fixed-length string, where n indicates the stored bytes. If the length of an input string is smaller than n, the string is automatically padded to n bytes using NULL characters.

+

10 MB

+

NCHAR(n)

+

Fixed-length string, where n indicates the stored bytes. If the length of an input string is smaller than n, the string is automatically padded to n bytes using NULL characters.

+

10 MB

+

BPCHAR(n)

+

Fixed-length string, where n indicates the stored bytes. If the length of an input string is smaller than n, the string is automatically padded to n bytes using NULL characters.

+

10 MB

+

VARCHAR(n)

+

Variable-length string, where n indicates the maximum number of bytes that can be stored.

+

10 MB

+

CHARACTER VARYING(n)

+

Variable-length string, where n indicates the maximum number of bytes that can be stored. This data type and VARCHAR(n) are different representations of the same data type.

+

10 MB

+

VARCHAR2(n)

+

Variable-length string, where n indicates the maximum number of bytes that can be stored. This data type is added to be compatible with the Oracle database, and its behavior is the same as that of VARCHAR(n).

+

10 MB

+

NVARCHAR2(n)

+

Variable-length string, where n indicates the maximum number of bytes that can be stored.

+

10 MB

+

TEXT

+

Variable-length string. Its maximum length is 8203 bytes less than 1 GB.

+

8203 bytes less than 1 GB

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0081.html b/docs/dws/dev/dws_04_0081.html new file mode 100644 index 00000000..969e7d95 --- /dev/null +++ b/docs/dws/dev/dws_04_0081.html @@ -0,0 +1,21 @@ + + +

Constraint Design

+

DEFAULT and NULL Constraints

  • [Proposal] If all the column values can be obtained from services, you are not advised to use the DEFAULT constraint, because doing so will generate unexpected results during data loading.
  • [Proposal] Add NOT NULL constraints to columns that never have NULL values. The optimizer automatically optimizes the columns in certain scenarios.
  • [Proposal] Explicitly name all constraints excluding NOT NULL and DEFAULT.
+
+

Partial Cluster Key

A partial cluster key (PCK) is a local clustering technology used for column-store tables. After creating a PCK, you can quickly filter and scan fact tables using min or max sparse indexes in GaussDB(DWS). Comply with the following rules to create a PCK:

+
  • [Notice] Only one PCK can be created in a table. A PCK can contain multiple columns, preferably no more than two columns.
  • [Proposal] Create a PCK on simple expression filter conditions in a query. Such filter conditions are usually in the form of col op const, where col specifies a column name, op specifies an operator (such as =, >, >=, <=, and <), and const specifies a constant.
  • [Proposal] If the preceding conditions are met, create a PCK on the column having the least distinct values.
+
+

Unique Constraint

  • [Notice] Both row-store and column-store tables support unique constraints.
  • [Proposal] The constraint name should indicate that it is a unique constraint, for example, UNIIncluded columns.
+
+

Primary Key Constraint

  • [Notice] Both row-store and column-store tables support the primary key constraint.
  • [Proposal] The constraint name should indicate that it is a primary key constraint, for example, PKIncluded columns.
+
+

Check Constraint

  • [Notice] Check constraints can be used in row-store tables but not in column-store tables.
  • [Proposal] The constraint name should indicate that it is a check constraint, for example, CKIncluded columns.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0082.html b/docs/dws/dev/dws_04_0082.html new file mode 100644 index 00000000..8322f025 --- /dev/null +++ b/docs/dws/dev/dws_04_0082.html @@ -0,0 +1,14 @@ + + +

View and Joined Table Design

+

View Design

  • [Proposal] Do not nest views unless they have strong dependency on each other.
  • [Proposal] Try to avoid sort operations in a view definition.
+
+

Joined Table Design

  • [Proposal] Minimize joined columns across tables.
  • [Proposal] Joined columns should use the same data type.
  • [Proposal] The names of joined columns should indicate their relationship. For example, they can use the same name.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0083.html b/docs/dws/dev/dws_04_0083.html new file mode 100644 index 00000000..1b4497c1 --- /dev/null +++ b/docs/dws/dev/dws_04_0083.html @@ -0,0 +1,35 @@ + + +

JDBC Configuration

+

Currently, third-party tools are connected to GaussDB(DWS) trough JDBC. This section describes the precautions for configuring the tools.

+

Connection Parameters

  • [Notice] When a third-party tool connects to GaussDB(DWS) through JDBC, JDBC sends a connection request to GaussDB(DWS). By default, the following parameters are added. For details, see the implementation of the ConnectionFactoryImpl JDBC code.
    params = {
    +{ "user", user },
    +{ "database", database },
    +{ "client_encoding", "UTF8" },
    +{ "DateStyle", "ISO" },
    +{ "extra_float_digits", "2" },
    +{ "TimeZone",  createPostgresTimeZone() },
    +};
    +

    These parameters may cause the JDBC and gsql clients to display inconsistent data, for example, date data display mode, floating point precision representation, and timezone.

    +

    If the result is not as expected, you are advised to explicitly set these parameters in the Java connection setting.

    +
  • [Proposal] When connecting to the database through JDBC, ensure that the following two time zones are the same:
    • Time zone of the host where the JDBC client is located
    • Time zone of the host where the GaussDB(DWS) server is located
    +
+
+

fetchsize

[Notice] To use fetchsize in applications, disable the autocommit switch. Enabling the autocommit switch makes the fetchsize configuration invalid.

+
+

autocommit

[Proposal] It is recommended that you enable the autocommit switch in the code for connecting to GaussDB(DWS) by the JDBC. If autocommit needs to be disabled to improve performance or for other purposes, applications need to ensure their transactions are committed. For example, explicitly commit translations after specifying service SQL statements. Particularly, ensure that all transactions are committed before the client exits.

+
+

Connection Releasing

[Proposal] You are advised to use connection pools to limit the number of connections from applications. Do not connect to a database every time you run an SQL statement.

+

[Proposal] After an application completes its tasks, disconnect its connection to GaussDB(DWS) to release occupied resources. You are advised to set the session timeout interval in the task.

+

[Proposal] Reset the session environment before releasing connections to the JDBC connection tool. Otherwise, historical session information may cause object conflicts.

+
  • If GUC parameters are set in the connection, before you return the connection to the connection pool, run SET SESSION AUTHORIZATION DEFAULT;RESET ALL; to clear the connection status.
  • If a temporary table is used, delete it before you return the connection to the connection pool.
+
+

CopyManager

[Proposal] In the scenario where the ETL tool is not used and real-time data import is required, it is recommended that you use the CopyManger interface driven by the GaussDB(DWS) JDBC to import data in batches during application development. For details about how to use CopyManager, see CopyManager.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0084.html b/docs/dws/dev/dws_04_0084.html new file mode 100644 index 00000000..ba246f73 --- /dev/null +++ b/docs/dws/dev/dws_04_0084.html @@ -0,0 +1,74 @@ + + +

SQL Compilation

+

DDL

  • [Proposal] In GaussDB(DWS), you are advised to execute DDL operations, such as creating table or making comments, separately from batch processing jobs to avoid performance deterioration caused by many concurrent transactions.
  • [Proposal] Execute data truncation after unlogged tables are used because GaussDB(DWS) cannot ensure the security of unlogged tables in abnormal scenarios.
  • [Proposal] Suggestions on the storage mode of temporary and unlogged tables are the same as those on base tables. Create temporary tables in the same storage mode as the base tables to avoid high computing costs caused by hybrid row and column correlation.
  • [Proposal] The total length of an index column cannot exceed 50 bytes. Otherwise, the index size will increase greatly, resulting in large storage cost and low index performance.
  • [Proposal] Do not delete objects using DROP...CASCADE, unless the dependency between objects is specified. Otherwise, the objects may be deleted by mistake.
+
+

Data Loading and Uninstalling

  • [Proposal] Provide the inserted column list in the insert statement. Example:
    1
    INSERT INTO task(name,id,comment) VALUES ('task1','100','100th task');
    +
    + +
    +
  • [Proposal] After data is imported to the database in batches or the data increment reaches the threshold, you are advised to analyze tables to prevent the execution plan from being degraded due to inaccurate statistics.
  • [Proposal] To clear all data in a table, you are advised to use TRUNCATE TABLE instead of DELETE TABLE. DELETE TABLE is not efficient and cannot release disk space occupied by the deleted data.
+
+

Type conversion

  • [Proposal] Perform type coercion to convert data types. If you perform implicit conversion, the result may differ from expected.
  • [Proposal] During data query, explicitly specify the data type for constants, and do not attempt to perform any implicit data type conversion.
  • [Notice] In Oracle compatibility mode, null strings will be automatically converted to NULL during data import. If a null string needs to be reserved, you need to create a database that is compatible with Teradata.
+
+

Query Operation

  • [Proposal] Do not return a large number of result sets to a client except the ETL program. If a large result set is returned, consider modifying your service design.
  • [Proposal] Perform DDL and DML operations encapsulated in transactions. Operations like table truncation, update, deletion, and dropping, cannot be rolled back once committed. You are advised to encapsulate such operations in transactions so that you can roll back the operations if necessary.
  • [Proposal] During query compilation, you are advised to list all columns to be queried and avoid using *. Doing so reduces output lines, improves query performance, and avoids the impact of adding or deleting columns on front-end service compatibility.
  • [Proposal] During table object access, add the schema prefix to the table object to avoid accessing an unexpected table due to schema switchover.
  • [Proposal] The cost of joining more than three tables or views, especially full joins, is difficult to be estimated. You are advised to use the WITH TABLE AS statement to create interim tables to improve the readability of SQL statements.
  • [Proposal] Do not use Cartesian products or full joins. Cartesian products and full joins will result in a sharp expansion of result sets and poor performance.
  • [Notice] Only IS NULL and IS NOT NULL can be used to determine NULL value comparison results. If any other method is used, NULL is returned. For example, NULL instead of expected Boolean values is returned for NULL<>NULL, NULL=NULL, and NULL<>1.
  • [Notice] Do not use count(col) instead of count(*) to count the total number of records in a table. count(*) counts the NULL value (actual rows) while count (col) does not.
  • [Notice] While executing count(col), the number of NULL record rows is counted as 0. While executing sum(col), NULL is returned if all records are NULL. If not all the records are NULL, the number of NULL record rows is counted as 0.
  • [Notice] To count multiple columns using count(), column names must be enclosed with parentheses. For example, count ((col1, col2, col3)). Note: When multiple columns are used to count the number of NULL record rows, a row is counted even if all the selected columns are NULL. The result is the same as that when count(*) is executed.
  • [Notice] Null records are not counted when count(distinct col) is used to calculate the number of non-null columns that are not repeated.
  • [Notice] If all statistical columns are NULL when count(distinct (col1,col2,...)) is used to count the number of unique values in multiple columns, Null records are also counted, and the records are considered the same.
  • [Notice] When constants are used to filter data, the system searches for functions used for calculating these two data types based on the data types of the constants and matched columns. If no function is found, the system converts the data type implicitly. Then, the system searches for a function used for calculating the converted data type.
    SELECT * FROM test WHERE timestamp_col = 20000101;
    +

    In the preceding example, if timestamp_col is the timestamp type, the system first searches for the function that supports the "equal" operation of the timestamp and int types (constant numbers are considered as the int type). If no such function is found, the timestamp_col data and constant numbers are implicitly converted into the text type for calculation.

    +
  • [Proposal] Do not use scalar subquery statements. A scalar subquery appears in the output list of a SELECT statement. In the following example, the part enclosed in parentheses is a scalar subquery statement:
    1
    SELECT id, (SELECT COUNT(*) FROM films f WHERE f.did = s.id) FROM staffs_p1 s;
    +
    + +
    +

    Scalar subqueries often result in query performance deterioration. During application development, scalar subqueries need to be converted into equivalent table associations based on the service logic.

    +
  • [Proposal] In WHERE clauses, the filtering conditions should be sorted. The condition that few records are selected for reading (the number of filtered records is small) is listed at the beginning.
  • [Proposal] Filtering conditions in WHERE clauses should comply with unilateral rules. That is, when the column name is placed on one side of a comparison operator, the optimizer automatically performs pruning optimization in some scenarios. Filtering conditions in a WHERE clause will be displayed in col op expression format, where col indicates a table column, op indicates a comparison operator, such as = and >, and expression indicates an expression that does not contain a column name. For example:
    1
    SELECT id, from_image_id, from_person_id, from_video_id FROM face_data WHERE current_timestamp(6) - time < '1 days'::interval;
    +
    + +
    +

    The modification is as follows:

    +
    1
    SELECT id, from_image_id, from_person_id, from_video_id FROM face_data where time >  current_timestamp(6) - '1 days'::interval;
    +
    + +
    +
  • [Proposal] Do not perform unnecessary sorting operations. Sorting requires a large amount of memory and CPU. If service logic permits, ORDER BY and LIMIT can be combined to reduce resource overhead. By default, data in GaussDB(DWS) is sorted by ASC & NULL LAST.
  • [Proposal] When the ORDER BY clause is used for sorting, specify sorting modes (ASC or DESC), and use NULL FIRST or NULL LAST for NULL record sorting.
  • [proposal] Do not rely on only the LIMIT clause to return the result set displayed in a specific sequence. Combine ORDER BY and LIMIT clauses for some specific result sets and use offset to skip specific results if necessary.
  • [Proposal] If the service logic is accurate, you are advised to use UNION ALL instead of UNION.
  • [Proposal] If a filtering condition contains only an OR expression, convert the OR expression to UNION ALL to improve performance. SQL statements that use OR expressions cannot be optimized, resulting in slow execution. Example:
    1
    +2
    SELECT * FROM scdc.pub_menu 
    +WHERE (cdp= 300 AND inline=301) OR (cdp= 301 AND inline=302) OR (cdp= 302 AND inline=301);
    +
    + +
    +

    Convert the statement to the following:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    SELECT * FROM scdc.pub_menu 
    +WHERE (cdp= 300 AND inline=301) 
    +union all
    +SELECT * FROM scdc.pub_menu 
    +WHERE (cdp= 301 AND inline=302) 
    +union all 
    +SELECT * FROM tablename 
    +WHERE (cdp= 302 AND inline=301);
    +
    + +
    +
  • [Proposal] If an in(val1, val2, va...) expression contains a large number of columns, you are advised to replace it with the in (values (va11), (val2),(val3...) statement. The optimizer will automatically convert the IN constraint into a non-correlated subquery to improve the query performance.
  • [Proposal] Replace (not) in with (not) exist when associated columns do not contain NULL values. For example, in the following query statement, if the T1.C1 column does not contain any NULL value, add the NOT NULL constraint to the T1.C1 column, and then rewrite the statements.
    1
    SELECT * FROM T1 WHERE T1.C1 NOT IN (SELECT T2.C2 FROM T2);
    +
    + +
    +

    Rewrite the statement as follows:

    +
    1
    SELECT * FROM T1 WHERE NOT EXISTS (SELECT  * FROM T1,T2 WHERE T1.C1=T2.C2);
    +
    + +
    +
    • If the value of the T1.C1 column will possibly be NULL, the preceding rewriting cannot be performed.
    • If T1.C1 is the output of a subquery, check whether the output is NOT NULL based on the service logic.
    +
    +
  • [Proposal] Use cursors instead of the LIMIT OFFSET syntax to perform pagination queries to avoid resource overheads caused by multiple executions. A cursor must be used in a transaction, and you must disable it and commit transaction once the query is finished.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0085.html b/docs/dws/dev/dws_04_0085.html new file mode 100644 index 00000000..c67ca82a --- /dev/null +++ b/docs/dws/dev/dws_04_0085.html @@ -0,0 +1,21 @@ + + +

Guide: JDBC- or ODBC-Based Development

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0086.html b/docs/dws/dev/dws_04_0086.html new file mode 100644 index 00000000..a0bb5ed5 --- /dev/null +++ b/docs/dws/dev/dws_04_0086.html @@ -0,0 +1,13 @@ + + +

Development Specifications

+

If the connection pool mechanism is used during application development, comply with the following specifications:

+
  • If GUC parameters are set in the connection, before you return the connection to the connection pool, run SET SESSION AUTHORIZATION DEFAULT;RESET ALL; to clear the connection status.
  • If a temporary table is used, delete it before you return the connection to the connection pool.
+

If you do not do so, the status of connections in the connection pool will remain, which affects subsequent operations using the connection pool.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0087.html b/docs/dws/dev/dws_04_0087.html new file mode 100644 index 00000000..84ca25e5 --- /dev/null +++ b/docs/dws/dev/dws_04_0087.html @@ -0,0 +1,11 @@ + + +

Downloading Drivers

+

For details, see section "Downloading the JDBC or ODBC Driver" in the Data Warehouse Service User Guide.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0088.html b/docs/dws/dev/dws_04_0088.html new file mode 100644 index 00000000..fd2817ab --- /dev/null +++ b/docs/dws/dev/dws_04_0088.html @@ -0,0 +1,38 @@ + + +

JDBC-Based Development

+

Java Database Connectivity (JDBC) is a Java API for executing SQL statements, providing a unified access interface for different relational databases, based on which applications process data. GaussDB(DWS) supports JDBC 4.0 and requires JDK 1.6 or later for code compiling. It does not support JDBC-ODBC Bridge.

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0090.html b/docs/dws/dev/dws_04_0090.html new file mode 100644 index 00000000..03564848 --- /dev/null +++ b/docs/dws/dev/dws_04_0090.html @@ -0,0 +1,16 @@ + + +

JDBC Package and Driver Class

+

JDBC Package

Obtain the package dws_8.1.x_jdbc_driver.zip from the management console. For details, see Downloading Drivers.

+

Compressed in it is the JDBC driver JAR package:

+

gsjdbc4.jar: Driver package compatible with PostgreSQL. The class name and class structure in the driver are the same as those in the PostgreSQL driver. All the applications running on PostgreSQL can be smoothly transferred to the current system.

+
+

Driver Class

Before creating a database connection, you need to load the database driver class org.postgresql.Driver (decompressed from gsjdbc4.jar).

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0091.html b/docs/dws/dev/dws_04_0091.html new file mode 100644 index 00000000..ed5f2881 --- /dev/null +++ b/docs/dws/dev/dws_04_0091.html @@ -0,0 +1,11 @@ + + +

Development Process

+
Figure 1 JDBC-based application development process
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0092.html b/docs/dws/dev/dws_04_0092.html new file mode 100644 index 00000000..15e76e3d --- /dev/null +++ b/docs/dws/dev/dws_04_0092.html @@ -0,0 +1,13 @@ + + +

Loading a Driver

+

Load the database driver before creating a database connection.

+

You can load the driver in the following ways:

+
  • Implicitly loading the driver before creating a connection in the code: Class.forName ("org.postgresql.Driver")
  • Transferring a parameter during the JVM startup: java -Djdbc.drivers=org.postgresql.Driver jdbctest
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0093.html b/docs/dws/dev/dws_04_0093.html new file mode 100644 index 00000000..bad9b7d9 --- /dev/null +++ b/docs/dws/dev/dws_04_0093.html @@ -0,0 +1,138 @@ + + +

Connecting to a Database

+

After a database is connected, you can execute SQL statements in the database.

+

If you use an open-source Java Database Connectivity (JDBC) driver, ensure that the database parameter password_encryption_type is set to 1. If the value is not 1, the connection may fail. A typical error message is "none of the server's SASL authentication mechanisms are supported." To avoid such problems, perform the following operations:

+
  1. Set password_encryption_type to 1. For details, see "Modifying Database Parameters" in User Guide.
  2. Create a new database user for connection or reset the password of the existing database user.
    • If you use an administrator account, reset the password. For details, see "Password Reset" in User Guide.
    • If you are a common user, use another client tool (such as Data Studio) to connect to the database and run the ALTER USER statement to change your password.
    +
  3. Connect to the database.
+

+

Here are the reasons why you need to perform these operations:

+
  • MD5 algorithms may by vulnerable to collision attacks and cannot be used for password verification. Currently, GaussDB(DWS) uses the default security design. By default, MD5 password verification is disabled, but MD5 is required by the open-source libpq communication protocol of PostgreSQL. For connectivity purposes, you need to adjust the cryptographic algorithm parameter password_encryption_type and enable the MD5 algorithm.
  • The database stores the hash digest of passwords instead of password text. During password verification, the system compares the hash digest with the password digest sent from the client (salt operations are involved). If you change your cryptographic algorithm policy, the database cannot generate a new MD5 hash digest for your existing password. For connectivity purposes, you must manually change your password or create a new user. The new password will be encrypted using the hash algorithm and stored for authentication in the next connection.
+
+

Function Prototype

JDBC provides the following three database connection methods:

+
  • DriverManager.getConnection(String url);
  • DriverManager.getConnection(String url, Properties info);
  • DriverManager.getConnection(String url, String user, String password);
+
+

Parameter

+
+ + + + + + + + + + + + + + + + +
Table 1 Database connection parameters

Parameter

+

Description

+

url

+

gsjdbc4.jar database connection descriptor. The descriptor format can be:

+
  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database
  • jdbc:postgresql://host:port[,host:port][...]/database
+
NOTE:

If gsjdbc200.jar is used, replace jdbc:postgresql with jdbc:gaussdb.

+
  • database: indicates the name of the database to be connected.
  • host: indicates the name or IP address of the database server.

    Specify the IP address for connecting to the GaussDB(DWS) cluster on GaussDB(DWS) management console. If the connected host and the GaussDB(DWS) cluster are in the same network, select the private IP address. Otherwise, select the public IP address.

    +

    For security purposes, the CN forbids access from other nodes in the cluster without authentication. To access the CN from inside the cluster, deploy the JDBC program on the host where the CN is located and set host to 127.0.0.1. Otherwise, the error message FATAL: Forbid remote connection with trust method! may be displayed.

    +

    It is recommended that the service system be deployed outside the cluster. Otherwise, the database performance may be affected.

    +
  • port: indicates the port number of a database server. By default, the database on port 8000 of the local host is connected.
  • Multiple IP addresses and ports can be configured. JDBC balances load by random access and failover, and will automatically ignore unreachable IP addresses.

    IP addresses are separated using commas. Example: jdbc:postgresql://10.10.0.13:8000,10.10.0.14:8000/database

    +
+
+

info

+

Database connection properties. Common properties include:

+
  • user: string type. It indicates the database user who creates the connection.
  • password: string type. It indicates the password of a database user.
  • ssl: boolean type. It indicates whether the Secure Socket Layer (SSL) is used.
  • loggerLevel: string type. It indicates the amount of information that the driver logs and prints to the LogStream or LogWriter specified in the DriverManager. Currently, OFF, DEBUG, and TRACE are supported. DEBUG indicates that only logs of the DEBUG or higher level are printed, generating little log information. TRACE indicates that logs of the DEBUG and TRACE levels are printed, generating detailed log information. The default value is OFF, indicating that no information will be logged.
  • prepareThreshold: integer type. It indicates the number of PreparedStatement executions required before requests are converted to prepared statements in servers. The default value is 5.
  • batchMode: boolean type. It indicates whether to connect the database in batch mode.
  • fetchsize: integer type. It indicates the default fetch size for statements in the created connection.
  • ApplicationName: string type. It indicates an application name. The default value is PostgreSQL JDBC Driver.
  • allowReadOnly: boolean type. It indicates whether to enable the read-only mode for connection. The default value is false. If the value is not changed to true, the execution of connection.setReadOnly does not take effect.
  • blobMode: string type. It is used to set the setBinaryStream method to assign values to different data types. The value on indicates that values are assigned to the BLOB data type and off indicates that values are assigned to the BYTEA data type. The default value is on.
  • connectionExtraInfo: boolean type. It indicates whether the JDBC driver reports the driver deployment path and process owner to the database.
    NOTE:

    The value can be true or false. The default value is false. If connectionExtraInfo is set to true, the JDBC driver reports the driver deployment path and process owner to the database and displays the information in the connection_info parameter (see connection_info). In this case, you can query the information from PG_STAT_ACTIVITY or PGXC_STAT_ACTIVITY.

    +
    +
+

user

+

Indicates a database user.

+

password

+

Indicates the password of a database user.

+
+
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
//gsjdbc4.jar is used as an example.
+//The following code encapsulates database connection operations into an interface. The database can then be connected using an authorized username and password.
+
+public static Connection GetConnection(String username, String passwd)
+    {
+        //Set the driver class.
+        String driver = "org.postgresql.Driver";
+        //Set the database connection descriptor.
+        String sourceURL = "jdbc:postgresql://10.10.0.13:8000/postgres?currentSchema=test";
+        Connection conn = null;
+        
+        try
+        {
+            //Load the driver.
+            Class.forName(driver);
+        }
+        catch( Exception e )
+        {
+            e.printStackTrace();
+            return null;
+        }
+        
+        try
+        {
+             //Create a connection.
+            conn = DriverManager.getConnection(sourceURL, username, passwd);
+            System.out.println("Connection succeed!");
+        }
+        catch(Exception e)
+        {
+            e.printStackTrace();
+            return null;
+        }
+        
+        return conn;
+    };
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0095.html b/docs/dws/dev/dws_04_0095.html new file mode 100644 index 00000000..61a328cc --- /dev/null +++ b/docs/dws/dev/dws_04_0095.html @@ -0,0 +1,131 @@ + + +

Executing SQL Statements

+

Executing an Ordinary SQL Statement

The application performs data (parameter statements do not need to be transferred) in the database by running SQL statements, and you need to perform the following steps:

+
  1. Create a statement object by triggering the createStatement method in Connection.

    1
    Statement stmt = con.createStatement();
    +
    + +
    +

  2. Execute the SQL statement by triggering the executeUpdate method in Statement.

    1
    int rc = stmt.executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));");
    +
    + +
    +

    If an execution request (not in a transaction block) received in the database contains multiple statements, the request is packed into a transaction. VACUUM is not supported in a transaction block. If one of the statements fails, the entire request will be rolled back.

    +
    +

  3. Close the statement object.

    1
    stmt.close();
    +
    + +
    +

+
+

Executing a Prepared SQL Statement

Pre-compiled statements were once complied and optimized and can have additional parameters for different usage. For the statements have been pre-compiled, the execution efficiency is greatly improved. If you want to execute a statement for several times, use a precompiled statement. Perform the following procedure:

+
  1. Create a prepared statement object by calling the prepareStatement method in Connection.

    1
    PreparedStatement pstmt = con.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");
    +
    + +
    +

  2. Set parameters by triggering the setShort method in PreparedStatement.

    1
    pstmt.setShort(1, (short)2);
    +
    + +
    +

  3. Execute the precompiled SQL statement by triggering the executeUpdate method in PreparedStatement.

    1
    int rowcount = pstmt.executeUpdate();
    +
    + +
    +

  4. Close the precompiled statement object by calling the close method in PreparedStatement.

    1
    pstmt.close();
    +
    + +
    +

+
+

Calling a Stored Procedure

Perform the following steps to call existing stored procedures through the JDBC interface in GaussDB(DWS):

+
  1. Create a call statement object by calling the prepareCall method in Connection.

    1
    CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}");
    +
    + +
    +

  2. Set parameters by calling the setInt method in CallableStatement.

    1
    +2
    +3
    cstmt.setInt(2, 50); 
    +cstmt.setInt(1, 20);
    +cstmt.setInt(3, 90);
    +
    + +
    +

  3. Register with an output parameter by calling the registerOutParameter method in CallableStatement.

    1
    cstmt.registerOutParameter(4, Types.INTEGER);  //Register an OUT parameter as an integer.
    +
    + +
    +

  4. Call the stored procedure by calling the execute method in CallableStatement.

    1
    cstmt.execute();
    +
    + +
    +

  5. Obtain the output parameter by calling the getInt method in CallableStatement.

    1
    int out = cstmt.getInt(4);  //Obtain the OUT parameter.
    +
    + +
    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    //The following stored procedure has been created with the OUT parameter:
    +create or replace procedure testproc 
    +(
    +    psv_in1 in integer,
    +    psv_in2 in integer,
    +    psv_inout in out integer
    +)
    +as
    +begin
    +    psv_inout := psv_in1 + psv_in2 + psv_inout;
    +end;
    +/
    +
    + +
    +

  6. Close the call statement by calling the close method in CallableStatement.

    1
    cstmt.close();
    +
    + +
    +
    • Many database classes such as Connection, Statement, and ResultSet have a close() method. Close these classes after using their objects. Close these actions after using their objects. Closing Connection will close all the related Statements, and closing a Statement will close its ResultSet.
    • Some JDBC drivers support named parameters, which can be used to set parameters by name rather than sequence. If a parameter has a default value, you do not need to specify any parameter value but can use the default value directly. Even though the parameter sequence changes during a stored procedure, the application does not need to be modified. Currently, the GaussDB(DWS) JDBC driver does not support this method.
    • GaussDB(DWS) does not support functions containing OUT parameters, or default values of stored procedures and function parameters.
    +
    +

+
  • If JDBC is used to call a stored procedure whose returned value is a cursor, the returned cursor cannot be used.
  • A stored procedure and an SQL statement must be executed separately.
+
+
+

Batch Processing

When a prepared statement batch processes multiple pieces of similar data, the database creates only one execution plan. This improves the compilation and optimization efficiency. Perform the following procedure:

+
  1. Create a prepared statement object by calling the prepareStatement method in Connection.

    1
    PreparedStatement pstmt = con.prepareStatement("INSERT INTO customer_t1 VALUES (?)");
    +
    + +
    +

  2. Call the setShort parameter for each piece of data, and call addBatch to confirm that the setting is complete.

    1
    +2
    pstmt.setShort(1, (short)2);
    +pstmt.addBatch();
    +
    + +
    +

  3. Execute batch processing by calling the executeBatch method in PreparedStatement.

    1
    int[] rowcount = pstmt.executeBatch();
    +
    + +
    +

  4. Close the precompiled statement object by calling the close method in PreparedStatement.

    1
    pstmt.close();
    +
    + +
    +

    Do not terminate a batch processing action when it is ongoing; otherwise, the database performance will deteriorate. Therefore, disable the automatic submission function during batch processing, and manually submit every several lines. The statement for disabling automatic submission is conn.setAutoCommit(false).

    +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0096.html b/docs/dws/dev/dws_04_0096.html new file mode 100644 index 00000000..c5a71175 --- /dev/null +++ b/docs/dws/dev/dws_04_0096.html @@ -0,0 +1,185 @@ + + +

Processing Data in a Result Set

+

Setting a Result Set Type

Different types of result sets are applicable to different application scenarios. Applications select proper types of result sets based on requirements. Before executing an SQL statement, you must create a statement object. Some methods of creating statement objects can set the type of a result set. Table 1 lists result set parameters. The related Connection methods are as follows:

+
1
+2
+3
+4
+5
+6
+7
+8
//Create a Statement object. This object will generate a ResultSet object with a specified type and concurrency.
+createStatement(int resultSetType, int resultSetConcurrency);
+
+//Create a PreparedStatement object. This object will generate a ResultSet object with a specified type and concurrency.
+prepareStatement(String sql, int resultSetType, int resultSetConcurrency);
+
+//Create a CallableStatement object. This object will generate a ResultSet object with a specified type and concurrency.
+prepareCall(String sql, int resultSetType, int resultSetConcurrency);
+
+ +
+ +
+ + + + + + + + + + +
Table 1 Result set types

Parameter

+

Description

+

resultSetType

+

Indicates the type of a result set. There are three types of result sets:

+
  • ResultSet.TYPE_FORWARD_ONLY: The ResultSet object can only be navigated forward. It is the default value.
  • ResultSet.TYPE_SCROLL_SENSITIVE: You can view the modified result by scrolling to the modified row.
  • ResultSet.TYPE_SCROLL_INSENSITIVE: The ResultSet object is insensitive to changes in the underlying data source.
+
NOTE:

After a result set has obtained data from the database, the result set is insensitive to data changes made by other transactions, even if the result set type is ResultSet.TYPE_SCROLL_SENSITIVE. To obtain up-to-date data of the record pointed by the cursor from the database, call the refreshRow() method in a ResultSet object.

+
+

resultSetConcurrency

+

Indicates the concurrency type of a result set. There are two types of concurrency.

+
  • ResultSet.CONCUR_READ_ONLY: The data in a result set cannot be updated except that an updated statement has been created in the result set data.
  • ResultSet.CONCUR_UPDATEABLE: changeable result set. The concurrency type for a result set object can be updated if the result set is scrollable.
+
+
+
+

Positioning a Cursor in a Result Set

ResultSet objects include a cursor pointing to the current data row. The cursor is initially positioned before the first row. The next method moves the cursor to the next row from its current position. When a ResultSet object does not have a next row, a call to the next method returns false. Therefore, this method is used in the while loop for result set iteration. However, the JDBC driver provides more cursor positioning methods for scrollable result sets, which allows positioning cursor in the specified row. Table 2 lists these methods.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Methods for positioning a cursor in a result set

Method

+

Description

+

next()

+

Moves cursor to the next row from its current position.

+

previous()

+

Moves cursor to the previous row from its current position.

+

beforeFirst()

+

Places cursor before the first row.

+

afterLast()

+

Places cursor after the last row.

+

first()

+

Places cursor to the first row.

+

last()

+

Places cursor to the last row.

+

absolute(int)

+

Places cursor to a specified row.

+

relative(int)

+

Moves cursor forward or backward a specified number of rows.

+
+
+
+

Obtaining the cursor position from a result set

This cursor positioning method will be used to change the cursor position for a scrollable result set. JDBC driver provides a method to obtain the cursor position in a result set. Table 3 lists the method.

+ +
+ + + + + + + + + + + + + + + + + + + +
Table 3 Method for obtaining the cursor position in a result set

Method

+

Description

+

isFirst()

+

Checks whether the cursor is in the first row.

+

isLast()

+

Checks whether the cursor is in the last row.

+

isBeforeFirst()

+

Checks whether the cursor is before the first row.

+

isAfterLast()

+

Checks whether the cursor is after the last row.

+

getRow()

+

Gets the current row number of the cursor.

+
+
+
+

Obtaining data from a result set

ResultSet objects provide a variety of methods to obtain data from a result set. Table 4 lists the common methods for obtaining data. If you want to know more about other methods, see JDK official documents.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Table 4 Common methods for obtaining data from a result set

Method

+

Description

+

int getInt(int columnIndex)

+

Retrieves the value of the column designated by a column index in the current row as an int.

+

int getInt(String columnLabel)

+

Retrieves the value of the column designated by a column label in the current row as an int.

+

String getString(int columnIndex)

+

Retrieves the value of the column designated by a column index in the current row as a String.

+

String getString(String columnLabel)

+

Retrieves the value of the column designated by a column label in the current row as a String.

+

Date getDate(int columnIndex)

+

Retrieves the value of the column designated by a column index in the current row as a Date.

+

Date getDate(String columnLabel)

+

Retrieves the value of the column designated by a column name in the current row as a Date.

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0097.html b/docs/dws/dev/dws_04_0097.html new file mode 100644 index 00000000..8e8a82a7 --- /dev/null +++ b/docs/dws/dev/dws_04_0097.html @@ -0,0 +1,12 @@ + + +

Closing the Connection

+

After you complete required data operations in the database, close the database connection.

+

Call the close method to close the connection, such as, conn. close().

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0098.html b/docs/dws/dev/dws_04_0098.html new file mode 100644 index 00000000..80a90310 --- /dev/null +++ b/docs/dws/dev/dws_04_0098.html @@ -0,0 +1,428 @@ + + +

Example: Common Operations

+

Example 1

Before completing the following example, you need to create a stored procedure.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
create or replace procedure testproc 
+(
+    psv_in1 in integer,
+    psv_in2 in integer,
+    psv_inout in out integer
+)
+as
+begin
+    psv_inout := psv_in1 + psv_in2 + psv_inout;
+end;
+/
+
+ +
+

This example illustrates how to develop applications based on the GaussDB(DWS) JDBC interface.

+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
//DBtest.java
+//gsjdbc4.jar is used as an example.
+// This example illustrates the main processes of JDBC-based development, covering database connection creation, table creation, and data insertion.
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.CallableStatement;
+
+public class DBTest {
+
+  //Establish a connection to the database.
+  public static Connection GetConnection(String username, String passwd) {
+    String driver = "org.postgresql.Driver";
+    String sourceURL = "jdbc:postgresql://localhost:8000/gaussdb";
+    Connection conn = null;
+    try {
+      //Load the database driver.
+      Class.forName(driver).newInstance();
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+
+    try {
+      //Establish a connection to the database.
+      conn = DriverManager.getConnection(sourceURL, username, passwd);
+      System.out.println("Connection succeed!");
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+
+    return conn;
+  };
+
+  //Run an ordinary SQL statement. Create a customer_t1 table.
+  public static void CreateTable(Connection conn) {
+    Statement stmt = null;
+    try {
+      stmt = conn.createStatement();
+
+      //Run an ordinary SQL statement.
+      int rc = stmt
+          .executeUpdate("CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));");
+
+      stmt.close();
+    } catch (SQLException e) {
+      if (stmt != null) {
+        try {
+          stmt.close();
+        } catch (SQLException e1) {
+          e1.printStackTrace();
+        }
+      }
+      e.printStackTrace();
+    }
+  }
+
+  //Run the preprocessing statement to insert data in batches.
+  public static void BatchInsertData(Connection conn) {
+    PreparedStatement pst = null;
+
+    try {
+      //Generate a prepared statement.
+      pst = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?,?)");
+      for (int i = 0; i < 3; i++) {
+        //Add parameters.
+        pst.setInt(1, i);
+        pst.setString(2, "data " + i);
+        pst.addBatch();
+      }
+      //Run batch processing.
+      pst.executeBatch();
+      pst.close();
+    } catch (SQLException e) {
+      if (pst != null) {
+        try {
+          pst.close();
+        } catch (SQLException e1) {
+        e1.printStackTrace();
+        }
+      }
+      e.printStackTrace();
+    }
+  }
+
+  //Run the precompilation statement to update data.
+  public static void ExecPreparedSQL(Connection conn) {
+    PreparedStatement pstmt = null;
+    try {
+      pstmt = conn
+          .prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1");
+      pstmt.setString(1, "new Data");
+      int rowcount = pstmt.executeUpdate();
+      pstmt.close();
+    } catch (SQLException e) {
+      if (pstmt != null) {
+        try {
+          pstmt.close();
+        } catch (SQLException e1) {
+          e1.printStackTrace();
+        }
+      }
+      e.printStackTrace();
+    }
+  }
+
+
+//Run a stored procedure.
+  public static void ExecCallableSQL(Connection conn) {
+    CallableStatement cstmt = null;
+    try {
+      
+      cstmt=conn.prepareCall("{? = CALL TESTPROC(?,?,?)}");
+      cstmt.setInt(2, 50); 
+      cstmt.setInt(1, 20);
+      cstmt.setInt(3, 90);
+       cstmt.registerOutParameter(4, Types.INTEGER);  //Register an OUT parameter as an integer.
+      cstmt.execute();
+      int out = cstmt.getInt(4);  //Obtain the out parameter value.
+      System.out.println("The CallableStatment TESTPROC returns:"+out);
+      cstmt.close();
+    } catch (SQLException e) {
+      if (cstmt != null) {
+        try {
+          cstmt.close();
+        } catch (SQLException e1) {
+          e1.printStackTrace();
+        }
+      }
+      e.printStackTrace();
+    }
+  }
+  
+
+  /**
+   * Main process. Call static methods one by one.
+   * @param args
+  */
+  public static void main(String[] args) {
+    //Establish a connection to the database.
+    Connection conn = GetConnection("tester", "password");
+
+    //Create a table.
+    CreateTable(conn);
+
+    //Insert data in batches.
+    BatchInsertData(conn);
+
+  //Run the precompilation statement to update data.
+    ExecPreparedSQL(conn);
+
+    //Run a stored procedure.
+    ExecCallableSQL(conn);
+
+    //Close the connection to the database.
+    try {
+      conn.close();
+    } catch (SQLException e) {
+      e.printStackTrace();
+    }
+
+  }
+
+}
+
+ +
+
+

Example 2: High Client Memory Usage

In this example, setFetchSize adjusts the memory usage of the client by using the database cursor to obtain server data in batches. It may increase network interaction and damage some performance.

+

The cursor is valid within a transaction. Therefore, you need to disable the autocommit function.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
// Disable the autocommit function.
+conn.setAutoCommit(false);
+Statement st = conn.createStatement();
+
+// Open the cursor and obtain 50 lines of data each time.
+st.setFetchSize(50);
+ResultSet rs = st.executeQuery("SELECT * FROM mytable");
+while (rs.next())
+{
+    System.out.print("a row was returned.");
+}
+rs.close();
+
+// Disable the server cursor.
+st.setFetchSize(0);
+rs = st.executeQuery("SELECT * FROM mytable");
+while (rs.next())
+{
+    System.out.print("many rows were returned.");
+}
+rs.close();
+
+// Close the statement.
+st.close();
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0099.html b/docs/dws/dev/dws_04_0099.html new file mode 100644 index 00000000..885c4775 --- /dev/null +++ b/docs/dws/dev/dws_04_0099.html @@ -0,0 +1,409 @@ + + +

Example: Retrying SQL Queries for Applications

+

If the primary DN is faulty and cannot be restored within 40s, its standby is automatically promoted to primary to ensure the normal running of the cluster. Jobs running during the failover will fail and those started after the failover will not be affected. To protect upper-layer services from being affected by the failover, refer to the following example to construct a SQL retry mechanism at the service layer.

+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
//gsjdbc4.jar is used as an example.
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * 
+ *
+ */
+
+class ExitHandler extends Thread {
+    private Statement cancel_stmt = null;
+
+    public ExitHandler(Statement stmt) {
+        super("Exit Handler");
+        this.cancel_stmt = stmt;
+    }
+    public void run() {
+        System.out.println("exit handle");
+        try {
+            this.cancel_stmt.cancel();
+        } catch (SQLException e) {
+            System.out.println("cancel query failed.");
+            e.printStackTrace();
+        }
+    }
+}
+
+public class SQLRetry {
+  //Establish a connection to the database.
+   public static Connection GetConnection(String username, String passwd) {
+     String driver = "org.postgresql.Driver";
+     String sourceURL = "jdbc:postgresql://10.131.72.136:8000/gaussdb";
+     Connection conn = null;
+     try {
+      //Load the database driver.
+       Class.forName(driver).newInstance();
+     } catch (Exception e) {
+       e.printStackTrace();
+       return null;
+     }
+
+     try {
+      //Establish a connection to the database.
+       conn = DriverManager.getConnection(sourceURL, username, passwd);
+       System.out.println("Connection succeed!");
+     } catch (Exception e) {
+       e.printStackTrace();
+       return null;
+     }
+
+     return conn;
+}
+ 
+  //Run an ordinary SQL statement. Create a jdbc_test1 table.
+   public static void CreateTable(Connection conn) {
+     Statement stmt = null;
+     try {
+       stmt = conn.createStatement();
+
+       // add ctrl+c handler
+       Runtime.getRuntime().addShutdownHook(new ExitHandler(stmt));
+
+      // Run an ordinary SQL statement.
+       int rc2 = stmt
+          .executeUpdate("DROP TABLE if exists jdbc_test1;");
+
+       int rc1 = stmt
+          .executeUpdate("CREATE TABLE jdbc_test1(col1 INTEGER, col2 VARCHAR(10));");
+
+       stmt.close();
+     } catch (SQLException e) {
+       if (stmt != null) {
+         try {
+           stmt.close();
+         } catch (SQLException e1) {
+           e1.printStackTrace();
+         }
+       }
+       e.printStackTrace();
+     }
+   }
+
+  //Run the preprocessing statement to insert data in batches.
+   public static void BatchInsertData(Connection conn) {
+     PreparedStatement pst = null;
+
+     try {
+      //Generate a prepared statement.
+       pst = conn.prepareStatement("INSERT INTO jdbc_test1 VALUES (?,?)");
+       for (int i = 0; i < 100; i++) {
+        //Add parameters.
+         pst.setInt(1, i);
+         pst.setString(2, "data " + i);
+         pst.addBatch();
+       }
+      //Perform batch processing.
+       pst.executeBatch();
+       pst.close();
+     } catch (SQLException e) {
+       if (pst != null) {
+         try {
+           pst.close();
+         } catch (SQLException e1) {
+         e1.printStackTrace();
+         }
+       }
+       e.printStackTrace();
+     }
+   }
+ 
+  //Run the precompilation statement to update data.
+   private static boolean QueryRedo(Connection conn){
+     PreparedStatement pstmt = null;
+     boolean retValue = false;
+     try {
+       pstmt = conn
+           .prepareStatement("SELECT col1 FROM jdbc_test1 WHERE col2 = ?");
+ 
+           pstmt.setString(1, "data 10");
+           ResultSet rs = pstmt.executeQuery();
+
+           while (rs.next()) {
+               System.out.println("col1 = " + rs.getString("col1"));
+           }
+           rs.close();
+ 
+       pstmt.close();
+        retValue = true;
+      } catch (SQLException e) {
+       System.out.println("catch...... retValue " + retValue);
+       if (pstmt != null) {
+         try {
+          pstmt.close();
+        } catch (SQLException e1) {
+          e1.printStackTrace();
+         }
+       }
+       e.printStackTrace();
+     }
+ 
+      System.out.println("finesh......"); 
+     return retValue;
+   }
+
+//Run a query statement and retry upon a failure. The number of retry times can be configured.
+   public static void ExecPreparedSQL(Connection conn) throws InterruptedException {
+         int maxRetryTime = 50;
+         int time = 0;
+         String result = null;
+         do {
+             time++;
+             try {
+  System.out.println("time:" + time);
+  boolean ret = QueryRedo(conn);
+  if(ret == false){
+   System.out.println("retry, time:" + time);
+   Thread.sleep(10000); 
+   QueryRedo(conn);
+  }
+             } catch (Exception e) {
+                 e.printStackTrace();
+             }
+         } while (null == result && time < maxRetryTime); 
+ 
+   }
+
+   /**
+   * Main process. Call static methods one by one.
+    * @param args
+  * @throws InterruptedException 
+   */
+   public static void main(String[] args) throws InterruptedException {
+    //Establish a connection to the database.
+     Connection conn = GetConnection("testuser", "test@123");
+
+    //Create a table.
+     CreateTable(conn);
+
+    //Insert data in batches.
+     BatchInsertData(conn);
+
+    //Run the precompilation statement to update data.
+     ExecPreparedSQL(conn);
+
+    //Disconnect from the database.
+     try {
+       conn.close();
+     } catch (SQLException e) {
+       e.printStackTrace();
+     }
+
+   }
+
+ }
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0100.html b/docs/dws/dev/dws_04_0100.html new file mode 100644 index 00000000..9ee98f7e --- /dev/null +++ b/docs/dws/dev/dws_04_0100.html @@ -0,0 +1,222 @@ + + +

Example: Importing and Exporting Data Through Local Files

+

When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or import a local file to the database by streaming. The file can be in CSV or TEXT format.

+

The sample program is as follows. Load the GaussDB(DWS) JDBC driver before running it.

+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
//gsjdbc4.jar is used as an example.
+import java.sql.Connection; 
+import java.sql.DriverManager; 
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.sql.SQLException; 
+import org.postgresql.copy.CopyManager; 
+import org.postgresql.core.BaseConnection;
+ 
+public class Copy{ 
+
+     public static void main(String[] args) 
+     { 
+      String urls = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //Database URL
+      String username = new String("jack");            //Username
+      String password = new String("********");       // Password
+      String tablename = new String("migration_table"); //Define table information.
+      String tablename1 = new String("migration_table_1"); //Define table information.
+      String driver = "org.postgresql.Driver"; 
+      Connection conn = null; 
+      
+      try { 
+            Class.forName(driver); 
+            conn = DriverManager.getConnection(urls, username, password);         
+          } catch (ClassNotFoundException e) { 
+               e.printStackTrace(System.out); 
+          } catch (SQLException e) { 
+               e.printStackTrace(System.out); 
+          } 
+      
+      //Export the query result of SELECT * FROM migration_table to the local file d:/data.txt.
+      try {
+     copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)");
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   }    
+      //Import data from the d:/data.txt file to the migration_table_1 table.
+      try {
+      copyFromFile(conn, "d:/data.txt", tablename1);
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+         e.printStackTrace();
+ } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+ }  
+
+      //Export the data from the migration_table_1 table to the d:/data1.txt file.
+      try {
+      copyToFile(conn, "d:/data1.txt", tablename1);
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+ }        
+     } 
+
+  public static void copyFromFile(Connection connection, String filePath, String tableName)   
+         throws SQLException, IOException {  
+       
+     FileInputStream fileInputStream = null;  
+   
+     try {  
+         CopyManager copyManager = new CopyManager((BaseConnection)connection);  
+         fileInputStream = new FileInputStream(filePath);  
+         copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream);  
+     } finally {  
+         if (fileInputStream != null) {  
+             try {  
+                 fileInputStream.close();  
+             } catch (IOException e) {  
+                 e.printStackTrace();  
+             }  
+         }  
+     }  
+ }  
+  
+  public static void copyToFile(Connection connection, String filePath, String tableOrQuery)   
+          throws SQLException, IOException {  
+        
+      FileOutputStream fileOutputStream = null;  
+   
+      try {  
+          CopyManager copyManager = new CopyManager((BaseConnection)connection);  
+          fileOutputStream = new FileOutputStream(filePath);  
+          copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream);  
+      } finally {  
+          if (fileOutputStream != null) {  
+              try {  
+                  fileOutputStream.close();  
+              } catch (IOException e) {  
+                  e.printStackTrace();  
+              }  
+          }  
+      }  
+  }  
+}
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0101.html b/docs/dws/dev/dws_04_0101.html new file mode 100644 index 00000000..418cc4b9 --- /dev/null +++ b/docs/dws/dev/dws_04_0101.html @@ -0,0 +1,183 @@ + + +

Example: Migrating Data from MySQL to GaussDB(DWS)

+

The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
//gsjdbc4.jar is used as an example.
+import java.io.StringReader;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.postgresql.copy.CopyManager;
+import org.postgresql.core.BaseConnection;
+
+public class Migration{
+
+    public static void main(String[] args) {
+        String url = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //Database URL
+        String user = new String("jack");            //Database username
+        String pass = new String("********");             //Database password
+        String tablename = new String("migration_table"); //Define table information.
+        String delimiter = new String("|");              //Define a delimiter.
+        String encoding = new String("UTF8");            //Define a character set.
+        String driver = "org.postgresql.Driver";
+        StringBuffer buffer = new StringBuffer();       //Define the buffer to store formatted data.
+
+        try {
+            //Obtain the query result set of the source database.
+            ResultSet rs = getDataSet();
+
+            //Traverse the result set and obtain records row by row.
+            //The values of columns in each record are separated by the specified delimiter and end with a newline character to form strings.
+            ////Add the strings to the buffer.
+            while (rs.next()) {
+                buffer.append(rs.getString(1) + delimiter
+                        + rs.getString(2) + delimiter
+                        + rs.getString(3) + delimiter
+                        + rs.getString(4)
+                        + "\n");
+            }
+            rs.close();
+
+            try {
+                //Connect to the target database.
+                Class.forName(driver);
+                Connection conn = DriverManager.getConnection(url, user, pass);
+                BaseConnection baseConn = (BaseConnection) conn;
+                baseConn.setAutoCommit(false);
+
+                //Initialize table information.
+                String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'";
+
+                //Submit data in the buffer.
+                CopyManager cp = new CopyManager(baseConn);
+                StringReader reader = new StringReader(buffer.toString());
+                cp.copyIn(sql, reader);
+                baseConn.commit();
+                reader.close();
+                baseConn.close();
+            } catch (ClassNotFoundException e) {
+                e.printStackTrace(System.out);
+            } catch (SQLException e) {
+                e.printStackTrace(System.out);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //******************************** 
+    //Return the query result set from the source database.
+    //********************************* 
+    private static ResultSet getDataSet() {
+        ResultSet rs = null;
+        try {
+            Class.forName("com.mysql.jdbc.Driver").newInstance();
+            Connection conn = DriverManager.getConnection("jdbc:mysql://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "********");
+            Statement stmt = conn.createStatement();
+            rs = stmt.executeQuery("select * from migration_table");
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return rs;
+    }
+}
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0102.html b/docs/dws/dev/dws_04_0102.html new file mode 100644 index 00000000..23c49f3e --- /dev/null +++ b/docs/dws/dev/dws_04_0102.html @@ -0,0 +1,42 @@ + + +

JDBC Interface Reference

+

JDBC interface is a set of API methods for users. This section describes some common interfaces. For other interfaces, see information in JDK1.6 (software package) and JDBC4.0.

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0103.html b/docs/dws/dev/dws_04_0103.html new file mode 100644 index 00000000..be28daa2 --- /dev/null +++ b/docs/dws/dev/dws_04_0103.html @@ -0,0 +1,123 @@ + + +

java.sql.Connection

+

This section describes java.sql.Connection, the interface for connecting to a database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.Connection

Method Name

+

Return Type

+

Support JDBC 4

+

close()

+

void

+

Yes

+

commit()

+

void

+

Yes

+

createStatement()

+

Statement

+

Yes

+

getAutoCommit()

+

boolean

+

Yes

+

getClientInfo()

+

Properties

+

Yes

+

getClientInfo(String name)

+

String

+

Yes

+

getTransactionIsolation()

+

int

+

Yes

+

isClosed()

+

boolean

+

Yes

+

isReadOnly()

+

boolean

+

Yes

+

prepareStatement(String sql)

+

PreparedStatement

+

Yes

+

rollback()

+

void

+

Yes

+

setAutoCommit(boolean autoCommit)

+

void

+

Yes

+

setClientInfo(Properties properties)

+

void

+

Yes

+

setClientInfo(String name,String value)

+

void

+

Yes

+
+
+

The AutoCommit mode is used by default within the interface. If you disable it running setAutoCommit(false), all the statements executed later will be packaged in explicit transactions, and you cannot execute statements that cannot be executed within transactions.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0104.html b/docs/dws/dev/dws_04_0104.html new file mode 100644 index 00000000..5295f130 --- /dev/null +++ b/docs/dws/dev/dws_04_0104.html @@ -0,0 +1,138 @@ + + +

java.sql.CallableStatement

+

This section describes java.sql.CallableStatement, the stored procedure execution interface.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.CallableStatement

Method Name

+

Return Type

+

Support JDBC 4

+

registerOutParameter(int parameterIndex, int type)

+

void

+

Yes

+

wasNull()

+

boolean

+

Yes

+

getString(int parameterIndex)

+

String

+

Yes

+

getBoolean(int parameterIndex)

+

boolean

+

Yes

+

getByte(int parameterIndex)

+

byte

+

Yes

+

getShort(int parameterIndex)

+

short

+

Yes

+

getInt(int parameterIndex)

+

int

+

Yes

+

getLong(int parameterIndex)

+

long

+

Yes

+

getFloat(int parameterIndex)

+

float

+

Yes

+

getDouble(int parameterIndex)

+

double

+

Yes

+

getBigDecimal(int parameterIndex)

+

BigDecimal

+

Yes

+

getBytes(int parameterIndex)

+

byte[]

+

Yes

+

getDate(int parameterIndex)

+

Date

+

Yes

+

getTime(int parameterIndex)

+

Time

+

Yes

+

getTimestamp(int parameterIndex)

+

Timestamp

+

Yes

+

getObject(int parameterIndex)

+

Object

+

Yes

+
+
+
  • The batch operation of statements containing OUT parameter is not allowed.
  • The following methods are inherited from java.sql.Statement: close, execute, executeQuery, executeUpdate, getConnection, getResultSet, getUpdateCount, isClosed, setMaxRows, and setFetchSize.
  • The following methods are inherited from java.sql.PreparedStatement: addBatch, clearParameters, execute, executeQuery, executeUpdate, getMetaData, setBigDecimal, setBoolean, setByte, setBytes, setDate, setDouble, setFloat, setInt, setLong, setNull, setObject, setString, setTime, and setTimestamp.
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0105.html b/docs/dws/dev/dws_04_0105.html new file mode 100644 index 00000000..3d35297e --- /dev/null +++ b/docs/dws/dev/dws_04_0105.html @@ -0,0 +1,443 @@ + + +

java.sql.DatabaseMetaData

+

This section describes java.sql.DatabaseMetaData, the interface for defining database objects.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.DatabaseMetaData

Method Name

+

Return Type

+

Support JDBC 4

+

getTables(String catalog, String schemaPattern, String tableNamePattern, String[] types)

+

ResultSet

+

Yes

+

getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)

+

ResultSet

+

Yes

+

getTableTypes()

+

ResultSet

+

Yes

+

getUserName()

+

String

+

Yes

+

isReadOnly()

+

boolean

+

Yes

+

nullsAreSortedHigh()

+

boolean

+

Yes

+

nullsAreSortedLow()

+

boolean

+

Yes

+

nullsAreSortedAtStart()

+

boolean

+

Yes

+

nullsAreSortedAtEnd()

+

boolean

+

Yes

+

getDatabaseProductName()

+

String

+

Yes

+

getDatabaseProductVersion()

+

String

+

Yes

+

getDriverName()

+

String

+

Yes

+

getDriverVersion()

+

String

+

Yes

+

getDriverMajorVersion()

+

int

+

Yes

+

getDriverMinorVersion()

+

int

+

Yes

+

usesLocalFiles()

+

boolean

+

Yes

+

usesLocalFilePerTable()

+

boolean

+

Yes

+

supportsMixedCaseIdentifiers()

+

boolean

+

Yes

+

storesUpperCaseIdentifiers()

+

boolean

+

Yes

+

storesLowerCaseIdentifiers()

+

boolean

+

Yes

+

supportsMixedCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesUpperCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesLowerCaseQuotedIdentifiers()

+

boolean

+

Yes

+

storesMixedCaseQuotedIdentifiers()

+

boolean

+

Yes

+

supportsAlterTableWithAddColumn()

+

boolean

+

Yes

+

supportsAlterTableWithDropColumn()

+

boolean

+

Yes

+

supportsColumnAliasing()

+

boolean

+

Yes

+

nullPlusNonNullIsNull()

+

boolean

+

Yes

+

supportsConvert()

+

boolean

+

Yes

+

supportsConvert(int fromType, int toType)

+

boolean

+

Yes

+

supportsTableCorrelationNames()

+

boolean

+

Yes

+

supportsDifferentTableCorrelationNames()

+

boolean

+

Yes

+

supportsExpressionsInOrderBy()

+

boolean

+

Yes

+

supportsOrderByUnrelated()

+

boolean

+

Yes

+

supportsGroupBy()

+

boolean

+

Yes

+

supportsGroupByUnrelated()

+

boolean

+

Yes

+

supportsGroupByBeyondSelect()

+

boolean

+

Yes

+

supportsLikeEscapeClause()

+

boolean

+

Yes

+

supportsMultipleResultSets()

+

boolean

+

Yes

+

supportsMultipleTransactions()

+

boolean

+

Yes

+

supportsNonNullableColumns()

+

boolean

+

Yes

+

supportsMinimumSQLGrammar()

+

boolean

+

Yes

+

supportsCoreSQLGrammar()

+

boolean

+

Yes

+

supportsExtendedSQLGrammar()

+

boolean

+

Yes

+

supportsANSI92EntryLevelSQL()

+

boolean

+

Yes

+

supportsANSI92IntermediateSQL()

+

boolean

+

Yes

+

supportsANSI92FullSQL()

+

boolean

+

Yes

+

supportsIntegrityEnhancementFacility()

+

boolean

+

Yes

+

supportsOuterJoins()

+

boolean

+

Yes

+

supportsFullOuterJoins()

+

boolean

+

Yes

+

supportsLimitedOuterJoins()

+

boolean

+

Yes

+

isCatalogAtStart()

+

boolean

+

Yes

+

supportsSchemasInDataManipulation()

+

boolean

+

Yes

+

supportsSavepoints()

+

boolean

+

Yes

+

supportsResultSetHoldability(int holdability)

+

boolean

+

Yes

+

getResultSetHoldability()

+

int

+

Yes

+

getDatabaseMajorVersion()

+

int

+

Yes

+

getDatabaseMinorVersion()

+

int

+

Yes

+

getJDBCMajorVersion()

+

int

+

Yes

+

getJDBCMinorVersion()

+

int

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0106.html b/docs/dws/dev/dws_04_0106.html new file mode 100644 index 00000000..2393a782 --- /dev/null +++ b/docs/dws/dev/dws_04_0106.html @@ -0,0 +1,58 @@ + + +

java.sql.Driver

+

This section describes java.sql.Driver, the database driver interface.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.Driver

Method Name

+

Return Type

+

Support JDBC 4

+

acceptsURL(String url)

+

boolean

+

Yes

+

connect(String url, Properties info)

+

Connection

+

Yes

+

jdbcCompliant()

+

boolean

+

Yes

+

getMajorVersion()

+

int

+

Yes

+

getMinorVersion()

+

int

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0107.html b/docs/dws/dev/dws_04_0107.html new file mode 100644 index 00000000..9cd1cc1f --- /dev/null +++ b/docs/dws/dev/dws_04_0107.html @@ -0,0 +1,165 @@ + + +

java.sql.PreparedStatement

+

This section describes java.sql.PreparedStatement, the interface for preparing statements.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.PreparedStatement

Method Name

+

Return Type

+

Support JDBC 4

+

clearParameters()

+

void

+

Yes

+

execute()

+

boolean

+

Yes

+

executeQuery()

+

ResultSet

+

Yes

+

excuteUpdate()

+

int

+

Yes

+

getMetaData()

+

ResultSetMetaData

+

Yes

+

setBoolean(int parameterIndex, boolean x)

+

void

+

Yes

+

setBigDecimal(int parameterIndex, BigDecimal x)

+

void

+

Yes

+

setByte(int parameterIndex, byte x)

+

void

+

Yes

+

setBytes(int parameterIndex, byte[] x)

+

void

+

Yes

+

setDate(int parameterIndex, Date x)

+

void

+

Yes

+

setDouble(int parameterIndex, double x)

+

void

+

Yes

+

setFloat(int parameterIndex, float x)

+

void

+

Yes

+

setInt(int parameterIndex, int x)

+

void

+

Yes

+

setLong(int parameterIndex, long x)

+

void

+

Yes

+

setNString(int parameterIndex, String value)

+

void

+

Yes

+

setShort(int parameterIndex, short x)

+

void

+

Yes

+

setString(int parameterIndex, String x)

+

void

+

Yes

+

addBatch()

+

void

+

Yes

+

executeBatch()

+

int[]

+

Yes

+

clearBatch()

+

void

+

Yes

+
+
+
  • Execute addBatch() and execute() only after running clearBatch().
  • Batch is not cleared by calling executeBatch(). Clear batch by explicitly calling clearBatch().
  • After bounded variables of a batch are added, if you want to reuse these values (add a batch again), set*() is not necessary.
  • The following methods are inherited from java.sql.Statement: close, execute, executeQuery, executeUpdate, getConnection, getResultSet, getUpdateCount, isClosed, setMaxRows, and setFetchSize.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0108.html b/docs/dws/dev/dws_04_0108.html new file mode 100644 index 00000000..3bd91a70 --- /dev/null +++ b/docs/dws/dev/dws_04_0108.html @@ -0,0 +1,242 @@ + + +

java.sql.ResultSet

+

This section describes java.sql.ResultSet, the interface for execution result sets.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.ResultSet

Method Name

+

Return Type

+

Support JDBC 4

+

findColumn(String columnLabel)

+

int

+

Yes

+

getBigDecimal(int columnIndex)

+

BigDecimal

+

Yes

+

getBigDecimal(String columnLabel)

+

BigDecimal

+

Yes

+

getBoolean(int columnIndex)

+

boolean

+

Yes

+

getBoolean(String columnLabel)

+

boolean

+

Yes

+

getByte(int columnIndex)

+

byte

+

Yes

+

getBytes(int columnIndex)

+

byte[]

+

Yes

+

getByte(String columnLabel)

+

byte

+

Yes

+

getBytes(String columnLabel)

+

byte[]

+

Yes

+

getDate(int columnIndex)

+

Date

+

Yes

+

getDate(String columnLabel)

+

Date

+

Yes

+

getDouble(int columnIndex)

+

double

+

Yes

+

getDouble(String columnLabel)

+

double

+

Yes

+

getFloat(int columnIndex)

+

float

+

Yes

+

getFloat(String columnLabel)

+

float

+

Yes

+

getInt(int columnIndex)

+

int

+

Yes

+

getInt(String columnLabel)

+

int

+

Yes

+

getLong(int columnIndex)

+

long

+

Yes

+

getLong(String columnLabel)

+

long

+

Yes

+

getShort(int columnIndex)

+

short

+

Yes

+

getShort(String columnLabel)

+

short

+

Yes

+

getString(int columnIndex)

+

String

+

Yes

+

getString(String columnLabel)

+

String

+

Yes

+

getTime(int columnIndex)

+

Time

+

Yes

+

getTime(String columnLabel)

+

Time

+

Yes

+

getTimestamp(int columnIndex)

+

Timestamp

+

Yes

+

getTimestamp(String columnLabel)

+

Timestamp

+

Yes

+

isAfterLast()

+

boolean

+

Yes

+

isBeforeFirst()

+

boolean

+

Yes

+

isFirst()

+

boolean

+

Yes

+

next()

+

boolean

+

Yes

+
+
+
  • One Statement cannot have multiple open ResultSets.
  • The cursor that is used for traversing the ResultSet cannot be open after committed.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0109.html b/docs/dws/dev/dws_04_0109.html new file mode 100644 index 00000000..abe55470 --- /dev/null +++ b/docs/dws/dev/dws_04_0109.html @@ -0,0 +1,51 @@ + + +

java.sql.ResultSetMetaData

+

This section describes java.sql.ResultSetMetaData, which provides details about ResultSet object information.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.ResultSetMetaData

Method Name

+

Return Type

+

Support JDBC 4

+

getColumnCount()

+

int

+

Yes

+

getColumnName(int column)

+

String

+

Yes

+

getColumnType(int column)

+

int

+

Yes

+

getColumnTypeName(int column)

+

String

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0110.html b/docs/dws/dev/dws_04_0110.html new file mode 100644 index 00000000..06c51a71 --- /dev/null +++ b/docs/dws/dev/dws_04_0110.html @@ -0,0 +1,110 @@ + + +

java.sql.Statement

+

This section describes java.sql.Statement, the interface for executing SQL statements.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for java.sql.Statement

Method Name

+

Return Type

+

Support JDBC 4

+

close()

+

void

+

Yes

+

execute(String sql)

+

boolean

+

Yes

+

executeQuery(String sql)

+

ResultSet

+

Yes

+

executeUpdate(String sql)

+

int

+

Yes

+

getConnection()

+

Connection

+

Yes

+

getResultSet()

+

ResultSet

+

Yes

+

getQueryTimeout()

+

int

+

Yes

+

getUpdateCount()

+

int

+

Yes

+

isClosed()

+

boolean

+

Yes

+

setQueryTimeout(int seconds)

+

void

+

Yes

+

setFetchSize(int rows)

+

void

+

Yes

+

cancel()

+

void

+

Yes

+
+
+

Using setFetchSize can reduce the memory occupied by result sets on the client. Result sets are packaged into cursors and segmented for processing, which will increase the communication traffic between the database and the client, affecting performance.

+

Database cursors are valid only within their transaction. If setFetchSize is set, set setAutoCommit(false) and commit transactions on the connection to flush service data to a database.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0111.html b/docs/dws/dev/dws_04_0111.html new file mode 100644 index 00000000..42bce3e8 --- /dev/null +++ b/docs/dws/dev/dws_04_0111.html @@ -0,0 +1,65 @@ + + +

javax.sql.ConnectionPoolDataSource

+

This section describes javax.sql.ConnectionPoolDataSource, the interface for data source connection pools.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for javax.sql.ConnectionPoolDataSource

Method Name

+

Return Type

+

Support JDBC 4

+

getLoginTimeout()

+

int

+

Yes

+

getLogWriter()

+

PrintWriter

+

Yes

+

getPooledConnection()

+

PooledConnection

+

Yes

+

getPooledConnection(String user,String password)

+

PooledConnection

+

Yes

+

setLoginTimeout(int seconds)

+

void

+

Yes

+

setLogWriter(PrintWriter out)

+

void

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0112.html b/docs/dws/dev/dws_04_0112.html new file mode 100644 index 00000000..5769c823 --- /dev/null +++ b/docs/dws/dev/dws_04_0112.html @@ -0,0 +1,65 @@ + + +

javax.sql.DataSource

+

This section describes javax.sql.DataSource, the interface for data sources.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for javax.sql.DataSource

Method Name

+

Return Type

+

Support JDBC 4

+

getConneciton()

+

Connection

+

Yes

+

getConnection(String username,String password)

+

Connection

+

Yes

+

getLoginTimeout()

+

int

+

Yes

+

getLogWriter()

+

PrintWriter

+

Yes

+

setLoginTimeout(int seconds)

+

void

+

Yes

+

setLogWriter(PrintWriter out)

+

void

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0113.html b/docs/dws/dev/dws_04_0113.html new file mode 100644 index 00000000..b7c25488 --- /dev/null +++ b/docs/dws/dev/dws_04_0113.html @@ -0,0 +1,65 @@ + + +

javax.sql.PooledConnection

+

This section describes javax.sql.PooledConnection, the connection interface created by a connection pool.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for javax.sql.PooledConnection

Method Name

+

Return Type

+

Support JDBC 4

+

addConnectionEventListener (ConnectionEventListener listener)

+

void

+

Yes

+

close()

+

void

+

Yes

+

getConnection()

+

Connection

+

Yes

+

removeConnectionEventListener (ConnectionEventListener listener)

+

void

+

Yes

+

addStatementEventListener (StatementEventListener listener)

+

void

+

Yes

+

removeStatementEventListener (StatementEventListener listener)

+

void

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0114.html b/docs/dws/dev/dws_04_0114.html new file mode 100644 index 00000000..66788692 --- /dev/null +++ b/docs/dws/dev/dws_04_0114.html @@ -0,0 +1,93 @@ + + +

javax.naming.Context

+

This section describes javax.naming.Context, the context interface for connection configuration.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Support status for javax.naming.Context

Method Name

+

Return Type

+

Support JDBC 4

+

bind(Name name, Object obj)

+

void

+

Yes

+

bind(String name, Object obj)

+

void

+

Yes

+

lookup(Name name)

+

Object

+

Yes

+

lookup(String name)

+

Object

+

Yes

+

rebind(Name name, Object obj)

+

void

+

Yes

+

rebind(String name, Object obj)

+

void

+

Yes

+

rename(Name oldName, Name newName)

+

void

+

Yes

+

rename(String oldName, String newName)

+

void

+

Yes

+

unbind(Name name)

+

void

+

Yes

+

unbind(String name)

+

void

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0115.html b/docs/dws/dev/dws_04_0115.html new file mode 100644 index 00000000..19bb2db9 --- /dev/null +++ b/docs/dws/dev/dws_04_0115.html @@ -0,0 +1,30 @@ + + +

javax.naming.spi.InitialContextFactory

+

This section describes javax.naming.spi.InitialContextFactory, the initial context factory interface.

+ +
+ + + + + + + + + +
Table 1 Support status for javax.naming.spi.InitialContextFactory

Method Name

+

Return Type

+

Support JDBC 4

+

getInitialContext(Hashtable<?,?> environment)

+

Context

+

Yes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0116.html b/docs/dws/dev/dws_04_0116.html new file mode 100644 index 00000000..43325dad --- /dev/null +++ b/docs/dws/dev/dws_04_0116.html @@ -0,0 +1,105 @@ + + +

CopyManager

+

CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.

+

Inheritance Relationship of CopyManager

The CopyManager class is in the org.postgresql.copy package class and inherits the java.lang.Object class. The declaration of the class is as follows:

+
public class CopyManager
+extends Object
+
+

Construction Method

public CopyManager(BaseConnection connection)

+

throws SQLException

+
+

Basic Methods

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Common methods of CopyManager

Return Value

+

Method

+

Description

+

throws

+

CopyIn

+

copyIn(String sql)

+

-

+

SQLException

+

long

+

copyIn(String sql, InputStream from)

+

Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

+

SQLException,IOException

+

long

+

copyIn(String sql, InputStream from, int bufferSize)

+

Uses COPY FROM STDIN to quickly load data to tables in the database from InputStream.

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from)

+

Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from, int bufferSize)

+

Uses COPY FROM STDIN to quickly load data to tables in the database from Reader.

+

SQLException,IOException

+

CopyOut

+

copyOut(String sql)

+

-

+

SQLException

+

long

+

copyOut(String sql, OutputStream to)

+

Sends the result set of COPY TO STDOUT from the database to the OutputStream class.

+

SQLException,IOException

+

long

+

copyOut(String sql, Writer to)

+

Sends the result set of COPY TO STDOUT from the database to the Writer class.

+

SQLException,IOException

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0117.html b/docs/dws/dev/dws_04_0117.html new file mode 100644 index 00000000..9f11459a --- /dev/null +++ b/docs/dws/dev/dws_04_0117.html @@ -0,0 +1,108 @@ + + +

ODBC-Based Development

+

Open Database Connectivity (ODBC) is a Microsoft API for accessing databases based on the X/OPEN CLI. The ODBC API alleviates applications from directly operating in databases, and enhances the database portability, extensibility, and maintainability.

+

Figure 1 shows the system structure of ODBC.

+
Figure 1 ODBC system structure
+

GaussDB(DWS) supports ODBC 3.5 in the following environments.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 OSs Supported by ODBC

OS

+

Platform

+

SUSE Linux Enterprise Server 11 SP1/SP2/SP3/SP4

+

SUSE Linux Enterprise Server 12 and SP1/SP2/SP3/SP5

+

x86_64

+

Red Hat Enterprise Linux 6.4/6.5/6.6/6.7/6.8/6.9/7.0/7.1/7.2/7.3/7.4/7.5

+

x86_64

+

Red Hat Enterprise Linux 7.5

+

ARM64

+

CentOS 6.4/6.5/6.6/6.7/6.8/6.9/7.0/7.1/7.2/7.3/7.4

+

x86_64

+

CentOS 7.6

+

ARM64

+

EulerOS 2.0 SP2/SP3

+

x86_64

+

EulerOS 2.0 SP8

+

ARM64

+

NeoKylin 7.5/7.6

+

ARM64

+

Oracle Linux R7U4

+

x86_64

+

Windows 7

+

32-bit

+

Windows 7

+

64-bit

+

Windows Server 2008

+

32-bit

+

Windows Server 2008

+

64-bit

+
+
+

The operating systems listed above refer to the operating systems on which the ODBC program runs. They can be different from the operating systems where databases are deployed.

+

The ODBC Driver Manager running on UNIX or Linux can be unixODBC or iODBC. Select unixODBC-2.3.0 here as the component for connecting the database.

+

Windows has a native ODBC Driver Manager. You can locate Data Sources (ODBC) by choosing Control Panel > Administrative Tools.

+

The current database ODBC driver is based on an open source version and may be incompatible with vendor-unique data types, such as tinyint, smalldatetime, and nvarchar2.

+
+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0118.html b/docs/dws/dev/dws_04_0118.html new file mode 100644 index 00000000..ef8163da --- /dev/null +++ b/docs/dws/dev/dws_04_0118.html @@ -0,0 +1,14 @@ + + +

ODBC Package and Its Dependent Libraries and Header Files

+

ODBC Package for the Linux OS

Obtain the dws_8.1.x_odbc_driver_for_xxx_xxx.zip package from the release package. In the Linux OS, header files (including sql.h and sqlext.h) and library (libodbc.so) are required in application development. These header files and libraries can be obtained from the unixODBC-2.3.0 installation package.

+
+

ODBC Package for the Windows OS

Obtain the dws_8.1.x_odbc_driver_for_windows.zip package from the release package. In the Windows OS, the required header files and library files are system-resident.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0119.html b/docs/dws/dev/dws_04_0119.html new file mode 100644 index 00000000..c4b79049 --- /dev/null +++ b/docs/dws/dev/dws_04_0119.html @@ -0,0 +1,309 @@ + + +

Configuring a Data Source in the Linux OS

+

The ODBC DRIVER (psqlodbcw.so) provided by GaussDB(DWS) can be used after it has been configured in the data source. To configure data sources, users must configure the odbc.ini and odbcinst.ini files on the server. The two files are generated during the unixODBC compilation and installation, and are saved in the /usr/local/etc directory by default.

+

Procedure

  1. Obtain the source code package of unixODBC at:

    https://sourceforge.net/projects/unixodbc/files/unixODBC/2.3.0/unixODBC-2.3.0.tar.gz/download

    +

  2. Currently, unixODBC-2.2.1 is not supported. Assume you are to install unixODBC-2.3.0. Run the following commands. unixODBC is installed in the /usr/local directory by default. The data source file is generated in the /usr/local/etc directory, and the library file is generated in the /usr/local/lib directory.

    tar zxvf unixODBC-2.3.0.tar.gz
    +cd unixODBC-2.3.0
    +# Open the configure file. If it does not exist, open the configure.ac file. Find LIB_VERSION.
    +# Change the value of LIB_VERSION to 1:0:0 to compile a *.so.1 dynamic library with the same dependency on psqlodbcw.so.
    +vim configure
    +
    +./configure --enable-gui=no # To perform the compilation on a TaiShan server, add the configure parameter --build=aarch64-unknown-linux-gnu.
    +make
    +# The installation may require root permissions.
    +make install
    +

    Install unixODBC. If another version of unixODBC has been installed, it will be overwritten after installation.

    +

  3. Replace the GaussDB(DWS) client driver.

    Decompress the dws_8.1.x_odbc_driver_for_xxx_xxx.zip package.

    +
    • Obtain the psqlodbcw.la and psqlodbcw.so files in the /dws_8.1.x_odbc_driver_for_xxx_xxx/odbc/lib directory.
    • The lib file is generated in the /dws_8.1.x_odbc_driver_for_xxx_xxx/lib directory.
    +

  4. Configure the data source.

    1. Configure the ODBC driver file.

      Add the following content to the end of the /usr/local/etc/odbcinst.ini file:

      +
      [GaussMPP]
      +Driver64=/usr/local/lib/psqlodbcw.so
      +setup=/usr/local/lib/psqlodbcw.so
      +

      For descriptions of the parameters in the odbcinst.ini file, see Table 1.

      + +
      + + + + + + + + + + + + + + + + + +
      Table 1 odbcinst.ini configuration parameters

      Parameter

      +

      Description

      +

      Example

      +

      [DriverName]

      +

      Driver name, corresponding to Driver in DSN.

      +

      [DRIVER_N]

      +

      Driver64

      +

      Path of the dynamic driver library

      +

      Driver64=/xxx/odbc/lib/psqlodbcw.so

      +

      setup

      +

      Driver installation path, which is the same as the dynamic library path in Driver64.

      +

      setup=/xxx/odbc/lib/psqlodbcw.so

      +
      +
      +
    2. Configure the data source file.

      Add the following content to the end of the /usr/local/etc/odbc.ini file:

      +
      [MPPODBC]
      +Driver=GaussMPP
      +Servername=10.10.0.13 (database server IP address)
      +Database=gaussdb (database name)
      +Username=dbadmin (database username)
      +Password= (database user password)
      +Port=8000 (database listening port)
      +Sslmode=allow
      +

      For descriptions of the parameters in the odbc.ini file, see Table 2.

      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 2 odbc.ini configuration parameters

      Parameter

      +

      Description

      +

      Example

      +

      [DSN]

      +

      Data source name

      +

      [MPPODBC]

      +

      Driver

      +

      Driver name, corresponding to DriverName in odbcinst.ini

      +

      Driver=DRIVER_N

      +

      Servername

      +

      IP address of the server

      +

      Servername=10.145.130.26

      +

      Database

      +

      Name of the database to connect to

      +

      Database=gaussdb

      +

      Username

      +

      Name of the database user

      +

      Username=dbadmin

      +

      Password

      +

      Password of the database user

      +

      Password=

      +
      NOTE:

      After a user established a connection, the ODBC driver automatically clears their password stored in memory.

      +

      However, if this parameter is configured, unixODBC will cache data source files, which may cause the password to be stored in the memory for a long time.

      +

      When you connect to an application, you are advised to send your password through an API instead of writing it in a data source configuration file. After the connection has been established, immediately clear the memory segment where your password is stored.

      +
      +

      Port

      +

      Port ID of the server

      +

      Port=8000

      +

      Sslmode

      +

      Whether to enable the SSL mode

      +

      Sslmode=allow

      +

      UseServerSidePrepare

      +

      Whether to enable the extended query protocol for the database.

      +

      The value can be 0 or 1. The default value is 1, indicating that the extended query protocol is enabled.

      +

      UseServerSidePrepare=1

      +

      UseBatchProtocol

      +

      Whether to enable the batch query protocol. If it is enabled, the DML performance can be improved. The value can be 0 or 1. The default value is 1.

      +

      If this parameter is set to 0, the batch query protocol is disabled (mainly for communication with earlier database versions).

      +

      If this parameter is set to 1 and the support_batch_bind parameter is set to on, the batch query protocol is enabled.

      +

      UseBatchProtocol=1

      +

      ConnectionExtraInfo

      +

      Whether to display the driver deployment path and process owner in the connection_info parameter mentioned in connection_info

      +

      ConnectionExtraInfo=1

      +
      NOTE:

      The default value is 0. If this parameter is set to 1, the ODBC driver reports the driver deployment path and process owner to the database and displays the information in the connection_info parameter (see connection_info). In this case, you can query the information from PG_STAT_ACTIVITY or PGXC_STAT_ACTIVITY.

      +
      +

      ForExtensionConnector

      +

      ETL tool performance optimization parameter. It can be used to optimize the memory and reduce the memory usage by the peer CN, to avoid system instability caused by excessive CN memory usage.

      +

      The value can be 0 or 1. The default value is 0, indicating that the optimization item is disabled.

      +

      Do not set this parameter for other services outside the database system. Otherwise, the service correctness may be affected.

      +

      ForExtensionConnector=1

      +

      KeepDisallowPremature

      +

      Specifies whether the cursor in the SQL statement has the with hold attribute when the following conditions are met: UseDeclareFetch is set to 1, and the application invokes SQLNumResultCols, SQLDescribeCol, or SQLColAttribute after invoking SQLPrepare to obtain the column information of the result set.

      +

      The value can be 0 or 1. 0 indicates that the with hold attribute is supported, and 1 indicates that the with hold attribute is not supported. The default value is 0.

      +

      KeepDisallowPremature=1

      +
      NOTE:
      • When UseServerSidePrepare is set to 1, the KeepDisallowPremature parameter does not take effect. To use this parameter, set UseServerSidePrepare to 0. For example, set UseDeclareFetch to 1.

        KeepDisallowPremature=1

        +

        UseServerSidePrepare=0

        +
      +
      +
      +
      +

      The valid values of sslmode are as follows:

      + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      Table 3 sslmode options

      sslmode

      +

      Whether SSL Encryption Is Enabled

      +

      Description

      +

      disable

      +

      No

      +

      The SSL secure connection is not used.

      +

      allow

      +

      Probably

      +

      The SSL secure encrypted connection is used if required by the database server, but does not check the authenticity of the server.

      +

      prefer

      +

      Probably

      +

      The SSL secure encrypted connection is used as a preferred mode if supported by the database, but does not check the authenticity of the server.

      +

      require

      +

      Yes

      +

      The SSL secure connection must be used, but it only encrypts data and does not check the authenticity of the server.

      +

      verify-ca

      +

      Yes

      +

      The SSL secure connection must be used, and it checks whether the database has certificates issued by a trusted CA.

      +

      verify-full

      +

      Yes

      +

      The SSL secure connection must be used. In addition to the check scope specified by verify-ca, it checks whether the name of the host where the database resides is the same as that on the certificate. This mode is not supported.

      +
      +
      +
    +

  5. Enable the SSL mode.

    To use SSL certificates for connection, decompress the certificate package contained in the GaussDB(DWS) installation package, and run the source sslcert_env.sh file in a shell environment to deploy certificates in the default location of the current session.

    +

    Or manually declare the following environment variables and ensure that the permission for the client.key* series files is set to 600.

    +
    export PGSSLCERT= "/YOUR/PATH/OF/client.crt" # Change the path to the absolute path of client.crt.
    +export PGSSLKEY= "/YOUR/PATH/OF/client.key" # Change the path to the absolute path of client.key.
    +

    In addition, change the value of Sslmode in the data source to verify-ca.

    +

  6. In the security group rules of GaussDB(DWS), add the IP address segment of the servers with the client deployed to ensure that the servers can communicate with GaussDB(DWS).
  7. Configure environment variables.

    vim ~/.bashrc
    +

    Add the following content to the end of the configuration file:

    +
    export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
    +export ODBCSYSINI=/usr/local/etc
    +export ODBCINI=/usr/local/etc/odbc.ini
    +

  8. Run the following commands to validate the settings:

    source ~/.bashrc
    +

+
+

Testing Data Source Configuration

Run the isql -v GaussODBC command (GaussODBC is the data source name).

+
+
  • If the following information is displayed, the configuration is correct and the connection succeeds.
    +---------------------------------------+
    +| Connected!                            |
    +|                                       |
    +| sql-statement                         |
    +| help [tablename]                      |
    +| quit                                  |
    +|                                       |
    ++---------------------------------------+
    +SQL> 
    +
  • If error information is displayed, the configuration is incorrect. Check the configuration.
+

Troubleshooting

  • [UnixODBC][Driver Manager]Can't open lib 'xxx/xxx/psqlodbcw.so' : file not found.

    Possible causes:

    +
    • The path configured in the odbcinst.ini file is incorrect.

      Run ls to check the path in the error information, ensuring that the psqlodbcw.so file exists and you have execution permissions on it.

      +
    • The dependent library of psqlodbcw.so does not exist or is not in system environment variables.

      Run ldd to check the path in the error information. If libodbc.so.1 or other unixODBC libraries are lacking, configure unixODBC again following the procedure provided in this section, and add the lib directory under its installation directory to LD_LIBRARY_PATH. If other libraries are lacking, add the lib directory under the ODBC driver package to LD_LIBRARY_PATH.

      +
    +
  • [UnixODBC]connect to server failed: no such file or directory

    Possible causes:

    +
    • An incorrect or unreachable database IP address or port was configured.

      Check the Servername and Port configuration items in data sources.

      +
    • Server monitoring is improper.

      If Servername and Port are correctly configured, ensure the proper network adapter and port are monitored based on database server configurations in the procedure in this section.

      +
    • Firewall and network gatekeeper settings are improper.

      Check firewall settings, ensuring that the database communication port is trusted.

      +

      Check to ensure network gatekeeper settings are proper (if any).

      +
    +
  • [unixODBC]The password-stored method is not supported.

    Possible causes:

    +

    The sslmode configuration item is not configured in the data sources.

    +

    Solution:

    +

    Set it to allow or a higher level. For more details, see Table 3.

    +
  • Server common name "xxxx" does not match host name "xxxxx"

    Possible causes:

    +

    When verify-full is used for SSL encryption, the driver checks whether the host name in certificates is the same as the actual one.

    +

    Solution:

    +

    To solve this problem, use verify-ca to stop checking host names, or generate a set of CA certificates containing the actual host names.

    +
  • Driver's SQLAllocHandle on SQL_HANDLE_DBC failed

    Possible causes:

    +

    The executable file (such as the isql tool of unixODBC) and the database driver (psqlodbcw.so) depend on different library versions of ODBC, such as libodbc.so.1 and libodbc.so.2. You can verify this problem by using the following method:

    +
    ldd `which isql` | grep odbc
    +ldd psqlodbcw.so | grep odbc
    +

    If the suffix digits of the outputs libodbc.so are different or indicate different physical disk files, this problem exists. Both isql and psqlodbcw.so load libodbc.so. If different physical files are loaded, different ODBC libraries with the same function list conflict with each other in a visible domain. As a result, the database driver cannot be loaded.

    +

    Solution:

    +

    Uninstall the unnecessary unixODBC, such as libodbc.so.2, and create a soft link with the same name and the .so.2 suffix for the remaining libodbc.so.1 library.

    +
  • FATAL: Forbid remote connection with trust method!

    For security purposes, the CN forbids access from other nodes in the cluster without authentication.

    +

    To access the CN from inside the cluster, deploy the ODBC program on the machine where the CN is located and use 127.0.0.1 as the server address. It is recommended that the service system be deployed outside the cluster. If it is deployed inside, the database performance may be affected.

    +
  • [unixODBC][Driver Manager]Invalid attribute value

    This problem occurs when you use SQL on other GaussDB. The possible cause is that the unixODBC version is not the recommended one. You are advised to run the odbcinst --version command to check the unixODBC version.

    +
  • authentication method 10 not supported.

    If this error occurs on an open source client, the cause may be:

    +

    The database stores only the SHA-256 hash of the password, but the open source client supports only MD5 hashes.

    +
    • The database stores the hashes of user passwords instead of actual passwords.
    • In versions earlier than V100R002C80SPC300, the database stores only SHA-256 hashes and no MD5 hashes. Therefore, MD5 cannot be used for user password authentication.
    • In V100R002C80SPC300 and later, if a password is updated or a user is created, both types of hashes will be stored, compatible with open-source authentication protocols.
    • An MD5 hash can only be generated using the original password, but the password cannot be obtained by reversing its SHA-256 hash. If your database is upgraded from a version earlier than V100R002C80SPC300, passwords in the old version will only have SHA-256 hashes and not support MD5 authentication.
    +
    +

    To solve this problem, you can update the user password. For details, see "ALTER USER" in the SQL Syntax. Alternatively, create a user (see "CREATE USER" in the SQL Syntax), assign the same permissions to the user, and use the new user to connect to the database.

    +
  • unsupported frontend protocol 3.51: server supports 1.0 to 3.0

    The database version is too early or the database is an open-source database. Use the driver of the required version to connect to the database.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0120.html b/docs/dws/dev/dws_04_0120.html new file mode 100644 index 00000000..1c4228f3 --- /dev/null +++ b/docs/dws/dev/dws_04_0120.html @@ -0,0 +1,112 @@ + + +

Configuring a Data Source in the Windows OS

+

Configure the ODBC data source using the ODBC data source manager preinstalled in the Windows OS.

+

Procedure

  1. Replace the GaussDB(DWS) client driver.

    Decompress GaussDB-8.1.1-Windows-Odbc.tar.gz and install psqlodbc.msi (for 32-bit OS) or psqlodbc_x64.msi (for 64-bit OS).

    +

  2. Open Driver Manager.

    Use the Driver Manager suitable for your OS to configure the data source. (Assume the Windows system drive is drive C.)

    +
    • If you develop 32-bit programs in the 64-bit Windows OS, open the 32-bit Driver Manager at C:\Windows\SysWOW64\odbcad32.exe after you install the 32-bit driver.

      Do not open Driver Manager by choosing Control Panel, clicking Administrative Tools, and clicking Data Sources (ODBC).

      +

      WoW64 is the acronym for "Windows 32-bit on Windows 64-bit". C:\Windows\SysWOW64\ stores the 32-bit environment on a 64-bit system. C:\Windows\System32\ stores the environment consistent with the current OS. For technical details, see Windows technical documents.

      +
      +
    • If you develop 64-bit programs in the 64-bit Windows OS, open the 64-bit Driver Manager at C:\Windows\System32\odbcad32.exe after you install the 64-bit driver.

      Do not open Driver Manager by choosing Control Panel, clicking Administrative Tools, and clicking Data Sources (ODBC).

      +
    • In a 32-bit Windows OS, open C:\Windows\System32\odbcad32.exe.

      In the Windows OS, click Computer, and choose Control Panel. Click Administrative Tools and click Data Sources (ODBC).

      +
    +

  3. Configure the data source.

    On the User DSN tab, click Add, and choose PostgreSQL Unicode for setup. (An identifier will be displayed for the 64-bit OS.)

    +

    +

    +

    +

    The entered username and password will be recorded in the Windows registry and you do not need to enter them again when connecting to the database next time. For security purposes, you are advised to delete sensitive information before clicking Save and enter the required username and password again when using ODBC APIs to connect to the database.

    +
    +

  4. Enable the SSL mode.

    To use SSL certificates for connection, decompress the certificate package contained in the GaussDB(DWS) installation package, and double-click the sslcert_env.bat file to deploy certificates in the default location.

    +

    The sslcert_env.bat file ensures the purity of the certificate environment. When the %APPDATA%\postgresql directory exists, a message will be prompted asking you whether you want to remove related directories. If you want to remove related directories, back up files in the directory.

    +
    +

    Alternatively, you can copy the client.crt, client.key, client.key.cipher, and client.key.rand files in the certificate file folder to the manually created %APPDATA%\postgresql directory. Change client in the file names to postgres, for example, change client.key to postgres.key. Copy the cacert.pem file to the %APPDATA%\postgresql directory and change its name to root.crt.

    +

    Change the value of SSL Mode in step 2 to verify-ca.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 sslmode options

    sslmode

    +

    Whether SSL Encryption Is Enabled

    +

    Description

    +

    disable

    +

    No

    +

    The SSL secure connection is not used.

    +

    allow

    +

    Probably

    +

    The SSL secure encrypted connection is used if required by the database server, but does not check the authenticity of the server.

    +

    prefer

    +

    Probably

    +

    The SSL secure encrypted connection is used as a preferred mode if supported by the database, but does not check the authenticity of the server.

    +

    require

    +

    Yes

    +

    The SSL secure connection must be used, but it only encrypts data and does not check the authenticity of the server.

    +

    verify-ca

    +

    Yes

    +

    The SSL secure connection must be used, and it checks whether the database has certificates issued by a trusted CA.

    +

    verify-full

    +

    Yes

    +

    The SSL secure connection must be used. In addition to the check scope specified by verify-ca, it checks whether the name of the host where the database resides is the same as that on the certificate.

    +
    NOTE:

    This mode cannot be used.

    +
    +
    +
    +

  5. Add the IP address segment of the host where the client is located to the security group rules of GaussDB(DWS) to ensure that the host can communicate with GaussDB(DWS).
+
+

Testing Data Source Configuration

Click Test.

+
  • If the following information is displayed, the configuration is correct and the connection succeeds.

    +
  • If error information is displayed, the configuration is incorrect. Check the configuration.
+
+

Troubleshooting

  • Server common name "xxxx" does not match host name "xxxxx"

    This problem occurs because when verify-full is used for SSL encryption, the driver checks whether the host name in certificates is the same as the actual one. To solve this problem, use verify-ca to stop checking host names, or generate a set of CA certificates containing the actual host names.

    +
  • connect to server failed: no such file or directory

    Possible causes:

    +
    • An incorrect or unreachable database IP address or port was configured.

      Check the Servername and Port configuration items in data sources.

      +
    • Server monitoring is improper.

      If Servername and Port are correctly configured, ensure the proper network adapter and port are monitored based on database server configurations in the procedure in this section.

      +
    • Firewall and network gatekeeper settings are improper.

      Check firewall settings, ensuring that the database communication port is trusted.

      +

      Check to ensure network gatekeeper settings are proper (if any).

      +
    +
  • In the specified DSN, the system structures of the drive do not match those of the application.

    Possible cause: The bit versions of the drive and program are different.

    +

    C:\Windows\SysWOW64\odbcad32.exe is a 32-bit ODBC Drive Manager.

    +

    C:\Windows\System32\odbcad32.exe is a 64-bit ODBC Drive Manager.

    +
  • The password-stored method is not supported.

    Possible causes:

    +

    sslmode is not configured for the data source. Set this configuration item to allow or a higher level to enable SSL connections. For details about sslmode, see Table 1.

    +
  • authentication method 10 not supported.

    If this error occurs on an open source client, the cause may be:

    +

    The database stores only the SHA-256 hash of the password, but the open source client supports only MD5 hashes.

    +
    • The database stores the hashes of user passwords instead of actual passwords.
    • In versions earlier than V100R002C80SPC300, the database stores only SHA-256 hashes and no MD5 hashes. Therefore, MD5 cannot be used for user password authentication.
    • In V100R002C80SPC300 and later, if a password is updated or a user is created, both types of hashes will be stored, compatible with open-source authentication protocols.
    • An MD5 hash can only be generated using the original password, but the password cannot be obtained by reversing its SHA-256 hash. If your database is upgraded from a version earlier than V100R002C80SPC300, passwords in the old version will only have SHA-256 hashes and not support MD5 authentication.
    +
    +

    To solve this problem, you can update the user password. For details, see "ALTER USER" in the SQL Syntax. Alternatively, create a user (see "CREATE USER" in the SQL Syntax), assign the same permissions to the user, and use the new user to connect to the database.

    +
  • unsupported frontend protocol 3.51: server supports 1.0 to 3.0

    The database version is too early or the database is an open-source database. Use the driver of the required version to connect to the database.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0123.html b/docs/dws/dev/dws_04_0123.html new file mode 100644 index 00000000..475b2504 --- /dev/null +++ b/docs/dws/dev/dws_04_0123.html @@ -0,0 +1,666 @@ + + +

ODBC Development Example

+

Code for Common Functions

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
// The following example shows how to obtain data from GaussDB(DWS) through the ODBC interface.
+// DBtest.c (compile with: libodbc.so)   
+#include <stdlib.h> 
+#include <stdio.h> 
+#include <sqlext.h>
+#ifdef WIN32
+#include <windows.h>
+#endif 
+SQLHENV       V_OD_Env;        // Handle ODBC environment 
+SQLHSTMT      V_OD_hstmt;      // Handle statement 
+SQLHDBC       V_OD_hdbc;       // Handle connection     
+char          typename[100];
+SQLINTEGER    value = 100;
+SQLINTEGER    V_OD_erg,V_OD_buffer,V_OD_err,V_OD_id;
+SQLLEN        V_StrLen_or_IndPtr;
+int main(int argc,char *argv[]) 
+{         
+      // 1. Apply for an environment handle.       
+      V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&V_OD_Env);     
+      if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))        
+      {           
+           printf("Error AllocHandle\n");           
+           exit(0);        
+      } 
+      // 2. Set environment attributes (version information)         
+      SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);      
+      // 3. Apply for a connection handle.        
+      V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc);     
+      if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
+      {                     
+           SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);          
+           exit(0);       
+      }
+      // 4. Set connection attributes.
+      SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_ON, 0);          
+// 5. Connect to the data source. userName and password indicate the username and password for connecting to the database. Set them as needed.
+// If the username and password have been set in the odbc.ini file, you do not need to set userName or password here, retaining "" for them. However, you are not advised to do so because the username and password will be disclosed if the permission for odbc.ini is abused.
+      V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "gaussdb", SQL_NTS,  
+                           (SQLCHAR*) "userName", SQL_NTS,  (SQLCHAR*) "password", SQL_NTS);        
+      if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO))      
+      {           
+          printf("Error SQLConnect %d\n",V_OD_erg);            
+          SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);       
+          exit(0);        
+      }     
+      printf("Connected !\n"); 
+      // 6. Set statement attributes
+      SQLSetStmtAttr(V_OD_hstmt,SQL_ATTR_QUERY_TIMEOUT,(SQLPOINTER *)3,0);
+      // 7. Apply for a statement handle
+      SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt);       
+      // 8. Executes an SQL statement directly
+      SQLExecDirect(V_OD_hstmt,"drop table IF EXISTS customer_t1",SQL_NTS);
+      SQLExecDirect(V_OD_hstmt,"CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));",SQL_NTS);
+      SQLExecDirect(V_OD_hstmt,"insert into customer_t1 values(25,'li')",SQL_NTS);
+      // 9. Prepare for execution
+      SQLPrepare(V_OD_hstmt,"insert into customer_t1 values(?)",SQL_NTS); 
+      // 10. Bind parameters
+      SQLBindParameter(V_OD_hstmt,1,SQL_PARAM_INPUT,SQL_C_SLONG,SQL_INTEGER,0,0,
+                       &value,0,NULL);
+      // 11. Execute the ready statement
+      SQLExecute(V_OD_hstmt);
+      SQLExecDirect(V_OD_hstmt,"select id from testtable",SQL_NTS);
+      // 12. Obtain the attributes of a certain column in the result set
+      SQLColAttribute(V_OD_hstmt,1,SQL_DESC_TYPE_NAME,typename,sizeof(typename),NULL,NULL);                 
+      printf("SQLColAtrribute %s\n",typename);
+      // 13. Bind the result set
+      SQLBindCol(V_OD_hstmt,1,SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer,150,
+                (SQLLEN *)&V_StrLen_or_IndPtr);
+      // 14. Collect data using SQLFetch
+      V_OD_erg=SQLFetch(V_OD_hstmt);
+      // 15. Obtain and return data using SQLGetData
+      while(V_OD_erg != SQL_NO_DATA)
+      {
+          SQLGetData(V_OD_hstmt,1,SQL_C_SLONG,(SQLPOINTER)&V_OD_id,0,NULL);
+          printf("SQLGetData ----ID = %d\n",V_OD_id);
+          V_OD_erg=SQLFetch(V_OD_hstmt);
+      };
+      printf("Done !\n");
+      // 16. Disconnect from the data source and release handles
+      SQLFreeHandle(SQL_HANDLE_STMT,V_OD_hstmt);    
+      SQLDisconnect(V_OD_hdbc);         
+      SQLFreeHandle(SQL_HANDLE_DBC,V_OD_hdbc);       
+      SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env);  
+      return(0);
+ }
+
+ +
+
+

Code for Batch Processing

  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
/**********************************************************************
+* Set UseBatchProtocol to 1 in the data source and set the database parameter support_batch_bind
+* to on.
+* The CHECK_ERROR command is used to check and print error information.
+* This example is used to interactively obtain the DSN, data volume to be processed, and volume of ignored data from users, and insert required data into the test_odbc_batch_insert table.
+***********************************************************************/
+#include <stdio.h>
+#include <stdlib.h>
+#include <sql.h>
+#include <sqlext.h>
+#include <string.h>
+
+#include "util.c"
+
+void Exec(SQLHDBC hdbc, SQLCHAR* sql)
+{
+    SQLRETURN retcode;                  // Return status
+    SQLHSTMT hstmt = SQL_NULL_HSTMT;    // Statement handle
+    SQLCHAR     loginfo[2048];
+
+    // Allocate Statement Handle
+    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
+    CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)",
+                hstmt, SQL_HANDLE_STMT);
+
+    // Prepare Statement
+    retcode = SQLPrepare(hstmt, (SQLCHAR*) sql, SQL_NTS);
+    sprintf((char*)loginfo, "SQLPrepare log: %s", (char*)sql);
+    CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT);
+
+    retcode = SQLExecute(hstmt);
+    sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql);
+    CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT);
+
+    retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
+    sprintf((char*)loginfo, "SQLFreeHandle stmt log: %s", (char*)sql);
+    CHECK_ERROR(retcode, loginfo, hstmt, SQL_HANDLE_STMT);
+}
+
+int main () 
+{
+    SQLHENV  henv  = SQL_NULL_HENV;
+    SQLHDBC  hdbc  = SQL_NULL_HDBC; 
+    int      batchCount = 1000;
+    SQLLEN   rowsCount = 0;
+    int      ignoreCount = 0;
+
+    SQLRETURN   retcode;
+    SQLCHAR     dsn[1024] = {'\0'};
+    SQLCHAR     loginfo[2048];
+
+// Interactively obtain data source names.
+    getStr("Please input your DSN", (char*)dsn, sizeof(dsn), 'N');
+// Interactively obtain the amount of data to be batch processed.
+    getInt("batchCount", &batchCount, 'N', 1);
+    do 
+    {
+// Interactively obtain the amount of batch processing data that is not inserted into the database.
+        getInt("ignoreCount", &ignoreCount, 'N', 1);
+        if (ignoreCount > batchCount)
+        {
+            printf("ignoreCount(%d) should be less than batchCount(%d)\n", ignoreCount, batchCount);
+        }
+    }while(ignoreCount > batchCount);
+
+    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
+    CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_ENV)",
+                henv, SQL_HANDLE_ENV);
+
+    // Set ODBC Verion
+    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
+                                        (SQLPOINTER*)SQL_OV_ODBC3, 0);
+    CHECK_ERROR(retcode, "SQLSetEnvAttr(SQL_ATTR_ODBC_VERSION)",
+                henv, SQL_HANDLE_ENV);
+
+    // Allocate Connection
+    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
+    CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_DBC)",
+                henv, SQL_HANDLE_DBC);
+
+    // Set Login Timeout
+    retcode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
+    CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_LOGIN_TIMEOUT)",
+                hdbc, SQL_HANDLE_DBC);
+
+    // Set Auto Commit
+    retcode = SQLSetConnectAttr(hdbc, SQL_ATTR_AUTOCOMMIT,
+                                        (SQLPOINTER)(1), 0);
+    CHECK_ERROR(retcode, "SQLSetConnectAttr(SQL_ATTR_AUTOCOMMIT)",
+                hdbc, SQL_HANDLE_DBC);
+
+    // Connect to DSN
+    sprintf(loginfo, "SQLConnect(DSN:%s)", dsn);
+    retcode = SQLConnect(hdbc, (SQLCHAR*) dsn, SQL_NTS,
+                               (SQLCHAR*) NULL, 0, NULL, 0);
+    CHECK_ERROR(retcode, loginfo, hdbc, SQL_HANDLE_DBC);
+
+    // init table info.
+    Exec(hdbc, "drop table if exists test_odbc_batch_insert");
+    Exec(hdbc, "create table test_odbc_batch_insert(id int primary key, col varchar2(50))");
+
+// The following code constructs the data to be inserted based on the data volume entered by users:
+    {
+        SQLRETURN retcode; 
+        SQLHSTMT hstmtinesrt = SQL_NULL_HSTMT;
+        int          i;
+        SQLCHAR      *sql = NULL;
+        SQLINTEGER   *ids  = NULL;
+        SQLCHAR      *cols = NULL;
+        SQLLEN       *bufLenIds = NULL;
+        SQLLEN       *bufLenCols = NULL;
+        SQLUSMALLINT *operptr = NULL;
+        SQLUSMALLINT *statusptr = NULL;
+        SQLULEN      process = 0;
+
+// Data is constructed by column. Each column is stored continuously.
+        ids = (SQLINTEGER*)malloc(sizeof(ids[0]) * batchCount);
+        cols = (SQLCHAR*)malloc(sizeof(cols[0]) * batchCount * 50);
+// Data size in each row for a column
+        bufLenIds = (SQLLEN*)malloc(sizeof(bufLenIds[0]) * batchCount);
+        bufLenCols = (SQLLEN*)malloc(sizeof(bufLenCols[0]) * batchCount);
+// Whether this row needs to be processed. The value is SQL_PARAM_IGNORE or SQL_PARAM_PROCEED.
+        operptr = (SQLUSMALLINT*)malloc(sizeof(operptr[0]) * batchCount);
+        memset(operptr, 0, sizeof(operptr[0]) * batchCount);
+// Processing result of the row
+// Note: In the database, a statement belongs to one transaction. Therefore, data is processed as a unit. That is, either all data is inserted successfully or all data fails to be inserted.
+        statusptr = (SQLUSMALLINT*)malloc(sizeof(statusptr[0]) * batchCount);
+        memset(statusptr, 88, sizeof(statusptr[0]) * batchCount);
+
+        if (NULL == ids || NULL == cols || NULL == bufLenCols || NULL == bufLenIds)
+        {
+            fprintf(stderr, "FAILED:\tmalloc data memory failed\n");
+            goto exit;
+        }
+
+        for (int i = 0; i < batchCount; i++)
+        {
+            ids[i] = i;
+            sprintf(cols + 50 * i, "column test value %d", i);
+            bufLenIds[i] = sizeof(ids[i]);
+            bufLenCols[i] = strlen(cols + 50 * i);
+            operptr[i] = (i < ignoreCount) ? SQL_PARAM_IGNORE : SQL_PARAM_PROCEED;
+        }
+
+        // Allocate Statement Handle
+        retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmtinesrt);
+        CHECK_ERROR(retcode, "SQLAllocHandle(SQL_HANDLE_STMT)",
+                    hstmtinesrt, SQL_HANDLE_STMT);
+
+        // Prepare Statement
+        sql = (SQLCHAR*)"insert into test_odbc_batch_insert values(?, ?)";
+        retcode = SQLPrepare(hstmtinesrt, (SQLCHAR*) sql, SQL_NTS);
+        sprintf((char*)loginfo, "SQLPrepare log: %s", (char*)sql);
+        CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)batchCount, sizeof(batchCount));
+        CHECK_ERROR(retcode, "SQLSetStmtAttr", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLBindParameter(hstmtinesrt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, sizeof(ids[0]), 0,&(ids[0]), 0, bufLenIds);
+        CHECK_ERROR(retcode, "SQLBindParameter for id", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLBindParameter(hstmtinesrt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 50, 50, cols, 50, bufLenCols);
+        CHECK_ERROR(retcode, "SQLBindParameter for cols", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAMS_PROCESSED_PTR, (SQLPOINTER)&process, sizeof(process));
+        CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAMS_PROCESSED_PTR", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_STATUS_PTR, (SQLPOINTER)statusptr, sizeof(statusptr[0]) * batchCount);
+        CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_STATUS_PTR", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLSetStmtAttr(hstmtinesrt, SQL_ATTR_PARAM_OPERATION_PTR, (SQLPOINTER)operptr, sizeof(operptr[0]) * batchCount);
+        CHECK_ERROR(retcode, "SQLSetStmtAttr for SQL_ATTR_PARAM_OPERATION_PTR", hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLExecute(hstmtinesrt);
+        sprintf((char*)loginfo, "SQLExecute stmt log: %s", (char*)sql);
+        CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT);
+
+        retcode = SQLRowCount(hstmtinesrt, &rowsCount);
+        CHECK_ERROR(retcode, "SQLRowCount execution", hstmtinesrt, SQL_HANDLE_STMT);
+
+        if (rowsCount != (batchCount - ignoreCount))
+        {
+            sprintf(loginfo, "(batchCount - ignoreCount)(%d) != rowsCount(%d)", (batchCount - ignoreCount), rowsCount);
+            CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
+        }
+        else
+        {
+            sprintf(loginfo, "(batchCount - ignoreCount)(%d) == rowsCount(%d)", (batchCount - ignoreCount), rowsCount);
+            CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT);
+        }
+
+        if (rowsCount != process)
+        {
+            sprintf(loginfo, "process(%d) != rowsCount(%d)", process, rowsCount);
+            CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
+        }
+        else
+        {
+            sprintf(loginfo, "process(%d) == rowsCount(%d)", process, rowsCount);
+            CHECK_ERROR(SQL_SUCCESS, loginfo, NULL, SQL_HANDLE_STMT);
+        }
+
+        for (int i = 0; i < batchCount; i++)
+        {
+            if (i < ignoreCount)
+            {
+                if (statusptr[i] != SQL_PARAM_UNUSED)
+                {
+                    sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_UNUSED", i, statusptr[i]);
+                    CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
+                }
+            }
+            else if (statusptr[i] != SQL_PARAM_SUCCESS)
+            {
+                sprintf(loginfo, "statusptr[%d](%d) != SQL_PARAM_SUCCESS", i, statusptr[i]);
+                CHECK_ERROR(SQL_ERROR, loginfo, NULL, SQL_HANDLE_STMT);
+            }
+        }
+
+        retcode = SQLFreeHandle(SQL_HANDLE_STMT, hstmtinesrt);
+        sprintf((char*)loginfo, "SQLFreeHandle hstmtinesrt");
+        CHECK_ERROR(retcode, loginfo, hstmtinesrt, SQL_HANDLE_STMT);
+    }
+
+
+exit:
+    printf ("\nComplete.\n");
+
+    // Connection
+    if (hdbc != SQL_NULL_HDBC) {
+        SQLDisconnect(hdbc);
+        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
+    }
+
+    // Environment
+    if (henv != SQL_NULL_HENV)
+        SQLFreeHandle(SQL_HANDLE_ENV, henv);
+
+    return 0;
+}
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0124.html b/docs/dws/dev/dws_04_0124.html new file mode 100644 index 00000000..9964f17b --- /dev/null +++ b/docs/dws/dev/dws_04_0124.html @@ -0,0 +1,58 @@ + + +

ODBC Interfaces

+

The ODBC interface is a set of API functions provided to users. This chapter describes its common interfaces. For details on other interfaces, see "ODBC Programmer's Reference" at MSDN (https://msdn.microsoft.com/en-us/library/windows/desktop/ms714177(v=vs.85).aspx).

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0125.html b/docs/dws/dev/dws_04_0125.html new file mode 100644 index 00000000..8fd4ec5b --- /dev/null +++ b/docs/dws/dev/dws_04_0125.html @@ -0,0 +1,11 @@ + + +

SQLAllocEnv

+

In ODBC 3.x, SQLAllocEnv (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0126.html b/docs/dws/dev/dws_04_0126.html new file mode 100644 index 00000000..0cc19782 --- /dev/null +++ b/docs/dws/dev/dws_04_0126.html @@ -0,0 +1,11 @@ + + +

SQLAllocConnect

+

In ODBC 3.x, SQLAllocConnect (an ODBC 2.x function) was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0127.html b/docs/dws/dev/dws_04_0127.html new file mode 100644 index 00000000..980db577 --- /dev/null +++ b/docs/dws/dev/dws_04_0127.html @@ -0,0 +1,56 @@ + + +

SQLAllocHandle

+

Function

SQLAllocHandle allocates environment, connection, or statement handles. This function is a generic function for allocating handles that replaces the deprecated ODBC 2.x functions SQLAllocEnv, SQLAllocConnect, and SQLAllocStmt.

+
+

Prototype

1
+2
+3
SQLRETURN SQLAllocHandle(SQLSMALLINT   HandleType,    
+                         SQLHANDLE     InputHandle,     
+                         SQLHANDLE     *OutputHandlePtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + +
Table 1 SQLAllocHandle parameters

Keyword

+

Description

+

HandleType

+

The type of handle to be allocated by SQLAllocHandle. The value must be one of the following:

+
  • SQL_HANDLE_ENV (environment handle)
  • SQL_HANDLE_DBC (connection handle)
  • SQL_HANDLE_STMT (statement handle)
  • SQL_HANDLE_DESC (description handle)
+

The handle application sequence is: SQL_HANDLE_ENV > SQL_HANDLE_DBC > SQL_HANDLE_STMT. The handle applied later depends on the handle applied prior to it.

+

InputHandle

+

Existing handle to use as a context for the new handle being allocated.

+
  • If HandleType is SQL_HANDLE_ENV, this is SQL_NULL_HANDLE.
  • If HandleType is SQL_HANDLE_DBC, this must be an environment handle.
  • If HandleType is SQL_HANDLE_STMT or SQL_HANDLE_DESC, it must be a connection handle.
+

OutputHandlePtr

+

Output parameter: Pointer to a buffer in which to return the handle to the newly allocated data structure.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

When allocating a non-environment handle, if SQLAllocHandle returns SQL_ERROR, it sets OutputHandlePtr to SQL_NULL_HENV, SQL_NULL_HDBC, SQL_NULL_HSTMT, or SQL_NULL_HDESC. The application can then call SQLGetDiagRec, with HandleType and Handle set to IntputHandle, to obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0128.html b/docs/dws/dev/dws_04_0128.html new file mode 100644 index 00000000..2fed2319 --- /dev/null +++ b/docs/dws/dev/dws_04_0128.html @@ -0,0 +1,11 @@ + + +

SQLAllocStmt

+

In ODBC 3.x, SQLAllocStmt was deprecated and replaced with SQLAllocHandle. For details, see SQLAllocHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0129.html b/docs/dws/dev/dws_04_0129.html new file mode 100644 index 00000000..22f3b19c --- /dev/null +++ b/docs/dws/dev/dws_04_0129.html @@ -0,0 +1,74 @@ + + +

SQLBindCol

+

Function

SQLBindCol is used to associate (bind) columns in a result set to an application data buffer.

+
+

Prototype

1
+2
+3
+4
+5
+6
SQLRETURN SQLBindCol(SQLHSTMT       StatementHandle,    
+                     SQLUSMALLINT   ColumnNumber,     
+                     SQLSMALLINT    TargetType,
+                     SQLPOINTER     TargetValuePtr,
+                     SQLLEN         BufferLength,
+                     SQLLEN         *StrLen_or_IndPtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLBindCol parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle.

+

ColumnNumber

+

Number of the column to be bound. The column number starts with 0 and increases in ascending order. Column 0 is the bookmark column. If no bookmark column is set, column numbers start at 1.

+

TargetType

+

The C data type in the buffer.

+

TargetValuePtr

+

Output parameter: pointer to the buffer bound with the column. The SQLFetch function returns data in the buffer. If TargetValuePtr is null, StrLen_or_IndPtr is a valid value.

+

BufferLength

+

Size of the TargetValuePtr buffer in bytes available to store the column data.

+

StrLen_or_IndPtr

+

Output parameter: pointer to the length or indicator of the buffer. If StrLen_or_IndPtr is null, no length or indicator is used.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLBindCol returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, with HandleType and Handle set to SQL_HANDLE_STMT and StatementHandle, respectively, to obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0130.html b/docs/dws/dev/dws_04_0130.html new file mode 100644 index 00000000..552988ff --- /dev/null +++ b/docs/dws/dev/dws_04_0130.html @@ -0,0 +1,102 @@ + + +

SQLBindParameter

+

Function

SQLBindParameter is used to associate (bind) parameter markers in an SQL statement to a buffer.

+
+

Prototype

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
SQLRETURN SQLBindParameter(SQLHSTMT       StatementHandle,    
+                           SQLUSMALLINT   ParameterNumber,     
+                           SQLSMALLINT    InputOutputType,
+                           SQLSMALLINT    ValuetType,
+                           SQLSMALLINT    ParameterType,
+                           SQLULEN        ColumnSize,
+                           SQLSMALLINT    DecimalDigits,
+                           SQLPOINTER     ParameterValuePtr,
+                           SQLLEN         BufferLength,
+                           SQLLEN         *StrLen_or_IndPtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLBindParameter

Keyword

+

Description

+

StatementHandle

+

Statement handle.

+

ParameterNumber

+

Parameter marker number, starting at 1 and increasing in an ascending order.

+

InputOutputType

+

Input/output type of the parameter.

+

ValueType

+

C data type of the parameter.

+

ParameterType

+

SQL data type of the parameter.

+

ColumnSize

+

Size of the column or expression of the corresponding parameter marker.

+

DecimalDigits

+

Digital number of the column or the expression of the corresponding parameter marker.

+

ParameterValuePtr

+

Pointer to the storage parameter buffer.

+

BufferLength

+

Size of the ParameterValuePtr buffer in bytes.

+

StrLen_or_IndPtr

+

Pointer to the length or indicator of the buffer. If StrLen_or_IndPtr is null, no length or indicator is used.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLBindCol returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, with HandleType and Handle set to SQL_HANDLE_STMT and StatementHandle, respectively, to obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0131.html b/docs/dws/dev/dws_04_0131.html new file mode 100644 index 00000000..70f504de --- /dev/null +++ b/docs/dws/dev/dws_04_0131.html @@ -0,0 +1,81 @@ + + +

SQLColAttribute

+

Function

SQLColAttribute returns the descriptor information about a column in the result set.

+
+

Prototype

1
+2
+3
+4
+5
+6
+7
SQLRETURN SQLColAttribute(SQLHSTMT        StatementHandle,    
+                          SQLUSMALLINT    ColumnNumber,     
+                          SQLUSMALLINT    FieldIdentifier,
+                          SQLPOINTER      CharacterAtrriburePtr,
+                          SQLSMALLINT     BufferLength,
+                          SQLSMALLINT     *StringLengthPtr,
+                          SQLPOINTER      NumericAttributePtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLColAttribute parameter

Keyword

+

Description

+

StatementHandle

+

Statement handle.

+

ColumnNumber

+

Column number of the field to be queried, starting at 1 and increasing in an ascending order.

+

FieldIdentifier

+

Field identifier of ColumnNumber in IRD.

+

CharacterAttributePtr

+

Output parameter: pointer to the buffer that returns FieldIdentifier field value.

+

BufferLength

+
  • FieldIdentifier indicates the length of the buffer if FieldIdentifier is an ODBC-defined field and CharacterAttributePtr points to a character string or a binary buffer.
  • Ignore this parameter if FieldIdentifier is an ODBC-defined field and CharacterAttributePtr points to an integer.
+

StringLengthPtr

+

Output parameter: pointer to a buffer in which the total number of valid bytes (for string data) is stored in *CharacterAttributePtr. Ignore the value of BufferLength if the data is not a string.

+

NumericAttributePtr

+

Output parameter: pointer to an integer buffer in which the value of the FieldIdentifier field in the ColumnNumber row of the IRD is returned.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLColAttribute returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0132.html b/docs/dws/dev/dws_04_0132.html new file mode 100644 index 00000000..40dc44db --- /dev/null +++ b/docs/dws/dev/dws_04_0132.html @@ -0,0 +1,81 @@ + + +

SQLConnect

+

Function

SQLConnect establishes a connection between a driver and a data source. After the connection, the connection handle can be used to access all information about the data source, including its application operating status, transaction processing status, and error information.

+
+

Prototype

1
+2
+3
+4
+5
+6
+7
SQLRETURN  SQLConnect(SQLHDBC        ConnectionHandle,
+                      SQLCHAR        *ServerName,
+                      SQLSMALLINT    NameLength1,
+                      SQLCHAR        *UserName,
+                      SQLSMALLINT    NameLength2,
+                      SQLCHAR        *Authentication,
+                      SQLSMALLINT    NameLength3);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLConnect parameters

Keyword

+

Description

+

ConnectionHandle

+

Connection handle, obtained from SQLAllocHandle.

+

ServerName

+

Name of the data source to connect to.

+

NameLength1

+

Length of ServerName.

+

UserName

+

User name of the database in the data source.

+

NameLength2

+

Length of UserName.

+

Authentication

+

User password of the database in the data source.

+

NameLength3

+

Length of Authentication.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
+
+

Precautions

If SQLConnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_DBC and ConnectionHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0133.html b/docs/dws/dev/dws_04_0133.html new file mode 100644 index 00000000..2ab94ad7 --- /dev/null +++ b/docs/dws/dev/dws_04_0133.html @@ -0,0 +1,39 @@ + + +

SQLDisconnect

+

Function

SQLDisconnect closes the connection associated with the database connection handle.

+
+

Prototype

1
SQLRETURN SQLDisconnect(SQLHDBC    ConnectionHandle);
+
+ +
+
+

Parameter

+
+ + + + + + + +
Table 1 SQLDisconnect parameters

Keyword

+

Description

+

ConnectionHandle

+

Connection handle, obtained from SQLAllocHandle.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLDisconnect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_DBC and ConnectionHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0134.html b/docs/dws/dev/dws_04_0134.html new file mode 100644 index 00000000..42154967 --- /dev/null +++ b/docs/dws/dev/dws_04_0134.html @@ -0,0 +1,53 @@ + + +

SQLExecDirect

+

Function

SQLExecDirect executes a prepared SQL statement specified in this parameter. This is the fastest execution method for executing only one SQL statement at a time.

+
+

Prototype

1
+2
+3
SQLRETURN SQLExecDirect(SQLHSTMT         StatementHandle,
+                        SQLCHAR         *StatementText,     
+                        SQLINTEGER       TextLength);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + +
Table 1 SQLExecDirect parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle, obtained from SQLAllocHandle.

+

StatementText

+

SQL statement to be executed. One SQL statement can be executed at a time.

+

TextLength

+

Length of StatementText.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_NEED_DATA indicates insufficient parameters provided before executing the SQL statement.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
  • SQL_NO_DATA indicates that the SQL statement does not return a result set.
+
+

Precautions

If SQLExecDirect returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0135.html b/docs/dws/dev/dws_04_0135.html new file mode 100644 index 00000000..2acc40ab --- /dev/null +++ b/docs/dws/dev/dws_04_0135.html @@ -0,0 +1,39 @@ + + +

SQLExecute

+

Function

The SQLExecute function executes a prepared SQL statement using SQLPrepare. The statement is executed using the current value of any application variables that were bound to parameter markers by SQLBindParameter.

+
+

Prototype

1
SQLRETURN SQLExecute(SQLHSTMT    StatementHandle);
+
+ +
+
+

Parameter

+
+ + + + + + + +
Table 1 SQLExecute parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle to be executed.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_NEED_DATA indicates insufficient parameters provided before executing the SQL statement.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_NO_DATA indicates that the SQL statement does not return a result set.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
+
+

Precautions

If SQLExecute returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0136.html b/docs/dws/dev/dws_04_0136.html new file mode 100644 index 00000000..1fdb9258 --- /dev/null +++ b/docs/dws/dev/dws_04_0136.html @@ -0,0 +1,39 @@ + + +

SQLFetch

+

Function

SQLFetch advances the cursor to the next row of the result set and retrieves any bound columns.

+
+

Prototype

1
SQLRETURN SQLFetch(SQLHSTMT    StatementHandle);
+
+ +
+
+

Parameter

+
+ + + + + + + +
Table 1 SQLFetch parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle, obtained from SQLAllocHandle.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_NO_DATA indicates that the SQL statement does not return a result set.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
+
+

Precautions

If SQLFetch returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0137.html b/docs/dws/dev/dws_04_0137.html new file mode 100644 index 00000000..f33720bb --- /dev/null +++ b/docs/dws/dev/dws_04_0137.html @@ -0,0 +1,11 @@ + + +

SQLFreeStmt

+

In ODBC 3.x, SQLFreeStmt (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0138.html b/docs/dws/dev/dws_04_0138.html new file mode 100644 index 00000000..afb47dc9 --- /dev/null +++ b/docs/dws/dev/dws_04_0138.html @@ -0,0 +1,11 @@ + + +

SQLFreeConnect

+

In ODBC 3.x, SQLFreeConnect (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0139.html b/docs/dws/dev/dws_04_0139.html new file mode 100644 index 00000000..ca76f984 --- /dev/null +++ b/docs/dws/dev/dws_04_0139.html @@ -0,0 +1,48 @@ + + +

SQLFreeHandle

+

Function

SQLFreeHandle releases resources associated with a specific environment, connection, or statement handle. It replaces the ODBC 2.x functions: SQLFreeEnv, SQLFreeConnect, and SQLFreeStmt.

+
+

Prototype

1
+2
SQLRETURN SQLFreeHandle(SQLSMALLINT   HandleType,    
+                        SQLHANDLE     Handle);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + +
Table 1 SQLFreeHandle parameters

Keyword

+

Description

+

HandleType

+

The type of handle to be freed by SQLFreeHandle. The value must be one of the following:

+
  • SQL_HANDLE_ENV
  • SQL_HANDLE_DBC
  • SQL_HANDLE_STMT
  • SQL_HANDLE_DESC
+

If HandleType is not one of the preceding values, SQLFreeHandle returns SQL_INVALID_HANDLE.

+

Handle

+

The name of the handle to be freed.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLFreeHandle returns SQL_ERROR, the handle is still valid.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0140.html b/docs/dws/dev/dws_04_0140.html new file mode 100644 index 00000000..ce3128a5 --- /dev/null +++ b/docs/dws/dev/dws_04_0140.html @@ -0,0 +1,11 @@ + + +

SQLFreeEnv

+

In ODBC 3.x, SQLFreeEnv (an ODBC 2.x function) was deprecated and replaced with SQLFreeHandle. For details, see SQLFreeHandle.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0141.html b/docs/dws/dev/dws_04_0141.html new file mode 100644 index 00000000..2cc228d2 --- /dev/null +++ b/docs/dws/dev/dws_04_0141.html @@ -0,0 +1,53 @@ + + +

SQLPrepare

+

Function

SQLPrepare prepares an SQL statement to be executed.

+
+

Prototype

1
+2
+3
SQLRETURN SQLPrepare(SQLHSTMT      StatementHandle,    
+                     SQLCHAR       *StatementText,     
+                     SQLINTEGER    TextLength);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + +
Table 1 SQLPrepare parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle.

+

StatementText

+

SQL text string.

+

TextLength

+

Length of StatementText.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
+
+

Precautions

If SQLPrepare returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0142.html b/docs/dws/dev/dws_04_0142.html new file mode 100644 index 00000000..3fef884a --- /dev/null +++ b/docs/dws/dev/dws_04_0142.html @@ -0,0 +1,74 @@ + + +

SQLGetData

+

Function

SQLGetData retrieves data for a single column in the current row of the result set. It can be called for many times to retrieve data of variable lengths.

+
+

Prototype

1
+2
+3
+4
+5
+6
SQLRETURN SQLGetData(SQLHSTMT        StatementHandle,
+                     SQLUSMALLINT    Col_or_Param_Num,
+                     SQLSMALLINT     TargetType,
+                     SQLPOINTER      TargetValuePtr,
+                     SQLLEN          BufferLength,
+                     SQLLEN          *StrLen_or_IndPtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLGetData parameters

Keyword

+

Description

+

StatementHandle

+

Statement handle, obtained from SQLAllocHandle.

+

Col_or_Param_Num

+

Column number for which the data retrieval is requested. The column number starts with 1 and increases in ascending order. The number of the bookmark column is 0.

+

TargetType

+

C data type in the TargetValuePtr buffer. If TargetType is SQL_ARD_TYPE, the driver uses the data type of the SQL_DESC_CONCISE_TYPE field in ARD. If TargetType is SQL_C_DEFAULT, the driver selects a default data type according to the source SQL data type.

+

TargetValuePtr

+

Output parameter: pointer to the pointer that points to the buffer where the data is located.

+

BufferLength

+

Size of the buffer pointed to by TargetValuePtr.

+

StrLen_or_IndPtr

+

Output parameter: pointer to the buffer where the length or identifier value is returned.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_NO_DATA indicates that the SQL statement does not return a result set.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
  • SQL_STILL_EXECUTING indicates that the statement is being executed.
+
+

Precautions

If SQLFetch returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0143.html b/docs/dws/dev/dws_04_0143.html new file mode 100644 index 00000000..44b2f40c --- /dev/null +++ b/docs/dws/dev/dws_04_0143.html @@ -0,0 +1,152 @@ + + +

SQLGetDiagRec

+

Function

SQLGetDiagRec returns the current values of multiple fields of a diagnostic record that contains error, warning, and status information.

+
+

Prototype

1
+2
+3
+4
+5
+6
+7
+8
SQLRETURN  SQLGetDiagRec(SQLSMALLINT    HandleType
+                         SQLHANDLE      Handle,
+                         SQLSMALLINT    RecNumber,
+                         SQLCHAR        *SQLState,
+                         SQLINTEGER     *NativeErrorPtr,
+                         SQLCHAR        *MessageText,
+                         SQLSMALLINT    BufferLength
+                         SQLSMALLINT    *TextLengthPtr);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQLGetDiagRec parameters

Keyword

+

Description

+

HandleType

+

A handle-type identifier that describes the type of handle for which diagnostics are desired. The value must be one of the following:

+
  • SQL_HANDLE_ENV
  • SQL_HANDLE_DBC
  • SQL_HANDLE_STMT
  • SQL_HANDLE_DESC
+

Handle

+

A handle for the diagnostic data structure. Its type is indicated by HandleType. If HandleType is SQL_HANDLE_ENV, Handle may be shared or non-shared environment handle.

+

RecNumber

+

Indicates the status record from which the application seeks information. RecNumber starts with 1.

+

SQLState

+

Output parameter: pointer to a buffer that saves the 5-character SQLSTATE code pertaining to RecNumber.

+

NativeErrorPtr

+

Output parameter: pointer to a buffer that saves the native error code.

+

MessageText

+

Pointer to a buffer that saves text strings of diagnostic information.

+

BufferLength

+

Length of MessageText.

+

TextLengthPtr

+

Output parameter: pointer to the buffer, the total number of bytes in the returned MessageText. If the number of bytes available to return is greater than BufferLength, then the diagnostics information text in MessageText is truncated to BufferLength minus the length of the null termination character.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

SQLGetDiagRec does not release diagnostic records for itself. It uses the following returned values to report execution results:

+
  • SQL_SUCCESS: The function successfully returns diagnostic information.
  • SQL_SUCCESS_WITH_INFO: The *MessageText buffer is too small to hold the requested diagnostic message. No diagnostic records are generated.
  • SQL_INVALID_HANDLE: The handle indicated by HandType and Handle is not a valid handle.
  • SQL_ERROR: RecNumber is smaller than or equal to zero, or BufferLength is smaller than zero.
+

If an ODBC function returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec and obtain the SQLSTATE value. The possible SQLSTATE values are listed as follows:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 SQLSTATE values

SQLSATATE

+

Error

+

Description

+

HY000

+

General error

+

An error occurred for which there is no specific SQLSTATE.

+

HY001

+

Memory allocation error

+

The driver is unable to allocate memory required to support execution or completion of the function.

+

HY008

+

Operation canceled

+

SQLCancel is called to terminate the statement execution, but the StatementHandle function is still called.

+

HY010

+

Function sequence error

+

The function is called prior to sending data to data parameters or columns being executed.

+

HY013

+

Memory management error

+

The function fails to be called. The error may be caused by low memory conditions.

+

HYT01

+

Connection timed out

+

The timeout period expired before the application was able to connect to the data source.

+

IM001

+

Function not supported by the driver

+

The called function is not supported by the StatementHandle driver.

+
+
+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0144.html b/docs/dws/dev/dws_04_0144.html new file mode 100644 index 00000000..d06d3a68 --- /dev/null +++ b/docs/dws/dev/dws_04_0144.html @@ -0,0 +1,60 @@ + + +

SQLSetConnectAttr

+

Function

SQLSetConnectAttr sets connection attributes.

+
+

Prototype

1
+2
+3
+4
SQLRETURN SQLSetConnectAttr(SQLHDBC       ConnectionHandle
+                            SQLINTEGER    Attribute,    
+                            SQLPOINTER    ValuePtr,     
+                            SQLINTEGER    StringLength);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + +
Table 1 SQLSetConnectAttr parameters

Keyword

+

Description

+

StatementtHandle

+

Connection handle.

+

Attribute

+

Attribute to set.

+

ValuePtr

+

Pointer to the Attribute value. ValuePtr depends on the Attribute value, and can be a 32-bit unsigned integer value or a null-terminated string. If ValuePtr parameter is driver-specific value, it may be signed integer.

+

StringLength

+

If ValuePtr points to a string or a binary buffer, this parameter should be the length of *ValuePtr. If ValuePtr points to an integer, StringLength is ignored.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLSetConnectAttr returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_DBC and ConnectionHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0145.html b/docs/dws/dev/dws_04_0145.html new file mode 100644 index 00000000..0c7047b4 --- /dev/null +++ b/docs/dws/dev/dws_04_0145.html @@ -0,0 +1,61 @@ + + +

SQLSetEnvAttr

+

Function

SQLSetEnvAttr sets environment attributes.

+
+

Prototype

1
+2
+3
+4
SQLRETURN SQLSetEnvAttr(SQLHENV       EnvironmentHandle
+                        SQLINTEGER    Attribute,    
+                        SQLPOINTER    ValuePtr,     
+                        SQLINTEGER    StringLength);
+
+ +
+
+

Parameters

+
+ + + + + + + + + + + + + + + + +
Table 1 SQLSetEnvAttr parameters

Keyword

+

Description

+

EnviromentHandle

+

Environment handle.

+

Attribute

+

Environment attribute to be set. Its value must be one of the following:

+
  • SQL_ATTR_ODBC_VERSION: ODBC version
  • SQL_CONNECTION_POOLING: connection pool attribute
  • SQL_OUTPUT_NTS: string type returned by the driver
+

ValuePtr

+

Pointer to the Attribute value. ValuePtr depends on the Attribute value, and can be a 32-bit integer value or a null-terminated string.

+

StringLength

+

If ValuePtr points to a string or a binary buffer, this parameter should be the length of *ValuePtr. If ValuePtr points to an integer, StringLength is ignored.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLSetEnvAttr returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_ENV and EnvironmentHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0146.html b/docs/dws/dev/dws_04_0146.html new file mode 100644 index 00000000..2a68b97d --- /dev/null +++ b/docs/dws/dev/dws_04_0146.html @@ -0,0 +1,60 @@ + + +

SQLSetStmtAttr

+

Function

SQLSetStmtAttr sets attributes related to a statement.

+
+

Prototype

1
+2
+3
+4
SQLRETURN SQLSetStmtAttr(SQLHSTMT      StatementHandle
+                         SQLINTEGER    Attribute,    
+                         SQLPOINTER    ValuePtr,     
+                         SQLINTEGER    StringLength);
+
+ +
+
+

Parameter

+
+ + + + + + + + + + + + + + + + +
Table 1 SQLSetStmtAttr parameters

Keyword

+

Description

+

StatementtHandle

+

Statement handle.

+

Attribute

+

Attribute to set.

+

ValuePtr

+

Pointer to the Attribute value. ValuePtr depends on the Attribute value, and can be a 32-bit unsigned integer value or a pointer to a null-terminated string, a binary buffer, and a driver-specified value. If ValuePtr parameter is driver-specific value, it may be signed integer.

+

StringLength

+

If ValuePtr points to a string or a binary buffer, this parameter should be the length of *ValuePtr. If ValuePtr points to an integer, StringLength is ignored.

+
+
+
+

Return Values

  • SQL_SUCCESS indicates that the call succeeded.
  • SQL_SUCCESS_WITH_INFO indicates some warning information is displayed.
  • SQL_ERROR indicates major errors, such as memory allocation and connection failures.
  • SQL_INVALID_HANDLE indicates that invalid handles were called. Values returned by other APIs are similar to the preceding values.
+
+

Precautions

If SQLSetStmtAttr returns SQL_ERROR or SQL_SUCCESS_WITH_INFO, the application can then call SQLGetDiagRec, set HandleType and Handle to SQL_HANDLE_STMT and StatementHandle, and obtain the SQLSTATE value. The SQLSTATE value provides the detailed function calling information.

+
+

Examples

See Examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0154.html b/docs/dws/dev/dws_04_0154.html new file mode 100644 index 00000000..4cb58146 --- /dev/null +++ b/docs/dws/dev/dws_04_0154.html @@ -0,0 +1,27 @@ + + + +

Importing CSV/TXT Data from the OBS

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0155.html b/docs/dws/dev/dws_04_0155.html new file mode 100644 index 00000000..52b826a6 --- /dev/null +++ b/docs/dws/dev/dws_04_0155.html @@ -0,0 +1,29 @@ + + + +

Importing ORC/CarbonData Data from OBS

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0156.html b/docs/dws/dev/dws_04_0156.html new file mode 100644 index 00000000..1d870127 --- /dev/null +++ b/docs/dws/dev/dws_04_0156.html @@ -0,0 +1,291 @@ + + +

Supported Data Types

+

+

In the big data field, the mainstream file format is ORC, which is supported by GaussDB(DWS). You can use Hive to export data to an ORC file and use a read-only foreign table to query and analyze the data in the ORC file. Therefore, you need to map the data types supported by the ORC file format with the data types supported by GaussDB(DWS). For details, see Table 1. Similarly, GaussDB(DWS) exports data through a write-only foreign table, and stores the data in the ORC format. Using Hive to read the ORC file content also requires matched data types. Table 2 shows the matching relationship.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Mapping between ORC read-only foreign tables and Hive data types

Type

+

Type Supported by GaussDB(DWS) Foreign Tables

+

Hive Table Type

+

1-byte integer

+

TINYINT (not recommended)

+

TINYINT

+

SMALLINT (recommended)

+

TINYINT

+

2-byte integer

+

SMALLINT

+

SMALLINT

+

4-byte integer

+

INTEGER

+

INT

+

8-byte integer

+

BIGINT

+

BIGINT

+

Single-precision floating point number

+

FLOAT4 (REAL)

+

FLOAT

+

Double-precision floating point number

+

FLOAT8(DOUBLE PRECISION)

+

DOUBLE

+

Scientific data type

+

DECIMAL[p (,s)] (The maximum precision can reach up to 38.)

+

DECIMAL (The maximum precision can reach up to 38.) (HIVE 0.11)

+

Date type

+

DATE

+

DATE

+

Time type

+

TIMESTAMP

+

TIMESTAMP

+

Boolean type

+

BOOLEAN

+

BOOLEAN

+

CHAR type

+

CHAR(n)

+

CHAR (n)

+

VARCHAR type

+

VARCHAR(n)

+

VARCHAR (n)

+

String (large text object)

+

TEXT(CLOB)

+

STRING

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Mapping between ORC write-only foreign tables and Hive data types

Type

+

Type Supported by GaussDB(DWS) Internal Tables (Data Source Table)

+

Type Supported by GaussDB(DWS) Write-only Foreign Tables

+

Hive Table Type

+

1-byte integer

+

TINYINT

+

TINYINT (not recommended)

+

SMALLINT

+

SMALLINT (recommended)

+

SMALLINT

+

2-byte integer

+

SMALLINT

+

SMALLINT

+

SMALLINT

+

4-byte integer

+

INTEGER, BINARY_INTEGER

+

INTEGER

+

INT

+

8-byte integer

+

BIGINT

+

BIGINT

+

BIGINT

+

Single-precision floating point number

+

FLOAT4, REAL

+

FLOAT4, REAL

+

FLOAT

+

Double-precision floating point number

+

DOUBLE PRECISION, FLOAT8, BINARY_DOUBLE

+

DOUBLE PRECISION, FLOAT8, BINARY_DOUBLE

+

DOUBLE

+

Scientific data type

+

DECIMAL, NUMERIC

+

DECIMAL[p (,s)] (The maximum precision can reach up to 38.)

+

precision38: DECIMAL; precision > 38: STRING

+

Date type

+

DATE

+

TIMESTAMP[(p)] [WITHOUT TIME ZONE]

+

TIMESTAMP

+

+

+

Time type

+

TIME [(p)] [WITHOUT TIME ZONE], TIME [(p)] [WITH TIME ZONE]

+

TEXT

+

STRING

+

TIMESTAMP[(p)] [WITHOUT TIME ZONE], TIMESTAMP[(p)][WITH TIME ZONE], SMALLDATETIME

+

TIMESTAMP[(p)] [WITHOUT TIME ZONE]

+

TIMESTAMP

+

INTERVAL DAY (l) TO SECOND (p), INTERVAL [FIELDS] [(p)]

+

VARCHAR(n)

+

VARCHAR(n)

+

Boolean type

+

BOOLEAN

+

BOOLEAN

+

BOOLEAN

+

CHAR type

+

CHAR(n), CHARACTER(n), NCHAR(n)

+

CHAR(n), CHARACTER(n), NCHAR(n)

+

n255: CHAR(n); n > 255: STRING

+

VARCHAR type

+

+

VARCHAR(n), CHARACTER VARYING(n), VARCHAR2(n)

+

VARCHAR(n)

+

n65535: VARCHAR(n); n > 65535: STRING

+

NVARCHAR2(n)

+

TEXT

+

STRING

+

String (large text object)

+

TEXT, CLOB

+

TEXT, CLOB

+

STRING

+

Monetary type

+

MONEY

+

NUMERIC

+

BIGINT

+
+
+
  1. The GaussDB(DWS) foreign table supports the NULL definition, and the Hive data table supports and uses the corresponding NULL definition.
  2. The value range of TINYINT in the Hive data table is [-128, 127], and the value range of TINYINT in GaussDB(DWS) is [0, 255]. You are advised to use the SMALLINT type when creating the GaussDB(DWS) read-only foreign table for TINYINT in the Hive table. If TINYINT is used, the read value may be different from the actual value. Similarly, when exporting data of the TINYINT type from GaussDB(DWS), you are advised to use the SMALLINT type for write-only foreign tables and Hive tables.
  3. The time zone definition is not supported by the date and time types of the GaussDB(DWS) foreign table, or by the Hive table.
  4. The date type in Hive contains only date. The date type in GaussDB(DWS) contains date and time.
  5. In GaussDB(DWS), ORC files can be compressed in ZLIB, SNAPPY, LZ4, or NONE mode.
  6. The FLOAT4 format itself is not accurate, and the sum operation results vary with environments. You are advised to use the DECIMAL type in high-precision scenarios.
  7. In Teradata-compatible mode, foreign tables do not support the DATE type.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0157.html b/docs/dws/dev/dws_04_0157.html new file mode 100644 index 00000000..a347bb5f --- /dev/null +++ b/docs/dws/dev/dws_04_0157.html @@ -0,0 +1,25 @@ + + + +

Exporting CSV/TXT Data to OBS

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0158.html b/docs/dws/dev/dws_04_0158.html new file mode 100644 index 00000000..ffb303e0 --- /dev/null +++ b/docs/dws/dev/dws_04_0158.html @@ -0,0 +1,30 @@ + + +

Exporting Data

+

Procedure

  1. Export data.

    1
    INSERT INTO [Foreign table name] SELECT * FROM [Source table name];
    +
    + +
    +

+
+

Examples

  • Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output;
    +
    + +
    +
    If information similar to the following is displayed, the data has been exported.
    INSERT 0 10
    +
    +
  • Example 2: Export part of the data to a data file by specifying the filter condition WHERE product_price>500.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output WHERE product_price>500;
    +
    + +
    +
+

Data of a special type, such as RAW, is exported as a binary file, which cannot be recognized by the import tool. As a result, you need to use the RAWTOHEX() function to convert it to the hexadecimal format before export.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0159.html b/docs/dws/dev/dws_04_0159.html new file mode 100644 index 00000000..56a7203b --- /dev/null +++ b/docs/dws/dev/dws_04_0159.html @@ -0,0 +1,24 @@ + + +

Exporting ORC Data to MRS

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0160.html b/docs/dws/dev/dws_04_0160.html new file mode 100644 index 00000000..bb97ff06 --- /dev/null +++ b/docs/dws/dev/dws_04_0160.html @@ -0,0 +1,15 @@ + + +

Overview

+
GaussDB(DWS) allows you to export ORC data to MRS using an HDFS foreign table. You can specify the export mode and export data format in the foreign table. Data is exported from GaussDB(DWS) in parallel using multiple DNs and stored in HDFS. In this way, the overall export performance is improved.
  • The CN only plans data export tasks and delivers the tasks to DNs. In this case, the CN is released to process external requests.
  • The computing capability and bandwidth of all the DNs are fully leveraged to export data.
  • Multiple HDFS servers can export data concurrently. The export path can be empty. The naming rule of the path must be the same as that of the exported file.
  • MRS connects to GaussDB(DWS) cluster nodes. The export rate is affected by the network bandwidth.
  • Data files in the ORC format are supported.
+
+

Naming Rules of Exported Files

The rules for naming ORC data files exported from GaussDB(DWS) are as follows:

+
+
  1. Data exported to MRS (HDFS): When data is exported from a DN, the data is stored in HDFS in the segment format. The file is named in the format of mpp_Database name_Schema name_Table name_Node name_n.orc. n is a natural number starting from 0 in ascending order, for example, 0, 1, 2, 3.
  2. You are advised to export data from different clusters or databases to different paths. The maximum size of an ORC file is 128 MB, and that of a stripe file is 64 MB.
  3. After the export is complete, the _SUCCESS file is generated.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0161.html b/docs/dws/dev/dws_04_0161.html new file mode 100644 index 00000000..54ddf5d0 --- /dev/null +++ b/docs/dws/dev/dws_04_0161.html @@ -0,0 +1,12 @@ + + +

Planning Data Export

+

For details about the data types that can be exported to MRS, see Table 2.

+

For details about HDFS data export or MRS configuration, see the MapReduce Service User Guide.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0162.html b/docs/dws/dev/dws_04_0162.html new file mode 100644 index 00000000..c7e3c778 --- /dev/null +++ b/docs/dws/dev/dws_04_0162.html @@ -0,0 +1,11 @@ + + +

Creating a Foreign Server

+

For details about creating a foreign server on HDFS, see Manually Creating a Foreign Server.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0163.html b/docs/dws/dev/dws_04_0163.html new file mode 100644 index 00000000..caade022 --- /dev/null +++ b/docs/dws/dev/dws_04_0163.html @@ -0,0 +1,109 @@ + + +

Creating a Foreign Table

+

After operations in Creating a Foreign Server are complete, create an HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in HDFS. The foreign table is write-only and can be used only for data export.

+
The syntax for creating a foreign table is as follows. For details, see CREATE FOREIGN TABLE (SQL on Hadoop or OBS).
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name 
+( [ { column_name type_name 
+    [ { [CONSTRAINT constraint_name] NULL |
+    [CONSTRAINT constraint_name] NOT NULL |
+      column_constraint [...]} ] |
+      table_constraint [, ...]} [, ...] ] ) 
+    SERVER dfs_server 
+    OPTIONS ( { option_name ' value ' } [, ...] ) 
+    [ {WRITE ONLY }]
+    DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
+    [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
+
+ +
+
+

For example, when creating a foreign table product_info_ext_obs, configure the parameters in the syntax as follows.

+
  • table_name

    Specifies the name of the foreign table.

    +
  • Table column definitions
    • column_name: specifies the name of a column in the foreign table.
    • type_name: specifies the data type of the column.
    +

    Multiple columns are separate by commas (,).

    +
  • SERVER dfs_server

    Specifies the foreign server name of the foreign table. This server must exist. The foreign table connects to OBS/HDFS to read data through the foreign server.

    +

    Enter the name of the foreign server created in Creating a Foreign Server.

    +
  • OPTIONS parameters

    These parameters are associated with the foreign table. The key parameters are as follows:

    +
    • format: specifies the format of the exported data file. The ORC format is supported.
    • foldername: specifies the directory of the data source file in the foreign table, that is, the corresponding file directory in HDFS. This parameter is mandatory for write-only foreign tables and optional for read-only foreign tables.
    • encoding: specifies the encoding format of the data source file in the foreign table. The default value is utf8.
    • filesize

      (Optional) Specifies the file size of a write-only foreign table. If this parameter is not specified, the file size in the distributed file system is used by default. This syntax is available only for the write-only foreign table.

      +

      Value range: an integer ranging from 1 to 1024

      +

      The filesize parameter is valid only for the write-only HDFS foreign table in ORC format.

      +
      +
    • compression

      (Optional) Specifies the compression mode of ORC files. This syntax is available only for the write-only foreign table.

      +

      Value range: zlib, snappy, and lz4. The default value is snappy.

      +
    • version

      (Optional) Specifies the ORC version number. This syntax is available only for the write-only foreign table.

      +

      Value range: Only 0.12 is supported. The default value is 0.12.

      +
    • dataencoding

      (Optional) Specifies the data encoding of the data table to be exported when the database encoding is different from the data encoding of the data table. For example, the database encoding is Latin-1, but the data encoding of the exported data table is in UTF-8 format. If this parameter is not specified, the database encoding is used by default. This syntax is valid only for the write-only HDFS foreign table.

      +

      Value range: data encoding types supported by the database encoding

      +

      The dataencoding parameter is valid only for the write-only HDFS foreign table in ORC format.

      +
      +
    +
  • Other parameters in the syntax

    Other parameters are optional. You can configure them as required. In this example, you do not need to configure these parameters. For details, see CREATE FOREIGN TABLE (SQL on Hadoop or OBS).

    +

    Based on the preceding settings, the command for creating the foreign table is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;
    +
    +-- Create an OBS foreign table that does not contain partition columns. The foreign server associated with the table is hdfs_server, the format of the file on HDFS corresponding to the table is ORC, and the data storage path on OBS is /user/hive/warehouse/product_info_orc/.
    +
    +CREATE FOREIGN TABLE product_info_ext_obs
    +(
    +    product_price                integer        ,
    +    product_id                   char(30)       ,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    integer        ,
    +    product_comment_time         date           ,
    +    product_comment_num          integer        ,
    +    product_comment_content      varchar(200)                      
    +) SERVER hdfs_server 
    +OPTIONS (
    +format 'orc', 
    +foldername '/user/hive/warehouse/product_info_orc/',
    +   compression 'snappy',
    +    version '0.12'
    +) Write Only;
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0164.html b/docs/dws/dev/dws_04_0164.html new file mode 100644 index 00000000..4e38146e --- /dev/null +++ b/docs/dws/dev/dws_04_0164.html @@ -0,0 +1,30 @@ + + +

Exporting Data

+

Procedure

  1. Export data.

    1
    INSERT INTO [Foreign table name] SELECT * FROM [Source table name];
    +
    + +
    +

+
+

Examples

  • Example 1: Export data from table product_info_output to a data file using the product_info_output_ext foreign table.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output;
    +
    + +
    +
    If information similar to the following is displayed, the data has been exported.
    INSERT 0 10
    +
    +
  • Example 2: Export part of the data to a data file by specifying the filter condition WHERE product_price>500.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output WHERE product_price>500;
    +
    + +
    +
+

Data of a special type, such as RAW, is exported as a binary file, which cannot be recognized by the import tool. As a result, you need to use the RAWTOHEX() function to convert it to the hexadecimal format before export.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0179.html b/docs/dws/dev/dws_04_0179.html new file mode 100644 index 00000000..d899550e --- /dev/null +++ b/docs/dws/dev/dws_04_0179.html @@ -0,0 +1,25 @@ + + +

Data Import

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0180.html b/docs/dws/dev/dws_04_0180.html new file mode 100644 index 00000000..39318ed0 --- /dev/null +++ b/docs/dws/dev/dws_04_0180.html @@ -0,0 +1,121 @@ + + +

Data Migration to GaussDB(DWS)

+

GaussDB(DWS) provides flexible methods for importing data. You can import data from different sources to GaussDB(DWS). The features of each method are listed in Table 1. You can select a method as required. You are advised to use GaussDB(DWS) with Cloud Data Migration (CDM), and Data Lake Factory (DLF). CDM is used for batch data migration, and DLF orchestrates and schedules the entire ETL process and provides a visualized development environment.

+
  • DRS, CDM, OBS, and MRS are cloud services.
  • GDS, DSC, and gs_restore, and gs_dump are internal tools.
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Data migration methods

Data Migration Mode

+

Supported Data Source/Database

+

Description

+

Advantage

+

Importing Data from OBS in Parallel

+

TEXT, CSV, ORC, and CarbonData data file formats

+

You can import data in TEXT, CSV, ORC, or CarbonData format from OBS to GaussDB(DWS) for query, and can remotely read data from OBS.

+

It is recommended for GaussDB(DWS).

+

This method features high performance and flexible scale-out.

+

Using GDS to Import Data from a Remote Server

+

TEXT and CSV data file formats

+

You can use the GDS tool provided by GaussDB(DWS) to import data from the remote server to GaussDB(DWS) in parallel. Multiple DNs are used for the import. This method is efficient and applicable to importing a large amount of data to the database.

+

Importing Data from MRS to a Cluster

+
  • Hive
  • Spark
+

You can configure a GaussDB(DWS) cluster to connect to an MRS cluster, and read data from the HDFS of MRS to GaussDB(DWS).

+
NOTE:

This import method is not supported currently.

+
+

This method features high performance and flexible scale-out.

+

Importing Data from One GaussDB(DWS) Cluster to Another

+

-

+

Data communication between two GaussDB(DWS) clusters is supported. You can use foreign tables to access and import data across GaussDB(DWS) clusters.

+

This method is applicable to data synchronization between multiple GaussDB(DWS) clusters.

+

Using the gsql Meta-Command \COPY to Import Data

+

Local files

+

Unlike the SQL COPY statement, the \copy command can be used to read data from or write data to only local files on a gsql client.

+

This method is easy-to-operate and suitable for importing a small amount of data to the database.

+

Running the COPY FROM STDIN Statement to Import Data

+

Other files or databases

+

When you use Java to develop applications, the CopyManager interface of the JDBC driver is invoked to write data from files or other databases to GaussDB(DWS).

+

Data is directly written from other databases to GaussDB(DWS). Service data does not need to be stored in files.

+

Using CDM to Migrate Data to GaussDB(DWS)

+

+
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server
  • Oracle
  • IBM Db2
  • SAP HANA
  • GaussDB(DWS)
  • Hive
+

CDM can migrate various types of data in batches between homogeneous and heterogeneous data sources. CDM migrates data to GaussDB(DWS) using the COPY statement or the GDS parallel import method.

+

This method supports data import from abundant data sources and is easy-to-operate.

+

Using DSC to Migrate SQL Scripts

+

Databases, NoSQL, file systems, and big data platforms

+

For details, see the documents of the third-party ETL tool.

+

GaussDB(DWS) provides the DSC tool to migrate Teradata/Oracle scripts to GaussDB(DWS).

+

This method supports abundant data sources and provides powerful data conversion through OBS.

+

Using gs_dump and gs_dumpall to Export Metadata

+
  • Plaintext
  • Custom
  • Directory
  • .tar
+

gs_dump exports a single database or its objects. gs_dumpall exports all databases or global objects in a cluster.

+

To migrate database information, you can use a tool to import the exported metadata to a target database.

+

+

This method is applicable to metadata migration.

+

Using gs_restore to Import Data

+

SQL, TMP, and TAR file formats

+

During database migration, you can use the gs_restore tool to import the file exported using the gs_dump tool to a GaussDB(DWS) cluster. In this way, metadata, such as table definitions and database object definitions, is imported. The following data needs to be imported:

+
  • All database object definitions
  • Definition of each database object
  • Definition of each schema
  • Definition of each table
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0181.html b/docs/dws/dev/dws_04_0181.html new file mode 100644 index 00000000..cf757d07 --- /dev/null +++ b/docs/dws/dev/dws_04_0181.html @@ -0,0 +1,19 @@ + + +

Importing Data from OBS in Parallel

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0182.html b/docs/dws/dev/dws_04_0182.html new file mode 100644 index 00000000..cdb014eb --- /dev/null +++ b/docs/dws/dev/dws_04_0182.html @@ -0,0 +1,96 @@ + + +

About Parallel Data Import from OBS

+

The object storage service (OBS) is an object-based cloud storage service, featuring data storage of high security, proven reliability, and cost-effectiveness. OBS provides large storage capacity for you to store files of any type.

+

GaussDB(DWS), a data warehouse service, uses OBS as a platform for converting cluster data and external data, satisfying the requirements for secure, reliable, and cost-effective storage.

+

You can import data in TXT, CSV, ORC, or CarbonData format from OBS to GaussDB(DWS) for query, and can remotely read data from OBS. You are advised to import frequently accessed hot data to GaussDB(DWS) to facilitate queries and store cold data to OBS for remote read to reduce cost.

+

Currently, data can be imported using either of the following methods:

+
  • Method 1: You do not need to create a server. Use the default server to create a foreign table. Data in TXT or CSV format is supported. For details, see Importing CSV/TXT Data from the OBS.
  • Method 2: You need to create a server and use the server to create a foreign table. Data in ORC, CarbonData, TXT, or CSV format is supported. For details, see Importing ORC/CarbonData Data from OBS.
+
  • Ensure that no Chinese characters are contained in paths used for importing data to or exporting data from OBS.
  • Data cannot be imported to or exported from OBS across regions. Ensure that OBS and the DWS cluster are in the same region.
+
+

Overview

During data migration and Extract-Transform-Load (ETL), a massive volume of data needs to be imported to GaussDB(DWS) in parallel. The common import mode is time-consuming. When you import data in parallel using OBS foreign tables, source data files to be imported are identified based on the import URL and data formats specified in the tables. Data is imported in parallel through DNs to GaussDB(DWS), which improves the overall import performance.

+
+
Advantages:
  • The CN only plans and delivers data import tasks, and the DNs execute these tasks. This reduces CN resource usage, enabling the CN to process external requests.
  • In this way, the computing capabilities and bandwidths of all the DNs are fully leveraged to import data.
  • You can preprocess data before the import.
  • Fault tolerance can be configured for data format errors during the data import. You can locate incorrect data based on displayed error information after the data is imported.
+
+

Disadvantage:

+

You need to create OBS foreign tables and store to-be-imported data on OBS.

+

Application Scenario:

+

A large volume of local data is imported concurrently on many DNs.

+

Related Concepts

  • Source data file: a TEXT, CSV, ORC, or CarbonData file that stores data to be imported in parallel.
  • OBS: a cloud storage service used to store unstructured data, such as documents, images, and videos. Data is imported in parallel from the OBS server to GaussDB(DWS).
  • Bucket: a container storing objects on OBS.
    • Object storage is a flat storage mode. Layered file system structures are not needed because all objects in buckets are at the same logical layer.
    • In OBS, each bucket name must be unique and cannot be changed. A default access control list (ACL) is created with a bucket. Each item in the ACL contains permissions granted to certain users, such as READ, WRITE, and FULL_CONTROL. Only authorized users can perform bucket operations, such as creating, deleting, viewing, and setting ACLs for buckets.
    • A user can create a maximum of 100 buckets. The total data size and the number of objects and files in each bucket are not limited.
    +
  • Object: a basic data storage unit in OBS. Data uploaded by users is stored in OBS buckets as objects. Object attributes include Key, Metadata, and Data.

    Generally, objects are managed as files. However, OBS has no file system–related concepts, such as files and folders. To let users easily manage data, OBS allows them to simulate folders. Users can add a slash (/) in the object name, for example, tpcds1000/stock.csv. In this name, tpcds1000 is regarded as the folder name and stock.csv the file name. The value of key (object name) is still tpcds1000/stock.csv, and the content of the object is the content of the stock.csv file.

    +
  • Key: name of an object. It is a UTF-8 character sequence containing 1 to 1024 characters. A key value must be unique in a bucket. Users can name the objects they stored or obtained as Bucket name+Object name.
  • Metadata: object metadata, which contains information about the object. There are system metadata and user metadata. The metadata is uploaded to OBS as key-value pairs together with HTTP headers.
    • System metadata is generated by OBS and used for processing object data. System metadata includes Date, Content-length, last-modify, and Content-MD5.
    • User metadata contains object descriptions specified by users for uploading objects.
    +
  • Data: object content. OBS does not sense the content and regards it as stateless binary data.
  • Ordinary table: A database table that stores data imported to data files in parallel. Ordinary tables are classified into row-store tables and column-store tables.
  • Foreign table: A foreign table is used to identify data in a source data file. The foreign table stores information, such as the location, format, encoding, and inter-data delimiter of a source data file.
+
+

How Data Is Imported

Figure 1 shows how data is imported from OBS. The CN plans and delivers data import tasks. It delivers tasks to each DN by file.

+

The delivery method is as follows:

+

In Figure 1, there are four DNs (DN0 to DN3) and OBS stores six files numbered from t1.data.0 to t1.data.5. The files are delivered as follows:

+

t1.data.0 -> DN0

+

t1.data.1 -> DN1

+

t1.data.2 -> DN2

+

t1.data.3 -> DN3

+

t1.data.4 -> DN0

+

t1.data.5 -> DN1

+

Two files are delivered to DN0 and DN1, respectively. One file is delivered to each of the other DNs.

+

The import performance is the best when one OBS file is delivered to each DN and all the files have the same size. To improve the performance of loading data from OBS, split the data file into multiple files as evenly as possible before storing it to OBS. The recommended number of split files is an integer multiple of the DN quantity.

+
Figure 1 Parallel data import using OBS foreign tables
+
+

Import Flowchart

Figure 2 Parallel import procedure
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Procedure description

Procedure

+

Description

+

Subtask

+

Upload data to OBS.

+

Plan the storage path on the OBS server and upload data files.

+

For details, see Uploading Data to OBS.

+

-

+

Create an OBS foreign table.

+

Create a foreign table to identify source data files on the OBS server. The OBS foreign table stores data source information, such as its bucket name, object name, file format, storage location, encoding format, and delimiter.

+

For details, see Creating an OBS Foreign Table.

+

-

+

Import data.

+

After creating the foreign table, run the INSERT statement to efficiently import data to the target tables.

+

For details, see Importing Data.

+

-

+

Handle the table with import errors.

+

If errors occur during data import, handle them based on the displayed error information described in Handling Import Errors to ensure data integrity.

+

-

+

Improve query efficiency.

+

After data is imported, run the ANALYZE statement to generate table statistics. The ANALYZE statement stores the statistics in the PG_STATISTIC system catalog. When you run the plan generator, the statistics help you generate an efficient query execution plan.

+

-

+
+
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0183.html b/docs/dws/dev/dws_04_0183.html new file mode 100644 index 00000000..16e5fb95 --- /dev/null +++ b/docs/dws/dev/dws_04_0183.html @@ -0,0 +1,28 @@ + + +

Creating Access Keys (AK and SK)

+

In this example, OBS data is imported to GaussDB(DWS) databases. When users who have registered with the cloud platform access OBS using clients, call APIs, or SDKs, access keys (AK/SK) are required for user authentication. Therefore, if you want to connect to the GaussDB(DWS) database through a client or a JDBC/ODBC application to access OBS, obtain the access keys (AK and SK) first.

+
  • Access Key ID (AK): indicates the ID of the access key, which is a unique identifier used in conjunction with a Secret Access Key to sign requests cryptographically.
  • Secret Access Key (SK): indicates the key used with its associated AK to cryptographically sign requests and identify request senders to prevent requests from being modified.
+

Creating Access Keys (AK and SK)

Before creating an AK/SK pair, ensure that your account (used to log in to the management console) has passed real-name authentication.

+

To create an AK/SK pair on the management console, perform the following steps:

+
  1. Log in to the GaussDB(DWS) management console.
  2. Click the username in the upper right corner and choose My Credentials from the drop-down list.
  3. Select the Access Keys tab.

    If an access key already exists in the access key list, you can directly use it. However, you can view only Access Key ID in the access key list. You can download the key file containing the AK and SK only when adding an access key. If you do not have the key file, click Create Access Key to create one.

    +
    • Each user can create a maximum of two valid access keys. If there are already two access keys, delete them and create one. To delete an access key, you need to enter the current login password and email address or SMS verification code. Deletion is successful only after the verification is passed.
    • To ensure account security, change your access keys periodically and keep them secure.
    +
    +

  4. Click Add Access Key.
  5. In the displayed Add Access Key dialog box, enter the password and its verification code and click OK.

    • If you have not bound an email address or a mobile number, enter only the login password.
    • If you have bound an email address and a mobile phone number, you can use either of them for verification.
    +
    +

  6. In the displayed Download Access Key dialog box, click OK to save the access keys to your browser's default download path.

    • Keep the access keys secure to prevent them from being leaked.
    • If you click Cancel in the dialog box, the access keys will not be downloaded, and you cannot download them later. In this case, re-create access keys.
    +
    +

  7. Open the downloaded credentials.csv file to obtain the access keys (AK and SK).
+
+

Precautions

If you find that your AK/SK pair is abnormally used (for example, the AK/SK pair is lost or leaked) or will be no longer used, delete your AK/SK pair in the access key list or contact the administrator to reset your AK/SK pair.

+

When deleting the access keys, you need to enter the login password and either an email or mobile verification code.

+

Deleted AK/SK pairs cannot be restored.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0184.html b/docs/dws/dev/dws_04_0184.html new file mode 100644 index 00000000..4b717015 --- /dev/null +++ b/docs/dws/dev/dws_04_0184.html @@ -0,0 +1,104 @@ + + +

Uploading Data to OBS

+

Scenarios

Before importing data from OBS to a cluster, prepare source data files and upload these files to OBS. If the data files have been stored on OBS, you only need to complete 2 to 3 in Uploading Data to OBS.

+
+

Preparing Data Files

Prepare source data files to be uploaded to OBS. GaussDB(DWS) supports only source data files in CSV, TXT, ORC, or CarbonData format.

+

If user data cannot be saved in CSV format, store the data as any text file.

+

According to How Data Is Imported, when the source data file contains a large volume of data, evenly split the file into multiple files before storing it to OBS. The import performance is better when the number of files is an integer multiple of the DN quantity.

+
+
+

Assume that you have stored the following three CSV files in OBS:

+
  • Data file product_info.0

    The file contains the following data:

    +
    1
    +2
    +3
    +4
    +5
    100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good!
    +205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good!
    +300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad.
    +310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice.
    +150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite.
    +
    + +
    +
  • Data file product_info.1

    The file contains the following data:

    +
    1
    +2
    +3
    +4
    +5
    200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality.
    +250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time.
    +108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy.
    +450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor.
    +260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes.
    +
    + +
    +
  • Data file product_info.2

    The file contains the following data:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    980,"ZKDS-J",2017-09-13,"B","2017 Women's Cotton Clothing","red","M",112,,,
    +98,"FKQB-I",2017-09-15,"B","2017 new shoes men","red","M",4345,2017-09-18,5473
    +50,"DMQY-K",2017-09-21,"A","2017 pants men","red","37",28,2017-09-25,58,"good","good","good"
    +80,"GKLW-l",2017-09-22,"A","2017 Jeans Men","red","39",58,2017-09-25,72,"Very comfortable."
    +30,"HWEC-L",2017-09-23,"A","2017 shoes women","red","M",403,2017-09-26,607,"good!"
    +40,"IQPD-M",2017-09-24,"B","2017 new pants Women","red","M",35,2017-09-27,52,"very good."
    +50,"LPEC-N",2017-09-25,"B","2017 dress Women","red","M",29,2017-09-28,47,"not good at all."
    +60,"NQAB-O",2017-09-26,"B","2017 jacket women","red","S",69,2017-09-29,70,"It's beautiful."
    +70,"HWNB-P",2017-09-27,"B","2017 jacket women","red","L",30,2017-09-30,55,"I like it so much"
    +80,"JKHU-Q",2017-09-29,"C","2017 T-shirt","red","M",90,2017-10-02,82,"very good."
    +
    + +
    +
+

Uploading Data to OBS

  1. Upload data to OBS.

    Store the source data files to be imported in the OBS bucket in advance.

    +
    1. Log in to the OBS management console.

      Click Service List and choose Object Storage Service to open the OBS management console.

      +
    2. Create a bucket.

      For details about how to create an OBS bucket, see "OBS Console Operation Guide > Managing Buckets > Creating a Bucket" in the Object Storage Service User Guide..

      +

      For example, create two buckets named mybucket and mybucket02.

      +
    3. Create a folder.

      For details, see "OBS Console Operation Guide > Managing Objects > Creating a Folder" in the Object Storage Service User Guide.

      +

      For example:

      +
      • Create a folder named input_data in the mybucket OBS bucket.
      • Create a folder named input_data in the mybucket02 OBS bucket.
      +
    4. Upload the files.

      For details, see "OBS Console Operation Guide > Managing Objects > Uploading a File" in the Object Storage Service User Guide..

      +

      For example:

      +
      • Upload the following data files to the input_data folder in the mybucket OBS bucket:
        1
        +2
        product_info.0
        +product_info.1
        +
        + +
        +
      • Upload the following data file to the input_data folder in the mybucket02 OBS bucket:
        1
        product_info.2
        +
        + +
        +
      +
    +

  2. Obtain the OBS path for storing source data files.

    After the source data files are uploaded to an OBS bucket, a globally unique access path is generated. The OBS path of the source data files is the value of the location parameter used for creating a foreign table.

    +

    The OBS path in the location parameter is in the format of obs://bucket_name/file_path/

    +

    For example, the OBS paths are as follows:

    +
    1
    +2
    +3
    obs://mybucket/input_data/product_info.0
    +obs://mybucket/input_data/product_info.1
    +obs://mybucket02/input_data/product_info.2
    +
    + +
    +

  3. Grant the OBS bucket read permission for the user who will import data.

    When importing data from OBS to a cluster, the user must have the read permission for the OBS buckets where the source data files are located. You can configure the ACL for the OBS buckets to grant the read permission to a specific user.

    +

    For details, see "OBS Console Operation Guide > Permission Control > Configuring a Bucket ACL" in the Object Storage Service User Guide.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0185.html b/docs/dws/dev/dws_04_0185.html new file mode 100644 index 00000000..a629c322 --- /dev/null +++ b/docs/dws/dev/dws_04_0185.html @@ -0,0 +1,99 @@ + + +

Creating an OBS Foreign Table

+

Procedure

  1. Set location of the foreign table based on the path planned in Uploading Data to OBS.
  2. Obtain the access keys (AK and SK) to access OBS. To obtain access keys, log in to the management console, click the username in the upper right corner, and select My Credentials from the menu. Then choose Access Keys in the navigation tree on the left. On the Access Keys page, you can view the existing AKs or click Add Access Key to create an AK/SK pair.
  3. Set data format parameters for the foreign table based on the formats of data to be imported. You need to collect the following source data information:

    • format: format of the source data file in the foreign table. OBS foreign tables support CSV and TEXT formats. The default value is TEXT.
    • header: Whether the data file contains a table header. Only CSV files can have headers.
    • delimiter: Delimiter specified to separate data fields in a file. If no delimiter is specified, the default one will be used.
    • For more parameters used for foreign tables, see data format parameters.
    +

  4. Plan the error tolerance of parallel import to specify how errors are handled during the import.

    • fill_missing_fields: When the last column in a row of the source data file is empty, this parameter specifies whether to report an error or set this field in the row to NULL.
    • ignore_extra_data: When the number of columns in the source data file is greater than that specified in the foreign table, this parameter specifies whether to report an error or ignore the extra columns.
    • per node reject limit: This parameter specifies the number of data format errors allowed on each DN. If the number of errors recorded in the error table on a DN exceeds the specified value, the import fails and an error message will be reported. This parameter is optional.
    • compatible_illegal_chars: When an illegal character is encountered, this parameter specifies whether to import an error, or convert it and proceed with the import.

      The following describes the rules for converting an invalid character:

      +
      • \0 is converted to a space.
      • Other invalid characters are converted to question marks (?).
      • If NULL, DELIMITER, QUOTE, or ESCAPE is also set to a space or question mark, an error message such as "illegal chars conversion may confuse COPY escape 0x20" is displayed, prompting you to modify parameter settings that may cause import errors.
      +
    • error_table_name: This parameter specifies the name of the table that records data format errors. After the parallel import, you can query this table for error details.
    • For details about the parameters, see error tolerance parameters.
    +

  5. Create an OBS table based on the parameter settings in the preceding steps. For details about how to create a foreign table, see CREATE FOREIGN TABLE (for GDS Import and Export).
+
+

Example

Create a foreign table in the GaussDB(DWS) database. Parameters are described as follows:

+
  • Data format parameter access keys (AK and SK)
    • Set access_key to the AK you have obtained.
    • Set secret_access_key to the SK you have obtained.
    +

    The values of access_key and secret_access_key are examples only.

    +
    +
+
  • Set data format parameters.
    • Set format to CSV.
    • Set encoding to UTF-8.
    • Configure encrypt. Its default value is off.
    • Set delimiter to ,.
    • Retain the default value (double quotation marks) of quote.
    • Set null (null value in a source data file) to a null string without quotation marks.
    • Set header (whether the exported data file contains the header row) to the default value false. If the first row of the data file is not a header, retain the default value.

      When exporting data from OBS, this parameter cannot be set to true. Use the default value false.

      +
      +
    +
  • Set fault-tolerant parameters for data import.
    • Set PER NODE REJECT LIMIT to 'unlimited', indicating that all data format errors detected during data import are allowed.
    • Set LOG INTO to product_info_err, indicating that the data format errors detected during data import are recorded in the product_info_err table.
    • If fill_missing_fields is set to true and the last column of a data row in a source data file is lost, the column is replaced with NULL and no error message will be generated.
    • If ignore_extra_data is set to true and the number of columns of the source data file is greater than that defined for the foreign table, the extra columns at the end of the row are ignored and no error message will be generated.
    +
+

Based on the preceding settings, the foreign table is created using the following statements:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
DROP FOREIGN TABLE product_info_ext;
+
+CREATE FOREIGN TABLE product_info_ext
+(
+    product_price                integer        not null,
+    product_id                   char(30)       not null,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)                   
+) 
+SERVER gsmpp_server 
+OPTIONS(
+
+LOCATION 'obs://mybucket/input_data/product_info | obs://mybucket02/input_data/product_info',
+FORMAT 'CSV' ,
+DELIMITER ',',
+encoding 'utf8',
+header 'false',
+ACCESS_KEY 'access_key_value_to_be_replaced',
+SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',
+fill_missing_fields 'true',
+ignore_extra_data 'true'
+)
+READ ONLY 
+LOG INTO product_info_err 
+PER NODE REJECT LIMIT 'unlimited';
+
+ +
+

If the following information is displayed, the foreign table has been created:

+
1
CREATE FOREIGN TABLE
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0186.html b/docs/dws/dev/dws_04_0186.html new file mode 100644 index 00000000..8435f3d8 --- /dev/null +++ b/docs/dws/dev/dws_04_0186.html @@ -0,0 +1,77 @@ + + +

Importing Data

+

Context

Before importing data, you are advised to optimize your design and deployment based on the following excellent practices, helping maximize system resource utilization and improving data import performance.

+
  • In most cases, OBS data import performance is limited by concurrent network access rate. Therefore, you are advised to deploy multiple buckets on the OBS server to import data in parallel from buckets, better utilizing DN data transfer.
+
  • Similar to the single table import, ensure that the I/O performance is greater than the maximum network throughput in the concurrent import.
+ +
  • If a table has an index, the index information is incrementally updated during the import, affecting data import performance. You are advised to delete the index from the target table before the import. You can create index again after the import is complete.
+
+

Procedure

  1. Create a table in the GaussDB(DWS) database to store the data imported from the OBS. For details about the syntax, see CREATE TABLE.

    The structure of the table must be consistent with that of the fields in the source data file. That is, the number of fields and field types must be the same. In addition, the structure of the target table must be the same as that of the foreign table. The field names can be different.

    +

  2. (Optional) If the target table has an index, the index information is incrementally updated during the import, affecting data import performance. You are advised to delete the index from the target table before the import. You can create index again after the import is complete.
  3. Import data.

    1
    INSERT INTO [Target table name] SELECT * FROM [Foreign table name]
    +
    + +
    +
    • If information similar to the following is displayed, the data has been imported. Query the error information table to check whether any data format errors occurred. For details, see Handling Import Errors.
      1
      INSERT 0 20
      +
      + +
      +
    • If data fails to be loaded, rectify the problem by following the instructions provided in Handling Import Errors and try again.
    +

+
+

Example

For example, create a table named product_info.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
DROP TABLE IF EXISTS product_info;
+CREATE TABLE product_info
+(
+    product_price                integer        not null,
+    product_id                   char(30)       not null,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)                   
+) 
+with (
+orientation = column,
+compression=middle
+) 
+DISTRIBUTE BY HASH (product_id);
+
+ +
+

Run the following statement to import data from the product_info_ext foreign table to the product_info table:

+
1
INSERT INTO product_info SELECT * FROM product_info_ext;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0187.html b/docs/dws/dev/dws_04_0187.html new file mode 100644 index 00000000..97615800 --- /dev/null +++ b/docs/dws/dev/dws_04_0187.html @@ -0,0 +1,141 @@ + + +

Handling Import Errors

+

Scenarios

Handle errors that occurred during data import.

+
+

Querying Error Information

Errors that occur when data is imported are divided into data format errors and non-data format errors.

+
+
  • Data format error

    When creating a foreign table, specify LOG INTO error_table_name. Data format errors occurring during the data import will be written into the specified table. You can run the following SQL statement to query error details:

    +
    1
    SELECT * FROM error_table_name;
    +
    + +
    +
    Table 1 lists the columns of the error_table_name table. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Columns of the error_table_name table

    Column

    +

    Type

    +

    Description

    +

    nodeid

    +

    integer

    +

    ID of the node where an error is reported

    +

    begintime

    +

    timestamp with time zone

    +

    Time when a data format error is reported

    +

    filename

    +

    character varying

    +

    Name of the source data file where an error about data format occurs

    +

    rownum

    +

    bigint

    +

    Number of the row where an error occurs in a source data file

    +

    rawrecord

    +

    text

    +

    Raw record of the data format error in the source data file

    +

    detail

    +

    text

    +

    Error details

    +
    +
    +
    +
+
  • Non-data format error

    A non-data format error leads to the failure of an entire data import task. You can locate and troubleshoot a non-data format error based on the error message displayed during data import.

    +
+

Handling data import errors

Troubleshoot data import errors based on obtained error information and the description in the following table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Handling data import errors

Error Information

+

Cause

+

Solution

+

missing data for column "r_reason_desc"

+
  1. The number of columns in the source data file is less than that in the foreign table.
  2. In a TEXT format source data file, an escape character (for example, \) leads to delimiter or quote mislocation.

    Example: The target table contains three columns as shown in the following command output. The escape character (\) converts the delimiter (|) into the value of the second column, causing loss of the value of the third column.

    +
    BE|Belgium\|1
    +
+
  1. If an error is reported due to missing columns, perform the following operations:
    • Add the r_reason_desc column to the source data file.
    • When creating a foreign table, set the parameter fill_missing_fields to on. In this way, if the last column of a row in the source data file is missing, it is set to NULL and no error will be reported.
    +
  2. Check whether the row where an error occurred contains the escape character (\). If the row contains such a character, you are advised to set the parameter noescaping to true when creating a foreign table, indicating that the escape character (\) and the characters following it are not escaped.
+

extra data after last expected column

+

The number of columns in the source data file is greater than that in the foreign table.

+
  • Delete the unnecessary columns from the source data file.
  • When creating a foreign table, set the parameter ignore_extra_data to on. In this way, if the number of columns in a source data file is greater than that in the foreign table, the extra columns at the end of rows will not be imported.
+

invalid input syntax for type numeric: "a"

+

The data type is incorrect.

+

In the source data file, change the data type of the columns to be imported. If this error information is displayed, change the data type to numeric.

+

null value in column "staff_id" violates not-null constraint

+

The not-null constraint is violated.

+

+

In the source data file, add values to the specified columns. If this error information is displayed, add values to the staff_id column.

+

duplicate key value violates unique constraint "reg_id_pk"

+

The unique constraint is violated.

+
  • Delete the duplicate rows from the source data file.
  • Run the SELECT statement with the DISTINCT keyword to ensure that all imported rows are unique.
    1
    INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons;
    +
    + +
    +
+

value too long for type character varying(16)

+

The column length exceeds the upper limit.

+

In the source data file, change the column length. If this error information is displayed, reduce the column length to no greater than 16 bytes.

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0189.html b/docs/dws/dev/dws_04_0189.html new file mode 100644 index 00000000..99f98da1 --- /dev/null +++ b/docs/dws/dev/dws_04_0189.html @@ -0,0 +1,29 @@ + + +

Using GDS to Import Data from a Remote Server

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0190.html b/docs/dws/dev/dws_04_0190.html new file mode 100644 index 00000000..fce0739f --- /dev/null +++ b/docs/dws/dev/dws_04_0190.html @@ -0,0 +1,86 @@ + + +

Importing Data In Parallel Using GDS

+

INSERT and COPY statements are serially executed to import a small volume of data. To import a large volume of data to GaussDB(DWS), you can use GDS to import data in parallel using a foreign table.

+

In the current GDS version, you can import data to databases from pipe files.

+
  • If the local disk space of the GDS user is insufficient:
    • Data in HDFS can be directly written to a pipe file without occupying extra disk space.
    +
  • If you need to cleanse data before importing data:
    • You can compile a program as needed and write the data to be processed into a pipe file.
    +
    • The current version does not support data import through GDS in SSL mode. Do not use GDS in SSL mode.
    • All pipe files mentioned in this section refer to named pipes on Linux.
    +
    +
+

Overview

You can import data in parallel from the common file system (excluding HDFS) of a server to GaussDB(DWS).

+

Data files to be imported are specified based on the import policy and data formats set in a foreign table. Data is imported in parallel through multiple DNs from source data files to the database, which improves the overall data import performance. Figure 1 shows an example.

+
  • The CN only plans data import tasks and delivers the tasks to DNs. Then the CN is released to process other tasks.
  • In this way, the computing capability and bandwidth of all the DNs are fully leveraged to improve the data import performance.
+
You can pre-process data, such as replacing invalid characters and processing fault tolerance, by configuring parameters in a foreign table.
Figure 1 Importing data in parallel
+
+

The concepts mentioned in the preceding figure are described as follows:

+
  • CN: Coordinator of GaussDB(DWS). After receiving import SQL requests from an application or client, the CN plans import tasks and delivers the tasks to DNs.
  • DN: Datanode of GaussDB(DWS). After receiving the import tasks delivered by the CN, DNs import data from the source data file to the target table in the database using a foreign table.
  • Source data file: a file that stores data to be imported.
  • Data server: a server that stores source data files. For security purposes, it is recommended that the data server and GaussDB(DWS) be on the same intranet.
  • Foreign table: a table that stores information of a source data file, such as location, format, destination location, encoding format, and data delimiter. It is used to associate source data files with the target table.
  • Target table: a table in the database. It can be a row-store table or column-store table. Data in the source data files will be imported to this table.
+
+

Parallel Import Using GDS

  • If a large volume of data is stored on multiple servers, install, configure, and start GDS on each server. Then, data on all the servers can be imported in parallel, as shown in Figure 2.
    Figure 2 Parallel import from multiple data servers
    +

    The number of GDS processes cannot exceed that of DNs. If multiple GDS processes are connected to one DN, some of the processes may become abnormal.

    +
    +
  • If data is stored on one data server and both GaussDB(DWS) and the data server have available I/O resources, you can use GDS for multi-thread concurrent import.

    GDS determines the number of threads based on the number of concurrent import transactions. That is, even if multi-thread import is configured before GDS startup, the import of a single transaction will not be accelerated. By default, an INSERT statement is an import transaction.

    +

    Multi-thread concurrent import enables you to:

    +
    • Fully use resources and improve the concurrent import efficiency when you import multiple tables to the database.
    • Speed up the import of a table with a large volume of data.

      Table data is split into multiple data files, and multi-thread concurrent import is implemented by importing data using multiple foreign tables at the same time. Ensure that a data file can be read only by one foreign table.

      +
    +
+
+

Import Process

Figure 3 Concurrent import process using GDS
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Process description

Process

+

Description

+

Prepare source data.

+

Prepare the source data files to be imported to the database and upload the files to the data server.

+

For details, see Preparing Source Data.

+

Start GDS.

+

Install, configure, and start GDS on the data server.

+

For details, see Installing, Configuring, and Starting GDS.

+

Create a foreign table.

+

A foreign table is used to identify source files. The foreign table stores information of a source data file, such as location, format, destination location, encoding format, and data delimiter.

+

For details, see Creating a GDS Foreign Table.

+

Import data.

+

After creating the foreign table, run the INSERT statement to quickly import data to the target table. For details, see Importing Data.

+

Handle import errors.

+

If errors occur during parallel data import, handle errors based on the error information to ensure data integrity.

+

For details, see Handling Import Errors.

+

Improve query efficiency.

+

After data is imported, run the ANALYZE statement to generate table statistics. The ANALYZE statement stores the statistics in the PG_STATISTIC system catalog. When you run the plan generator, the statistics help you generate an efficient query execution plan.

+

Stop GDS.

+

After data is imported, log in to each data server and stop GDS.

+

For details, see Stopping GDS.

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0192.html b/docs/dws/dev/dws_04_0192.html new file mode 100644 index 00000000..b0326c2a --- /dev/null +++ b/docs/dws/dev/dws_04_0192.html @@ -0,0 +1,17 @@ + + +

Preparing Source Data

+

Scenario

Generally, the data to be imported has been uploaded to the data server. In this case, you only need to check the communication between the data server and GaussDB(DWS), and record the data storage directory on the data server before the import.

+

If the data has not been uploaded to the data server, perform the following operations to upload it:

+
+

Procedure

  1. Log in to the data server as user root.
  2. Create the directory /input_data.

    mkdir -p /input_data
    +

  3. Upload the source data files to the created directory.

    GDS parallel import supports source data only in CSV or TEXT format.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0193.html b/docs/dws/dev/dws_04_0193.html new file mode 100644 index 00000000..c5375598 --- /dev/null +++ b/docs/dws/dev/dws_04_0193.html @@ -0,0 +1,175 @@ + + +

Installing, Configuring, and Starting GDS

+

Scenario

GaussDB(DWS) uses GDS to allocate the source data for parallel data import. Deploy GDS on the data server.

+

If a large volume of data is stored on multiple data servers, install, configure, and start GDS on each server. Then, data on all the servers can be imported in parallel. The procedure for installing, configuring, and starting GDS is the same on each data server. This section describes how to perform this procedure on one data server.

+
+

Context

  1. The GDS version must match the cluster version. For example, GDS V100R008C00 matches DWS 1.3.X. Otherwise, the import or export may fail, or the import or export process may fail to respond.

    Therefore, use the latest version of GDS. After the database is upgraded, download the latest version of GaussDB(DWS) GDS as instructed in Procedure. When the import or export starts, GaussDB(DWS) checks the GDS versions. If the versions do not match, an error message is displayed and the import or export is terminated.

    +

    To obtain the version number of GDS, run the following command in the GDS decompression directory:

    +
    gds -V
    +

    To view the database version, run the following SQL statement after connecting to the database:

    +
    1
    SELECT version();
    +
    + +
    +
+
+

Procedure

  1. For details about how to import or export data using GDS, see "Tutorial: Using GDS to Import Data > Step 1: Preparing an ECS as the GDS Server" in the Data Warehouse Service User Guide.
  2. Log in as user root to the data server where GDS is to be installed and run the following command to create the directory for storing the GDS package:

    mkdir -p /opt/bin/dws
    +

  3. Upload the GDS package to the created directory.

    Use the SUSE Linux package as an example. Upload the GDS package dws_client_8.1.x_suse_x64.zip to the directory created in the previous step.

    +

  4. (Optional) If SSL is used, upload the SSL certificates to the directory created in 2.
  5. Go to the directory and decompress the package.

    cd /opt/bin/dws
    +unzip dws_client_8.1.x_suse_x64.zip
    +

  6. Create a GDS user and the user group to which the user belongs. This user is used to start GDS and read source data.

    groupadd gdsgrp
    +useradd -g gdsgrp gds_user
    +

  7. Change the owner of the GDS package directory and source data file directory to the GDS user.

    chown -R gds_user:gdsgrp /opt/bin/dws/gds
    +chown -R gds_user:gdsgrp /input_data 
    +

  8. Switch to user gds_user.

    su - gds_user
    +

    If the current cluster version is 8.0.x or earlier, skip 9 and go to 10.

    +

    If the current cluster version is 8.1.x, go to the next step.

    +

  9. Execute the script on which the environment depends (applicable only to 8.1.x).

    cd /opt/bin/dws/gds/bin
    +source gds_env
    +

  10. Start GDS.

    GDS is green software and can be started after being decompressed. There are two ways to start GDS. One is to run the gds command to configure startup parameters. The other is to write the startup parameters into the gds.conf configuration file and run the gds_ctl.py command to start GDS.

    +
    The first method is recommended when you do not need to import data again. The second method is recommended when you need to import data regularly.
    • Method 1: Run the gds command to start GDS.
      • If data is transmitted in non-SSL mode, run the following command to start GDS:
        gds -d dir -p ip:port -H address_string -l log_file -D -t worker_num
        +

        Example:

        +
        +/opt/bin/dws/gds/bin/gds -d /input_data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 -l /opt/bin/dws/gds/gds_log.txt -D -t 2
        +
      • If data is transmitted in SSL mode, run the following command to start GDS:
        gds -d dir -p ip:port -H address_string -l log_file -D 
        +-t worker_num --enable-ssl --ssl-dir Cert_file
        +

        Example:

        +
        Run the following command to upload the SSL certificate mentioned in 4 to /opt/bin:
        +/opt/bin/dws/gds/bin/gds -d /input_data/ -p 192.168.0.90:5000 -H 10.10.0.1/24 -l /opt/bin/dws/gds/gds_log.txt -D --enable-ssl --ssl-dir /opt/bin/
        +
        +
      +

      Replace the information in italic as required.

      +
      • -d dir: directory for storing data files that contain data to be imported. This tutorial uses /input_data/ as an example.
      • -p ip:port: listening IP address and port for GDS. The default value is 127.0.0.1. Replace it with the IP address of a 10GE network that can communicate with GaussDB(DWS). The port number ranges from 1024 to 65535. The default port is 8098. This tutorial uses 192.168.0.90:5000 as an example.
      • -H address_string: specifies the hosts that are allowed to connect to and use GDS. The value must be in CIDR format. Configure this parameter to enable a GaussDB(DWS) cluster to access GDS for data import. Ensure that the network segment covers all hosts in a GaussDB(DWS) cluster.
      • -l log_file: GDS log directory and log file name. This tutorial uses /opt/bin/dws/gds/gds_log.txt as an example.
      • -D: GDS in daemon mode. This parameter is used only in Linux.
      • -t worker_num: number of concurrent GDS threads. If the data server and GaussDB(DWS) have available I/O resources, you can increase the number of concurrent GDS threads.

        GDS determines the number of threads based on the number of concurrent import transactions. Even if multi-thread import is configured before GDS startup, the import of a single transaction will not be accelerated. By default, an INSERT statement is an import transaction.

        +
      • --enable-ssl: enables SSL for data transmission.
      • --ssl-dir Cert_file: SSL certificate directory. Set this parameter to the certificate directory in 4.
      • For details about GDS parameters, see "GDS - Parallel Data Loader > gds" in the Data Warehouse Service (DWS) Tool Guide.
      +
    • Method 2: Write the startup parameters into the gds.conf configuration file and run the gds_ctl.py command to start GDS.
      1. Run the following command to go to the config directory of the GDS package and modify the gds.conf configuration file. For details about the parameters in the gds.conf configuration file, see Table 1.
        vim /opt/bin/dws/gds/config/gds.conf
        +

        Example:

        +

        The gds.conf configuration file contains the following information:

        +
        <?xml version="1.0"?>
        +<config>
        +<gds name="gds1" ip="192.168.0.90" port="5000" data_dir="/input_data/" err_dir="/err" data_seg="100MB" err_seg="100MB" log_file="/log/gds_log.txt" host="10.10.0.1/24" daemon='true' recursive="true" parallel="32"></gds>
        +</config>
        +

        Information in the configuration file is described as follows:

        +
        • The data server IP address is 192.168.0.90 and the GDS listening port is 5000.
        • Data files are stored in the /input_data/ directory.
        • Error log files are stored in the /err directory. The directory must be created by a user who has the GDS read and write permissions.
        • The size of a single data file is 100 MB.
        • The size of a single error log file is 100 MB.
        • Logs are stored in the /log/gds_log.txt file. The directory must be created by a user who has the GDS read and write permissions.
        • Only nodes with the IP address 10.10.0.* can be connected.
        • The GDS process is running in daemon mode.
        • Recursive data file directories are used.
        • The number of concurrent import threads is 2.
        +
      2. Start GDS and check whether it has been started.
        python3 gds_ctl.py start
        +

        Example:

        +
        cd /opt/bin/dws/gds/bin
        +python3 gds_ctl.py start
        +Start GDS gds1                  [OK]
        +gds [options]:
        + -d dir            Set data directory.
        + -p port           Set GDS listening port.
        +    ip:port        Set GDS listening ip address and port.
        + -l log_file       Set log file.
        + -H secure_ip_range
        +                   Set secure IP checklist in CIDR notation. Required for GDS to start.
        + -e dir            Set error log directory.
        + -E size           Set size of per error log segment.(0 < size < 1TB)
        + -S size           Set size of data segment.(1MB < size < 100TB)
        + -t worker_num     Set number of worker thread in multi-thread mode, the upper limit is 32. If without setting, the default value is 1.
        + -s status_file    Enable GDS status report.
        + -D                Run the GDS as a daemon process.
        + -r                Read the working directory recursively.
        + -h                Display usage.
        +
      +
    +
    +

+
+

gds.conf Parameter Description

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 gds.conf configuration description

Attribute

+

Description

+

Value Range

+

name

+

Identifier

+

-

+

ip

+

Listening IP address

+

The IP address must be valid.

+

Default value: 127.0.0.1

+

port

+

Listening port

+

Value range: 1024 to 65535 (integer)

+

Default value: 8098

+

data_dir

+

Data file directory

+

-

+

err_dir

+

Error log file directory

+

Default value: data file directory

+

log_file

+

Log file Path

+

-

+

host

+

Host IP address allowed to be connected to GDS (The value must in CIDR format and this parameter is available for the Linux OS only.)

+

-

+

recursive

+

Whether the data file directories are recursive

+

Value range:

+
  • true: recursive
  • false: not recursive
+

Default value: false

+

daemon

+

Whether the process is running in daemon mode

+

Value range:

+
  • true: The process is running in daemon mode.
  • false: The process is not running in daemon mode.
+

Default value: false

+

parallel

+

Number of concurrent data import threads

+

Value range: 0 to 32 (integer)

+

Default value: 1

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0194.html b/docs/dws/dev/dws_04_0194.html new file mode 100644 index 00000000..6738a948 --- /dev/null +++ b/docs/dws/dev/dws_04_0194.html @@ -0,0 +1,114 @@ + + +

Creating a GDS Foreign Table

+

The source data information and GDS access information are configured in a foreign table. Then, GaussDB(DWS) can import data from a data server to a database table based on the configuration in the foreign table.

+

Procedure

  1. Collect source data information and GDS access information.

    You need to collect the following source data information:

    +
    • format: format of the data to be imported. Only data in CSV, TEXT, or FIXED format can be imported using GDS in parallel.
    • header: whether a source data file has a header. This parameter is set only for files in CSV or FIXED format.
    • delimiter: delimiter in the source data file. For example, it can be a comma (,).
    • encoding: encoding format of the data source file. Assume that the encoding format is UTF-8.
    • eol: line break character in the data file. It can be a default character, such as 0x0D0A or 0X0A, or a customized line break character, such as a string: !@#. This parameter can be set only for TEXT import.
    • For details about more source data information configured in a foreign table, see data format parameters.
    +

    You need to collect the following GDS access information:

    +

    location: GDS URL. GDS information in Installing, Configuring, and Starting GDS is used as an example. In non-SSL mode, location is set to gsfs://192.168.0.90:5000//input_data/. In SSL mode, location is set to gsfss://192.168.0.90:5000//input_data/. 192.168.0.90:5000 indicates the IP address and port number of GDS. input_data indicates the path of data source files managed by GDS. Replace the values as required.

    +

  2. Design an error tolerance mechanism for data import.

    GaussDB(DWS) supports the following error tolerance in data import:
    • fill_missing_fields: This parameter specifies whether to report an error when the last column in a row of the source data file is empty, or to fill the column with NULL.
    • ignore_extra_data: This parameter specifies whether to report an error when the number of columns in the source data file is greater than that specified in the foreign table, or to ignore the extra columns.
    • per node reject_limit: This parameter specifies the number of data format errors allowed on each DN. If the number of errors recorded in the error table on a DN exceeds the specified value, the import will fail and an error message will be reported. You can also set it to unlimited.
    • compatible_illegal_chars: This parameter specifies whether to report an error when an illegal character is encountered, or to convert it and proceed with the import.

      The following describes the rules for converting an illegal character:

      +
      • \0 is converted to a space.
      • Other illegal characters are converted to question marks.
      • If NULL, DELIMITER, QUOTE, or ESCAPE is also set to a space or question mark, an error message such as "illegal chars conversion may confuse COPY escape 0x20" is displayed, prompting you to modify parameter settings that may cause import errors.
      +
    • error_table_name: This parameter specifies the name of the table that records data format errors. After the parallel import, you can query this table for error details.
    • remote log 'name': This parameter specifies whether to store data format errors in files on the GDS server. name is the prefix of the error data file.
    • For details about more error tolerance parameters, see error tolerance parameters.
    +
    +

  3. After connecting to the database using gsql or Data Studio, create a GDS foreign table based on the collected and design information.

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    CREATE FOREIGN TABLE foreign_tpcds_reasons
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +)
    + SERVER gsmpp_server
    + OPTIONS 
    +(
    +LOCATION 'gsfs://192.168.0.90:5000/input_data | gsfs://192.168.0.91:5000/input_data', 
    +FORMAT 'CSV' ,
    +DELIMITER ',',
    +ENCODING 'utf8',
    +HEADER 'false',
    +FILL_MISSING_FIELDS 'true',
    +IGNORE_EXTRA_DATA 'true'
    +)
    +LOG INTO product_info_err 
    +PER NODE REJECT LIMIT 'unlimited';
    +
    + +
    +

    The following describes information in the preceding command:

    +
    • The columns specified in the foreign table must be the same as those in the target table.
    • Retain the value gsmpp_server for SERVER.
    • Set location based on the GDS access information collected in 1. If SSL is used, replace gsfs with gsfss.
    • Set FORMAT, DELIMITER, ENCODING, and HEADER based on the source data information collected in 1.
    • Set FILL_MISSING_FIELDS, IGNORE_EXTRA_DATA, LOG INTO, and PER NODE REJECT LIMIT based on the error tolerance mechanism designed in 2. LOG INTO specifies the name of the error table.
    +

    For details about the CREATE FOREIGN TABLE syntax, see CREATE FOREIGN TABLE (for GDS Import and Export).

    +

+
+

Example

For more examples, see Example of Importing Data Using GDS.

+
  • Example 1: Create a GDS foreign table named foreign_tpcds_reasons. The data format is CSV.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE FOREIGN TABLE foreign_tpcds_reasons
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +)
    + SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL '');
    +
    + +
    +
  • Example 2: Create a GDS foreign table named foreign_tpcds_reasons_SSL. SSL is used and the data format is CSV.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE FOREIGN TABLE foreign_tpcds_reasons_SSL
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +)
    + SERVER gsmpp_server OPTIONS (location 'gsfss://192.168.0.90:5000/* | gsfss://192.168.0.91:5000/*', FORMAT 'CSV',MODE 'Normal', ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL '');
    +
    + +
    +
  • Example 3: Create a GDS foreign table named foreign_tpcds_reasons. The data format is TEXT.
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE foreign_tpcds_reasons
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', FORMAT 'TEXT', delimiter E'\x08',  null '',reject_limit '2',EOL '0x0D') WITH err_foreign_tpcds_reasons;
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0195.html b/docs/dws/dev/dws_04_0195.html new file mode 100644 index 00000000..60dad5d5 --- /dev/null +++ b/docs/dws/dev/dws_04_0195.html @@ -0,0 +1,51 @@ + + +

Importing Data

+

This section describes how to create tables in GaussDB(DWS) and import data to the tables.

+

Before importing all the data from a table containing over 10 million records, you are advised to import some of the data, and check whether there is data skew and whether the distribution keys need to be changed. Troubleshoot the data skew if any. It is costly to address data skew and change the distribution keys after a large amount of data has been imported.

+

Prerequisites

The GDS server can communicate with GaussDB(DWS).

+
  • You need to create an ECS as the GDS server.
  • The created ECS and GaussDB(DWS) must belong to the same region, VPC, and subnet.
+
+

Procedure

  1. Create a table in GaussDB(DWS) to store imported data. For details, see CREATE TABLE.
  2. Import data.

    1
    INSERT INTO [Target table name] SELECT * FROM [Foreign table name]
    +
    + +
    +
    • If information similar to the following is displayed, the data has been imported. Query the error information table to check whether any data format errors occurred. For details, see Handling Import Errors.
      INSERT 0 9
      +
    • If data fails to be loaded, troubleshoot the problem by following the instructions provided in Handling Import Errors and try again.
    +
    • If a data loading error occurs, the entire data import task will fail.
    • Compile a batch-processing task script to concurrently import data. The degree of parallelism (DOP) depends on the server resource usage. You can test-import several tables, monitor resource utilization, and increase or reduce concurrency accordingly. Common resource monitoring commands include top for monitoring memory and CPU usage, iostat for monitoring I/O usage, and sar for monitoring networks. For details about application cases, see .
    • If possible, more GDS servers can significantly improve the data import efficiency. For details about application cases, see Importing Data in Parallel from Multiple Data Servers.
    • In a scenario where many GDS servers import data concurrently, you can increase the TCP Keepalive interval for connections between GDS servers and DNs to ensure connection stability. (The recommended interval is 5 minutes.) TCP Keepalive settings of the cluster affect its fault detection response time.
    +
    +

+
+

Example:

  1. Create a target table named reasons.

    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE TABLE reasons
    +(
    +  r_reason_sk   integer  not null,
    +  r_reason_id   char(16) not null,   
    +  r_reason_desc char(100)
    +)
    +DISTRIBUTE BY HASH (r_reason_sk);     
    +
    + +
    +

  2. Import data from source data files through the foreign_tpcds_reasons foreign table to the reasons table.

    1
    INSERT INTO reasons SELECT * FROM foreign_tpcds_reasons ;
    +
    + +
    +

  3. You can create indexes again after the import is complete.

    1
    CREATE INDEX reasons_idx ON reasons(r_reasons_id);
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0196.html b/docs/dws/dev/dws_04_0196.html new file mode 100644 index 00000000..141aeb5e --- /dev/null +++ b/docs/dws/dev/dws_04_0196.html @@ -0,0 +1,142 @@ + + +

Handling Import Errors

+

Scenarios

Handle errors that occurred during data import.

+
+

Querying Error Information

Errors that occur when data is imported are divided into data format errors and non-data format errors.

+
+
  • Data format error

    When creating a foreign table, specify LOG INTO error_table_name. Data format errors occurring during the data import will be written into the specified table. You can run the following SQL statement to query error details:

    +
    1
    SELECT * FROM error_table_name;
    +
    + +
    +
    Table 1 lists the columns of the error_table_name table. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Columns in the error_table_name table

    Column

    +

    Type

    +

    Description

    +

    nodeid

    +

    integer

    +

    ID of the node where an error is reported

    +

    begintime

    +

    timestamp with time zone

    +

    Time when a data format error is reported

    +

    filename

    +

    character varying

    +

    Name of the source data file where a data format error occurs

    +

    If you use GDS for importing data, the error information includes the IP address and port number of the GDS server.

    +

    rownum

    +

    bigint

    +

    Number of the row where an error occurs in a source data file

    +

    rawrecord

    +

    text

    +

    Raw record of the data format error in the source data file

    +

    detail

    +

    text

    +

    Error details

    +
    +
    +
    +
+
  • Non-data format error

    A non-data format error leads to the failure of an entire data import task. You can locate and troubleshoot a non-data format error based on the error message displayed during data import.

    +
+

Handling data import errors

Troubleshoot data import errors based on obtained error information and the description in the following table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Handling data import errors

Error Information

+

Cause

+

Solution

+

missing data for column "r_reason_desc"

+
  1. The number of columns in the source data file is less than that in the foreign table.
  2. In a TEXT format source data file, an escape character (for example, \) leads to delimiter or quote mislocation.

    Example: The target table contains three columns as shown in the following command output. The escape character (\) converts the delimiter (|) into the value of the second column, causing loss of the value of the third column.

    +
    BE|Belgium\|1
    +
+
  1. If an error is reported due to missing columns, perform the following operations:
    • Add the r_reason_desc column to the source data file.
    • When creating a foreign table, set the parameter fill_missing_fields to on. In this way, if the last column of a row in the source data file is missing, it is set to NULL and no error will be reported.
    +
  2. Check whether the row where an error occurred contains the escape character (\). If the row contains such a character, you are advised to set the parameter noescaping to true when creating a foreign table, indicating that the escape character (\) and the characters following it are not escaped.
+

extra data after last expected column

+

The number of columns in the source data file is greater than that in the foreign table.

+
  • Delete the unnecessary columns from the source data file.
  • When creating a foreign table, set the parameter ignore_extra_data to on. In this way, if the number of columns in a source data file is greater than that in the foreign table, the extra columns at the end of rows will not be imported.
+

invalid input syntax for type numeric: "a"

+

The data type is incorrect.

+

In the source data file, change the data type of the columns to be imported. If this error information is displayed, change the data type to numeric.

+

null value in column "staff_id" violates not-null constraint

+

The not-null constraint is violated.

+

+

In the source data file, add values to the specified columns. If this error information is displayed, add values to the staff_id column.

+

duplicate key value violates unique constraint "reg_id_pk"

+

The unique constraint is violated.

+
  • Delete the duplicate rows from the source data file.
  • Run the SELECT statement with the DISTINCT keyword to ensure that all imported rows are unique.
    1
    INSERT INTO reasons SELECT DISTINCT * FROM foreign_tpcds_reasons;
    +
    + +
    +
+

value too long for type character varying(16)

+

The column length exceeds the upper limit.

+

In the source data file, change the column length. If this error information is displayed, reduce the column length to no greater than 16 bytes (VARCHAR2).

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0197.html b/docs/dws/dev/dws_04_0197.html new file mode 100644 index 00000000..c59962f8 --- /dev/null +++ b/docs/dws/dev/dws_04_0197.html @@ -0,0 +1,22 @@ + + +

Stopping GDS

+

Scenarios

Stop GDS after data is imported successfully.

+
+

Procedure

  1. Log in as user gds_user to the data server where GDS is installed.
  2. Select the mode of stopping GDS based on the mode of starting it.

    • If GDS is started using the gds command, perform the following operations to stop GDS:
      1. Query the GDS process ID:
        ps -ef|grep gds
        +

        For example, the GDS process ID is 128954.

        +
        ps -ef|grep gds
        +gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /input_data/ -p 192.168.0.90:5000 -l /log/gds_log.txt -D
        +gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
        +
      2. Run the kill command to stop GDS. 128954 in the command is the GDS process ID.
        kill -9 128954
        +
      +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0198.html b/docs/dws/dev/dws_04_0198.html new file mode 100644 index 00000000..1873edb6 --- /dev/null +++ b/docs/dws/dev/dws_04_0198.html @@ -0,0 +1,254 @@ + + +

Example of Importing Data Using GDS

+

Importing Data in Parallel from Multiple Data Servers

The data servers and the cluster reside on the same intranet. The IP addresses are 192.168.0.90 and 192.168.0.91. Source data files are in CSV format.

+
  1. Create the target table tpcds.reasons.
    1
    +2
    +3
    +4
    +5
    +6
    CREATE TABLE tpcds.reasons
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +);
    +
    + +
    +
  2. Log in to each GDS data server as user root and create the /input_data directory for storing data files on the servers. The following takes the data server whose IP address is 192.168.0.90 as an example. Operations on the other server are the same.
    mkdir -p /input_data
    +
  3. (Optional) Create a user and the user group it belongs to. The user is used to start GDS. If the user and user group exist, skip this step.
    groupadd gdsgrp
    +useradd -g gdsgrp gds_user
    +
  4. Evenly distribute source data files to the /input_data directories on the data servers.
  5. Change the owners of source data files and the /input_data directory on each data server to gds_user. The data server whose IP address is 192.168.0.90 is used as an example.
    chown -R gds_user:gdsgrp /input_data 
    +
  6. Log in to each data server as user gds_user and start GDS.

    The GDS installation path is /opt/bin/dws/gds. Source data files are stored in /input_data/. The IP addresses of the data servers are 192.168.0.90 and 192.168.0.91. The GDS listening port is 5000. GDS runs in daemon mode.

    +
    Start GDS on the data server whose IP address is 192.168.0.90.
    /opt/bin/dws/gds/bin/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D
    +
    +

    Start GDS on the data server whose IP address is 192.168.0.91.

    +
    /opt/bin/dws/gds/bin/gds -d /input_data -p 192.168.0.91:5000 -H 10.10.0.1/24  -D
    +
  7. Create the foreign table tpcds.foreign_tpcds_reasons for receiving data from the data server.

    Data export mode settings are as follows:

    +
    • Set the import mode to Normal.
    • When GDS is started, the source data file directory is /input_data and the GDS listening port is 5000. Therefore, set location to gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*.
    +

    Information about the data format is configured based on data format parameters specified during data export. The parameter configurations are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x08'.
    • quote is set to E'\x1b'.
    • null is set to an empty string without quotation marks.
    • escape defaults to the value of quote.
    • header is set to false, indicating that the first row is identified as a data row in an imported file.
    +

    Configure import error tolerance parameters as follows:

    +
    • Set PER NODE REJECT LIMIT (number of allowed data format errors) to unlimited. In this case, all the data format errors detected during data import will be tolerated.
    • Set LOG INTO to err_tpcds_reasons. The data format errors detected during data import will be recorded in the err_tpcds_reasons table.
    +

    Based on the above settings, the foreign table is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +)
    +SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '', fill_missing_fields 'false') LOG INTO err_tpcds_reasons PER NODE REJECT LIMIT 'unlimited';
    +
    + +
    +
  8. Import data through the foreign table tpcds.foreign_tpcds_reasons to the target table tpcds.reasons.
    1
    INSERT INTO tpcds.reasons SELECT * FROM tpcds.foreign_tpcds_reasons;
    +
    + +
    +
  9. Query data import errors in the err_tpcds_reasons table and rectify the errors (if any). For details, see Handling Import Errors.
    1
    SELECT * FROM err_tpcds_reasons;
    +
    + +
    +
  10. After data import is complete, log in to each data server as user gds_user and stop GDS.
    The data server whose IP address is 192.168.0.90 is used as an example. The GDS process ID is 128954.
    ps -ef|grep gds
    +gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D
    +gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    +kill -9 128954
    +
    +
+
+

Importing Data Using Multiple Threads

The data servers and the cluster reside on the same intranet. The server IP address is 192.168.0.90. Source data files are in CSV format. Data will be imported to two tables using multiple threads in Normal mode.

+
  1. In the database, create the target tables tpcds.reasons1 and tpcds.reasons2.
    1
    +2
    +3
    +4
    +5
    +6
    CREATE TABLE tpcds.reasons1
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +) ;
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE TABLE tpcds.reasons2
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +) ;
    +
    + +
    +
  2. Log in to the GDS data server as user root, and then create the data file directory /input_data and its sub-directories /input_data/import1/ and /input_data/import2/.
    mkdir -p /input_data
    +
  3. Store the source data files of the target table tpcds.reasons1 in /input_data/import1/ and the source data files of the target table tpcds.reasons2 in /input_data/import2/.
  4. (Optional) Create a user and the user group it belongs to. The user is used to start GDS. If the user and user group already exist, skip this step.
    groupadd gdsgrp
    +useradd -g gdsgrp gds_user
    +
  5. Change the owners of source data files and the /input_data directory on the data server to gds_user.
    chown -R gds_user:gdsgrp /input_data 
    +
  6. Log in to the data server as user gds_user and start GDS.
    The GDS installation path is /gds. Source data files are stored in /input_data/. The IP address of the data server is 192.168.0.90. The GDS listening port is 5000. GDS runs in daemon mode. The degree of parallelism is 2. A recursive directory is specified.
    /gds/gds -d /input_data -p 192.168.0.90:5000 -H 10.10.0.1/24  -D -t 2 -r
    +
    +
  7. In the database, create the foreign tables tpcds.foreign_tpcds_reasons1 and tpcds.foreign_tpcds_reasons2 for the source data.

    The foreign table tpcds.foreign_tpcds_reasons1 is used as an example to describe how to configure parameters in a foreign table.

    +

    Data export mode settings are as follows:

    +
    • Set the import mode to Normal.
    • When GDS is started, the configured source data file directory is /input_data and the GDS listening port is 5000. However, source data files are actually stored in /input_data/import1/. Therefore, set location to gsfs://192.168.0.90:5000/import1/*.
    +

    Information about the data format is configured based on data format parameters specified during data export. The parameter configurations are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x08'.
    • quote is set to E'\x1b'.
    • null is set to an empty string without quotation marks.
    • escape defaults to the value of quote.
    • header is set to false, indicating that the first row is identified as a data row in an imported file.
    +

    Configure import error tolerance parameters as follows:

    +
    • Set PER NODE REJECT LIMIT (number of allowed data format errors) to unlimited. In this case, all the data format errors detected during data import will be tolerated.
    • Set LOG INTO to err_tpcds_reasons1. The data format errors detected during data import will be recorded in the err_tpcds_reasons1 table.
    • If the last column of a source data file is missing, the fill_missing_fields parameter is automatically set to NULL.
    +

    Based on the preceding settings, the foreign table tpcds.foreign_tpcds_reasons1 is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons1
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import1/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons1 PER NODE REJECT LIMIT 'unlimited';
    +
    + +
    +

    Based on the preceding settings, the foreign table tpcds.foreign_tpcds_reasons2 is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE tpcds.foreign_tpcds_reasons2
    +(
    +  r_reason_sk integer not null,
    +  r_reason_id char(16) not null,
    +  r_reason_desc char(100)
    +) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/import2/*', format 'CSV',mode 'Normal', encoding 'utf8', delimiter E'\x08', quote E'\x1b', null '',fill_missing_fields 'on')LOG INTO err_tpcds_reasons2 PER NODE REJECT LIMIT 'unlimited';
    +
    + +
    +
  8. Import data through the foreign table tpcds.foreign_tpcds_reasons1 to tpcds.reasons1 and through tpcds.foreign_tpcds_reasons2 to tpcds.reasons2.
    1
    INSERT INTO tpcds.reasons1 SELECT * FROM tpcds.foreign_tpcds_reasons1;
    +
    + +
    +
    1
    INSERT INTO tpcds.reasons2 SELECT * FROM tpcds.foreign_tpcds_reasons2;
    +
    + +
    +
  9. Query data import errors in the err_tpcds_reasons1 and err_tpcds_reasons2 tables and rectify the errors (if any). For details, see Handling Import Errors.
    1
    +2
    SELECT * FROM err_tpcds_reasons1;
    +SELECT * FROM err_tpcds_reasons2;
    +
    + +
    +
  10. After data import is complete, log in to the data server as user gds_user and stop GDS.
    The GDS process ID is 128954.
    ps -ef|grep gds
    +gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /input_data -p 192.168.0.90:5000 -D -t 2 -r
    +gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    +kill -9 128954
    +
    +
+
+

Importing Data Through a Pipe File

  1. Start GDS.

    gds -d /***/gds_data/ -D -p 192.168.0.1:7789 -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +

    If you need to set the timeout interval of a pipe, use the --pipe-timeout parameter.

    +

  2. Import data.

    1. Log in to the database and create an internal table.
      CREATE TABLE test_pipe_1( id integer not null, sex text not null, name  text );
      +
    2. Create a read-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe_tr( like test_pipe ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.1:7789/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe',auto_create_pipe 'false');
      +
    3. Execute the import statement. The statement will be blocked.
      INSERT INTO test_pipe_1 select * from foreign_test_pipe_tr;
      +
    +

  3. Import data through a GDS pipe file.

    1. Log in to the GDS server and go to the GDS data directory.
      cd /***/gds_data/   
      +
    2. Create a pipe. If auto_create_pipe is set to true, skip this step.
      mkfifo foreign_test_pipe.pipe;  
      +

      A pipe will be automatically cleared after an operation is complete. To perform another operation, create a pipe again.

      +
      +
    3. Write data to the pipe.
      cat postgres_public_foreign_test_pipe_tw.txt > foreign_test_pipe.pipe
      +
    4. To read the compressed file to the pipe, run the following command:
      gzip -d < out.gz > foreign_test_pipe.pipe
      +
    5. To read the HDFS file to the pipe, run the following command:
      hdfs dfs -cat - /user/hive/***/test_pipe.txt > foreign_test_pipe.pipe
      +
    +

  4. View the result returned by the import statement.

    INSERT INTO test_pipe_1 select * from foreign_test_pipe_tr;
    +INSERT 0 4
    +SELECT * FROM test_pipe_1;
    +id | sex |      name
    +----+-----+----------------
    +3 | 2   | 11111111111111
    +1 | 2   | 11111111111111
    +2 | 2   | 11111111111111
    +4 | 2   | 11111111111111
    +(4 rows)
    +
    +

+
+

Importing Data Through Multi-Process Pipes

GDS also supports importing data through multi-process pipes. That is, one foreign table corresponds to multiple GDSs.

+

The following takes importing a local file as an example.

+
  1. Start multiple GDSs. If the GDSs have been started, skip this step.

    gds -d /***/gds_data/ -D -p 192.168.0.1:7789 -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +gds -d /***/gds_data_1/ -D -p 192.168.0.1:7790 -l /***/gds_log_1/aa.log -H 0/0 -t 10 -D
    +

    If you need to set the timeout interval of a pipe, use the --pipe-timeout parameter.

    +

  2. Import data.

    1. Log in to the database and create an internal table.
      CREATE TABLE test_pipe( id integer not null, sex text not null, name  text );
      +
    2. Create a read-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe_tr( like test_pipe ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.1:7789/foreign_test_pipe.pipe|gsfs://192.168.0.1:7790/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' , file_type 'pipe', auto_create_pipe 'false');
      +
    3. Execute the import statement. The statement is blocked.
      INSERT INTO test_pipe_1 select * from foreign_test_pipe_tr;
      +
    +

  3. Import data through a GDS pipe file.

    1. Log in to GDS and go to each GDS data directory.
      cd /***/gds_data/ 
      +cd /***/gds_data_1/
      +
    2. Create a pipe. If auto_create_pipe is set to true, skip this step.
      mkfifo foreign_test_pipe.pipe;  
      +
    3. Read each pipe and write the new file to the pipes.
      cat postgres_public_foreign_test_pipe_tw.txt > foreign_test_pipe.pipe
      +
    +

  4. View the result returned by the import statement.

    INSERT INTO test_pipe_1 select * from foreign_test_pipe_tr;
    +INSERT 0 4
    +SELECT * FROM test_pipe_1;
    +id | sex |      name
    +----+-----+----------------
    +3 | 2   | 11111111111111
    +1 | 2   | 11111111111111
    +2 | 2   | 11111111111111
    +4 | 2   | 11111111111111
    +(4 rows)
    +

+
+

Direct Data Import Between Clusters

  1. Start GDS. (If the process has been started, skip this step.)

    gds -d /***/gds_data/ -D -p GDS_IP:GDS_PORT -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +

    If you need to set the timeout interval of a pipe, use the --pipe-timeout parameter.

    +

  2. Export data from the source database.

    1. Log in to the target database, create an internal table, and write data to the table.
      CREATE TABLE test_pipe( id integer not null, sex text not null, name  text );
      +INSERT INTO test_pipe values(1,2,'11111111111111');
      +INSERT INTO test_pipe values(2,2,'11111111111111');
      +INSERT INTO test_pipe values(3,2,'11111111111111');
      +INSERT INTO test_pipe values(4,2,'11111111111111');
      +INSERT INTO test_pipe values(5,2,'11111111111111');
      +
    2. Create a write-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe( id integer not null, age text not null, name  text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' ,file_type 'pipe') WRITE ONLY;
      +
    3. Execute the import statement. The statement will be blocked.
      INSERT INTO foreign_test_pipe SELECT * FROM test_pipe;
      +
    +

  3. Import data to the target cluster.

    1. Create an internal table.
      CREATE TABLE test_pipe (id integer not null, sex text not null, name text);
      +
    2. Create a read-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe(like test_pipe) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/', FORMAT 'text', DELIMITER ',', NULL '', EOL '0x0a' , file_type 'pipe', auto_create_pipe 'false');
      +
    3. Run the following command to import data to the table:
      INSERT INTO test_pipe SELECT * FROM foreign_test_pipe;
      +
    +

  4. View the result returned by the import statement from the target cluster.

    SELECT * FROM test_pipe;
    + id | sex |      name
    +----+-----+----------------
    +  3 | 2   | 11111111111111
    +  6 | 2   | 11111111111111
    +  7 | 2   | 11111111111111
    +  1 | 2   | 11111111111111
    +  2 | 2   | 11111111111111
    +  4 | 2   | 11111111111111
    +  5 | 2   | 11111111111111
    +  8 | 2   | 11111111111111
    +  9 | 2   | 11111111111111
    +(9 rows)
    +

+

By default, the pipeline file exported from or imported to GDS is named in the format of Database name_Schema name_Foreign table name .pipe. Therefore, the database name and schema name of the target cluster must be the same as those of the source cluster. If the database or schema is inconsistent, you can specify the same pipe file in the URL of the location.

+

For example:

+
  • Pipe name specified by a write-only foreign table
    CREATE FOREIGN TABLE foreign_test_pipe(id integer not null, age text not null, name  text) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe') WRITE ONLY;
    +
  • Pipe name specified by a read-only foreign table
    CREATE FOREIGN TABLE foreign_test_pipe(like test_pipe) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://GDS_IP:GDS_PORT/foreign_test_pipe.pipe', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe',auto_create_pipe 'false');
    +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0203.html b/docs/dws/dev/dws_04_0203.html new file mode 100644 index 00000000..06886b73 --- /dev/null +++ b/docs/dws/dev/dws_04_0203.html @@ -0,0 +1,21 @@ + + +

Running the COPY FROM STDIN Statement to Import Data

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0204.html b/docs/dws/dev/dws_04_0204.html new file mode 100644 index 00000000..37b2a6ea --- /dev/null +++ b/docs/dws/dev/dws_04_0204.html @@ -0,0 +1,13 @@ + + +

Data Import Using COPY FROM STDIN

+

This method is applicable to low-concurrency scenarios where a small volume of data is to be imported.

+

Use either of the following methods to write data to GaussDB(DWS) using the COPY FROM STDIN statement:

+
  • Write data into GaussDB(DWS) by typing.
  • Import data from a file or database to GaussDB(DWS) through the CopyManager interface driven by JDBC. You can use any parameters in the COPY syntax.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0205.html b/docs/dws/dev/dws_04_0205.html new file mode 100644 index 00000000..90e2fa9e --- /dev/null +++ b/docs/dws/dev/dws_04_0205.html @@ -0,0 +1,105 @@ + + +

Introduction to the CopyManager Class

+

CopyManager is an API interface class provided by the JDBC driver in GaussDB(DWS). It is used to import data to GaussDB(DWS) in batches.

+

Inheritance Relationship of CopyManager

The CopyManager class is in the org.postgresql.copy package class and is inherited from the java.lang.Object class. The declaration of the class is as follows:

+
public class CopyManager
+extends Object
+
+

Constructor Method

public CopyManager(BaseConnection connection)

+

throws SQLException

+
+

Basic Methods

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Basic methods of CopyManager

Return Value

+

Method

+

Description

+

Throws

+

CopyIn

+

copyIn(String sql)

+

-

+

SQLException

+

long

+

copyIn(String sql, InputStream from)

+

Uses COPY FROM STDIN to quickly import data to tables in a database from InputStream.

+

SQLException,IOException

+

long

+

copyIn(String sql, InputStream from, int bufferSize)

+

Uses COPY FROM STDIN to quickly import data to tables in a database from InputStream.

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from)

+

Uses COPY FROM STDIN to quickly import data to tables in a database from Reader.

+

SQLException,IOException

+

long

+

copyIn(String sql, Reader from, int bufferSize)

+

Uses COPY FROM STDIN to quickly import data to tables in a database from Reader.

+

SQLException,IOException

+

CopyOut

+

copyOut(String sql)

+

-

+

SQLException

+

long

+

copyOut(String sql, OutputStream to)

+

Sends the result set of COPY TO STDOUT from a database to the OutputStream class.

+

SQLException,IOException

+

long

+

copyOut(String sql, Writer to)

+

Sends the result set of COPY TO STDOUT from a database to the Writer class.

+

SQLException,IOException

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0206.html b/docs/dws/dev/dws_04_0206.html new file mode 100644 index 00000000..440d5235 --- /dev/null +++ b/docs/dws/dev/dws_04_0206.html @@ -0,0 +1,222 @@ + + +

Example: Importing and Exporting Data Through Local Files

+

When the JAVA language is used for secondary development based on GaussDB(DWS), you can use the CopyManager interface to export data from the database to a local file or import a local file to the database by streaming. The file can be in CSV or TEXT format.

+

The sample program is as follows. Load the GaussDB(DWS) JDBC driver before running it.

+
  1
+  2
+  3
+  4
+  5
+  6
+  7
+  8
+  9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20
+ 21
+ 22
+ 23
+ 24
+ 25
+ 26
+ 27
+ 28
+ 29
+ 30
+ 31
+ 32
+ 33
+ 34
+ 35
+ 36
+ 37
+ 38
+ 39
+ 40
+ 41
+ 42
+ 43
+ 44
+ 45
+ 46
+ 47
+ 48
+ 49
+ 50
+ 51
+ 52
+ 53
+ 54
+ 55
+ 56
+ 57
+ 58
+ 59
+ 60
+ 61
+ 62
+ 63
+ 64
+ 65
+ 66
+ 67
+ 68
+ 69
+ 70
+ 71
+ 72
+ 73
+ 74
+ 75
+ 76
+ 77
+ 78
+ 79
+ 80
+ 81
+ 82
+ 83
+ 84
+ 85
+ 86
+ 87
+ 88
+ 89
+ 90
+ 91
+ 92
+ 93
+ 94
+ 95
+ 96
+ 97
+ 98
+ 99
+100
+101
+102
+103
+104
//gsjdbc4.jar is used as an example.
+import java.sql.Connection; 
+import java.sql.DriverManager; 
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.sql.SQLException; 
+import org.postgresql.copy.CopyManager; 
+import org.postgresql.core.BaseConnection;
+ 
+public class Copy{ 
+
+     public static void main(String[] args) 
+     { 
+      String urls = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //Database URL
+      String username = new String("jack");            //Username
+      String password = new String("********");       // Password
+      String tablename = new String("migration_table"); //Define table information.
+      String tablename1 = new String("migration_table_1"); //Define table information.
+      String driver = "org.postgresql.Driver"; 
+      Connection conn = null; 
+      
+      try { 
+            Class.forName(driver); 
+            conn = DriverManager.getConnection(urls, username, password);         
+          } catch (ClassNotFoundException e) { 
+               e.printStackTrace(System.out); 
+          } catch (SQLException e) { 
+               e.printStackTrace(System.out); 
+          } 
+      
+      //Export the query result of SELECT * FROM migration_table to the local file d:/data.txt.
+      try {
+     copyToFile(conn, "d:/data.txt", "(SELECT * FROM migration_table)");
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   }    
+      //Import data from the d:/data.txt file to the migration_table_1 table.
+      try {
+      copyFromFile(conn, "d:/data.txt", tablename1);
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+         e.printStackTrace();
+ } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+ }  
+
+      //Export the data from the migration_table_1 table to the d:/data1.txt file.
+      try {
+      copyToFile(conn, "d:/data1.txt", tablename1);
+   } catch (SQLException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+   } catch (IOException e) {
+  // TODO Auto-generated catch block
+  e.printStackTrace();
+ }        
+     } 
+
+  public static void copyFromFile(Connection connection, String filePath, String tableName)   
+         throws SQLException, IOException {  
+       
+     FileInputStream fileInputStream = null;  
+   
+     try {  
+         CopyManager copyManager = new CopyManager((BaseConnection)connection);  
+         fileInputStream = new FileInputStream(filePath);  
+         copyManager.copyIn("COPY " + tableName + " FROM STDIN", fileInputStream);  
+     } finally {  
+         if (fileInputStream != null) {  
+             try {  
+                 fileInputStream.close();  
+             } catch (IOException e) {  
+                 e.printStackTrace();  
+             }  
+         }  
+     }  
+ }  
+  
+  public static void copyToFile(Connection connection, String filePath, String tableOrQuery)   
+          throws SQLException, IOException {  
+        
+      FileOutputStream fileOutputStream = null;  
+   
+      try {  
+          CopyManager copyManager = new CopyManager((BaseConnection)connection);  
+          fileOutputStream = new FileOutputStream(filePath);  
+          copyManager.copyOut("COPY " + tableOrQuery + " TO STDOUT", fileOutputStream);  
+      } finally {  
+          if (fileOutputStream != null) {  
+              try {  
+                  fileOutputStream.close();  
+              } catch (IOException e) {  
+                  e.printStackTrace();  
+              }  
+          }  
+      }  
+  }  
+}
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0207.html b/docs/dws/dev/dws_04_0207.html new file mode 100644 index 00000000..f3afb1ee --- /dev/null +++ b/docs/dws/dev/dws_04_0207.html @@ -0,0 +1,183 @@ + + +

Example: Migrating Data from MySQL to GaussDB(DWS)

+

The following example shows how to use CopyManager to migrate data from MySQL to GaussDB(DWS).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
//gsjdbc4.jar is used as an example.
+import java.io.StringReader;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.postgresql.copy.CopyManager;
+import org.postgresql.core.BaseConnection;
+
+public class Migration{
+
+    public static void main(String[] args) {
+        String url = new String("jdbc:postgresql://10.180.155.74:8000/gaussdb"); //Database URL
+        String user = new String("jack");            //Database username
+        String pass = new String("********");             //Database password
+        String tablename = new String("migration_table"); //Define table information.
+        String delimiter = new String("|");              //Define a delimiter.
+        String encoding = new String("UTF8");            //Define a character set.
+        String driver = "org.postgresql.Driver";
+        StringBuffer buffer = new StringBuffer();       //Define the buffer to store formatted data.
+
+        try {
+            //Obtain the query result set of the source database.
+            ResultSet rs = getDataSet();
+
+            //Traverse the result set and obtain records row by row.
+            //The values of columns in each record are separated by the specified delimiter and end with a newline character to form strings.
+            ////Add the strings to the buffer.
+            while (rs.next()) {
+                buffer.append(rs.getString(1) + delimiter
+                        + rs.getString(2) + delimiter
+                        + rs.getString(3) + delimiter
+                        + rs.getString(4)
+                        + "\n");
+            }
+            rs.close();
+
+            try {
+                //Connect to the target database.
+                Class.forName(driver);
+                Connection conn = DriverManager.getConnection(url, user, pass);
+                BaseConnection baseConn = (BaseConnection) conn;
+                baseConn.setAutoCommit(false);
+
+                //Initialize table information.
+                String sql = "Copy " + tablename + " from STDIN DELIMITER " + "'" + delimiter + "'" + " ENCODING " + "'" + encoding + "'";
+
+                //Submit data in the buffer.
+                CopyManager cp = new CopyManager(baseConn);
+                StringReader reader = new StringReader(buffer.toString());
+                cp.copyIn(sql, reader);
+                baseConn.commit();
+                reader.close();
+                baseConn.close();
+            } catch (ClassNotFoundException e) {
+                e.printStackTrace(System.out);
+            } catch (SQLException e) {
+                e.printStackTrace(System.out);
+            }
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    //******************************** 
+    //Return the query result set from the source database.
+    //********************************* 
+    private static ResultSet getDataSet() {
+        ResultSet rs = null;
+        try {
+            Class.forName("com.mysql.jdbc.Driver").newInstance();
+            Connection conn = DriverManager.getConnection("jdbc:mysql://10.119.179.227:3306/jack?useSSL=false&allowPublicKeyRetrieval=true", "jack", "********");
+            Statement stmt = conn.createStatement();
+            rs = stmt.executeQuery("select * from migration_table");
+        } catch (SQLException e) {
+            e.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return rs;
+    }
+}
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0208.html b/docs/dws/dev/dws_04_0208.html new file mode 100644 index 00000000..71d1b6ca --- /dev/null +++ b/docs/dws/dev/dws_04_0208.html @@ -0,0 +1,138 @@ + + +

Using the gsql Meta-Command \COPY to Import Data

+

The gsql tool of GaussDB(DWS) provides the \copy meta-command to import data.

+

\copy Command

For details about the \copy command, see Table 1.

+ +
+ + + + + + + +
Table 1 \copy meta-command

Syntax

+

Description

+

\copy { table [ ( column_list ) ] |

+

( query ) } { from | to } { filename |

+

stdin | stdout | pstdin | pstdout }

+

[ with ] [ binary ] [ oids ] [ delimiter

+

[ as ] 'character' ] [ null [ as ] 'string' ]

+

[ csv [ header ] [ quote [ as ]

+

'character' ] [ escape [ as ] 'character' ]

+

[ force quote column_list | * ] [ force

+

not null column_list ] ]

+

You can run this command to import or export data after logging in to the database on any gsql client. Different from the COPY statement in SQL, this command performs read/write operations on local files rather than files on database servers. The accessibility and permissions of the local files are restricted to local users.

+
NOTE:

\copy only applies to small-batch data import with uniform formats but poor error tolerance capability. GDS or COPY is preferred for data import.

+
+
+
+
+

Parameter Description

  • table

    Specifies the name (possibly schema-qualified) of an existing table.

    +

    Value range: an existing table name

    +
  • column_list

    Specifies an optional list of columns to be copied.

    +

    Value range: any field in the table. If the column list is not specified, all columns in the table will be copied.

    +
  • query

    Specifies that the results will be copied.

    +

    Valid value: a SELECT or VALUES command in parentheses.

    +
  • filename

    Specifies the absolute path of a file. To run the \copy command, the user must have the write permission for this path.

    +
  • stdin

    Specifies that input comes from the client application.

    +
  • stdout

    Specifies that output goes to the client application.

    +
  • pstdin

    Specifies that input comes from the gsql client.

    +
  • pstout
  • Specifies that output goes to the gsql client.
  • binary

    Specifies that data is stored and read in binary mode instead of text mode. In binary mode, you cannot declare DELIMITER, NULL, or CSV. After specifying BINARY, CSV, FIXED and TEXT cannot be specified through option or copy_option.

    +
  • oid

    Specifies the internal OID to be copied for each row.

    +

    An error is raised if OIDs are specified for a table that does not have OIDs, or in the case of copying a query.

    +
    +

    Valid value: true, on, false, and off.

    +

    Default value: false

    +
  • delimiter [ as ] 'character'
    Specifies the character that separates columns within each row (line) of the file.
    • A delimiter cannot be \r or \n.
    • A delimiter cannot be the same as the null value. The delimiter of CSV data cannot be same as the quote value.
    • The delimiter of TEXT data cannot contain any of the following characters: \.abcdefghijklmnopqrstuvwxyz0123456789
    • The data length of a single row should be less than 1 GB. A row that has many columns using long delimiters cannot contain much valid data.
    • You are advised to use multi-characters and invisible characters for delimiters. For example, you can use the multiple-character delimiter "$^&" and invisible delimiters, such as E'\x07', E'\x08', and E'\x1b'.
    +
    +
    +

    Value range: a multi-character delimiter within 10 bytes.

    +

    Default value:

    +
    • A tab character in TEXT format
    • A comma (,) in CSV format
    • No delimiter in FIXED format
    +
  • null [ as ] 'string'

    Specifies that a string represents a null value in a data file.

    +

    Value range:

    +
    • A null value cannot be \r or \n. The maximum length is 100 characters.
    • A null value cannot be the same as the delimiter or quote value.
    +

    Default value:

    +
    • An empty string without quotation marks in CSV format
    • \N in TEXT format
    +
  • header

    Specifies whether a data file contains a table header. header is available only for CSV and FIXED files.

    +

    In data import scenarios, if header is on, the first row of the data file will be identified as the header and ignored. If header is off, the first row will be identified as a data row.

    +

    If header is on, fileheader must be specified. fileheader specifies the content in the header. If header is off, the exported file does not contain a header.

    +

    Valid value: true, on, false, and off.

    +

    Default value: false

    +
  • quote [ as ] 'character'

    Specifies the quote character for a CSV file.

    +

    Default value: double quotation mark ("").

    +
    • The quote value cannot be the same as the delimiter or null value.
    • The quote value must be a single-byte character.
    • You are advised to use invisible characters as quotes, for example, E'\x07', E'\x08', and E'\x1b'.
    +
    +
  • escape [ as ] 'character'

    This option is allowed only when using CSV format. This must be a single one-byte character.

    +

    Default value: double quotation mark (""). If the value is the same as the quote value, it will be replaced with \0.

    +
  • force quote column_list | *

    In CSV COPY TO mode, forces quoting to be used for all not-null values in each specified column. NULL will not be quoted.

    +

    Value range: an existing column.

    +
  • force not null column_list

    In CSV COPY FROM mode, processes each specified column as though it were quoted and hence not a null value.

    +

    Value range: an existing column.

    +
+
+

Examples

Create the target table copy_example.
1
+2
+3
+4
+5
+6
+7
+8
create table copy_example
+(
+	col_1 integer,
+	col_2 text,
+	col_3 varchar(12),
+	col_4 date,
+	col_5 time
+);
+
+ +
+
+
  • Example 1: Copy data from stdin to the target table copy_example.
    1
    \copy copy_example from stdin csv;
    +
    + +
    +
    When the >> characters are displayed, enter data. Enter a backslash and a period (\.) to end your input.
    1
    +2
    +3
    +4
    Enter data to be copied followed by a newline.
    +End with a backslash and a period on a line by itself.
    +>> 1,"iamtext","iamvarchar",2006-07-07,12:00:00
    +>> \.
    +
    + +
    +
    +
  • Example 2: The example.csv file is in the local directory /local/data/ and the file contains the header line. (|) is used as the delimiter, and the double quotation marks are used for quote. The content is as follows:

    iamheader

    +

    1|"iamtext"|"iamvarchar"|2006-07-07|12:00:00

    +

    2|"iamtext"|"iamvarchar"|2022-07-07|19:00:02

    +
    Import data from the local file example.csv to the target table copy_example. If the header option is on, the first row is automatically ignored. By default, quotation marks are used for quote.
    1
    \copy copy_example from  '/local/data/example.csv' with(header 'on', format 'csv', delimiter '|', date_format 'yyyy-mm-dd',  time_format 'hh24:mi:ss');
    +
    + +
    +
    +
  • Example 3: The example.csv file is in the local directory /local/data/. The comma (,) is used as the delimiter, and the quotation mark (") is used for quote. The last field is missing in the first line, and one more field is added in the second line. The content is as follows:

    1,"iamtext","iamvarchar",2006-07-07

    +

    2,"iamtext","iamvarchar",2022-07-07,19:00:02,12:00:00

    +

    Import data from the local file example.csv to the target table copy_example. The default delimiter is (,). Therefore, you do not need to specify the delimiter. Because the fault tolerance parameters IGNORE_EXTRA_DATA and FILL_MISSING_FIELD are specified, the missing fields will be replaced with NULL, the extra fields are ignored.

    +
    1
    \copy copy_example from '/local/data/example.csv' with( format 'csv', date_format 'yyyy-mm-dd', time_format 'hh24:mi:ss', IGNORE_EXTRA_DATA 'true', FILL_MISSING_FIELD 'true');
    +
    + +
    +
  • Example 4: Export the content of the copy_example table to stdout in CSV format, use double quotation marks as for quote, and use quotes to enclose the fourth and fifth columns.
    1
    \copy copy_example to stdout CSV quote as '"' force quote col_4,col_5;
    +
    + +
    +
+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0209.html b/docs/dws/dev/dws_04_0209.html new file mode 100644 index 00000000..f00ed48d --- /dev/null +++ b/docs/dws/dev/dws_04_0209.html @@ -0,0 +1,243 @@ + + +

Using gs_restore to Import Data

+

Scenarios

gs_restore is an import tool provided by GaussDB(DWS). You can use gs_restore to import the files exported by gs_dump to a database. gs_restore can import the files in .tar, custom, or directory format.

+

gs_restore can:

+
  • Import data to a database.

    If a database is specified, data is imported to the database. If multiple databases are specified, the password for connecting to each database also needs to be specified.

    +
  • Import data to a script.

    If no database is specified, a script containing the SQL statement to recreate the database is created and written to a file or standard output. This script output is equivalent to the plain text output of gs_dump.

    +
+

You can specify and sort the data to be imported.

+
+

Procedure

gs_restore incrementally imports data by default. To prevent data exception caused by consecutive imports, use the -e and -c parameters for each import. In this way, existing data is deleted from the target database before each import; the system exists the import task with an error (error message is displayed after the import process is complete) and proceeds with the next.

+
+
  1. Log in to the server as the root user and run the following command to go to the data storage path:

    1
    cd /opt/bin
    +
    + +
    +

  2. Use gs_restore to import all object definitions from the exported file of the whole postgres database to the gaussdb database.

    gs_restore -W password -U jack /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb -s -e -c
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for database connection.

    +

    -U jack

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -d

    +

    Database to which data will be imported.

    +

    -d backupdb

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    -e

    +

    Exits the current import task and performs the next if an error occurs when you send a SQL statement in the current import task. Error messages are displayed after the import process is complete.

    +

    -

    +

    -c

    +

    Cleans existing objects from the target database before the import.

    +

    -

    +

    -s

    +

    Imports only object definitions in schemas and does not import data. Sequence values will also not be imported.

    +

    -

    +
    +
    +

    For details about other parameters, see "Server Tools > gs_restore" in the Tool Reference.

    +

+
+

Examples

Example 1: Use gs_restore to run the following command to import data and all object definitions of the gaussdb database from the MPPDB_backup.dmp file (custom format).

+
gs_restore -W password backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb
+gs_restore[2017-07-21 19:16:26]: restore operation successfu
+gs_restore: total time: 13053  ms
+

Example 2: Use gs_restore to run the following command to import data and all object definitions of the gaussdb database from the MPPDB_backup.tar file.

+
gs_restore backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb 
+gs_restore[2017-07-21 19:21:32]: restore operation successful
+gs_restore[2017-07-21 19:21:32]: total time: 21203  ms
+

Example 3: Use gs_restore to run the following command to import data and all object definitions of the gaussdb database from the MPPDB_backup directory.

+
gs_restore backup/MPPDB_backup -p 8000 -h 10.10.10.100 -d backupdb
+gs_restore[2017-07-21 19:26:46]: restore operation successful
+gs_restore[2017-07-21 19:26:46]: total time: 21003  ms
+

Example 4: Use gs_restore to run the following command to import all object definitions of the gaussdb database to the backupdb database. Before the import, there are complete definitions in the gaussdb database. After the import, all object definitions exist in the backupdb database and there is no data in tables.

+
gs_restore -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb -s -e -c 
+gs_restore[2017-07-21 19:46:27]: restore operation successful
+gs_restore[2017-07-21 19:46:27]: total time: 32993  ms
+

Example 5: Use gs_restore to run the following command to import data and all definitions in the PUBLIC schema from the MPPDB_backup.dmp file. Existing objects are deleted from the target database before the import. If an existing object references to an object in another schema, you need to manually delete the referenced object first.

+
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC
+gs_restore: [archiver (db)] Error while PROCESSING TOC:
+gs_restore: [archiver (db)] Error from TOC entry 313; 1259 337399 TABLE table1 gaussdba
+gs_restore: [archiver (db)] could not execute query: ERROR:  cannot drop table table1 because other objects depend on it
+DETAIL:  view t1.v1 depends on table table1
+HINT:  Use DROP ... CASCADE to drop the dependent objects too.
+Command was: DROP TABLE public.table1;
+

Manually delete the referenced object and create it again after the import is complete.

+
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -n PUBLIC
+gs_restore[2017-07-21 19:52:26]: restore operation successful
+gs_restore[2017-07-21 19:52:26]: total time: 2203  ms
+

Example 6: Use gs_restore to run the following command to import the definition of the hr.staffs table in the PUBLIC schema from the MPPDB_backup.dmp file. Before the import, the hr.staffs table does not exist.

+
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -c -s -n PUBLIC -t hr.staffs
+gs_restore[2017-07-21 19:56:29]: restore operation successful
+gs_restore[2017-07-21 19:56:29]: total time: 21000  ms
+

Example 7: Use gs_restore to run the following command to import data of the hr.staffs table in the PUBLIC schema from the MPPDB_backup.dmp file. Before the import, the hr.staffs table is empty.

+
gs_restore backup/MPPDB_backup.dmp -p 8000 -h 10.10.10.100 -d backupdb -e -a -n PUBLIC -t hr.staffs
+gs_restore[2017-07-21 20:12:32]: restore operation successful
+gs_restore[2017-07-21 20:12:32]: total time: 20203  ms
+
Example 8: Use gs_restore to run the following command to import the definition of the hr.staffs table. Before the import, the hr.staffs table contains data.
human_resource=# select * from hr.staffs;
+ staff_id | first_name  |  last_name  |  email   |    phone_number    |      hire_date      | employment_id |  salary  | commission_pct | manager_id | section_id 
+----------+-------------+-------------+----------+--------------------+---------------------+---------------+----------+----------------+------------+------------
+      200 | Jennifer    | Whalen      | JWHALEN  | 515.123.4444       | 1987-09-17 00:00:00 | AD_ASST       |  4400.00 |                |        101 |         10
+      201 | Michael     | Hartstein   | MHARTSTE | 515.123.5555       | 1996-02-17 00:00:00 | MK_MAN        | 13000.00 |                |        100 |         20
+
+gsql -d human_resource -p 8000
+gsql ((GaussDB 8.1.1 build af002019) compiled at 2020-01-10 05:43:20 commit 6995 last mr 11566 )
+Non-SSL connection (SSL connection is recommended when requiring high-security)
+Type "help" for help.
+
+human_resource=# drop table hr.staffs CASCADE;
+NOTICE:  drop cascades to view hr.staff_details_view
+DROP TABLE
+
+gs_restore -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d human_resource -n hr -t staffs -s -e 
+restore operation successful
+total time: 904  ms
+
+human_resource=# select * from hr.staffs;
+ staff_id | first_name | last_name | email | phone_number | hire_date | employment_id | salary | commission_pct | manager_id | section_id 
+----------+------------+-----------+-------+--------------+-----------+---------------+--------+----------------+------------+------------
+(0 rows)
+
+
Example 9: Use gs_restore to run the following command to import data and definitions of the staffs and areas tables. Before the import, the staffs and areas tables do not exist.
human_resource=# \d
+                                 List of relations
+ Schema |        Name        | Type  |  Owner   |             Storage              
+--------+--------------------+-------+----------+----------------------------------
+ hr     | employment_history | table |  | {orientation=row,compression=no}
+ hr     | employments        | table |  | {orientation=row,compression=no}
+ hr     | places             | table |  | {orientation=row,compression=no}
+ hr     | sections           | table |  | {orientation=row,compression=no}
+ hr     | states             | table |  | {orientation=row,compression=no}
+(5 rows)
+
+gs_restore -W password /home/mppdb/backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d human_resource -n hr -t staffs -n hr -t areas 
+restore operation successful
+total time: 724  ms
+
+human_resource=# \d
+                                 List of relations
+ Schema |        Name        | Type  |  Owner   |             Storage              
+--------+--------------------+-------+----------+----------------------------------
+ hr     | areas              | table |  | {orientation=row,compression=no}
+ hr     | employment_history | table |  | {orientation=row,compression=no}
+ hr     | employments        | table |  | {orientation=row,compression=no}
+ hr     | places             | table |  | {orientation=row,compression=no}
+ hr     | sections           | table |  | {orientation=row,compression=no}
+ hr     | staffs             | table |  | {orientation=row,compression=no}
+ hr     | states             | table |  | {orientation=row,compression=no}
+(7 rows)
+
+human_resource=# select * from hr.areas;
+ area_id |       area_name        
+---------+------------------------
+       4 | Iron
+       1 | Wood
+       2 | Lake
+       3 | Desert
+(4 rows)
+
+
Example 10: Use gs_restore to run the following command to import data and all object definitions in the hr schema.
gs_restore -W password  /home//backup/MPPDB_backup1.sql -p 8000 -h 10.10.10.100 -d backupdb -n hr -e -c
+restore operation successful
+total time: 702  ms
+
+
Example 11: Use gs_restore to run the following command to import all object definitions in the hr and hr1 schemas to the backupdb database.
gs_restore -W password /home//backup/MPPDB_backup2.dmp -p 8000 -h 10.10.10.100 -d backupdb -n hr -n hr1 -s
+restore operation successful
+total time: 665  ms
+
+

Example 12: Use gs_restore to run the following command to decrypt the files exported from the human_resource database and import them to the backupdb database.

+
create database backupdb;
+CREATE DATABASE
+
+gs_restore /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --with-key=1234567812345678
+restore operation successful
+total time: 23472  ms
+
+gsql -d backupdb -p 8000 -r
+gsql ((GaussDB 8.1.1 build af002019) compiled at 2020-01-10 05:43:20 commit 6995 last mr 11566 )
+Non-SSL connection (SSL connection is recommended when requiring high-security)
+Type "help" for help.
+
+backupdb=# select * from hr.areas;
+ area_id |       area_name        
+---------+------------------------
+       4 | Iron
+       1 | Wood
+       2 | Lake
+       3 | Desert
+(4 rows)
+

Example 13: user1 does not have the permission for importing data from an exported file to the backupdb database and role1 has this permission. To import the exported data to the backupdb database, you can set --role to role1 in the export command.

+
human_resource=# CREATE USER user1 IDENTIFIED BY 'password';
+
+gs_restore -U user1 -W password /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 -d backupdb --role role1 --rolepassword password
+restore operation successful
+total time: 554  ms
+
+gsql -d backupdb -p 8000 -r 
+gsql ((GaussDB 8.1.1 build af002019) compiled at 2020-01-10 05:43:20 commit 6995 last mr 11566 )
+Non-SSL connection (SSL connection is recommended when requiring high-security)
+Type "help" for help.
+
+backupdb=# select * from hr.areas;
+ area_id |       area_name        
+---------+------------------------
+       4 | Iron
+       1 | Wood
+       2 | Lake
+       3 | Desert
+(4 rows)
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0210.html b/docs/dws/dev/dws_04_0210.html new file mode 100644 index 00000000..0d8463d0 --- /dev/null +++ b/docs/dws/dev/dws_04_0210.html @@ -0,0 +1,28 @@ + + +

Importing Data from MRS to a Cluster

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0212.html b/docs/dws/dev/dws_04_0212.html new file mode 100644 index 00000000..edaee1e4 --- /dev/null +++ b/docs/dws/dev/dws_04_0212.html @@ -0,0 +1,97 @@ + + +

Preparing Data in an MRS Cluster

+

Before importing data from MRS to a GaussDB(DWS) cluster, you must have:

+
  1. Created an MRS cluster.
  2. Created the Hive/Spark ORC table in the MRS cluster and stored the table data to the HDFS path corresponding to the table.
+

If you have completed the preparations, skip this section.

+

In this tutorial, the Hive ORC table will be created in the MRS cluster as an example to complete the preparation work. The process for creating the Spark ORC table in the MRS cluster and the SQL syntax are similar to those of Hive.

+

Data File

The sample data of the product_info.txt data file is as follows:

+
100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good
+205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good!
+300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad.
+310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice
+150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite
+200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality.
+250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time.
+108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy
+450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor
+260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes
+980,ZKDS-J-5490-#cW4,2017-09-13,B,2017 Autumn New Women's Cotton Clothing,red,M,112,2017-09-16,219,The clothes are small
+98,FKQB-I-2564-#dA5,2017-09-15,B,2017 autumn new shoes men,green,M,4345,2017-09-18,5473,The clothes are thick and it's better this winter.
+150,DMQY-K-6579-#eS6,2017-09-21,A,2017 autumn new underwear men,yellow,37,2840,2017-09-25,5831,This price is very cost effective
+200,GKLW-l-2897-#wQ7,2017-09-22,A,2017 Autumn New Jeans Men,blue,39,5879,2017-09-25,7200,The clothes are very comfortable to wear
+300,HWEC-L-2531-#xP8,2017-09-23,A,2017 autumn new shoes women,brown,M,403,2017-09-26,607,good
+100,IQPD-M-3214-#yQ1,2017-09-24,B,2017 Autumn New Wide Leg Pants Women,black,M,3045,2017-09-27,5021,very good.
+350,LPEC-N-4572-#zX2,2017-09-25,B,2017 Autumn New Underwear Women,red,M,239,2017-09-28,407,The seller's service is very good
+110,NQAB-O-3768-#sM3,2017-09-26,B,2017 autumn new underwear women,red,S,6089,2017-09-29,7021,The color is very good 
+210,HWNB-P-7879-#tN4,2017-09-27,B,2017 autumn new underwear women,red,L,3201,2017-09-30,4059,I like it very much and the quality is good.
+230,JKHU-Q-8865-#uO5,2017-09-29,C,2017 Autumn New Clothes with Chiffon Shirt,black,M,2056,2017-10-02,3842,very good
+

+
+

Creating a Hive ORC Table in an MRS Cluster

  1. Create an MRS cluster.

    For details, see "Creating a Cluster > Custom Creation of a Cluster" in the MapReduce Service User Guide.

    +
  2. Download the client.
    1. Go back to the MRS cluster page. Click the cluster name. On the Dashboard tab page of the cluster details page, click Access Manager. If a message is displayed indicating that EIP needs to be bound, bind an EIP first.
    2. Enter the username admin and its password for logging in to MRS Manager. The password is the one you entered when creating the MRS cluster.
    3. Choose Services > Download Client. Set Client Type to Only configuration files and set Download To to Server. Click OK.

      +
    +
  3. Log in to the Hive client of the MRS cluster.
    1. Log in to a Master node.

      For details, see "Remote Login Guide > Logging In to a Master Node" in the MapReduce Service User Guide.

      +
    2. Run the following command to switch the user:
      sudo su - omm
      +
    3. Run the following command to go to the client directory:
      cd /opt/client
      +
    4. Run the following command to configure the environment variables:
      source bigdata_env
      +
    5. If Kerberos authentication is enabled for the current cluster, run the following command to authenticate the current user. The current user must have the permission for creating Hive tables. For details, see "Creating a Role" in the MapReduce Service User Guide. Configure a role with the required permissions. For details, see "Creating a Role" in the MapReduce Service User Guide. Bind a role to the user. If the Kerberos authentication is disabled for the current cluster, skip this step.
      kinit MRS cluster user
      +

      Example: kinit hiveuser

      +
    6. Run the following command to start the Hive client:
      beeline
      +
    +
  4. Create a database demo on Hive.

    Run the following command to create the database demo:

    +
    CREATE DATABASE demo;
    +
  5. Create table product_info of the Hive TEXTFILE type in the database demo and import the Data File (product_info.txt) to the HDFS path corresponding to the table.

    Run the following command to switch to the database demo:

    +
    USE demo;
    +

    Run the following command to create table product_info and define the table fields based on data in the Data File.

    +
    DROP TABLE product_info;
    +
    +CREATE TABLE product_info 
    +(    
    +    product_price                int            ,
    +    product_id                   char(30)       ,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    int            ,
    +    product_comment_time         date           ,
    +    product_comment_num          int        ,
    +    product_comment_content      varchar(200)                   
    +) 
    +row format delimited fields terminated by ',' 
    +stored as TEXTFILE;
    +

    For details about how to import data to an MRS cluster, see "Cluster Operation Guide > Managing Active Clusters > Managing Data Files" in the MapReduce Service User Guide.

    +
  6. Create a Hive ORC table named product_info_orc in the database demo.

    Run the following command to create the Hive ORC table product_info_orc. The table fields are the same as those of the product_info table created in the previous step.

    +
    DROP TABLE product_info_orc;
    +
    +CREATE TABLE product_info_orc
    +(    
    +    product_price                int            ,
    +    product_id                   char(30)       ,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    int            ,
    +    product_comment_time         date           ,
    +    product_comment_num          int            ,
    +    product_comment_content      varchar(200)                   
    +) 
    +row format delimited fields terminated by ',' 
    +stored as orc;
    +
  7. Insert data in the product_info table to the Hive ORC table product_info_orc.
    insert into product_info_orc select * from product_info;
    +

    Query table product_info_orc.

    +
    select * from product_info_orc;
    +

    If data displayed in the Data File can be queried, the data has been successfully inserted to the ORC table.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0213.html b/docs/dws/dev/dws_04_0213.html new file mode 100644 index 00000000..34e00148 --- /dev/null +++ b/docs/dws/dev/dws_04_0213.html @@ -0,0 +1,119 @@ + + +

Manually Creating a Foreign Server

+

In the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS) for creating a foreign table, you need to specify a foreign server associated with the MRS data source connection.

+

When you create an MRS data source connection on the GaussDB(DWS) management console, the database administrator dbadmin automatically creates a foreign server in the default database postgres. If you want to create a foreign table in the default database postgres to read MRS data, skip this section.

+

To allow a common user to create a foreign table in a user-defined database to read MRS data, you must manually create a foreign server in the user-defined database. This section describes how does a common user create a foreign server in a user-defined database. The procedure is as follows:

+
  1. Ensure that an MRS data source connection has been created for the GaussDB(DWS) cluster.

    For details, see "Managing MRS Data Sources > Creating an MRS Data Source Connection" in the Data Warehouse Service User Guide.

    +
  2. Creating a User and a Database and Granting the User Foreign Table Permissions
  3. Manually Creating a Foreign Server
+

If you no longer need to read data from the MRS data source and have deleted the MRS data source on the GaussDB(DWS) management console, only the foreign server automatically created in the default database gaussdb will be deleted, and the manually created foreign server needs to be deleted manually. For details about the deletion, see Deleting the Manually Created Foreign Server.

+
+

Creating a User and a Database and Granting the User Foreign Table Permissions

In the following example, a common user dbuser and a database mydatabase are created. Then, an administrator is used to grant foreign table permissions to user dbuser.

+
  1. Connect to the default database gaussdb as a database administrator through the database client tool provided by GaussDB(DWS).

    For example, use the gsql client to connect to the database by running the following command:

    +
    gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
    +

    Enter your password as prompted.

    +

  2. Create a common user and use it to create a database.

    Create a user named dbuser that has the permission to create databases.

    +
    CREATE USER dbuser WITH CREATEDB PASSWORD 'password';
    +
    Switch to the created user.
    SET ROLE dbuser PASSWORD 'password';
    +
    +
    Run the following command to create a database:
    CREATE DATABASE mydatabase;
    +
    +

    Query the database.

    +
    SELECT * FROM pg_database;
    +

    The database is successfully created if the returned result contains information about mydatabase.

    +
    datname   | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility |                       datacl
    +
    +------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+--------------------------------------
    +--------------
    + template1  |     10 |        0 | C          | C        | t             | t            |           -1 |         14146 |         1351 |          1663 | ORA              | {=c/Ruby,omm=CTc/Ruby}
    + template0  |     10 |        0 | C          | C        | t             | f            |           -1 |         14146 |         1350 |          1663 | ORA              | {=c/Ruby,Ruby=CTc/Ruby}
    + postgres   |     10 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1352 |          1663 | ORA              | {=Tc/Ruby,Ruby=CTc/Ruby,chaojun=C/Ruby,hu
    +obinru=C/Ruby}
    + mydatabase |  17000 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1351 |          1663 | ORA              |
    +(4 rows)
    +

  3. Grant the permissions for creating foreign servers and using foreign tables to a common user as the administrator.

    Use the connection to create a database as a database administrator.

    +
    You can use the gsql client to run the following command, switching to an administrator user, and connect to the new database:
    \c mydatabase dbadmin;
    +
    +

    Enter the password as prompted.

    +

    Note that you must use the administrator account to connect to the database where a foreign server is to be created and foreign tables are used; and then grant permissions to the common user.

    +
    +
    By default, only system administrators can create foreign servers. Common users can create foreign servers only after being authorized. Run the following command to grant the permission:
    GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser;
    +
    +

    The name of FOREIGN DATA WRAPPER must be hdfs_fdw. dbuser is the username for creating SERVER.

    +

    Run the following command to grant the user the permission to use foreign tables:

    +
    ALTER USER dbuser USEFT;
    +

    Query for the user.

    +
    SELECT r.rolname, r.rolsuper, r.rolinherit,
    +  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
    +  r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil,
    +  ARRAY(SELECT b.rolname
    +        FROM pg_catalog.pg_auth_members m
    +        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
    +        WHERE m.member = r.oid) as memberof
    +, r.rolreplication
    +, r.rolauditadmin
    +, r.rolsystemadmin
    +, r.roluseft
    +FROM pg_catalog.pg_roles r
    +ORDER BY 1;
    +

    The authorization is successful if the dbuser information in the returned result contains the UseFT permission.

    +
     rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft
    +-----------+----------+------------+---------------+-------------+-------------+--------------+---------------+---------------+----------+----------------+---------------+----------------+----------
    + dbuser    | f        | t          | f             | t           | t           |           -1 |               |               | {}       | f              | f             | f              | t
    + lily      | f        | t          | f             | f           | t           |           -1 |               |               | {}       | f              | f             | f              | f
    + Ruby       | t        | t          | t             | t           | t           |           -1 |               |               | {}       | t              | t             | t              | t
    +

+
+

Manually Creating a Foreign Server

  1. Connect to the default database gaussdb as a database administrator through the database client tool provided by GaussDB(DWS).

    You can use the gsql client to log in to the database in either of the following ways:

    +

    You can use either of the following methods to create the connection:

    +
    • If you have logged in to the gsql client, run the following command to switch the database and user:
      \c postgres dbadmin;
      +

      Enter the password as prompted.

      +
    • If you have not logged in to the gsql client or have exited the gsql client by running the \q command, run the following command to reconnect to it:
      gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
      +
    +

  2. Run the following command to query the information about the foreign server that is automatically created:

    SELECT * FROM pg_foreign_server;
    +

    The returned result is as follows:

    +
                         srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
    +--------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
    + gsmpp_server                                     |       10 |  13673 |         |            |        |
    + gsmpp_errorinfo_server                           |       10 |  13678 |         |            |        |
    + hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca |    16476 |  13685 |         |            |        | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs}
    +(3 rows)
    +

    In the query result, each row contains the information about a foreign server. The foreign server associated with the MRS data source connection contains the following information:

    +
    • The value of srvname contains hdfs_server and the ID of the MRS cluster, which is the same as the MRS ID in the cluster list on the MRS management console.
    • The address parameter in the srvoptions field contains the IP addresses and ports of the active and standby nodes in the MRS cluster.
    +

    You can find the foreign server you want based on the above information and record the values of its srvname and srvoptions.

    +

  3. Switch to the user who is about to create a foreign server to connect to the corresponding database.

    In this example, run the following command to use common user dbuser created in Creating a User and a Database and Granting the User Foreign Table Permissions to connect to mydatabase created by the user:
    \c mydatabase dbuser;
    +
    +

  4. Create a foreign server.

    For details about the syntax for creating foreign servers, see CREATE SERVER. For example:

    +
    CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca FOREIGN DATA WRAPPER HDFS_FDW 
    +OPTIONS 
    +(
    +address '192.168.1.245:25000,192.168.1.218:25000', 
    +hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca',
    +type 'hdfs'
    +);
    +

    Mandatory parameters are described as follows:

    +
    • Name of the foreign server

      You can customize a name.

      +

      In this example, specify the name to the value of the srvname field recorded in 2, such as hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca.

      +

      Resources in different databases are isolated. Therefore, the names of foreign servers in different databases can be the same.

      +
    • FOREIGN DATA WRAPPER

      This parameter can only be set to HDFS_FDW, which already exists in the database.

      +
    • OPTIONS parameters
      Set the following parameters to the values under srvoptions recorded in 2.
      • address

        Specifies the IP address and port number of the primary and standby nodes of the HDFS cluster.

        +
      • hdfscfgpath

        Specifies the configuration file path of the HDFS cluster. This parameter is available only when type is HDFS. You can set only one path.

        +
      • type

        Its value is hdfs, which indicates that HDFS_FDW connects to HDFS.

        +
      +
      +
    +

  5. View the foreign server.

    SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';
    +

    The server is successfully created if the returned result is as follows:

    +
                         srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
    +--------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
    + hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca |    16476 |  13685 |         |            |        | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs}
    +(1 row)
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0214.html b/docs/dws/dev/dws_04_0214.html new file mode 100644 index 00000000..4e42e0ae --- /dev/null +++ b/docs/dws/dev/dws_04_0214.html @@ -0,0 +1,227 @@ + + +

Creating a Foreign Table

+

This section describes how to create a Hadoop foreign table in the GaussDB(DWS) database to access the Hadoop structured data stored on MRS HDFS. A Hadoop foreign table is read-only. It can only be queried using SELECT.

+

Prerequisites

  • You have created an MRS cluster and imported data to the ORC table in the Hive/Spark database.

    For details, see Preparing Data in an MRS Cluster.

    +
  • You have created an MRS data source connection for the GaussDB(DWS) cluster.

    For details, see "Managing MRS Data Sources > Creating an MRS Data Source Connection" in the Data Warehouse Service User Guide.

    +
+
+

Obtaining the HDFS Path of the MRS Data Source

There are two methods for you to obtain the HDFS path.

+
  • Method 1

    For Hive data, log in to the Hive client of MRS (see 2), run the following command to view the detailed information about the table, and record the data storage path in the location parameter:

    +
    use <database_name>;
    +desc formatted <table_name>;
    +

    For example, if the value of the location parameter in the returned result is hdfs://hacluster/user/hive/warehouse/demo.db/product_info_orc/, the HDFS path is /user/hive/warehouse/demo.db/product_info_orc/.

    +
  • Method 2
    Perform the following steps to obtain the HDFS path:
    1. Log in to the MRS management console.
    2. Choose Cluster > Active Cluster and click the name of the cluster to be queried to enter the page displaying the cluster's basic information.
    3. Click File Management and select HDFS File List.
    4. Go to the storage directory of the data to be imported to the GaussDB(DWS) cluster and record the path.
      Figure 1 Checking the data storage path on MRS
      +
    +
    +
+
+

Obtaining Information About the Foreign Server Connected to the MRS Data Source

  1. Use the user who creates the foreign server to connect to the corresponding database.

    Determine whether to use a common user to create a foreign table in the customized database based on requirements.

    +
    • Yes
      1. Ensure that you have created the common user dbuser and its database mydatabase, and manually created a foreign server in mydatabase by following steps in Manually Creating a Foreign Server.
      2. Connect to the database mydatabase as user dbuser through the database client tool provided by GaussDB(DWS).
        If you have connected to the database using the gsql client, run the following command to switch the user and database:
        \c mydatabase dbuser;
        +
        +

        Enter your password as prompted.

        +
      +
    • No

      When you create an MRS data source connection on the GaussDB(DWS) management console, the database administrator dbadmin automatically creates a foreign server in the default database postgres. If you create a foreign table in the default database postgres as the database administrator dbadmin, you need to connect to the database using the database client tool provided by GaussDB(DWS). For example, use the gsql client to connect to the database by running the following command:

      +
      gsql -d postgres -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
      +

      Enter your password as prompted.

      +
    +

  2. Run the following command to view the information about the created foreign server connected to the MRS data source:

    SELECT * FROM pg_foreign_server;
    +

    You can also run the \desc+ command to view the information about the foreign server.

    +
    +

    The returned result is as follows:

    +
                         srvname                      | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                     srvoptions
    +--------------------------------------------------+----------+--------+---------+------------+--------+---------------------------------------------------------------------------------------------------------------------
    + gsmpp_server                                     |       10 |  13673 |         |            |        |
    + gsmpp_errorinfo_server                           |       10 |  13678 |         |            |        |
    + hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca |    16476 |  13685 |         |            |        | {"address=192.168.1.245:25000,192.168.1.218:25000",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs}
    +(3 rows)
    +

    In the query result, each row contains the information about a foreign server. The foreign server associated with the MRS data source connection contains the following information:

    +
    • The value of srvname contains hdfs_server and the ID of the MRS cluster, which is the same as the MRS ID in the cluster list on the MRS management console.
    • The address parameter in the srvoptions field contains the IP addresses and ports of the active and standby nodes in the MRS cluster.
    +

    You can find the foreign server you want based on the above information and record the values of its srvname and srvoptions.

    +

+
+

Creating a Foreign Table

After Obtaining Information About the Foreign Server Connected to the MRS Data Source and Obtaining the HDFS Path of the MRS Data Source are completed, you can create a foreign table to read data from the MRS data source.

+

The syntax for creating a foreign table is as follows. For details, see the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS).

+
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name 
+( [ { column_name type_name 
+    [ { [CONSTRAINT constraint_name] NULL |
+    [CONSTRAINT constraint_name] NOT NULL |
+      column_constraint [...]} ] |
+      table_constraint [, ...]} [, ...] ] ) 
+    SERVER dfs_server 
+    OPTIONS ( { option_name ' value ' } [, ...] ) 
+    DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
+    [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
+

For example, when creating a foreign table named foreign_product_info, set parameters in the syntax as follows:

+
  • table_name

    Mandatory. This parameter specifies the name of the foreign table to be created.

    +
  • Table column definitions
    • column_name: specifies the name of a column in the foreign table.
    • type_name: specifies the data type of the column.
    +

    Multiple columns are separate by commas (,).

    +

    The number of columns and column types in the foreign table must be the same as those in the data stored on MRS. Learn Data Type Conversion before defining column data types.

    +
  • SERVER dfs_server

    This parameter specifies the foreign server name of the foreign table. This server must exist. The foreign table can read data from an MRS cluster by configuring the foreign server and connecting to the MRS data source.

    +

    Enter the value of the srvname field queried in Obtaining Information About the Foreign Server Connected to the MRS Data Source.

    +
  • OPTIONS parameters

    These are parameters associated with the foreign table. The key parameters are as follows:

    +
    • format: This parameter is mandatory. The value can only be orc. It specifies the format of the source data file. Only Hive ORC files are supported.
    • foldername: This parameter is mandatory. It specifies the HDFS directory for storing data or data file path.

      If the MRS analysis cluster has enabled Kerberos authentication, ensure that the MRS user having the MRS data source connection has the read and write permissions for the directory.

      +

      Follow the steps in Obtaining the HDFS Path of the MRS Data Source to obtain the HDFS path, which is the value of parameter foldername.

      +
    • encoding: This parameter is optional. It specifies the encoding format of a source data file in the foreign table. Its default value is utf8.
    • DISTRIBUTE BY
      This parameter specifies the data read mode for the foreign table. There are two read modes supported. In this example, ROUNDROBIN is selected.
      • ROUNDROBIN: When a foreign table reads data from the data source, each node in a GaussDB(DWS) cluster randomly reads some data and integrates the random data to a complete data set.
      • REPLICATION: When a foreign table reads data from the data source, each node in the GaussDB(DWS) cluster reads a complete data set.
      +
      +
    • Other parameters in the syntax

      Other parameters are optional. You can set them as required. In this example, you do not need to set these parameters.

      +
    +
+

Based on the above settings, the foreign table is created using the following statements:

+
DROP FOREIGN TABLE IF EXISTS foreign_product_info;
+
+CREATE FOREIGN TABLE foreign_product_info
+(
+    product_price                integer        ,
+    product_id                   char(30)       ,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)                      
+) SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca 
+OPTIONS (
+format 'orc', 
+encoding 'utf8',
+foldername '/user/hive/warehouse/demo.db/product_info_orc/'
+) 
+DISTRIBUTE BY ROUNDROBIN;
+
+

Data Type Conversion

Data is imported to Hive/Spark and then stored on HDFS in ORC format. Actually, GaussDB(DWS) reads ORC files on HDFS, and queries and analyzes data in these files.

+

Data types supported by Hive/Spark are different from those supported by GaussDB(DWS). Therefore, you need to learn the mapping between them. Table 1 describes the mapping in detail.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Data type mapping

Type

+

Column Type Supported by an HDFS/OBS Foreign Table of GaussDB(DWS)

+

Column Type Supported by a Hive Table

+

Column Type Supported by a Spark Table

+

Integer in two bytes

+

SMALLINT

+

SMALLINT

+

SMALLINT

+

Integer in four bytes

+

INTEGER

+

INT

+

INT

+

Integer in eight bytes

+

BIGINT

+

BIGINT

+

BIGINT

+

Single-precision floating point number

+

FLOAT4 (REAL)

+

FLOAT

+

FLOAT

+

Double-precision floating point number

+

FLOAT8(DOUBLE PRECISION)

+

DOUBLE

+

FLOAT

+

Scientific data type

+

DECIMAL[p (,s)]

+

The maximum precision can reach up to 38.

+

DECIMAL

+

The maximum precision can reach up to 38 (Hive 0.11).

+

DECIMAL

+

Date type

+

DATE

+

DATE

+

DATE

+

Time type

+

TIMESTAMP

+

TIMESTAMP

+

TIMESTAMP

+

BOOLEAN type

+

BOOLEAN

+

BOOLEAN

+

BOOLEAN

+

CHAR type

+

CHAR(n)

+

CHAR (n)

+

STRING

+

VARCHAR type

+

VARCHAR(n)

+

VARCHAR (n)

+

VARCHAR (n)

+

String

+

TEXT(CLOB)

+

STRING

+

STRING

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0215.html b/docs/dws/dev/dws_04_0215.html new file mode 100644 index 00000000..3bf294b1 --- /dev/null +++ b/docs/dws/dev/dws_04_0215.html @@ -0,0 +1,80 @@ + + +

Importing Data

+

Viewing Data in the MRS Data Source by Directly Querying the Foreign Table

If the data amount is small, you can directly run SELECT to query the foreign table and view the data in the MRS data source.

+
  1. Run the following command to query data from the foreign table:

    1
    SELECT * FROM foreign_product_info;
    +
    + +
    +

    If the query result is the same as the data in Data File, the import is successful. The following information is displayed at the end of the query result:

    +
    (20 rows)
    +

    After data is queried, you can insert the data to common tables in the database.

    +

+
+

Querying Data After Importing It

You can query the MRS data after importing it to GaussDB(DWS).

+
  1. Create a table in GaussDB(DWS) to store imported data.

    The target table structure must be the same as the structure of the foreign table created in Creating a Foreign Table. That is, both tables must have the same number of columns and column types.

    +

    For example, create a table named product_info. The table example is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    DROP TABLE IF EXISTS product_info;
    +CREATE TABLE product_info
    +(
    +    product_price                integer        ,
    +    product_id                   char(30)       ,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    integer        ,
    +    product_comment_time         date           ,
    +    product_comment_num          integer        ,
    +    product_comment_content      varchar(200)                   
    +) 
    +with (
    +orientation = column,
    +compression=middle
    +) 
    +DISTRIBUTE BY HASH (product_id);
    +
    + +
    +

  2. Run the INSERT INTO .. SELECT .. command to import data from the foreign table to the target table.

    Example:

    +
    1
    INSERT INTO product_info SELECT * FROM foreign_product_info;
    +
    + +
    +
    If information similar to the following is displayed, the data has been imported.
    INSERT 0 20
    +
    +

  3. Run the following SELECT command to view data imported from MRS to GaussDB(DWS):

    1
    SELECT * FROM product_info;
    +
    + +
    +

    If the query result is the same as the data in Data File, the import is successful. The following information is displayed at the end of the query result:

    +
    (20 rows)
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0216.html b/docs/dws/dev/dws_04_0216.html new file mode 100644 index 00000000..911ca409 --- /dev/null +++ b/docs/dws/dev/dws_04_0216.html @@ -0,0 +1,52 @@ + + +

Deleting Resources

+

After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quota occupation.

+

Deleting the Foreign Table and Target Table

  1. (Optional) If operations in Querying Data After Importing It have been performed, run the following command to delete the target table:

    DROP TABLE product_info;
    +

  2. Run the following command to delete the foreign table:

    DROP FOREIGN TABLE foreign_product_info;
    +

+
+

Deleting the Manually Created Foreign Server

If operations in Manually Creating a Foreign Server have been performed, perform the following steps to delete the foreign server, database, and user:

+
  1. Use the client provided by GaussDB(DWS) to connect to the database where the foreign server resides as the user who created the foreign server.

    You can use the gsql client to log in to the database in either of the following ways:

    +
    • If you have logged in to the gsql client, run the following command to switch the database and user:
      \c mydatabase dbuser;
      +

      Enter the password as prompted.

      +
    • If you have logged in to the gsql client, you can run the \q command to exit gsql, and run the following command to reconnect to it:
      gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r
      +

      Enter the password as prompted.

      +
    +

  2. Delete the manually created foreign server.

    Run the following command to delete the server. For details about the syntax, see DROP SERVER.

    +
    DROP SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca;
    +

    The foreign server is deleted if the following information is displayed:

    +
    DROP SERVER
    +

    View the foreign server.

    +
    SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca';
    +

    The server is successfully deleted if the returned result is as follows:

    +
     srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions
    +---------+----------+--------+---------+------------+--------+------------
    +(0 rows)
    +

  3. Delete the customized database.

    Connect to the default database gaussdb through the database client tool provided by GaussDB(DWS).

    +

    If you have logged in to the database using the gsql client, run the following command to switch the database and user:

    +
    \c gaussdb
    +

    Enter your password as prompted.

    +

    Run the following command to delete the customized database:

    +
    DROP DATABASE mydatabase;
    +

    The database is deleted if the following information is displayed:

    +
    DROP DATABASE
    +

  4. Delete the common user created in this example as the administrator.

    Connect to the database as a database administrator through the database client tool provided by GaussDB(DWS).

    +

    If you have logged in to the database using the gsql client, run the following command to switch the database and user:

    +
    \c gaussdb dbadmin
    +
    Run the following command to reclaim the permission for creating foreign servers:
    REVOKE ALL ON FOREIGN DATA WRAPPER hdfs_fdw FROM dbuser;
    +
    +

    The name of FOREIGN DATA WRAPPER must be hdfs_fdw. dbuser is the username for creating SERVER.

    +

    Run the following command to delete the user:

    +
    DROP USER dbuser;
    +

    You can run the \du command to query for the user and check whether the user has been deleted.

    +

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0217.html b/docs/dws/dev/dws_04_0217.html new file mode 100644 index 00000000..fa8067fe --- /dev/null +++ b/docs/dws/dev/dws_04_0217.html @@ -0,0 +1,13 @@ + + +

Error Handling

+

The following error information indicates that GaussDB(DWS) is to read an ORC data file but the actual file is in text format. Therefore, create a table of the Hive ORC type and store the data to the table.

+
ERROR:  dn_6009_6010: Error occurs while creating an orc reader for file /user/hive/warehouse/products_info.txt, detail can be found in dn log of dn_6009_6010.
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0219.html b/docs/dws/dev/dws_04_0219.html new file mode 100644 index 00000000..2a2b1daf --- /dev/null +++ b/docs/dws/dev/dws_04_0219.html @@ -0,0 +1,15 @@ + + +

Using CDM to Migrate Data to GaussDB(DWS)

+

You can use CDM to migrate data from other data sources (for example, MySQL) to the databases in clusters on GaussDB(DWS).

+ + +

For details about scenarios where CDM is used to migrate data to GaussDB(DWS), see the following sections of Cloud Data Migration User Guide:

+
  • Getting Started: describes how to use CDM to migrate local MySQL databases to GaussDB(DWS).
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0228.html b/docs/dws/dev/dws_04_0228.html new file mode 100644 index 00000000..797e1b5b --- /dev/null +++ b/docs/dws/dev/dws_04_0228.html @@ -0,0 +1,188 @@ + + +

Checking for Data Skew

+

Scenarios

Data skew causes the query performance to deteriorate. Before importing all the data from a table consisting of over 10 million records, you are advised to import some of the data and check whether data skew occurs and whether the distribution keys need to be changed. Troubleshoot the problems if any. It is costly to address data skew and change the distribution keys after a large amount of data has been imported.

+
+

Background

GaussDB(DWS) uses a massively parallel processing (MPP) system of the shared-nothing architecture. The MPP performs horizontal partitioning to store tuples in service data tables on all DNs using proper distribution policies.

+

The following user table distribution policies are supported:

+
  • Replication: stores a full table on each DN. You are advised to use the replication mode for tables containing a small volume of data.
  • Hash: A distribution key must be specified for a user table. When a record is inserted, the system hashes it based on the distribution key and then stores it on the corresponding DN. You are advised to use the hash distribution policy for tables with a large volume of data.
+
+

If an inappropriate distribution key is used, data skew may occur when you use the hash policy. Check for data skew when you use the hash distribution policy so that data can be evenly distributed to each DN. You are advised to use the column with few replicated values as the distribution key.

+

Procedure

  1. Analyze data source features and select candidate distribution columns that have more distinct values and evenly distributed data.
  2. Select a candidate column from 1 to create a target table.

    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name 
    +    ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
    +    | table_constraint    | LIKE source_table [ like_option [...] ] }
    +    [, ... ])    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    +    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    +    [ COMPRESS | NOCOMPRESS ]    [ TABLESPACE tablespace_name ]
    +    [ DISTRIBUTE BY { REPLICATION 
    +  
    +                    | { HASH ( column_name [,...] ) } } ];
    +
    + +
    +

  3. Import a small batch of data to the target table.

    When importing a single data file, you can evenly split this file and import a part of it to check for the data skew in the target table.

    +

  4. Check for data skew. (Replace table_name with the actual table name.)

    1
    SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
    +
    + +
    +

  5. If the data distribution deviation is less than 10% across DNs, data is evenly distributed and an appropriate distribution key has been selected. Delete the small batch of imported data and import full data to complete data migration.

    If data distribution deviation across DNs is greater than or equal to 10%, data skew occurs. Remove this distribution key from the candidates in 1, delete the target table, and repeat 2 through 5.

    +

    The data distribution deviation indicates the difference between the actual data volume on DNs and the average data volume on DNs.

    +
    +

  6. (Optional) If you fail to select an appropriate distribution key after performing the preceding steps, select multiple columns from the candidates as distribution keys.
+

+
+

Examples

Assume you want to select an appropriate distribution key for the staffs table.

+
  1. Analyze the source data for the staffs table and select the staff_ID, FIRST_NAME, and LAST_NAME columns as candidate distribution keys.
  2. Select the staff_ID column as the distribution key and create the target table staffs.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    CREATE TABLE staffs
    +(
    +  staff_ID       NUMBER(6) not null,
    +  FIRST_NAME     VARCHAR2(20),
    +  LAST_NAME      VARCHAR2(25),
    +  EMAIL          VARCHAR2(25),
    +  PHONE_NUMBER   VARCHAR2(20),
    +  HIRE_DATE      DATE,
    +  employment_ID  VARCHAR2(10),
    +  SALARY         NUMBER(8,2),
    +  COMMISSION_PCT NUMBER(2,2),
    +  MANAGER_ID     NUMBER(6),
    +  section_ID     NUMBER(4)
    +)   
    +DISTRIBUTE BY hash(staff_ID);
    +
    + +
    +
  3. Import a small batch of data to the target table staffs.
    There are eight DNs in the cluster based on the following query, and you are advised to import 80,000 records.
    1
    +2
    +3
    +4
    +5
    SELECT count(*) FROM pgxc_node where node_type='D';
    + count 
    +-------
    +     8
    +(1 row)
    +
    + +
    +
    +
  4. Verify the data skew of the target table staffs whose distribution key is staff_ID:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
    +count | node_name
    +------+-----------
    +11010 | datanode4
    +10000 | datanode3
    +12001 | datanode2
    + 8995 | datanode1
    +10000 | datanode5
    + 7999 | datanode6
    + 9995 | datanode7
    +10000 | datanode8
    +(8 rows)
    +
    + +
    +
  5. The preceding query result indicates that the distribution deviation across DNs is greater than 10%. The data skew occurs. Therefore, delete staff_ID from the distribution key candidates and delete the staffs table.
    1
    DROP TABLE staffs;
    +
    + +
    +
  6. Use staff_ID, FIRST_NAME, and LAST_NAME as distribution keys and create the target table staffs.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    CREATE TABLE staffs
    +(  
    +  staff_ID       NUMBER(6) not null,
    +  FIRST_NAME     VARCHAR2(20),
    +  LAST_NAME      VARCHAR2(25),
    +  EMAIL          VARCHAR2(25),
    +  PHONE_NUMBER   VARCHAR2(20),
    +  HIRE_DATE      DATE,
    +  employment_ID  VARCHAR2(10),
    +  SALARY         NUMBER(8,2),
    +  COMMISSION_PCT NUMBER(2,2),
    +  MANAGER_ID     NUMBER(6),
    +  section_ID     NUMBER(4)
    +) 
    +DISTRIBUTE BY hash(staff_ID,FIRST_NAME,LAST_NAME);
    +
    + +
    +
  7. Verify the data skew of the target table staffs whose distribution keys are staff_ID, FIRST_NAME, and LAST_NAME.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    SELECT a.count,b.node_name FROM (select count(*) as count,xc_node_id FROM staffs GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc;
    +count | node_name
    +------+-----------
    +10010 | datanode4
    +10000 | datanode3
    +10001 | datanode2
    + 9995 | datanode1
    +10000 | datanode5
    + 9999 | datanode6
    + 9995 | datanode7
    +10000 | datanode8
    +(8 rows)
    +
    + +
    +
  8. The preceding query result indicates that the data deviation across DNs is less than 10%. The data is evenly distributed and the appropriate distribution keys have been selected.
  9. Delete the imported small-batch data.
    1
    TRUNCATE TABLE staffs;
    +
    + +
    +
  10. Import the full data to complete data migration.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0243.html b/docs/dws/dev/dws_04_0243.html new file mode 100644 index 00000000..24f3d0a0 --- /dev/null +++ b/docs/dws/dev/dws_04_0243.html @@ -0,0 +1,60 @@ + + +

Preparing Data on OBS

+

Scenarios

Before you use the SQL on OBS feature to query OBS data:

+
  1. You have stored the ORC data on OBS.

    For example, the ORC table has been created when you use the Hive or Spark component, and the ORC data has been stored on OBS.

    +

    Assume that there are two ORC data files, named product_info.0 and product_info.1, whose original data is stored in the demo.db/product_info_orc/ directory of the mybucket OBS bucket. You can view their original data in Original Data.

    +
  2. If your data files are already on OBS, perform steps in Obtaining the OBS Path of Original Data and Setting Read Permission.

    This section uses the ORC format as an example to describe how to import data. The method for importing CarbonData data is similar.

    +
    +
+
+

Original Data

Assume that you have stored the two ORC data files on OBS and their original data is as follows:

+
  • Data file product_info.0

    The file contains the following data:

    +
    1
    +2
    +3
    +4
    +5
    100,XHDK-A-1293-#fJ3,2017-09-01,A,2017 Autumn New Shirt Women,red,M,328,2017-09-04,715,good!
    +205,KDKE-B-9947-#kL5,2017-09-01,A,2017 Autumn New Knitwear Women,pink,L,584,2017-09-05,406,very good!
    +300,JODL-X-1937-#pV7,2017-09-01,A,2017 autumn new T-shirt men,red,XL,1245,2017-09-03,502,Bad.
    +310,QQPX-R-3956-#aD8,2017-09-02,B,2017 autumn new jacket women,red,L,411,2017-09-05,436,It's really super nice.
    +150,ABEF-C-1820-#mC6,2017-09-03,B,2017 Autumn New Jeans Women,blue,M,1223,2017-09-06,1200,The seller's packaging is exquisite.
    +
    + +
    +
  • Data file product_info.1

    The file contains the following data:

    +
    1
    +2
    +3
    +4
    +5
    200,BCQP-E-2365-#qE4,2017-09-04,B,2017 autumn new casual pants men,black,L,997,2017-09-10,301,The clothes are of good quality.
    +250,EABE-D-1476-#oB1,2017-09-10,A,2017 autumn new dress women,black,S,841,2017-09-15,299,Follow the store for a long time.
    +108,CDXK-F-1527-#pL2,2017-09-11,A,2017 autumn new dress women,red,M,85,2017-09-14,22,It's really amazing to buy.
    +450,MMCE-H-4728-#nP9,2017-09-11,A,2017 autumn new jacket women,white,M,114,2017-09-14,22,Open the package and the clothes have no odor.
    +260,OCDA-G-2817-#bD3,2017-09-12,B,2017 autumn new woolen coat women,red,L,2004,2017-09-15,826,Very favorite clothes.
    +
    + +
    +
+
+

Obtaining the OBS Path of Original Data and Setting Read Permission

  1. Log in to the OBS management console.

    Click Service List and choose Object Storage Service to open the OBS management console.

    +

  2. Obtain the OBS path for storing source data files.

    After the source data files are uploaded to an OBS bucket, a globally unique access path is generated. You need to specify the OBS paths of source data files when creating a foreign table.

    +

    For details about how to view an OBS path, see "OBS Console Operation Guide > Managing Objects > Accessing an Object Using Its Object URL" in the Object Storage Service User Guide.

    +

    For example, the OBS paths are as follows:

    +
    1
    +2
    https://obs.xxx.com/mybucket/demo.db/product_info_orc/product_info.0
    +https://obs.xxx.com/mybucket/demo.db/product_info_orc/product_info.1
    +
    + +
    +

  3. Grant the OBS bucket read permission for the user.

    The user who executes the SQL on OBS function needs to obtain the read permission on the OBS bucket where the source data file is located. You can configure the ACL for the OBS buckets to grant the read permission to a specific user.

    +

    For details, see "OBS Console Operation Guide > Permission Control > Configuring a Bucket ACL" in the Object Storage Service User Guide.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0244.html b/docs/dws/dev/dws_04_0244.html new file mode 100644 index 00000000..3397c901 --- /dev/null +++ b/docs/dws/dev/dws_04_0244.html @@ -0,0 +1,194 @@ + + +

Creating a Foreign Server

+

This section describes how to create a foreign server that is used to define the information about OBS servers and is invoked by foreign tables. For details about the syntax for creating foreign servers, see CREATE SERVER.

+

(Optional) Creating a User and a Database and Granting the User Foreign Table Permissions

Common users do not have permissions to create foreign servers and tables. If you want to use a common user to create foreign servers and tables in a customized database, perform the following steps to create a user and a database, and grant the user foreign table permissions.

+

In the following example, a common user dbuser and a database mydatabase are created. Then, an administrator is used to grant foreign table permissions to user dbuser.

+
  1. Connect to the default database gaussdb as a database administrator through the database client tool provided by GaussDB(DWS).

    For example, use the gsql client to connect to the database by running the following command:

    +
    1
    gsql -d gaussdb -h 192.168.2.30 -U dbadmin -p 8000 -W password -r
    +
    + +
    +

  2. Create a common user and use it to create a database.

    Create a user named dbuser that has the permission to create databases.

    +
    1
    CREATE USER dbuser WITH CREATEDB PASSWORD 'password';
    +
    + +
    +
    Switch to the created user.
    1
    SET ROLE dbuser PASSWORD 'password';
    +
    + +
    +
    +
    Run the following command to create the database demo:
    1
    CREATE DATABASE mydatabase;
    +
    + +
    +
    +

    Query the database.

    +
    1
    SELECT * FROM pg_database;
    +
    + +
    +

    The database is successfully created if the returned result contains information about mydatabase.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    datname   | datdba | encoding | datcollate | datctype | datistemplate | datallowconn | datconnlimit | datlastsysoid | datfrozenxid | dattablespace | datcompatibility |                       datacl
    +
    +------------+--------+----------+------------+----------+---------------+--------------+--------------+---------------+--------------+---------------+------------------+--------------------------------------
    +--------------
    + template1  |     10 |        0 | C          | C        | t             | t            |           -1 |         14146 |         1351 |          1663 | ORA              | {=c/Ruby,Ruby=CTc/Ruby}
    + template0  |     10 |        0 | C          | C        | t             | f            |           -1 |         14146 |         1350 |          1663 | ORA              | {=c/Ruby,Ruby=CTc/Ruby}
    + gaussdb   |     10 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1352 |          1663 | ORA              | {=Tc/Ruby,Ruby=CTc/Ruby,chaojun=C/Ruby,hu
    +obinru=C/Ruby}
    + mydatabase |  17000 |        0 | C          | C        | f             | t            |           -1 |         14146 |         1351 |          1663 | ORA              |
    +(4 rows)
    +
    + +
    +

  3. Grant the permissions for creating foreign servers and using foreign tables to a common user as the administrator.

    Connect to the new database as a database administrator through the database client tool provided by GaussDB(DWS).

    +

    You can use the gsql client to run the following command to switch to an administrator user and connect to the new database:

    +
    1
    \c mydatabase dbadmin;
    +
    + +
    +

    Enter the password of the system administrator as prompted.

    +

    Note that you must use the administrator account to connect to the database where a foreign server is to be created and foreign tables are used; and then grant permissions to the common user.

    +
    +
    By default, only system administrators can create foreign servers. Common users can create foreign servers only after being authorized. Run the following command to grant the permission:
    1
    +2
    GRANT ALL ON SCHEMA public TO dbuser;
    +GRANT ALL ON FOREIGN DATA WRAPPER dfs_fdw TO dbuser;
    +
    + +
    +
    +

    where fdw_name can be hdfs_fdw or dfs_fdw, and dbuser is the name of the user who creates SERVER.

    +

    Run the following command to grant the user the permission to use foreign tables:

    +
    1
    ALTER USER dbuser USEFT;
    +
    + +
    +

    Query for the user.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    SELECT r.rolname, r.rolsuper, r.rolinherit,
    +  r.rolcreaterole, r.rolcreatedb, r.rolcanlogin,
    +  r.rolconnlimit, r.rolvalidbegin, r.rolvaliduntil,
    +  ARRAY(SELECT b.rolname
    +        FROM pg_catalog.pg_auth_members m
    +        JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
    +        WHERE m.member = r.oid) as memberof
    +, r.rolreplication
    +, r.rolauditadmin
    +, r.rolsystemadmin
    +, r.roluseft
    +FROM pg_catalog.pg_roles r
    +ORDER BY 1;
    +
    + +
    +

    The authorization is successful if the dbuser information in the returned result contains the UseFT permission.

    +
    1
    +2
    +3
    +4
    +5
    rolname  | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolconnlimit | rolvalidbegin | rolvaliduntil | memberof | rolreplication | rolauditadmin | rolsystemadmin | roluseft
    +-----------+----------+------------+---------------+-------------+-------------+--------------+---------------+---------------+----------+----------------+---------------+----------------+----------
    + dbuser    | f        | t          | f             | t           | t           |           -1 |               |               | {}       | f              | f             | f              | t
    + lily      | f        | t          | f             | f           | t           |           -1 |               |               | {}       | f              | f             | f              | f
    + Ruby       | t        | t          | t             | t           | t           |           -1 |               |               | {}       | t              | t             | t              | t  
    +
    + +
    +

+
+

Creating a Foreign Server

  1. Use the user who is about to create a foreign server to connect to the corresponding database.

    In this example, use common user dbuser created in (Optional) Creating a User and a Database and Granting the User Foreign Table Permissions to connect to mydatabase created by the user. You need to connect to the database through the database client tool provided by GaussDB(DWS).

    +

    You can use the gsql client to log in to the database in either of the following ways:

    +
    • If you have logged in to the gsql client, run the following command to switch the database and user:
      1
      \c mydatabase dbuser;
      +
      + +
      +

      Enter the password as prompted.

      +
    • If you have not logged in to the gsql client or have exited the gsql client by running the \q command, run the following command to reconnect to it:
      1
      gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r
      +
      + +
      +

      Enter the password as prompted.

      +
    +

  2. Create a foreign server.

    For details about the syntax for creating foreign servers, see CREATE SERVER.

    +

    For example, run the following command to create a foreign server named obs_server.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    CREATE SERVER obs_server FOREIGN DATA WRAPPER dfs_fdw 
    +OPTIONS ( 
    +  address 'obs.otc.t-systems.com' , 
    +  ACCESS_KEY 'access_key_value_to_be_replaced', 
    +  SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced', 
    +  encrypt 'on', 
    +  type 'obs' 
    +);
    +
    + +
    +

    Mandatory parameters are described as follows:

    +
    • Name of the foreign server

      You can customize a name.

      +

      In this example, the name is set to obs_server.

      +
    • FOREIGN DATA WRAPPER

      fdw_name can be hdfs_fdw or dfs_fdw, which already exists in the database.

      +
    • OPTIONS parameters
      • address

        Specifies the endpoint of the OBS service.

        +

        Obtain the address as follows:

        +
        1. Obtain the OBS path by performing 2 in Preparing Data on OBS.
        2. The OBS endpoint viewed on the OBS is obs.xxx.xxx.com.
        +
      • (Mandatory) Access keys (AK and SK)
        GaussDB(DWS) needs to use the access keys (AK and SK) to access OBS. Therefore, you must obtain the access keys first.
        • (Mandatory) access_key: specifies users' AK information.
        • (Mandatory) secret_access_key: specifies users' SK information.
        +
        +

        For details about how to obtain the access keys, see Creating Access Keys (AK and SK).

        +
      • type

        Its value is obs, which indicates that dfs_fdw connects to OBS.

        +
      +
    +

  3. View the foreign server.

    1
    SELECT * FROM pg_foreign_server WHERE srvname='obs_server';
    +
    + +
    +

    The server is successfully created if the returned result is as follows:

    +
    1
    +2
    +3
    +4
    +5
    +6
      srvname   | srvowner | srvfdw | srvtype | srvversion | srvacl |                                                                                      srvoptions
    +
    +------------+----------+--------+---------+------------+--------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +-----------
    + obs_server |    24661 |  13686 |         |            |        | {address=xxx.xxx.x.xxx,access_key=xxxxxxxxxxxxxxxxxxxx,type=obs,secret_access_key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
    +(1 row)
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0245.html b/docs/dws/dev/dws_04_0245.html new file mode 100644 index 00000000..b40778fa --- /dev/null +++ b/docs/dws/dev/dws_04_0245.html @@ -0,0 +1,152 @@ + + +

Creating a Foreign Table

+

After performing steps in Creating a Foreign Server, create an OBS foreign table in the GaussDB(DWS) database to access the data stored in OBS. An OBS foreign table is read-only. It can only be queried using SELECT.

+

Creating a Foreign Table

The syntax for creating a foreign table is as follows. For details, see the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name 
+( [ { column_name type_name 
+    [ { [CONSTRAINT constraint_name] NULL |
+    [CONSTRAINT constraint_name] NOT NULL |
+      column_constraint [...]} ] |
+      table_constraint [, ...]} [, ...] ] ) 
+    SERVER dfs_server 
+    OPTIONS ( { option_name ' value ' } [, ...] ) 
+    DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
+    [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
+
+ +
+

For example, when creating a foreign table named product_info_ext_obs, set parameters in the syntax as follows:

+
  • table_name

    Specifies the name of the foreign table to be created.

    +
  • Table column definitions
    • column_name: specifies the name of a column in the foreign table.
    • type_name: specifies the data type of the column.
    +

    Multiple columns are separate by commas (,).

    +

    The number of fields and field types in the foreign table must be the same as those in the data stored on OBS.

    +
  • SERVER dfs_server

    This parameter specifies the foreign server name of the foreign table. This server must exist. The foreign server connects to OBS to read data by setting its foreign server.

    +

    Enter the name of the foreign server created by following steps in Creating a Foreign Server.

    +
  • OPTIONS parameters

    These are parameters associated with the foreign table. The key parameters are as follows:

    +
    • format: indicates the file format on OBS. The ORC and CarbonData formats are supported.
    • foldername: This parameter is mandatory. It indicates the OBS path of the data source file. You only need to enter /Bucket name/Folder directory level/.

      You can perform 2 in Preparing Data on OBS to obtain the complete OBS path of the data source file. The path is the endpoint of the OBS service.

      +
    • totalrows: This parameter is optional. It does not indicate the total rows of the imported data. Because OBS may store many files, it is slow to analyze data. This parameter allows you to set an estimated value so that the optimizer can estimate the table size according to the value. Generally, query efficiency is relatively high when the estimated value is almost the same as the actual value.
    • encoding: encoding of data source files in foreign tables. The default value is utf8. This parameter is mandatory for OBS foreign tables.
    +
  • DISTRIBUTE BY:

    This clause is mandatory. Currently, OBS foreign tables support only the ROUNDROBIN distribution mode.

    +

    It indicates that when a foreign table reads data from the data source, each node in the GaussDB(DWS) cluster randomly reads some data and integrates the random data to a complete data set.

    +
  • Other parameters in the syntax

    Other parameters are optional. You can set them as required. In this example, you do not need to set these parameters.

    +
+

Based on the preceding settings, the command for creating the foreign table is as follows:

+
Create an OBS foreign table that does not contain partition columns. The foreign server associated with the table is obs_server, the file format on OBS corresponding to the table is ORC, and the data storage path on OBS is/mybucket/data/.
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;
+CREATE FOREIGN TABLE product_info_ext_obs
+(
+    product_price                integer        not null,
+    product_id                   char(30)       not null,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)                      
+) SERVER obs_server 
+OPTIONS (
+format 'orc', 
+foldername '/mybucket/demo.db/product_info_orc/',
+encoding 'utf8',
+totalrows '10'
+) 
+DISTRIBUTE BY ROUNDROBIN;
+
+ +
+
+
+

Create an OBS foreign table that contains partition columns. The product_info_ext_obs foreign table uses the product_manufacturer column as the partition key. The following partition directories exist in obs/mybucket/demo.db/product_info_orc/:

+

Partition directory 1: product_manufacturer=10001

+

Partition directory 2: product_manufacturer=10010

+

Partition directory 3: product_manufacturer=10086

+
...
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;
+CREATE FOREIGN TABLE product_info_ext_obs
+(
+    product_price                integer        not null,
+    product_id                   char(30)       not null,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)   ,
+    product_manufacturer	 integer
+) SERVER obs_server 
+OPTIONS (
+format 'orc', 
+foldername '/mybucket/demo.db/product_info_orc/',
+encoding 'utf8',
+totalrows '10'
+) 
+DISTRIBUTE BY ROUNDROBIN
+PARTITION BY (product_manufacturer) AUTOMAPPED;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0246.html b/docs/dws/dev/dws_04_0246.html new file mode 100644 index 00000000..47be1e70 --- /dev/null +++ b/docs/dws/dev/dws_04_0246.html @@ -0,0 +1,81 @@ + + +

Querying Data on OBS Through Foreign Tables

+

Viewing Data on OBS by Directly Querying the Foreign Table

If the data amount is small, you can directly run SELECT to query the foreign table and view the data on OBS.

+
  1. Run the following command to query data from the foreign table:

    1
    SELECT * FROM product_info_ext_obs;
    +
    + +
    +

    If the query result is the same as the data in Original Data, the import is successful. The following information is displayed at the end of the query result:

    +
    (10 rows)
    +

    After data is queried, you can insert the data to common tables in the database.

    +

+
+

Querying Data After Importing It

  1. Create a table in GaussDB(DWS) to store imported data.

    The target table structure must be the same as the structure of the foreign table created in Creating a Foreign Table. That is, both tables must have the same number of columns and column types.

    +

    For example, create a table named product_info. The table example is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    DROP TABLE IF EXISTS product_info;
    +
    +CREATE TABLE product_info
    +(
    +    product_price                integer        not null,
    +    product_id                   char(30)       not null,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    integer        ,
    +    product_comment_time         date           ,
    +    product_comment_num          integer        ,
    +    product_comment_content      varchar(200)                   
    +) 
    +with (
    +orientation = column,
    +compression=middle
    +) 
    +DISTRIBUTE BY HASH (product_id);
    +
    + +
    +

  2. Run the INSERT INTO.. SELECT .. command to import data from the foreign table to the target table.

    Example:

    +
    1
    INSERT INTO product_info SELECT * FROM product_info_ext_obs;
    +
    + +
    +
    If information similar to the following is displayed, the data has been imported.
    INSERT 0 10
    +
    +

  3. Run the following SELECT command to view data imported from OBS to GaussDB(DWS):

    1
    SELECT * FROM product_info;
    +
    + +
    +

    If the query result is the same as the data in Original Data, the import is successful. The following information is displayed at the end of the query result:

    +
    (10 rows)
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0247.html b/docs/dws/dev/dws_04_0247.html new file mode 100644 index 00000000..45181910 --- /dev/null +++ b/docs/dws/dev/dws_04_0247.html @@ -0,0 +1,88 @@ + + +

Deleting Resources

+

After completing operations in this tutorial, if you no longer need to use the resources created during the operations, you can delete them to avoid resource waste or quota occupation. The procedure is as follows:

+
  1. Deleting the Foreign Table and Target Table
  2. Deleting the Created Foreign Server
  3. Deleting the Database and the User to Which the Database Belongs

    If you have performed steps in (Optional) Creating a User and a Database and Granting the User Foreign Table Permissions, delete the database and the user to which the database belongs.

    +
+

Deleting the Foreign Table and Target Table

  1. (Optional) If you have performed steps in Querying Data After Importing It, run the following command to delete the target table:

    1
    DROP TABLE product_info;
    +
    + +
    +

    If the following information is displayed, the table has been deleted.

    +
    DROP TABLE
    +

  2. Run the following statement to delete the foreign table:

    1
    DROP FOREIGN TABLE product_info_ext_obs;
    +
    + +
    +

    If the following information is displayed, the table has been deleted.

    +
    DROP FOREIGN TABLE
    +

+
+

Deleting the Created Foreign Server

  1. Use the user who created the foreign server to connect to the database where the foreign server is located.

    In this example, common user dbuser is used to create the foreign server in mydatabase. You need to connect to the database through the database client tool provided by GaussDB(DWS). You can use the gsql client to log in to the database in either of the following ways:

    +
    • If you have logged in to the gsql client, run the following command to switch the database and user:
      1
      \c mydatabase dbuser;
      +
      + +
      +

      Enter the password as prompted.

      +
    • If you have logged in to the gsql client, you can run the \q command to exit gsql, and run the following command to reconnect to it:
      1
      gsql -d mydatabase -h 192.168.2.30 -U dbuser -p 8000 -r
      +
      + +
      +

      Enter the password as prompted.

      +
    +

  2. Delete the created foreign server.

    Run the following command to delete the server. For details about the syntax, see DROP SERVER.

    +
    1
    DROP SERVER obs_server;
    +
    + +
    +

    The database is deleted if the following information is displayed:

    +
    DROP SERVER
    +

    View the foreign server.

    +
    1
    SELECT * FROM pg_foreign_server WHERE srvname='obs_server';
    +
    + +
    +

    The server is successfully deleted if the returned result is as follows:

    +
     srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions
    +---------+----------+--------+---------+------------+--------+------------
    +(0 rows)
    +

+
+

Deleting the Database and the User to Which the Database Belongs

If you have performed steps in (Optional) Creating a User and a Database and Granting the User Foreign Table Permissions, perform the following steps to delete the database and the user to which the database belongs.

+
  1. Delete the customized database.

    Connect to the default database gaussdb through the database client tool provided by GaussDB(DWS).

    +

    If you have logged in to the database using the gsql client, run the following command to switch the database and user:

    +

    Switch to the default database.

    +
    \c gaussdb
    +

    Enter your password as prompted.

    +

    Run the following command to delete the customized database:

    +
    1
    DROP DATABASE mydatabase;
    +
    + +
    +

    The database is deleted if the following information is displayed:

    +
    DROP DATABASE
    +

  2. Delete the common user created in this example as the administrator.

    Connect to the database as a database administrator through the database client tool provided by GaussDB(DWS).

    +

    If you have logged in to the database using the gsql client, run the following command to switch the database and user:

    +
    \c gaussdb dbadmin
    +
    Run the following command to reclaim the permission for creating foreign servers:
    1
    REVOKE ALL ON FOREIGN DATA WRAPPER dfs_fdw FROM dbuser;
    +
    + +
    +
    +

    The name of FOREIGN DATA WRAPPER must be dfs_fdw. dbuser is the username for creating SERVER.

    +

    Run the following command to delete the user:

    +
    1
    DROP USER dbuser;
    +
    + +
    +

    You can run the \du command to query for the user and check whether the user has been deleted.

    +

+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0249.html b/docs/dws/dev/dws_04_0249.html new file mode 100644 index 00000000..30f0a5d9 --- /dev/null +++ b/docs/dws/dev/dws_04_0249.html @@ -0,0 +1,19 @@ + + +

Data Export

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0250.html b/docs/dws/dev/dws_04_0250.html new file mode 100644 index 00000000..645127e4 --- /dev/null +++ b/docs/dws/dev/dws_04_0250.html @@ -0,0 +1,19 @@ + + +

Exporting Data to OBS

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0251.html b/docs/dws/dev/dws_04_0251.html new file mode 100644 index 00000000..74feb2b1 --- /dev/null +++ b/docs/dws/dev/dws_04_0251.html @@ -0,0 +1,73 @@ + + +

Parallel OBS Data Export

+

Overview

GaussDB(DWS) databases allow you to export data in parallel using OBS foreign tables, in which the export mode and the exported data format are specified. Data is exported in parallel through multiple DNs from GaussDB(DWS) to the OBS server, improving the overall export performance.
  • The CN only plans data export tasks and delivers the tasks to DNs. In this case, the CN is released to process external requests.
  • The computing capability and bandwidth of all the DNs are fully leveraged to export data.
  • You can concurrently export data using multiple OBS services, but the bucket and object paths specified for the export tasks must be different and cannot be null.
  • The OBS server connects to GaussDB(DWS) cluster nodes. The export rate is affected by the network bandwidth.
  • The TEXT and CSV data file formats are supported. The size of data in a single row must be less than 1 GB.
  • Data in ORC format is supported only by 8.1.0 or later.
+
+
+

Related Concepts

  • Source data file: a TEXT or CSV file that stores data.
  • OBS: a cloud storage service used to store unstructured data, such as documents, images, and videos. Data objects concurrently exported from GaussDB(DWS) are stored on the OBS server.
  • Bucket: a container storing objects on OBS.
    • Object storage is a flat storage mode. Layered file system structures are not needed because all objects in buckets are at the same logical layer.
    • In OBS, each bucket name must be unique and cannot be changed. A default access control list (ACL) is created with a bucket. Each item in the ACL contains permissions granted to certain users, such as READ, WRITE, and FULL_CONTROL. Only authorized users can perform bucket operations, such as creating, deleting, viewing, and setting ACLs for buckets.
    • A user can create a maximum of 100 buckets. The total data size and the number of objects and files in each bucket are not limited.
    +
  • Object: a basic data storage unit in OBS. Data uploaded by users is stored in OBS buckets as objects. Object attributes include Key, Metadata, and Data.

    Generally, objects are managed as files. However, OBS has no file system–related concepts, such as files and folders. To let users easily manage data, OBS allows them to simulate folders. Users can add a slash (/) in the object name, for example, tpcds1000/stock.csv. In this name, tpcds1000 is regarded as the folder name and stock.csv the file name. The value of key (object name) is still tpcds1000/stock.csv, and the content of the object is the content of the stock.csv file.

    +
  • Key: name of an object. It is a UTF-8 character sequence containing 1 to 1024 characters. A key value must be unique in a bucket. Users can name the objects they stored or obtained as Bucket name+Object name.
  • Metadata: object metadata, which contains information about the object. There are system metadata and user metadata. The metadata is uploaded to OBS as key-value pairs together with HTTP headers.
    • System metadata is generated by OBS and used for processing object data. System metadata includes Date, Content-length, last-modify, and Content-MD5.
    • User metadata contains object descriptions specified by users for uploading objects.
    +
  • Data: object content, which is regarded by OBS as stateless binary data.
  • Foreign table: A foreign table is used to identify data in a source data file. It stores information, such as the location, format, destination location, encoding format, and data delimiter of a source data file.
+
+

Principles

The following describes the principles of exporting data from a cluster to OBS by using a distributed hash table or a replication table.

+
  • Distributed hash table: the table for which DISTRIBUTE BY HASH (Column_Name) is specified in the table creation statement.

    A distributed hash table stores data in hash mode. Figure 1 shows how to export data from table (T2) to OBS as an example.

    +

    During table data storage, the col2 hash column in table T2 is hashed, and a hash value is generated. The tuple is distributed to corresponding DNs for storage according to the mapping between the DNs and the hash value.

    +

    When data is exported to OBS, DNs that store the exported data of T2 directly export their data files to OBS. Original data on multiple nodes will be exported in parallel.

    +
    Figure 1 Hash distribution principle
    +
  • Replication table: the table for which DISTRIBUTE BY REPLICATION is specified in the table creation statement.

    A replication table stores a package of complete table data on each GaussDB(DWS) node. When exporting data to OBS, GaussDB(DWS) randomly selects a DN for export.

    +
+
+

Naming Rules of Exported Files

Rules for naming the files exported from GaussDB(DWS) to OBS are as follows:

+
  • Data exported from DNs is stored on OBS in segment format. The file is named as Table name_Node name_segment.n. n is a natural number starting from 0, for example, 0, 1, 2, 3.

    For example, the data of table t1 on datanode3 will be exported as t1_datanode3_segment.0, t1_datanode3_segment.1, and so on.

    +

    You are advised to export data from different clusters or databases to different OBS buckets or different paths of the same OBS bucket.

    +
  • Each segment can store a maximum of 1 GB data, with no tuples sliced. If data stored in a segment exceeds 1 GB, the excess data will be stored in the second segment.

    For example:

    +

    A segment has already stored 100 pieces of tuples (1023 MB) when datanode3 exports data from t1 to OBS. If a 5 MB tuple is inserted to the segment, the data size becomes 1028 MB. In this case, file t1_datanode3_segment.0 (1023 MB) is generated and stored on OBS, and the new tuple is stored on OBS as file t1_datanode3_segment.1.

    +
  • When data is exported from a distributed hash table, the number of segments generated on each DN depends on the data volume stored on a DN, not on the number of DNs in the cluster. Data stored in hash mode may not be evenly distributed on each DN.

    For example, a cluster has DataNode1, DataNode2, DataNode3, DataNode4, DataNode5, and DataNode6, which store 1.5 GB, 0.7 GB, 0.6 GB, 0.8 GB, 0.4 GB, and 0.5 GB data, respectively. Seven OBS segment files will be generated during data export because DataNode1 will generate two segment files, which store 1 GB and 0.5 GB data, respectively.

    +
+
+

Data Export Process

Figure 2 Concurrent data export
+ +
+ + + + + + + + + + + + + + + + + +
Table 1 Process description

Procedure

+

Description

+

Subtask

+

Plan data export.

+

Create an OBS bucket and a folder in the OBS bucket as the directory for storing exported data files.

+

For details, see Planning Data Export.

+

-

+

Create an OBS foreign table.

+

Create a foreign table to help OBS specify information about data files to be exported. The foreign table stores information, such as the destination location, format, encoding, and data delimiter of a source data file.

+

For details, see Creating an OBS Foreign Table.

+

-

+

Export data.

+

After the foreign table is created, run the INSERT statement to efficiently export data to data files.

+

For details, see Exporting Data.

+

+

-

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0252.html b/docs/dws/dev/dws_04_0252.html new file mode 100644 index 00000000..45ca035e --- /dev/null +++ b/docs/dws/dev/dws_04_0252.html @@ -0,0 +1,39 @@ + + +

Planning Data Export

+

Scenarios

Plan the storage location of exported data in OBS.

+
+

Planning OBS Save Path and File

You need to specify the OBS path (to directory) for storing data that you want to export. The exported data can be saved to a file in CSV format. The system also supports TEXT so that you can import the exported data to various applications.

+

The target directory cannot contain any files.

+
+

Planning OBS Bucket Permissions

The user used to export data must:

+ +
+

Planning Data to Be Exported and Foreign Tables

You must prepare data to be exported in the database table, and the data volume per row must be less than 1 GB. Based on the data to be exported, plan foreign tables whose attributes such as columns, column types, and length match those of user data.

+
+

Granting Write Permission to OBS Storage Location and OBS Bucket as Planned

  1. Create an OBS bucket and a folder in the OBS bucket as the directory for storing exported data.

    1. Log in to the OBS management console.

      Click Service List and choose Object Storage Service to open the OBS management console.

      +
    2. Create a bucket.

      For details about how to create an OBS bucket, see "OBS Console Operation Guide > Managing Buckets > Creating a Bucket" in the Object Storage Service User Guide..

      +

      For example, create a bucket named mybucket.

      +
    3. Create a folder.

      In the OBS bucket, create a folder for storing exported data.

      +

      For details, see "OBS Console Operation Guide > Managing Objects > Creating a Folder" in the .

      +

      For example, create a folder named output_data in the created mybucket OBS bucket.

      +
    +

  2. Determine the path of the created OBS folder.

    Specify the OBS path for storing exported data files. This path is the value of the location parameter used for creating a foreign table.

    +

    The OBS folder path in the location parameter consists of obs://, a bucket name, and a file path.

    +

    In this example, the OBS folder path is as follows:

    +
    obs://mybucket/output_data/
    +

    The OBS directory to be used for storing data files must be empty.

    +
    +

  3. Grant the OBS bucket write permission to the user who wants to export data.

    When exporting data, a user must have the write permission on the OBS bucket where the data export path is located. You can configure ACL permissions for the OBS bucket to grant the write permission to a specific user.

    +

    For details, see "OBS Console Operation Guide > Permission Control > Configuring a Bucket ACL" in the Object Storage Service User Guide.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0253.html b/docs/dws/dev/dws_04_0253.html new file mode 100644 index 00000000..6fbdba7f --- /dev/null +++ b/docs/dws/dev/dws_04_0253.html @@ -0,0 +1,141 @@ + + +

Creating an OBS Foreign Table

+

Procedure

  1. Based on the path planned in Planning Data Export, determine the value of the location parameter used for creating a foreign table.
  2. Obtain the access keys (AK and SK) to access OBS.

    To obtain access keys, log in to the management console, click the username in the upper right corner, and select My Credential from the menu. Then choose Access Keys in the navigation tree on the left. On the Access Keys page, you can view the existing AKs or click Add Access Key to create and download access keys.

    +

  3. Examine the formats of data to be exported and determine the values of data format parameters used for creating a foreign table. For details, see data format parameters.
  4. Create an OBS table based on the parameter settings in the preceding steps. For details about how to create a foreign table, see CREATE FOREIGN TABLE (for GDS Import and Export).
+
+

Example 1

For example, in the GaussDB(DWS) database, create a write-only foreign table with the format parameter as text to export text files. Set parameters as follows:

+
  • location

    The OBS path of the source data file has been obtained in Obtain the OBS path for storing source data files in Planning Data Export.

    +

    For example, set location as follows:

    +
    location 'obs://mybucket/output_data/',
    +
  • Access keys (AK and SK)
    • Set access_key to the AK you have obtained.
    • Set secret_access_key to the SK you have obtained.
    +

    access_key and secret_access_key have been obtained during user creation. Replace the italic part with the actual keys.

    +
    +
+
  • Data format parameters
    • Set format to TEXT.
    • Set encoding to UTF-8.
    • Configure encrypt. Its default value is off.
    • Set delimiter to |.
    +
+

Based on the above settings, the foreign table is created using the following statement:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
DROP FOREIGN TABLE IF EXISTS product_info_output_ext1;
+CREATE FOREIGN TABLE product_info_output_ext1
+(
+ c_bigint bigint,
+ c_char char(30),
+ c_varchar varchar(30),
+ c_nvarchar2 nvarchar2(30) ,
+ c_data date,
+ c_time time ,
+ c_test varchar(30)) 
+ server gsmpp_server 
+ options (
+ LOCATION 'obs://mybucket/output_data/', 
+ ACCESS_KEY 'access_key_value_to_be_replaced',
+ SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
+ format 'text',
+ delimiter '|',
+ encoding 'utf-8',
+ encrypt 'on' 
+  )
+ WRITE ONLY;
+
+ +
+

If the following information is displayed, the foreign table has been created:

+
CREATE FOREIGN TABLE
+
+

Example 2:

For example, in the GaussDB(DWS) database, create a write-only foreign table with the format parameter as CSV to export CSV files. Set parameters as follows:

+
  • location

    The OBS path of the source data file has been obtained in Obtain the OBS path for storing source data files in Planning Data Export.

    +

    For example, set location as follows:

    +
    location 'obs://mybucket/output_data/',
    +
  • Access keys (AK and SK)
    • Set access_key to the AK you have obtained.
    • Set secret_access_key to the SK you have obtained.
    +

    access_key and secret_access_key have been obtained during user creation. Replace the italic part with the actual keys.

    +
    +
+
  • Data format parameters
    • Set format to CSV.
    • Set encoding to UTF-8.
    • Configure encrypt. Its default value is off.
    • Set delimiter to ,.
    • Set header (whether the exported data file contains the header row).

      Specifies whether a file contains a header with the names of each column in the file.

      +

      When exporting data from OBS, this parameter cannot be set to true. Use the default value false, indicating that the first row of the exported data file is not the header.

      +
    +
+

Based on the preceding settings, the foreign table is created using the following statements:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
DROP FOREIGN TABLE IF EXISTS product_info_output_ext2;
+CREATE FOREIGN TABLE product_info_output_ext2
+(
+    product_price                integer        not null,
+    product_id                   char(30)       not null,
+    product_time                 date           ,
+    product_level                char(10)       ,
+    product_name                 varchar(200)   ,
+    product_type1                varchar(20)    ,
+    product_type2                char(10)       ,
+    product_monthly_sales_cnt    integer        ,
+    product_comment_time         date           ,
+    product_comment_num          integer        ,
+    product_comment_content      varchar(200)                   
+) 
+SERVER gsmpp_server 
+OPTIONS(
+location 'obs://mybucket/output_data/',
+FORMAT 'CSV' ,
+DELIMITER ',',
+encoding 'utf8',
+header 'false',
+ACCESS_KEY 'access_key_value_to_be_replaced',
+SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
+)
+WRITE ONLY ;
+
+ +
+

If the following information is displayed, the foreign table has been created:

+
CREATE FOREIGN TABLE
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0254.html b/docs/dws/dev/dws_04_0254.html new file mode 100644 index 00000000..831abeae --- /dev/null +++ b/docs/dws/dev/dws_04_0254.html @@ -0,0 +1,30 @@ + + +

Exporting Data

+

Procedure

  1. Export data.

    1
    INSERT INTO [Foreign table name] SELECT * FROM [Source table name];
    +
    + +
    +

+
+

Examples

  • Example 1: Export data from table product_info_output to a data file through the product_info_output_ext foreign table.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output;
    +
    + +
    +
    If information similar to the following is displayed, the data has been exported.
    INSERT 0 10
    +
    +
  • Example 2: Export part of the data to a data file by specifying the filter condition WHERE product_price>500.
    1
    INSERT INTO product_info_output_ext SELECT * FROM product_info_output WHERE product_price>500;
    +
    + +
    +
+
  • The directory to be used for data storage must be empty, or the export will fail.
  • Data of a special type, such as RAW, is exported as a binary file, which cannot be recognized by the import tool. You need to use the RAWTOHEX() function to convert it to the hexadecimal format before export.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0255.html b/docs/dws/dev/dws_04_0255.html new file mode 100644 index 00000000..3d377332 --- /dev/null +++ b/docs/dws/dev/dws_04_0255.html @@ -0,0 +1,265 @@ + + +

Examples

+

Exporting a Table

Create two foreign tables and use them to export tables from a database to two buckets in OBS.

+
  1. Log in to the OBS data server through the management console. On the OBS server, create the buckets /input-data1 and /input-data2 for storing data files, and create data directories /input-data1/data and /input-data2/data, respectively, in the two buckets.
  2. On the GaussDB(DWS) database, create the foreign tables tpcds.customer_address_ext1 and tpcds.customer_address_ext2 for the OBS data server to receive data exported from the database.

    OBS and the database are in the same region. The example GaussDB(DWS) table to be exported is tpcds.customer_address.

    +

    Export information is set as follows:

    +
    • The source data file directories are /input-data1/data/ and /input-data2/data/, so location of tpcds.customer_address_ext1 and tpcds.customer_address_ext2 is set to obs://input-data1/data/ and obs://input-data2/data/, respectively.
    +

    Information about data formats is set based on the detailed data format parameters specified during data export from a database. The parameter settings are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x08'.
    • Configure encrypt. Its default value is off.
    • access_key is set to the AK you have obtained. (mandatory)
    • secret_access_key is set to the SK you have obtained. (mandatory)

      access_key and secret_access_key have been obtained during user creation. Replace the italic part with the actual keys.

      +
      +
    +

    Based on the preceding settings, the foreign table is created using the following statements:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    CREATE FOREIGN TABLE tpcds.customer_address_ext1
    +(
    +ca_address_sk             integer                       ,
    +ca_address_id             char(16)                      ,
    +ca_street_number          char(10)                      ,
    +ca_street_name            varchar(60)                   ,
    +ca_street_type            char(15)                      ,
    +ca_suite_number           char(10)                      ,
    +ca_city                   varchar(60)                   ,
    +ca_county                 varchar(30)                   ,
    +ca_state                  char(2)                       ,
    +ca_zip                    char(10)                      ,
    +ca_country                varchar(20)                   ,
    +ca_gmt_offset             decimal(5,2)                  ,
    +ca_location_type          char(20)
    +)
    +SERVER gsmpp_server
    +OPTIONS(LOCATION 'obs://input-data1/data/',
    +FORMAT 'CSV',
    +ENCODING 'utf8', 
    +DELIMITER E'\x08', 
    +ENCRYPT 'off',
    +ACCESS_KEY 'access_key_value_to_be_replaced',
    +SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' 
    +)Write Only;
    +
    + +
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    CREATE FOREIGN TABLE tpcds.customer_address_ext2
    +(
    +ca_address_sk             integer                       ,
    +ca_address_id             char(16)                      ,
    +ca_street_number          char(10)                      ,
    +ca_street_name            varchar(60)                   ,
    +ca_street_type            char(15)                      ,
    +ca_suite_number           char(10)                      ,
    +ca_city                   varchar(60)                   ,
    +ca_county                 varchar(30)                   ,
    +ca_state                  char(2)                       ,
    +ca_zip                    char(10)                      ,
    +ca_country                varchar(20)                   ,
    +ca_gmt_offset             decimal(5,2)                  ,
    +ca_location_type          char(20)
    +)
    +SERVER gsmpp_server
    +OPTIONS(LOCATION 'obs://input-data2/data/',
    +FORMAT 'CSV',
    +ENCODING 'utf8', 
    +DELIMITER E'\x08', 
    +ENCRYPT 'off',
    +ACCESS_KEY 'access_key_value_to_be_replaced',
    +SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
    +)Write Only;
    +
    + +
    +

  3. In GaussDB(DWS), export the data table tpcds.customer_address to the foreign tables tpcds.customer_address_ext1 and tpcds.customer_address_ext2 concurrently.

    1
    INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address;
    +
    + +
    +
    1
    INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.customer_address;
    +
    + +
    +

    The design of OBS foreign tables does not allow exporting files to a non-empty path. However, in concurrent export scenarios, multiple files are exported to the same path, causing an error.

    +

    Assume that a user concurrently exports data from the same table to the same OBS foreign table, and that one SQL statement is executed to export data when another SQL statement is being executed and has not generated any file on the OBS server. In this case, certain data is overwritten although both SQL statements are successfully executed. Therefore, you are advised not to concurrently export data to the same OBS foreign table.

    +
    +

+
+

Concurrently Exporting Tables

Use the two foreign tables to export tables from the database to two buckets in OBS.

+
  1. Log in to the OBS data server through the management console. On the OBS server, create the buckets /input-data1 and /input-data2 for storing data files, and create data directories /input-data1/data and /input-data2/data, respectively, in the two buckets.
  2. In GaussDB(DWS), create foreign tables tpcds.customer_address_ext1 and tpcds.customer_address_ext2 for the OBS server to receive exported data.

    OBS and the database are in the same region. Tables to be exported are tpcds.customer_address and tpcds.customer_demographics.

    +
    Export information is set as follows:
    • The source data file directories are /input-data1/data/ and /input-data2/data/, so location of tpcds.customer_address_ext1 and tpcds.customer_address_ext2 is set to obs://input-data1/data/ and obs://input-data2/data/, respectively.
    +
    +

    Information about data formats is set based on the detailed data format parameters specified during data export from GaussDB(DWS). The parameter settings are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x08'.
    • Configure encrypt. Its default value is off.
    • access_key is set to the AK you have obtained. (mandatory)
    • secret_access_key is set to the SK you have obtained. (mandatory)

      access_key and secret_access_key have been obtained during user creation. Replace the italic part with the actual keys.

      +
      +
    +

    Based on the preceding settings, the foreign table is created using the following statements:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    CREATE FOREIGN TABLE tpcds.customer_address_ext1
    +(
    +ca_address_sk             integer               ,
    +ca_address_id             char(16)              ,
    +ca_street_number          char(10)                      ,
    +ca_street_name            varchar(60)                   ,
    +ca_street_type            char(15)                      ,
    +ca_suite_number           char(10)                      ,
    +ca_city                   varchar(60)                   ,
    +ca_county                 varchar(30)                   ,
    +ca_state                  char(2)                       ,
    +ca_zip                    char(10)                      ,
    +ca_country                varchar(20)                   ,
    +ca_gmt_offset             decimal(5,2)                  ,
    +ca_location_type          char(20)
    +)
    +SERVER gsmpp_server
    +OPTIONS(LOCATION 'obs://input-data1/data/',
    +FORMAT 'CSV',
    +ENCODING 'utf8', 
    +DELIMITER E'\x08',
    +ENCRYPT 'off',
    +ACCESS_KEY 'access_key_value_to_be_replaced',
    +SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced' 
    +)Write Only;
    +
    + +
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    CREATE FOREIGN TABLE tpcds.customer_address_ext2
    +(
    +ca_address_sk             integer               ,
    +ca_address_id             char(16)              ,
    +ca_address_name           varchar(20)           ,
    +ca_address_code           integer               ,
    +ca_street_number          char(10)                      ,
    +ca_street_name            varchar(60)                   ,
    +ca_street_type            char(15)                      ,
    +ca_suite_number           char(10)                      ,
    +ca_city                   varchar(60)                   ,
    +ca_county                 varchar(30)                   ,
    +ca_state                  char(2)                       ,
    +ca_zip                    char(10)                      ,
    +ca_country                varchar(20)                   ,
    +ca_gmt_offset             decimal(5,2)                  
    +)
    +SERVER gsmpp_server
    +OPTIONS(LOCATION 'obs://input_data2/data/',
    +FORMAT 'CSV',
    +ENCODING 'utf8', 
    +DELIMITER E'\x08', 
    +QUOTE E'\x1b',
    +ENCRYPT 'off',
    +ACCESS_KEY 'access_key_value_to_be_replaced',
    +SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced'
    +)Write Only;
    +
    + +
    +

  3. In GaussDB(DWS), export the data tables tpcds.customer_address and tpcds.warehouse in parallel to the foreign tables tpcds.customer_address_ext1 and tpcds.customer_address_ext2, respectively.

    1
    INSERT INTO tpcds.customer_address_ext1 SELECT * FROM tpcds.customer_address;
    +
    + +
    +
    1
    INSERT INTO tpcds.customer_address_ext2 SELECT * FROM tpcds.warehouse;
    +
    + +
    +

+

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0256.html b/docs/dws/dev/dws_04_0256.html new file mode 100644 index 00000000..60d637b7 --- /dev/null +++ b/docs/dws/dev/dws_04_0256.html @@ -0,0 +1,22 @@ + + +

Exporting ORC Data to OBS

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0258.html b/docs/dws/dev/dws_04_0258.html new file mode 100644 index 00000000..d1ae5d6b --- /dev/null +++ b/docs/dws/dev/dws_04_0258.html @@ -0,0 +1,13 @@ + + +

Planning Data Export

+

For details about exporting data to OBS, see Planning Data Export.

+

For details about the data types that can be exported to OBS, see Table 2.

+

For details about HDFS data export or MRS configuration, see the MapReduce Service User Guide.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0259.html b/docs/dws/dev/dws_04_0259.html new file mode 100644 index 00000000..8c00e4d5 --- /dev/null +++ b/docs/dws/dev/dws_04_0259.html @@ -0,0 +1,12 @@ + + +

Creating a Foreign Server

+

For details about creating a foreign server on OBS, see Creating a Foreign Server.

+

For details about creating a foreign server in HDFS, see Manually Creating a Foreign Server.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0260.html b/docs/dws/dev/dws_04_0260.html new file mode 100644 index 00000000..5c85118a --- /dev/null +++ b/docs/dws/dev/dws_04_0260.html @@ -0,0 +1,109 @@ + + +

Creating a Foreign Table

+

After operations in Creating a Foreign Server are complete, create an OBS/HDFS write-only foreign table in the GaussDB(DWS) database to access data stored in OBS/HDFS. The foreign table is write-only and can be used only for data export.

+
The syntax for creating a foreign table is as follows. For details, see the syntax CREATE FOREIGN TABLE (SQL on Hadoop or OBS).
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name 
+( [ { column_name type_name 
+    [ { [CONSTRAINT constraint_name] NULL |
+    [CONSTRAINT constraint_name] NOT NULL |
+      column_constraint [...]} ] |
+      table_constraint [, ...]} [, ...] ] ) 
+    SERVER dfs_server 
+    OPTIONS ( { option_name ' value ' } [, ...] ) 
+    [ {WRITE ONLY }]
+    DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
+    [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
+
+ +
+
+

For example, when creating a foreign table named product_info_ext_obs, set parameters in the syntax as follows:

+
  • table_name

    Specifies the name of the foreign table to be created.

    +
  • Table column definitions
    • column_name: specifies the name of a column in the foreign table.
    • type_name: specifies the data type of the column.
    +

    Multiple columns are separate by commas (,).

    +
  • SERVER dfs_server

    Specifies the foreign server name of the foreign table. This server must exist. The foreign table connects to OBS/HDFS to read data through the foreign server.

    +

    Set this parameter to the name of the foreign server created in 9.2.3 Creating a Foreign Server.

    +
  • OPTIONS parameters

    These are parameters associated with the foreign table. The key parameters are as follows:

    +
    • format: specifies the format of the exported data file. The ORC format is supported.
    • foldername: (mandatory) specifies the data source file directory in the foreign table. OBS: specifies the OBS path of the source data file. You only need to enter /Bucket name/Folder directory level/, which does not contain the endpoint of OBS. HDFS: specifies the path in the HDFS file system. This parameter is mandatory for the write-only foreign table.
    • encoding: specifies the encoding of the data source file in the foreign table. The default value is utf8.
    • filesize

      (Optional) Specifies the file size of a write-only foreign table. If this parameter is not specified, the file size in the distributed file system configuration is used by default. This syntax is available only for the write-only foreign table.

      +

      Value range: an integer ranging from 1 to 1024

      +

      The filesize parameter is valid only for the ORC-formatted write-only HDFS foreign table.

      +
      +
    • compression

      (Optional) Specifies the compression mode of ORC files. This syntax is available only for the write-only foreign table.

      +

      Value range: zlib, snappy, and lz4 The default value is snappy.

      +
    • version

      (Optional) Specifies the ORC version number. This syntax is available only for the write-only foreign table.

      +

      Value range: Only 0.12 is supported. The default value is 0.12.

      +
    • dataencoding

      (Optional) Specifies the data code of the data table to be exported when the database code is different from the data code of the data table. For example, the database code is Latin-1, but the data in the exported data table is in UTF-8 format. If this parameter is not specified, the database encoding format is used by default. This syntax is valid only for the write-only HDFS foreign table.

      +

      Value range: data code types supported by the database encoding

      +

      The dataencoding parameter is valid only for the ORC-formatted write-only HDFS foreign table.

      +
      +
    +
  • Other parameters in the syntax

    Other parameters are optional. You can set them as required. In this example, you do not need to set these parameters.

    +

    Based on the preceding settings, the command for creating the foreign table is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    DROP FOREIGN TABLE IF EXISTS product_info_ext_obs;
    +
    +-- Create an OBS foreign table that does not contain partition columns. The foreign server associated with the table is obs_server, the file format on OBS corresponding to the table is ORC, and the data storage path on OBS is/mybucket/data/.
    +
    +CREATE FOREIGN TABLE product_info_ext_obs
    +(
    +    product_price                integer        ,
    +    product_id                   char(30)       ,
    +    product_time                 date           ,
    +    product_level                char(10)       ,
    +    product_name                 varchar(200)   ,
    +    product_type1                varchar(20)    ,
    +    product_type2                char(10)       ,
    +    product_monthly_sales_cnt    integer        ,
    +    product_comment_time         date           ,
    +    product_comment_num          integer        ,
    +    product_comment_content      varchar(200)                      
    +) SERVER obs_server 
    +OPTIONS (
    +format 'orc', 
    +foldername '/mybucket/demo.db/product_info_orc/',
    +   compression 'snappy',
    +    version '0.12'
    +) Write Only;
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0261.html b/docs/dws/dev/dws_04_0261.html new file mode 100644 index 00000000..c4778677 --- /dev/null +++ b/docs/dws/dev/dws_04_0261.html @@ -0,0 +1,27 @@ + + +

Using GDS to Export Data to a Remote Server

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0262.html b/docs/dws/dev/dws_04_0262.html new file mode 100644 index 00000000..50175dd9 --- /dev/null +++ b/docs/dws/dev/dws_04_0262.html @@ -0,0 +1,82 @@ + + +

Exporting Data In Parallel Using GDS

+

In high-concurrency scenarios, you can use GDS to export data from a database to a common file system.

+

In the current GDS version, data can be exported from a database to a pipe file.

+
  • If the local disk space of the GDS user is insufficient:
    • The data exported from GDS is compressed using the pipe to occupy less disk space.
    • The exported data is transferred through the pipe to the HDFS server for storage.
    +
  • If you need to cleanse data before exporting data:
    • You can compile programs as needed and read streaming data from pipes in real time.
    +
    • The current version does not support data export through GDS in SSL mode. Do not use GDS in SSL mode.
    • All pipe files mentioned in this section refer to named pipes on Linux.
    +
    +
+

Overview

Using foreign tables: A GDS foreign table specifies the exported file format and export mode. Data is exported in parallel through multiple DNs from the database to data files, which improves the overall data export performance. The data files cannot be directly exported to HDFS.
  • The CN only plans data export tasks and delivers the tasks to DNs. In this case, the CN is released to process other tasks.
  • In this way, the computing capabilities and bandwidths of all the DNs are fully leveraged to export data.
    Figure 1 Exporting data using foreign tables
    +
+
+
+

Related Concepts

  • Data file: A TEXT, CSV, or FIXED file that stores data exported from the GaussDB(DWS) database.
  • Foreign table: A table that stores information, such as the format, location, and encoding format of a data file.
  • GDS: A data service tool. To export data, deploy it on the server where data files are stored.
  • Table: Tables in the database, including row-store tables and column-store tables. Data in the data files is exported from these tables.
  • Remote mode: Service data in a cluster is exported to hosts outside the cluster.
+
+

Exporting a Schema

Data can be exported to GaussDB(DWS) in Remote mode.

+
  • Remote mode: Service data in a cluster is exported to hosts outside the cluster.
    • In this mode, multiple GDSs are used to concurrently export data. One GDS can export data for only one cluster at a time.
    • The data export rate of a GDS that resides on the same intranet as cluster nodes is limited by the network bandwidth. A 10GE configuration is recommended.
    • Data files in TEXT or CSV format are supported. The size of data in a single row must be less than 1 GB.
    +
+
+

Data Export Process

Figure 2 Concurrent data export
+

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Process description

Process

+

Description

+

Subtask

+

Plan data export.

+

Prepare data to be exported and plan the export path for the mode to be selected.

+

For details, see Planning Data Export.

+

-

+

Start GDS.

+

If the Remote mode is selected, install, configure, and start GDS on data servers.

+

For details, see Installing, Configuring, and Starting GDS.

+

-

+

Create a foreign table,

+

Create a foreign table to help GDS specify information about a data file. The foreign table stores information, such as the location, format, encoding, and inter-data delimiter of a data file.

+

For details, see Creating a GDS Foreign Table.

+

-

+

Export data.

+

After the foreign table is created, run the INSERT statement to efficiently export data to data files.

+

For details, see Exporting Data.

+

-

+

Stop GDS.

+

Stop GDS after data is exported.

+

For details, see Stopping GDS.

+

-

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0263.html b/docs/dws/dev/dws_04_0263.html new file mode 100644 index 00000000..e586e503 --- /dev/null +++ b/docs/dws/dev/dws_04_0263.html @@ -0,0 +1,22 @@ + + +

Planning Data Export

+

Scenarios

Before you use GDS to export data from a cluster, prepare data to be exported and plan the export path.

+
+

Planning an Export Path

  • Remote mode
+
  1. Log in to the GDS data server as user root and create the /output_data directory for storing data files.

    mkdir -p /output_data
    +

  2. (Optional) Create a user and the user group to which it belongs. This user is used to start GDS and must have the write permission on the directory for storing data files.

    groupadd gdsgrp
    +useradd -g gdsgrp gdsuser
    +

    If the following information is displayed, the user and user group already exist. Skip this step.

    +
    useradd: Account 'gdsuser' already exists.
    +groupadd: Group 'gdsgrp' already exists.
    +

  3. Change the directory owner to gdsuser.

    chown -R gdsuser:gdsgrp /output_data 
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0264.html b/docs/dws/dev/dws_04_0264.html new file mode 100644 index 00000000..6d322964 --- /dev/null +++ b/docs/dws/dev/dws_04_0264.html @@ -0,0 +1,12 @@ + + +

Installing, Configuring, and Starting GDS

+

GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.

+

For details, see Installing, Configuring, and Starting GDS.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0265.html b/docs/dws/dev/dws_04_0265.html new file mode 100644 index 00000000..da314e9b --- /dev/null +++ b/docs/dws/dev/dws_04_0265.html @@ -0,0 +1,60 @@ + + +

Creating a GDS Foreign Table

+

Procedure

  1. Set the location parameter for the foreign table based on the path planned in Planning Data Export.

    • Remote mode

      Set the location parameter to the URL of the directory that stores the data files.

      +

      You do not need to specify any file.

      +

      For example:

      +

      The IP address of the GDS data server is 192.168.0.90. The listening port number set during GDS startup is 5000. The directory for storing data files is /output_data.

      +

      In this case, set the location parameter to gsfs://192.168.0.90:5000/.

      +
      • location can be set to a subdirectory, for example, gsfs://192.168.0.90:5000/2019/11/, so that the same table can be exported to different directories by date.
      • In the current version, when an export task is executed, the system checks whether the /output_data/2019/11 directory exists. If the directory does not exist, the system creates it. During the export, files are written to this directory. In this way, you do not need to manually run the mkdir -p /output_data/2019/11 command after creating or modifying a foreign table.
      +
      +
    +

  2. Set data format parameters in the foreign table based on the planned data file formats. For details about format parameters, see data format parameters.
  3. Create a GDS foreign table based on the parameter settings in the preceding steps. For details about how to create a foreign table, see CREATE FOREIGN TABLE (for GDS Import and Export).
+
+

Example

  • Example: Create the GDS foreign table foreign_tpcds_reasons for the source data. Data is to be exported as CSV files.

    Data export mode settings are as follows:

    +

    The data server resides on the same intranet as the cluster. The IP address of the data server is 192.168.0.90. Data is to be exported as CSV files. The Remote mode is selected for parallel data export.

    +

    Assume that the directory for storing data files is /output_data/ and the GDS listening port is 5000 when GDS is started. Therefore, the location parameter is set to gsfs://192.168.0.90:5000/.

    +

    Data format parameter settings are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x08'.
    • quote is set to E'\x1b'.
    • null is set to an empty string without quotation marks.
    • escape is set to the same value as that of quote by default.
    • header is set to false, indicating that the first row is identified as a data row in an exported file.
    • EOL is set to 0X0A.
    +
    The foreign table is created using the following statement:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    CREATE FOREIGN TABLE foreign_tpcds_reasons
    +(
    +  r_reason_sk    integer        not null,
    +  r_reason_id    char(16)       not null,
    +  r_reason_desc  char(100)
    +) 
    +SERVER gsmpp_server 
    +OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', 
    +FORMAT 'CSV',
    +DELIMITER E'\x08',
    +QUOTE E'\x1b', 
    +NULL '', 
    +EOL '0x0a'
    +)
    +WRITE ONLY;
    +
    + +
    +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0266.html b/docs/dws/dev/dws_04_0266.html new file mode 100644 index 00000000..168453cb --- /dev/null +++ b/docs/dws/dev/dws_04_0266.html @@ -0,0 +1,20 @@ + + +

Exporting Data

+

Prerequisites

Ensure that the IP addresses and ports of servers where CNs and DNs are deployed can connect to those of the GDS server.

+
+

Procedure

  1. Export data.

    1
    INSERT INTO  [Foreign table name] SELECT * FROM [Source table name];
    +
    + +
    +

    Create batch processing scripts to export data in parallel. The degree of parallelism depends on the server resource usage. You can test several tables and monitor resource usage to determine whether to increase or reduce the amount. Common resource monitoring commands include top for memory and CPU usage, iostat for I/O usage, and sar for networks. For details about application cases, see Exporting Data Using Multiple Threads.

    +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0267.html b/docs/dws/dev/dws_04_0267.html new file mode 100644 index 00000000..49730fc4 --- /dev/null +++ b/docs/dws/dev/dws_04_0267.html @@ -0,0 +1,12 @@ + + +

Stopping GDS

+

GDS is a data service tool provided by GaussDB(DWS). Using the foreign table mechanism, this tool helps export data at a high speed.

+

For details, see Stopping GDS.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0268.html b/docs/dws/dev/dws_04_0268.html new file mode 100644 index 00000000..098c3fb8 --- /dev/null +++ b/docs/dws/dev/dws_04_0268.html @@ -0,0 +1,167 @@ + + +

Examples of Exporting Data Using GDS

+

Exporting Data in Remote Mode

The data server and the cluster reside on the same intranet, the IP address of the data server is 192.168.0.90, and data source files are in CSV format. In this scenario, data is exported in parallel in Remote mode.

+

To export data in parallel in Remote mode, perform the following operations:

+
  1. Log in to the GDS data server as user root, create the /output_data directory for storing data files, and create user gds_user and its user group.
    mkdir -p /output_data
    +
  2. (Optional) Create a user and the user group it belongs to. The user is used to start GDS. If the user and user group exist, skip this step.
    groupadd gdsgrp
    +useradd -g gdsgrp gds_user
    +
  3. Change the owner of the /output_data directory on the data server to gds_user.
    chown -R gds_user:gdsgrp /output_data 
    +
  4. Log in to the data server as user gds_user and start GDS.
    The GDS installation path is /opt/bin/dws/gds. Exported data files are stored in /output_data/. The IP address of the data server is 192.168.0.90. The GDS listening port is 5000. GDS runs in daemon mode.
    /opt/bin/dws/gds/bin/gds -d /output_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D
    +
    +
  5. In the database, create the foreign table foreign_tpcds_reasons for receiving data from the data server.

    Data export mode settings are as follows:

    +
    • The directory for storing exported files is /output_data/ and the GDS listening port is 5000 when GDS is started. The directory created for storing exported files is /output_data/. Therefore, the location parameter is set to gsfs://192.168.0.90:5000/.
    +

    Data format parameter settings are as follows:

    +
    • format is set to CSV.
    • encoding is set to UTF-8.
    • delimiter is set to E'\x0a'.
    • quote is set to E'\x1b'.
    • null is set to an empty string without quotation marks.
    • escape defaults to the value of quote.
    • header is set to false, indicating that the first row is identified as a data row in an exported file.
    +

    Based on the above settings, the foreign table is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE foreign_tpcds_reasons
    +(
    +  r_reason_sk    integer        not null,
    +  r_reason_id    char(16)       not null,
    +  r_reason_desc  char(100)
    +) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV',ENCODING 'utf8',DELIMITER E'\x08', QUOTE E'\x1b', NULL '') WRITE ONLY;
    +
    + +
    +
  6. In the database, export data to data files through the foreign table foreign_tpcds_reasons.
    1
    INSERT INTO foreign_tpcds_reasons SELECT * FROM tpcds.reason;
    +
    + +
    +
  7. After data export is complete, log in to the data server as user gds_user and stop GDS.
    The GDS process ID is 128954.
    ps -ef|grep gds
    +gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /output_data -p 192.168.0.90:5000 -D
    +gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    +kill -9 128954
    +
    +
+
+

Exporting Data Using Multiple Threads

The data server and the cluster reside on the same intranet, the IP address of the data server is 192.168.0.90, and data source files are in CSV format. In this scenario, data is concurrently exported to two target tables using multiple threads in Remote mode.

+

To concurrently export data using multiple threads in Remote mode, perform the following operations:

+
  1. Log in to the GDS data server as user root, create the /output_data directory for storing data files, and create the database user and its user group.
    mkdir -p /output_data
    +groupadd gdsgrp
    +useradd -g gdsgrp gds_user
    +
  2. Change the owner of the /output_data directory on the data server to gds_user.
    chown -R gds_user:gdsgrp /output_data 
    +
  3. Log in to the data server as user gds_user and start GDS.
    The GDS installation path is /opt/bin/dws/gds. Exported data files are stored in /output_data/. The IP address of the data server is 192.168.0.90. The GDS listening port is 5000. GDS runs in daemon mode. The degree of parallelism is 2.
    /opt/bin/dws/gds/bin/gds -d /output_data -p 192.168.0.90:5000 -H 10.10.0.1/24 -D -t 2 
    +
    +
  4. In GaussDB(DWS), create the foreign tables foreign_tpcds_reasons1 and foreign_tpcds_reasons2 for receiving data from the data server.
    • Data export mode settings are as follows:
      • The directory for storing exported files is /output_data/ and the GDS listening port is 5000 when GDS is started. The directory created for storing exported files is /output_data/. Therefore, the location parameter is set to gsfs://192.168.0.90:5000/.
      +
    • Data format parameter settings are as follows:
      • format is set to CSV.
      • encoding is set to UTF-8.
      • delimiter is set to E'\x08'.
      • quote is set to E'\x1b'.
      • null is set to an empty string without quotation marks.
      • escape defaults to the value of quote.
      • header is set to false, indicating that the first row is identified as a data row in an exported file.
      +
    +

    Based on the preceding settings, the foreign table foreign_tpcds_reasons1 is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE foreign_tpcds_reasons1
    +(  
    +  r_reason_sk    integer     not null,
    +  r_reason_id    char(16)    not null,
    +  r_reason_desc  char(100)
    +) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV',ENCODING 'utf8', DELIMITER E'\x08', QUOTE E'\x1b', NULL '') WRITE ONLY;
    +
    + +
    +

    Based on the preceding settings, the foreign table foreign_tpcds_reasons2 is created using the following statement:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE FOREIGN TABLE foreign_tpcds_reasons2
    +(  
    +  r_reason_sk    integer     not null,
    +  r_reason_id    char(16)    not null,
    +  r_reason_desc  char(100)
    +) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.90:5000/', FORMAT 'CSV', DELIMITER E'\x08', QUOTE E'\x1b', NULL '') WRITE ONLY;
    +
    + +
    +
  5. In the database, export data from table reasons1 through the foreign table foreign_tpcds_reasons1 and from table reasons2 through the foreign table foreign_tpcds_reasons2 to /output_data.
    1
    INSERT INTO foreign_tpcds_reasons1 SELECT * FROM tpcds.reason;
    +
    + +
    +
    1
    INSERT INTO foreign_tpcds_reasons2 SELECT * FROM tpcds.reason;
    +
    + +
    +
  6. After data export is complete, log in to the data server as user gds_user and stop GDS.
    The GDS process ID is 128954.
    ps -ef|grep gds
    +gds_user 128954      1  0 15:03 ?        00:00:00 gds -d /output_data -p 192.168.0.90:5000 -D -t 2 
    +gds_user 129003 118723  0 15:04 pts/0    00:00:00 grep gds
    +kill -9 128954
    +
    +
+
+

Exporting Data Through a Pipe

  1. Start GDS.

    gds -d /***/gds_data/ -D -p 192.168.0.1:7789 -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +

    If you need to set the timeout interval of a pipe, use the --pipe-timeout parameter.

    +

  2. Export data.

    1. Log in to the database, create an internal table, and write data to the table.
      CREATE TABLE test_pipe( id integer not null, sex text not null, name text ) ;
      +
      +INSERT INTO test_pipe values(1,2,'11111111111111');
      +INSERT INTO test_pipe values(2,2,'11111111111111');
      +INSERT INTO test_pipe values(3,2,'11111111111111');
      +INSERT INTO test_pipe values(4,2,'11111111111111');
      +
    2. Create a write-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe_tw( id integer not null, age text not null, name  text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.1:7789/', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe', auto_create_pipe 'false') WRITE ONLY;
      +
    3. Execute the export statement. The statement will be blocked.
      INSERT INTO foreign_test_pipe_tw select * from test_pipe; 
      +
    +

  3. Export data through the GDS pipe.

    1. Log in to GDS and go to the GDS data directory.
      cd /***/gds_data/  
      +
    2. Create a pipe. If auto_create_pipe is set to true, skip this step.
      mkfifo postgres_public_foreign_test_pipe_tw.pipe 
      +

      A pipe will be automatically cleared after an operation is complete. To perform another operation, create a pipe again.

      +
      +
    3. Read data from the pipe and write it to a new file.
      cat postgres_public_foreign_test_pipe_tw.pipe > postgres_public_foreign_test_pipe_tw.txt
      +
    4. To compress the exported files, run the following command:
      gzip -9 -c < postgres_public_foreign_test_pipe_tw.pipe  > out.gz 
      +
    5. To export the content from the pipe to the HDFS server, run the following command:
      cat postgres_public_foreign_test_pipe_tw.pipe  | hdfs dfs -put -  /user/hive/***/test_pipe.txt
      +
    +

  4. Verify the exported data.

    1. Check whether the exported file is correct.
      cat postgres_public_foreign_test_pipe_tw.txt
      +3,2,11111111111111
      +1,2,11111111111111
      +2,2,11111111111111
      +4,2,11111111111111
      +
    2. Check the compressed file.
      vim out.gz
      +3,2,11111111111111
      +1,2,11111111111111
      +2,2,11111111111111
      +4,2,11111111111111
      +
    3. Check the data exported to the HDFS server.
      hdfs dfs -cat /user/hive/***/test_pipe.txt
      +3,2,11111111111111
      +1,2,11111111111111
      +2,2,11111111111111
      +4,2,11111111111111
      +
    +

+
+

Exporting Data Through Multi-Process Pipes

GDS also supports importing and exporting data through multi-process pipes. That is, one foreign table corresponds to multiple GDSs.

+

The following takes exporting a local file as an example.

+
  1. Start multiple GDSs.

    gds -d /***/gds_data/ -D -p 192.168.0.1:7789 -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +gds -d /***/gds_data_1/ -D -p 192.168.0.1:7790 -l /***/gds_log/aa.log -H 0/0 -t 10 -D
    +

    If you need to set the timeout interval of a pipe, use the --pipe-timeout parameter.

    +

  2. Export data.

    1. Log in to the database and create an internal table.
      CREATE TABLE test_pipe (id integer not null, sex text not null, name  text);
      +
    2. Write data.
      INSERT INTO test_pipe values(1,2,'11111111111111');
      +INSERT INTO test_pipe values(2,2,'11111111111111');
      +INSERT INTO test_pipe values(3,2,'11111111111111');
      +INSERT INTO test_pipe values(4,2,'11111111111111');
      +
    3. Create a write-only foreign table.
      CREATE FOREIGN TABLE foreign_test_pipe_tw( id integer not null, age text not null, name  text ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.1:7789/|gsfs://192.168.0.1:7790/', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe', auto_create_pipe 'false') WRITE ONLY;
      +
    4. Execute the export statement. The statement will be blocked.
      INSERT INTO foreign_test_pipe_tw select * from test_pipe; 
      +
    +

  3. Export data through the GDS pipes.

    1. Log in to GDS and go to each GDS data directory.
      cd /***/gds_data/ 
      +cd /***/gds_data_1/ 
      +
    2. Create a pipe. If auto_create_pipe is set to true, skip this step.
      mkfifo postgres_public_foreign_test_pipe_tw.pipe 
      +
    3. Read each pipe and write the new file to the pipes.
      cat postgres_public_foreign_test_pipe_tw.pipe > postgres_public_foreign_test_pipe_tw.txt
      +
    +

  4. Verify the exported data.

    cat /***/gds_data/postgres_public_foreign_test_pipe_tw.txt
    +3,2,11111111111111
    +
    cat /***/gds_data_1/postgres_public_foreign_test_pipe_tw.txt
    +1,2,11111111111111
    +2,2,11111111111111
    +4,2,11111111111111
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0269.html b/docs/dws/dev/dws_04_0269.html new file mode 100644 index 00000000..a171d8a0 --- /dev/null +++ b/docs/dws/dev/dws_04_0269.html @@ -0,0 +1,21 @@ + + +

Using gs_dump and gs_dumpall to Export Metadata

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0270.html b/docs/dws/dev/dws_04_0270.html new file mode 100644 index 00000000..cc0b900c --- /dev/null +++ b/docs/dws/dev/dws_04_0270.html @@ -0,0 +1,68 @@ + + +

Overview

+

GaussDB(DWS) provides gs_dump and gs_dumpall to export required database objects and related information. To migrate database information, you can use a tool to import the exported metadata to a target database. gs_dump exports a single database or its objects. gs_dumpall exports all databases or global objects in a cluster. For details, see Table 1.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Table 1 Application scenarios

Application Scenario

+

Export Granularity

+

Export Format

+

Import Method

+

Exporting a single database

+

Database-level export

+
  • Export full information of a database.

    You can use the exported information to create a same database containing the same data as the current one.

    +
  • Export all object definitions of a database, including the definitions of the database, functions, schemas, tables, indexes, and stored procedures.

    You can use the exported object definitions to quickly create a same database as the current one, without data.

    +
  • Export data of a database.
+
  • Plain text
  • Custom
  • Directory
  • .tar
+
+

Schema-level export

+
  • Export full information of a schema.
  • Export data of a schema.
  • Export all object definitions of a schema, including the definitions of tables, stored procedures, and indexes.
+
Table-level export
  • Export full information of a table.
  • Export data of a table.
  • Export the definition of a table.
+
+

Exporting all databases in a cluster

+

Database-level export

+
  • Export full information of a cluster.

    You can use the exported information to create a same cluster containing the same databases, global objects, and data as the current one.

    +
  • Export all object definitions of a cluster, including the definitions of tablespaces, databases, functions, schemas, tables, indexes, and stored procedures.

    You can use the exported object definitions to quickly create a same cluster as the current one, containing the same databases and tablespaces but without data.

    +
  • Export data of a cluster.
+

Plain text

+

For details about how to import data files, see Using the gsql Meta-Command \COPY to Import Data.

+
Global object export
  • Export tablespaces.
  • Export roles.
  • Export tablespaces and roles.
+
+
+
+

gs_dump and gs_dumpall use -U to specify the user that performs the export. If the specified user does not have the required permission, data cannot be exported. In this case, you can set --role in the export command to the role that has the permission. Then, gs_dump or gs_dumpall uses the specified role to export data. See Table 1 for application scenarios and Data Export By a User Without Required Permissions for operation details.

+

gs_dump and gs_dumpall encrypt the exported data files. These files are decrypted before being imported to prevent data disclosure for higher database security.

+

When gs_dump or gs_dumpall is used to export data from a cluster, other users can still access (read data from and write data to) databases in the cluster.

+

gs_dump and gs_dumpall can export complete, consistent data. For example, if gs_dump is used to export database A or gs_dumpall is used to export all databases from a cluster at T1, data of database A or all databases in the cluster at that time point will be exported, and modifications on the databases after that time point will not be exported.

+

Obtain gs_dump and gs_dumpall by decompressing the gsql CLI client package.

+

Precautions

  • Do not modify an exported file or its content. Otherwise, restoration may fail.
  • For data consistency and integrity, gs_dump and gs_dumpall set a share lock for a table to be dumped. If a share lock has been set for the table in other transactions, gs_dump and gs_dumpall lock the table after the lock is released. If the table cannot be locked within the specified time, the dump fails. You can customize the timeout duration to wait for lock release by specifying the --lock-wait-timeout parameter.
  • During an export, gs_dumpall reads all tables in a database. Therefore, you need to connect to the database as a cluster administrator to export a complete file. When you use gsql to import scripts, cluster administrator permissions are also required to add users and user groups, and create databases.
  • By default, the definitions of all views in the GaussDB(DWS) database contain the prefix of table names or aliases (in tab.col format). Therefore, the definitions may be inconsistent with the original ones. As a result, the base table corresponding to the rebuilt view column is incorrect and an error is reported. However, this rarely happens. To prevent this problem, you are advised to set the GUC parameter behavior_compat_options to compat_display_ref_table when exporting view definitions, so the exported definitions are consistent with the original statements.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0271.html b/docs/dws/dev/dws_04_0271.html new file mode 100644 index 00000000..004a8ee6 --- /dev/null +++ b/docs/dws/dev/dws_04_0271.html @@ -0,0 +1,20 @@ + + +

Exporting a Single Database

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0272.html b/docs/dws/dev/dws_04_0272.html new file mode 100644 index 00000000..552f685b --- /dev/null +++ b/docs/dws/dev/dws_04_0272.html @@ -0,0 +1,115 @@ + + +

Exporting a Database

+

You can use gs_dump to export data and all object definitions of a database from GaussDB(DWS). You can specify the information to be exported as follows:

+
  • Export full information of a database, including its data and all object definitions.

    You can use the exported information to create a same database containing the same data as the current one.

    +
  • Export all object definitions of a database, including the definitions of the database, functions, schemas, tables, indexes, and stored procedures.

    You can use the exported object definitions to quickly create a same database as the current one, without data.

    +
  • Export data of a database.
+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dump to export data of the database gaussdb.

    gs_dump -W password -U jack -f /home//backup/postgres_backup.tar -p 8000 gaussdb  -h 10.10.10.100 -F t 
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for connecting to the database. If this parameter is not configured, the username of the connected database is used.

    +

    -U jack

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home//backup/postgres_backup.tar

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    dbname

    +

    Name of the database to be exported.

    +

    gaussdb

    +

    -F

    +

    Format of exported files. The values of -F are as follows:

    +
    • p: plain text
    • c: custom
    • d: directory
    • t: .tar
    +

    -F t

    +
    +
    +

    For details about other parameters, see "gs_dump" in the Tool Guide.

    +

+
+

Examples

Example 1: Use gs_dump to run the following command to export full information of the database gaussdb and compress the exported files in SQL format.

+
gs_dump -W password -U jack -f /home//backup/postgres_backup.sql -p 8000  -h 10.10.10.100 gaussdb -Z 8 -F p
+gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfully
+gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: total time: 3793  ms
+

Example 2: Use gs_dump to run the following command to export data of the database gaussdb, excluding object definitions. The exported files are in a custom format.

+
gs_dump -W Password -U jack -f /home//backup/postgres_data_backup.dmp -p 8000 -h 10.10.10.100 gaussdb -a -F c
+gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: dump database gaussdb successfully
+gs_dump[port=''][gaussdb][2017-07-21 15:36:13]: total time: 3793  ms
+

Example 3: Use gs_dump to run the following command to export object definitions of the database gaussdb. The exported files are in SQL format.

+
--Before the export, the nation table contains data.
+select n_nationkey,n_name,n_regionkey from nation limit 3;
+ n_nationkey |          n_name           | n_regionkey 
+-------------+---------------------------+-------------
+           0 | ALGERIA                   |           0
+           3 | CANADA                    |           1
+          11 | IRAQ                      |           4
+(3 rows)
+
+gs_dump -W password -U jack -f /home//backup/postgres_def_backup.sql -p 8000 -h 10.10.10.100 gaussdb -s -F p
+gs_dump[port=''][gaussdb][2017-07-20 15:04:14]: dump database gaussdb successfully
+gs_dump[port=''][gaussdb][2017-07-20 15:04:14]: total time: 472 ms
+

Example 4: Use gs_dump to run the following command to export object definitions of the database gaussdb. The exported files are in text format and are encrypted.

+
gs_dump -W password -U jack -f /home//backup/postgres_def_backup.sql -p 8000 -h 10.10.10.100 gaussdb --with-encryption AES128 --with-key 1234567812345678 -s -F p
+gs_dump[port=''][gaussdb][2018-11-14 11:25:18]: dump database gaussdb successfully
+gs_dump[port=''][gaussdb][2018-11-14 11:25:18]: total time: 1161  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0273.html b/docs/dws/dev/dws_04_0273.html new file mode 100644 index 00000000..005c0e05 --- /dev/null +++ b/docs/dws/dev/dws_04_0273.html @@ -0,0 +1,124 @@ + + +

Exporting a Schema

+

You can use gs_dump to export data and all object definitions of a schema from GaussDB(DWS). You can export one or more specified schemas as needed. You can specify the information to be exported as follows:

+
  • Export full information of a schema, including its data and object definitions.
  • Export data of a schema, excluding its object definitions.
  • Export the object definitions of a schema, including the definitions of tables, stored procedures, and indexes.
+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dump to run the following command to export the hr and public schemas.

    gs_dump -W Password -U jack -f /home//backup/MPPDB_schema_backup -p 8000 -h 10.10.10.100 human_resource -n hr -F d 
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for connecting to the database. If this parameter is not configured, the username of the connected database is used.

    +

    -U jack

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home//backup/MPPDB_schema_backup

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    dbname

    +

    Name of the database to be exported.

    +

    human_resource

    +

    -n

    +

    Names of schemas to be exported. Data of the specified schemas will also be exported.

    +
    • Single schema: Enter -n schemaname.
    • Multiple schemas: Enter -n schemaname for each schema.
    +
    • Single schema: -n hr
    • Multiple schemas: -n hr -n public
    +

    -F

    +

    Format of exported files. The values of -F are as follows:

    +
    • p: plain text
    • c: custom
    • d: directory
    • t: .tar
    +

    -F d

    +
    +
    +

    For details about other parameters, see "gs_dump" in the Tool Guide.

    +

+
+

Examples

Example 1: Use gs_dump to run the following command to export full information of the hr schema. The exported files are compressed and stored in text format.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup.sql -p 8000 -h 10.10.10.100 human_resource -n hr -Z 6 -F p
+gs_dump[port=''][human_resource][2017-07-21 16:05:55]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 16:05:55]: total time: 2425  ms
+
+
Example 2: Use gs_dump to run the following command to export data of the hr schema. The exported files are in .tar format.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_data_backup.tar -p 8000 -h 10.10.10.100 human_resource -n hr -a -F t
+gs_dump[port=''][human_resource][2018-11-14 15:07:16]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-11-14 15:07:16]: total time: 1865  ms
+
+
Example 3: Use gs_dump to run the following command to export the definition of the hr schema. The exported files are stored in a directory.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_def_backup -p 8000 -h 10.10.10.100 human_resource -n hr -s -F d
+gs_dump[port=''][human_resource][2018-11-14 15:11:34]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-11-14 15:11:34]: total time: 1652  ms
+
+
Example 4: Use gs_dump to run the following command to export the human_resource database excluding the hr schema. The exported files are in a custom format.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup.dmp -p 8000 -h 10.10.10.100 human_resource -N hr -F c
+gs_dump[port=''][human_resource][2017-07-21 16:06:31]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 16:06:31]: total time: 2522  ms
+
+
Example 5: Use gs_dump to run the following command to export the object definitions of the hr and public schemas, encrypt the exported files, and store them in .tar format.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup1.tar -p 8000 -h 10.10.10.100 human_resource -n hr -n public -s --with-encryption AES128 --with-key 1234567812345678 -F t
+gs_dump[port=''][human_resource][2017-07-21 16:07:16]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 16:07:16]: total time: 2132  ms
+
+
Example 6: Use gs_dump to run the following command to export the human_resource database excluding the hr and public schemas. The exported files are in a custom format.
gs_dump -W password -U jack -f /home//backup/MPPDB_schema_backup2.dmp -p 8000 -h 10.10.10.100 human_resource -N hr -N public -F c
+gs_dump[port=''][human_resource][2017-07-21 16:07:55]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 16:07:55]: total time: 2296  ms
+
+

Example 7: Use gs_dump to run the following command to export all tables, including views, sequences, and foreign tables, in the public schema, and the staffs table in the hr schema, including data and table definition. The exported files are in a custom format.

+
gs_dump -W password -U jack -f /home//backup/MPPDB_backup3.dmp -p 8000 -h 10.10.10.100 human_resource -t public.* -t hr.staffs -F c
+gs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-12-13 09:40:24]: total time: 896  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0274.html b/docs/dws/dev/dws_04_0274.html new file mode 100644 index 00000000..7cefc702 --- /dev/null +++ b/docs/dws/dev/dws_04_0274.html @@ -0,0 +1,136 @@ + + +

Exporting a Table

+

You can use gs_dump to export data and all object definitions of a table-level object from GaussDB(DWS). Views, sequences, and foreign tables are special tables. You can export one or more specified tables as needed. You can specify the information to be exported as follows:

+
  • Export full information of a table, including its data and definition.
  • Export data of a table.
  • Export the definition of a table.
+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dump to run the following command to export the hr.staffs and hr.employments tables.

    gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -F d
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for connecting to the database. If this parameter is not configured, the username of the connected database is used.

    +

    -U jack

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home//backup/MPPDB_table_backup

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    dbname

    +

    Name of the database to be exported.

    +

    human_resource

    +

    -t

    +

    Table (or view, sequence, foreign table) to be exported. You can specify multiple tables by listing them or using wildcard characters. When you use wildcard characters, quote wildcard patterns with single quotation marks ('') to prevent the shell from expanding the wildcard characters.

    +
    • Single table: Enter -t schema.table.
    • Multiple tables: Enter -t schema.table for each table.
    +
    • Single table: -t hr.staffs
    • Multiple tables: -t hr.staffs -t hr.employments
    +

    -F

    +

    Format of exported files. The values of -F are as follows:

    +
    • p: plain text
    • c: custom
    • d: directory
    • t: .tar
    +

    -F d

    +
    +
    +

    For details about other parameters, see "gs_dump" in the Tool Guide.

    +

+
+

Examples

Example 1: Use gs_dump to run the following command to export full information of the hr.staffs table. The exported files are in text format.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -Z 6 -F p
+gs_dump[port=''][human_resource][2017-07-21 17:05:10]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:05:10]: total time: 3116  ms
+
+
Example 2: Use gs_dump to run the following command to export data of the hr.staffs table. The exported files are in .tar format.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_data_backup.tar -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -a -F t 
+gs_dump[port=''][human_resource][2017-07-21 17:04:26]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:04:26]: total time: 2570  ms
+
+
Example 3: Use gs_dump to run the following command to export the definition of the hr.staffs table. The exported files are stored in a directory.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_def_backup -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -s -F d 
+gs_dump[port=''][human_resource][2017-07-21 17:03:09]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:03:09]: total time: 2297  ms 
+
+
Example 4: Use gs_dump to run the following command to export the human_resource database excluding the hr.staffs table. The exported files are in a custom format.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup4.dmp -p 8000 -h 10.10.10.100 human_resource -T hr.staffs -F c
+gs_dump[port=''][human_resource][2017-07-21 17:14:11]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:14:11]: total time: 2450  ms
+
+
Example 5: Use gs_dump to run the following command to export the hr.staffs and hr.employments tables. The exported files are in text format.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup1.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -t hr.employments -F p
+gs_dump[port=''][human_resource][2017-07-21 17:19:42]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:19:42]: total time: 2414  ms
+
+
Example 6: Use gs_dump to run the following command to export the human_resource database excluding the hr.staffs and hr.employments tables. The exported files are in text format.
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup2.sql -p 8000 -h 10.10.10.100 human_resource -T hr.staffs -T hr.employments -F p
+gs_dump[port=''][human_resource][2017-07-21 17:21:02]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2017-07-21 17:21:02]: total time: 3165  ms
+
+

Example 7: Use gs_dump to run the following command to export data and definition of the hr.staffs table, and the definition of the hr.employments table. The exported files are in .tar format.

+
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup3.tar -p 8000 -h 10.10.10.100 human_resource -t hr.staffs -t hr.employments --exclude-table-data hr.employments -F t
+gs_dump[port=''][human_resource][2018-11-14 11:32:02]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-11-14 11:32:02]: total time: 1645  ms
+

Example 8: Use gs_dump to run the following command to export data and definition of the hr.staffs table, encrypt the exported files, and store them in text format.

+
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup4.sql -p 8000 -h 10.10.10.100 human_resource -t hr.staffs --with-encryption AES128 --with-key 1212121212121212 -F p
+gs_dump[port=''][human_resource][2018-11-14 11:35:30]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-11-14 11:35:30]: total time: 6708  ms
+

Example 9: Use gs_dump to run the following command to export all tables, including views, sequences, and foreign tables, in the public schema, and the staffs table in the hr schema, including data and table definition. The exported files are in a custom format.

+
gs_dump -W password -U jack -f /home//backup/MPPDB_table_backup5.dmp -p 8000 -h 10.10.10.100 human_resource -t public.* -t hr.staffs -F c
+gs_dump[port=''][human_resource][2018-12-13 09:40:24]: dump database human_resource successfully
+gs_dump[port=''][human_resource][2018-12-13 09:40:24]: total time: 896  ms
+

Example 10: Use gs_dump to run the following command to export the definition of the view referencing to the test1 table in the t1 schema. The exported files are in a custom format.

+
gs_dump -W password -U jack -f /home//backup/MPPDB_view_backup6 -p 8000 -h 10.10.10.100 human_resource -t t1.test1 --include-depend-objs --exclude-self -F d
+gs_dump[port=''][jack][2018-11-14 17:21:18]: dump database human_resource successfully
+gs_dump[port=''][jack][2018-11-14 17:21:23]: total time: 4239  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0275.html b/docs/dws/dev/dws_04_0275.html new file mode 100644 index 00000000..403c505b --- /dev/null +++ b/docs/dws/dev/dws_04_0275.html @@ -0,0 +1,18 @@ + + +

Exporting All Databases

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0276.html b/docs/dws/dev/dws_04_0276.html new file mode 100644 index 00000000..d8143f92 --- /dev/null +++ b/docs/dws/dev/dws_04_0276.html @@ -0,0 +1,87 @@ + + +

Exporting All Databases

+

You can use gs_dumpall to export full information of all databases in a cluster from GaussDB(DWS), including information about each database and global objects in the cluster. You can specify the information to be exported as follows:

+
  • Export full information of all databases, including information about each database and global objects (such as roles and tablespaces) in the cluster.

    You can use the exported information to create a same cluster containing the same databases, global objects, and data as the current one.

    +
  • Export data of all databases, excluding all object definitions and global objects.
  • Export all object definitions of all databases, including the definitions of tablespaces, databases, functions, schemas, tables, indexes, and stored procedures.

    You can use the exported object definitions to quickly create a same cluster as the current one, containing the same databases and tablespaces but without data.

    +
+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dumpall to run the following command to export information of all databases.

    gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for database connection. The user must be a cluster administrator.

    +

    -U dbadmin

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home/dbadmin/backup/MPPDB_backup.sql

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +
    +
    +

    For details about other parameters, see "gs_dumpall" in the Tool Guide.

    +

+
+

Examples

Example 1: Use gs_dumpall to run the following command as the cluster administrator dbadmin to export information of all databases in a cluster. The exported files are in text format. After the command is executed, a large amount of output information will be displayed. total time will be displayed at the end of the information, indicating that the export is successful. In this example, only related output information is included.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 
+gs_dumpall[port=''][2017-07-21 15:57:31]: dumpall operation successful
+gs_dumpall[port=''][2017-07-21 15:57:31]: total time: 9627  ms
+

Example 2: Use gs_dumpall to run the following command as the cluster administrator dbadmin to export definitions of all databases in a cluster. The exported files are in text format. After the command is executed, a large amount of output information will be displayed. total time will be displayed at the end of the information, indicating that the export is successful. In this example, only related output information is included.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 -s 
+gs_dumpall[port=''][2018-11-14 11:28:14]: dumpall operation successful
+gs_dumpall[port=''][2018-11-14 11:28:14]: total time: 4147  ms
+

Example 3: Use gs_dumpall to run the following command export data of all databases in a cluster, encrypt the exported files, and store them in text format. After the command is executed, a large amount of output information will be displayed. total time will be displayed at the end of the information, indicating that the export is successful. In this example, only related output information is included.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 -a --with-encryption AES128 --with-key 1234567812345678
+gs_dumpall[port=''][2018-11-14 11:32:26]: dumpall operation successful
+gs_dumpall[port=''][2018-11-14 11:23:26]: total time: 4147  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0277.html b/docs/dws/dev/dws_04_0277.html new file mode 100644 index 00000000..09ad4246 --- /dev/null +++ b/docs/dws/dev/dws_04_0277.html @@ -0,0 +1,91 @@ + + +

Exporting Global Objects

+

You can use gs_dumpall to export global objects from GaussDB(DWS), including database users, user groups, tablespaces, and attributes (for example, global access permissions).

+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dumpall to run the following command to export tablespace objects.

    gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_tablespace.sql -p 8000 -h 10.10.10.100 -t
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value

    +

    -U

    +

    Username for database connection. The user must be a cluster administrator.

    +

    -U dbadmin

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home//backup/MPPDB_tablespace.sql

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    -t

    +

    Dumps only tablespaces. You can also use --tablespaces-only alternatively.

    +

    -

    +
    +
    +

    For details about other parameters, see "gs_dumpall" in the Tool Guide.

    +

+
+

Examples

Example 1: Use gs_dumpall to run the following command as the cluster administrator dbadmin to export information of global tablespaces and users in a cluster. The exported files are in text format.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_globals.sql -p 8000 -h 10.10.10.100 -g
+gs_dumpall[port=''][2018-11-14 19:06:24]: dumpall operation successful
+gs_dumpall[port=''][2018-11-14 19:06:24]: total time: 1150  ms
+

Example 2: Use gs_dumpall to run the following command as the cluster administrator dbadmin to export global tablespaces in a cluster, encrypt the exported files, and store them in text format.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_tablespace.sql -p 8000 -h 10.10.10.100 -t --with-encryption AES128 --with-key 1212121212121212
+gs_dumpall[port=''][2018-11-14 19:00:58]: dumpall operation successful
+gs_dumpall[port=''][2018-11-14 19:00:58]: total time: 186  ms
+

Example 3: Use gs_dumpall to run the following command as the cluster administrator dbadmin to export information of global users in a cluster. The exported files are in text format.

+
gs_dumpall -W password -U dbadmin -f /home/dbadmin/backup/MPPDB_user.sql -p 8000 -h 10.10.10.100 -r
+gs_dumpall[port=''][2018-11-14 19:03:18]: dumpall operation successful
+gs_dumpall[port=''][2018-11-14 19:03:18]: total time: 162  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0278.html b/docs/dws/dev/dws_04_0278.html new file mode 100644 index 00000000..773a82e5 --- /dev/null +++ b/docs/dws/dev/dws_04_0278.html @@ -0,0 +1,120 @@ + + +

Data Export By a User Without Required Permissions

+

gs_dump and gs_dumpall use -U to specify the user that performs the export. If the specified user does not have the required permission, data cannot be exported. In this case, you can set --role in the export command to the role that has the permission. Then, gs_dump or gs_dumpall uses the specified role to export data.

+

Procedure

  1. Prepare an ECS as the gsql client host. For details, see "Preparing an ECS as the gsql Client Host" in the Data Warehouse Service (DWS) User Guide.
  2. Download the gsql client and use an SSH transfer tool (such as WinSCP) to upload it to the Linux server where gsql is to be installed. For details, see "Downloading the Client" in Data Warehouse Service User Guide.

    The user who uploads the client must have the full control permission on the target directory on the host to which the client is uploaded.

    +

  3. Run the following commands to decompress the client:

    cd <Path_for_storing_the_client>
    +unzip dws_client_8.1.x_redhat_x64.zip
    +

    Where,

    +
    • <Path_for_storing_the_client>: Replace it with the actual path.
    • dws_client_8.1.x_redhat_x86.zip: This is the client tool package of RedHat x86. Replace it with the actual one.
    +

  4. Run the following command to configure the GaussDB(DWS) client:

    source gsql_env.sh
    +

    If the following information is displayed, the GaussDB(DWS) client is successfully configured:

    +
    All things done.
    +

  5. Use gs_dump to export data of the human_resource database.

    User jack does not have the permission for exporting data of the human_resource database and the role role1 has this permission. To export data of the human_resource database, you can set --role to role1 in the export command. The exported files are in .tar format.
    gs_dump -U jack -W password -f /home//backup/MPPDB_backup.tar -p 8000 -h 10.10.10.100 human_resource --role role1 --rolepassword password -F t
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Common parameters

    Parameter

    +

    Description

    +

    Example Value (dbadmin)

    +

    -U

    +

    Username for database connection.

    +

    -U jack

    +

    -W

    +

    User password for database connection.

    +
    • This parameter is not required for database administrators if the trust policy is used for authentication.
    • If you connect to the database without specifying this parameter and you are not a database administrator, you will be prompted to enter the password.
    +

    -W Password

    +

    -f

    +

    Folder to store exported files. If this parameter is not specified, the exported files are stored in the standard output.

    +

    -f /home//backup/MPPDB_backup.tar

    +

    -p

    +

    Name extension of the TCP port on which the server is listening or the local Unix domain socket. This parameter is configured to ensure connections.

    +

    -p 8000

    +

    -h

    +

    Cluster address: If a public network address is used for connection, set this parameter to Public Network Address or Public Network Domain Name. If a private network address is used for connection, set this parameter to Private Network Address or Private Network Domain Name.

    +

    -h 10.10.10.100

    +

    dbname

    +

    Name of the database to be exported.

    +

    human_resource

    +

    --role

    +

    Role name for the export operation. After this parameter is set and gs_dump or gs_dumpall connects to the database, the SET ROLE command will be issued. When the user specified by -U does not have the permissions required by gs_dump or gs_dumpall, this parameter allows the user to switch to a role with the required permissions.

    +

    -r role1

    +

    --rolepassword

    +

    Role password.

    +

    --rolepassword password

    +

    -F

    +

    Format of exported files. The values of -F are as follows:

    +
    • p: plain text
    • c: custom
    • d: directory
    • t: .tar
    +

    -F t

    +
    +
    +

    For details about other parameters, see "gs_dump" or "gs_dumpall" in the Tool Guide.

    +

+
+

Examples

Example 1: User jack does not have the permission for exporting data of the human_resource database and the role role1 has this permission. To export data of the human_resource database, you can set --role to role1 in the export command. The exported files are in .tar format.

+
human_resource=# CREATE USER jack IDENTIFIED BY "password";
+
+gs_dump -U jack -W password -f /home//backup/MPPDB_backup11.tar -p 8000 -h 10.10.10.100 human_resource --role role1 --rolepassword password -F t
+gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully
+gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 4239  ms
+

Example 2: User jack does not have the permission for exporting the public schema and the role role1 has this permission. To export the public schema, you can set --role to role1 in the export command. The exported files are in .tar format.

+
human_resource=# CREATE USER jack IDENTIFIED BY "1234@abc";
+
+gs_dump -U jack -W password -f /home//backup/MPPDB_backup12.tar -p 8000 -h 10.10.10.100 human_resource -n public --role role1 --rolepassword password -F t
+gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: dump database human_resource successfully
+gs_dump[port='8000'][human_resource][2017-07-21 16:21:10]: total time: 3278  ms
+

Example 3: User jack does not have the permission for exporting all databases in a cluster and the role role1 has this permission. To export all databases, you can set --role to role1 in the export command. The exported files are in text format.

+
human_resource=# CREATE USER jack IDENTIFIED BY "password";
+
+gs_dumpall -U jack -W password -f /home//backup/MPPDB_backup.sql -p 8000 -h 10.10.10.100 --role role1 --rolepassword password
+gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: dumpall operation successful
+gs_dumpall[port='8000'][human_resource][2018-11-14 17:26:18]: total time: 6437  ms
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0279.html b/docs/dws/dev/dws_04_0279.html new file mode 100644 index 00000000..d3cc247f --- /dev/null +++ b/docs/dws/dev/dws_04_0279.html @@ -0,0 +1,25 @@ + + +

GDS Pipe FAQs

+

Precautions

  • GDS supports concurrent import and export. The gds -t parameter is used to set the size of the thread pool and control the maximum number of concurrent working threads. But it does not accelerate a single SQL task. The default value of gds -t is 8, and the upper limit is 200. When using the pipe function to import and export data, ensure that the value of -t is greater than or equal to the number of concurrent services. In the dual-cluster interconnection scenario, the value of -t must be greater than or equal to twice the number of concurrent services.
  • Data in pipes is deleted once read. Therefore, ensure that no other program except GDS reads data in the pipe during import or export. Otherwise, data may be lost, task errors may occur, or the exported files may be disordered.
  • Concurrent import and export of foreign tables with the same location are not supported. That is, multiple threads of GDS cannot read or write pipe files at the same time.
  • A single import or export task of GDS identifies only one pipe. Therefore, do not carry wildcard characters ({}[]?) in the location address set for the GDS foreign table. Example:
    CREATE FOREIGN TABLE foreign_test_pipe_tr( like test_pipe ) SERVER gsmpp_server OPTIONS (LOCATION 'gsfs://192.168.0.0.1:7789/foreign_test_*', FORMAT 'text', DELIMITER ',',  NULL '', EOL '0x0a' ,file_type 'pipe',auto_create_pipe 'false');
    +
+
+
  • When the -r recursion parameter is enabled for GDS, only one pipe can be identified. That is, GDS identifies only one pipe in the current data directory and does not recursively search for it. Therefore, the -r parameter does not take effect in the pipe import and export scenarios.
  • CN retry is not supported during the import and export through a pipe, because GDS cannot control the operations performed by peer users and programs on pipes.
  • During the import, if the peer program does not write data into the pipe for more than one hour, the import task times out and an error is reported.
  • During the export, if the peer program does not read data from the pipe for more than one hour by default, the export task times out and an error is reported.
  • Ensure that the GDS version and kernel version support the function of importing and exporting data through pipes.
  • If the auto_create_pipe parameter of the foreign table is set to true, a delay may occur when GDS automatically creates a pipe. Before any operation on a pipe, check whether the automatically created pipe exists and whether it is a pipe file.
  • Once an import or export task through a GDS pipe is complete, the pipe is automatically deleted. However, the pipe deletion is delayed, if you manually terminate an import or export task. In this situation, the pipe is deleted after the timeout interval expires.
+

Common Troubleshooting Methods:

  • Issue 1: "/***/postgres_public_foreign_test_pipe_tr.pipe" must be named pipe.

    Locating method: The type of the GDS foreign table file_type is pipe, but the operated file is a common file. Check whether the postgres_public_foreign_test_pipe_tr.pipe file is a pipe file.

    +
  • Issue 2: could not open pipe "/***/postgres_public_foreign_test_pipe_tw.pipe" cause by Permission denied.

    Locating method: GDS does not have the permission to open the pipe file.

    +
  • Issue 3: could not open source file /*****/postgres_public_foreign_test_pipe_tw.pipe because timeout 300s for WRITING.

    Locating method: Opening the pipe times out when GDS is used to export data. This is because the pipe is not created within 300 seconds after auto_create_pipe is set to false, or the pipe is created but is not read by any program within 300 seconds.

    +
  • Issue 4: could not open source file /*****/postgres_public_foreign_test_pipe_tw.pipe because timeout 300s for READING.

    Locating method: Opening the pipe times out when GDS is used to export data. This is because the pipe is not created within 300 seconds after auto_create_pipe is set to false, or the pipe is created but is not written by any program within 300 seconds.

    +
+
  • Issue 5: could not poll writing source pipe file "/****/postgres_public_foreign_test_pipe_tw.pipe" timeout 300s.

    Locating method: If the GDS does not receive any write event on the pipe within 300 seconds during data export, the pipe is not read for more than 300 seconds.

    +
+
  • Issue 6: could not poll reading source pipe file "/****/postgres_public_foreign_test_pipe_tw.pipe" timeout 300s.

    Locating method: If the GDS does not receive any read event on the pipe within 300 seconds during data import, the pipe is not written for more than 300 seconds.

    +
  • Issue 7: could not open pipe file "/***/postgres_public_foreign_test_pipe_tw.pipe" for "WRITING" with error No such device or address.

    Locating method: It indicates that the /***/postgres_public_foreign_test_pipe_tw.pipe file is not read by any program. As a result, GDS cannot open the pipe file by writing.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0301.html b/docs/dws/dev/dws_04_0301.html new file mode 100644 index 00000000..2d1e8ac7 --- /dev/null +++ b/docs/dws/dev/dws_04_0301.html @@ -0,0 +1,21 @@ + + +

PostGIS Extension

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0302.html b/docs/dws/dev/dws_04_0302.html new file mode 100644 index 00000000..7abcac44 --- /dev/null +++ b/docs/dws/dev/dws_04_0302.html @@ -0,0 +1,18 @@ + + +

PostGIS

+
  • The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical support to submit an application.
  • If the error message "ERROR: EXTENSION is not yet supported." is displayed, the PostGIS software package is not installed. Contact technical support.
+
+

GaussDB(DWS) provides PostGIS Extension (PostGIS-2.4.2). PostGIS Extension is a spatial database extender for PostgreSQL. It provides the following spatial information services: spatial objects, spatial indexes, spatial functions, and spatial operators. PostGIS Extension complies with the OpenGIS specifications.

+

In GaussDB(DWS), PostGIS Extension depends on the listed third-party open-source software.

+
  • Geos 3.6.2
+
  • Proj 4.9.2
+
  • Json 0.12.1
+
  • Libxml2 2.7.1
  • Gdal 1.11.0
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0304.html b/docs/dws/dev/dws_04_0304.html new file mode 100644 index 00000000..35ba6520 --- /dev/null +++ b/docs/dws/dev/dws_04_0304.html @@ -0,0 +1,54 @@ + + +

Using PostGIS

+
  • The third-party software that the PostGIS Extension depends on needs to be installed separately. If you need to use PostGIS, submit a service ticket or contact technical support to submit an application.
  • If the error message "ERROR: EXTENSION is not yet supported." is displayed, the PostGIS software package is not installed. Contact technical support.
+
+

Creating PostGIS Extension

Run the CREATE EXTENSION command to create PostGIS Extension.

+
1
CREATE EXTENSION postgis;
+
+ +
+
+

Using PostGIS Extension

Use the following function to invoke a PostGIS Extension:

+
1
SELECT GisFunction (Param1, Param2,......);
+
+ +
+

GisFunction is the function, and Param1 and Param2 are function parameters. The following SQL statements are a simple illustration for PostGIS use. For details about related functions, see PostGIS 2.4.2 Manual.

+

Example 1: Create a geometry table.

+
1
+2
CREATE TABLE cities ( id integer, city_name varchar(50) );
+SELECT AddGeometryColumn('cities', 'position', 4326, 'POINT', 2);
+
+ +
+

Example 2: Insert geometry data.

+
1
+2
+3
INSERT INTO cities (id, position, city_name) VALUES (1,ST_GeomFromText('POINT(-9.5 23)',4326),'CityA');
+INSERT INTO cities (id, position, city_name) VALUES (2,ST_GeomFromText('POINT(-10.6 40.3)',4326),'CityB');
+INSERT INTO cities (id, position, city_name) VALUES (3,ST_GeomFromText('POINT(20.8 30.3)',4326), 'CityC');
+
+ +
+

Example 3: Calculate the distance between any two cities among three cities.

+
1
SELECT p1.city_name,p2.city_name,ST_Distance(p1.position,p2.position) FROM cities AS p1, cities AS p2 WHERE p1.id > p2.id;
+
+ +
+
+

Deleting PostGIS Extension

Run the following command to delete PostGIS Extension from GaussDB(DWS):

+
1
DROP EXTENSION postgis [CASCADE];
+
+ +
+

If PostGIS Extension is the dependee of other objects (for example, geometry tables), you need to add the CASCADE keyword to delete all these objects.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0305.html b/docs/dws/dev/dws_04_0305.html new file mode 100644 index 00000000..9ff44cec --- /dev/null +++ b/docs/dws/dev/dws_04_0305.html @@ -0,0 +1,146 @@ + + +

PostGIS Support and Constraints

+

Supported Data Types

In GaussDB(DWS), PostGIS Extension support the following data types:

+
  • box2d
  • box3d
  • geometry_dump
  • geometry
  • geography
  • raster
+
+
If PostGIS is used by a user other than the creator of the PostGIS, set the following GUC parameters:
SET behavior_compat_options = 'bind_procedure_searchpath';
+
+
+

Supported Operators and Functions

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Operators and functions supported by PostGIS

Category

+

Function

+

Management functions

+

AddGeometryColumn, DropGeometryColumn, DropGeometryTable, PostGIS_Full_Version, PostGIS_GEOS_Version, PostGIS_Liblwgeom_Version, PostGIS_Lib_Build_Date, PostGIS_Lib_Version, PostGIS_PROJ_Version, PostGIS_Scripts_Build_Date, PostGIS_Scripts_Installed, PostGIS_Version, PostGIS_LibXML_Version, PostGIS_Scripts_Released, Populate_Geometry_Columns, UpdateGeometrySRID

+

Geometry constructors

+

ST_BdPolyFromText, ST_BdMPolyFromText, ST_Box2dFromGeoHash, ST_GeogFromText, ST_GeographyFromText, ST_GeogFromWKB, ST_GeomCollFromText, ST_GeomFromEWKB, ST_GeomFromEWKT, ST_GeometryFromText, ST_GeomFromGeoHash, ST_GeomFromGML, ST_GeomFromGeoJSON, ST_GeomFromKML, ST_GMLToSQL, ST_GeomFromText, ST_GeomFromWKB, ST_LineFromMultiPoint, ST_LineFromText, ST_LineFromWKB, ST_LinestringFromWKB, ST_MakeBox2D, ST_3DMakeBox, ST_MakeEnvelope, ST_MakePolygon, ST_MakePoint, ST_MakePointM, ST_MLineFromText, ST_MPointFromText, ST_MPolyFromText, ST_Point, ST_PointFromGeoHash, ST_PointFromText, ST_PointFromWKB, ST_Polygon, ST_PolygonFromText, ST_WKBToSQL, ST_WKTToSQL

+

Geometry accessors

+

GeometryType, ST_Boundary, ST_CoordDim, ST_Dimension, ST_EndPoint, ST_Envelope, ST_ExteriorRing, ST_GeometryN, ST_GeometryType, ST_InteriorRingN, ST_IsClosed, ST_IsCollection, ST_IsEmpty, ST_IsRing, ST_IsSimple, ST_IsValid, ST_IsValidReason, ST_IsValidDetail, ST_M, ST_NDims, ST_NPoints, ST_NRings, ST_NumGeometries, ST_NumInteriorRings, ST_NumInteriorRing, ST_NumPatches, ST_NumPoints, ST_PatchN, ST_PointN, ST_SRID, ST_StartPoint, ST_Summary, ST_X, ST_XMax, ST_XMin, ST_Y, ST_YMax, ST_YMin, ST_Z, ST_ZMax, ST_Zmflag, ST_ZMin

+

Geometry editors

+

ST_AddPoint, ST_Affine, ST_Force2D, ST_Force3D, ST_Force3DZ, ST_Force3DM, ST_Force4D, ST_ForceCollection, ST_ForceSFS, ST_ForceRHR, ST_LineMerge, ST_CollectionExtract, ST_CollectionHomogenize, ST_Multi, ST_RemovePoint, ST_Reverse, ST_Rotate, ST_RotateX, ST_RotateY, ST_RotateZ, ST_Scale, ST_Segmentize, ST_SetPoint, ST_SetSRID, ST_SnapToGrid, ST_Snap, ST_Transform, ST_Translate, ST_TransScale

+

Geometry outputs

+

ST_AsBinary, ST_AsEWKB, ST_AsEWKT, ST_AsGeoJSON, ST_AsGML, ST_AsHEXEWKB, ST_AsKML, ST_AsLatLonText, ST_AsSVG, ST_AsText, ST_AsX3D, ST_GeoHash

+

Operators

+

&&, &&&, &<, &<|, &>, <<, <<|, =, >>, @, |&>, |>>, ~, ~=, <->, <#>

+

Spatial relationships and measurements

+

ST_3DClosestPoint, ST_3DDistance, ST_3DDWithin, ST_3DDFullyWithin, ST_3DIntersects, ST_3DLongestLine, ST_3DMaxDistance, ST_3DShortestLine, ST_Area, ST_Azimuth, ST_Centroid, ST_ClosestPoint, ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Crosses, ST_LineCrossingDirection, ST_Disjoint, ST_Distance, ST_HausdorffDistance, ST_MaxDistance, ST_DistanceSphere, ST_DistanceSpheroid, ST_DFullyWithin, ST_DWithin, ST_Equals, ST_HasArc, ST_Intersects, ST_Length, ST_Length2D, ST_3DLength, ST_Length_Spheroid, ST_Length2D_Spheroid, ST_3DLength_Spheroid, ST_LongestLine, ST_OrderingEquals, ST_Overlaps, ST_Perimeter, ST_Perimeter2D, ST_3DPerimeter, ST_PointOnSurface, ST_Project, ST_Relate, ST_RelateMatch, ST_ShortestLine, ST_Touches, ST_Within

+

Geometry processing

+

ST_Buffer, ST_BuildArea, ST_Collect, ST_ConcaveHull, ST_ConvexHull, ST_CurveToLine, ST_DelaunayTriangles, ST_Difference, ST_Dump, ST_DumpPoints, ST_DumpRings, ST_FlipCoordinates, ST_Intersection, ST_LineToCurve, ST_MakeValid, ST_MemUnion, ST_MinimumBoundingCircle, ST_Polygonize, ST_Node, ST_OffsetCurve, ST_RemoveRepeatedPoints, ST_SharedPaths, ST_Shift_Longitude, ST_Simplify, ST_SimplifyPreserveTopology, ST_Split, ST_SymDifference, ST_Union, ST_UnaryUnion

+

Linear referencing

+

ST_LineInterpolatePoint, ST_LineLocatePoint, ST_LineSubstring, ST_LocateAlong, ST_LocateBetween, ST_LocateBetweenElevations, ST_InterpolatePoint, ST_AddMeasure

+

Miscellaneous functions

+

ST_Accum, Box2D, Box3D, ST_Expand, ST_Extent, ST_3Dextent, Find_SRID, ST_MemSize

+

Exceptional functions

+

PostGIS_AddBBox, PostGIS_DropBBox, PostGIS_HasBBox

+

Raster Management Functions

+

AddRasterConstraints, DropRasterConstraints, AddOverviewConstraints, DropOverviewConstraints, PostGIS_GDAL_Version, PostGIS_Raster_Lib_Build_Date, PostGIS_Raster_Lib_Version, and ST_GDALDrivers, and UpdateRasterSRID

+

Raster Constructors

+

ST_AddBand, ST_AsRaster, ST_Band, ST_MakeEmptyRaster, ST_Tile, and ST_FromGDALRaster

+

Raster Accessors

+

ST_GeoReference, ST_Height, ST_IsEmpty, ST_MetaData, ST_NumBands, ST_PixelHeight, ST_PixelWidth, ST_ScaleX, ST_ScaleY, ST_RasterToWorldCoord, ST_RasterToWorldCoordX, ST_RasterToWorldCoordY, ST_Rotation, ST_SkewX, ST_SkewY, ST_SRID, ST_Summary, ST_UpperLeftX, ST_UpperLeftY, ST_Width, ST_WorldToRasterCoord, ST_WorldToRasterCoordX, ST_WorldToRasterCoordY

+

Raster Band Accessors

+

ST_BandMetaData, ST_BandNoDataValue, ST_BandIsNoData, ST_BandPath, ST_BandPixelType, and ST_HasNoBand

+

Raster Pixel Accessors and Setters

+

ST_PixelAsPolygon, ST_PixelAsPolygons, ST_PixelAsPoint, ST_PixelAsPoints, ST_PixelAsCentroid, ST_PixelAsCentroids, ST_Value, ST_NearestValue, ST_Neighborhood, ST_SetValue, ST_SetValues, ST_DumpValues, and ST_PixelOfValue

+

Raster Editors

+

ST_SetGeoReference, ST_SetRotation, ST_SetScale, ST_SetSkew, ST_SetSRID, ST_SetUpperLeft, ST_Resample, ST_Rescale, ST_Reskew, and ST_SnapToGrid, ST_Resize, and ST_Transform

+

Raster Band Editors

+

ST_SetBandNoDataValue and ST_SetBandIsNoData

+

Raster Band Statistics and Analytics

+

ST_Count, ST_CountAgg, ST_Histogram, ST_Quantile, ST_SummaryStats, ST_SummaryStatsAgg, and ST_ValueCount

+

Raster Outputs

+

ST_AsBinary, ST_AsGDALRaster, ST_AsJPEG, ST_AsPNG, and ST_AsTIFF

+

Raster Processing

+

ST_Clip, ST_ColorMap, ST_Intersection, ST_MapAlgebra, ST_Reclass, and ST_Union ST_Distinct4ma, ST_InvDistWeight4ma, ST_Max4ma, ST_Mean4ma, ST_Min4ma, ST_MinDist4ma, ST_Range4ma, ST_StdDev4ma, and ST _Sum4ma, ST_Aspect, ST_HillShade, ST_Roughness, ST_Slope, ST_TPI, ST_TRI, Box3D, ST_ConvexHull, ST_DumpAsPolygons, and ST_ Envelope, ST_MinConvexHull, ST_Polygon, ST_Contains, ST_ContainsProperly, ST_Covers, ST_CoveredBy, ST_Disjoint, ST_Intersects, and ST_Overlaps, ST_Touches, ST_SameAlignment, ST_NotSameAlignmentReason, ST_Within, ST_DWithin, and ST_DFullyWithin

+

Raster Operators

+

&&, &<, &>, =, @, ~=, and ~

+
+
+
+

Spatial Indexes

In GaussDB(DWS), PostGIS Extension supports Generalized Search Tree (GIST) spatial indexes. This index type is inapplicable to partitioned tables. Different from B-tree indexes, GIS indexes are adaptable to all kinds of irregular data structures, which can effectively improve the retrieval efficiency for geometry and geographic data.

+

Run the following command to create a GiST index:

+
1
CREATE INDEX indexname ON tablename USING GIST ( geometryfield );
+
+ +
+
+

Extension Constraints

  • Only row-store tables are supported.
  • Only Oracle-compatible databases are supported.
  • The topology object management module, Topology, is not supported.
  • BRIN indexes are not supported.
  • The spatial_ref_sys table can only be queried during scale-out.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0306.html b/docs/dws/dev/dws_04_0306.html new file mode 100644 index 00000000..ebcdf386 --- /dev/null +++ b/docs/dws/dev/dws_04_0306.html @@ -0,0 +1,1351 @@ + + +

OPEN SOURCE SOFTWARE NOTICE (For PostGIS)

+

This document contains open source software notice for the product. And this document is confidential information of copyright holder. Recipient shall protect it in due care and shall not disseminate it without permission.

+

+

Warranty Disclaimer

+

This document is provided "as is" without any warranty whatsoever, including the accuracy or comprehensiveness. Copyright holder of this document may change the contents of this document at any time without prior notice, and copyright holder disclaims any liability in relation to recipient's use of this document.

+

Open source software is provided by the author "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the author be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of data or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of open source software, even if advised of the possibility of such damage.

+

+

Copyright Notice And License Texts

+

Software: postgis-2.4.2

+

Copyright notice:

+

"Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (C) 1989, 1991 Free Software Foundation, Inc.,

+

51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Copyright 2008 Kevin Neufeld

+

Copyright (c) 2009 Walter Bruce Sinclair

+

Copyright 2006-2013 Stephen Woodbridge.

+

Copyright (c) 2008 Walter Bruce Sinclair

+

Copyright (c) 2012 TJ Holowaychuk <tj@vision-media.ca>

+

Copyright (c) 2008, by Attractive Chaos <attractivechaos@aol.co.uk>

+

Copyright (c) 2001-2012 Walter Bruce Sinclair

+

Copyright (c) 2010 Walter Bruce Sinclair

+

Copyright 2006 Stephen Woodbridge

+

Copyright 2006-2010 Stephen Woodbridge.

+

Copyright (c) 2006-2014 Stephen Woodbridge.

+

Copyright (c) 2017, Even Rouault <even.rouault at spatialys.com>

+

Copyright (C) 2004-2015 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2008-2011 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2008 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright 2015 Nicklas Avén <nicklas.aven@jordogskog.no>

+

Copyright 2008 Paul Ramsey

+

Copyright (C) 2012 Sandro Santilli <strk@kbt.io>

+

Copyright 2012 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2014 Sandro Santilli <strk@kbt.io>

+

Copyright 2013 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright 2009 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright 2008 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright 2011 Sandro Santilli <strk@kbt.io>

+

Copyright 2015 Daniel Baston

+

Copyright 2009 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright 2014 Kashif Rasul <kashif.rasul@gmail.com> and

+

Shoaib Burq <saburq@gmail.com>

+

Copyright 2013 Sandro Santilli <strk@kbt.io>

+

Copyright 2010 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2017 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2015 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2009 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2011 Sandro Santilli <strk@kbt.io>

+

Copyright 2010 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright 2014 Nicklas Avén

+

Copyright 2011-2016 Regina Obe

+

Copyright (C) 2008 Paul Ramsey

+

Copyright (C) 2011-2015 Sandro Santilli <strk@kbt.io>

+

Copyright 2010-2012 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright (C) 2015 Daniel Baston <dbaston@gmail.com>

+

Copyright (C) 2013 Nicklas Avén

+

Copyright (C) 2016 Sandro Santilli <strk@kbt.io>

+

Copyright 2017 Darafei Praliaskouski <me@komzpa.net>

+

Copyright (c) 2016, Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2011-2012 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2011 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2007-2008 Mark Cave-Ayland

+

Copyright (C) 2001-2006 Refractions Research Inc.

+

Copyright 2015 Daniel Baston <dbaston@gmail.com>

+

Copyright 2009 David Skea <David.Skea@gov.bc.ca>

+

Copyright (C) 2012-2015 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2012-2015 Sandro Santilli <strk@kbt.io>

+

Copyright 2001-2006 Refractions Research Inc.

+

Copyright (C) 2004 Refractions Research Inc.

+

Copyright 2011-2014 Sandro Santilli <strk@kbt.io>

+

Copyright 2009-2010 Sandro Santilli <strk@kbt.io>

+

Copyright 2015-2016 Daniel Baston <dbaston@gmail.com>

+

Copyright 2011-2015 Sandro Santilli <strk@kbt.io>

+

Copyright 2007-2008 Mark Cave-Ayland

+

Copyright 2012-2013 Oslandia <infos@oslandia.com>

+

Copyright (C) 2015-2017 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2001-2003 Refractions Research Inc.

+

Copyright 2016 Sandro Santilli <strk@kbt.io>

+

Copyright 2011 Kashif Rasul <kashif.rasul@gmail.com>

+

Copyright (C) 2014 Nicklas Avén

+

Copyright (C) 2010 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2010-2015 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2011 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2011-2014 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc.

+

Copyright (C) 2011 Paul Ramsey

+

Copyright 2001-2003 Refractions Research Inc.

+

Copyright 2009-2010 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright 2010-2012 Oslandia

+

Copyright 2006 Corporacion Autonoma Regional de Santander

+

Copyright 2013 Nicklas Avén

+

Copyright 2011-2016 Arrival 3D, Regina Obe

+

Copyright (C) 2009 David Skea <David.Skea@gov.bc.ca>

+

Copyright (C) 2017 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2009-2012 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2010 - Oslandia

+

Copyright (C) 2006 Mark Leslie <mark.leslie@lisasoft.com>

+

Copyright (C) 2008-2009 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright (C) 2009-2015 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2010 Olivier Courtin <olivier.courtin@camptocamp.com>

+

Copyright 2010 Nicklas Avén

+

Copyright 2012 Paul Ramsey

+

Copyright 2011 Nicklas Avén

+

Copyright 2002 Thamer Alharbash

+

Copyright 2011 OSGeo

+

Copyright (C) 2009-2011 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2008 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright (C) 2004-2007 Refractions Research Inc.

+

Copyright 2010 LISAsoft Pty Ltd

+

Copyright 2010 Mark Leslie

+

Copyright (c) 1999, Frank Warmerdam

+

Copyright 2009 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright (c) 2007, Frank Warmerdam

+

Copyright 2008 OpenGeo.org

+

Copyright (C) 2008 OpenGeo.org

+

Copyright (C) 2009 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright 2010 LISAsoft

+

Copyright (C) 2010 Mark Cave-Ayland <mark.cave-ayland@siriusit.co.uk>

+

Copyright (c) 1999, 2001, Frank Warmerdam

+

Copyright (C) 2016-2017 Bj?rn Harrtell <bjorn@wololo.org>

+

Copyright (C) 2017 Danny G?tte <danny.goette@fem.tu-ilmenau.de>

+

Copyright 2009-2011 Paul Ramsey <pramsey@cleverelephant.ca>

+

^copyright^

+

Copyright 2012 (C) Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright 2009 Paul Ramsey <pramsey@opengeo.org>

+

Copyright 2001-2009 Refractions Research Inc.

+

Copyright (C) 2010 Olivier Courtin <olivier.courtin@oslandia.com>

+

By Nathan Wagner, copyright disclaimed,

+

this entire file is in the public domain

+

Copyright 2009-2011 Olivier Courtin <olivier.courtin@oslandia.com>

+

Copyright (C) 2001-2005 Refractions Research Inc.

+

Copyright 2001-2011 Refractions Research Inc.

+

Copyright 2009-2014 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2008 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2010 Sandro Santilli <strk@kbt.io>

+

Copyright 2012 J Smith <dark.panda@gmail.com>

+

Copyright 2009 - 2010 Oslandia

+

Copyright 2009 Oslandia

+

Copyright 2001-2005 Refractions Research Inc.

+

Copyright 2016 Paul Ramsey <pramsey@cleverelephant.ca>

+

Copyright 2016 Daniel Baston <dbaston@gmail.com>

+

Copyright (C) 2011 OpenGeo.org

+

Copyright (c) 2003-2017, Troy D. Hanson http:troydhanson.github.com/uthash/

+

Copyright (C) 2011 Regents of the University of California

+

Copyright (C) 2011-2013 Regents of the University of California

+

Copyright (C) 2010-2011 Jorge Arevalo <jorge.arevalo@deimos-space.com>

+

Copyright (C) 2010-2011 David Zwarg <dzwarg@azavea.com>

+

Copyright (C) 2009-2011 Pierre Racine <pierre.racine@sbf.ulaval.ca>

+

Copyright (C) 2009-2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2008-2009 Sandro Santilli <strk@kbt.io>

+

Copyright (C) 2013 Nathaneil Hunter Clay <clay.nathaniel@gmail.com

+

Copyright (C) 2013 Nathaniel Hunter Clay <clay.nathaniel@gmail.com>

+

Copyright (C) 2013 Bborie Park <dustymugs@gmail.com>

+

Copyright (C) 2013 Nathaniel Hunter Clay <clay.nathaniel@gmail.com>

+

(C) 2009 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2009 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2009-2010 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2009-2010 Jorge Arevalo <jorge.arevalo@deimos-space.com>

+

Copyright (C) 2012 Regents of the University of California

+

Copyright (C) 2013 Regents of the University of California

+

Copyright (C) 2012-2013 Regents of the University of California

+

Copyright (C) 2009 Sandro Santilli <strk@kbt.io>

+

"

+

License: The GPL v2 License.

+

GNU GENERAL PUBLIC LICENSE

+

Version 2, June 1991

+

+

Copyright (C) 1989, 1991 Free Software Foundation, Inc.

+

51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

+

Preamble

+

+

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.

+

+

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.

+

+

To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.

+

+

For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

+

+

We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.

+

+

Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.

+

+

Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.

+

+

The precise terms and conditions for copying, distribution and modification follow.?

+

GNU GENERAL PUBLIC LICENSE

+

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+

+

0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".

+

+

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.

+

+

1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.

+

+

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

+

+

2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:

+

+

a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

+

+

b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.

+

+

c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)

+

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

+

+

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.

+

+

In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

+

+

3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:

+

+

a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

+

+

b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,

+

+

c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)

+

+

The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.

+

+

If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.

+

+

4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

+

+

5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.

+

+

6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.

+

+

7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.

+

+

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.

+

+

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.

+

+

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

+

+

8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

+

+

9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

+

+

Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.

+

+

10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.

+

+

NO WARRANTY

+

+

11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+

+

12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+

+

END OF TERMS AND CONDITIONS

+

How to Apply These Terms to Your New Programs

+

+

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

+

+

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

+

+

<one line to give the program's name and a brief idea of what it does.>

+

Copyright (C) <year> <name of author>

+

+

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

+

+

This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

+

+

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

+

Also add information on how to contact you by electronic and paper mail.

+

+

If the program is interactive, make it output a short notice like this when it starts in an interactive mode:

+

+

Gnomovision version 69, Copyright (C) year name of author

+

Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.

+

This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.

+

+

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.

+

+

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:

+

+

Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.

+

+

<signature of Ty Coon>, 1 April 1989 Ty Coon, President of Vice

+

+

This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.

+

+

Software:Geos

+

Copyright notice:

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2013 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

Copyright (C) 2005-2011 Refractions Research Inc.

+

Copyright (C) 2009 Ragi Y. Burhum <ragi@burhum.com>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2005 2006 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006-2011 Refractions Research Inc.

+

Copyright (C) 2011 Sandro Santilli <strk@keybit.net

+

Copyright (C) 2009-2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2016 Daniel Baston

+

Copyright (C) 2008 Sean Gillies

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Refractions Research Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2008-2010 Safe Software Inc.

+

Copyright (C) 2006-2007 Refractions Research Inc.

+

Copyright (C) 2005-2007 Refractions Research Inc.

+

Copyright (C) 2007 Refractions Research Inc.

+

Copyright (C) 2014 Mika Heiskanen <mika.heiskanen@fmi.fi>

+

Copyright (C) 2009-2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 2011 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2010 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2009 Mateusz Loskot

+

Copyright (C) 2005-2009 Refractions Research Inc.

+

Copyright (C) 2001-2009 Vivid Solutions Inc.

+

Copyright (C) 2012 Sandro Santilli <strk@keybit.net>

+

Copyright (C) 2006 Wu Yongwei

+

Copyright (C) 2012 Excensus LLC.

+

Copyright (C) 1996-2015 Free Software Foundation, Inc.

+

Copyright (c) 1995 Olivier Devillers <Olivier.Devillers@sophia.inria.fr>

+

Copyright (C) 2007-2010 Safe Software Inc.

+

Copyright (C) 2010 Safe Software Inc.

+

Copyright (C) 2006 Refractions Research

+

Copyright 2004 Sean Gillies, sgillies@frii.com

+

Copyright (C) 2011 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2015 Nyall Dawson <nyall dot dawson at gmail dot com>

+

Original code (2.0 and earlier )copyright (c) 2000-2006 Lee Thomason (www.grinninglizard.com)

+

Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com)

+

+

License: LGPL V2.1

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

Version 2.1, February 1999

+

Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

+

+

[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]

+

+

Preamble

+

+

The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public

+

Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.

+

+

This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.

+

+

When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.

+

+

To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.

+

+

For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.

+

+

We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.

+

+

To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.

+

+

Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.

+

+

Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and

+

is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.

+

+

When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.

+

+

We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.

+

+

For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.

+

+

In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in

+

non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.

+

+

Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.

+

The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The

+

former contains code derived from the library, whereas the latter must be combined with the library in order to run.

+

+

GNU LESSER GENERAL PUBLIC LICENSE

+

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

+

+

0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".

+

+

A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.

+

+

The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under

+

copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)

+

+

"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.

+

+

Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.

+

+

1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an

+

appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the

+

Library.

+

+

You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.

+

+

2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1

+

above, provided that you also meet all of these conditions:

+

+

a) The modified work must itself be a software library.

+

+

b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.

+

+

c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.

+

+

d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of

+

its purpose remains meaningful.

+

+

(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)

+

+

These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in

+

themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.

+

+

Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or

+

collective works based on the Library.

+

+

In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.

+

+

3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.

+

+

Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

+

+

This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

+

+

4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany

+

it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.

+

+

If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to

+

distribute the source code, even though third parties are not compelled to copy the source along with the object code.

+

+

5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a

+

work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.

+

+

However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License.

+

Section 6 states terms for distribution of such executables.

+

+

When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.

+

+

If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object

+

file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)

+

+

Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6,

+

whether or not they are linked directly with the Library itself.

+

+

6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work

+

under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.

+

+

You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:

+

+

a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)

+

+

b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system,

+

rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.

+

+

c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.

+

+

d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.

+

+

e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.

+

+

For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception,

+

the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on

+

which the executable runs, unless that component itself accompanies the executable.

+

+

It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot

+

use both them and the Library together in an executable that you distribute.

+

+

7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:

+

+

a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.

+

+

b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.

+

+

8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

+

+

9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.

+

+

10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein.

+

You are not responsible for enforcing compliance by third parties with this License.

+

+

11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.

+

+

If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.

+

+

It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the

+

integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot

+

impose that choice.

+

+

This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.

+

+

12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.

+

+

13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time.

+

Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

+

+

Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.

+

+

14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is

+

copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status

+

of all derivatives of our free software and of promoting the sharing and reuse of software generally.

+

+

NO WARRANTY

+

+

15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

+

+

16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING

+

RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

+

+

END OF TERMS AND CONDITIONS

+

+

How to Apply These Terms to Your New Libraries

+

+

If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).

+

+

To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

+

+

<one line to give the library's name and a brief idea of what it does.>

+

Copyright (C) <year> <name of author>

+

+

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

+

+

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU

+

Lesser General Public License for more details.

+

+

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

+

+

Also add information on how to contact you by electronic and paper mail.

+

+

You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:

+

+

Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker.

+

+

<signature of Ty Coon>, 1 April 1990

+

Ty Coon, President of Vice

+

+

That's all there is to it!

+

+

Software: JSON-C

+

+

Copyright notice:

+

Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.

+

Copyright (c) 2009-2012 Eric Haszlakiewicz

+

Copyright (c) 2004, 2005 Metaparadigm Pte Ltd

+

Copyright (c) 2009 Hewlett-Packard Development Company, L.P.

+

Copyright 2011, John Resig

+

Copyright 2011, The Dojo Foundation

+

Copyright (c) 2012 Eric Haszlakiewicz

+

Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.

+

Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.

+

Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,

+

2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.

+

Copyright (c) 2013 Metaparadigm Pte. Ltd.

+

+

License: MIT License

+

+

Copyright (c) 2009-2012 Eric Haszlakiewicz

+

+

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+

+

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+

+

----------------------------------------------------------------

+

+

Copyright (c) 2004, 2005 Metaparadigm Pte Ltd

+

+

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

+

+

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

+

+

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+

+

Software: proj

+

Copyright notice:

+

"Copyright (C) 2010 Mateusz Loskot <mateusz@loskot.net>

+

Copyright (C) 2007 Douglas Gregor <doug.gregor@gmail.com>

+

Copyright (C) 2007 Troy Straszheim

+

CMake, Copyright (C) 2009-2010 Mateusz Loskot <mateusz@loskot.net> )

+

Copyright (C) 2011 Nicolas David <nicolas.david@ign.fr>

+

Copyright (c) 2000, Frank Warmerdam

+

Copyright (c) 2011, Open Geospatial Consortium, Inc.

+

Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,

+

2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.

+

Copyright (c) Charles Karney (2012-2015) <charles@karney.com> and licensed

+

Copyright (c) 2005, Antonello Andrea

+

Copyright (c) 2010, Frank Warmerdam

+

Copyright (c) 1995, Gerald Evenden

+

Copyright (c) 2000, Frank Warmerdam <warmerdam@pobox.com>

+

Copyright (c) 2010, Frank Warmerdam <warmerdam@pobox.com>

+

Copyright (c) 2013, Frank Warmerdam

+

Copyright (c) 2003 Gerald I. Evenden

+

Copyright (c) 2012, Frank Warmerdam <warmerdam@pobox.com>

+

Copyright (c) 2002, Frank Warmerdam

+

Copyright (c) 2004 Gerald I. Evenden

+

Copyright (c) 2012 Martin Raspaud

+

Copyright (c) 2001, Thomas Flemming, tf@ttqv.com

+

Copyright (c) 2002, Frank Warmerdam <warmerdam@pobox.com>

+

Copyright (c) 2009, Frank Warmerdam

+

Copyright (c) 2003, 2006 Gerald I. Evenden

+

Copyright (c) 2011, 2012 Martin Lambers <marlam@marlam.de>

+

Copyright (c) 2006, Andrey Kiselev

+

Copyright (c) 2008-2012, Even Rouault <even dot rouault at mines-paris dot org>

+

Copyright (c) 2001, Frank Warmerdam

+

Copyright (c) 2001, Frank Warmerdam <warmerdam@pobox.com>

+

Copyright (c) 2008 Gerald I. Evenden

+

"

+

+

License: MIT License

+

Please see above

+

+

Software: libxml2

+

Copyright notice:

+

+

"See Copyright for the status of this software.

+

Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved.

+

Copyright (C) 2003 Daniel Veillard.

+

copy: see Copyright for the status of this software.

+

copy: see Copyright for the status of this software

+

copy: see Copyright for the status of this software.

+

Copyright (C) 2000 Bjorn Reese and Daniel Veillard.

+

Copy: See Copyright for the status of this software.

+

See COPYRIGHT for the status of this software

+

Copyright (C) 2000 Gary Pennington and Daniel Veillard.

+

Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,

+

2007 Free Software Foundation, Inc.

+

Copyright (C) 1998 Bjorn Reese and Daniel Stenberg.

+

Copyright (C) 2001 Bjorn Reese <breese@users.sourceforge.net>

+

Copyright (C) 2000 Bjorn Reese and Daniel Stenberg.

+

Copyright (C) 2001 Bjorn Reese and Daniel Stenberg.

+

See Copyright for the status of this software

+

"

+

License: MIT License

+

Please see above

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0393.html b/docs/dws/dev/dws_04_0393.html new file mode 100644 index 00000000..d367334f --- /dev/null +++ b/docs/dws/dev/dws_04_0393.html @@ -0,0 +1,26 @@ + + +

Resource Monitoring

+

GaussDB(DWS) provides multiple dimensional resource monitoring views to show the real-time and historical resource usage of tasks.

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0394.html b/docs/dws/dev/dws_04_0394.html new file mode 100644 index 00000000..a021414c --- /dev/null +++ b/docs/dws/dev/dws_04_0394.html @@ -0,0 +1,62 @@ + + +

User Resource Query

+

Context

In the multi-tenant management framework, you can query the real-time or historical usage of all user resources (including memory, CPU cores, storage space, temporary space, and I/Os).

+
  • User real-time resource views/functions: PG_TOTAL_USER_RESOURCE_INFO and GS_WLM_USER_RESOURCE_INFO; user historical resource table: GS_WLM_USER_RESOURCE_HISTORY.
  • In the preceding views and tables, the value of used_cpu indicates the CPU usage of a user's resource pool. The resource pool records only the CPU usage of long queries.
  • In the preceding views and tables, I/O-related resource statistics only record I/O read and write data of long queries executed by users.
  • When there are a large number of users and a large cluster, querying such real-time views will cause network latency due to the real-time communication overhead between CNs and DNs.
  • User memory and CPU monitoring does not apply to short queries or administrator jobs.
+
+
+

Procedure

  • Query all users' resource quotas and real-time resource usage.
    1
    SELECT * FROM PG_TOTAL_USER_RESOURCE_INFO;
    +
    + +
    +

    The result view is as follows:

    +
    username        | used_memory | total_memory | used_cpu | total_cpu | used_space | total_space | used_temp_space | total_temp_space | used_spill_space | total_spill_space | read_kbytes | write_kbytes | read_counts | write_counts | read_speed | write_speed
    +-----------------------+-------------+--------------+----------+-----------+------------+-------------+-----------------+------------------+------------------+-------------------+-------------+--------------+-------------+--------------+------------+-------------
    +perfadm               |           0 |        17250 |        0 |         0 |          0 |          -1 |               0 |               -1 |                0 |                -1 |           0 |            0 |           0 |            0 |          0 |           0
    +usern                 |           0 |        17250 |        0 |        48 |          0 |          -1 |               0 |               -1 |                0 |                -1 |           0 |            0 |           0 |            0 |          0 |           0
    +userg                 |          34 |        15525 |    23.53 |        48 |          0 |          -1 |               0 |               -1 |        814955731 |                -1 |     6111952 |      1145864 |      763994 |       143233 |      42678 |        8001
    +userg1                |          34 |        13972 |    23.53 |        48 |          0 |          -1 |               0 |               -1 |        814972419 |                -1 |     6111952 |      1145864 |      763994 |       143233 |      42710 |        8007
    +(4 rows)
    +

    The I/O resource monitoring fields (read_kbytes, write_kbytes, read_counts, write_counts, read_speed, and write_speed) can be available only when the GUC parameter enable_user_metric_persistent is enabled.

    +

    For details about each column, see PG_TOTAL_USER_RESOURCE_INFO.

    +
+
  • Query a user's resource quota and real-time resource usage.
    1
    SELECT * FROM GS_WLM_USER_RESOURCE_INFO('username');
    +
    + +
    +

    The query result is as follows:

    +
    userid | used_memory | total_memory | used_cpu | total_cpu | used_space | total_space | used_temp_space | total_temp_space | used_spill_space | total_spill_space | read_kbytes | write_kbytes | read_counts | write_counts | read_speed | write_speed
    +--------+-------------+--------------+----------+-----------+------------+-------------+-----------------+------------------+------------------+-------------------+-------------+--------------+-------------+--------------+------------+-------------
    +16407 |           18 |        1655 |        6 |         19 |          13787176 |          -1 |               0 |               -1 |                0 |                -1 |           0 |            0 |           0 |            0 |          0 |           0
    +(1 row)
    +
+
  • Query all users' resource quotas and historical resource usage.
    1
    SELECT * FROM GS_WLM_USER_RESOURCE_HISTORY;
    +
    + +
    +

    The query result is as follows:

    +
    username        |           timestamp           | used_memory | total_memory | used_cpu | total_cpu | used_space | total_space | used_temp_space | total_temp_space | used_spill_space | total_spill_space | read_kbytes | write_kbytes | read_counts | write_counts | read_speed  | write_speed
    +-----------------------+-------------------------------+-------------+--------------+----------+-----------+------------+-------------+-----------------+------------------+------------------+-------------------+-------------+--------------+-------------+--------------+-------------+-------------
    +usern                 | 2020-01-08 22:56:06.456855+08 |           0 |        17250 |        0 |        48 |          0 |          -1 |               0 |               -1 |         88349078 |                -1 |       45680 |           34 |        5710 |            8 |         320 |           0
    +userg                 | 2020-01-08 22:56:06.458659+08 |           0 |        15525 |    33.48 |        48 |          0 |          -1 |               0 |               -1 |        110169581 |                -1 |       17648 |           23 |        2206 |            5 |         123 |           0
    +userg1                | 2020-01-08 22:56:06.460252+08 |           0 |        13972 |    33.48 |        48 |          0 |          -1 |               0 |               -1 |        136106277 |                -1 |       17648 |           23 |        2206 |            5 |         123 |           0
    +

    For the system catalog in GS_WLM_USER_RESOURCE_HISTORY, data in the PG_TOTAL_USER_RESOURCE_INFO view is periodically saved to historical tables only when the GUC parameter enable_user_metric_persistent is enabled.

    +

    For details about each column, see GS_WLM_USER_RESOURCE_HISTORY.

    +
  • Query the real-time I/O control resource usage of a specific user. (The value in the view indicates the I/O control resource usage instead of the actual I/O read/write data.)
    1
    SELECT * FROM pg_user_iostat('username');
    +
    + +
    +

    The query result is as follows:

    +
     userid | min_curr_iops | max_curr_iops | min_peak_iops | max_peak_iops | io_limits | io_priority
    + -------+---------------+---------------+---------------+---------------+-----------+------------- 
    +     10 |             0 |             0 |             0 |             0 |         0 | None
    +(1 row)
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0395.html b/docs/dws/dev/dws_04_0395.html new file mode 100644 index 00000000..146641df --- /dev/null +++ b/docs/dws/dev/dws_04_0395.html @@ -0,0 +1,71 @@ + + +

Monitoring Memory Resources

+

Monitoring the Memory

GaussDB(DWS) provides a view for monitoring the memory usage of the entire cluster.

+
Query the pgxc_total_memory_detail view as a user with sysadmin permissions.
1
SELECT * FROM pgxc_total_memory_detail;
+
+ +
+
+
If the following error message is returned during the query, enable the memory management function.
1
+2
+3
SELECT * FROM pgxc_total_memory_detail;
+ERROR:  unsupported view for memory protection feature is disabled.
+CONTEXT:  PL/pgSQL function pgxc_total_memory_detail() line 12 at FOR over EXECUTE statement
+
+ +
+
+
To enable memory management, you can set enable_memory_limit and max_process_memory on the GaussDB(DWS) console as follows:
  1. Log in to the GaussDB(DWS) management console.
  2. In the navigation pane on the left, click Clusters.
  3. In the cluster list, find the target cluster and click its name. The Basic Information page is displayed.
  4. Click the Parameter Modification tab, change the value of enable_memory_limit to on, and click Save to save the file.
  5. Change the value of max_process_memory to a proper one. For details about the modification suggestions, see max_process_memory. After it is done, click Save.
  6. In the Modification Preview dialog box, confirm the modifications and click Save. After the modification, restart the cluster for the modification to take effect.
+
+
+

Monitoring the Shared Memory

You can query the context information about the shared memory on the pg_shared_memory_detail view.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT * FROM pg_shared_memory_detail;
+           contextname           | level |             parent              | totalsize | freesize | usedsize 
+---------------------------------+-------+---------------------------------+-----------+----------+----------
+ ProcessMemory                   |     0 |                                 |     24576 |     9840 |    14736
+ Workload manager memory context |     1 | ProcessMemory                   |   2105400 |     7304 |  2098096
+ wlm collector hash table        |     2 | Workload manager memory context |      8192 |     3736 |     4456
+ Resource pool hash table        |     2 | Workload manager memory context |     24576 |    15968 |     8608
+ wlm cgroup hash table           |     2 | Workload manager memory context |     24576 |    15968 |     8608
+(5 rows)
+
+ +
+

This view lists the context name of the memory, level, the upper-layer memory context, and the total size of the shared memory.

+

In the database, GUC parameter memory_tracking_mode is used to configure the memory statistics collecting mode, including the following options:

+
  • none: The memory statistics collecting function is not enabled.
  • normal: Only memory statistics is collected in real time and no file is generated.
  • executor: The statistics file is generated, containing the context information about all allocated memory used on the execution layer.

    When the parameter is set to executor, cvs files are generated under the pg_log directory of the DN process. The file names are in the format of memory_track_<DN name>_query_<queryid>.csv. The information about the operators executed by the postgres thread of the executor and all stream threads are input in this file during task execution.

    +

    The instance is built with a file content similar to the following:

    +
    0, 0, ExecutorState, 0, PortalHeapMemory, 0, 40K, 602K, 23
    +1, 3, CStoreScan_29360131_25, 0, ExecutorState, 1, 265K, 554K, 23
    +2, 128, cstore scan per scan memory context, 1, CStoreScan_29360131_25, 2, 24K, 24K, 23
    +3, 127, cstore scan memory context, 1, CStoreScan_29360131_25, 2, 264K, 264K, 23
    +4, 7, InitPartitionMapTmpMemoryContext, 1, CStoreScan_29360131_25, 2, 31K, 31K, 23
    +5, 2, VecPartIterator_29360131_24, 0, ExecutorState, 1, 16K, 16K, 23
    +0, 0, ExecutorState, 0, PortalHeapMemory, 0, 24K, 1163K, 20
    +1, 3, CStoreScan_29360131_22, 0, ExecutorState, 1, 390K, 1122K, 20
    +2, 20, cstore scan per scan memory context, 1, CStoreScan_29360131_22, 2, 476K, 476K, 20
    +3, 19, cstore scan memory context, 1, CStoreScan_29360131_22, 2, 264K, 264K, 20
    +4, 7, InitPartitionMapTmpMemoryContext, 1, CStoreScan_29360131_22, 2, 23K, 23K, 20
    +5, 2, VecPartIterator_29360131_21, 0, ExecutorState, 1, 16K, 16K, 20
    +

    The fields include the output SN, SN of the memory allocation context within the thread, name of the current memory context, output SN of the parent memory context, name of the parent memory context, tree layer No. of the memory context, peak memory used by the current memory context, peak memory used by the current memory context and all its child memory contexts, and plan node ID of the query where the thread is executed.

    +

    In this example, the record "1, 3, CStoreScan_29360131_22, 0, ExecutorState, 1, 390K, 1122K, 20" represents the following information about Explain Analyze:

    +
    • CstoreScan_29360131_22 indicates the CstoreScan operator.
    • 1122K indicates the peak memory used by the CstoreScan operator.
    +
  • fullexec: The generated file includes the information about all memory contexts requested by the execution layer.

    If the parameter is set to fullexec, the output information will be similar to that for executor, except that some memory context allocation information may be returned because the information about all memory applications (no matter succeeded or not) is printed. As only the memory application information is recorded, the peak memory used by the memory context is recorded as 0.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0396.html b/docs/dws/dev/dws_04_0396.html new file mode 100644 index 00000000..1a8217d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0396.html @@ -0,0 +1,82 @@ + + +

Instance Resource Monitoring

+

GaussDB(DWS) provides system catalogs for monitoring the resource usage of CNs and DNs (including memory, CPU usage, disk I/O, process physical I/O, and process logical I/O), and system catalogs for monitoring the resource usage of the entire cluster.

+

For details about the system catalog GS_WLM_INSTANCE_HISTORY, see GS_WLM_INSTANCE_HISTORY.

+

Data in the system catalogGS_WLM_INSTANCE_HISTORY is distributed in corresponding instances. CN monitoring data is stored in the CN instance, and DN monitoring data is stored in the DN instance. The DN has a standby node. When the primary DN is abnormal, the monitoring data of the DN can be restored from the standby node. However, a CN has no standby node. When a CN is abnormal and then restored, the monitoring data of the CN will be lost.

+
+

Procedure

  • Query the latest resource usage of the current instance.
    1
    SELECT * FROM GS_WLM_INSTANCE_HISTORY ORDER BY TIMESTAMP DESC;
    +
    + +
    +

    The query result is as follows:

    +
    instancename |           timestamp           | used_cpu | free_mem | used_mem | io_await | io_util  | disk_read | disk_write | process_read | process_write | logical_read | logical_write | read_counts | write_counts
    +--------------+-------------------------------+----------+----------+----------+----------+----------+-----------+------------+--------------+---------------+--------------+---------------+-------------+--------------
    +dn_6015_6016 | 2020-01-10 17:29:17.329495+08 |        0 |    14570 |     8982 |  662.923 |  99.9601 |    697666 |    93655.5 |       183104 |         30082 |       285659 |         30079 |      357717 |        37667
    +dn_6015_6016 | 2020-01-10 17:29:07.312049+08 |        0 |    14578 |     8974 |  883.102 |  99.9801 |    756228 |    81417.4 |       189722 |         30786 |       285681 |         30780 |      358103 |        38584
    +dn_6015_6016 | 2020-01-10 17:28:57.284472+08 |        0 |    14583 |     8969 |  727.135 |  99.9801 |    648581 |    88799.6 |       177120 |         31176 |       252161 |         31175 |      316085 |        39079
    +dn_6015_6016 | 2020-01-10 17:28:47.256613+08 |        0 |    14591 |     8961 |  679.534 |   100.08 |    655360 |     169962 |       179404 |         30424 |       242002 |         30422 |      303351 |        38136
    +
+
+
  • Query the resource usage of the current instance during a specified period.
    1
    SELECT * FROM GS_WLM_INSTANCE_HISTORY WHERE TIMESTAMP > '2020-01-10' AND TIMESTAMP < '2020-01-11' ORDER BY TIMESTAMP DESC;
    +
    + +
    +

    The query result is as follows:

    +
    instancename |           timestamp           | used_cpu | free_mem | used_mem | io_await | io_util  | disk_read | disk_write | process_read | process_write | logical_read | logical_write | read_counts | write_counts
    +--------------+-------------------------------+----------+----------+----------+----------+----------+-----------+------------+--------------+---------------+--------------+---------------+-------------+--------------
    +dn_6015_6016 | 2020-01-10 17:29:17.329495+08 |        0 |    14570 |     8982 |  662.923 |  99.9601 |    697666 |    93655.5 |       183104 |         30082 |       285659 |         30079 |      357717 |        37667
    +dn_6015_6016 | 2020-01-10 17:29:07.312049+08 |        0 |    14578 |     8974 |  883.102 |  99.9801 |    756228 |    81417.4 |       189722 |         30786 |       285681 |         30780 |      358103 |        38584
    +dn_6015_6016 | 2020-01-10 17:28:57.284472+08 |        0 |    14583 |     8969 |  727.135 |  99.9801 |    648581 |    88799.6 |       177120 |         31176 |       252161 |         31175 |      316085 |        39079
    +dn_6015_6016 | 2020-01-10 17:28:47.256613+08 |        0 |    14591 |     8961 |  679.534 |   100.08 |    655360 |     169962 |       179404 |         30424 |       242002 |         30422 |      303351 |        38136
    +
+
  • To query the latest resource usage of a cluster, you can invoke the pgxc_get_wlm_current_instance_info stored procedure on the CN.
    1
    SELECT * FROM pgxc_get_wlm_current_instance_info('ALL');
    +
    + +
    +

    The query result is as follows:

    +
    instancename |           timestamp           | used_cpu | free_mem | used_mem | io_await | io_util | disk_read | disk_write | process_read | process_write | logical_read | logical_write | read_counts | write_counts
    +--------------+-------------------------------+----------+----------+----------+----------+---------+-----------+------------+--------------+---------------+--------------+---------------+-------------+--------------
    +coordinator2 | 2020-01-14 21:58:29.290894+08 |        0 |    12010 |      278 |  16.0445 | 7.19561 |   184.431 |    27959.3 |            0 |            10 |            0 |             0 |           0 |            0
    +coordinator3 | 2020-01-14 21:58:27.567655+08 |        0 |    12000 |      288 |  .964557 | 3.40659 |   332.468 |    3375.02 |           26 |            13 |            0 |             0 |           0 |            0
    +datanode1    | 2020-01-14 21:58:23.900321+08 |        0 |    11899 |      389 |  1.17296 |    3.25 |     329.6 |     2870.4 |           28 |             8 |           13 |             3 |          18 |            6
    +datanode2    | 2020-01-14 21:58:32.832989+08 |        0 |    11904 |      384 |   17.948 | 8.52148 |   214.186 |    25894.1 |           28 |            10 |           13 |             3 |          18 |            6
    +datanode3    | 2020-01-14 21:58:24.826694+08 |        0 |    11894 |      394 |  1.16088 |    3.15 |       328 |     2868.8 |           25 |            10 |           13 |             3 |          18 |            6
    +coordinator1 | 2020-01-14 21:58:33.367649+08 |        0 |    11988 |      300 |  9.53286 |   10.05 |      43.2 |      55232 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator1 | 2020-01-14 21:58:23.216645+08 |        0 |    11988 |      300 |  1.17085 | 3.21182 |   324.729 |    2831.13 |            8 |            13 |            0 |             0 |           0 |            0
    +(7 rows)
    +
+
  • To query historical resource usage of a cluster, you can invoke the pgxc_get_wlm_current_instance_info stored procedure on the CN.
    1
    SELECT * FROM pgxc_get_wlm_history_instance_info('ALL', '2020-01-14 21:00:00', '2020-01-14 22:00:00', 3);
    +
    + +
    +

    The query result is as follows:

    +
    instancename |           timestamp           | used_cpu | free_mem | used_mem | io_await |  io_util  | disk_read | disk_write | process_read | process_write | logical_read | logical_write | read_counts | write_counts
    +--------------+-------------------------------+----------+----------+----------+----------+-----------+-----------+------------+--------------+---------------+--------------+---------------+-------------+--------------
    +coordinator2 | 2020-01-14 21:50:49.778902+08 |        0 |    12020 |      268 |  .127371 |   .789211 |    15.984 |    3994.41 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator2 | 2020-01-14 21:53:49.043646+08 |        0 |    12018 |      270 |  30.2902 |   8.65404 |    276.77 |    16741.8 |            3 |             1 |            0 |             0 |           0 |            0
    +coordinator2 | 2020-01-14 21:57:09.202654+08 |        0 |    12018 |      270 |   .16051 |   .979021 |   59.9401 |       5596 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator3 | 2020-01-14 21:38:48.948646+08 |        0 |    12012 |      276 | .0769231 | .00999001 |         0 |    35.1648 |            0 |             1 |            0 |             0 |           0 |            0
    +coordinator3 | 2020-01-14 21:40:29.061178+08 |        0 |    12012 |      276 |  .118421 |  .0199601 |         0 |    970.858 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator3 | 2020-01-14 21:50:19.612777+08 |        0 |    12010 |      278 |   24.411 |   11.7665 |   8.78244 |    44641.1 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode1    | 2020-01-14 21:49:42.758649+08 |        0 |    11909 |      379 |  .798776 |      8.02 |      51.2 |    20924.8 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode1    | 2020-01-14 21:49:52.760188+08 |        0 |    11909 |      379 |  23.8972 |      14.1 |         0 |      74760 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode1    | 2020-01-14 21:50:22.769226+08 |        0 |    11909 |      379 |  39.5868 |       7.4 |         0 |    19760.8 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode2    | 2020-01-14 21:58:02.826185+08 |        0 |    11905 |      383 |  .351648 |       .32 |      20.8 |      504.8 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode2    | 2020-01-14 21:56:42.80793+08  |        0 |    11906 |      382 |  .559748 |       .04 |         0 |      326.4 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode2    | 2020-01-14 21:45:21.632407+08 |        0 |    11901 |      387 |  12.1313 |   4.55544 |    3.1968 |    45177.2 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode3    | 2020-01-14 21:58:14.823317+08 |        0 |    11898 |      390 |  .378205 |       .99 |        48 |    23353.6 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode3    | 2020-01-14 21:47:50.665028+08 |        0 |    11901 |      387 |  1.07494 |      1.19 |         0 |    15506.4 |            0 |             0 |            0 |             0 |           0 |            0
    +datanode3    | 2020-01-14 21:51:21.720117+08 |        0 |    11903 |      385 |  10.2795 |      3.11 |         0 |    11031.2 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator1 | 2020-01-14 21:42:59.121945+08 |        0 |    12020 |      268 | .0857143 |  .0699301 |         0 |    6579.02 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator1 | 2020-01-14 21:41:49.042646+08 |        0 |    12020 |      268 |  20.9039 |   11.3786 |   6042.76 |    57903.7 |            0 |             0 |            0 |             0 |           0 |            0
    +coordinator1 | 2020-01-14 21:41:09.007652+08 |        0 |    12020 |      268 | .0446429 |    .03996 |         0 |    1109.29 |            0 |             0 |            0 |             0 |           0 |            0
    +(18 rows)
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0397.html b/docs/dws/dev/dws_04_0397.html new file mode 100644 index 00000000..00e17a0f --- /dev/null +++ b/docs/dws/dev/dws_04_0397.html @@ -0,0 +1,143 @@ + + +

Real-time TopSQL

+

You can query real-time Top SQL in real-time resource monitoring views at different levels. The real-time resource monitoring view records the resource usage (including memory, disk, CPU time, and I/O) and performance alarm information during job running.

+

The following table describes the external interfaces of the real-time views.

+ +
+ + + + + + + + + + + + + + + + + + + +
Table 1 Real-time resource monitoring views

Level

+

Monitored Node

+

View

+

Query level/perf level

+

Current CN

+

GS_WLM_SESSION_STATISTICS

+

All CNs

+

PGXC_WLM_SESSION_STATISTICS

+

Operator level

+

Current CN

+

GS_WLM_OPERATOR_STATISTICS

+

All CNs

+

PGXC_WLM_OPERATOR_STATISTICS

+
+
+
  • The view level is determined by the resource monitoring level, that is, the resource_track_level configuration.
  • The perf and operator levels affect the values of the query_plan and warning columns in GS_WLM_SESSION_STATISTICS/PGXC_WLM_SESSION_INFO. For details, see SQL Self-Diagnosis.
  • Prefixes gs and pgxc indicate views showing single CN information and those showing cluster information, respectively. Common users can log in to a CN in the cluster to query only views with the gs prefix.
  • When you query this type of views, there will be network latency, because the views obtain resource usage in real time.
  • If instance fault occurs, some SQL statement information may fail to be recorded in real-time resource monitoring views.
  • SQL statements are recorded in real-time resource monitoring views as follows:
    • DDL statements are not recorded, such as the execution of CREATE, ALTER, DROP, GRANT, REVOKE, and VACUUM statements.
    • DML statements are recorded, including:
      • the execution of SELECT, INSERT, UPDATE, and DELETE
      • the execution of EXPLAIN ANALYZE and EXPLAIN PERFORMANCE
      • the use of a query-level/perf-level view, which also supports the CREATE TABLE AS syntax.
      +
    • Statements in functions and stored procedures and statements used for calling functions and stored procedures are recorded. Statements in loop bodies (if any) of functions and stored procedures are not recorded.
    • Statements in anonymous blocks are not recorded.
    • Statements in transaction blocks are recorded. Statements in loop bodies (if any) of transaction blocks are not recorded.
    • Cursor statements are recorded.
    • Jobs in a redistribution process are not monitored.
    +
+
+

Prerequisites

  • The GUC parameter enable_resource_track is set to on. The default value is on.
  • The GUC parameter resource_track_level is set to query, perf, or operator. The default value is query.
  • Job monitoring rules are as follows:
    • Jobs whose execution cost estimated by the optimizer is greater than or equal to resource_track_cost.
    • Long query jobs
    +
  • If the Cgroups function is properly loaded, you can run the gs_cgroup -P command to view information about Cgroups.
+

In the preceding prerequisites, enable_resource_track is a system-level parameter that specifies whether to enable resource monitoring. resource_track_level is a session-level parameter. You can set the resource monitoring level of a session as needed. The following table describes the values of the two parameters.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Setting the resource monitoring level to collect statistics

enable_resource_track

+

resource_track_level

+

Query-Level Information

+

Operator-Level Information

+

on(default)

+

none

+

Not collected

+

Not collected

+

query(default)

+

Collected

+

Not collected

+

perf

+

Collected

+

Not collected

+

operator

+

Collected

+

Collected

+

off

+

none/query/operator

+

Not collected

+

Not collected

+
+
+
+

Procedure

  1. Query for the real-time CPU information in the gs_session_cpu_statistics view.

    1
    SELECT * FROM gs_session_cpu_statistics;
    +
    + +
    +

  2. Query for the real-time memory information in the gs_session_memory_statistics view.

    1
    SELECT * FROM gs_session_memory_statistics;
    +
    + +
    +

  3. Query for the real-time resource information about the current CN in the gs_wlm_session_statistics view.

    1
    SELECT * FROM gs_wlm_session_statistics;
    +
    + +
    +

  4. Query for the real-time resource information about all CNs in the pgxc_wlm_session_statistics view.

    1
    SELECT * FROM pgxc_wlm_session_statistics;
    +
    + +
    +

  5. Query for the real-time resource information about job operators on the current CN in the gs_wlm_operator_statistics view.

    1
    SELECT * FROM gs_wlm_operator_statistics;
    +
    + +
    +

  6. Query for the real-time resource information about job operators on all CNs in the pgxc_wlm_operator_statistics view.

    1
    SELECT * FROM pgxc_wlm_operator_statistics;
    +
    + +
    +

  7. Query for the load management information about the jobs executed by the current user in the PG_SESSION_WLMSTAT view.

    1
    SELECT * FROM pg_session_wlmstat;
    +
    + +
    +

  8. Query the job execution status of the current user on each CN in the pgxc_wlm_workload_records view (this view is available when the dynamic load function is enabled, that is, enable_dynamic_workload is set to on).

    1
    SELECT * FROM pgxc_wlm_workload_records;
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0398.html b/docs/dws/dev/dws_04_0398.html new file mode 100644 index 00000000..9abda6e8 --- /dev/null +++ b/docs/dws/dev/dws_04_0398.html @@ -0,0 +1,156 @@ + + +

Historical TopSQL

+

You can query historical Top SQL in historical resource monitoring views. The historical resource monitoring view records the resource usage (of memory, disk, CPU time, and I/O), running status (including errors, termination, and exceptions), and performance alarm information during job running. For queries that abnormally terminate due to FATAL or PANIC errors, their status is displayed as aborted and no detailed information is recorded. Status information about query parsing in the optimization phase cannot be monitored.

+

The following table describes the external interfaces of the historical views.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Level

+

Monitored Node

+

View

+

Query level/perf level

+

Current CN

+

History (Database Manager interface)

+

GS_WLM_SESSION_HISTORY

+

History (internal dump interface)

+

GS_WLM_SESSION_INFO

+

All CNs

+

History (Database Manager interface)

+

PGXC_WLM_SESSION_HISTORY

+

History (internal dump interface)

+

PGXC_WLM_SESSION_INFO

+

Operator

+

Current CN

+

History (Database Manager interface)

+

GS_WLM_OPERATOR_HISTORY

+

History (internal dump interface)

+

GS_WLM_OPERAROR_INFO

+

All CNs

+

History (Database Manager interface)

+

PGXC_WLM_OPERATOR_HISTORY

+

History (internal dump interface)

+

PGXC_WLM_OPERATOR_INFO

+
+
+
  • The view level is determined by the resource monitoring level, that is, the resource_track_level configuration.
  • The perf and operator levels affect the values of the query_plan and warning columns in GS_WLM_SESSION_STATISTICS/PGXC_WLM_SESSION_INFO. For details, see SQL Self-Diagnosis.
  • Prefixes gs and pgxc indicate views showing single CN information and those showing cluster information, respectively. Common users can log in to a CN in the cluster to query only views with the gs prefix.
  • You can query the gs_wlm_session_info, gs_wlm_operator_info, pgxc_wlm_session_info, and pgxc_wlm_operator_info views only after connecting to the gaussdb database.
  • If instance fault occurs, some SQL statement information may fail to be recorded in historical resource monitoring views.
  • In some abnormal cases, the status information column in the historical TopSQL may be displayed as unknown. The recorded monitoring information may be inaccurate.
  • The SQL statements that can be recorded in historical resource monitoring views are the same as those recorded in real-time resource monitoring views. For details, see SQL statements recorded in real-time resource monitoring views.
+
+

Prerequisites

  • The GUC parameter enable_resource_track is set to on. The default value is on.
  • The GUC parameter resource_track_level is set to query, perf, or operator. The default value is query. For details, see Table 2.
  • The GUC parameter enable_resource_record is set to on. The default value is off.
  • The value of the resource_track_duration parameter (60s by default) is less than the job execution time.
  • Job monitoring rules are as follows: +
  • If the Cgroups function is properly loaded, you can run the gs_cgroup -P command to view information about Cgroups.
  • This function will cause storage space expansion and slightly affect system performance. You are not advised to set it as a default system function.
+
+

Procedure

  1. Query the load records of the current CN after its latest job is complete in the gs_wlm_session_history view.

    1
    SELECT * FROM gs_wlm_session_history;
    +
    + +
    +

  2. Query the load records of all the CNs after their latest job are complete in the pgxc_wlm_session_history view.

    1
     SELECT * FROM pgxc_wlm_session_history;
    +
    + +
    +

  3. Query the load records of the current CN through the gs_wlm_session_info table after the task is complete. To query the historical records successfully, set enable_resource_record to on.

    1
    SELECT * FROM gs_wlm_session_info;
    +
    + +
    +
    • Top 10 queries that consume the most memory (You can specify a query period.)
    +
    1
    SELECT * FROM gs_wlm_session_info order by max_peak_memory desc limit 10; 
    +
    + +
    +
    1
    SELECT * FROM gs_wlm_session_info WHERE start_time >= '2022-05-15 21:00:00' and finish_time <='2022-05-15 23:30:00'order by max_peak_memory desc limit 10; 
    +
    + +
    +
    • Top 10 queries that consume the most CPU (You can specify a query period.)
    +
    1
    SELECT * FROM gs_wlm_session_info order by total_cpu_time desc limit 10;
    +
    + +
    +
    1
    SELECT * FROM gs_wlm_session_info WHERE start_time >= '2022-05-15 21:00:00' and finish_time <='2022-05-15 23:30:00'order by total_cpu_time desc limit 10;
    +
    + +
    +

  4. Query for the load records of all the CNs after their jobs are complete in the pgxc_wlm_session_info view. To query the historical records successfully, set enable_resource_record to on.

    1
    SELECT * FROM pgxc_wlm_session_info;
    +
    + +
    +
    • Query the top 10 queries that take up the most CN processing time (You can specify a query period.)
    +
    1
    SELECT * FROM pgxc_wlm_session_info order by duration desc limit 10;
    +
    + +
    +
    1
    SELECT * FROM pgxc_wlm_session_info WHERE start_time >= '2022-05-15 21:00:00' and finish_time <='2022-05-15 23:30:00'order by nodename,max_peak_memory desc limit 10;
    +
    + +
    +

  5. Use the pgxc_get_wlm_session_info_bytime function to filter and query the pgxc_wlm_session_info view. To query the historical records successfully, set enable_resource_record to on. You are advised to use this function if the view contains a large number of records.

    A GaussDB(DWS) cluster uses the UTC time by default, which has an 8-hour time difference with the system time. Before queries, ensure that the database time is the same as the system time.

    +
    +
    • Return the queries started between 2019-09-10 15:30:00 and 2019-09-10 15:35:00 on all CNs. For each CN, a maximum of 10 queries will be returned.
    +
    1
    SELECT * FROM pgxc_get_wlm_session_info_bytime('start_time', '2019-09-10 15:30:00', '2019-09-10 15:35:00', 10);
    +
    + +
    +
    • Return the queries ended between 2019-09-10 15:30:00 and 2019-09-10 15:35:00 on all CNs. For each CN, a maximum of 10 queries will be returned.
    +
    1
    SELECT * FROM pgxc_get_wlm_session_info_bytime('finish_time', '2019-09-10 15:30:00', '2019-09-10 15:35:00', 10);
    +
    + +
    +

  6. Query the recent resource information of the job operators on the current CN in the gs_wlm_operator_history view. Ensure that resource_track_level is set to operator.

    1
    SELECT * FROM gs_wlm_operator_history;
    +
    + +
    +

  7. Query the recent resource information of the job operators on all the CNs in the pgxc_wlm_operator_history view. Ensure that resource_track_level is set to operator.

    1
    SELECT * FROM pgxc_wlm_operator_history;
    +
    + +
    +

  8. Query the recent resource information of the job operators on the current CN in the gs_wlm_operator_info view. Ensure that resource_track_level is set to operator and enable_resource_record to on.

    1
    SELECT * FROM gs_wlm_operator_info;
    +
    + +
    +

  9. Query for the historical resource information of job operators on all the CNs in the pgxc_wlm_operator_info view. Ensure that resource_track_level is set to operator and enable_resource_record to on.

    1
    SELECT * FROM pgxc_wlm_operator_info;
    +
    + +
    +

+
  • The number of data records that can be retained in the memory is limited, because certain memory is reserved. After a real-time query is complete, its information is imported to historical views and will be deleted when the information has been stored in the hash table in the memory for 3 minutes. The upper limit of records varies by view. For a query-level view, whether a record can be stored depends on the upper limit of records allowed by the memory at that time point. On each CN, the maximum number of real-time query-level records that can be stored in memory (default: 5MB) is max_session_realt_num (set to 12850 by default). The maximum number of historical records that can be stored in memory (default: 100MB) is max_session_hist_num (set to 137970 by default). The average execution time of queries in a service system is greater than run_time (in the unit of s). The maximum number of concurrent jobs allowed by real-time views on each CN is: num_realt_active = max_session_realt_num. The maximum number of concurrent jobs allowed by historical views on each CN is: num_hist_active = max_session_hist_num/(180/run_time).
  • For operator-level views, whether a record can be stored depends on the upper limit allowed by the memory at that time point. If the number of plan nodes plus the number of records in the memory exceeds the upper limit, the record cannot be stored. On each CN, the maximum numbers of real-time and historical operator-level records that can be stored in the memory are max_oper_realt_num (set to 56987 by default) and max_oper_hist_num (set to 113975 by default), respectively. The average number of plan nodes of a query is num_plan_node. Maximum number of concurrent tasks allowed by real-time views on each CN is: num_realt_active = max_oper_realt_num/num_plan_node. Maximum number of concurrent tasks allowed by historical views on each CN is: num_hist_active = max_oper_hist_num/(180/run_time)/num_plan_node.
  • In high concurrency, ensure that the number of queries to be recorded does not exceed the maximum values set for query- and operator-level queries. You can modify the memory of the real-time query view by setting session_statistics_memory and the memory of the historical query view by setting session_history_memory. The memory size increases in direct proportion to the maximum number of queries that can be recorded.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0399.html b/docs/dws/dev/dws_04_0399.html new file mode 100644 index 00000000..3007fa8d --- /dev/null +++ b/docs/dws/dev/dws_04_0399.html @@ -0,0 +1,122 @@ + + +

TopSQL Query Example

+

In this section, TPC-DS sample data is used as an example to describe how to query Real-time TopSQL and Historical TopSQL.

+

Configuring Cluster Parameters

To query for historical or archived resource monitoring information about jobs of top SQLs, you need to set related GUC parameters first. The procedure is as follows:

+
  1. Log in to the GaussDB(DWS) management console.
  2. On the Cluster Management page, locate the required cluster and click the cluster name. The cluster details page is displayed.
  3. Click the Parameter Modifications tab to view the values of cluster parameters.
  4. Set an appropriate value for parameter resource_track_duration and click Save.

    If enable_resource_record is set to on, storage space expansion may occur and thereby slightly affects the performance. Therefore, set is to off if record archiving is unnecessary.

    +
    +
  5. Go back to the Cluster Management page, click the refresh button in the upper right corner, and wait until the cluster parameter settings are applied.
+
+

Example for Querying for Top SQLs

The TPC-DS sample data is used as an example.

+
  1. Open the SQL client tool and connect to your database.
  2. Run the EXPLAIN statement to query for the estimated cost of the SQL statement to be executed to determine whether resources of the SQL statement will be monitored.

    By default, only resources of a query whose execution cost is greater than the value (default: 100000) of resource_track_cost are monitored and can be queried by users.

    +

    For example, run the following statements to query for the estimated execution cost of the SQL statement:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    SET CURRENT_SCHEMA = tpcds;
    +EXPLAIN WITH customer_total_return AS
    +( SELECT sr_customer_sk as ctr_customer_sk,
    +sr_store_sk as ctr_store_sk, 
    +sum(SR_FEE) as ctr_total_return 
    +FROM store_returns, date_dim
    +WHERE sr_returned_date_sk = d_date_sk AND d_year =2000
    +GROUP BY sr_customer_sk, sr_store_sk )
    +SELECT  c_customer_id
    +FROM customer_total_return ctr1, store, customer
    +WHERE ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 
    +FROM customer_total_return ctr2
    +WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk) 
    +AND s_store_sk = ctr1.ctr_store_sk
    +AND s_state = 'TN'
    +AND ctr1.ctr_customer_sk = c_customer_sk
    +ORDER BY c_customer_id
    +limit 100;
    +
    + +
    +

    In the following query result, the value in the first row of the E-costs column is the estimated cost of the SQL statement.

    +
    Figure 1 EXPLAIN result
    +

    In this example, to demonstrate the resource monitoring function of top SQLs, you need to set resource_track_cost to a value smaller than the estimated cost in the EXPLAIN result, for example, 100. For details about the parameter setting, see resource_track_cost.

    +

    After completing this example, you still need to reset resource_track_cost to its default value 100000 or a proper value. An overly small parameter value will compromise the database performance.

    +
    +

  3. Run SQL statements.

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    SET CURRENT_SCHEMA = tpcds;
    +WITH customer_total_return AS
    +(SELECT sr_customer_sk as ctr_customer_sk, 
    +sr_store_sk as ctr_store_sk, 
    +sum(SR_FEE) as ctr_total_return
    +FROM store_returns,date_dim
    +WHERE sr_returned_date_sk = d_date_sk
    +AND d_year =2000
    +GROUP BY sr_customer_sk ,sr_store_sk)
    +SELECT  c_customer_id
    +FROM customer_total_return ctr1, store, customer
    +WHERE ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2 
    +FROM customer_total_return ctr2
    +WHERE ctr1.ctr_store_sk = ctr2.ctr_store_sk)
    +AND s_store_sk = ctr1.ctr_store_sk
    +AND s_state = 'TN'
    +AND ctr1.ctr_customer_sk = c_customer_sk
    +ORDER BY c_customer_id
    +limit 100;
    +
    + +
    +

  4. During statement execution, query for the real-time memory peak information about the SQL statement on the current CN.

    1
    SELECT query,max_peak_memory,average_peak_memory,memory_skew_percent FROM gs_wlm_session_statistics ORDER BY start_time DESC;
    +
    + +
    +

    The preceding command queries for the real-time peak information at the query-level. The peak information includes the maximum memory peak among all DNs per second, average memory peak among all DNs per second, and memory usage skew across DNs.

    +

    For more examples of querying for the real-time resource monitoring information of top SQLs, see Real-time TopSQL.

    +

  5. Wait until the SQL statement execution in 3 is complete, and then query for the historical resource monitoring information of the statement.

    1
    select query,start_time,finish_time,duration,status from gs_wlm_session_history order by start_time desc;
    +
    + +
    +

    The preceding command queries for the historical information at the query-level. The peak information includes the execution start time, execution duration (unit: ms), and execution status. The time unit is ms.

    +

    For more examples of querying for the historical resource monitoring information of top SQLs, see Historical TopSQL.

    +

  6. Wait for 3 minutes after the execution of the SQL statement in 3 is complete, query for the historical resource monitoring information of the statement in the info view.

    If enable_resource_record is set to on and the execution time of the SQL statement in 3 is no less than the value of resource_track_duration, historical information about the SQL statement will be archived to the gs_wlm_session_info view 3 minutes after the execution of the SQL statement is complete.

    +

    The info view can be queried only when the gaussdb database is connected. Therefore, switch to the gaussdb database before running the following statement:

    +
    1
    select query,start_time,finish_time,duration,status from gs_wlm_session_info order by start_time desc;
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0400.html b/docs/dws/dev/dws_04_0400.html new file mode 100644 index 00000000..e736097b --- /dev/null +++ b/docs/dws/dev/dws_04_0400.html @@ -0,0 +1,25 @@ + + +

Query Performance Optimization

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0402.html b/docs/dws/dev/dws_04_0402.html new file mode 100644 index 00000000..0d9144e9 --- /dev/null +++ b/docs/dws/dev/dws_04_0402.html @@ -0,0 +1,12 @@ + + +

Overview of Query Performance Optimization

+

The aim of SQL optimization is to maximize the utilization of resources, including CPU, memory, disk I/O, and network I/O. To maximize resource utilization is to run SQL statements as efficiently as possible to achieve the highest performance at a lower cost. For example, when performing a typical point query, you can use the seqscan and filter (that is, read every tuple and query conditions for match). You can also use an index scan, which can be implemented at a lower cost but achieve the same effect.

+

This chapter describes how to analyze and improve query performance, and provides common cases and troubleshooting methods.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0403.html b/docs/dws/dev/dws_04_0403.html new file mode 100644 index 00000000..55efd126 --- /dev/null +++ b/docs/dws/dev/dws_04_0403.html @@ -0,0 +1,23 @@ + + +

Query Analysis

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0409.html b/docs/dws/dev/dws_04_0409.html new file mode 100644 index 00000000..f4a332a7 --- /dev/null +++ b/docs/dws/dev/dws_04_0409.html @@ -0,0 +1,66 @@ + + +

Query Execution Process

+

The process from receiving SQL statements to the statement execution by the SQL engine is shown in Figure 1 and Table 1. The texts in red are steps where database administrators can optimize queries.

+
Figure 1 Execution process of query-related SQL statements by the SQL engine
+ +
+ + + + + + + + + + + + + + + + + + + +
Table 1 Execution process of query-related SQL statements by the SQL engine

Procedure

+

Description

+

1. Perform syntax and lexical parsing.

+

Converts the input SQL statements from the string data type to the formatted structure stmt based on the specified SQL statement rules.

+

2. Perform semantic parsing.

+

Converts the formatted structure obtained from the previous step into objects that can be recognized by the database.

+

3. Rewrite the query statements.

+

Converts the output of the last step into the structure that optimizes the query execution.

+

4. Optimize the query.

+

Determines the execution mode of SQL statements (the execution plan) based on the result obtained from the last step and the internal database statistics. For details about the impact of statistics and GUC parameters on query optimization (execution plan), see Optimizing Queries Using Statistics and Optimizing Queries Using GUC parameters.

+

5. Perform the query.

+

Executes the SQL statements based on the execution path specified in the last step. Selecting a proper underlying storage mode improves the query execution efficiency. For details, see Optimizing Queries Using the Underlying Storage.

+
+
+

Optimizing Queries Using Statistics

The GaussDB(DWS) optimizer is a typical Cost-based Optimization (CBO). By using CBO, the database calculates the number of tuples and the execution cost for each execution step under each execution plan based on the number of table tuples, column width, NULL record ratio, and characteristic values, such as distinct, MCV, and HB values, and certain cost calculation methods. The database then selects the execution plan that takes the lowest cost for the overall execution or for the return of the first tuple. These characteristic values are the statistics, which is the core for optimizing a query. Accurate statistics helps the planner select the most appropriate query plan. Generally, you can collect statistics of a table or that of some columns in a table using ANALYZE. You are advised to periodically execute ANALYZE or execute it immediately after you modified most contents in a table.

+
+

Optimizing Queries Using GUC parameters

Optimizing queries aims to select an efficient execution mode.

+

Take the following statement as an example:

+
1
+2
select count(1) 
+from customer inner join store_sales on (ss_customer_sk = c_customer_sk);
+
+ +
+

During execution of customer inner join store_sales, GaussDB(DWS) supports nested loop, merge join, and hash join. The optimizer estimates the result set value and the execution cost under each join mode based on the statistics of the customer and store_sales tables and selects the execution plan that takes the lowest execution cost.

+

As described in the preceding content, the execution cost is calculated based on certain methods and statistics. If the actual execution cost cannot be accurately estimated, you need to optimize the execution plan by setting the GUC parameters.

+
+

Optimizing Queries Using the Underlying Storage

GaussDB(DWS) supports row- and column-based tables. The selection of an underlying storage mode strongly depends on specific customer business scenarios. You are advised to use column-store tables for computing service scenarios (mainly involving association and aggregation operations) and row-store tables for service scenarios, such as point queries and massive UPDATE or DELETE executions.

+

Optimization methods of each storage mode will be described in details in the performance optimization chapter.

+
+

Optimizing Queries by Rewriting SQL Statements

Besides the preceding methods that improve the performance of the execution plan generated by the SQL engine, database administrators can also enhance SQL statement performance by rewriting SQL statements while retaining the original service logic based on the execution mechanism of the database and abundant practical experience.

+

This requires that the system administrators know the customer business well and have professional knowledge of SQL statements.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0410.html b/docs/dws/dev/dws_04_0410.html new file mode 100644 index 00000000..ad1c8245 --- /dev/null +++ b/docs/dws/dev/dws_04_0410.html @@ -0,0 +1,25 @@ + + +

Overview of the SQL Execution Plan

+

The SQL execution plan is a node tree, which displays detailed procedure when GaussDB(DWS) runs an SQL statement. A database operator indicates one step.

+

You can run the EXPLAIN command to view the execution plan generated for each query by an optimizer. Explain outputs a row of information for each execution node, showing the basic node type and the expense estimate that the optimizer makes for executing the node. See Figure 1.

+
Figure 1 SQL execution plan example
+
  • Nodes at the bottom level are scan nodes. They scan tables and return raw rows. The types of scan nodes (sequential scans and index scans) vary depending on the table access methods. Objects scanned by the bottom layer nodes may not be row-store data (not directly read from a table), such as VALUES clauses and functions that return rows, which have their own types of scan nodes.
  • If the query requires join, aggregation, sorting, or other operations on the raw rows, there will be other nodes above the scan nodes to perform these operations. In addition, there is more than one possible way to perform these operations, so different execution node types may be displayed here.
  • The first row (the upper-layer node) estimates the total execution cost of the execution plan. This value indicates the value that the optimizer tries to minimize.
+

Execution Plan Display Format

GaussDB(DWS) provides four display formats: normal, pretty, summary, and run.

+
  • normal indicates that the default printing format is used. Figure 1 shows the display format.
  • pretty indicates that the optimized display mode of GaussDB(DWS) is used. A new format contains a plan node ID, directly and effectively analyzing performance. as shown in Figure 2.
  • summary indicates that the analysis result based on such information is printed in addition to the printed information in the format specified by pretty.
  • run indicates that in addition to the printed information specified by summary, the database exports the information as a CSV file.
+
+
Figure 2 Example of an execution plan using the pretty format
+

You can change the display format of execution plans by setting explain_perf_mode. Later examples use the pretty format by default.

+

Execution Plan Information

In addition to setting different display formats for an execution plan, you can use different EXPLAIN syntax to display execution plan information in details. The following lists the common EXPLAIN syntax. For details, see EXPLAIN.

+
  • EXPLAIN statement: only generates an execution plan and does not execute. The statement indicates SQL statements.
  • EXPLAIN ANALYZE statement: generates and executes an execution plan, and displays the execution summary. Then actual execution time statistics are added to the display, including the total elapsed time expended within each plan node (in milliseconds) and the total number of rows it actually returned.
  • EXPLAIN PERFORMANCE statement: generates and executes the execution plan, and displays all execution information.
+

To measure the run time cost of each node in the execution plan, the current execution of EXPLAIN ANALYZE or EXPLAIN PERFORMANCE adds profiling overhead to query execution. Running EXPLAIN ANALYZE or PERFORMANCE on a query sometimes takes longer time than executing the query normally. The amount of overhead depends on the nature of the query, as well as the platform being used.

+

Therefore, if an SQL statement is not finished after being running for a long time, run the EXPLAIN statement to view the execution plan and then locate the fault. If the SQL statement has been properly executed, run the EXPLAIN ANALYZE or EXPLAIN PERFORMANCE statement to check the execution plan and information to locate the fault.

+

The EXPLAIN PERFORMANCE lightweight execution is consistent with EXPLAIN PERFORMANCE but greatly reduces the time spent on performance analysis.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0411.html b/docs/dws/dev/dws_04_0411.html new file mode 100644 index 00000000..695d83aa --- /dev/null +++ b/docs/dws/dev/dws_04_0411.html @@ -0,0 +1,85 @@ + + +

Deep Dive on the SQL Execution Plan

+

As described in Overview of the SQL Execution Plan, EXPLAIN displays the execution plan, but will not actually run SQL statements. EXPLAIN ANALYZE and EXPLAIN PERFORMANCE both will actually run SQL statements and return the execution information. In this section, detailed execution plan and execution information are described.

+

Execution Plan

The following SQL statement is used as an example:

+
1
+2
+3
+4
+5
select 
+    cjxh, 
+    count(1) 
+from dwcjk
+group by cjxh;
+
+ +
+

Run the EXPLAIN command and the output is as follows:

+

+

Interpretation of the execution plan column (horizontal):

+
  • Id: execution operator node ID
  • operation: execution node operator name

    The operator of the Vector prefix refers to a vectorized execution engine operator, which exists in a query containing a column-store table.

    +
    Streaming is a special operator. It implements the core data shuffle function of the distributed architecture. Streaming has three types, which correspond to different data shuffle functions in the distributed architecture:
    • Streaming (type: GATHER): The CN collects data from DNs.
    • Streaming(type: REDISTRIBUTE): Data is redistributed to all the DNs based on selected columns.
    • Streaming(type: BROADCAST): Data on the current DN is broadcast to other DNs.
    +
    +
  • E-rows: indicates the number of rows estimated by each operator.
  • E-memory: indicates the estimated memory used by each operator on a DN. Only operators executed on DNs are displayed. In certain scenarios, the memory upper limit enclosed in parentheses will be displayed following the estimated memory usage.
  • E-width: indicates the estimated width of tuples provided by each operator.
  • E-costs: indicates the execution cost estimated by each operator.
    • E-costs are defined by the optimizer based on cost parameters, habitually grasping disk page as a unit. Other overhead parameters are set by referring to E-costs.
    • The cost of each node (the E-costs value) includes the cost of all of its child nodes.
    • Overhead reflects only what the optimizer is concerned about, but does not consider the time that the result row passed to the client. Although the time may play a very important role in the actual total time, it is ignored by the optimizer, because it cannot be changed by modifying the plan.
    +
+

Interpretation of the execution plan level (vertical):

+
  1. Layer 1: CStore Scan on dwcjk

    The table scan operator scans the table dwcjk using Cstore Scan. The function of this layer is to read data in the table dwcjk from the buffer or disks, or transfers it to the upper-layer node to participate in the calculation.

    +
  2. Layer 2: Vector Hash Aggregate

    Aggregation operators are used to perform aggregation operations (group by) on operators calculated from the lower layer.

    +
  3. Layer 3: Vector Streaming (type: GATHER)

    The GATHER-typed Shuffle operator aggregates data from DNs to the CN.

    +
  4. Layer 4: Row Adapter

    Storage format conversion operator is used to convert data in columns of the memory to data in rows for client display.

    +
+

It should be noted that when operators in the top layer are Data Node Scan, you need to set enable_fast_query_shipping to off to view detailed execution plan as follows:

+

+

After enable_fast_query_shipping is set, the execution plan is displayed as follows:

+

+

Keywords in the execution plan:

+
  1. Table access modes
    • Seq Scan

      Scans all rows of the table in sequence.

      +
    • Index Scan

      The optimizer uses a two-step plan: the child plan node visits an index to find the locations of rows matching the index condition, and then the upper plan node actually fetches those rows from the table itself. Fetching rows separately is much more expensive than reading them sequentially, but because not all pages of the table have to be visited, this is still cheaper than a sequential scan. The upper-layer planning node first sort the location of index identifier rows based on physical locations before reading them. This minimizes the independent capturing overhead.

      +

      If there are separate indexes on multiple columns referenced in WHERE, the optimizer might choose to use an AND or OR combination of the indexes. However, this requires the visiting of both indexes, so it is not necessarily a win compared to using just one index and treating the other condition as a filter.

      +

      The following Index scans featured with different sorting mechanisms are involved:

      +
      • Bitmap Index Scan

        Fetches data pages using a bitmap.

        +
      • Index Scan using index_name

        Fetches table rows in index order, which makes them even more expensive to read. However, there are so few rows that the extra cost of sorting the row locations is unnecessary. This plan type is used mainly for queries fetching just a single row and queries having an ORDER BY condition that matches the index order, because no extra sorting step is needed to satisfy ORDER BY.

        +
      +
    +
  2. Table connection modes
    • Nested Loop

      Nested-loop is used for queries that have a smaller data set connected. In a Nested-loop join, the foreign table drives the internal table and each row returned from the foreign table should have a matching row in the internal table. The returned result set of all queries should be less than 10,000. The table that returns a smaller subset will work as a foreign table, and indexes are recommended for connection fields of the internal table.

      +
    • (Sonic) Hash Join

      A Hash join is used for large tables. The optimizer uses a hash join, in which rows of one table are entered into an in-memory hash table, after which the other table is scanned and the hash table is probed for matches to each row. Sonic and non-Sonic hash joins differ in their hash table structures, which do not affect the execution result set.

      +
    • Merge Join

      In a merge join, data in the two joined tables is sorted by join columns. Then, data is extracted from the two tables to a sorted table for matching.

      +

      Merge join requires more resources for sorting and its performance is lower than that of hash join. If the source data has been sorted, it does not need to be sorted again when merge join is performed. In this case, the performance of merge join is better than that of hash join.

      +
    +
  3. Operators
    • sort

      Sorts the result set.

      +
    • filter

      The EXPLAIN output shows the WHERE clause being applied as a Filter condition attached to the Seq Scan plan node. This means that the plan node checks the condition for each row it scans, and returns only the ones that meet the condition. The estimated number of output rows has been reduced because of the WHERE clause. However, the scan will still have to visit all 10000 rows. As a result, the cost is not decreased. It increases a bit (by 10000 x cpu_operator_cost) to reflect the extra CPU time spent on checking the WHERE condition.

      +
    • LIMIT

      LIMIT limits the number of output execution results. If a LIMIT condition is added, not all rows are retrieved.

      +
    +
+
+

Task Execution

You can use EXPLAIN ANALYZE or EXPLAIN PERFORMANCE to check the SQL statement execution information and compare the actual execution and the optimizer's estimation to find what to optimize. EXPLAIN PERFORMANCE provides the execution information on each DN, whereas EXPLAIN ANALYZE does not.

+

The following SQL statement is used as an example:

+
1
select count(1) from tb1;
+
+ +
+

The output of running EXPLAIN PERFORMANCE is as follows:

+

+

+

+

+

This figure shows that the execution information can be classified into the following 7 aspects.

+
  1. The plan is displayed as a table, which contains 11 columns: id, operation, A-time, A-rows, E-rows, E-distinct, Peak Memory, E-memory, A-width, E-width, and E-costs. The definition of the plan-type columns (columns started with id, operation, or some started with E) is the same as that of running EXPLAIN. For details, see Execution Plan (execution plan) in the section. The definition of A-time, A-rows, E-distinct, Peak Memory, and A-width are described as follows:
    • A-time: indicates the execution completion time of the current operator. Generally, the A-time of the operator executed on the DN is two values enclosed by square brackets ([]), indicating the shortest time and longest time for completing the operator on all DNs, respectively.
    • A-rows: indicates the number of tuples provided by the current operator
    • E-distinct: indicates the estimated distinct value of the hashjoin operator.
    • Peak Memory: indicates the peak memory usage of an operator on each DN.
    • A-width: indicates that the current operator tuple actual width of each line. This parameter is valid only for the heavy memory operator is displayed, including: (Vec)HashJoin, (Vec)HashAgg, (Vec) HashSetOp, (Vec)Sort, and (Vec)Materialize operator. The (Vec)HashJoin calculation of width is the width of the right subtree operator, it will be displayed in the right subtree.
    +
  2. Predicate Information (identified by plan id):

    This part displays the static information that does not change during the plan execution process, such as some join conditions and filter information.

    +
  3. Memory Information (identified by plan id):

    This part displays the memory usage information printed by certain operators (mainly Hash and Sort), including peak memory, control memory, operator memory, width, auto spread num, and early spilled; and spill details, including spill Time(s), inner/outer partition spill num, temp file num, split data volume, and written disk IO [min, max]. The Sort operator does not display the number of files written to disks, and displays disks only when displaying sorting methods.

    +
  4. Targetlist Information (identified by plan id):

    This part displays the target columns provided by each operator.

    +
  5. DataNode Information (identified by plan id):

    This part displays the execution time of each operator (including the execution time of filtering and projection, if any), CPU usage, and buffer usage.

    +
  6. User Define Profiling:

    This part displays CNs and DNs, DN and DN connection time, and some execution information in the storage layer.

    +
  7. ====== Query Summary =====:

    The total execution time and network traffic, including the maximum and minimum execution time in the initialization and end phases on each DN, initialization, execution, and time in the end phase on each CN, and the system available memory during the current statement execution, and statement estimation memory information.

    +
+
  • The difference between A-rows and E-rows shows the deviation between the optimizer estimation and actual execution. Generally, if the deviation is large, the plan generated by the optimizer is untrusted, and you need to modify the deviation value.
  • If the difference of the A-time values is large, it indicates that the operator computing skew (difference between execution time on DNs) is large and that manual performance tuning is required. Generally, for two adjacent operators, the execution time of the upper-layer operator includes that of the lower-layer operator. However, if the upper-layer operator is a stream operator, its execution time may be less than that of the lower-layer operator, as there is no driving relationship between threads.
  • Max Query Peak Memory is often used to estimate the consumed memory of SQL statements, and is also used as an important basis for setting a memory parameter during SQL statement optimization. Generally, the output from EXPLAIN ANALYZE or EXPLAIN PERFORMANCE is provided for the input for further optimization.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0412.html b/docs/dws/dev/dws_04_0412.html new file mode 100644 index 00000000..6a32380a --- /dev/null +++ b/docs/dws/dev/dws_04_0412.html @@ -0,0 +1,57 @@ + + +

Querying SQL Statements That Affect Performance Most

+

This section describes how to query SQL statements whose execution takes a long time, leading to poor system performance.

+

Procedure

  1. Query the statements that are run for a long time in the database.

    1
    SELECT current_timestamp - query_start AS runtime, datname, usename, query FROM pg_stat_activity where state != 'idle' ORDER BY 1 desc;
    +
    + +
    +

    After the query, query statements are returned as a list, ranked by execution time in descending order. The first result is the query statement that has the longest execution time in the system. The returned result contains the SQL statement invoked by the system and the SQL statement run by users. Find the statements that were run by users and took a long time.

    +
    Alternatively, you can set current_timestamp - query_start to be greater than a threshold to identify query statements that are executed for a duration longer than this threshold.
    1
    SELECT query FROM pg_stat_activity WHERE current_timestamp - query_start > interval '1 days';
    +
    + +
    +
    +

  2. Set the parameter track_activities to on.

    1
    SET track_activities = on;
    +
    + +
    +

    The database collects the running information about active queries only if the parameter is set to on.

    +

  3. View the running query statements.

    Viewing pg_stat_activity is used as an example here.

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT datname, usename, state FROM pg_stat_activity;
    + datname  | usename | state  |
    +----------+---------+--------+
    + postgres |   omm   | idle   |
    + postgres |   omm   | active |
    +(2 rows)
    +
    + +
    +

    If the state column is idle, the connection is idle and requires a user to enter a command.

    +

    To identify only active query statements, run the following command:

    +
    1
    SELECT datname, usename, state FROM pg_stat_activity WHERE state != 'idle';
    +
    + +
    +

  4. Analyze the status of the query statements that were run for a long time.

    • If the query statement is normal, wait until the execution is complete.
    • If a query statement is blocked, run the following command to view this query statement:
      1
      SELECT datname, usename, state, query FROM pg_stat_activity WHERE waiting = true;
      +
      + +
      +

      The command output lists a query statement in the block state. The lock resource requested by this query statement is occupied by another session, so this query statement is waiting for the session to release the lock resource.

      +

      Only when the query is blocked by internal lock resources, the waiting field is true. In most cases, block happens when query statements are waiting for lock resources to be released. However, query statements may be blocked because they are waiting to write in files or for timers. Such blocked queries are not displayed in the pg_stat_activity view.

      +
      +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0413.html b/docs/dws/dev/dws_04_0413.html new file mode 100644 index 00000000..8c872672 --- /dev/null +++ b/docs/dws/dev/dws_04_0413.html @@ -0,0 +1,53 @@ + + +

Checking Blocked Statements

+

During database running, query statements are blocked in some service scenarios and run for an excessively long time. In this case, you can forcibly terminate the faulty session.

+

Procedure

  1. View blocked query statements and information about the tables and schemas that block the query statements.

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT w.query as waiting_query,
    +w.pid as w_pid,
    +w.usename as w_user,
    +l.query as locking_query,
    +l.pid as l_pid,
    +l.usename as l_user,
    +t.schemaname || '.' || t.relname as tablename
    +from pg_stat_activity w join pg_locks l1 on w.pid = l1.pid
    +and not l1.granted join pg_locks l2 on l1.relation = l2.relation
    +and l2.granted join pg_stat_activity l on l2.pid = l.pid join pg_stat_user_tables t on l1.relation = t.relid
    +where w.waiting;
    +
    + +
    +

    The thread ID, user information, query status, as well as information about the tables and schemas that block the query statements are returned.

    +

  2. Run the following command to terminate the required session, where 139834762094352 is the thread ID:

    1
    SELECT PG_TERMINATE_BACKEND(139834762094352);
    +
    + +
    +

    If information similar to the following is displayed, the session is successfully terminated:

    +
     PG_TERMINATE_BACKEND
    +----------------------
    + t
    +(1 row)
    +

    If a command output similar to the following is displayed, a user is attempting to terminate the session, and the session will be reconnected rather than being terminated.

    +
    FATAL:  terminating connection due to administrator command
    +FATAL:  terminating connection due to administrator command
    +The connection to the server was lost. Attempting reset: Succeeded.
    +

    If the PG_TERMINATE_BACKEND function is used to terminate the background threads of the session, the gsql client will be reconnected rather than be logged out.

    +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0430.html b/docs/dws/dev/dws_04_0430.html new file mode 100644 index 00000000..e4a41bff --- /dev/null +++ b/docs/dws/dev/dws_04_0430.html @@ -0,0 +1,33 @@ + + +

Query Improvement

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0435.html b/docs/dws/dev/dws_04_0435.html new file mode 100644 index 00000000..56e22b75 --- /dev/null +++ b/docs/dws/dev/dws_04_0435.html @@ -0,0 +1,13 @@ + + +

Optimization Process

+

You can analyze slow SQL statements to optimize them.

+

Procedure

  1. Collect all table statistics associated with the SQL statements. In a database, statistics indicate the source data of a plan generated by a planner. If statistics are unavailable or out of date, the execution plan may seriously deteriorate, leading to low performance. According to past experience, about 10% performance problem occurred because no statistics are collected. For details, see Updating Statistics.
  2. View the execution plan to find out the cause. If the SQL statements have been running for a long period of time and not ended, run the EXPLAIN command to view the execution plan and then locate the fault. If the SQL statement has been executed, run the EXPLAIN ANALYZE or EXPLAIN PERFORMANCE command to check the execution plan and actual running situation and then accurately locate the fault.
  3. Review and modify the table definition.
  4. For details about EXPLAIN or EXPLAIN PERFORMANCE, the reason why SQL statements are slowly located, and how to solve this problem, see Typical SQL Optimization Methods.
  5. Generally, some SQL statements can be converted to its equivalent statements in all or certain scenarios by rewriting queries. SQL statements are simpler after they are rewritten. Some execution steps can be simplified to improve the performance. The query rewriting method is universal in all databases. Experience in Rewriting SQL Statements describes several optimization methods by rewriting SQL statements.
  6. Specify a join order; join, stream, or scan operations; number of rows in a result; or redistribution skew information to optimize an execution plan, improving query performance. For details, see Hint-based Tuning.
  7. To maintain high database performance, you are advised to perform Routinely Maintaining Tables and Routinely Recreating an Index.
  8. (Optional) Improve performance by using operators if resources are sufficient in GaussDB(DWS). For details, see SMP Manual Optimization Suggestions.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0436.html b/docs/dws/dev/dws_04_0436.html new file mode 100644 index 00000000..c3e4bbbc --- /dev/null +++ b/docs/dws/dev/dws_04_0436.html @@ -0,0 +1,44 @@ + + +

Updating Statistics

+

In a database, statistics indicate the source data of a plan generated by a planner. If no collection statistics are available or out of date, the execution plan may seriously deteriorate, leading to low performance.

+

Context

The ANALYZE statement collects statistic about table contents in databases, which will be stored in the system table PG_STATISTIC. Then, the query optimizer uses the statistics to work out the most efficient execution plan.

+

After executing batch insertion and deletions, you are advised to run the ANALYZE statement on the table or the entire library to update statistics. By default, 30,000 rows of statistics are sampled. That is, the default value of the GUC parameter default_statistics_target is 100. If the total number of rows in the table exceeds 1,600,000, you are advised to set default_statistics_target to -2, indicating that 2% of the statistics are collected.

+

For an intermediate table generated during the execution of a batch script or stored procedure, you also need to run the ANALYZE statement.

+

If there are multiple inter-related columns in a table and the conditions or grouping operations based on these columns are involved in the query, collect statistics about these columns so that the query optimizer can accurately estimate the number of rows and generate an effective execution plan.

+
+

Procedure

Run the following commands to update the statistics about a table or the entire database:

+
1
+2
ANALYZE tablename;                        --Update statistics about a table.
+ANALYZE;                                  ---Update statistics about the entire database.
+
+ +
+
+

Run the following statements to perform statistics-related operations on multiple columns:

+
1
+2
+3
+4
+5
+6
ANALYZE tablename ((column_1, column_2));                       --Collect statistics about column_1 and column_2 of tablename.
+
+ALTER TABLE tablename ADD STATISTICS ((column_1, column_2));    --Declare statistics about column_1 and column_2 of tablename.
+ANALYZE tablename;                                               --Collect statistics about one or more columns.
+
+ALTER TABLE tablename DELETE STATISTICS ((column_1, column_2)); --Delete statistics about column_1 and column_2 of tablename or their statistics declaration.
+
+ +
+

After the statistics are declared for multiple columns by running the ALTER TABLE tablename ADD STATISTICS statement, the system collects the statistics about these columns next time ANALYZE is performed on the table or the entire database.

+

To collect the statistics, run the ANALYZE statement.

+
+

Use EXPLAIN to show the execution plan of each SQL statement. If rows=10 (the default value, probably indicating the table has not been analyzed) is displayed in the SEQ SCAN output of a table, run the ANALYZE statement for this table.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0437.html b/docs/dws/dev/dws_04_0437.html new file mode 100644 index 00000000..44e151ff --- /dev/null +++ b/docs/dws/dev/dws_04_0437.html @@ -0,0 +1,27 @@ + + +

Reviewing and Modifying a Table Definition

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0438.html b/docs/dws/dev/dws_04_0438.html new file mode 100644 index 00000000..290f5b3b --- /dev/null +++ b/docs/dws/dev/dws_04_0438.html @@ -0,0 +1,14 @@ + + +

Reviewing and Modifying a Table Definition

+

In a distributed framework, data is distributed on DNs. Data on one or more DNs is stored on a physical storage device. To properly define a table, you must:

+
  1. Evenly distribute data on each DN to avoid the available capacity decrease of a cluster caused by insufficient storage space of the storage device associated with a DN. Specifically, select a proper distribution key to avoid data skew.
  2. Evenly assign table scanning tasks on each DN to avoid that a DN is overloaded by the table scanning tasks. Specifically, do not select columns in the equivalent filter of a base table as the distribution key.
  3. Reduce the data volume scanned by using the partition pruning mechanism.
  4. Avoid the use of random I/O by using clustering or partial clustering.
  5. Avoid data shuffle to reduce the network pressure by selecting the join-condition column or group by column as the distribution column.
+

The distribution column is the core for defining a table. The following figure shows the procedure of defining a table. The table definition is created during the database design and is reviewed and modified during the SQL statement optimization.

+
Figure 1 Procedure of defining a table
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0439.html b/docs/dws/dev/dws_04_0439.html new file mode 100644 index 00000000..50d69263 --- /dev/null +++ b/docs/dws/dev/dws_04_0439.html @@ -0,0 +1,33 @@ + + +

Selecting a Storage Model

+

During database design, some key factors about table design will greatly affect the subsequent query performance of the database. Table design affects data storage as well. Scientific table design reduces I/O operations and minimizes memory usage, improving the query performance.

+

Selecting a model for table storage is the first step of table definition. Select a proper storage model for your service based on the following table.

+ +
+ + + + + + + + + + +

Storage Model

+

Application Scenario

+

Row storage

+

Point query (simple index–based query that returns only a few records).

+

Query involving many INSERT, UPDATE, and DELETE operations.

+

Column storage

+

Statistics analysis query, in which operations, such as group and join, are performed many times.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0440.html b/docs/dws/dev/dws_04_0440.html new file mode 100644 index 00000000..cfee328e --- /dev/null +++ b/docs/dws/dev/dws_04_0440.html @@ -0,0 +1,40 @@ + + +

Selecting a Distribution Mode

+

In replication mode, full data in a table is copied to each DN in the cluster. This mode is used for tables containing a small volume of data. Full data in a table stored on each DN avoids data redistribution during the JOIN operation. This reduces network costs and plan segments (each with a thread), but generates much redundant data. Generally, replication is only used for small dimension tables.

+

In hash mode, hash values are generated for one or more columns. You can obtain the storage location of a tuple based on the mapping between DNs and the hash values. In a hash table, I/O resources on each node can be used for data read/write, which greatly accelerates the read/write of a table. Generally, a table containing a large amount of data is defined as a hash table.

+ +
+ + + + + + + + + + + + + +

Policy

+

Description

+

Scenario

+

Hash

+

Table data is distributed on all DNs in the cluster.

+

Fact tables containing a large amount of data

+

Replication

+

Full data in a table is stored on each DN in the cluster.

+

Small tables and dimension tables

+
+
+

As shown in Figure 1, T1 is a replication table and T2 is a hash table.

+
Figure 1 Replication table and hash table
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0441.html b/docs/dws/dev/dws_04_0441.html new file mode 100644 index 00000000..c7fc5f2d --- /dev/null +++ b/docs/dws/dev/dws_04_0441.html @@ -0,0 +1,27 @@ + + +

Selecting a Distribution Column

+

The distribution column in a hash table must meet the following requirements, which are ranked by priority in descending order:

+
  1. The value of the distribution column should be discrete so that data can be evenly distributed on each DN. For example, you are advised to select the primary key of a table as the distribution column, and the ID card number as the distribution column in a personnel information table.
  2. Do not select the column where a constant filter exists. For example, if a constant constraint (for example, zqdh= '000001') exists on the zqdh column in some queries on the dwcjk table, you are not advised to use zqdh as the distribution column.
  3. Select the join condition as the distribution column, so that join tasks can be pushed down to DNs to execute, reducing the amount of data transferred between the DNs.

    For a hash table, an improper distribution key may cause data skew or poor I/O performance on certain DNs. Therefore, you need to check the table to ensure that data is evenly distributed on each DN. You can run the following SQL statements to check data skew:

    +
    1
    +2
    +3
    +4
    +5
    select 
    +xc_node_id, count(1) 
    +from tablename 
    +group by xc_node_id 
    +order by xc_node_id desc;
    +
    + +
    +

    xc_node_id corresponds to a DN. Generally, over 5% difference between the amount of data on different DNs is regarded as data skew. If the difference is over 10%, choose another distribution column.

    +
  4. You are not advised to add a column as a distribution column, especially add a new column and use the SEQUENCE value to fill the column. This is because SEQUENCE may cause performance bottlenecks and unnecessary maintenance costs.
+

Multiple distribution columns can be selected in GaussDB(DWS) to evenly distribute data.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0442.html b/docs/dws/dev/dws_04_0442.html new file mode 100644 index 00000000..90800e27 --- /dev/null +++ b/docs/dws/dev/dws_04_0442.html @@ -0,0 +1,12 @@ + + +

Using Partial Clustering

+

Partial Cluster Key is the column-based technology. It can minimize or maximize sparse indexes to quickly filter base tables. Partial cluster key can specify multiple columns, but you are advised to specify no more than two columns. Use the following principles to specify columns:

+
  1. The selected columns must be restricted by simple expressions in base tables. Such constraints are usually represented by Col, Op, and Const. Col specifies the column name, Op specifies operators, (including =, >, >=, <=, and <) Const specifies constants.
  2. Select columns that are frequently selected (to filter much more undesired data) in simple expressions.
  3. List the less frequently selected columns on the top.
  4. List the columns of the enumerated type at the top.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0443.html b/docs/dws/dev/dws_04_0443.html new file mode 100644 index 00000000..a5460628 --- /dev/null +++ b/docs/dws/dev/dws_04_0443.html @@ -0,0 +1,14 @@ + + +

Using Partitioned Tables

+

Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific schemes. The table based on the logic is called a partitioned table, and a physical piece is called a partition. Data is stored on these smaller physical pieces, namely, partitions, instead of the larger logical partitioned table. A partitioned table has the following advantages over an ordinary table:

+
  1. High query performance: The system queries only the concerned partitions rather than the whole table, improving the query efficiency.
  2. High availability: If a partition is faulty, data in the other partitions is still available.
  3. Easy maintenance: You only need to fix the faulty partition.
+

GaussDB(DWS) supports range-partitioned tables.

+

Range-partitioned table: Data within a specific range is mapped onto each partition. The range is determined by the partition key specified during the partitioned table creation. The partition key is usually a date. For example, sales data is partitioned by month.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0444.html b/docs/dws/dev/dws_04_0444.html new file mode 100644 index 00000000..52bff546 --- /dev/null +++ b/docs/dws/dev/dws_04_0444.html @@ -0,0 +1,15 @@ + + +

Selecting a Data Type

+

Use the following principles to obtain efficient data types:

+
  1. Using the data type that can be efficiently executed

    Generally, calculation of integers (including common comparison calculations, such as =, >, <, ≥, ≤, and ≠ and group by) is more efficient than that of strings and floating point numbers. For example, if you need to filter data in a column containing numeric data for a column-store table where point query is performed, the execution takes over 10s. However, the execution time is reduced to 1.8s when you change the data type from NUMERIC to INT.

    +
  2. Using the data type of short length column

    Using the data type with a shorter length reduces both the data file size and the memory used for computing, improving the I/O and computing performance. For example, use SMALLINT instead of INT, and INT instead of BIGINT.

    +
  3. Using the same data type for associated columns

    Use the same data type for associated columns. If columns having different data types are associated, the database must dynamically convert the different data types into the same ones for comparison. The conversion results in performance overheads.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0445.html b/docs/dws/dev/dws_04_0445.html new file mode 100644 index 00000000..6662497f --- /dev/null +++ b/docs/dws/dev/dws_04_0445.html @@ -0,0 +1,26 @@ + + +

Typical SQL Optimization Methods

+

SQL optimization involves continuous analysis and adjustment. You need to test-run a query, locate and fix its performance issues (if any) based on its execution plan, and run it again, until the execution performance meet your requirements.

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0446.html b/docs/dws/dev/dws_04_0446.html new file mode 100644 index 00000000..737ff3d4 --- /dev/null +++ b/docs/dws/dev/dws_04_0446.html @@ -0,0 +1,71 @@ + + +

SQL Self-Diagnosis

+

Performance issues may occur when you query data or run the INSERT, DELETE, UPDATE, or CREATE TABLE AS statement. You can query the warning column in the GS_WLM_SESSION_STATISTICS, GS_WLM_SESSION_HISTORY, and GS_WLM_SESSION_INFO views to obtain performance diagnosis information for tuning.

+

Alarms that can trigger SQL self-diagnosis depend on the settings of resource_track_level. If resource_track_level is set to query or perf, you can diagnose alarms indicating that statistics of multiple columns or a single column are not collected or SQL statements are not pushed down. If resource_track_level is set to operator, all alarm scenarios can be diagnosed.

+

Whether a SQL plan will be diagnosed depends on the settings of resource_track_cost. A SQL plan will be diagnosed only if its execution cost is greater than resource_track_cost. You can use the EXPLAIN keyword to check the plan execution cost.

+

Alarms

Currently, the following performance alarms will be reported:

+
  • Some column statistics are not collected.

    If statistics of a single column or multiple columns are not collected, an alarm is reported. For details about the optimization, see Updating Statistics and Optimizing Statistics.

    +

    If no statistics are collected for the OBS foreign table and HDFS foreign table in the query statement, an alarm indicating that statistics are not collected will be reported. Because the ANALYZE performance of the OBS foreign table and HDFS foreign table is poor, you are not advised to perform ANALYZE on these tables. Instead, you are advised to use the ALTER FOREIGN TABLE syntax to modify the totalrows attribute of the foreign table to correct the estimated number of rows.

    +

    Example alarms:

    +

    No statistics about a table are not collected.

    +
    Statistic Not Collect:
    +    schema_test.t1
    +

    The statistics about a single column are not collected.

    +
    Statistic Not Collect:
    +    schema_test.t2(c1)
    +

    The statistics about multiple columns are not collected.

    +
    Statistic Not Collect:
    +    schema_test.t3((c1,c2))
    +

    The statistics about a single column and multiple columns are not collected.

    +
    Statistic Not Collect:
    +    schema_test.t4(c1)    schema_test.t5((c1,c2))
    +
+
  • SQL statements are not pushed down.
    The cause details are displayed in the alarms. For details about the optimization, see Optimizing Statement Pushdown.
    • If the pushdown failure is caused by functions, the function names are displayed in the alarm.
    • If the pushdown failure is caused by syntax, the alarm indicates that the syntax does not support pushdown. For example, the syntax containing the With Recursive, Distinct On, or Row expression, and syntax whose return value is of record type do not support pushdown.
    +
    +

    Example alarms:

    +
    SQL is not plan-shipping, reason : ""enable_stream_operator" is off"
    +SQL is not plan-shipping, reason : ""Distinct On" can not be shipped"
    +SQL is not plan-shipping, reason : ""v_test_unshipping_log" is VIEW that will be treated as Record type can't be shipped"
    +
+
  • In a hash join, the larger table is used as the inner table.

    An alarm will be reported if the number of rows in the inner table reaches or exceeds 10 times of that in the foreign table, more than 100,000 inner-table rows are processed on each DN in average, and data has been flushed to disks. You can view the query_plan column in GS_WLM_SESSION_HISTORY to check whether hash joins are used. In this scenario, you need to adjust the sequence of the HashJoin internal and foreign tables. For details, see Join Order Hints.

    +

    Example alarm:

    +
    PlanNode[7] Large Table is INNER in HashJoin "Vector Hash Aggregate"
    +

    In the preceding command, 7 indicates the operator whose ID is 7 in the query_plan column.

    +
+
  • nestloop is used in a large-table equivalent join.

    An alarm will be reported if nested loop is used in an equivalent join where more than 100,000 larger-table rows are processed on each DN in average. You can view the query_plan column of GS_WLM_SESSION_HISTORY to check whether nested loop is used. In this scenario, you need to adjust the table join mode and disable the NestLoop join mode between the current internal and foreign tables. For details, see Join Operation Hints.

    +

    Example alarm:

    +
    PlanNode[5] Large Table with Equal-Condition use Nestloop"Nested Loop"
    +
+
  • A large table is broadcasted.

    An alarm will be reported if more than 100 thousand of rows are broadcasted on each DN in average. In this scenario, the broadcast operation of the BroadCast lower-layer operator needs to be disabled. For details about the optimization, see Stream Operation Hints.

    +

    Example alarm:

    +
    PlanNode[5] Large Table in Broadcast "Streaming(type: BROADCAST dop: 1/2)"
    +
+
  • Data skew occurs.

    An alarm will be reported if the number of rows processed on any DN exceeds 100 thousand, and the number of rows processed on a DN reaches or exceeds 10 times of that processed on another DN. Generally, this alarm is generated due to storage layer skew or computing layer skew. For details about the optimization, see Optimizing Data Skew.

    +

    Example alarm:

    +
    PlanNode[6] DataSkew:"Seq Scan", min_dn_tuples:0, max_dn_tuples:524288
    +
+
  • The index is improper.

    During base table scanning, an alarm is reported if the following conditions are met:

    +
    • For row-store tables:
      • When the index scanning is used, the ratio of the number of output lines to the number of scanned lines is greater than 1/1000 and the number of output lines is greater than 10,000.
      • When sequential scanning is used, the number of output lines to the number of scanned lines is less than 1/1000, the number of output lines is less than or equal to 10,000, and the number of scanned lines is greater than 10,000.
      +
    • For column-store tables:
      • When the index scanning is used, the ratio of the number of output lines to the number of scanned lines is greater than 1/10000 and the number of output lines is greater than 100.
      • When sequential scanning is used, the number of output lines to the number of scanned lines is less than 1/10,000, the number of output lines is less than or equal to 100, and the number of scanned lines is greater than 10,000.
      +
    +

    For details about the optimization, see Optimizing Operators. You can also refer to Case: Creating an Appropriate Index and Case: Setting Partial Cluster Keys.

    +

    Example alarms:

    +
    PlanNode[4] Indexscan is not properly used:"Index Only Scan", output:524288, filtered:0, rate:1.00000
    +PlanNode[5] Indexscan is ought to be used:"Seq Scan", output:1, filtered:524288, rate:0.00000
    +
+
  • Estimation is inaccurate.

    An alarm will be reported if the maximum number or the estimated maximum number of rows processed on a DN is over 100,000, and the larger number reaches or exceeds 10 times of the smaller one. In this scenario, you can refer to Rows Hints to correct the estimation on the number of rows, so that the optimizer can re-design the execution plan based on the correct number.

    +

    Example alarm:

    +
    PlanNode[5] Inaccurate Estimation-Rows: "Hash Join" A-Rows:0, E-Rows:52488
    +
+
+

Restrictions

  1. An alarm contains a maximum of 2048 characters. If the length of an alarm exceeds this value (for example, a large number of long table names and column names are displayed in the alarm when their statistics are not collected), a warning instead of an alarm will be reported.
    WARNING, "Planner issue report is truncated, the rest of planner issues will be skipped"
    +
  2. If a query statement contains the Limit operator, alarms of operators lower than Limit will not be reported.
  3. For alarms about data skew and inaccurate estimation, only alarms on the lower-layer nodes in a plan tree will be reported. This is because the same alarms on the upper-level nodes may be triggered by problems on the lower-layer nodes. For example, if data skew occurs on the Scan node, data skew may also occur in operators (for example, Hashagg) at the upper layer.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0447.html b/docs/dws/dev/dws_04_0447.html new file mode 100644 index 00000000..0faf288d --- /dev/null +++ b/docs/dws/dev/dws_04_0447.html @@ -0,0 +1,402 @@ + + +

Optimizing Statement Pushdown

+

Statement Pushdown

Currently, the GaussDB(DWS) optimizer can use three methods to develop statement execution policies in the distributed framework: generating a statement pushdown plan, a distributed execution plan, or a distributed execution plan for sending statements.

+
  • A statement pushdown plan pushes query statements from a CN down to DNs for execution and returns the execution results to the CN.
  • In a distributed execution plan, a CN compiles and optimizes query statements, generates a plan tree, and then sends the plan tree to DNs for execution. After the statements have been executed, execution results will be returned to the CN.
  • A distributed execution plan for sending statements pushes queries that can be pushed down (mostly base table scanning statements) to DNs for execution. Then, the plan obtains the intermediate results and sends them to the CN, on which the remaining queries are to be executed.
+

The third policy sends many intermediate results from the DNs to a CN for further execution. In this case, the CN performance bottleneck (in bandwidth, storage, and computing) is caused by statements that cannot be pushed down to DNs. Therefore, you are not advised to use the query statements that only the third policy is applicable to.

+

Statements cannot be pushed down to DNs if they have Functions That Do Not Support Pushdown or Syntax That Does Not Support Pushdown. Generally, you can rewrite the execution statements to solve the problem.

+
+

Viewing Whether the Execution Plan Has Been Pushed Down to DNs

Perform the following procedure to quickly determine whether the execution plan can be pushed down to DNs:

+
  1. Set the GUC parameter enable_fast_query_shipping to off to use the distributed framework policy for the query optimizer.

    1
    SET enable_fast_query_shipping = off;
    +
    + +
    +

  2. View the execution plan.

    If the execution plan contains Data Node Scan, the SQL statements cannot be pushed down to DNs. If the execution plan contains Streaming, the SQL statements can be pushed down to DNs.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select
    +count(ss.ss_sold_date_sk order by ss.ss_sold_date_sk)c1 
    +from store_sales ss, store_returns sr 
    +where 
    +sr.sr_customer_sk = ss.ss_customer_sk;
    +
    + +
    +

    The execution plan is as follows, which indicates that the SQL statement cannot be pushed down.

    +

    +
                                  QUERY PLAN
    +--------------------------------------------------------------------------
    +Aggregate
    +->  Hash Join
    +Hash Cond: (ss.ss_customer_sk = sr.sr_customer_sk)
    +->  Data Node Scan on store_sales "_REMOTE_TABLE_QUERY_"
    +Node/s: All datanodes
    +->  Hash
    +->  Data Node Scan on store_returns "_REMOTE_TABLE_QUERY_"
    +Node/s: All datanodes
    +(8 rows)
    +

+
+

Syntax That Does Not Support Pushdown

SQL syntax that does not support pushdown is described using the following table definition examples:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
CREATE TABLE CUSTOMER1
+(
+    C_CUSTKEY     BIGINT NOT NULL
+  , C_NAME        VARCHAR(25) NOT NULL
+  , C_ADDRESS     VARCHAR(40) NOT NULL
+  , C_NATIONKEY   INT NOT NULL
+  , C_PHONE       CHAR(15) NOT NULL
+  , C_ACCTBAL     DECIMAL(15,2)   NOT NULL
+  , C_MKTSEGMENT  CHAR(10) NOT NULL
+  , C_COMMENT     VARCHAR(117) NOT NULL
+)
+DISTRIBUTE BY hash(C_CUSTKEY);
+CREATE TABLE test_stream(a int, b float);--float does not support redistribution.
+CREATE TABLE sal_emp ( c1 integer[] ) DISTRIBUTE BY replication;
+
+ +
+
  • The returning statement cannot be pushed down.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    explain update customer1 set C_NAME = 'a' returning c_name;
    +                               QUERY PLAN                                           
    +------------------------------------------------------------------
    + Update on customer1  (cost=0.00..0.00 rows=30 width=187)
    +   Node/s: All datanodes
    +   Node expr: c_custkey
    +   ->  Data Node Scan on customer1 "_REMOTE_TABLE_QUERY_"  (cost=0.00..0.00 rows=30 width=187)
    +         Node/s: All datanodes
    +(5 rows)
    +
    + +
    +
  • If columns in count(distinct expr) do not support redistribution, they do not support pushdown.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    explain verbose select count(distinct b) from test_stream;
    +                                          QUERY PLAN                                           
    +------------------------------------------------------------------ Aggregate  (cost=2.50..2.51 rows=1 width=8)
    +   Output: count(DISTINCT test_stream.b)
    +   ->  Data Node Scan on test_stream "_REMOTE_TABLE_QUERY_"  (cost=0.00..0.00 rows=30 width=8)
    +         Output: test_stream.b
    +         Node/s: All datanodes
    +         Remote query: SELECT b FROM ONLY public.test_stream WHERE true
    +(6 rows)
    +
    + +
    +
  • Statements using distinct on cannot be pushed down.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    explain verbose select distinct on (c_custkey) c_custkey from customer1 order by c_custkey;
    +                                            QUERY PLAN                                             
    +------------------------------------------------------------------ Unique  (cost=49.83..54.83 rows=30 width=8)
    +   Output: customer1.c_custkey
    +   ->  Sort  (cost=49.83..52.33 rows=30 width=8)
    +         Output: customer1.c_custkey
    +         Sort Key: customer1.c_custkey
    +         ->  Data Node Scan on customer1 "_REMOTE_TABLE_QUERY_"  (cost=0.00..0.00 rows=30 width=8)
    +               Output: customer1.c_custkey
    +               Node/s: All datanodes
    +               Remote query: SELECT c_custkey FROM ONLY public.customer1 WHERE true
    +(9 rows)
    +
    + +
    +
  • In a statement using FULL JOIN, if the column specified using JOIN does not support redistribution, the statement does not support pushdown.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    explain select * from test_stream t1 full join test_stream t2 on t1.a=t2.b;
    +                                              QUERY PLAN                                              
    +------------------------------------------------------------------ Hash Full Join  (cost=0.38..0.82 rows=30 width=24)
    +   Hash Cond: ((t1.a)::double precision = t2.b)
    +   ->  Data Node Scan on test_stream "_REMOTE_TABLE_QUERY_"  (cost=0.00..0.00 rows=30 width=12)
    +         Node/s: All datanodes
    +   ->  Hash  (cost=0.00..0.00 rows=30 width=12)
    +         ->  Data Node Scan on test_stream "_REMOTE_TABLE_QUERY_"  (cost=0.00..0.00 rows=30 width=12)
    +               Node/s: All datanodes
    +(7 rows)
    +
    + +
    +
  • Does not support array expression pushdown.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    explain verbose select array[c_custkey,1] from customer1 order by c_custkey;
    +
    +                          QUERY PLAN                                                    
    +------------------------------------------------------------------ Sort  (cost=49.83..52.33 rows=30 width=8)
    +   Output: (ARRAY[customer1.c_custkey, 1::bigint]), customer1.c_custkey
    +   Sort Key: customer1.c_custkey
    +   ->  Data Node Scan on "__REMOTE_SORT_QUERY__"  (cost=0.00..0.00 rows=30 width=8)
    +         Output: (ARRAY[customer1.c_custkey, 1::bigint]), customer1.c_custkey
    +         Node/s: All datanodes
    +         Remote query: SELECT ARRAY[c_custkey, 1::bigint], c_custkey FROM ONLY public.customer1 WHERE true ORDER BY 2
    +(7 rows)
    +
    + +
    +
+
+
  • The following table describes the scenarios where a statement containing WITH RECURSIVE cannot be pushed down in the current version, as well as the causes. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    No.

    +

    Scenario

    +

    Cause of Not Supporting Pushdown

    +

    1

    +

    The query contains foreign tables or HDFS tables.

    +

    LOG: SQL can't be shipped, reason: RecursiveUnion contains HDFS Table or ForeignScan is not shippable (In this table, LOG describes the cause of not supporting pushdown.)

    +

    +

    In the current version, queries containing foreign tables or HDFS tables do not support pushdown.

    +

    2

    +

    Multiple Node Groups

    +

    LOG: SQL can't be shipped, reason: With-Recursive under multi-nodegroup scenario is not shippable

    +

    +

    In the current version, pushdown is supported only when all base tables are stored and computed in the same Node Group.

    +

    3

    +
    WITH recursive t_result AS (
    +SELECT dm,sj_dm,name,1 as level
    +FROM test_rec_part
    +WHERE sj_dm > 10
    +UNION
    +SELECT t2.dm,t2.sj_dm,t2.name||' > '||t1.name,t1.level+1
    +FROM t_result t1
    +JOIN test_rec_part t2 ON t2.sj_dm = t1.dm
    +)
    +SELECT * FROM t_result t;
    +

    LOG: SQL can't be shipped, reason: With-Recursive does not contain "ALL" to bind recursive & none-recursive branches

    +

    +

    ALL is not used for UNION. In this case, the return result is deduplicated.

    +

    4

    +
    WITH RECURSIVE x(id) AS
    +(
    +select count(1) from pg_class where oid=1247
    +UNION ALL
    +SELECT id+1 FROM x WHERE id < 5
    +), y(id) AS
    +(
    +select count(1) from pg_class where oid=1247
    +UNION ALL
    +SELECT id+1 FROM x WHERE id < 10
    +)
    +SELECT y.*, x.* FROM y LEFT JOIN x USING (id) ORDER BY 1;
    +

    LOG: SQL can't be shipped, reason: With-Recursive contains system table is not shippable

    +

    +

    A base table contains the system catalog.

    +

    5

    +
    WITH RECURSIVE t(n) AS (
    +VALUES (1)
    +UNION ALL
    +SELECT n+1 FROM t WHERE n < 100
    +)
    +SELECT sum(n) FROM t;
    +

    LOG: SQL can't be shipped, reason: With-Recursive contains only values rte is not shippable

    +

    +

    Only VALUES is used for scanning base tables. In this case, the statement can be executed on the CN, and DNs are unnecessary.

    +

    6

    +
    select  a.ID,a.Name,
    +(
    +with recursive cte as (
    +select ID, PID, NAME from b where b.ID = 1
    +union all
    +select parent.ID,parent.PID,parent.NAME
    +from cte as child join b as parent on child.pid=parent.id
    +where child.ID = a.ID
    +)
    +select NAME from cte limit 1
    +) cName
    +from
    +(
    +select id, name, count(*) as cnt
    +from a group by id,name
    +) a order by 1,2;
    +

    LOG: SQL can't be shipped, reason: With-Recursive recursive term correlated only is not shippable

    +

    +

    The correlation conditions of correlated subqueries are only in the recursion part, and the non-recursion part has no correlation condition.

    +

    7

    +
    WITH recursive t_result AS (
    +select * from(
    +SELECT dm,sj_dm,name,1 as level
    +FROM test_rec_part
    +WHERE sj_dm < 10 order by dm limit 6 offset 2)
    +UNION all
    +SELECT t2.dm,t2.sj_dm,t2.name||' > '||t1.name,t1.level+1
    +FROM t_result t1
    +JOIN test_rec_part t2 ON t2.sj_dm = t1.dm
    +)
    +SELECT * FROM t_result t;
    +

    LOG: SQL can't be shipped, reason: With-Recursive contains conflict distribution in none-recursive(Replicate) recursive(Hash)

    +

    +

    The replicate plan is used for limit in the non-recursion part but the hash plan is used in the recursion part, resulting in conflicts.

    +

    8

    +
    with recursive cte as
    +(
    +select * from rec_tb4 where id<4
    +union all
    +select h.id,h.parentID,h.name from
    +(
    +with recursive cte as
    +(
    +select * from rec_tb4 where id<4
    +union all
    +select h.id,h.parentID,h.name from rec_tb4 h inner join cte c on h.id=c.parentID
    +)
    +SELECT id ,parentID,name from cte order by parentID
    +) h
    +inner join cte  c on h.id=c.parentID
    +)
    +SELECT id ,parentID,name from cte order by parentID,1,2,3;
    +

    LOG: SQL can't be shipped, reason: Recursive CTE references recursive CTE "cte"

    +

    +

    recursive of multiple-layers are nested. That is, a recursive is nested in the recursion part of another recursive.

    +
    +
    +
+

Functions That Do Not Support Pushdown

This module describes the variability of functions. The function variability in GaussDB(DWS) is as follows:

+
  • IMMUTABLE

    Indicates that the function always returns the same result if the parameter values are the same.

    +
  • STABLE

    Indicates that the function cannot modify the database, and that within a single table scan it will consistently return the same result for the same parameter values, but that its result varies by SQL statements.

    +
  • VOLATILE

    Indicates that the function value can change even within a single table scan, so no optimizations can be made.

    +
+

The volatility of a function can be obtained by querying its provolatile column in pg_proc. The value i indicates immutable, s indicates stable, and v indicates volatile. The valid values of the proshippable column in pg_proc are t, f, and NULL. This column and the provolatile column together describe whether a function is pushed down.

+
  • If the provolatile of a function is i, the function can be pushed down regardless of the value of proshippable.
  • If the provolatile of a function is s or v, the function can be pushed only if the value of proshippable is t.
  • CTEs containing random are not pushed down, because pushdown may lead to incorrect results.
+

For a UDF, you can specify the values of provolatile and proshippable during its creation. For details, see CREATE FUNCTION.

+

In scenarios where a function does not support pushdown, perform one of the following as required:

+
  • If it is a system function, replace it with a functionally equivalent one.
  • If it is a UDF function, check whether its provolatile and proshippable are correctly defined.
+
+

Example: UDF

Define a user-defined function that generates fixed output for a certain input as the immutable type.

+

Take the sales information of TPCDS as an example. If you want to write a function to calculate the discount data of a product, you can define the function as follows:

+
1
+2
+3
+4
CREATE FUNCTION func_percent_2 (NUMERIC, NUMERIC) RETURNS NUMERIC
+AS 'SELECT $1 / $2 WHERE $2 > 0.01'
+LANGUAGE SQL
+VOLATILE;
+
+ +
+

Run the following statement:

+
1
+2
SELECT func_percent_2(ss_sales_price, ss_list_price)
+FROM store_sales;
+
+ +
+

The execution plan is as follows:

+

+

func_percent_2 is not pushed down, and ss_sales_price and ss_list_price are executed on a CN. In this case, a large amount of resources on the CN is consumed, and the performance deteriorates as a result.

+

In this example, the function returns certain output when certain input is entered. Therefore, we can modify the function to the following one:

+
1
+2
+3
+4
CREATE FUNCTION func_percent_1 (NUMERIC, NUMERIC) RETURNS NUMERIC
+AS 'SELECT $1 / $2 WHERE $2 > 0.01'
+LANGUAGE SQL
+IMMUTABLE;
+
+ +
+

Run the following statement:

+
1
+2
SELECT func_percent_1(ss_sales_price, ss_list_price)
+FROM store_sales;
+
+ +
+

The execution plan is as follows:

+

+

func_percent_1 is pushed down to DNs for quicker execution. (In TPCDS 1000X, where three CNs and 18 DNs are used, the query efficiency is improved by over 100 times).

+
+

Example 2: Pushing Down the Sorting Operation

For details, see Case: Pushing Down Sort Operations to DNs.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0448.html b/docs/dws/dev/dws_04_0448.html new file mode 100644 index 00000000..848b0cc0 --- /dev/null +++ b/docs/dws/dev/dws_04_0448.html @@ -0,0 +1,591 @@ + + +

Optimizing Subqueries

+

What Is a Subquery

When an application runs a SQL statement to operate the database, a large number of subqueries are used because they are more clear than table join. Especially in complicated query statements, subqueries have more complete and independent semantics, which makes SQL statements clearer and easy to understand. Therefore, subqueries are widely used.

+

In GaussDB(DWS), subqueries can also be called sublinks based on the location of subqueries in SQL statements.

+
  • Subquery: corresponds to a scope table (RangeTblEntry) in the query parse tree. That is, a subquery is a SELECT statement following immediately after the FROM keyword.
  • Sublink: corresponds to an expression in the query parsing tree. That is, a sublink is a statement in the WHERE or ON clause or in the target list.
    In conclusion, a subquery is a scope table and a sublink is an expression in the query parsing tree. A sublink can be found in constraint conditions and expressions. In GaussDB(DWS), sublinks can be classified into the following types:
    • exist_sublink: corresponding to the EXIST and NOT EXIST statements.
    • any_sublink: corresponding to the OP ANY(SELEC...) statement. OP can be the IN, <, >, or = operator.
    • all_sublink: corresponding to the OP ALL(SELECT...) statement. OP can be the IN, <, >, or = operator.
    • rowcompare_sublink: corresponding to the RECORD OP (SELECT...) statement.
    • expr_sublink: corresponding to the (SELECT with a single target list item) statement.
    • array_sublink: corresponding to the ARRAY(SELECT...) statement.
    • cte_sublink: corresponding to the WITH(...) statement.
    +
    +

    The sublinks commonly used in OLAP and HTAP are exist_sublink and any_sublink. The sublinks are pulled up by the optimization engine of GaussDB(DWS). Because of the flexible use of subqueries in SQL statements, complex subqueries may affect query performance. Subqueries are classified into non-correlated subqueries and correlated subqueries.

    +
    • Non-correlated subquery

      The execution of a subquery is independent from any attribute of outer queries. In this way, a subquery can be executed before outer queries.

      +

      Example:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
      +19
      +20
      select t1.c1,t1.c2
      +from t1
      +where t1.c1 in (
      +    select c2
      +    from t2
      +    where t2.c2 IN (2,3,4)
      +);
      +                          QUERY PLAN
      +---------------------------------------------------------------
      +Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Hash Right Semi Join
      +         Hash Cond: (t2.c2 = t1.c1)
      +         ->  Streaming(type: REDISTRIBUTE)
      +               Spawn on: All datanodes
      +               ->  Seq Scan on t2
      +                     Filter: (c2 = ANY ('{2,3,4}'::integer[]))
      +         ->  Hash
      +               ->  Seq Scan on t1
      +(10 rows)
      +
      + +
      +
    +
    • Correlated subquery

      The execution of a subquery depends on some attributes of outer queries which are used as AND conditions of the subquery. In the following example, t1.c1 in the t2.c1 = t1.c1 condition is a dependent attribute. Such a subquery depends on outer queries and needs to be executed once for each outer query.

      +

      Example:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
      +19
      +20
      +21
      +22
      select t1.c1,t1.c2
      +from t1
      +where t1.c1 in (
      +    select c2
      +    from t2
      +    where t2.c1 = t1.c1 AND t2.c2 in (2,3,4)
      +);
      +                                 QUERY PLAN
      +-----------------------------------------------------------------------
      +Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Seq Scan on t1
      +         Filter: (SubPlan 1)
      +         SubPlan 1
      +           ->  Result
      +                 Filter: (t2.c1 = t1.c1)
      +                 ->  Materialize
      +                         ->  Streaming(type: BROADCAST)
      +                             Spawn on: All datanodes
      +               ->  Seq Scan on t2
      +                                   Filter: (c2 = ANY ('{2,3,4}'::integer[]))
      +(12 rows)
      +
      + +
      +
    +
+
+

GaussDB(DWS) SubLink Optimization

A subquery is pulled up to join with tables in outer queries, preventing the subquery from being converted into the combination of a subplan and broadcast. You can run the EXPLAIN statement to check whether a subquery is converted into the combination of a subplan and broadcast.

+

Example:

+

+
  • Sublink-release supported by GaussDB(DWS)
    • Pulling up the IN sublink
      • The subquery cannot contain columns in the outer query (columns in more outer queries are allowed).
      • The subquery cannot contain volatile functions.
      +

      +
    • Pulling up the EXISTS sublink

      The WHERE clause must contain a column in the outer query. Other parts of the subquery cannot contain the column. Other restrictions are as follows:

      +
      • The subquery must contain the FROM clause.
      • The subquery cannot contain the WITH clause.
      • The subquery cannot contain aggregate functions.
      • The subquery cannot contain a SET, SORT, LIMIT, WindowAgg, or HAVING operation.
      • The subquery cannot contain volatile functions.
      +

      +
    • Pulling up an equivalent query containing aggregation functions

      The WHERE condition of the subquery must contain a column from the outer query. Equivalence comparison must be performed between this column and related columns in tables of the subquery. These conditions must be connected using AND. Other parts of the subquery cannot contain the column. Other restrictions are as follows:

      +
      • The expression in the WHERE condition of the subquery must be table columns.
      • After the SELECT keyword of the subquery, there must be only one output column. The output column must be an aggregation function (for example, MAX), and the parameter (for example, t2.c2) of the aggregate function cannot be columns of a table (for example, t1) in outer quires. The aggregate function cannot be COUNT.
        For example, the following subquery can be pulled up:
        1
        +2
        +3
        select * from t1 where c1 >(
        +       select max(t2.c1) from t2 where t2.c1=t1.c1
        +);
        +
        + +
        +
        +

        The following subquery cannot be pulled up because the subquery has no aggregation function.

        +
        1
        +2
        +3
        select * from t1 where c1 >(
        +       select  t2.c1 from t2 where t2.c1=t1.c1
        +);
        +
        + +
        +

        The following subquery cannot be pulled up because the subquery has two output columns:

        +
        1
        +2
        +3
        select * from t1 where (c1,c2) >(
        +       select  max(t2.c1),min(t2.c2) from t2 where t2.c1=t1.c1
        +);
        +
        + +
        +
      • The subquery must be a FROM clause.
      • The subquery cannot contain a GROUP BY, HAVING, or SET operation.
      • The subquery can only be inner join.
        For example, the following subquery can be pulled up:
        1
        +2
        +3
        select * from t1 where c1 >(
        +       select max(t2.c1) from t2 full join t3 on (t2.c2=t3.c2) where t2.c1=t1.c1
        +);
        +
        + +
        +
        +
      • The target list of the subquery cannot contain the function that returns a set.
      • The WHERE condition of the subquery must contain a column from the outer query. Equivalence comparison must be performed between this column and related columns in tables of the subquery. These conditions must be connected using AND. Other parts of the subquery cannot contain the columns from the outer query. For example, the following subquery can be pulled up:
        1
        +2
        +3
        +4
        +5
        select * from t3 where t3.c1=(
        +        select t1.c1
        +        from t1 where c1 >(
        +                select max(t2.c1) from t2 where t2.c1=t1.c1 
        +));
        +
        + +
        +

        If another condition is added to the subquery in the previous example, the subquery cannot be pulled up because the subquery references to the column in the outer query. Example:

        +
        1
        +2
        +3
        +4
        +5
        +6
        select * from t3 where t3.c1=(
        +        select t1.c1
        +        from t1 where c1 >(
        +               select max(t2.c1) from t2 where t2.c1=t1.c1 and t3.c1>t2.c2
        +
        +));
        +
        + +
        +
      +
    • Pulling up a sublink in the OR clause

      If the WHERE condition contains a EXIST-related sublink connected by OR,

      +

      for example,

      +
      1
      +2
      +3
      select a, c from t1
      +where t1.a = (select avg(a) from t3 where t1.b = t3.b) or
      +exists (select * from t4 where t1.c = t4.c);
      +
      + +
      +

      the process of pulling up such a sublink is as follows:

      +
      1. Extract opExpr from the OR clause in the WHERE condition. The value is t1.a = (select avg(a) from t3 where t1.b = t3.b).
      2. The opExpr contains a subquery. If the subquery can be pulled up, the subquery is rewritten as elect avg(a), t3.b from t3 group by t3.b, generating the NOT NULL condition t3.b is not null. The opExpr is replaced with this NOT NULL condition. In this case, the SQL statement changes to:
        1
        +2
        +3
        select a, c
        +from t1 left join (select avg(a) avg, t3.b from t3 group by t3.b)  as t3 on (t1.a = avg and t1.b = t3.b)
        +where t3.b is not null or exists (select * from t4 where t1.c = t4.c);
        +
        + +
        +
      3. Extract the EXISTS sublink exists (select * from t4 where t1.c = t4.c) from the OR clause to check whether the sublink can be pulled up. If it can be pulled up, it is converted into select t4.c from t4 group by t4.c, generating the NOT NULL condition t4.c is not null. In this case, the SQL statement changes to:
        1
        +2
        +3
        select a, c
        +from t1 left join (select avg(a) avg, t3.b from t3 group by t3.b)  as t3 on (t1.a = avg and t1.b = t3.b)
        +left join (select t4.c from t4 group by t4.c) where t3.b is not null or t4.c is not null;
        +
        + +
        +

        +
      +
    +
+
  • Sublink-release not supported by GaussDB(DWS)

    Except the sublinks described above, all the other sublinks cannot be pulled up. In this case, a join subquery is planned as the combination of a subplan and broadcast. As a result, if tables in the subquery have a large amount of data, query performance may be poor.

    +

    If a correlated subquery joins with two tables in outer queries, the subquery cannot be pulled up. You need to change the parent query into a WITH clause and then perform the join.

    +

    Example:

    +
    1
    +2
    select distinct t1.a, t2.a
    +from t1 left join t2 on t1.a=t2.a and not exists (select a,b from test1 where test1.a=t1.a and test1.b=t2.a);
    +
    + +
    +

    The parent query is changed into:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    with temp as
    +(
    +        select * from (select t1.a as a, t2.a as b from t1 left join t2 on t1.a=t2.a)
    +
    +)
    +select distinct a,b
    +from temp
    +where not exists (select a,b from test1 where temp.a=test1.a and temp.b=test1.b);
    +
    + +
    +
    • The subquery (without COUNT) in the target list cannot be pulled up.

      Example:

      +
      1
      +2
      +3
      +4
      explain (costs off)
      +select (select c2 from t2 where t1.c1 = t2.c1) ssq, t1.c2
      +from t1
      +where t1.c2 > 10;
      +
      + +
      +

      The execution plan is as follows:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
      explain (costs off)
      +select (select c2 from t2 where t1.c1 = t2.c1) ssq, t1.c2
      +from t1
      +where t1.c2 > 10;
      +                      QUERY PLAN
      +------------------------------------------------------
      + Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Seq Scan on t1
      +         Filter: (c2 > 10)
      +         SubPlan 1
      +           ->  Result
      +                 Filter: (t1.c1 = t2.c1)
      +                 ->  Materialize
      +                       ->  Streaming(type: BROADCAST)
      +                             Spawn on: All datanodes
      +                             ->  Seq Scan on t2
      +(11 rows)
      +
      + +
      +

      The correlated subquery is displayed in the target list (query return list). Values need to be returned even if the condition t1.c1=t2.c1 is not met. Therefore, use left outer join to join T1 and T2 so that SSQ can return padding values when the condition t1.c1=t2.c1 is not met.

      +

      ScalarSubQuery (SSQ) and Correlated-ScalarSubQuery (CSSQ) are described as follows:

      +
      • SSQ: a sublink that returns only a single row and column scalar value
      • CSSQ: an SSQ containing conditions
      +
      +

      The preceding SQL statement can be changed into:

      +
      1
      +2
      +3
      +4
      +5
      +6
      +7
      with ssq as
      +(
      +    select t2.c2 from t2
      +)
      +select ssq.c2, t1.c2
      +from t1 left join ssq on t1.c1 = ssq.c2
      +where t1.c2 > 10;
      +
      + +
      +

      The execution plan after the change is as follows:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
                      QUERY PLAN
      +-------------------------------------------
      + Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Hash Right Join
      +         Hash Cond: (t2.c2 = t1.c1)
      +         ->  Streaming(type: REDISTRIBUTE)
      +               Spawn on: All datanodes
      +               ->  Seq Scan on t2
      +         ->  Hash
      +               ->  Seq Scan on t1
      +                     Filter: (c2 > 10)
      +(10 rows)
      +
      + +
      +

      In the preceding example, the SSQ is pulled up to right join, preventing poor performance caused by the combination of a subplan and broadcast when the table (T2) in the subquery is too large.

      +
    • The subquery (with COUNT) in the target list cannot be pulled up.

      Example:

      +
      1
      +2
      +3
      select (select count(*) from t2 where t2.c1=t1.c1) cnt, t1.c1, t3.c1
      +from t1,t3
      +where t1.c1=t3.c1 order by cnt, t1.c1;
      +
      + +
      +

      The execution plan is as follows:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
      +19
      +20
                                  QUERY PLAN
      +------------------------------------------------------------------
      + Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Sort
      +         Sort Key: ((SubPlan 1)), t1.c1
      +         ->  Hash Join
      +               Hash Cond: (t1.c1 = t3.c1)
      +               ->  Seq Scan on t1
      +               ->  Hash
      +                     ->  Seq Scan on t3
      +               SubPlan 1
      +                 ->  Aggregate
      +                       ->  Result
      +                             Filter: (t2.c1 = t1.c1)
      +                             ->  Materialize
      +                                   ->  Streaming(type: BROADCAST)
      +                                         Spawn on: All datanodes
      +                                         ->  Seq Scan on t2
      +(17 rows)
      +
      + +
      +

      The correlated subquery is displayed in the target list (query return list). Values need to be returned even if the condition t1.c1=t2.c1 is not met. Therefore, use left outer join to join T1 and T2 so that SSQ can return padding values when the condition t1.c1=t2.c1 is not met. However, COUNT is used to ensure that 0 is returned when the condition is note met. Therefore, case-when NULL then 0 else count(*) can be used.

      +

      The preceding SQL statement can be changed into:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      with ssq as
      +(
      +    select count(*) cnt, c1 from t2 group by c1
      +)
      +select case when
      +            ssq.cnt is null then 0
      +            else ssq.cnt
      +       end cnt, t1.c1, t3.c1
      +from t1 left join ssq on ssq.c1 = t1.c1,t3
      +where t1.c1 = t3.c1
      +order by ssq.cnt, t1.c1;
      +
      + +
      +

      The execution plan after the change is as follows:

      +
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
        QUERY PLAN
      +-----------------------------------------------------
      + Streaming (type: GATHER)
      +   Node/s: All datanodes
      +   ->  Sort
      +         Sort Key: (count(*)), t1.c1
      +         ->  Hash Join
      +               Hash Cond: (t1.c1 = t3.c1)
      +               ->  Hash Left Join
      +                     Hash Cond: (t1.c1 = t2.c1)
      +                     ->  Seq Scan on t1
      +                     ->  Hash
      +                           ->  HashAggregate
      +                                 Group By Key: t2.c1
      +                                 ->  Seq Scan on t2
      +               ->  Hash
      +                     ->  Seq Scan on t3
      +(15 rows)
      +
      + +
      +
    +
    • Pulling up nonequivalent subqueries

      Example:

      +
      1
      +2
      +3
      select t1.c1, t1.c2
      +from t1
      +where t1.c1 = (select agg() from t2.c2 > t1.c2);
      +
      + +
      +

      Nonequivalent subqueries cannot be pulled up. You can perform join twice (one CorrelationKey and one rownum self-join) to rewrite the statement.

      +

      You can rewrite the statement in either of the following ways:

      +
      • Subquery rewriting
        1
        +2
        +3
        +4
        +5
        +6
        +7
        select t1.c1, t1.c2
        +from t1, (
        +    select t1.rowid, agg() aggref
        +    from t1,t2
        +    where t1.c2 > t2.c2 group by t1.rowid
        +) dt /* derived table */
        +where t1.rowid = dt.rowid AND t1.c1 = dt.aggref;
        +
        + +
        +
      • CTE rewriting
         1
        + 2
        + 3
        + 4
        + 5
        + 6
        + 7
        + 8
        + 9
        +10
        WITH dt as
        +(
        +    select t1.rowid, agg() aggref
        +    from t1,t2
        +    where t1.c2 > t2.c2 group by t1.rowid
        +)
        +select t1.c1, t1.c2
        +from t1, derived_table
        +where t1.rowid = derived_table.rowid AND
        +t1.c1 = derived_table.aggref;
        +
        + +
        +
      +
    +
    • Currently, GaussDB(DWS) does not have an effective way to provide globally unique row IDs for tables and intermediate result sets. Therefore, the rewriting is difficult. It is recommended that this issue is avoided at the service layer or by using t1.xc_node_id + t1.ctid to associate row IDs. However, the high repetition rate of xc_node_id leads to low association efficiency, and xc_node_id+ctid cannot be used as the join condition of hash join.
    • If the AGG type is COUNT(*), 0 is used for data padding if CASE-WHEN is not matched. If the type is not COUNT(*), NULL is used.
    • CTE rewriting works better by using share scan.
    +
    +
+
+

More Optimization Examples

1. Change the base table to a replication table and create an index on the filter column.

+
1
+2
+3
create table master_table (a int);
+create table sub_table(a int, b int);
+select a from master_table group by a having a in (select a from sub_table); 
+
+ +
+

In this example, a correlated subquery is contained. To improve the query performance, you can change sub_table to a replication table and create an index on the a column.

+
+

2. Modify the SELECT statement, change the subquery to a JOIN relationship between the primary table and the parent query, or modify the subquery to improve the query performance. Ensure that the subquery to be used is semantically correct.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
explain (costs off)select * from master_table as t1 where t1.a in (select t2.a from sub_table as t2 where t1.a = t2.b);
+                        QUERY PLAN
+----------------------------------------------------------
+ Streaming (type: GATHER)
+   Node/s: All datanodes
+   ->  Seq Scan on master_table t1
+         Filter: (SubPlan 1)
+         SubPlan 1
+           ->  Result
+                 Filter: (t1.a = t2.b)
+                 ->  Materialize
+                       ->  Streaming(type: BROADCAST)
+                             Spawn on: All datanodes
+                             ->  Seq Scan on sub_table t2
+(11 rows)
+
+ +
+

In the preceding example, a subplan is used. To remove the subplan, you can modify the statement as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
explain(costs off) select * from master_table as t1 where exists (select t2.a from sub_table as t2 where t1.a = t2.b and t1.a = t2.a);
+                    QUERY PLAN
+--------------------------------------------------
+ Streaming (type: GATHER)
+   Node/s: All datanodes
+   ->  Hash Semi Join
+         Hash Cond: (t1.a = t2.b)
+         ->  Seq Scan on master_table t1
+         ->  Hash
+               ->  Streaming(type: REDISTRIBUTE)
+                     Spawn on: All datanodes
+                     ->  Seq Scan on sub_table t2
+(9 rows)
+
+ +
+

In this way, the subplan is replaced by the semi-join between the two tables, greatly improving the execution efficiency.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0449.html b/docs/dws/dev/dws_04_0449.html new file mode 100644 index 00000000..2662a670 --- /dev/null +++ b/docs/dws/dev/dws_04_0449.html @@ -0,0 +1,399 @@ + + +

Optimizing Statistics

+

What Is Statistic Optimization

GaussDB(DWS) generates optimal execution plans based on the cost estimation. Optimizers need to estimate the number of data rows and the cost based on statistics collected using ANALYZE. Therefore, the statistics is vital for the estimation of the number of rows and cost. Global statistics are collected using ANALYZE: relpages and reltuples in the pg_class table; stadistinct, stanullfrac, stanumbersN, stavaluesN, and histogram_bounds in the pg_statistic table.

+
+

Example 1: Poor Query Performance Due to the Lack of Statistics

In most cases, the lack of statistics in tables or columns involved in the query greatly affects the query performance.

+

The table structure is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
CREATE TABLE LINEITEM
+(
+L_ORDERKEY         BIGINT        NOT NULL
+, L_PARTKEY        BIGINT        NOT NULL
+, L_SUPPKEY        BIGINT        NOT NULL3
+, L_LINENUMBER     BIGINT        NOT NULL
+, L_QUANTITY       DECIMAL(15,2) NOT NULL
+, L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL
+, L_DISCOUNT       DECIMAL(15,2) NOT NULL
+, L_TAX            DECIMAL(15,2) NOT NULL
+, L_RETURNFLAG     CHAR(1)       NOT NULL
+, L_LINESTATUS     CHAR(1)       NOT NULL
+, L_SHIPDATE       DATE          NOT NULL
+, L_COMMITDATE     DATE          NOT NULL
+, L_RECEIPTDATE    DATE          NOT NULL
+, L_SHIPINSTRUCT   CHAR(25)      NOT NULL
+, L_SHIPMODE       CHAR(10)      NOT NULL
+, L_COMMENT        VARCHAR(44)   NOT NULL
+) with (orientation = column, COMPRESSION = MIDDLE) distribute by hash(L_ORDERKEY);
+
+CREATE TABLE ORDERS
+(
+O_ORDERKEY        BIGINT        NOT NULL
+, O_CUSTKEY       BIGINT        NOT NULL
+, O_ORDERSTATUS   CHAR(1)       NOT NULL
+, O_TOTALPRICE    DECIMAL(15,2) NOT NULL
+, O_ORDERDATE     DATE NOT NULL
+, O_ORDERPRIORITY CHAR(15)      NOT NULL
+, O_CLERK         CHAR(15)      NOT NULL
+, O_SHIPPRIORITY  BIGINT        NOT NULL
+, O_COMMENT       VARCHAR(79)   NOT NULL
+)with (orientation = column, COMPRESSION = MIDDLE) distribute by hash(O_ORDERKEY);
+
+ +
+

The query statements are as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
explain verbose select
+count(*) as numwait 
+from
+lineitem l1,
+orders 
+where
+o_orderkey = l1.l_orderkey
+and o_orderstatus = 'F'
+and l1.l_receiptdate > l1.l_commitdate
+and not exists (
+select
+*
+from
+lineitem l3
+where
+l3.l_orderkey = l1.l_orderkey
+and l3.l_suppkey <> l1.l_suppkey
+and l3.l_receiptdate > l3.l_commitdate
+)
+order by
+numwait desc;
+
+ +
+

If such an issue occurs, you can use the following methods to check whether statistics in tables or columns has been collected using ANALYZE.

+
  1. Execute EXPLAIN VERBOSE to analyze the execution plan and check the warning information:
    WARNING:Statistics in some tables or columns(public.lineitem.l_receiptdate, public.lineitem.l_commitdate, public.lineitem.l_orderkey, public.lineitem.l_suppkey, public.orders.o_orderstatus, public.orders.o_orderkey) are not collected.
    +HINT:Do analyze for them in order to generate optimized plan.
    +
  2. Check whether the following information exists in the log file in the pg_log directory. If it does, the poor query performance was caused by the lack of statistics in some tables or columns.
    2017-06-14 17:28:30.336 CST 140644024579856 20971684 [BACKEND] LOG:Statistics in some tables or columns(public.lineitem.l_receiptdate, public.lineitem.l_commitdate, public.lineitem.l_orderkey, public.linei
    +tem.l_suppkey, public.orders.o_orderstatus, public.orders.o_orderkey) are not collected.
    +2017-06-14 17:28:30.336 CST 140644024579856 20971684 [BACKEND] HINT:Do analyze for them in order to generate optimized plan.
    +
+

By using any of the preceding methods, you can identify tables or columns whose statistics have not been collected using ANALYZE. You can execute ANALYZE to warnings or tables and columns recorded in logs to resolve the problem.

+
+

Example 2: Setting cost_param to Optimize Query Performance

For details, see Case: Configuring cost_param for Better Query Performance.

+
+

Example 3: Optimization is Not Accurate When Intermediate Results Exist in the Query Where JOIN Is Used for Multiple Tables

Symptom: Query the personnel who have checked in an Internet cafe within 15 minutes before and after the check-in of a specified person.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
SELECT
+C.WBM,
+C.DZQH,
+C.DZ,
+B.ZJHM,
+B.SWKSSJ,
+B.XWSJ
+FROM
+b_zyk_wbswxx A,
+b_zyk_wbswxx B,
+b_zyk_wbcs C
+WHERE
+A.ZJHM = '522522******3824'
+AND A.WBDM = B.WBDM
+AND A.WBDM = C.WBDM
+AND abs(to_date(A.SWKSSJ,'yyyymmddHH24MISS') - to_date(B.SWKSSJ,'yyyymmddHH24MISS')) < INTERVAL '15 MINUTES'
+ORDER BY
+B.SWKSSJ,
+B.ZJHM
+limit 10 offset 0
+;
+
+ +
+

Figure 1 shows the execution plan. This query takes about 12s.

+
Figure 1 Using an unlogged table (1)
+

+

Optimization analysis:

+
  1. In the execution plan, index scan is used for node scanning, the Join Filter calculation in the external NEST LOOP IN statement consumes most of the query time, and the calculation uses the string addition and subtraction, and unequal-value comparison.
  2. Use an unlogged table to record the Internet access time of the specified person. The start time and end time are processed during data insertion, and this reduces subsequent addition and subtraction operations.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    //Create a temporary unlogged table.
    +CREATE UNLOGGED TABLE temp_tsw
    +(
    +ZJHM         NVARCHAR2(18),
    +WBDM         NVARCHAR2(14),
    +SWKSSJ_START NVARCHAR2(14),
    +SWKSSJ_END   NVARCHAR2(14),
    +WBM          NVARCHAR2(70),
    +DZQH         NVARCHAR2(6),
    +DZ           NVARCHAR2(70),
    +IPDZ         NVARCHAR2(39)
    +)
    +;
    +//Insert the Internet access record of the specified person, and process the start time and end time.
    +INSERT INTO
    +temp_tsw
    +SELECT
    +A.ZJHM,
    +A.WBDM,
    +to_char((to_date(A.SWKSSJ,'yyyymmddHH24MISS') - INTERVAL '15 MINUTES'),'yyyymmddHH24MISS'),
    +to_char((to_date(A.SWKSSJ,'yyyymmddHH24MISS') + INTERVAL '15 MINUTES'),'yyyymmddHH24MISS'),
    +B.WBM,B.DZQH,B.DZ,B.IPDZ
    +FROM
    +b_zyk_wbswxx A,
    +b_zyk_wbcs B
    +WHERE
    +A.ZJHM='522522******3824' AND A.WBDM = B.WBDM
    +;
    +
    +//Query the personnel who have check in an Internet cafe before and after 15 minutes of the check-in of the specified person. Convert their ID card number format to int8 in comparison.
    +SELECT
    +A.WBM,
    +A.DZQH,
    +A.DZ,
    +A.IPDZ,
    +B.ZJHM,
    +B.XM,
    +to_date(B.SWKSSJ,'yyyymmddHH24MISS') as SWKSSJ,
    +to_date(B.XWSJ,'yyyymmddHH24MISS') as XWSJ,
    +B.SWZDH
    +FROM temp_tsw A,
    +b_zyk_wbswxx B
    +WHERE
    +A.ZJHM <> B.ZJHM
    +AND A.WBDM = B.WBDM
    +AND (B.SWKSSJ)::int8 > (A.swkssj_start)::int8
    +AND (B.SWKSSJ)::int8 < (A.swkssj_end)::int8
    +order by
    +B.SWKSSJ,
    +B.ZJHM
    +limit 10 offset 0
    +;
    +
    + +
    +

    The query takes about 7s. Figure 2 shows the execution plan.

    +
    Figure 2 Using an unlogged table (2)
    +
  3. In the previous plan, Hash Join has been executed, and a Hash table has been created for the large table b_zyk_wbswxx. The table contains large amounts of data, so the creation takes long time.

    temp_tsw contains only hundreds of records, and an equal-value connection is created between temp_tsw and b_zyk_wbswxx using wbdm (the Internet cafe code). Therefore, if JOIN is changed to NEST LOOP JOIN, index scan can be used for node scanning, and the performance will be boosted.

    +
  4. Execute the following statement to change JOIN to NEST LOOP JOIN.
    1
    SET enable_hashjoin = off;
    +
    + +
    +

    Figure 3 shows the execution plan. The query takes about 3s.

    +
    Figure 3 Using an unlogged table (3)
    +
  5. Save the query result set in the unlogged table for paging display.

    If paging display needs to be achieved on the upper-layer application page, change the offset value to determine the result set on the target page. In this way, the previous query statement will be executed every time after a page turning operation, which causes long response latency.

    +

    To resolve this problem, you are advised to use the unlogged table to save the result set.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    //Create an unlogged table to save the result set.
    +CREATE UNLOGGED TABLE temp_result
    +(
    +WBM      NVARCHAR2(70),
    +DZQH     NVARCHAR2(6),
    +DZ       NVARCHAR2(70),
    +IPDZ     NVARCHAR2(39),
    +ZJHM     NVARCHAR2(18),
    +XM       NVARCHAR2(30),
    +SWKSSJ   date,
    +XWSJ     date,
    +SWZDH    NVARCHAR2(32)
    +);
    +
    +//Insert the result set to the unlogged table. The insertion takes about 3s.
    +INSERT INTO
    +temp_result
    +SELECT
    +A.WBM,
    +A.DZQH,
    +A.DZ,
    +A.IPDZ,
    +B.ZJHM,
    +B.XM,
    +to_date(B.SWKSSJ,'yyyymmddHH24MISS') as SWKSSJ,
    +to_date(B.XWSJ,'yyyymmddHH24MISS') as XWSJ,
    +B.SWZDH
    +FROM temp_tsw A,
    +b_zyk_wbswxx B
    +WHERE
    +A.ZJHM <> B.ZJHM
    +AND A.WBDM = B.WBDM
    +AND (B.SWKSSJ)::int8 > (A.swkssj_start)::int8
    +AND (B.SWKSSJ)::int8 < (A.swkssj_end)::int8
    +;
    +
    +//Perform paging query on the result set. The paging query takes about 10 ms.
    +SELECT
    +*
    +FROM
    +temp_result
    +ORDER BY
    +SWKSSJ,
    +ZJHM
    +LIMIT 10 OFFSET 0;
    +
    + +
    +

    Collecting global statistics using ANALYZE improves query performance.

    +

    If a performance problem occurs, you can use plan hint to adjust the query plan to the previous one. For details, see Hint-based Tuning.

    +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0450.html b/docs/dws/dev/dws_04_0450.html new file mode 100644 index 00000000..058ea2cd --- /dev/null +++ b/docs/dws/dev/dws_04_0450.html @@ -0,0 +1,63 @@ + + +

Optimizing Operators

+

What Is Operator Optimization

A query statement needs to go through multiple operator procedures to generate the final result. Sometimes, the overall query performance deteriorates due to long execution time of certain operators, which are regarded as bottleneck operators. In this case, you need to execute the EXPLAIN ANALYZE/PERFORMANCE command to view the bottleneck operators, and then perform optimization.

+

For example, in the following execution process, the execution time of the Hashagg operator accounts for about 66% [(51016-13535)/56476 ≈ 66%] of the total execution time. Therefore, the Hashagg operator is the bottleneck operator for this query. Optimize this operator first.

+

+
+

Operator Optimization Example

1. Scan the base table. For queries requiring large volume of data filtering, such as point queries or queries that need range scanning, a full table scan using SeqScan will take a long time. To facilitate scanning, you can create indexes on the condition column and select IndexScan for index scanning.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
 explain (analyze on, costs off) select * from store_sales where ss_sold_date_sk = 2450944;
+ id |             operation          |       A-time        | A-rows | Peak Memory  | A-width
+----+--------------------------------+---------------------+--------+--------------+---------
+  1 | ->  Streaming (type: GATHER)   | 3666.020            |   3360 | 195KB        |
+  2 |    ->  Seq Scan on store_sales | [3594.611,3594.611] |   3360 | [34KB, 34KB] |
+
+ Predicate Information (identified by plan id) 
+-----------------------------------------------
+   2 --Seq Scan on store_sales
+         Filter: (ss_sold_date_sk = 2450944)
+         Rows Removed by Filter: 4968936
+
+ +
+
1
+2
+3
+4
+5
+6
+7
 create index idx on store_sales_row(ss_sold_date_sk);
+CREATE INDEX
+ explain (analyze on, costs off) select * from store_sales_row where ss_sold_date_sk = 2450944;
+ id |                   operation                    |     A-time      | A-rows | Peak Memory  | A-width
+----+------------------------------------------------+-----------------+--------+--------------+----------
+  1 | ->  Streaming (type: GATHER)                   | 81.524          |   3360 | 195KB        |
+  2 |    ->  Index Scan using idx on store_sales_row | [13.352,13.352] |   3360 | [34KB, 34KB] |
+
+ +
+

In this example, the full table scan filters much data and returns 3360 records. After an index has been created on the ss_sold_date_sk column, the scanning efficiency is significantly boosted from 3.6s to 13 ms by using IndexScan.

+

2: If NestLoop is used for joining tables with a large number of rows, the join may take a long time. In the following example, NestLoop takes 181s. If enable_mergejoin=off is set to disable merge join and enable_nestloop=off is set to disable NestLoop so that the optimizer selects hash join, the join takes more than 200 ms.

+

+

+

3. Generally, query performance can be improved by selecting HashAgg. If Sort and GroupAgg are used for a large result set, you need to set enable_sort to off. HashAgg consumes less time than Sort and GroupAgg.

+

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0451.html b/docs/dws/dev/dws_04_0451.html new file mode 100644 index 00000000..8450091a --- /dev/null +++ b/docs/dws/dev/dws_04_0451.html @@ -0,0 +1,297 @@ + + +

Optimizing Data Skew

+

Data skew breaks the balance among nodes in the distributed MPP architecture. If the amount of data stored or processed by a node is much greater than that by other nodes, the following problems may occur:

+
  • Storage skew severely limits the system capacity. The skew on a single node hinders system storage utilization.
  • Computing skew severely affects performance. The data to be processed on the skew node is much more than that on other nodes, deteriorating overall system performance.
  • Data skew severely affects the scalability of the MPP architecture. During storage or computing, data with the same values is often placed on the same node. Therefore, even if we add nodes after a data skew occurs, the skew data (data with the same values) is still placed on the node and affects the system capacity or performance bottleneck.
+

GaussDB(DWS) provides a complete solution for data skew, including storage and computing skew.

+

Data Skew in the Storage Layer

In the GaussDB(DWS) database, data is distributed and stored on each DN. You can improve the query efficiency by using distributed execution. However, if data skew occurs, bottlenecks exist on some DNs during distribution execution, affecting the query performance. This is because the distribution column is not properly selected. This can be solved by adjusting the distribution column.

+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
explain performance select count(*) from inventory;
+5 --CStore Scan on lmz.inventory
+         dn_6001_6002 (actual time=0.444..83.127 rows=42000000 loops=1)
+         dn_6003_6004 (actual time=0.512..63.554 rows=27000000 loops=1)
+         dn_6005_6006 (actual time=0.722..99.033 rows=45000000 loops=1)
+         dn_6007_6008 (actual time=0.529..100.379 rows=51000000 loops=1)
+         dn_6009_6010 (actual time=0.382..71.341 rows=36000000 loops=1)
+         dn_6011_6012 (actual time=0.547..100.274 rows=51000000 loops=1)
+         dn_6013_6014 (actual time=0.596..118.289 rows=60000000 loops=1)
+         dn_6015_6016 (actual time=1.057..132.346 rows=63000000 loops=1)
+         dn_6017_6018 (actual time=0.940..110.310 rows=54000000 loops=1)
+         dn_6019_6020 (actual time=0.231..41.198 rows=21000000 loops=1)
+         dn_6021_6022 (actual time=0.927..114.538 rows=54000000 loops=1)
+         dn_6023_6024 (actual time=0.637..118.385 rows=60000000 loops=1)
+         dn_6025_6026 (actual time=0.288..32.240 rows=15000000 loops=1)
+         dn_6027_6028 (actual time=0.566..118.096 rows=60000000 loops=1)
+         dn_6029_6030 (actual time=0.423..82.913 rows=42000000 loops=1)
+         dn_6031_6032 (actual time=0.395..78.103 rows=39000000 loops=1)
+         dn_6033_6034 (actual time=0.376..51.052 rows=24000000 loops=1)
+         dn_6035_6036 (actual time=0.569..79.463 rows=39000000 loops=1)
+
+ +
+

In the performance information, you can view the number of scan rows of each DN in the inventory table. The number of rows of each DN differs a lot, the biggest is 63000000 and the smallest value is 15000000. This value difference on the performance of data scan is acceptable, but if the join operator exists in the upper-layer, the impact on the performance cannot be ignored.

+

Generally, the data table is hash distributed on each DN; therefore, it is important to choose a proper distribution column. Run table_skewness() to view data skew of each DN in the inventory table. The query result is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
select table_skewness('inventory');
+              table_skewness              
+------------------------------------------
+ ("dn_6015_6016        ",63000000,8.046%)
+ ("dn_6013_6014        ",60000000,7.663%)
+ ("dn_6023_6024        ",60000000,7.663%)
+ ("dn_6027_6028        ",60000000,7.663%)
+ ("dn_6017_6018        ",54000000,6.897%)
+ ("dn_6021_6022        ",54000000,6.897%)
+ ("dn_6007_6008        ",51000000,6.513%)
+ ("dn_6011_6012        ",51000000,6.513%)
+ ("dn_6005_6006        ",45000000,5.747%)
+ ("dn_6001_6002        ",42000000,5.364%)
+ ("dn_6029_6030        ",42000000,5.364%)
+ ("dn_6031_6032        ",39000000,4.981%)
+ ("dn_6035_6036        ",39000000,4.981%)
+ ("dn_6009_6010        ",36000000,4.598%)
+ ("dn_6003_6004        ",27000000,3.448%)
+ ("dn_6033_6034        ",24000000,3.065%)
+ ("dn_6019_6020        ",21000000,2.682%)
+ ("dn_6025_6026        ",15000000,1.916%)
+(18 rows)
+
+ +
+

The table definition indicates that the table uses the inv_date_sk column as the distribution column, which causes a data skew. Based on the data distribution of each column, change the distribution column to inv_item_sk. The skew status is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
select table_skewness('inventory');
+              table_skewness              
+------------------------------------------
+ ("dn_6001_6002        ",43934200,5.611%)
+ ("dn_6007_6008        ",43829420,5.598%)
+ ("dn_6003_6004        ",43781960,5.592%)
+ ("dn_6031_6032        ",43773880,5.591%)
+ ("dn_6033_6034        ",43763280,5.589%)
+ ("dn_6011_6012        ",43683600,5.579%)
+ ("dn_6013_6014        ",43551660,5.562%)
+ ("dn_6027_6028        ",43546340,5.561%)
+ ("dn_6009_6010        ",43508700,5.557%)
+ ("dn_6023_6024        ",43484540,5.554%)
+ ("dn_6019_6020        ",43466800,5.551%)
+ ("dn_6021_6022        ",43458500,5.550%)
+ ("dn_6017_6018        ",43448040,5.549%)
+ ("dn_6015_6016        ",43247700,5.523%)
+ ("dn_6005_6006        ",43200240,5.517%)
+ ("dn_6029_6030        ",43181360,5.515%)
+ ("dn_6025_6026        ",43179700,5.515%)
+ ("dn_6035_6036        ",42960080,5.487%)
+(18 rows)
+
+ +
+

Data skew is solved.

+

In addition to the table_skewness() view, you can use the table_distribution function and the PGXC_GET_TABLE_SKEWNESS view to efficiently query the data skew of each table.

+
+

Data Skew in the Computing Layer

Even if data is balanced across nodes after you change the distribution key of a table, data skew may still occur during a query. If data skew occurs in the result set of an operator on a DN, skew will also occur during the computing that involves the operator. Generally, this is caused by data redistribution during the execution.

+

During a query, JOIN keys and GROUP BY keys are not used as distribution columns. Data is redistributed among DNs based on the hash values of data on the keys. The redistribution is implemented using the Redistribute operator in an execution plan. Data skew in redistribution columns can lead to data skew during system operation. After the redistribution, some nodes will have much more data, process more data, and will have much lower performance than others.

+

In the following example, the s and t tables are joined, and s.x and t.x columns in the join condition are not their distribution keys. Table data is redistributed using the REDISTRIBUTE operator. Data skew occurs in the s.x column and not in the t.x column. The result set of the Streaming operator (id being 6) on datanode2 has data three times that of other DNs and causes a skew.

+
1
select * from skew s,test t where s.x = t.x order by s.a limit 1;
+
+ +
+
 id |                      operation                      |        A-time         
+----+-----------------------------------------------------+-----------------------
+  1 | ->  Limit                                           | 52622.382             
+  2 |    ->  Streaming (type: GATHER)                     | 52622.374             
+  3 |       ->  Limit                                     | [30138.494,52598.994] 
+  4 |          ->  Sort                                   | [30138.486,52598.986] 
+  5 |             ->  Hash Join (6,8)                     | [30127.013,41483.275] 
+  6 |                ->  Streaming(type: REDISTRIBUTE)    | [11365.110,22024.845] 
+  7 |                   ->  Seq Scan on public.skew s     | [2019.168,2175.369]   
+  8 |                ->  Hash                             | [2460.108,2499.850]   
+  9 |                   ->  Streaming(type: REDISTRIBUTE) | [1056.214,1121.887]   
+ 10 |                      ->  Seq Scan on public.test t  | [310.848,325.569]     
+ 
+6 --Streaming(type: REDISTRIBUTE)
+         datanode1 (rows=5050368)
+         datanode2 (rows=15276032)
+         datanode3 (rows=5174272)
+         datanode4 (rows=5219328)
+

It is more difficult to detect skew in computing than in storage. To solve skew in computing, GaussDB provides the Runtime Load Balance Technology (RLBT) solution controlled by the skew_option parameter. The RLBT solution addresses how to detect and solve data skew.

+
  1. Detect data skew.

    The solution first checks whether skew data exists in redistribution columns used for computing. RLBT can detect data skew based on statistics, specified hints, or rules.

    +
    • Detection based on statistics

      Run the ANALYZE statement to collect statistics on tables. The optimizer will automatically identify skew data on redistribution keys based on the statistics and generate optimization plans for queries having potential skew. When the redistribution key has multiple columns, statistics information can be used for identification only when all columns belong to the same base table.

      +

      The statistics information can only provide the skew of the base table. When a column in the base table is skewed, other columns have filtering conditions, or after the join of other tables, we cannot determine whether the skewed data still exists on the skewed column. If skew_option is set to normal, it indicates that data skew persists and the base tables will be optimized to solve the skew. If skew_option is set to lazy, it indicates that data skew is solved and the optimization will stop.

      +
    • Detection based on specified hints

      The intermediate results of complex queries are difficult to estimate based on statistics. In this case, you can specify hints provide the skew information, based on which the optimizer optimize queries. For details about the syntax of hints, see Skew Hints.

      +
    • Detection based on rules

      In a business intelligence (BI) system, a large number of SQL statements having outer joins (including left joins, right joins, and full joins) are generated, and many NULL values will be generated in empty columns that have no match for outer joins. If JOIN or GROUP BY operations are performed on the columns, data skew will occur. RLBT can automatically identify this scenario and generate an optimization plan for NULL value skew.

      +
    +
  2. Solve computing skew.
    Join and Aggregate operators are optimized to solve skew.
    • Join optimization
    +
    +

    Skew and non-skew data is separately processed. Details are as follows:

    +
    1. When redistribution is required on both sides of a join:

      Use PART_REDISTRIBUTE_PART_ROUNDROBIN on the side with skew. Specifically, perform round-robin on skew data and redistribution on non-skew data.

      +

      Use PART_REDISTRIBUTE_PART_BROADCAST on the side with no skew. Specifically, perform broadcast on skew data and redistribution on non-skew data.

      +
    2. When redistribution is required on only one side of a join:

      Use PART_REDISTRIBUTE_PART_ROUNDROBIN on the side where redistribution is required.

      +

      Use PART_LOCAL_PART_BROADCAST on the side where redistribution is not required. Specifically, perform broadcast on skew data and retain other data locally.

      +
    3. When a table has NULL values padded:

      Use PART_REDISTRIBUTE_PART_LOCAL on the table. Specifically, retain the NULL values locally and perform redistribution on other data.

      +
    +

    In the example query, the s.x column contains skewed data and its value is 0. The optimizer identifies the skew data in statistics and generates the following optimization plan:

    +
     id |                                operation                                |        A-time         
    +----+-------------------------------------------------------------------------+-----------------------
    +  1 | ->  Limit                                                               | 23642.049             
    +  2 |    ->  Streaming (type: GATHER)                                         | 23642.041             
    +  3 |       ->  Limit                                                         | [23310.768,23618.021] 
    +  4 |          ->  Sort                                                       | [23310.761,23618.012] 
    +  5 |             ->  Hash Join (6,8)                                         | [20898.341,21115.272] 
    +  6 |                ->  Streaming(type: PART REDISTRIBUTE PART ROUNDROBIN)   | [7125.834,7472.111]   
    +  7 |                   ->  Seq Scan on public.skew s                         | [1837.079,1911.025]   
    +  8 |                ->  Hash                                                 | [2612.484,2640.572]   
    +  9 |                   ->  Streaming(type: PART REDISTRIBUTE PART BROADCAST) | [1193.548,1297.894]   
    + 10 |                      ->  Seq Scan on public.test t                      | [314.343,328.707]     
    +
    +   5 --Vector Hash Join (6,8)
    +         Hash Cond: s.x = t.x
    +         Skew Join Optimizated by Statistic
    +   6 --Streaming(type: PART REDISTRIBUTE PART ROUNDROBIN)
    +         datanode1 (rows=7635968)
    +         datanode2 (rows=7517184)
    +         datanode3 (rows=7748608)
    +         datanode4 (rows=7818240)
    +

    In the preceding execution plan, Skew Join Optimized by Statistic indicates that this is an optimized plan used for handling data skew. The Statistic keyword indicates that the plan optimization is based on statistics; Hint indicates that the optimization is based on hints; Rule indicates that the optimization is based on rules. In this plan, skew and non-skew data is separately processed. Non-skew data in the s table is redistributed based on its hash values, and skew data (whose value is 0) is evenly distributed on all nodes in round-robin mode. In this way, data skew is solved.

    +

    To ensure result correctness, the t table also needs to be processed. In the t table, the data whose value is 0 (skew value in the s.x table) is broadcast and other data is redistributed based on its hash values.

    +

    In this way, data skew in JOIN operations is solved. The above result shows that the output of the Streaming operator (id being 6) is balanced and the end-to-end performance of the query is doubled.

    +

    If the stream operator type in the execution plan is HYBRID, the stream mode varies depending on the skew data. The following plan is an example:

    +
    EXPLAIN (nodes OFF, costs OFF) SELECT COUNT(*) FROM skew_scol s, skew_scol1 s1 WHERE s.b = s1.c;
    +QUERY PLAN
    +------------------------------------------------------------------------------------------------------------------------------------------------------------------
    +id |                                                                         operation
    +----+-----------------------------------------------------------------------------------------------------------------------------------------------------------
    +1 | ->  Aggregate
    +2 |    ->  Streaming (type: GATHER)
    +3 |       ->  Aggregate
    +4 |          ->  Hash Join (5,7)
    +5 |             ->  Streaming(type: HYBRID)
    +6 |                ->  Seq Scan on skew_scol s
    +7 |             ->  Hash
    +8 |                ->  Streaming(type: HYBRID)
    +9 |                   ->  Seq Scan on skew_scol1 s1
    +
    +Predicate Information (identified by plan id)
    +--------------------------------------------------------------------------------------------------------------------------------------------
    +4 --Hash Join (5,7)
    +Hash Cond: (s.b = s1.c)
    +Skew Join Optimized by Statistic
    +5 --Streaming(type: HYBRID)
    +Skew Filter: (b = 1)
    +Skew Filter: (b = 0)
    +8 --Streaming(type: HYBRID)
    +Skew Filter: (c = 0)
    +Skew Filter: (c = 1)
    +

    Data 1 has skew in the skew_scol table. Perform ROUNDROBIN on skew data and REDISTRIBUTE on non-skew data.

    +

    Data 0 is the side with no skew in the skew_scol table. Perform BROADCAST on skew data and REDISTRIBUTE on non-skew data.

    +

    As shown in the preceding figure, the two stream types are PART REDISTRIBUTE PART ROUNDROBIN and PART REDISTRIBUTE PART BROADCAST. In this example, the stream type is HYBRID.

    +
    • Aggregate optimization
    +

    For aggregation, data on each DN is deduplicated based on the GROUP BY key and then redistributed. After the deduplication on DNs, the global occurrences of each value will not be greater than the number of DNs. Therefore, no serious data skew will occur. Take the following query as an example:

    +
    1
    select c1, c2, c3, c4, c5, c6, c7, c8, c9, count(*) from t group by c1, c2, c3, c4, c5, c6, c7, c8, c9 limit 10;
    +
    + +
    +

    The command output is as follows:

    +
     id |                 operation                  |         A-time         |  A-rows  
    +----+--------------------------------------------+------------------------+----------
    +  1 | ->  Streaming (type: GATHER)               | 130621.783             |       12 
    +  2 |    ->  GroupAggregate                      | [85499.711,130432.341] |       12 
    +  3 |       ->  Sort                             | [85499.509,103145.632] | 36679237 
    +  4 |          ->  Streaming(type: REDISTRIBUTE) | [25668.897,85499.050]  | 36679237 
    +  5 |             ->  Seq Scan on public.t       | [9835.069,10416.388]   | 36679237 
    +
    +   4 --Streaming(type: REDISTRIBUTE)
    +         datanode1 (rows=36678837)
    +         datanode2 (rows=100)
    +         datanode3 (rows=100)
    +         datanode4 (rows=200)
    +

    A large amount of skew data exists. As a result, after data is redistributed based on its GROUP BY key, the data volume of datanode1 is hundreds of thousands of times that of others. After optimization, a GROUP BY operation is performed on the DN to deduplicate data. After redistribution, no data skew occurs.

    +
     id |                 operation                  |        A-time          
    +----+--------------------------------------------+-----------------------
    +  1 | ->  Streaming (type: GATHER)               | 10961.337             
    +  2 |    ->  HashAggregate                       | [10953.014,10953.705] 
    +  3 |       ->  HashAggregate                    | [10952.957,10953.632] 
    +  4 |          ->  Streaming(type: REDISTRIBUTE) | [10952.859,10953.502] 
    +  5 |             ->  HashAggregate              | [10084.280,10947.139] 
    +  6 |                ->  Seq Scan on public.t    | [4757.031,5201.168]   
    +
    + Predicate Information (identified by plan id) 
    +-----------------------------------------------
    +   3 --HashAggregate
    +         Skew Agg Optimized by Statistic
    +
    +   4 --Streaming(type: REDISTRIBUTE)
    +         datanode1 (rows=17)
    +         datanode2 (rows=8)
    +         datanode3 (rows=8)
    +         datanode4 (rows=14)
    +

    Applicable scope

    +
    • Join operator
      • nest loop, merge join, and hash join can be optimized.
      • If skew data is on the left to the join, inner join, left join, semi join, and anti join are supported. If skew data is on the right to the join, inner join, right join, right semi join, and right anti join are supported.
      • For an optimization plan generated based on statistics, the optimizer checks whether it is optimal by estimating its cost. Optimization plans based on hints or rules are forcibly generated.
      +
    • Aggregate operator
      • array_agg, string_agg, and subplan in agg qual cannot be optimized.
      • A plan generated based on statistics is affected by its cost, the plan_mode_seed parameter, and the best_agg_plan parameter. A plan generated based on hints or rules are not affected by them.
      +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0452.html b/docs/dws/dev/dws_04_0452.html new file mode 100644 index 00000000..14171a54 --- /dev/null +++ b/docs/dws/dev/dws_04_0452.html @@ -0,0 +1,28 @@ + + +

Experience in Rewriting SQL Statements

+
Based on the database SQL execution mechanism and a large number of practices, summarize finds that: using rules of a certain SQL statement, on the basis of the so that the correct test result, which can improve the SQL execution efficiency. You can comply with these rules to greatly improve service query efficiency.
  • Replacing UNION with UNION ALL

    UNION eliminates duplicate rows while merging two result sets but UNION ALL merges the two result sets without deduplication. Therefore, replace UNION with UNION ALL if you are sure that the two result sets do not contain duplicate rows based on the service logic.

    +
  • Adding NOT NULL to the join column

    If there are many NULL values in the JOIN columns, you can add the filter criterion IS NOT NULL to filter data in advance to improve the JOIN efficiency.

    +
  • Converting NOT IN to NOT EXISTS

    nestloop anti join must be used to implement NOT IN, and Hash anti join is required for NOT EXISTS. If no NULL value exists in the JOIN column, NOT IN is equivalent to NOT EXISTS. Therefore, if you are sure that no NULL value exists, you can convert NOT IN to NOT EXISTS to generate hash joins and to improve the query performance.

    +

    As shown in the following figure, the t2.d2 column does not contain null values (it is set to NOT NULL) and NOT EXISTS is used for the query.

    +
    1
    SELECT * FROM t1 WHERE  NOT EXISTS (SELECT * FROM t2 WHERE t1.c1=t2.d2);
    +
    + +
    +

    The generated execution plan is as follows:

    +
    Figure 1 NOT EXISTS execution plan

    +
    +
  • Use hashagg.

    If a plan involving groupAgg and SORT operations generated by the GROUP BY statement is poor in performance, you can set work_mem to a larger value to generate a hashagg plan, which does not require sorting and improves the performance.

    +
  • Replace functions with CASE statements

    The GaussDB(DWS) performance greatly deteriorates if a large number of functions are called. In this case, you can modify the pushdown functions to CASE statements.

    +
  • Do not use functions or expressions for indexes.

    Using functions or expressions for indexes stops indexing. Instead, it enables scanning on the full table.

    +
  • Do not use != or <> operators, NULL, OR, or implicit parameter conversion in WHERE clauses.
  • Split complex SQL statements.

    You can split an SQL statement into several ones and save the execution result to a temporary table if the SQL statement is too complex to be tuned using the solutions above, including but not limited to the following scenarios:

    +
    • The same subquery is involved in multiple SQL statements of a task and the subquery contains large amounts of data.
    • Incorrect Plan cost causes a small hash bucket of subquery. For example, the actual number of rows is 10 million, but only 1000 rows are in hash bucket.
    • Functions such as substr and to_number cause incorrect measures for subqueries containing large amounts of data.
    • BROADCAST subqueries are performed on large tables in multi-DN environment.
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0453.html b/docs/dws/dev/dws_04_0453.html new file mode 100644 index 00000000..f9a119f0 --- /dev/null +++ b/docs/dws/dev/dws_04_0453.html @@ -0,0 +1,101 @@ + + +

Adjusting Key Parameters During SQL Tuning

+

This section describes the key CN parameters that affect GaussDB(DWS) SQL tuning performance. For details about how to configure these parameters, see Configuring GUC Parameters.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 CN parameters

Parameter/Reference Value

+

Description

+

enable_nestloop=on

+

Specifies how the optimizer uses Nest Loop Join. If this parameter is set to on, the optimizer preferentially uses Nest Loop Join. If it is set to off, the optimizer preferentially uses other methods, if any.

+
NOTE:

To temporarily change the value of this parameter in the current database connection (that is, the current session), run the following SQL statement:

+
1
SET enable_nestloop to off;
+
+ +
+
+

By default, this parameter is set to on. Change the value as required. Generally, nested loop join has the poorest performance among the three JOIN methods (nested loop join, merge join, and hash join). You are advised to set this parameter to off.

+

enable_bitmapscan=on

+

Specifies whether the optimizer uses bitmap scanning. If the value is on, bitmap scanning is used. If the value is off, it is not used.

+
NOTE:

If you only want to temporarily change the value of this parameter during the current database connection (that is, the current session), run the following SQL statements:

+
1
SET enable_bitmapscan to off;
+
+ +
+
+

The bitmap scanning applies only in the query condition where a > 1 and b > 1 and indexes are created on columns a and b. During performance tuning, if the query performance is poor and bitmapscan operators are in the execution plan, set this parameter to off and check whether the performance is improved.

+

enable_fast_query_shipping=on

+

Specifies whether the optimizer uses a distribution framework. If the value is on, the execution plan is generated on both CNs and DNs. If the value is off, the distribution framework is used, that is, the execution plan is generated on the CNs and then sent to DNs for execution.

+
NOTE:

To temporarily change the value of this parameter in the current database connection (that is, the current session), run the following SQL statement:

+
1
SET enable_fast_query_shipping to off;
+
+ +
+
+

enable_hashagg=on

+

Specifies whether to enable the optimizer's use of Hash-aggregation plan types.

+

enable_hashjoin=on

+

Specifies whether to enable the optimizer's use of Hash-join plan types.

+

enable_mergejoin=on

+

Specifies whether to enable the optimizer's use of Hash-merge plan types.

+

enable_indexscan=on

+

Specifies whether to enable the optimizer's use of index-scan plan types.

+

enable_indexonlyscan=on

+

Specifies whether to enable the optimizer's use of index-only-scan plan types.

+

enable_seqscan=on

+

Specifies whether the optimizer uses bitmap scanning. It is impossible to suppress sequential scans entirely, but setting this variable to off allows the optimizer to preferentially choose other methods if available.

+

enable_sort=on

+

Specifies the optimizer sorts. It is impossible to fully suppress explicit sorts, but setting this variable to off allows the optimizer to preferentially choose other methods if available.

+

enable_broadcast=on

+

Specifies whether enable the optimizer's use of data broadcast. In data broadcast, a large amount of data is transferred on the network. When the number of transmission nodes (stream) is large and the estimation is inaccurate, set this parameter to off and check whether the performance is improved.

+

rewrite_rule

+

Specifies whether the optimizer enables the LAZY_AGG and MAGIC_SET rewriting rules.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0454.html b/docs/dws/dev/dws_04_0454.html new file mode 100644 index 00000000..34bd511d --- /dev/null +++ b/docs/dws/dev/dws_04_0454.html @@ -0,0 +1,35 @@ + + +

Hint-based Tuning

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0455.html b/docs/dws/dev/dws_04_0455.html new file mode 100644 index 00000000..eed63720 --- /dev/null +++ b/docs/dws/dev/dws_04_0455.html @@ -0,0 +1,115 @@ + + +

Plan Hint Optimization

+

In plan hints, you can specify a join order, join, stream, and scan operations, the number of rows in a result, and redistribution skew information to tune an execution plan, improving query performance.

+

Function

The hint syntax must follow immediately after a SELECT keyword and is written in the following format:

+
1
/*+ <plan hint>*/
+
+ +
+

You can specify multiple hints for a query plan and separate them by spaces. A hint specified for a query plan does not apply to its subquery plans. To specify a hint for a subquery, add the hint following the SELECT of this subquery.

+
+

For example:

+
1
select /*+ <plan_hint1> <plan_hint2> */ * from t1, (select /*+ <plan_hint3> */ from t2) where 1=1;
+
+ +
+

In the preceding command, <plan_hint1> and <plan_hint2> are the hints of a query, and <plan_hint3> is the hint of its subquery.

+

If a hint is specified in the CREATE VIEW statement, the hint will be applied each time this view is used.

+

If the random plan function is enabled (plan_mode_seed is set to a value other than 0), the specified hint will not be used.

+
+

Supported Hints

Currently, the following hints are supported:

+
+
  • Join order hints (leading)
  • Join operation hints, excluding the semi join, anti join, and unique plan hints
  • Rows hints
  • Stream operation hints
  • Scan operation hints, supporting only tablescan, indexscan, and indexonlyscan
  • Sublink name hints
  • Skew hints, supporting only the skew in the redistribution involving Join or HashAgg
  • Configuration parameter hints, supporting the parameters described in Configuration Parameter Hints
+

Precautions

  • Hints do not support Agg, Sort, Setop, or Subplan.
  • Hints do not support SMP or Node Groups.
+
+

Examples

The following is the original plan and is used for comparing with the optimized ones:

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
explain
+select i_product_name product_name
+,i_item_sk item_sk
+,s_store_name store_name
+,s_zip store_zip
+,ad2.ca_street_number c_street_number
+,ad2.ca_street_name c_street_name
+,ad2.ca_city c_city
+,ad2.ca_zip c_zip
+,count(*) cnt
+,sum(ss_wholesale_cost) s1
+,sum(ss_list_price) s2
+,sum(ss_coupon_amt) s3
+FROM   store_sales
+,store_returns
+,store
+,customer
+,promotion
+,customer_address ad2
+,item
+WHERE  ss_store_sk = s_store_sk AND
+ss_customer_sk = c_customer_sk AND
+ss_item_sk = i_item_sk and
+ss_item_sk = sr_item_sk and
+ss_ticket_number = sr_ticket_number and
+c_current_addr_sk = ad2.ca_address_sk and
+ss_promo_sk = p_promo_sk and
+i_color in ('maroon','burnished','dim','steel','navajo','chocolate') and
+i_current_price between 35 and 35 + 10 and
+i_current_price between 35 + 1 and 35 + 15
+group by i_product_name
+,i_item_sk
+,s_store_name
+,s_zip
+,ad2.ca_street_number
+,ad2.ca_street_name
+,ad2.ca_city
+,ad2.ca_zip
+;
+
+ +
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0456.html b/docs/dws/dev/dws_04_0456.html new file mode 100644 index 00000000..0ef2f8cf --- /dev/null +++ b/docs/dws/dev/dws_04_0456.html @@ -0,0 +1,47 @@ + + +

Join Order Hints

+

Function

Theses hints specify the join order and outer/inner tables.

+
+

Syntax

  • Specify only the join order.
+
1
leading(join_table_list) 
+
+ +
+
  • Specify the join order and outer/inner tables. The outer/inner tables are specified by the outermost parentheses.
+
1
leading((join_table_list)) 
+
+ +
+
+

Parameter Description

join_table_list specifies the tables to be joined. The values can be table names or table aliases. If a subquery is pulled up, the value can also be the subquery alias. Separate the values with spaces. You can add parentheses to specify the join priorities of tables.

+

A table name or alias can only be a string without a schema name.

+

An alias (if any) is used to represent a table.

+
+
+

To prevent semantic errors, tables in the list must meet the following requirements:

+
  • The tables must exist in the query or its subquery to be pulled up.
  • The table names must be unique in the query or subquery to be pulled up. If they are not, their aliases must be unique.
  • A table appears only once in the list.
  • An alias (if any) is used to represent a table.
+

For example:

+

leading(t1 t2 t3 t4 t5): t1, t2, t3, t4, and t5 are joined. The join order and outer/inner tables are not specified.

+

leading(t1 t2 t3 t4 t5): t1, t2, t3, t4, and t5 are joined in sequence. The table on the right is used as the inner table in each join.

+

leading(t1 (t2 t3 t4) t5): First, t2, t3, and t4 are joined and the outer/inner tables are not specified. Then, the result is joined with t1 and t5, and the outer/inner tables are not specified.

+

leading(t1 (t2 t3 t4) t5): First, t2, t3, and t4 are joined and the outer/inner tables are not specified. Then, the result is joined with t1, and (t2 t3 t4) is used as the inner table. Finally, the result is joined with t5, and t5 is used as the inner table.

+

leading((t1 (t2 t3) t4 t5)) leading((t3 t2)): First, t2 and t3 are joined and t2 is used as the inner table. Then, the result is joined with t1, and (t2 t3) is used as the inner table. Finally, the result is joined with t4 and then t5, and the table on the right in each join is used as the inner table.

+

Examples

Hint the query plan in Examples as follows:

+
+
1
+2
explain
+select /*+ leading((((((store_sales store) promotion) item) customer) ad2) store_returns) leading((store store_sales))*/ i_product_name product_name ...
+
+ +
+

First, store_sales and store are joined and store_sales is the inner table. Then, The result is joined with promotion, item, customer, ad2, and store_returns in sequence. The optimized plan is as follows:

+

+

For details about the warning at the top of the plan, see Hint Errors, Conflicts, and Other Warnings.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0457.html b/docs/dws/dev/dws_04_0457.html new file mode 100644 index 00000000..224773d5 --- /dev/null +++ b/docs/dws/dev/dws_04_0457.html @@ -0,0 +1,32 @@ + + +

Join Operation Hints

+

Function

Specifies the join method. It can be nested loop join, hash join, or merge join.

+
+

Syntax

1
[no] nestloop|hashjoin|mergejoin(table_list)
+
+ +
+
+

Parameter Description

  • no indicates that the specified hint will not be used for a join.
+
+
  • table_list specifies the tables to be joined. The values are the same as those of join_table_list but contain no parentheses.
+

For example:

+

no nestloop(t1 t2 t3): nestloop is not used for joining t1, t2, and t3. The three tables may be joined in either of the two ways: Join t2 and t3, and then t1; join t1 and t2, and then t3. This hint takes effect only for the last join. If necessary, you can hint other joins. For example, you can add no nestloop(t2 t3) to join t2 and t3 first and to forbid the use of nestloop.

+

Examples

Hint the query plan in Examples as follows:

+
+
1
+2
explain
+select /*+ nestloop(store_sales store_returns item) */ i_product_name product_name ...
+
+ +
+

nestloop is used for the last join between store_sales, store_returns, and item. The optimized plan is as follows:

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0458.html b/docs/dws/dev/dws_04_0458.html new file mode 100644 index 00000000..d5d736d1 --- /dev/null +++ b/docs/dws/dev/dws_04_0458.html @@ -0,0 +1,36 @@ + + +

Rows Hints

+

Function

These hints specify the number of rows in an intermediate result set. Both absolute values and relative values are supported.

+
+

Syntax

1
rows(table_list #|+|-|* const)
+
+ +
+
+

Parameter Description

  • #,+,-, and * are operators used for hinting the estimation. # indicates that the original estimation is used without any calculation. +,-, and * indicate that the original estimation is calculated using these operators. The minimum calculation result is 1. table_list specifies the tables to be joined. The values are the same as those of table_list in Join Operation Hints.
+
+
  • const can be any non-negative number and supports scientific notation.
+

For example:

+

rows(t1 #5): The result set of t1 is five rows.

+

rows(t1 t2 t3 *1000): Multiply the result set of joined t1, t2, and t3 by 1000.

+

Suggestion

  • The hint using * for two tables is recommended, because this hint will take effect for a join as long as the two tables appear on both sides of this join. For example, if the hint is rows(t1 t2 * 3), the join result of (t1 t3 t4) and (t2 t5 t6) will be multiplied by 3 because t1 and t2 appear on both sides of the join.
  • rows hints can be specified for the result sets of a single table, multiple tables, function tables, and subquery scan tables.
+
+

Examples

Hint the query plan in Examples as follows:

+
+
1
+2
explain
+select /*+ rows(store_sales store_returns *50) */ i_product_name product_name ...
+
+ +
+

Multiply the result set of joined store_sales and store_returns by 50. The optimized plan is as follows:

+

+

The estimation value after the hint in row 11 is 360, and the original value is rounded off to 7.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0459.html b/docs/dws/dev/dws_04_0459.html new file mode 100644 index 00000000..36decf9b --- /dev/null +++ b/docs/dws/dev/dws_04_0459.html @@ -0,0 +1,30 @@ + + +

Stream Operation Hints

+

Function

These hints specify a stream operation, which can be broadcast or redistribute.

+
+

Syntax

1
[no] broadcast|redistribute(table_list)
+
+ +
+
+

Parameter Description

  • no indicates that the specified hint will not be used for a join.
+
+ +

Examples

Hint the query plan in Examples as follows:

+
+
1
+2
explain
+select /*+ no redistribute(store_sales store_returns item store) leading(((store_sales store_returns item store) customer)) */ i_product_name product_name ...
+
+ +
+

In the original plan, the join result of store_sales, store_returns, item, and store is redistributed before it is joined with customer. After the hinting, the redistribution is disabled and the join order is retained. The optimized plan is as follows:

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0460.html b/docs/dws/dev/dws_04_0460.html new file mode 100644 index 00000000..9b93a976 --- /dev/null +++ b/docs/dws/dev/dws_04_0460.html @@ -0,0 +1,38 @@ + + +

Scan Operation Hints

+

Function

These hints specify a scan operation, which can be tablescan, indexscan, or indexonlyscan.

+
+

Syntax

1
[no] tablescan|indexscan|indexonlyscan(table [index])
+
+ +
+
+

Parameter Description

  • no indicates that the specified hint will not be used for a join.
+
+
  • table specifies the table to be scanned. You can specify only one table. Use a table alias (if any) instead of a table name.
  • index indicates the index for indexscan or indexonlyscan. You can specify only one index.
+

indexscan and indexonlyscan hints can be used only when the specified index belongs to the table.

+

Scan operation hints can be used for row-store tables, column-store tables, HDFS tables, HDFS foreign tables, OBS tables, and subquery tables. HDFS tables include primary tables and delta tables. The delta tables are invisible to users. Therefore, scan operation hints are used only for primary tables.

+
+

Examples

To specify an index-based hint for a scan, create an index named i on the i_item_sk column of the item table.

+
1
create index i on item(i_item_sk);
+
+ +
+
+

Hint the query plan in Examples as follows:

+
1
+2
explain
+select /*+ indexscan(item i) */ i_product_name product_name ...
+
+ +
+

item is scanned based on an index. The optimized plan is as follows:

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0461.html b/docs/dws/dev/dws_04_0461.html new file mode 100644 index 00000000..6afcb593 --- /dev/null +++ b/docs/dws/dev/dws_04_0461.html @@ -0,0 +1,29 @@ + + +

Sublink Name Hints

+

Function

These hints specify the name of a sublink block.

+
+

Syntax

1
blockname (table)
+
+ +
+
+

Parameter Description

  • table indicates the name you have specified for a sublink block.
+
+
  • This hint is used by an outer query only when a sublink is pulled up. Currently, only the Agg equivalent join, IN, and EXISTS sublinks can be pulled up. This hint is usually used together with the hints described in the previous sections.
+
  • The subquery after the FROM keyword is hinted by using the subquery alias. In this case, blockname becomes invalid.
  • If a sublink contains multiple tables, the tables will be joined with the outer-query tables in a random sequence after the sublink is pulled up. In this case, blockname also becomes invalid.
+
+

Examples

1
explain select /*+nestloop(store_sales tt) */ * from store_sales where ss_item_sk in (select /*+blockname(tt)*/ i_item_sk from item group by 1);
+
+ +
+
+

tt indicates the sublink block name. After being pulled up, the sublink is joined with the outer-query table store_sales by using nestloop. The optimized plan is as follows:

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0462.html b/docs/dws/dev/dws_04_0462.html new file mode 100644 index 00000000..961b880f --- /dev/null +++ b/docs/dws/dev/dws_04_0462.html @@ -0,0 +1,200 @@ + + +

Skew Hints

+

Function

Theses hints specify redistribution keys containing skew data and skew values, and are used to optimize redistribution involving Join or HashAgg.

+
+

Syntax

  • Specify single-table skew.
    1
    skew(table (column) [(value)])
    +
    + +
    +
  • Specify intermediate result skew.
    1
    skew((join_rel) (column) [(value)])
    +
    + +
    +
+
+

Parameter Description

  • table specifies the table where skew occurs.
  • join_rel specifies two or more joined tables. For example, (t1 t2) indicates that the result of joining t1 and t2 tables contains skew data.
  • column specifies one or more columns where skew occurs.
  • value specifies one or more skew values.
+
+
  • Skew hints are used only if redistribution is required and the specified skew information matches the redistribution information.
  • Skew hints are controlled by the GUC parameter skew_option. If the parameter is disabled, skew hints cannot be used for solving skew.
  • Currently, skew hints support only the table relationships of the ordinary table and subquery types. Hints can be specified for base tables, subqueries, and WITH ... AS clauses. Unlike other hints, a subquery can be used in skew hints regardless of whether it is pulled up.
  • Use an alias (if any) to specify a table where data skew occurs.
+
  • You can use a name or an alias to specify a skew column as long as it is not ambiguous. The columns in skew hints cannot be expressions. If data skew occurs in the redistribution that uses an expression as a redistribution key, set the redistribution key as a new column and specify the column in skew hints.
  • The number of skew values must be an integer multiple of the number of columns. Skew values must be grouped based on the column sequence, with each group containing a maximum of 10 values. You can specify duplicate values to group skew columns having different number of skew values. For example, the c1 and c2 columns of the t1 table contains skew data. The skew value of the c1 column is a1, and the skew values of the c2 column are b1 and b2. In this case, the skew hint is skew(t1 (c1 c2) ((a1 b1)(a1 b2))). (a1 b1) is a value group, where NULL is allowed as a skew value. Each hint can contain a maximum of 10 groups and the number of groups should be an integer multiple of the number of columns.
  • In the redistribution optimization of Join, a skew value must be specified for skew hints. The skew value can be left empty for HashAgg.
  • If multiple tables, columns, or values are specified, separate items of the same type with spaces.
  • The type of skew values cannot be forcibly converted in hints. To specify a string, enclose it with single quotation marks (' ').
+
+

Example:

+
  • Specify single-table skew.

    Each skew hint describes the skew information of one table relationship. To describe the skews of multiple table relationships in a query, specify multiple skew hints.

    +

    Skew hints have the following formats:

    +
    • One skew value in one column: skew(t (c1) (v1))

      Description: The v1 value in the c1 column of the t table relationship causes skew in query execution.

      +
    • Multiple skew values in one column: skew(t (c1) (v1 v2 v3 ...))

      Description: Values including v1, v2, and v3 in the c1 column of the t table relationship cause skew in query execution.

      +
    • Multiple columns, each having one skew value: skew(t (c1 c2) (v1 v2))

      Description: The v1 value in the c1 column and the v2 value in the c2 column of the t table relationship cause skew in query execution.

      +
    • Multiple columns, each having multiple skew values: skew(t (c1 c2) ((v1 v2) (v3 v4) (v5 v6) ...))

      Description: Values including v1, v3, and v5 in the c1 column and values including v2, v4, and v6 in the c2 column of the t table relationship cause skew in query execution.

      +

      In the last format, parentheses for skew value groups can be omitted, for example, skew(t (c1 c2) (v1 v2 v3 v4 v5 v6 ...)). In a skew hint, either use parentheses for all skew value groups or for none of them.

      +

      Otherwise, a syntax error will be generated. For example, skew(t (c1 c2) (v1 v2 v3 v4 (v5 v6) ...)) will generate an error.

      +
      +
    +
+
  • Specify intermediate result skew.

    If data skew does not occur in base tables but in an intermediate result during query execution, specify skew hints of the intermediate result to solve the skew. The format is skew((t1 t2) (c1) (v1)).

    +

    Description: Data skew occurs after the table relationships t1 and t2 are joined. The c1 column of the t1 table contains skew data and its skew value is v1.

    +

    c1 can exist only in a table relationship of join_rel. If there is another column having the same name, use aliases to avoid ambiguity.

    +
+

Suggestion

  • For a multi-level query, write the hint on the layer where data skew occurs.
  • For a listed subquery, you can specify the subquery name in a hint. If you know data skew occurs on which base table, directly specify the table.
  • Aliases are preferred when you specify a table or column in a hint.
+
+

Examples

Specify single-table skew.

+
  • Specify hints in the original query.

    For example, the original query is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    explain
    +with customer_total_return as
    +(select sr_customer_sk as ctr_customer_sk
    +,sr_store_sk as ctr_store_sk
    +,sum(SR_FEE) as ctr_total_return
    +from store_returns
    +,date_dim
    +where sr_returned_date_sk = d_date_sk
    +and d_year =2000
    +group by sr_customer_sk
    +,sr_store_sk)
    + select  c_customer_id
    +from customer_total_return ctr1
    +,store
    +,customer
    +where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2
    +from customer_total_return ctr2
    +where ctr1.ctr_store_sk = ctr2.ctr_store_sk)
    +and s_store_sk = ctr1.ctr_store_sk
    +and s_state = 'NM'
    +and ctr1.ctr_customer_sk = c_customer_sk
    +order by c_customer_id
    +limit 100;
    +
    + +
    +

    +

    Specify the hints of HashAgg in the inner with clause and of the outer Hash Join. The query containing hints is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    explain
    +with customer_total_return as
    +(select /*+ skew(store_returns(sr_store_sk sr_customer_sk)) */sr_customer_sk as ctr_customer_sk
    +,sr_store_sk as ctr_store_sk
    +,sum(SR_FEE) as ctr_total_return
    +from store_returns
    +,date_dim
    +where sr_returned_date_sk = d_date_sk
    +and d_year =2000
    +group by sr_customer_sk
    +,sr_store_sk)
    + select  /*+ skew(ctr1(ctr_customer_sk)(11))*/  c_customer_id
    +from customer_total_return ctr1
    +,store
    +,customer
    +where ctr1.ctr_total_return > (select avg(ctr_total_return)*1.2
    +from customer_total_return ctr2
    +where ctr1.ctr_store_sk = ctr2.ctr_store_sk)
    +and s_store_sk = ctr1.ctr_store_sk
    +and s_state = 'NM'
    +and ctr1.ctr_customer_sk = c_customer_sk
    +order by c_customer_id
    +limit 100;
    +
    + +
    +

    The hints indicate that the group by in the inner with clause contains skew data during redistribution by HashAgg, corresponding to the original Hash Agg operators 10 and 21; and that the ctr_customer_sk column in the outer ctr1 table contains skew data during redistribution by Hash Join, corresponding to operator 6 in the original plan. The optimized plan is as follows:

    +

    +

    To solve data skew in the redistribution, Hash Agg is changed to double-level Agg operators and the redistribution operators used by Hash Join are changed in the optimized plan.

    +
+
+
  • Modify the query and then specify hints.

    For example, the original query and its plan are as follows:

    +
    1
    explain select count(*) from store_sales_1 group by round(ss_list_price);
    +
    + +
    +

    +

    Columns in hints do not support expressions. To specify hints, rewrite the query as several subqueries. The rewritten query and its plan are as follows:

    +
    1
    +2
    +3
    +4
    +5
    explain 
    +select count(*) 
    +from (select round(ss_list_price),ss_hdemo_sk
    +from store_sales_1)tmp(a,ss_hdemo_sk)                      
    +group by a;
    +
    + +
    +

    +

    Ensure that the service logic is not changed during the rewriting.

    +

    Specify hints in the rewritten query as follows:

    +
    1
    +2
    +3
    +4
    +5
    explain 
    +select /*+ skew(tmp(a)) */ count(*) 
    +from (select round(ss_list_price),ss_hdemo_sk
    +from store_sales_1)tmp(a,ss_hdemo_sk)                      
    +group by a;
    +
    + +
    +

    +

    The plan shows that after Hash Agg is changed to double-layer Agg operators, redistributed data is greatly reduced and redistribution time shortened.

    +

    You can specify hints in columns in a subquery, for example:

    +
    1
    +2
    +3
    +4
    +5
    explain 
    +select /*+ skew(tmp(b)) */ count(*) 
    +from (select round(ss_list_price) b,ss_hdemo_sk
    +from store_sales_1)tmp(a,ss_hdemo_sk)                      
    +group by a;
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0463.html b/docs/dws/dev/dws_04_0463.html new file mode 100644 index 00000000..6d4477b6 --- /dev/null +++ b/docs/dws/dev/dws_04_0463.html @@ -0,0 +1,27 @@ + + +

Configuration Parameter Hints

+

Function

A hint, or a GUC hint, specifies a configuration parameter value when a plan is generated. Currently, only the following parameters are supported:

+
+
  • agg_redistribute_enhancement
  • best_agg_plan
  • enable_fast_query_shipping
  • enable_hashagg
  • enable_hashjoin
  • enable_indexscan
  • enable_nestloop
  • enable_nodegroup_debug
  • expected_computing_nodegroup
  • qrw_inlist2join_optmode
  • query_dop
  • rewrite_rule
  • skew_option
+

Syntax

set [global](guc_name guc_value)
+
+

Parameters

  • global indicates that the parameter set by hint takes effect at the statement level. If global is not specified, the parameter takes effect only in the subquery where the hint is located.
  • guc_name indicates the name of the configuration parameter specified by hint.
+
  • guc_value indicates the value of a configuration parameter specified by hint.
+
  • If a parameter set by hint takes effect at the statement level, the hint must be written to the top-level query instead of the subquery. For UNION, INTERSECT, EXCEPT, and MINUS statements, you can write the GUC hint at the statement level to any SELECT clause that participates in the set operation. The configuration parameters set by the GUC hint take effect on each SELECT clause that participates in the set operation.
  • When a subquery is pulled up, all GUC hints on the subquery are discarded.
  • The enable_fast_query_shipping, enable_nodegroup_debug, expected_computing_nodegroup, query_dop, and rewrite_rule parameters can be set only at the statement level.
  • If a parameter is set by both the statement-level GUC hint and the subquery-level GUC hint, the subquery-level GUC hint takes effect in the corresponding subquery, and the statement-level GUC hint takes effect in other subqueries of the statement.
+
+
+

Example

Hint the query plan in Examples as follows:

+
explain
+select /*+ set global(query_dop 0) */ i_product_name product_name
+...
+

This hint indicates that the query_dop parameter is set to 0 when the plan for a statement is generated, which means the SMP adaptation function is enabled. The generated plan is as follows:

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0464.html b/docs/dws/dev/dws_04_0464.html new file mode 100644 index 00000000..128799c6 --- /dev/null +++ b/docs/dws/dev/dws_04_0464.html @@ -0,0 +1,33 @@ + + +

Hint Errors, Conflicts, and Other Warnings

+

Plan hints change an execution plan. You can run EXPLAIN to view the changes.

+

Hints containing errors are invalid and do not affect statement execution. The errors will be displayed in different ways based on statement types. Hint errors in an EXPLAIN statement are displayed as a warning on the interface. Hint errors in other statements will be recorded in debug1-level logs containing the PLANHINT keyword.

+

Hint Error Types

  • Syntax errors.

    An error will be reported if the syntax tree fails to be reduced. The No. of the row generating an error is displayed in the error details.

    +

    For example, the hint keyword is incorrect, no table or only one table is specified in the leading or join hint, or no tables are specified in other hints. The parsing of a hint is terminated immediately after a syntax error is detected. Only the hints that have been parsed successfully are valid.

    +

    For example:

    +
    1
    leading((t1 t2)) nestloop(t1) rows(t1 t2 #10)
    +
    + +
    +

    The syntax of nestloop(t1) is wrong and its parsing is terminated. Only leading(t1 t2) that has been successfully parsed before nestloop(t1) is valid.

    +
  • Semantic errors.
    • An error will be reported if the specified tables do not exist, multiple tables are found based on the hint setting, or a table is used more than once in the leading or join hint.
    • An error will be reported if the index specified in a scan hint does not exist.
    • If multiple tables with the same name exist after a subquery is pulled up and some of them need to be hinted, add aliases for them to avoid name duplication.
    +
  • Duplicated or conflicted hints.

    If hint duplication or conflicts occur, only the first hint takes effect. A message will be displayed to describe the situation.

    +
    • Hint duplication indicates that a hint is used more than once in the same query, for example, nestloop(t1 t2) nestloop(t1 t2).
    • A hint conflict indicates that the functions of two hints with the same table list conflict with each other.
      For example, if nestloop (t1 t2) hashjoin (t1 t2) is used, hashjoin (t1 t2) becomes invalid. nestloop(t1 t2) does not conflict with no mergejoin(t1 t2).

      The table list in the leading hint is disassembled. For example, leading (t1 t2 t3) will be disassembled as leading(t1 t2) leading((t1 t2) t3), which will conflict with leading(t2 t1) (if any). In this case, the latter leading(t2 t1) becomes invalid. If two hints use duplicated table lists and only one of them has the specified outer/inner table, the one without a specified outer/inner table becomes invalid.

      +
      +
      +
    +
  • A hint becomes invalid after a sublink is pulled up.

    In this case, a message will be displayed. Generally, such invalidation occurs if a sublink contains multiple tables to be joined, because the table list in the sublink becomes invalid after the sublink is pulled up.

    +
  • Unsupported column types.
    • Skew hints are specified to optimize redistribution. They will be invalid if their corresponding columns do not support redistribution.
    +
  • Specified hints are not used.
    • If hashjoin or mergejoin is specified for non-equivalent joins, it will not be used.
    • If indexscan or indexonlyscan is specified for a table that does not have an index, it will not be used.
    • If indexscan hint or indexonlyscan is specified for a full-table scan or for a scan whose filtering conditions are not set on index columns, it will not be used.
    • The specified indexonlyscan hint is used only when the output column contains only indexes.
    • In equivalent joins, only the joins containing equivalence conditions are valid. Therefore, the leading, join, and rows hints specified for the joins without an equivalence condition will not be used. For example, t1, t2, and t3 are to be joined, and the join between t1 and t3 does not contain an equivalence condition. In this case, leading(t1 t3) will not be used.
    • To generate a streaming plan, if the distribution key of a table is the same as its join key, redistribute specified for this table will not be used. If the distribution key and join key are different for this table but the same for the other table in the join, redistribute specified for this table will be used but broadcast will not.
    • If no sublink is pulled up, the specified blockname hint will not be used.
    • Skew hints are not used possibly because:
      • The plan does not require redistribution.
      • The columns specified by hints contain distribution keys.
      • Skew information specified in hints is incorrect or incomplete, for example, no value is specified for join optimization.
      • Skew optimization is disabled by GUC parameters.
      +
    • GUC hints are not used possibly because:
      • The configuration parameter does not exist.
      • The configuration parameter is not supported by GUC hints.
      • The configuration parameter value is invalid.
      • The statement-level GUC hint is not written in the top-level query.
      • The configuration parameter set by the GUC hint at the subquery level cannot be set at the subquery level.
      • The subquery where the GUC hint is located is pulled up.
      +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0465.html b/docs/dws/dev/dws_04_0465.html new file mode 100644 index 00000000..9fb8a1a4 --- /dev/null +++ b/docs/dws/dev/dws_04_0465.html @@ -0,0 +1,148 @@ + + +

Plan Hint Cases

+

This section takes the statements in TPC-DS (Q24) as an example to describe how to optimize an execution plan by using hints in 1000X+24DN environments. For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
select avg(netpaid) from
+(select c_last_name
+,c_first_name
+,s_store_name
+,ca_state
+,s_state
+,i_color
+,i_current_price
+,i_manager_id
+,i_units
+,i_size
+,sum(ss_sales_price) netpaid
+from store_sales
+,store_returns
+,store
+,item
+,customer
+,customer_address
+where ss_ticket_number = sr_ticket_number
+and ss_item_sk = sr_item_sk
+and ss_customer_sk = c_customer_sk
+and ss_item_sk = i_item_sk
+and ss_store_sk = s_store_sk
+and c_birth_country = upper(ca_country)
+and s_zip = ca_zip
+and s_market_id=7
+group by c_last_name
+,c_first_name
+,s_store_name
+,ca_state
+,s_state
+,i_color
+,i_current_price
+,i_manager_id
+,i_units
+,i_size);
+
+ +
+
  1. The original plan of this statement is as follows and the statement execution takes 110s:
+

+

In this plan, the performance of the layer-10 broadcast is poor because the estimation result generated at layer 11 is 2140 rows, which is much less than the actual number of rows. The inaccurate estimation is mainly caused by the underestimated number of rows in layer-13 hash join. In this layer, store_sales and store_returns are joined (based on the ss_ticket_number and ss_item_sk columns in store_sales and the sr_ticket_number and sr_item_sk columns in store_returns) but the multi-column correlation is not considered.

+

2. After the rows hint is used for optimization, the plan is as follows and the statement execution takes 318s:

+
1
+2
select avg(netpaid) from
+(select /*+rows(store_sales store_returns * 11270)*/ c_last_name ...
+
+ +
+

+

The execution takes a longer time because layer-9 redistribute is slow. Considering that data skew does not occur at layer-9 redistribute, the slow redistribution is caused by the slow layer-8 hashjoin due to data skew at layer-18 redistribute.

+

3. Data skew occurs at layer-18 redistribute because customer_address has a few different values in its two join keys. Therefore, plan customer_address as the last one to be joined. After the hint is used for optimization, the plan is as follows and the statement execution takes 116s:

+
1
+2
+3
+4
select avg(netpaid) from
+(select /*+rows(store_sales store_returns *11270)
+leading((store_sales store_returns store item customer) customer_address)*/
+c_last_name ...
+
+ +
+

+

Most of the time is spent on layer-6 redistribute. The plan needs to be further optimized.

+

4. Most of the time is spent on layer-6 redistribute because of data skew. To avoid the data skew, plan the item table as the last one to be joined because the number of rows is not reduced after item is joined. After the hint is used for optimization, the plan is as follows and the statement execution takes 120s:

+
1
+2
+3
+4
select avg(netpaid) from
+(select /*+rows(store_sales store_returns *11270)
+leading((customer_address (store_sales store_returns store customer) item))
+c_last_name ...
+
+ +
+

+

Data skew occurs after the join of item and customer_address because item is broadcasted at layer-22. As a result, layer-6 redistribute is still slow.

+

5. Add a hint to disable broadcast for item or add a redistribute hint for the join result of item and customer_address. After the hint is used for optimization, the plan is as follows and the statement execution takes 105s:

+
1
+2
+3
+4
+5
select avg(netpaid) from
+(select /*+rows(store_sales store_returns *11270)
+leading((customer_address (store_sales store_returns store customer) item))
+no broadcast(item)*/
+c_last_name ...
+
+ +
+

+

6. The last layer uses single-layer Agg and the number of rows is greatly reduced. Set best_agg_plan to 3 and change the single-layer Agg to a double-layer Agg. The plan is as follows and the statement execution takes 94s. The optimization ends.

+

+

+

If the query performance deteriorates due to statistics changes, you can use hints to optimize the query plan. Take TPCH-Q17 as an example. The query performance deteriorates after the value of default_statistics_target is changed from the default one to –2 for statistics collection.

+

1. If default_statistics_target is set to the default value 100, the plan is as follows:

+

+

2. If default_statistics_target is set to –2, the plan is as follows:

+

+

3. After the analysis, the cause is that the stream type is changed from BroadCast to Redistribute during the join of the lineitem and part tables. You can use a hint to change the stream type back to BroadCast. For example:

+

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0466.html b/docs/dws/dev/dws_04_0466.html new file mode 100644 index 00000000..a93ebc9c --- /dev/null +++ b/docs/dws/dev/dws_04_0466.html @@ -0,0 +1,51 @@ + + + +

Routinely Maintaining Tables

+ +

To ensure proper database running, after INSERT and DELETE operations, you need to routinely do VACUUM FULL and ANALYZE as appropriate for customer scenarios and update statistics to obtain better performance.

+

Related Concepts

You need to routinely run VACUUM, VACUUM FULL, and ANALYZE to maintain tables, because:

+
  • VACUUM FULL reclaims disk space occupied by updated or deleted data and combines small-size data files.
  • VACUUM maintains a visualized mapping to track pages that contain arrays visible to other active transactions. A common index scan uses the mapping to obtain the corresponding array and check whether pages are visible to the current transaction. If the array cannot be obtained, the visibility is checked by fetching stack arrays. Therefore, updating the visible mapping of a table can accelerate unique index scans.
  • VACUUM can avoid old data loss caused by duplicate transaction IDs when the number of executed transactions exceeds the database threshold.
  • ANALYZE collects statistics on tables in databases. The statistics are stored in the PG_STATISTIC system catalog. Then, the query optimizer uses the statistics to work out the most efficient execution plan.
+
+

Procedure

  1. Run the VACUUM or VACUUM FULL command to reclaim disk space.

    • VACUUM:
      Do VACUUM to the table:
      VACUUM customer;
      +
      VACUUM
      +
      +

      This command can be concurrently executed with database operation commands, including SELECT, INSERT, UPDATE, and DELETE; excluding ALTER TABLE.

      +

      Do VACUUM to the partitioned table:

      +
      VACUUM customer_par PARTITION ( P1 );
      +
      VACUUM
      +
    • VACUUM FULL:
      VACUUM FULL customer;
      +
      VACUUM
      +

      VACUUM FULL needs to add exclusive locks on tables it operates on and requires that all other database operations be suspended.

      +

      When reclaiming disk space, you can query for the session corresponding to the earliest transactions in the cluster, and then end the earliest long transactions as needed to make full use of the disk space.

      +
      1. Run the following command to query for oldestxmin on the GTM:
        select * from pgxc_gtm_snapshot_status();
        +
      2. Run the following command to query for the PID of the corresponding session on the CN. xmin is the oldestxmin obtained in the previous step.
        select * from pgxc_running_xacts() where xmin=1400202010;
        +
      +
    +

  2. Do ANALYZE to update statistical information.

    ANALYZE customer;
    +
    ANALYZE
    +

    Do ANALYZE VERBOSE to update statistics and display table information.

    +
    ANALYZE VERBOSE customer;
    +
    ANALYZE
    +

    You can use VACUUM ANALYZE at the same time to optimize the query.

    +
    VACUUM ANALYZE customer;
    +
    VACUUM
    +

    VACUUM and ANALYZE cause a substantial increase in I/O traffic, which may cause poor performance of other active sessions. Therefore, you are advised to set by specifying the vacuum_cost_delay parameter.

    +
    +

  3. Delete a table

    DROP TABLE customer;
    +DROP TABLE customer_par;
    +DROP TABLE part;
    +

    If the following output is displayed, the index has been deleted.

    +
    DROP TABLE
    +

+
+

Maintenance Suggestion

  • Routinely do VACUUM FULL to large tables. If the database performance deteriorates, do VACUUM FULL to the entire database. If the database performance is stable, you are advised to monthly do VACUUM FULL.
  • Routinely do VACUUM FULL to system catalogs, mainly PG_ATTRIBUTE.
  • The automatic vacuum process (AUTOVACUUM) in the system automatically runs the VACUUM and ANALYZE statements to reclaim the record space marked as the deleted state and to update statistics related to the table.
+
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0467.html b/docs/dws/dev/dws_04_0467.html new file mode 100644 index 00000000..6a384ba2 --- /dev/null +++ b/docs/dws/dev/dws_04_0467.html @@ -0,0 +1,36 @@ + + + +

Routinely Recreating an Index

+ +

Context

When data deletion is repeatedly performed in the database, index keys will be deleted from the index page, resulting in index distention. Recreating an index routinely improves query efficiency.

+

The database supports B-tree, GIN, and psort indexes.

+
  • Recreating a B-tree index helps improve query efficiency.
    • If massive data is deleted, index keys on the index page will be deleted. As a result, the number of index pages reduces and index bloat occurs. Recreating an index helps reclaim wasted space.
    • In the created index, pages adjacent in its logical structure are adjacent in its physical structure. Therefore, a created index achieves higher access speed than an index that has been updated for multiple times.
    +
  • You are advised not to recreate a non-B-tree index.
+
+

Rebuilding an Index

Use either of the following two methods to recreate an index:

+
  • Run the DROP INDEX statement to delete an index and run the CREATE INDEX statement to create an index.

    When you delete an index, a temporary exclusive lock is added in the parent table to block related read/write operations. When you create an index, the write operation is locked but the read operation is not. The data is read and scanned by order.

    +
  • Run the REINDEX statement to recreate an index:
    • When you run the REINDEX TABLE statement to recreate an index, an exclusive lock is added to block related read/write operations.
    • When you run the REINDEX INTERNAL TABLE statement to recreate an index for a desc table (), an exclusive lock is added to block read/write operations on the table.
    +
+
+

Procedure

Assume the ordinary index areaS_idx exists in the area_id column of the imported table areaS. Use either of the following two methods to recreate an index:
  • Run the DROP INDEX statement to delete the index and run the CREATE INDEX statement to create an index.
    1. Delete an index.
      DROP INDEX areaS_idx;
      +DROP INDEX
      +
    2. Create an index.
      CREATE INDEX areaS_idx ON areaS (area_id);
      +CREATE INDEX
      +
    +
  • Run the REINDEX statement to recreate an index.
    • Run the REINDEX TABLE statement to recreate an index.
      REINDEX TABLE areaS;
      +REINDEX
      +
    • Run the REINDEX INTERNAL TABLE statement to recreate an index for a desc table ().
      REINDEX INTERNAL TABLE areaS;
      +REINDEX
      +
    +
+
+
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0468.html b/docs/dws/dev/dws_04_0468.html new file mode 100644 index 00000000..03a5488e --- /dev/null +++ b/docs/dws/dev/dws_04_0468.html @@ -0,0 +1,24 @@ + + +

Configuring the SMP

+

This section describes the usage restrictions, application scenarios, and configuration guide of symmetric multiprocessing (SMP).

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0469.html b/docs/dws/dev/dws_04_0469.html new file mode 100644 index 00000000..79fbb904 --- /dev/null +++ b/docs/dws/dev/dws_04_0469.html @@ -0,0 +1,29 @@ + + + +

Application Scenarios and Restrictions

+ +

Context

The SMP feature improves the performance through operator parallelism and occupies more system resources, including CPU, memory, network, and I/O. Actually, SMP is a method consuming resources to save time. It improves system performance in appropriate scenarios and when resources are sufficient, but may deteriorate performance otherwise. In addition, compared with the serial processing, SMP generates more candidate plans, which is more time-consuming and may deteriorate performance.

+
+

Applicable Scenarios

  • Operators supporting parallel processing are used.

    The execution plan contains the following operators:

    +
    1. Scan: Row Storage common table and a line memory partition table sequential scanning, column-oriented storage ordinary table and column-oriented storage partition table sequential scanning, HDFS internal and external table sequence scanning. Surface scanning GDS data can be imported at the same time. All of the above does not support replication tables.
    2. Join: HashJoin, NestLoop
    3. Agg: HashAgg, SortAgg, PlainAgg, and WindowAgg, which supports only partition by, and does not support order by.
    4. Stream: Redistribute, Broadcast
    5. Other: Result, Subqueryscan, Unique, Material, Setop, Append, VectoRow, RowToVec
    +
  • SMP-unique operators

    To execute queries in parallel, Stream operators are added for data exchange of the SMP feature. These new operators can be considered as the subtypes of Stream operators.

    +
    1. Local Gather aggregates data of parallel threads within a DN
    2. Local Redistribute redistributes data based on the distributed key across threads within a DN
    3. Local Broadcast broadcasts data to each thread within a DN.
    4. Local RoundRobin distributes data in polling mode across threads within a DN.
    5. Split Redistribute redistributes data across parallel threads on different DNs.
    6. Split Broadcast broadcasts data to all parallel DN threads in the cluster.
    +

    Among these operators, Local operators exchange data between parallel threads within a DN, and non-Local operators exchange data across DNs.

    +
  • Example

    The TPCH Q1 parallel plan is used as an example.

    +

    +

    In this plan, implement the Hdfs Scan and HashAgg operator parallel, and adds the Local Gather and Split Redistribute data exchange operator.

    +

    In this example, the sixth operator is Split Redistribute, and dop: 4/4 next to the operator indicates that the degree of parallelism of the sender and receiver is 4. 4 No operator is Local Gather, marked dop: 1/4 above, this operator sender thread parallel degree is 4, while the receiving end thread parallelism degree to 1, that is, lower-layer 5 number Hash Aggregate operators according to the 4 parallel degree, while the working mode of the port on the upper-layer 1 to 3 number operator according to the executed one by one, 4 number operator is used to achieve intra-DN concurrent threads data aggregation.

    +

    You can view the parallelism situation of each operator in the dop information.

    +
+
+

Non-applicable Scenarios

  1. Short query operations are performed, where the plan generation is time-consuming.
  2. Operators are processed on CNs.
  3. Statements that cannot be pushed down are executed.
  4. The subplan of a query and operators containing a subquery are executed.
+
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0470.html b/docs/dws/dev/dws_04_0470.html new file mode 100644 index 00000000..a672e2f6 --- /dev/null +++ b/docs/dws/dev/dws_04_0470.html @@ -0,0 +1,19 @@ + + + +

Resource Impact on SMP Performance

+ +

The SMP architecture uses abundant resources to obtain time. After the plan parallelism is executed, the resource consumption is added, including the CPU, memory, I/O, and network bandwidth resources. As the parallelism degree is expanded, the resource consumption increases. If these resources become a bottleneck, the SMP cannot improve the performance and the overall cluster performance may be deteriorated. Adaptive SMP is provided to dynamically select the optimal parallel degree for each query based on the resource usage and query requirements. The following information describes the situations that the SMP affects theses resources:

+
  • CPU resources

    In a general customer scenario, the system CPU usage rate is not high. Using the SMP parallelism architecture will fully use the CPU resource to improve the system performance. If the number of CPU kernels of the database server is too small and the CPU usage is already high, enabling the SMP parallelism may deteriorate the system performance due to resource compete between multiple threads.

    +
  • Memory resources

    The query parallel causes memory usage growth, but the memory upper limit used by each operator is still restricted by work_mem. Assume that work_mem is 4 GB, and the degree of parallelism is 2, then the memory upper limit of each concurrent thread is 2 GB. When work_mem is small or the system memory is sufficient, running SMP parallelism may push data down to disks. As a result, the query performance deteriorates.

    +
  • Network bandwidth resources

    To execute a query in parallel, data exchange operators are added. Local Stream operators exchange data between threads within a DN. Data is exchanged in memory and network performance is not affected. Non-Local operators exchange data over the network and increase network load. If the capacity of a network resource becomes a bottleneck, parallelism may also increase the network load.

    +
  • I/O resources

    A parallel scan increases I/O resource consumption. It can improve performance only when I/O resources are sufficient.

    +
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0471.html b/docs/dws/dev/dws_04_0471.html new file mode 100644 index 00000000..581ebba2 --- /dev/null +++ b/docs/dws/dev/dws_04_0471.html @@ -0,0 +1,17 @@ + + + +

Other Factors Affecting SMP Performance

+ +

Besides resource factors, there are other factors that impact the SMP parallelism performance, such as unevenly data distributed in a partitioned table and system parallelism degree.

+
  • Impact of data skew on SMP performance

    Serious data skew deteriorates parallel execution performance. For example, if the data volume of a value in the join column is much more than that of other values, the data volume of a parallel thread will be much more than that of others after Hash-based data redistribution, resulting in the long-tail issue and poor parallelism performance.

    +
  • Impact on the SMP performance due to system parallelism degree

    The SMP feature uses more resources, and unused resources are decreasing in a high concurrency scenario. Therefore, enabling the SMP parallelism will result in serious resource compete among queries. Once resource competes occur, no matter the CPU, I/O, memory, or network resources, all of them will result in entire performance deterioration. In the high concurrency scenario, enabling the SMP will not improve the performance effect and even may cause performance deterioration.

    +
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0472.html b/docs/dws/dev/dws_04_0472.html new file mode 100644 index 00000000..391f2d0a --- /dev/null +++ b/docs/dws/dev/dws_04_0472.html @@ -0,0 +1,21 @@ + + + +

Suggestions for SMP Parameter Settings

+ +

Starting from this version, SMP auto adaptation is enabled. For newly deployed clusters, the default value of query_dop is 0, and SMP parameters have been adjusted. To ensure forward compatibility, the value of query_dop should remain unchanged after an existing cluster is upgraded.

+

For an upgraded cluster, if you want to set query_dop to 0 and enable SMP parallel processing, modify the following parameters to obtain better dop options:

+
  • comm_usable_memory

    If the system memory is large, the value of max_process_memory is large. In this case, you are advised to set the value of this parameter to 5% of max_process_memory, that is, 4 GB by default.

    +
  • comm_max_stream

    The recommended value for this parameter is calculated as follows: comm_max_stream = Min(dop_limit x dop_limit x 20 x 2, max_process_memory (bytes) x 0.025/Number of DNs/260). The value must be within the value range of comm_max_stream.

    +
  • max_connections

    The recommended value for this parameter is calculated as follows: max_connections = dop_limit x 20 x 6 + 24. The value must be within the value range of max_connections.

    +

    In the preceding formulas, dop_limit indicates the number of CPUs corresponding to each DN in the cluster. It is calculated as follows: dop_limit = Number of logical CPU cores of a single server/Number of DNs of a single server.

    +
    +
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0473.html b/docs/dws/dev/dws_04_0473.html new file mode 100644 index 00000000..b7aba1cc --- /dev/null +++ b/docs/dws/dev/dws_04_0473.html @@ -0,0 +1,30 @@ + + + +

SMP Manual Optimization Suggestions

+ +

To manually optimize SMP, you need to be familiar with Suggestions for SMP Parameter Settings. This section describes how to optimize SMP.

+

Constraints

The CPU, memory, I/O, and network bandwidth resources are sufficient. The SMP architecture uses abundant resources to save time. After the plan parallelism is executed, resource consumption increases. When these resources become a bottleneck, SMP may deteriorate, rather than improve performance. In addition, it takes a longer time to generate SMP plans than serial plans. Therefore, in TP services that mainly involve short queries or in case resources are insufficient, you are advised to disable SMP by setting query_dop to 1.

+
+

Procedure

  1. Observe the current system load situation. If the resource is sufficient (the resource usage ratio is smaller than 50%), perform step 2. Otherwise, exit this system.
  2. Set query_dop to 1 (default value). Use explain to generate an execution plan and check whether the plan can be used in scenarios in Application Scenarios and Restrictions. If the plan can be used, go to the next step.
  3. Set query_dop=–value. The value range of the parallelism degree is [1, value].
  4. Set query_dop=value. The parallelism degree is 1 or value.
  5. Before the query statement is executed, set query_dop to an appropriate value. After the statement is executed, set query_dop to off. For example:
    1
    +2
    +3
    +4
    SET query_dop = 0;
    +SELECT COUNT(*) FROM t1 GROUP BY a;
    +......
    +SET query_dop = 1;
    +
    + +
    +
    • If resources are enough, the higher the parallelism degree is, the better the performance improvement effect is.
    • The SMP parallelism degree supports a session level setting and you are advised to enable the SMP before executing the query that meets the requirements. After the execution is complete, disable the SMP. Otherwise, SMP may affect services in peak hours.
    • SMP adaptation (query_dop ≤ 0) depends on resource management. If resource management is disabled (use_workload_manager is off), plans with parallelism degree of only 1 or 2 are generated.
    +
    +
+
+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_0474.html b/docs/dws/dev/dws_04_0474.html new file mode 100644 index 00000000..08861861 --- /dev/null +++ b/docs/dws/dev/dws_04_0474.html @@ -0,0 +1,45 @@ + + +

Optimization Cases

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0475.html b/docs/dws/dev/dws_04_0475.html new file mode 100644 index 00000000..49d767f8 --- /dev/null +++ b/docs/dws/dev/dws_04_0475.html @@ -0,0 +1,42 @@ + + +

Case: Selecting an Appropriate Distribution Column

+

Symptom

Tables are defined as follows:

+
1
+2
CREATE TABLE t1 (a int, b int);
+CREATE TABLE t2 (a int, b int);
+
+ +
+

The following query is executed:

+
1
SELECT * FROM t1, t2 WHERE t1.a = t2.b;
+
+ +
+
+

Optimization Analysis

If a is the distribution column of t1 and t2:

+
1
+2
CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);
+CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a);
+
+ +
+

Then Streaming exists in the execution plan and the data volume is heavy among DNs, as shown in Figure 1.

+
Figure 1 Selecting an appropriate distribution column (1)
+

If a is the distribution column of t1 and b is the distribution column of t2:

+
1
+2
CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a);
+CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (b);
+
+ +
+

Then Streaming does not exist in the execution plan, and the data volume among DNs is decreasing and the query performance is increasing, as shown in Figure 2.

+
Figure 2 Selecting an appropriate distribution column (2)
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0476.html b/docs/dws/dev/dws_04_0476.html new file mode 100644 index 00000000..cae8d6eb --- /dev/null +++ b/docs/dws/dev/dws_04_0476.html @@ -0,0 +1,33 @@ + + +

Case: Creating an Appropriate Index

+

Symptom

Query the information about all personnel in the sales department.

+
1
+2
+3
+4
+5
+6
+7
SELECT staff_id,first_name,last_name,employment_id,state_name,city 
+FROM staffs,sections,states,places 
+WHERE sections.section_name='Sales' 
+AND staffs.section_id = sections.section_id 
+AND sections.place_id = places.place_id 
+AND places.state_id = states.state_id 
+ORDER BY staff_id;
+
+ +
+
+

Optimization Analysis

The original execution plan is as follows before creating the places.place_id and states.state_id indexes:

+

+

The optimized execution plan is as follows (two indexes have been created on the places.place_id and states.state_id columns):

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0477.html b/docs/dws/dev/dws_04_0477.html new file mode 100644 index 00000000..cdba213d --- /dev/null +++ b/docs/dws/dev/dws_04_0477.html @@ -0,0 +1,171 @@ + + +

Case: Adding NOT NULL for JOIN Columns

+

Symptom

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
SELECT
+ * 
+FROM
+( ( SELECT
+  STARTTIME STTIME,
+  SUM(NVL(PAGE_DELAY_MSEL,0)) PAGE_DELAY_MSEL,
+  SUM(NVL(PAGE_SUCCEED_TIMES,0)) PAGE_SUCCEED_TIMES,
+  SUM(NVL(FST_PAGE_REQ_NUM,0)) FST_PAGE_REQ_NUM,
+  SUM(NVL(PAGE_AVG_SIZE,0)) PAGE_AVG_SIZE,
+  SUM(NVL(FST_PAGE_ACK_NUM,0)) FST_PAGE_ACK_NUM,
+  SUM(NVL(DATATRANS_DW_DURATION,0)) DATATRANS_DW_DURATION,
+  SUM(NVL(PAGE_SR_DELAY_MSEL,0)) PAGE_SR_DELAY_MSEL 
+ FROM
+  PS.SDR_WEB_BSCRNC_1DAY SDR
+  INNER JOIN (SELECT
+      BSCRNC_ID,
+      BSCRNC_NAME,
+      ACCESS_TYPE,
+      ACCESS_TYPE_ID 
+     FROM
+      nethouse.DIM_LOC_BSCRNC 
+     GROUP BY
+      BSCRNC_ID,
+      BSCRNC_NAME,
+      ACCESS_TYPE,
+      ACCESS_TYPE_ID) DIM 
+  ON SDR.BSCRNC_ID = DIM.BSCRNC_ID 
+  AND DIM.ACCESS_TYPE_ID IN (0,1,2) 
+  INNER JOIN nethouse.DIM_RAT_MAPPING RAT 
+  ON (RAT.RAT = SDR.RAT)
+ WHERE
+  ( (STARTTIME >= 1461340800 
+  AND STARTTIME < 1461427200) ) 
+  AND RAT.ACCESS_TYPE_ID IN (0,1,2) 
+  --and SDR.BSCRNC_ID is not null
+ GROUP BY
+  STTIME ) ) ;
+
+ +
+

Figure 1 shows the execution plan.

+
Figure 1 Adding NOT NULL for JOIN columns (1)
+
+

Optimization Analysis

  1. As shown in Figure 1, the sequential scan phase is time consuming.
  2. The JOIN performance is poor because a large number of null values exist in the JOIN column BSCRNC_ID of the PS.SDR_WEB_BSCRNC_1DAY table.

    Therefore, you are advised to manually add NOT NULL for JOIN columns in the statement, as shown below:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    SELECT
    + * 
    +FROM
    +( ( SELECT
    +  STARTTIME STTIME,
    +  SUM(NVL(PAGE_DELAY_MSEL,0)) PAGE_DELAY_MSEL,
    +  SUM(NVL(PAGE_SUCCEED_TIMES,0)) PAGE_SUCCEED_TIMES,
    +  SUM(NVL(FST_PAGE_REQ_NUM,0)) FST_PAGE_REQ_NUM,
    +  SUM(NVL(PAGE_AVG_SIZE,0)) PAGE_AVG_SIZE,
    +  SUM(NVL(FST_PAGE_ACK_NUM,0)) FST_PAGE_ACK_NUM,
    +  SUM(NVL(DATATRANS_DW_DURATION,0)) DATATRANS_DW_DURATION,
    +  SUM(NVL(PAGE_SR_DELAY_MSEL,0)) PAGE_SR_DELAY_MSEL 
    + FROM
    +  PS.SDR_WEB_BSCRNC_1DAY SDR
    +  INNER JOIN (SELECT
    +      BSCRNC_ID,
    +      BSCRNC_NAME,
    +      ACCESS_TYPE,
    +      ACCESS_TYPE_ID 
    +     FROM
    +      nethouse.DIM_LOC_BSCRNC 
    +     GROUP BY
    +      BSCRNC_ID,
    +      BSCRNC_NAME,
    +      ACCESS_TYPE,
    +      ACCESS_TYPE_ID) DIM 
    +  ON SDR.BSCRNC_ID = DIM.BSCRNC_ID 
    +  AND DIM.ACCESS_TYPE_ID IN (0,1,2) 
    +  INNER JOIN nethouse.DIM_RAT_MAPPING RAT 
    +  ON (RAT.RAT = SDR.RAT)
    + WHERE
    +  ( (STARTTIME >= 1461340800 
    +  AND STARTTIME < 1461427200) ) 
    +  AND RAT.ACCESS_TYPE_ID IN (0,1,2) 
    +  and SDR.BSCRNC_ID is not null
    + GROUP BY
    +  STTIME ) ) A;
    +
    + +
    +

    Figure 2 shows the execution plan.

    +
    Figure 2 Adding NOT NULL for JOIN columns (2)

    +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0478.html b/docs/dws/dev/dws_04_0478.html new file mode 100644 index 00000000..d034428a --- /dev/null +++ b/docs/dws/dev/dws_04_0478.html @@ -0,0 +1,98 @@ + + +

Case: Pushing Down Sort Operations to DNs

+

Symptom

In an execution plan, more than 95% of the execution time is spent on window agg performed on the CN. In this case, sum is performed for the two columns separately, and then another sum is performed for the separate sum results of the two columns. After this, trunc and sorting are performed in sequence.

+

The table structure is as follows:

+
1
+2
CREATE TABLE public.test(imsi int,L4_DW_THROUGHPUT int,L4_UL_THROUGHPUT int)
+with (orientation = column) DISTRIBUTE BY hash(imsi);
+
+ +
+

The query statements are as follows:

+
1
+2
+3
+4
+5
+6
+7
SELECT COUNT(1) over() AS DATACNT,
+IMSI AS IMSI_IMSI,
+CAST(TRUNC(((SUM(L4_UL_THROUGHPUT) + SUM(L4_DW_THROUGHPUT))), 0) AS
+DECIMAL(20)) AS TOTAL_VOLOME_KPIID
+FROM public.test AS test
+GROUP BY IMSI
+order by TOTAL_VOLOME_KPIID DESC;
+
+ +
+

The execution plan is as follows:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
Row Adapter  (cost=10.70..10.70 rows=10 width=12)
+   ->  Vector Sort  (cost=10.68..10.70 rows=10 width=12)
+         Sort Key: ((trunc((((sum(l4_ul_throughput)) + (sum(l4_dw_throughput))))::numeric, 0))::numeric(20,0))
+         ->  Vector WindowAgg  (cost=10.09..10.51 rows=10 width=12)
+               ->  Vector Streaming (type: GATHER)  (cost=242.04..246.84 rows=240 width=12)
+                     Node/s: All datanodes
+                     ->  Vector Hash Aggregate  (cost=10.09..10.29 rows=10 width=12)
+                           Group By Key: imsi
+                           ->  CStore Scan on test  (cost=0.00..10.01 rows=10 width=12)
+
+ +
+

As we can see, both window agg and sort are performed on the CN, which is time consuming.

+
+

Optimization Analysis

Modify the statement to a subquery statement, as shown below:

+
+
1
+2
+3
+4
+5
+6
+7
SELECT COUNT(1) over() AS DATACNT, IMSI_IMSI, TOTAL_VOLOME_KPIID
+FROM (SELECT IMSI AS IMSI_IMSI,
+CAST(TRUNC(((SUM(L4_UL_THROUGHPUT) + SUM(L4_DW_THROUGHPUT))),
+0) AS DECIMAL(20)) AS TOTAL_VOLOME_KPIID
+FROM public.test AS test
+GROUP BY IMSI
+ORDER BY TOTAL_VOLOME_KPIID DESC);
+
+ +
+

Perform sum on the trunc results of the two columns, take it as a subquery, and then perform window agg for the subquery to push down the sorting operation to DNs, as shown below:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
Row Adapter  (cost=10.70..10.70 rows=10 width=24)
+   ->  Vector WindowAgg  (cost=10.45..10.70 rows=10 width=24)
+         ->  Vector Streaming (type: GATHER)  (cost=250.83..253.83 rows=240 width=24)
+               Node/s: All datanodes
+               ->  Vector Sort  (cost=10.45..10.48 rows=10 width=12)
+                     Sort Key: ((trunc(((sum(test.l4_ul_throughput) + sum(test.l4_dw_throughput)))::numeric, 0))::numeric(20,0))
+                     ->  Vector Hash Aggregate  (cost=10.09..10.29 rows=10 width=12)
+                           Group By Key: test.imsi
+                           ->  CStore Scan on test  (cost=0.00..10.01 rows=10 width=12)
+
+ +
+

The optimized SQL statement greatly improves the performance by reducing the execution time from 120s to 7s.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0479.html b/docs/dws/dev/dws_04_0479.html new file mode 100644 index 00000000..2508dda9 --- /dev/null +++ b/docs/dws/dev/dws_04_0479.html @@ -0,0 +1,237 @@ + + +

Case: Configuring cost_param for Better Query Performance

+

Symptom

If bit0 of cost_param is set to 1, an improved mechanism is used for estimating the selection rate of non-equi-joins. This method is more accurate for estimating the selection rate of joins between two identical tables. The following example describes the optimization scenario when bit0 of cost_param is set to 1. In V300R002C00 and later, cost_param & 1=0 is not used. That is, an optimized formula is selected for calculation.

+

Note: The selection rate indicates the percentage for which the number of rows meeting the join conditions account of the JOIN results when the JOIN relationship is established between two tables.

+

The table structure is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
CREATE TABLE LINEITEM
+(
+L_ORDERKEY BIGINT NOT NULL
+, L_PARTKEY BIGINT NOT NULL
+, L_SUPPKEY BIGINT NOT NULL
+, L_LINENUMBER BIGINT NOT NULL
+, L_QUANTITY DECIMAL(15,2) NOT NULL
+, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL
+, L_DISCOUNT DECIMAL(15,2) NOT NULL
+, L_TAX DECIMAL(15,2) NOT NULL
+, L_RETURNFLAG CHAR(1) NOT NULL
+, L_LINESTATUS CHAR(1) NOT NULL
+, L_SHIPDATE DATE NOT NULL
+, L_COMMITDATE DATE NOT NULL
+, L_RECEIPTDATE DATE NOT NULL
+, L_SHIPINSTRUCT CHAR(25) NOT NULL
+, L_SHIPMODE CHAR(10) NOT NULL
+, L_COMMENT VARCHAR(44) NOT NULL
+) with (orientation = column, COMPRESSION = MIDDLE) distribute by hash(L_ORDERKEY);
+
+CREATE TABLE ORDERS
+(
+O_ORDERKEY BIGINT NOT NULL
+, O_CUSTKEY BIGINT NOT NULL
+, O_ORDERSTATUS CHAR(1) NOT NULL
+, O_TOTALPRICE DECIMAL(15,2) NOT NULL
+, O_ORDERDATE DATE NOT NULL
+, O_ORDERPRIORITY CHAR(15) NOT NULL
+, O_CLERK CHAR(15) NOT NULL
+, O_SHIPPRIORITY BIGINT NOT NULL
+, O_COMMENT VARCHAR(79) NOT NULL
+)with (orientation = column, COMPRESSION = MIDDLE) distribute by hash(O_ORDERKEY);
+
+ +
+

The query statements are as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
explain verbose select
+count(*) as numwait 
+from
+lineitem l1,
+orders 
+where
+o_orderkey = l1.l_orderkey
+and o_orderstatus = 'F'
+and l1.l_receiptdate > l1.l_commitdate
+and not exists (
+select
+*
+from
+lineitem l3
+where
+l3.l_orderkey = l1.l_orderkey
+and l3.l_suppkey <> l1.l_suppkey
+and l3.l_receiptdate > l3.l_commitdate
+)
+order by
+numwait desc;
+
+ +
+

The following figure shows the execution plan. (When verbose is used, distinct is added for column selection which is controlled by cost off/on. The hash join rows show the estimated number of distinct values and the other rows do not.)

+

+
+

Optimization Analysis 1

These queries are from Anti Join connected in the lineitem table. When cost_param & bit0 is 1, the estimated number of Anti Join rows greatly differ from that of the actual number of rows so that the query performance deteriorates. You can estimate the number of Anti Join rows more accurately by setting cost_param & bit0 to 1 to improve the query performance. The optimized execution plan is as follows:

+

+
+

Symptom 2

If bit1 is set to 1 (set cost_param=2), the selection rate is estimated based on multiple filter criteria. The lowest selection rate among all filter criteria, but not the product of the selection rates for two tables under a specific filter criterion, is used as the total selection rate. This method is more accurate when a close correlation exists between the columns to be filtered. The following example describes the optimization scenario when cost_param & bit1 is 1.

+

The table structure is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
CREATE TABLE NATION
+(
+N_NATIONKEYINT NOT NULL
+, N_NAMECHAR(25) NOT NULL
+, N_REGIONKEYINT NOT NULL
+, N_COMMENTVARCHAR(152)
+) distribute by replication;
+CREATE TABLE SUPPLIER
+(
+S_SUPPKEYBIGINT NOT NULL
+, S_NAMECHAR(25) NOT NULL
+, S_ADDRESSVARCHAR(40) NOT NULL
+, S_NATIONKEYINT NOT NULL
+, S_PHONECHAR(15) NOT NULL
+, S_ACCTBALDECIMAL(15,2) NOT NULL
+, S_COMMENTVARCHAR(101) NOT NULL
+) distribute by hash(S_SUPPKEY);
+CREATE TABLE PARTSUPP
+(
+PS_PARTKEYBIGINT NOT NULL
+, PS_SUPPKEYBIGINT NOT NULL
+, PS_AVAILQTYBIGINT NOT NULL
+, PS_SUPPLYCOSTDECIMAL(15,2)NOT NULL
+, PS_COMMENTVARCHAR(199) NOT NULL
+)distribute by hash(PS_PARTKEY);
+
+ +
+

The query statements are as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
set cost_param=2;
+explain verbose select
+nation,
+sum(amount) as sum_profit 
+from
+(
+select
+n_name as nation,
+l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount
+from
+supplier,
+lineitem,
+partsupp,
+nation
+where
+s_suppkey = l_suppkey
+and ps_suppkey = l_suppkey
+and ps_partkey = l_partkey
+and s_nationkey = n_nationkey
+) as profit 
+group by nation 
+order by nation;
+
+ +
+

When bit1 of cost_param is 0, the execution plan is shown as follows:

+

+
+

Optimization Analysis 2

In the preceding queries, the hash join criteria of the supplier, lineitem, and partsupp tables are setting lineitem.l_suppkey to supplier.s_suppkey and lineitem.l_partkey to partsupp.ps_partkey. Two filter criteria exist in the hash join conditions. lineitem.l_suppkey in the first filter criteria and lineitem.l_partkey in the second filter criteria are two columns with strong relationship of the lineitem table. In this situation, when you estimate the rate of the hash join conditions, if cost_param & bit1 is 0, the selection rate is estimated based on multiple filter criteria. The lowest selection rate among all filter criteria, but not the product of the selection rates for two tables under a specific filter criterion, is used as the total selection rate. This method is more accurate when a close correlation exists between the columns to be filtered. The plan after optimization is shown as follows:

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0480.html b/docs/dws/dev/dws_04_0480.html new file mode 100644 index 00000000..c8f040fa --- /dev/null +++ b/docs/dws/dev/dws_04_0480.html @@ -0,0 +1,18 @@ + + +

Case: Adjusting the Distribution Key

+

Symptom

During a site test, the information is displayed after EXPLAIN ANALYZE is executed:

+

+

According to the execution information, HashJoin becomes the performance bottleneck of the whole plan. Based on the execution time of HashJoin [2657.406, 93339.924], it can be seen that severe skew occurs on different DNs during the HashJoin operation.

+

In the memory information (as shown in the following figure), it can be seen that the data skew occurs in the memory usage of each node.

+

+
+

Optimization Analysis

The preceding two symptoms indicate that this SQL statement has serious computing skew. The further lower-layer analysis on the HashJoin operator shows that serious computing skew [38.885,2940.983] occurs in Seq Scan on s_riskrate_setting. Based on the description of the Scan, we can infer that the performance problems of this plan lie in data skew occurred in the s_riskrate_setting table. Later, it is proved that serious data skew occurred in the s_riskrate_setting table. After performance optimization, the execution time is reduced from 94s to 50s.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0481.html b/docs/dws/dev/dws_04_0481.html new file mode 100644 index 00000000..2d7f4a65 --- /dev/null +++ b/docs/dws/dev/dws_04_0481.html @@ -0,0 +1,18 @@ + + +

Case: Adjusting the Partial Clustering Key

+

Symptom

Information on the EXPLAIN PERFORMANCE at a site is as follows: As shown in the red boxes, two performance bottlenecks are scan operations in a table.

+

+

+
+

Optimization Analysis

After further analysis, we found that the filter condition acct_id ='A012709548':: bpchar exists in the two tables.

+

+

Try to add the partial clustering key in the acct_id column of the two tables, and run the VACUUM FULL statement to make the local clustering take effect. The table performance is improved.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0482.html b/docs/dws/dev/dws_04_0482.html new file mode 100644 index 00000000..519048af --- /dev/null +++ b/docs/dws/dev/dws_04_0482.html @@ -0,0 +1,18 @@ + + +

Case: Adjusting the Table Storage Mode in a Medium Table

+

Symptom

In the GaussDB(DWS) database, row-store tables use the row execution engine, and column-store tables use the column execution engine. If both row-store table and column-store tables exist in a SQL statement, the system will automatically select the row execution engine. The performance of a column execution engine (except for the indexscan related operators) is much better than that of a row execution engine. Therefore, a column-store table is recommended. This is important for some medium result set dumping tables, and you need to select a proper table storage type.

+

During the test at a site, if the following execution plan is performed, the customer expects that the performance can be improved and the result can be returned within 3s.

+

+
+

Optimization Analysis

It is found that the row engine is used after analysis, because both the temporary plan table input_acct_id_tbl and the medium result dumping table row_unlogged_table use a row-store table.

+

After the two tables are changed into column-store tables, the system performance is improved and the result is returned by 1.6s.

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0483.html b/docs/dws/dev/dws_04_0483.html new file mode 100644 index 00000000..0cb4c9a8 --- /dev/null +++ b/docs/dws/dev/dws_04_0483.html @@ -0,0 +1,20 @@ + + +

Case: Adjusting the Local Clustering Column

+

Symptom

During the test at a site, if the following execution plan is performed, the customer expects that the performance can be improved and the result can be returned within 3s.

+

+
+

Optimization Analysis

The analysis shows that the performance bottleneck of this plan is lfbank. f_ev_dp_kdpl_zhminx. The scan condition of this table is as follows:

+

+

Try to modify the lfbank. f_ev_dp_kdpl_zhmin table to a column-store table, and then create the PCK (local clustering) in the yezdminc column, and set PARTIAL_CLUSTER_ROWS to 100000000. The execution plan after optimization is as follows:

+

+
  • This method actually sacrifices the performance during data import to improve the query performance.
  • The number of local sorting tuples is increased, and you need to increase the value of psort_work_mem to improve the sorting efficiency.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0484.html b/docs/dws/dev/dws_04_0484.html new file mode 100644 index 00000000..d754bd99 --- /dev/null +++ b/docs/dws/dev/dws_04_0484.html @@ -0,0 +1,18 @@ + + +

Case: Reconstructing Partition Tables

+

Symptom

In the following simple SQL statements, the performance bottlenecks exist in the scan operation of dwcjk.

+

+

+
+

Optimization Analysis

Obviously, there are date features in the cjrq field of table data in the service layer, and this meet the features of a partitioned table. Replan the table definition of the dwcjk table. Set the cjrq field as a partition key, and day as an interval unit. Define the partitioned table dwcjk_part. The modified result is as follows, and the performance is nearly doubled.

+

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0485.html b/docs/dws/dev/dws_04_0485.html new file mode 100644 index 00000000..d1817700 --- /dev/null +++ b/docs/dws/dev/dws_04_0485.html @@ -0,0 +1,109 @@ + + +

Case: Adjusting the GUC Parameter best_agg_plan

+

Symptom

The t1 table is defined as follows:

+
1
create table t1(a int, b int, c int) distribute by hash(a);
+
+ +
+

Assume that the distribution column of the result set provided by the agg lower-layer operator is setA, and the group by column of the agg operation is setB, the agg operations can be performed in two scenarios in the stream framework.

+
  1. setA is a subset of setB.

    In this scenario, the aggregation result of the lower-layer result set is the correct result, which can be directly used by the upper-layer operator. For details, see the following figure:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    explain select a, count(1) from t1 group by a;
    + id |          operation           | E-rows | E-width | E-costs  
    +----+------------------------------+--------+---------+---------
    +  1 | ->  Streaming (type: GATHER) |     30 |       4 | 15.56   
    +  2 |    ->  HashAggregate         |     30 |       4 | 14.31   
    +  3 |       ->  Seq Scan on t1     |     30 |       4 | 14.14   
    +(3 rows)
    +
    + +
    +
  2. setA is not a subset of setB.

    In this scenario, the Stream execution framework is classified into the following three plans:

    +

    hashagg+gather(redistribute)+hashagg

    +

    redistribute+hashagg(+gather)

    +

    hashagg+redistribute+hashagg(+gather)

    +

    GaussDB(DWS) provides the guc parameter best_agg_plan to intervene the execution plan, and forces the plan to generate the corresponding execution plan. This parameter can be set to 0, 1, 2, and 3.

    +
    • When the value is set to 1, the first plan is forcibly generated.
    • When the value is set to 2 and if the group by column can be redistributed, the second plan is forcibly generated. Otherwise, the first plan is generated.
    • When the value is set to 3 and if the group by column can be redistributed, the third plan is generated. Otherwise, the first plan is generated.
    • When the value is set to 0, the query optimizer chooses the most optimal plan by the three preceding plans' evaluation cost.
    +

    For details, see the following figure.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    set best_agg_plan to 1;
    +SET
    +explain select b,count(1) from t1 group by b;
    + id |            operation            | E-rows | E-width | E-costs 
    +----+---------------------------------+--------+---------+---------
    +  1 | ->  HashAggregate               |      8 |       4 | 15.83   
    +  2 |    ->  Streaming (type: GATHER) |     25 |       4 | 15.83   
    +  3 |       ->  HashAggregate         |     25 |       4 | 14.33   
    +  4 |          ->  Seq Scan on t1     |     30 |       4 | 14.14   
    +(4 rows)
    +set best_agg_plan to 2;
    +SET
    +explain select b,count(1) from t1 group by b;
    + id |                operation                | E-rows | E-width | E-costs 
    +----+-----------------------------------------+--------+---------+---------
    +  1 | ->  Streaming (type: GATHER)            |     30 |       4 | 15.85   
    +  2 |    ->  HashAggregate                    |     30 |       4 | 14.60   
    +  3 |       ->  Streaming(type: REDISTRIBUTE) |     30 |       4 | 14.45   
    +  4 |          ->  Seq Scan on t1             |     30 |       4 | 14.14   
    +(4 rows)
    +set best_agg_plan to 3;
    +SET
    +explain select b,count(1) from t1 group by b;
    + id |                operation                | E-rows | E-width | E-costs 
    +----+-----------------------------------------+--------+---------+---------
    +  1 | ->  Streaming (type: GATHER)            |     30 |       4 | 15.84   
    +  2 |    ->  HashAggregate                    |     30 |       4 | 14.59   
    +  3 |       ->  Streaming(type: REDISTRIBUTE) |     25 |       4 | 14.59   
    +  4 |          ->  HashAggregate              |     25 |       4 | 14.33   
    +  5 |             ->  Seq Scan on t1          |     30 |       4 | 14.14   
    +(5 rows)
    +
    + +
    +
+
+

Optimization

Generally, the optimizer chooses an optimal execution plan, but the cost estimation, especially that of the intermediate result set, has large deviations, which may result in large deviations in agg calculation. In this case, you need to use best_agg_plan to adjust the agg calculation model.

+

When the aggregation convergence ratio is very small, that is, the number of result sets does not become small obviously after the agg operation (5 times is a critical point), you can select the redistribute+hashagg or hashagg+redistribute+hashagg execution mode.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0486.html b/docs/dws/dev/dws_04_0486.html new file mode 100644 index 00000000..e1814b38 --- /dev/null +++ b/docs/dws/dev/dws_04_0486.html @@ -0,0 +1,39 @@ + + +

Case: Rewriting SQL and Deleting Subqueries (Case 1)

+

Symptom

1
+2
+3
+4
select 
+    1,
+    (select count(*) from customer_address_001 a4 where a4.ca_address_sk = a.ca_address_sk) as GZCS 
+from customer_address_001 a;
+
+ +
+

This SQL performance is poor. SubPlan exists in the execution plan as follows:

+

+
+

Optimization

The core of this optimization is to eliminate subqueries. Based on the service scenario analysis, a.ca_address_sk is not null. In terms of SQL syntax, you can rewrite the SQL statement as follows:

+
1
+2
+3
+4
+5
select 
+count(*) 
+from customer_address_001 a4, customer_address_001 a
+where a4.ca_address_sk = a.ca_address_sk
+group by  a.ca_address_sk;
+
+ +
+

To ensure that the modified statements have the same functions, not null is added to customer_address_001. ca_address_sk.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0487.html b/docs/dws/dev/dws_04_0487.html new file mode 100644 index 00000000..2a22db25 --- /dev/null +++ b/docs/dws/dev/dws_04_0487.html @@ -0,0 +1,62 @@ + + +

Case: Rewriting SQL and Deleting Subqueries (Case 2)

+

Symptom

On a site, the customer gave the feedback saying that the execution time of the following SQL statements lasted over one day and did not end:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
UPDATE calc_empfyc_c_cusr1 t1
+SET ln_rec_count =
+ (
+    SELECT CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END 
+    FROM calc_empfyc_c1_policysend_tmp t2
+    WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1
+)
+WHERE dsign = '1'
+AND flag = '1'
+AND EXISTS
+    (SELECT 1
+    FROM calc_empfyc_c1_policysend_tmp t2
+    WHERE t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1
+    );
+
+ +
+

The corresponding execution plan is as follows:

+

+
+

Optimization

SubPlan exists in the execution plan, and the calculation accounts for a large proportion in the SubPlan query. That is, SubPlan is a performance bottleneck.

+

Based on the SQL syntax, you can rewrite the SQL statements and delete SubPlan as follows:

+
1
+2
+3
+4
+5
+6
UPDATE calc_empfyc_c_cusr1 t1
+SET ln_rec_count = CASE WHEN current_date - ln_process_date + 1 <= 12 THEN 0 ELSE t2.ln_rec_count END
+FROM calc_empfyc_c1_policysend_tmp t2
+WHERE 
+t1.dsign = '1' AND t1.flag = '1' 
+AND t1.ln_branch = t2.ln_branch AND t1.ls_policyno_cusr1 = t2.ls_policyno_cusr1;
+
+ +
+

The modified SQL statement task is complete within 50s.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0488.html b/docs/dws/dev/dws_04_0488.html new file mode 100644 index 00000000..07a6fc20 --- /dev/null +++ b/docs/dws/dev/dws_04_0488.html @@ -0,0 +1,69 @@ + + +

Case: Rewriting SQL Statements and Eliminating Prune Interference

+

Symptom

In a test at a site, ddw_f10_op_cust_asset_mon is a partitioned table and the partition key is year_mth whose value is a combined string of month and year values.

+

The following figure shows the tested SQL statements:

+
1
+2
+3
+4
select  
+    count(1) 
+from t_ddw_f10_op_cust_asset_mon b1
+where b1.year_mth between to_char(add_months(to_date(''20170222'','yyyymmdd'), -11),'yyyymm') and substr(''20170222'',1 ,6 );
+
+ +
+

The test result shows the SQL Scan table takes 135s. This may be the performance bottleneck.

+

add_months is a local adaptation function.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
CREATE OR REPLACE FUNCTION ADD_MONTHS(date, integer) RETURNS date
+    AS $$
+    SELECT
+    CASE 
+    WHEN (EXTRACT(day FROM $1) = EXTRACT(day FROM (date_trunc('month', $1) + INTERVAL '1 month - 1 day'))) THEN
+        date_trunc('month', $1) + CAST($2 + 1 || ' month - 1 day' as interval)
+    ELSE
+        $1 + CAST($2 || ' month' as interval)
+    END
+    $$
+    LANGUAGE SQL
+    IMMUTABLE;
+
+ +
+
+
+

Optimization

According to the statement execution plan, the base table filter is displayed as follows:

+
Filter: (((year_mth)::text <= '201702'::text) AND ((year_mth)::text >= to_char(add_months(to_date('20170222'::text, 'YYYYMMDD'::text), (-11)), 'YYYYMM'::text)))
+

The query condition expression to_char(add_months(to_date(''20170222'','yyyymmdd'),-11),'yyyymm') exists in the filter condition, and this non-constant expression cannot be used for pruning. Therefore, all data of query statements in the partitioned tables is scanned.

+

to_date and to_char are stable functions as queried in the pg_proc. Based on the function behaviors described in Postgresql, this type of function cannot be converted into the Const value in the preprocessing phase, which is the root cause of preventing partition pruning.

+

Based on the preceding analysis, the optimization expression can be used for partition pruning, which is the key to performance optimization. The original SQL statements can be written to as follows:

+
1
+2
+3
+4
select  
+    count(1) 
+from t_ddw_f10_op_cust_asset_mon b1
+where b1.year_mth between(substr(ADD_MONTHS('20170222'::date, -11), 1, 4)||substr(ADD_MONTHS('20170222'::date, -11), 6, 2)) and substr(''20170222'',1 ,6 );
+
+ +
+

The execution time of modified SQL statements is reduced from 135s to 18s.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0489.html b/docs/dws/dev/dws_04_0489.html new file mode 100644 index 00000000..fc65d571 --- /dev/null +++ b/docs/dws/dev/dws_04_0489.html @@ -0,0 +1,94 @@ + + +

Case: Rewriting SQL Statements and Deleting in-clause

+

Symptom

in-clause/any-clause is a common SQL statement constraint. Sometimes, the clause following in or any is a constant. For example:

+
1
+2
+3
+4
select 
+count(1) 
+from calc_empfyc_c1_result_tmp_t1 
+where ls_pid_cusr1 in ('20120405', '20130405');
+
+ +
+

or

+
1
+2
+3
+4
select 
+count(1) 
+from calc_empfyc_c1_result_tmp_t1 
+where ls_pid_cusr1 in any('20120405', '20130405');
+
+ +
+

Some special usages are as follows:

+
1
+2
+3
+4
+5
SELECT 
+ls_pid_cusr1,COALESCE(max(round((current_date-bthdate)/365)),0)
+FROM calc_empfyc_c1_result_tmp_t1 t1,p10_md_tmp_t2 t2
+WHERE t1.ls_pid_cusr1 = any(values(id),(id15))
+GROUP BY ls_pid_cusr1;
+
+ +
+

Where id and id15 are columns of p10_md_tmp_t2. ls_pid_cusr1 = any(values(id),(id15)) equals t1. ls_pid_cusr1 = id or t1. ls_pid_cusr1 = id15.

+

Therefore, join-condition is essentially an inequality, and nestloop must be used for this join operation. The execution plan is as follows:

+

+
+

Optimization

The test result shows that both result sets are too large. As a result, nestloop is time-consuming with more than one hour to return results. Therefore, the key to performance optimization is to eliminate nestloop, using more efficient hashjoin. From the perspective of semantic equivalence, the SQL statements can be written as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
select
+ls_pid_cusr1,COALESCE(max(round(ym/365)),0)
+from
+(
+         (
+                   SELECT 
+                            ls_pid_cusr1,(current_date-bthdate) as ym
+                   FROM calc_empfyc_c1_result_tmp_t1 t1,p10_md_tmp_t2 t2
+                   WHERE t1.ls_pid_cusr1 = t2.id and t1.ls_pid_cusr1 != t2.id15
+         )
+         union all
+         (
+                   SELECT 
+                            ls_pid_cusr1,(current_date-bthdate) as ym
+                   FROM calc_empfyc_c1_result_tmp_t1 t1,p10_md_tmp_t2 t2
+                   WHERE t1.ls_pid_cusr1 = id15
+         )
+)
+GROUP BY ls_pid_cusr1;
+
+ +
+

The optimized SQL queries consist of two equivalent join subqueries, and each subquery can be used for hashjoin in this scenario. The optimized execution plan is as follows:

+

+

Before the optimization, no result is returned for more than 1 hour. After the optimization, the result is returned within 7s.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0490.html b/docs/dws/dev/dws_04_0490.html new file mode 100644 index 00000000..0884c463 --- /dev/null +++ b/docs/dws/dev/dws_04_0490.html @@ -0,0 +1,134 @@ + + +

Case: Setting Partial Cluster Keys

+

You can add PARTIAL CLUSTER KEY(column_name[,...]) to the definition of a column-store table to set one or more columns of this table as partial cluster keys. In this way, each 70 CUs (4.2 million rows) will be sorted based on the cluster keys by default during data import and the value range is narrowed down for each of the new 70 CUs. If the where condition in the query statement contains these columns, the filtering performance will be improved.

+
  1. Use partial cluster keys.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    CREATE TABLE lineitem
    +(
    +L_ORDERKEY    BIGINT NOT NULL
    +, L_PARTKEY     BIGINT NOT NULL
    +, L_SUPPKEY     BIGINT NOT NULL
    +, L_LINENUMBER  BIGINT NOT NULL
    +, L_QUANTITY    DECIMAL(15,2) NOT NULL
    +, L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL
    +, L_DISCOUNT    DECIMAL(15,2) NOT NULL
    +, L_TAX         DECIMAL(15,2) NOT NULL
    +, L_RETURNFLAG  CHAR(1) NOT NULL
    +, L_LINESTATUS  CHAR(1) NOT NULL
    +, L_SHIPDATE    DATE NOT NULL
    +, L_COMMITDATE  DATE NOT NULL
    +, L_RECEIPTDATE DATE NOT NULL
    +, L_SHIPINSTRUCT CHAR(25) NOT NULL
    +, L_SHIPMODE     CHAR(10) NOT NULL
    +, L_COMMENT      VARCHAR(44) NOT NULL
    +)
    +with (orientation = column)
    +distribute by hash(L_ORDERKEY);
    +
    +select
    +sum(l_extendedprice * l_discount) as revenue
    +from
    +lineitem
    +where
    +l_shipdate >= '1994-01-01'::date
    +and l_shipdate < '1994-01-01'::date + interval '1 year'
    +and l_discount between 0.06 - 0.01 and 0.06 + 0.01
    +and l_quantity < 24;
    +
    + +
    +

    In the where condition, both the l_shipdate and l_quantity columns have a few distinct values, and their values can be used for min/max filtering. Therefore, modify the table definition as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    CREATE TABLE lineitem
    +(
    +L_ORDERKEY    BIGINT NOT NULL
    +, L_PARTKEY     BIGINT NOT NULL
    +, L_SUPPKEY     BIGINT NOT NULL
    +, L_LINENUMBER  BIGINT NOT NULL
    +, L_QUANTITY    DECIMAL(15,2) NOT NULL
    +, L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL
    +, L_DISCOUNT    DECIMAL(15,2) NOT NULL
    +, L_TAX         DECIMAL(15,2) NOT NULL
    +, L_RETURNFLAG  CHAR(1) NOT NULL
    +, L_LINESTATUS  CHAR(1) NOT NULL
    +, L_SHIPDATE    DATE NOT NULL
    +, L_COMMITDATE  DATE NOT NULL
    +, L_RECEIPTDATE DATE NOT NULL
    +, L_SHIPINSTRUCT CHAR(25) NOT NULL
    +, L_SHIPMODE     CHAR(10) NOT NULL
    +, L_COMMENT      VARCHAR(44) NOT NULL
    +, partial cluster key(l_shipdate, l_quantity)
    +)
    +with (orientation = column)
    +distribute by hash(L_ORDERKEY);
    +
    + +
    +

    Import the data again and run the query statement. Then, compare the execution time before and after partial cluster keys are used.

    +
    Figure 1 Partial cluster keys not used
    +
    Figure 2 CU loading without partial cluster keys
    +
    Figure 3 Partial cluster keys used
    +
    Figure 4 CU loading with partial cluster keys
    +

    After partial cluster keys are used, the execution time of 5-- CStore Scan on public.lineitem decreases by 1.2s because 84 CUs are filtered out.

    +
  2. Select partial cluster keys.
    • The following data types support cluster keys: character varying(n), varchar(n), character(n), char(n), text, nvarchar2, timestamp with time zone, timestamp without time zone, date, time without time zone, and time with time zone.
    • Smaller number of distinct values in a partial cluster key generates higher filtering performance.
    • Columns that can filter out larger amount of data is preferentially selected as partial cluster keys.
    • If multiple columns are selected as partial cluster keys, the columns are used in sequence to sort data. You are advised to select a maximum of three columns.
    +
  3. Modify parameters to reduce the impact of partial cluster keys on the import performance.

    After partial cluster keys are used, data will be sorted when they are imported, affecting the import performance. If all the data can be sorted in the memory, the keys have little impact on import. If some data cannot be sorted in the memory and is written into a temporary file for sorting, the import performance will be greatly affected.

    +

    The memory used for sorting is specified by the psort_work_mem parameter. You can set it to a larger value so that the sorting has less impact on the import performance.

    +

    The volume of data to be sorted is specified by the PARTIAL_CLUSTER_ROWS parameter of the table. Decreasing the value of this parameter reduces the amount of data to be sorted at a time. PARTIAL_CLUSTER_ROWS is usually used along with the MAX_BATCHROW parameter. The value of PARTIAL_CLUSTER_ROWS must be an integer multiple of the MAX_BATCHROW value. MAX_BATCHROW specifies the maximum number of rows in a CU.

    +

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0491.html b/docs/dws/dev/dws_04_0491.html new file mode 100644 index 00000000..31b7080a --- /dev/null +++ b/docs/dws/dev/dws_04_0491.html @@ -0,0 +1,24 @@ + + +

SQL Execution Troubleshooting

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0492.html b/docs/dws/dev/dws_04_0492.html new file mode 100644 index 00000000..e564a035 --- /dev/null +++ b/docs/dws/dev/dws_04_0492.html @@ -0,0 +1,20 @@ + + +

Low Query Efficiency

+

A query task that used to take a few milliseconds to complete is now requiring several seconds, and that used to take several seconds is now requiring even half an hour. This section describes how to analyze and rectify such low efficiency issues.

+

Procedure

Perform the following procedure to locate the cause of this fault.

+
  1. Run the analyze command to analyze the database.

    The analyze command updates data statistics information, such as data sizes and attributes in all tables. This is a lightweight command and can be executed frequently. If the query efficiency is improved or restored after the command execution, the autovacuum process does not function well and requires further analysis.

    +

  2. Check whether the query statement returns unnecessary information.

    For example, if we only need the first 10 records in a table but the query statement searches all records in the table, the query efficiency is fine for a table containing only 50 records but very low for a table containing 50,000 records.

    +

    If an application requires only a part of data information but the query statement returns all information, add a LIMIT clause to the query statement to restrict the number of returned records. In this way, the database optimizer can optimize space and improve query efficiency.

    +

  3. Check whether the query statement still has a low response even when it is solely executed.

    Run the query statement when there are no or only a few other query requests in the database, and observe the query efficiency. If the efficiency is high, the previous issue is possibly caused by a heavily loaded host in the database system or an inefficient execution plan.

    +

  4. Check the same query statement repeatedly to check the query efficiency.

    One major cause that will reduce query efficiency is that the required information is not cached in the memory or is replaced by other query requests because of insufficient memory resources.

    +

    Run the same query statement repeatedly. If the query efficiency increases gradually, the previous issue might be caused by this reason.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0494.html b/docs/dws/dev/dws_04_0494.html new file mode 100644 index 00000000..ca801022 --- /dev/null +++ b/docs/dws/dev/dws_04_0494.html @@ -0,0 +1,17 @@ + + +

DROP TABLE Fails to Be Executed

+

Problem

DROP TABLE fails to be executed in the following scenarios:

+
  • A user runs the \dt+ command using gsql and finds that the table_name table does not exist. When the user runs the CREATE TABLE table_name command, an error message indicating that the table_name table exists is displayed. When the user runs the DROP TABLE table_name command, an error message indicating that the table_name table does not exist is displayed. In this case, the table_name table cannot be recreated.
  • A user runs the \dt+ command using gsql and finds that the table_name table exists in the database. When the user runs the DROP TABLE table_name command, an error message indicating that the table_name table does not exist is displayed. In this case, the table_name table cannot be recreated.
+
+

Possible Causes

The table_name table exists on some nodes only.

+
+

Troubleshooting Method

In the preceding scenarios, if DROP TABLE table_name fails to be executed, run DROP TABLE IF EXISTS table_name to successfully drop table_name.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0495.html b/docs/dws/dev/dws_04_0495.html new file mode 100644 index 00000000..4c5dfbec --- /dev/null +++ b/docs/dws/dev/dws_04_0495.html @@ -0,0 +1,16 @@ + + +

Different Data Is Displayed for the Same Table Queried By Multiple Users

+

Problem

Two users log in to the same database human_resource and run the select count(*) from areas statement separately to query the areas table, but obtain different results.

+
+

Possible Causes

Check whether the two users really query the same table. In a relational database, a table is identified by three elements: database, schema, and table. In this issue, database is human_resource and table is areas. Then, check schema. Log in as users dbadmin and user01 separately. It is found that search_path is public for dbadmin and $user for user01. By default, a schema having the same name as user dbadmin, the cluster administrator, is not created. That is, all tables will be created in public if no schema is specified. However, when a common user, such as user01, is created, the same-name schema (user01) is created by default. That is, all tables are created in user01 if the schema is not specified. In conclusion, both the two users are operating the table, causing that the same-name table is not really the same table.

+
+

Troubleshooting Method

Use schema.table to determine a table for query.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0496.html b/docs/dws/dev/dws_04_0496.html new file mode 100644 index 00000000..6f2cfa97 --- /dev/null +++ b/docs/dws/dev/dws_04_0496.html @@ -0,0 +1,17 @@ + + +

An Error Occurs During the Integer Conversion

+

Problem

The following error is reported during the integer conversion:

+
Invalid input syntax for integer: "13."
+
+

Possible Causes

Some data types cannot be converted to the target data type.

+
+

Troubleshooting

Gradually narrow down the range of SQL statements to locate the fault.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0497.html b/docs/dws/dev/dws_04_0497.html new file mode 100644 index 00000000..8091e855 --- /dev/null +++ b/docs/dws/dev/dws_04_0497.html @@ -0,0 +1,212 @@ + + +

Automatic Retry upon SQL Statement Execution Errors

+

With automatic retry (referred to as CN retry), GaussDB(DWS) retries an SQL statement when the execution of this statement fails. If an SQL statement sent from the gsql client, JDBC driver, or ODBC driver fails to be executed, the CN can automatically identify the error reported during execution and re-deliver the task to retry.

+

The restrictions of this function are as follows:

+
  • Functionality restrictions:
    • CN retry increases execution success rate but does not guarantee success.
    • CN retry is enabled by default. In this case, the system records logs about temporary tables. If it is disabled, the system will not record the logs. Therefore, do not repeatedly enable and disable CN retry when temporary tables are used. Otherwise, data inconsistency may occur after a CN retry following a primary/standby switchover.
    • CN retry is enabled by default. In this case, the unlogged keyword is ignored in the statement for creating unlogged tables and thereby ordinary tables will be created by using this statement. If CN retry is disabled, the system records logs about unlogged tables. Therefore, do not repeatedly enable and disable CN retry when unlogged tables are used. Otherwise, data inconsistency may occur after a CN retry following a primary/standby switchover.
    • When GDS is used to export data, CN retry is supported. The existing mechanism checks for duplicate files and deletes duplicate files during data export. Therefore, you are advised not to repeatedly export data for the same foreign table unless you are sure that files with the same name in the data directory need to be deleted.
    +
  • Error type restrictions:

    Only the error types in Table 1 are supported.

    +
  • Statement type restrictions:

    Support single-statement CN retry, stored procedures, functions, and anonymous blocks. Statements in transaction blocks are not supported.

    +
  • Statement restrictions of a stored procedure:
    • If an error occurs during the execution of a stored procedure containing EXCEPTION (including statement block execution and statement execution in EXCEPTION), the stored procedure can be retried. If an internal error occurs, the stored procedure will retry first, but if the error is captured by EXCEPTION, the stored procedure cannot be retried.
    • Packages that use global variables are not supported.
    • DBMS_JO is not supported.
    • UTL_FILE is not supported.
    • If the stored procedure has printed information (such as dbms_output.put_line or raise info), the printed information will be output repeatedly when retry occurs, and "Notice: Retry triggered, some message may be duplicated. " will be output before the repeated information.
    +
  • Cluster status restrictions:
    • Only DNs or GTMs are faulty.
    • The cluster can be recovered before the number of CN retries reaches the allowed maximum (controlled by max_query_retry_times). Otherwise, CN retry may fail.
    • CN retry is not supported during scale-out.
    +
  • Data import restrictions:
    • The COPY FROM STDIN statement is not supported.
    • The gsql \copy from metacommand is not supported.
    • JDBC CopyManager copyIn is not supported.
    +
+

Table 1 lists the error types supported by CN retry and the corresponding error codes. You can use the GUC parameter retry_ecode_list to set the list of error types supported by CN retry. You are not advised to modify this parameter. To modify it, contact the technical support.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Error types supported by CN retry

Error Type

+

Error Code

+

Remarks

+

CONNECTION_RESET_BY_PEER

+

YY001

+

TCP communication errors: Connection reset by peer (communication between the CN and DNs)

+

STREAM_CONNECTION_RESET_BY_PEER

+

YY002

+

TCP communication errors: Stream connection reset by peer (communication between DNs)

+

LOCK_WAIT_TIMEOUT

+

YY003

+

Lock wait timeout

+

CONNECTION_TIMED_OUT

+

YY004

+

TCP communication errors: Connection timed out

+

SET_QUERY_ERROR

+

YY005

+

Failed to deliver the SET command: Set query

+

OUT_OF_LOGICAL_MEMORY

+

YY006

+

Failed to apply for memory: Out of logical memory

+

SCTP_MEMORY_ALLOC

+

YY007

+

SCTP communication errors: Memory allocate error

+

SCTP_NO_DATA_IN_BUFFER

+

YY008

+

SCTP communication errors: SCTP no data in buffer

+

SCTP_RELEASE_MEMORY_CLOSE

+

YY009

+

SCTP communication errors: Release memory close

+

SCTP_TCP_DISCONNECT

+

YY010

+

SCTP communication errors: TCP disconnect

+

SCTP_DISCONNECT

+

YY011

+

SCTP communication errors: SCTP disconnect

+

SCTP_REMOTE_CLOSE

+

YY012

+

SCTP communication errors: Stream closed by remote

+

SCTP_WAIT_POLL_UNKNOW

+

YY013

+

Waiting for an unknown poll: SCTP wait poll unknown

+

SNAPSHOT_INVALID

+

YY014

+

Snapshot invalid

+

ERRCODE_CONNECTION_RECEIVE_WRONG

+

YY015

+

Connection receive wrong

+

OUT_OF_MEMORY

+

53200

+

Out of memory

+

CONNECTION_FAILURE

+

08006

+

GTM errors: Connection failure

+

CONNECTION_EXCEPTION

+

08000

+

Failed to communicate with DNs due to connection errors: Connection exception

+

ADMIN_SHUTDOWN

+

57P01

+

System shutdown by administrators: Admin shutdown

+

STREAM_REMOTE_CLOSE_SOCKET

+

XX003

+

Remote socket disabled: Stream remote close socket

+

ERRCODE_STREAM_DUPLICATE_QUERY_ID

+

XX009

+

Duplicate query id

+

ERRCODE_STREAM_CONCURRENT_UPDATE

+

YY016

+

Stream concurrent update

+

ERRCODE_LLVM_BAD_ALLOC_ERROR

+

CG003

+

Memory allocation error: Allocate error

+

ERRCODE_LLVM_FATAL_ERROR

+

CG004

+

Fatal error

+

HashJoin Temporary File Read Error(ERRCODE_HASHJOIN_TEMP_FILE_ERROR)

+

F0011

+

Temporary file read error, File error

+
+
+
To enable CN retry, set the following GUC parameters:
  • Mandatory GUC parameters (required by both CNs and DNs)

    max_query_retry_times

    +

    If CN retry is enabled, temporary table data is logged. For data consistency, do not switch the enabled/disabled status for CN retry when the temporary tables are being used by sessions.

    +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0507.html b/docs/dws/dev/dws_04_0507.html new file mode 100644 index 00000000..ced65c75 --- /dev/null +++ b/docs/dws/dev/dws_04_0507.html @@ -0,0 +1,18 @@ + + +

User-Defined Functions

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0509.html b/docs/dws/dev/dws_04_0509.html new file mode 100644 index 00000000..f279e045 --- /dev/null +++ b/docs/dws/dev/dws_04_0509.html @@ -0,0 +1,487 @@ + + +

PL/Java Functions

+

With the GaussDB(DWS) PL/Java functions, you can choose your favorite Java IDE to write Java methods and install the JAR files containing these methods into the GaussDB(DWS) database before invoking them. GaussDB(DWS) PL/Java is developed based on open-source PL/Java 1.5.5 and uses JDK 1.8.0_292.

+

Constraints

Java UDF can be used for some Java logical computing. You are not advised to encapsulate services in Java UDF.

+
  • You are not advised to connect to a database in any way (for example, JDBC) in Java functions.
  • Currently, only data types listed in Table 1 are supported. Other data types, such as user-defined data types and complex data types (for example, Java array and its derived types) are not supported.
  • Currently, UDAF and UDTF are not supported.
+
+

Examples

Before using PL/Java, you need to pack the implementation of Java methods into a JAR package and deploy it into the database. Then, create functions as a database administrator. For compatibility purposes, use JDK 1.8.0_262 for compilation.

+
  1. Compile a JAR package.

    Java method implementation and JAR package archiving can be achieved in an integrated development environment (IDE). The following is a simple example of compilation and archiving through command lines. You can create a JAR package that contains a single method in the similar way.

    +

    First, prepare an Example.java file that contains a method for converting substrings to uppercase. In the following example, Example is the class name and upperString is the method name:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    public class Example 
    +{
    +    public static String upperString (String text, int beginIndex, int endIndex) 
    +    {
    +        return text.substring(beginIndex, endIndex).toUpperCase();
    +    }
    +}
    +
    + +
    +

    Then, create a manifest.txt file containing the following content:

    +
    1
    +2
    +3
    +4
    +5
    +6
    Manifest-Version: 1.0
    +Main-Class: Example
    +Specification-Title: "Example"
    +Specification-Version: "1.0"
    +Created-By: 1.6.0_35-b10-428-11M3811
    +Build-Date: 08/14/2018 10:09 AM
    +
    + +
    +

    Manifest-Version specifies the version of the manifest file. Main-Class specifies the main class used by the .jar file. Specification-Title and Specification-Version are the extended attributes of the package. Specification-Title specifies the title of the extended specification and Specification-Version specifies the version of the extended specification. Created-By specifies the person who created the file. Build-Date specifies the date when the file was created.

    +

    Finally, archive the .java file and package it into javaudf-example.jar.

    +
    1
    +2
    javac Example.java
    +jar cfm javaudf-example.jar manifest.txt Example.class
    +
    + +
    +

    JAR package names must comply with JDK rules. If a name contains invalid characters, an error occurs when a function is deployed or used.

    +
    +

  2. Deploy the JAR package.

    First store the JAR package on an OBS server. For details, see "Uploading a File" in Object Storage Service Console Operation Guide. Then, create the access key AK/SK. For details about how to create access keys, see "Creating an Access Key (AK and SK)" in Data Warehouse Service User Guide. After that, log in to the database, run the gs_extend_library function, and import the package to GaussDB(DWS).

    +
    1
    SELECT gs_extend_library('addjar', 'obs://bucket/path/javaudf-example.jar accesskey=access_key_value_to_be_replaced  secretkey=secret_access_key_value_to_be_replaced  region=region_name libraryname=example');
    +
    + +
    +

    For details about how to use the gs_extend_library function, see Manage JAR packages and files. Change the values of AK and SK as needed. Replace region_name with an actual region name.

    +

  3. Use a PL/Java function.

    Log in to the database as a user who has the sysadmin permission (for example, dbadmin) and create the java_upperstring function:

    +
    1
    +2
    +3
    +4
    CREATE FUNCTION java_upperstring(VARCHAR, INTEGER, INTEGER)
    +    RETURNS VARCHAR
    +    AS 'Example.upperString'
    +LANGUAGE JAVA;
    +
    + +
    +
    • The data type defined in the java_upperstring function should be a type in GaussDB(DWS) and match the data type defined in 1 in the upperString method in Java. For details about the mapping between GaussDB(DWS) and Java data types, see Table 1.
    • The AS clause specifies the class name and static method name of the Java method invoked by the function. The format is Class name.Method name. The class name and method name must match the Java class and method defined in 1. In this example, no packages are specified. If a package has been specified, specify the complete class name when using CREATE FUNCTION.
    • To use PL/Java functions, set LANGUAGE to JAVA.
    • For details about CREATE FUNCTION, see Create functions.
    +
    +

    Execute the java_upperstring function.

    +
    1
    SELECT java_upperstring('test', 0, 1);
    +
    + +
    +

    The expected result is as follows:

    +
    1
    +2
    +3
    +4
     java_upperstring
    +---------------------
    + T
    +(1 row)
    +
    + +
    +

  4. Authorize a common user to use the PL/Java function.

    Create a common user named udf_user.

    +
    1
    CREATE USER udf_user PASSWORD 'password';
    +
    + +
    +

    This command grants user udf_user the permission for the java_upperstring function. Note that the user can use this function only if it also has the permission for using the schema of the function.

    +
    1
    +2
    GRANT ALL PRIVILEGES ON SCHEMA public TO udf_user;
    +GRANT ALL PRIVILEGES ON FUNCTION java_upperstring(VARCHAR, INTEGER, INTEGER) TO udf_user;
    +
    + +
    +

    Log in to the database as user udf_user.

    +
    1
    SET SESSION SESSION AUTHORIZATION udf_user PASSWORD 'password';
    +
    + +
    +

    Execute the java_upperstring function.

    +
    1
    SELECT public.java_upperstring('test', 0, 1);
    +
    + +
    +

    The expected result is as follows:

    +
    1
    +2
    +3
    +4
     java_upperstring
    +---------------------
    + T
    +(1 row)
    +
    + +
    +

  5. Delete the function.

    If you no longer need this function, delete it.
    1
    DROP FUNCTION java_upperstring;
    +
    + +
    +
    +

  6. Uninstall the JAR package.

    Use the gs_extend_library function to uninstall the JAR package.

    +
    1
    SELECT gs_extend_library('rmjar', 'libraryname=example');
    +
    + +
    +

+
+

SQL Definition and Usage

  • Manage JAR packages and files.

    A database user having the sysadmin permission can use the gs_extend_library function to deploy, view, and delete JAR packages in the database. The syntax of the function is as follows:

    +
    1
    SELECT gs_extend_library('[action]', '[operation]');
    +
    + +
    +
    • action: operation action. The options are as follows:
      • ls: Displays JAR packages in the database and checks the MD5 value consistency of files on each node.
      • addjar: deploys a JAR package on the OBS server in the database.
      • rmjar: Deletes JAR packages from the database.
      +
    • operation: operation string. The format can be either of the following:

      obs://[bucket]/[source_filepath] accesskey=[accesskey] secretkey=[secretkey] region=[region] libraryname=[libraryname]

      +
      • bucket: name of the bucket to which the OBS file belongs. It is mandatory.
      • source_filepath: file path on the OBS server. Only .jar files are supported.
      • accesskey: key obtained for accessing the OBS service. It is mandatory.
      • secret_key: secret key obtained for the OBS service. It is mandatory.
      • region: region where the OBS bucket stored in the JAR package of a user-defined function belongs to. This parameter is mandatory.
      • libraryname: user-defined library name, which is used to invoke JAR files in GaussDB(DWS). If action is set to addjar or rmjar, libraryname must be specified. If action is set to ls, libraryname is optional. Note that a user-defined library name cannot contain the following characters: /|;&$<>\'{}"()[]~*?!
      +
    +
    +
  • Create functions.

    PL/Java functions can be created using the CREATE FUNCTION syntax and are defined as LANGUAGE JAVA, including the RETURNS and AS clauses.

    +
    • To use CREATE FUNCTION, specify the name and parameter type for the function to be created.
    • The RETURNS clause specifies the return type for the function.
    • The AS clause specifies the class name and static method name of the Java method to be invoked. If the NULL value needs to be transferred to the Java method as an input parameter, specify the name of the Java encapsulation class corresponding to the parameter type. For details, see NULL Handling.
    • For details about the syntax, see CREATE FUNCTION.
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      +18
      CREATE [ OR REPLACE ] FUNCTION function_name
      +( [ { argname [ argmode ] argtype [ { DEFAULT | := | = } expression ]} [, ...] ])
      +[ RETURNS rettype [ DETERMINISTIC ] ]
      +LANGAUGE JAVA
      +[
      +    { IMMUTABLE | STATBLE | VOLATILE }
      +    | [ NOT ] LEAKPROOF
      +    | WINDOW
      +    | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT |STRICT }
      +    | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
      +    | { FENCED }
      +    | COST execution_cost
      +    | ROWS result_rows
      +    | SET configuration_parameter { {TO |=} value | FROM CURRENT}
      +] [...]
      +{
      +    AS 'class_name.method_name' ( { argtype } [, ...] )
      +}
      +
      + +
      +
    +
  • Use functions.

    During execution, PL/Java searches for the Java class specified by a function among all the deployed JAR packages, which are ranked by name in alphabetical order, invokes the Java method in the first found class, and returns results.

    +
  • Delete functions.

    PL/Java functions can be deleted by using the DROP FUNCTION syntax. For details about the syntax, see DROP FUNCTION.

    +
    DROP FUNCTION [ IF EXISTS ] function_name [ ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) [ CASCADE | RESTRICT ] ];
    +

    To delete an overloaded function (for details, see Overloaded Functions), specify argtype in the function. To delete other functions, simply specify function_name.

    +
  • Authorize permissions for functions.

    Only user sysadmin can create PL/Java functions. It can also grant other users the permission to use the PL/Java functions. For details about the syntax, see GRANT.

    +
    GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    +    ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
    +        | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
+
+

Mapping for Basic Data Types

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PL/Java mapping for default data types

GaussDB(DWS)

+

Java

+

BOOLEAN

+

boolean

+

"char"

+

byte

+

bytea

+

byte[]

+

SMALLINT

+

short

+

INTEGER

+

int

+

BIGINT

+

long

+

FLOAT4

+

float

+

FLOAT8

+

double

+

CHAR

+

java.lang.String

+

VARCHAR

+

java.lang.String

+

TEXT

+

java.lang.String

+

name

+

java.lang.String

+

DATE

+

java.sql.Timestamp

+

TIME

+

java.sql.Time (stored value treated as local time)

+

TIMETZ

+

java.sql.Time

+

TIMESTAMP

+

java.sql.Timestamp

+

TIMESTAMPTZ

+

java.sql.Timestamp

+
+
+
+

Array Type Processing

GaussDB(DWS) can convert basic array types. You only need to append a pair of square brackets ([]) to the data type when creating a function.

+
CREATE FUNCTION java_arrayLength(INTEGER[])
+    RETURNS INTEGER
+    AS 'Example.getArrayLength'
+LANGUAGE JAVA;
+

Java code is similar to the following:

+
public class Example
+{
+    public static int getArrayLength(Integer[] intArray)
+    {
+        return intArray.length;
+    }
+}
+

Invoke the following statement:

+
SELECT java_arrayLength(ARRAY[1, 2, 3]);
+

The expected result is as follows:

+
java_arrayLength
+---------------------
+3
+(1 row)
+
+

NULL Handling

NULL values cannot be handled for GaussDB(DWS) data types that are mapped and can be converted to simple Java types by default. If you use a Java function to obtain and process the NULL value transferred from GaussDB(DWS), specify the Java encapsulation class in the AS clause as follows:

+
CREATE FUNCTION java_countnulls(INTEGER[])
+    RETURNS INTEGER
+    AS 'Example.countNulls(java.lang.Integer[])'
+LANGUAGE JAVA;
+

Java code is similar to the following:

+
public class Example
+{
+    public static int countNulls(Integer[] intArray)
+    {
+        int nullCount = 0;
+        for (int idx = 0; idx < intArray.length; ++idx)
+        {
+            if (intArray[idx] == null)
+            nullCount++;
+        }
+        return nullCount;
+    }
+}
+

Invoke the following statement:

+
SELECT java_countNulls(ARRAY[null, 1, null, 2, null]);
+

The expected result is as follows:

+
java_countNulls
+--------------------
+3
+(1 row)
+
+

Overloaded Functions

PL/Java supports overloaded functions. You can create functions with the same name or invoke overloaded functions from Java code. The procedure is as follows:

+
  1. Create overloaded functions.

    For example, create two Java methods with the same name, and specify the methods dummy(int) and dummy(String) with different parameter types.

    +
    public class Example
    +{
    +    public static int dummy(int value)
    +    {
    +        return value*2;
    +    }
    +    public static String dummy(String value)
    +    {
    +        return value;
    +    }
    +}
    +

    In addition, create two functions with the same names as the above two functions in GaussDB(DWS).

    +
    CREATE FUNCTION java_dummy(INTEGER)
    +    RETURNS INTEGER
    +    AS 'Example.dummy'
    +LANGUAGE JAVA;
    +
    +CREATE FUNCTION java_dummy(VARCHAR)
    +    RETURNS VARCHAR
    +    AS 'Example.dummy'
    +LANGUAGE JAVA;
    +

  2. Invoke the overloaded functions.

    GaussDB(DWS) invokes the functions that match the specified parameter type. The results of invoking the above two functions are as follows:

    +
    SELECT java_dummy(5);
    + java_dummy
    +-----------------
    +            10
    +(1 row)
    +
    +SELECT java_dummy('5');
    + java_dummy
    +---------------
    +5
    +(1 row)
    +

    Note that GaussDB(DWS) may implicitly convert data types. Therefore, you are advised to specify the parameter type when invoking an overloaded function.

    +
    SELECT java_dummy(5::varchar);
    + java_dummy
    +----------------
    +5
    +(1 row)
    +

    In this case, the specified parameter type is preferentially used for matching. If there is no Java method matching the specified parameter type, the system implicitly converts the parameter and searches for Java methods based on the conversion result.

    +
    SELECT java_dummy(5::INTEGER);
    + java_dummy
    +-----------------
    +10
    +(1 row)
    +
    +DROP FUNCTION java_dummy(INTEGER);
    +
    +SELECT java_dummy(5::INTEGER);
    + java_dummy
    +----------------
    +5
    +(1 row)
    +

    Data types supporting implicit conversion are as follows:

    +
    • SMALLINT: It can be converted to the INTEGER type by default.
    • SMALLINT and INTEGER: They can be converted to the BIGINT type by default.
    • TINYINT, SMALLINT, INTEGER, and BIGINT: They can be converted to the BOOL type by default.
    • CHAR, NAME, BIGINT, INTEGER, SMALLINT, TINYINT, RAW, FLOAT4, FLOAT8, BPCHAR, VARCHAR, NVARCHAR2, DATE, TIMESTAMP, TIMESTAMPTZ, NUMERIC, and SMALLDATETIME: They can be converted to the TEXT type by default.
    • TEXT, CHAR, BIGINT, INTEGER, SMALLINT, TINYINT, RAW, FLOAT4, FLOAT8, BPCHAR, DATE, NVARCHAR2, TIMESTAMP, NUMERIC, and SMALLDATETIME: They can be converted to the VARCHAR type by default.
    +
    +

  3. Delete the overloaded functions.

    To delete an overloaded function, specify the parameter type for the function. Otherwise, the function cannot be deleted.

    +
    DROP FUNCTION java_dummy(INTEGER);
    +

+
+

GUC Parameters

  • pljava_vmoptions

    A session-level GUC parameter. It is used to set JVM startup parameters.

    +
    SET pljava_vmoptions='-Xmx64m –Xms2m –XX:MaxMetaspaceSize=8m';
    +

    pljava_vmoptions supports:

    +
    • JDK8 JVM startup parameters.
    • JDK8 JVM system attributes (starting with –D, for example, –Djava.ext.dirs).

      You are not advised to set any parameters that contain directories because such setting may lead to unpredictable behavior.

      +
      +
    • User-defined parameters (starting with –D, for example, –Duser.defined.option).

      If a user sets pljava_vmoptions to a value beyond the value range, an error will be reported during function revoking.

      +
      SET pljava_vmoptions=' illegal.option';
      +SET
      +SELECT java_dummy(5::int);
      +ERROR:  UDF Error:cannot use PL/Java before successfully completing its setup.Please check if your pljava_vmoption is set correctly,since we do not ignore illegal parameters.Or check the log for more messages.
      +
      +
    +
+ +
  • FencedUDFMemoryLimit

    A session-level GUC parameter. It is used to specify the maximum virtual memory used by a single Fenced UDF Worker process initiated by a session.

    +
    SET FencedUDFMemoryLimit='512MB';
    +

    The value range of this parameter is (150 MB, 1G]. If the value is greater than 1G, an error will be reported immediately. If the value is less than or equal to 150 MB, an error will be reported during function invoking.

    +
    • If FencedUDFMemoryLimit is set to 0, the virtual memory for a Fenced UDF Worker process will not be limited.
    • You are advised to use udf_memory_limit to control the physical memory used by Fenced UDF Worker processes. You are not advised to use FencedUDFMemoryLimit, especially when Java UDFs are used. If you are clear about the impact of this parameter, set it based on the following information:
      • After a C Fenced UDF Worker process is started, it will occupy about 200 MB virtual memory, and about 16 MB physical memory.
      • After a Java Fenced UDF Worker process is started, it will occupy about 2.5 GB virtual memory, and about 50 MB physical memory.
      +
    +
    +
+
+

Exception Handling

If there is an exception in a JVM, PL/Java will export JVM stack information during the exception to a client.

+
+

Logging

PL/Java uses the standard Java Logger. Therefore, you can record logs as follows:

+
Logger.getAnonymousLogger().config( "Time is " + new 
+Date(System.currentTimeMillis()));
+

An initialized Java Logger class is set to the CONFIG level by default, corresponding to the LOG level in GaussDB(DWS). In this case, log messages generated by Java Logger are all redirected to the GaussDB(DWS) backend. Then, the log messages are written into server logs or displayed on the user interface. MPPDB server logs record information at the LOG, WARNING, and ERROR levels. The SQL user interface displays logs at the WARNING and ERROR levels. The following table lists mapping between Java Logger levels and GaussDB(DWS) log levels.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 PL/Java log levels

java.util.logging.Level

+

GaussDB(DWS) Log Level

+

SERVER

+

ERROR

+

WARINING

+

WARNING

+

CONFIG

+

LOG

+

INFO

+

INFO

+

FINE

+

DEBUG1

+

FINER

+

DEBUG2

+

FINEST

+

DEBUG3

+
+
+

You can change Java Logger levels. For example, if the Java Logger level is changed to SEVERE by the following Java code, log messages (msg) will not be recorded in GaussDB(DWS) logs during WARNING logging.

+
Logger log = Logger.getAnonymousLogger();
+Log.setLevel(Level.SEVERE);
+log.log(Level.WARNING, msg);
+
+

Security Issues

In GaussDB(DWS), PL/Java is an untrusted language. Only user sysadmin can create PL/Java functions. The user can grant other users the permission for using the PL/Java functions. For details, see Authorize permissions for functions.

+

In addition, PL/Java controls user access to file systems, forbidding users from reading most system files, or writing, deleting, or executing any system files in Java methods.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0511.html b/docs/dws/dev/dws_04_0511.html new file mode 100644 index 00000000..243eb8ae --- /dev/null +++ b/docs/dws/dev/dws_04_0511.html @@ -0,0 +1,18 @@ + + +

PL/pgSQL Functions

+

PL/pgSQL is similar to PL/SQL of Oracle. It is a loadable procedural language.

+

The functions created using PL/pgSQL can be used in any place where you can use built-in functions. For example, you can create calculation functions with complex conditions and use them to define operators or use them for index expressions.

+

SQL is used by most databases as a query language. It is portable and easy to learn. Each SQL statement must be executed independently by a database server.

+

In this case, when a client application sends a query to the server, it must wait for it to be processed, receive and process the results, and then perform some calculation before sending more queries to the server. If the client and server are not on the same machine, all these operations will cause inter-process communication and increase network loads.

+

PL/pgSQL enables a whole computing part and a series of queries to be grouped inside a database server. This makes procedural language available and SQL easier to use. In addition, the client/server communication cost is reduced.

+
  • Extra round-trip communication between clients and servers is eliminated.
  • Intermediate results that are not required by clients do not need to be sorted or transmitted between the clients and servers.
  • Parsing can be skipped in multiple rounds of queries.
+

PL/pgSQL can use all data types, operators, and functions in SQL.

+

For details about the PL/pgSQL syntax for creating functions, see CREATE FUNCTION. As mentioned earlier, PL/pgSQL is similar to PL/SQL of Oracle and is a loadable procedural language. Its application method is similar to that of Stored Procedures. There is only one difference. Stored procedures have no return values but the functions have.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0512.html b/docs/dws/dev/dws_04_0512.html new file mode 100644 index 00000000..de277013 --- /dev/null +++ b/docs/dws/dev/dws_04_0512.html @@ -0,0 +1,37 @@ + + +

Stored Procedures

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0513.html b/docs/dws/dev/dws_04_0513.html new file mode 100644 index 00000000..72f7998c --- /dev/null +++ b/docs/dws/dev/dws_04_0513.html @@ -0,0 +1,14 @@ + + +

Stored Procedure

+

In GaussDB(DWS), business rules and logics are saved as stored procedures.

+

A stored procedure is a combination of SQL, PL/SQL, and Java statements, enabling business rule code to be moved from applications to databases and used by multiple programs at a time.

+

For details about how to create and invoke a stored procedure, see section "CREATE PROCEDURE" in SQL Syntax.

+

The functions and stored procedures created by using PL/pgSQL in PL/pgSQL Functions are applicable to all the following sections.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0514.html b/docs/dws/dev/dws_04_0514.html new file mode 100644 index 00000000..db98ab22 --- /dev/null +++ b/docs/dws/dev/dws_04_0514.html @@ -0,0 +1,11 @@ + + +

Data Types

+

A data type refers to a value set and an operation set defined on the value set. A GaussDB(DWS) database consists of tables, each of which is defined by its own columns. Each column corresponds to a data type. GaussDB(DWS) uses corresponding functions to perform operations on data based on data types. For example, GaussDB(DWS) can perform addition, subtraction, multiplication, and division operations on data of numeric values.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0515.html b/docs/dws/dev/dws_04_0515.html new file mode 100644 index 00000000..4e963282 --- /dev/null +++ b/docs/dws/dev/dws_04_0515.html @@ -0,0 +1,159 @@ + + +

Data Type Conversion

+

Certain data types in the database support implicit data type conversions, such as assignments and parameters invoked by functions. For other data types, you can use the type conversion functions provided by GaussDB(DWS), such as the CAST function, to forcibly convert them.

+

Table 1 lists common implicit data type conversions in GaussDB(DWS).

+

The valid value range of DATE supported by GaussDB(DWS) is from 4713 B.C. to 294276 A.D.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Implicit data type conversions

Raw Data Type

+

Target Data Type

+

Remarks

+

CHAR

+

VARCHAR2

+

-

+

CHAR

+

NUMBER

+

Raw data must consist of digits.

+

CHAR

+

DATE

+

Raw data cannot exceed the valid date range.

+

CHAR

+

RAW

+

-

+

CHAR

+

CLOB

+

-

+

VARCHAR2

+

CHAR

+

-

+

VARCHAR2

+

NUMBER

+

Raw data must consist of digits.

+

VARCHAR2

+

DATE

+

Raw data cannot exceed the valid date range.

+

VARCHAR2

+

CLOB

+

-

+

NUMBER

+

CHAR

+

-

+

NUMBER

+

VARCHAR2

+

-

+

DATE

+

CHAR

+

-

+

DATE

+

VARCHAR2

+

-

+

RAW

+

CHAR

+

-

+

RAW

+

VARCHAR2

+

-

+

CLOB

+

CHAR

+

-

+

CLOB

+

VARCHAR2

+

-

+

CLOB

+

NUMBER

+

Raw data must consist of digits.

+

INT4

+

CHAR

+

-

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0516.html b/docs/dws/dev/dws_04_0516.html new file mode 100644 index 00000000..40060c06 --- /dev/null +++ b/docs/dws/dev/dws_04_0516.html @@ -0,0 +1,18 @@ + + +

Arrays and Records

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0517.html b/docs/dws/dev/dws_04_0517.html new file mode 100644 index 00000000..391f6e1f --- /dev/null +++ b/docs/dws/dev/dws_04_0517.html @@ -0,0 +1,509 @@ + + +

Arrays

+

Use of Array Types

Before the use of arrays, an array type needs to be defined:

+
Define an array type immediately after the AS keyword in a stored procedure. Run the following statement:
TYPE array_type IS VARRAY(size) OF data_type [NOT NULL];
+
+

Its parameters are as follows:

+
  • array_type: indicates the name of the array type to be defined.
  • VARRAY: indicates the array type to be defined.
  • size: indicates the maximum number of members in the array type to be defined. The value is a positive integer.
  • data_type: indicates the types of members in the array type to be created.
  • NOT NULL: an optional constraint. It can be used to ensure that none of the elements in the array is NULL.
+
  • In GaussDB(DWS), an array automatically increases. If an access violation occurs, a null value will be returned, and no error message will be reported. If out-of-bounds write occurs in an array, the message Subscript outside of limit is displayed.
  • The scope of an array type defined in a stored procedure takes effect only in this storage process.
  • It is recommended that you use one of the preceding methods to define an array type. If both methods are used to define the same array type, GaussDB(DWS) prefers the array type defined in a stored procedure to declare array variables.
+
+

In GaussDB(DWS) 8.1.0 and earlier versions, the system does not verify the length of array elements and out-of-bounds write because the array can automatically increase. This version adds related constraints to be compatible with Oracle databases. If out-of-bounds write exists, you can configure varray_verification in the parameter behavior_compat_options to be compatible with previously unverified operations.

+

Example:

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
-- Declare an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE array_proc
+AS 
+       TYPE ARRAY_INTEGER IS VARRAY(1024) OF INTEGER;--Define the array type.
+       TYPE ARRAY_INTEGER_NOT_NULL IS VARRAY(1024) OF INTEGER NOT NULL;-- Defines non-null array types.
+       ARRINT ARRAY_INTEGER: = ARRAY_INTEGER();  --Declare the variable of the array type. 
+BEGIN 
+       ARRINT.extend(10);  
+       FOR I IN 1..10 LOOP  
+               ARRINT(I) := I; 
+       END LOOP; 
+       DBMS_OUTPUT.PUT_LINE(ARRINT.COUNT);  
+       DBMS_OUTPUT.PUT_LINE(ARRINT(1));  
+       DBMS_OUTPUT.PUT_LINE(ARRINT(10)); 
+       DBMS_OUTPUT.PUT_LINE(ARRINT(ARRINT.FIRST)); 
+       DBMS_OUTPUT.PUT_LINE(ARRINT(ARRINT.last));
+END;  
+/
+
+-- Invoke the stored procedure.
+CALL array_proc();
+10
+1
+10
+1
+10
+
+-- Delete the stored procedure.
+DROP PROCEDURE array_proc;
+
+ +
+

Declaration and Use of Rowtype Arrays

In addition to the declaration and use of common arrays and non-null arrays in the preceding example, the array also supports the declaration and use of rowtype arrays.

+

Example:

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
-- Use the COUNT function on an array in a stored procedure.
+CREATE TABLE tbl (a int, b int);
+INSERT INTO tbl VALUES(1, 2),(2, 3),(3, 4);
+CREATE OR REPLACE PROCEDURE array_proc
+AS 
+    CURSOR all_tbl IS SELECT * FROM tbl ORDER BY a; 
+    TYPE tbl_array_type IS varray(50) OF tbl%rowtype; -- Defines the array of the rowtype type. tbl indicates any table.
+    tbl_array tbl_array_type;
+    tbl_item tbl%rowtype;
+    inx1 int;
+BEGIN 
+    tbl_array := tbl_array_type();
+    inx1 := 0;
+    FOR tbl_item IN all_tbl LOOP 
+        inx1 := inx1 + 1;  
+        tbl_array(inx1) := tbl_item; 
+    END LOOP; 
+    WHILE inx1 IS NOT NULL LOOP  
+        DBMS_OUTPUT.PUT_LINE('tbl_array(inx1).a=' || tbl_array(inx1).a || ' tbl_array(inx1).b=' || tbl_array(inx1).b);  
+        inx1 := tbl_array.PRIOR(inx1);
+    END LOOP; 
+END;
+/
+
+ +
+

The execution output is as follows:

+
1
+2
+3
+4
call array_proc();
+tbl_array(inx1).a=3 tbl_array(inx1).b=4
+tbl_array(inx1).a=2 tbl_array(inx1).b=3
+tbl_array(inx1).a=1 tbl_array(inx1).b=2
+
+ +
+

Array Related Functions

GaussDB(DWS) supports Oracle-related array functions. You can use the following functions to obtain array attributes or perform operations on the array content.

+
+

COUNT

Returns the number of elements in the current array. Only the initialized elements or the elements extended by the EXTEND function are counted.

+

Use:

+

varray.COUNT or varray.COUNT()

+

Example:

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
-- Use the COUNT function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3);
+    DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); 
+    v_varray.extend;
+    DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); 
+END; 
+/
+
+ +
+

The execution output is as follows:

+
1
+2
+3
call test_varray();
+v_varray.count=3
+v_varray.count=4
+
+ +
+

FIRST and LAST

The FIRST function can return the subscript of the first element. The LAST function can return the subscript of the last element.

+

Use:

+

varray.FIRST or varray.FIRST()

+

varray.LAST or varray.LAST()

+

Example:

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
-- Use the FIRST and LAST functions on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3);
+    DBMS_OUTPUT.PUT_LINE('v_varray.first=' || v_varray.first); 
+    DBMS_OUTPUT.PUT_LINE('v_varray.last=' || v_varray.last); 
+END; 
+/ 
+
+ +
+

The execution output is as follows:

+
1
+2
+3
call test_varray();
+v_varray.first=1
+v_varray.last=3
+
+ +
+

EXTEND

The EXTEND function is used to be compatible with two Oracle database operations. In GaussDB(DWS), an array automatically grows, and the EXTEND function is not necessary. For a newly written stored procedure, you do not need to use the EXTEND function.

+
+

The EXTEND function can extend arrays. The EXTEND function can be invoked in either of the following ways:

+
  • Method 1:

    EXTEND contains an integer input parameter, indicating that the array size is extended by the specified length. After executing the EXTEND function, the values of the COUNT and LAST functions change accordingly.

    +

    Use:

    +

    varray.EXTEND(size)

    +

    By default, one bit is added to the end of varray.EXTEND, which is equivalent to varray.EXTEND(1).

    +
  • Method 2:

    EXTEND contains two integer input parameters. The first parameter indicates the length of the extended size. The second parameter indicates that the value of the extended array element is the same as that of the element with the index subscript.

    +

    Use:

    +

    varray.EXTEND(size, index)

    +
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
-- Use the EXTEND function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3);
+    v_varray.extend(3);
+    DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); 
+    v_varray.extend(2,3);
+    DBMS_OUTPUT.PUT_LINE('v_varray.count=' || v_varray.count); 
+    DBMS_OUTPUT.PUT_LINE('v_varray(7)=' || v_varray(7)); 
+    DBMS_OUTPUT.PUT_LINE('v_varray(8)=' || v_varray(7)); 
+END; 
+/ 
+
+ +
+
+

The execution output is as follows:

+
1
+2
+3
+4
+5
call test_varray();
+v_varray.count=6
+v_varray.count=8
+v_varray(7)=3
+v_varray(8)=3
+
+ +
+

NEXT and PRIOR

The NEXT and PRIOR functions are used for cyclic array traversal. The NEXT function returns the subscript of the next array element based on the input parameter index. If the subscript reaches the maximum value, NULL is returned. The PRIOR function returns the subscript of the previous array element based on the input parameter index. If the minimum value of the array subscript is reached, NULL is returned.

+

Use:

+

varray.NEXT(index)

+

varray.PRIOR(index)

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
-- Use the NEXT and PRIOR functions on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+    i int;
+BEGIN 
+    v_varray := varray_type(1, 2, 3);
+
+    i := v_varray.COUNT;  
+    WHILE i IS NOT NULL LOOP  
+        DBMS_OUTPUT.PUT_LINE('test prior v_varray('||i||')=' || v_varray(i));  
+        i := v_varray.PRIOR(i);  
+    END LOOP; 
+
+    i := 1;  
+    WHILE i IS NOT NULL LOOP  
+        DBMS_OUTPUT.PUT_LINE('test next v_varray('||i||')=' || v_varray(i));  
+        i := v_varray.NEXT(i);  
+    END LOOP;
+END; 
+/
+
+ +
+

The execution output is as follows:

+
1
+2
+3
+4
+5
+6
+7
call test_varray();
+test prior v_varray(3)=3
+test prior v_varray(2)=2
+test prior v_varray(1)=1
+test next v_varray(1)=1
+test next v_varray(2)=2
+test next v_varray(3)=3
+
+ +
+
+

EXISTS

Determines whether an array subscript exists.

+

Use:

+

varray.EXISTS(index)

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
-- Use the EXISTS function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3);
+    IF v_varray.EXISTS(1) THEN
+        DBMS_OUTPUT.PUT_LINE('v_varray.EXISTS(1)');
+    END IF;
+    IF NOT v_varray.EXISTS(10) THEN
+        DBMS_OUTPUT.PUT_LINE('NOT v_varray.EXISTS(10)');
+    END IF;
+END; 
+/ 
+
+ +
+

The execution output is as follows:

+
1
+2
+3
call test_varray();
+v_varray.EXISTS(1)
+NOT v_varray.EXISTS(10)
+
+ +
+
+

TRIM

Deletes a specified number of elements from the end of an array.

+

Use:

+

varray.TRIM(size)

+

varray.TRIM is equivalent to varray.TRIM(1), because the default input parameter is 1.

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
-- Use the TRIM function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3, 4, 5);
+    v_varray.trim(3);
+    DBMS_OUTPUT.PUT_LINE('v_varray.count' || v_varray.count);
+    v_varray.trim;
+    DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count);
+END; 
+/ 
+
+ +
+

The execution output is as follows:

+
1
+2
+3
call test_varray();
+v_varray.count:2
+v_varray.count:1
+
+ +
+
+

DELETE

Deletes all elements from an array.

+

Use:

+

varray.DELETE or varray.DELETE()

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
-- Use the DELETE function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3, 4, 5);
+    v_varray.delete;
+    DBMS_OUTPUT.PUT_LINE('v_varray.count:' || v_varray.count);
+END; 
+/ 
+
+ +
+

The execution output is as follows:

+
1
+2
call test_varray();
+v_varray.count:0
+
+ +
+
+

LIMIT

Returns the allowed maximum length of an array.

+

Use:

+

varray.LIMIT or varray.LIMIT()

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
-- Use the LIMIT function on an array in a stored procedure.
+CREATE OR REPLACE PROCEDURE test_varray
+AS 
+    TYPE varray_type IS VARRAY(20) OF INT; 
+    v_varray varray_type; 
+BEGIN 
+    v_varray := varray_type(1, 2, 3, 4, 5);
+    DBMS_OUTPUT.PUT_LINE('v_varray.limit:' || v_varray.limit);
+END; 
+/ 
+
+ +
+

The execution output is as follows:

+
1
+2
call test_varray();
+v_varray.limit:20
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0518.html b/docs/dws/dev/dws_04_0518.html new file mode 100644 index 00000000..8598bd1f --- /dev/null +++ b/docs/dws/dev/dws_04_0518.html @@ -0,0 +1,213 @@ + + +

record

+

record Variables

Perform the following operations to create a record variable:

+

Define a record type and use this type to declare a variable.

+
+

Syntax

For the syntax of the record type, see Figure 1.

+
Figure 1 Syntax of the record type
+

The syntax is described as follows:

+
  • record_type: record name
  • field: record columns
  • datatype: record data type
  • expression: expression for setting a default value
+
+

In GaussDB(DWS):

+
  • When assigning values to record variables, you can:
    • Declare a record type and define member variables of this type when you declare a function or stored procedure.
    • Assign the value of a record variable to another record variable.
    • Use SELECT INTO or FETCH to assign values to a record type.
    • Assign the NULL value to a record variable.
    +
  • The INSERT and UPDATE statements cannot use a record variable to insert or update data.
  • Just like a variable, a record column of the compound type does not have a default value in the declaration.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
The table used in the following stored procedure is defined as follows:
+CREATE TABLE emp_rec
+(
+    empno            numeric(4,0),
+    ename            character varying(10),
+    job              character varying(9),
+    mgr              numeric(4,0),
+    hiredate         timestamp(0) without time zone,
+    sal              numeric(7,2),           
+    comm             numeric(7,2),          
+    deptno           numeric(2,0)
+)
+with (orientation = column,compression=middle)
+distribute by hash (sal);
+\d emp_rec
+                Table "public.emp_rec"
+  Column  |              Type              | Modifiers 
+----------+--------------------------------+-----------
+ empno    | numeric(4,0)                   | 
+ ename    | character varying(10)          | 
+ job      | character varying(9)           | 
+ mgr      | numeric(4,0)                   | 
+ hiredate | timestamp(0) without time zone | 
+ sal      | numeric(7,2)                   | 
+ comm     | numeric(7,2)                   | 
+ deptno   | numeric(2,0)                   | 
+
+-- Perform array operations in the stored procedure.
+CREATE OR REPLACE FUNCTION regress_record(p_w VARCHAR2)
+RETURNS
+VARCHAR2  AS $$
+DECLARE
+
+   -- Declare a record type.
+   type rec_type is record (name  varchar2(100), epno int);
+   employer rec_type;
+
+   -- Use %type to declare the record type.
+   type rec_type1 is record (name  emp_rec.ename%type, epno int not null :=10);
+   employer1 rec_type1;
+
+   -- Declare a record type with a default value.
+   type rec_type2 is record (
+         name varchar2 not null := 'SCOTT', 
+         epno int not null :=10);
+    employer2 rec_type2;
+    CURSOR C1 IS  select ename,empno from emp_rec order by 1 limit 1;
+            
+BEGIN
+      -- Assign a value to a member record variable.
+     employer.name := 'WARD';
+     employer.epno = 18;
+     raise info 'employer name: % , epno:%', employer.name, employer.epno;
+
+      -- Assign the value of a record variable to another variable.
+     employer1 := employer;
+     raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;
+         
+      -- Assign the NULL value to a record variable.
+     employer1 := NULL;
+     raise info 'employer1 name: % , epno: %',employer1.name, employer1.epno;
+
+      -- Obtain the default value of a record variable.
+     raise info 'employer2 name: % ,epno: %', employer2.name, employer2.epno;
+            
+      -- Use a record variable in the FOR loop.
+      for employer in select ename,empno from emp_rec order by 1  limit 1 
+          loop 
+               raise info 'employer name: % , epno: %', employer.name, employer.epno;
+          end loop;
+         
+      -- Use a record variable in the SELECT INTO statement.
+      select ename,empno  into employer2 from emp_rec order by 1 limit 1;
+      raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
+            
+      -- Use a record variable in a cursor.
+      OPEN C1;
+      FETCH C1 INTO employer2;
+      raise info 'employer name: % , epno: %', employer2.name, employer2.epno;
+      CLOSE C1;        
+      RETURN employer.name;
+END;
+$$
+LANGUAGE plpgsql;
+
+-- Invoke the stored procedure.
+CALL regress_record('abc');
+INFO:  employer name: WARD , epno:18
+INFO:  employer1 name: WARD , epno: 18
+INFO:  employer1 name: <NULL> , epno: <NULL>
+INFO:  employer2 name: SCOTT ,epno: 10
+
+-- Delete the stored procedure.
+DROP PROCEDURE regress_record;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0519.html b/docs/dws/dev/dws_04_0519.html new file mode 100644 index 00000000..42d97986 --- /dev/null +++ b/docs/dws/dev/dws_04_0519.html @@ -0,0 +1,19 @@ + + +

Syntax

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0520.html b/docs/dws/dev/dws_04_0520.html new file mode 100644 index 00000000..af7d77c8 --- /dev/null +++ b/docs/dws/dev/dws_04_0520.html @@ -0,0 +1,26 @@ + + +

Basic Structure

+

Structure

A PL/SQL block can contain a sub-block which can be placed in any section. The following describes the architecture of a PL/SQL block:

+
  • DECLARE: declares variables, types, cursors, and regional stored procedures and functions used in the PL/SQL block.
    DECLARE
    +

    This part is optional if no variable needs to be declared.

    +
    • An anonymous block may omit the DECLARE keyword if no variable needs to be declared.
    • For a stored procedure, AS is used, which is equivalent to DECLARE. The AS keyword must be reserved even if there is no variable declaration part.
    +
    +
  • EXECUTION: specifies procedure and SQL statements. It is the main part of a program. Mandatory
    BEGIN
    +
  • EXCEPTION: processes errors. Optional
    EXCEPTION
    +
  • END
    END;
    +/
    +

    You are not allowed to use consecutive tabs in the PL/SQL block, because they may result in an exception when the parameter -r is executed using the gsql tool.

    +
    +
+
+

Type

PL/SQL blocks are classified into the following types:

+
  • Anonymous block: a dynamic block that can be executed only for once. For details about the syntax, see Figure 1.
  • Subprogram: a stored procedure, function, operator, or packages stored in a database. A subprogram created in a database can be called by other programs.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0521.html b/docs/dws/dev/dws_04_0521.html new file mode 100644 index 00000000..9157fa42 --- /dev/null +++ b/docs/dws/dev/dws_04_0521.html @@ -0,0 +1,62 @@ + + +

Anonymous Block

+

An anonymous block applies to a script infrequently executed or a one-off activity. An anonymous block is executed in a session and is not stored.

+

Syntax

Figure 1 shows the syntax diagrams for an anonymous block.

+
Figure 1 anonymous_block::=
+

Details about the syntax diagram are as follows:

+
  • The execute part of an anonymous block starts with a BEGIN statement, has a break with an END statement, and ends with a semicolon (;). Type a slash (/) and press Enter to execute the statement.

    The terminator "/" must be written in an independent row.

    +
    +
  • The declaration section includes the variable definition, type, and cursor definition.
  • A simplest anonymous block does not execute any commands. At least one statement, even a null statement, must be presented in any implementation blocks.
+
+

Examples

The following lists basic anonymous block programs:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
-- Null statement block:
+BEGIN
+     NULL; 
+END;
+/
+
+-- Print information to the console:
+BEGIN
+     dbms_output.put_line('hello world!'); 
+END; 
+/
+
+-- Print variable contents to the console:
+DECLARE      
+     my_var VARCHAR2(30);  
+BEGIN      
+     my_var :='world';     
+     dbms_output.put_line('hello'||my_var); 
+END; 
+/ 
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0522.html b/docs/dws/dev/dws_04_0522.html new file mode 100644 index 00000000..9d18f0ac --- /dev/null +++ b/docs/dws/dev/dws_04_0522.html @@ -0,0 +1,11 @@ + + +

Subprogram

+

A subprogram stores stored procedures, functions, operators, and advanced packages. A subprogram created in a database can be called by other programs.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0523.html b/docs/dws/dev/dws_04_0523.html new file mode 100644 index 00000000..f1b6acff --- /dev/null +++ b/docs/dws/dev/dws_04_0523.html @@ -0,0 +1,19 @@ + + +

Basic Statements

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0524.html b/docs/dws/dev/dws_04_0524.html new file mode 100644 index 00000000..a26c69d9 --- /dev/null +++ b/docs/dws/dev/dws_04_0524.html @@ -0,0 +1,75 @@ + + +

Variable Definition Statement

+

This section describes the declaration of variables in the PL/SQL and the scope of this variable in codes.

+

Variable Declaration

For details about the variable declaration syntax, see Figure 1.

+
Figure 1 declare_variable::=
+

The above syntax diagram is explained as follows:

+
  • variable_name indicates the name of a variable.
  • type indicates the type of a variable.
  • value indicates the initial value of the variable. (If the initial value is not given, NULL is taken as the initial value.) value can also be an expression.
+

Example:

+
1
+2
+3
+4
+5
+6
DECLARE
+    emp_id  INTEGER := 7788; -- Define a variable and assign a value to it.
+BEGIN
+    emp_id := 5*7784; -- Assign a value to the variable.
+END;
+/
+
+ +
+
+

In addition to the declaration of basic variable types, %TYPE and %ROWTYPE can be used to declare variables related to table columns or table structures.

+

%TYPE Attribute

%TYPE declares a variable to be of the same data type as a previously declared variable (for example, a column in a table). For example, if you want to define a my_name variable whose data type is the same as the data type of the firstname column in the employee table, you can define the variable as follows:

+
my_name employee.firstname%TYPE
+

In this way, you can declare my_name without the need of knowing the data type of firstname in employee, and the data type of my_name can be automatically updated when the data type of firstname changes.

+
+

%ROWTYPE Attribute

%ROWTYPE declares data types of a set of data. It stores a row of table data or results fetched from a cursor. For example, if you want to define a set of data with the same column names and column data types as the employee table, you can define the data as follows:

+
my_employee employee%ROWTYPE
+
+

If multiple CNs are used, the %ROWTYPE and %TYPE attributes of temporary tables cannot be declared in a stored procedure, because a temporary table is valid only in the current session and is invisible to other CNs in the compilation phase. In this case, a message is displayed indicating that the temporary table does not exist.

+
+

Scope of a Variable

The scope of a variable indicates the accessibility and availability of a variable in code block. In other words, a variable takes effect only within its scope.

+
  • To define a function scope, a variable must declare and create a BEGIN-END block in the declaration section. The necessity of such declaration is also determined by block structure, which requires that a variable has different scopes and lifetime during a process.
  • A variable can be defined multiple times in different scopes, and inner definition can cover outer one.
  • A variable defined in an outer block can also be used in a nested block. However, the outer block cannot access variables in the nested block.
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
DECLARE
+    emp_id  INTEGER :=7788; -- Define a variable and assign a value to it.
+    outer_var  INTEGER :=6688; -- Define a variable and assign a value to it.
+BEGIN
+    DECLARE        
+        emp_id INTEGER :=7799; -- Define a variable and assign a value to it.
+        inner_var  INTEGER :=6688; -- Define a variable and assign a value to it.
+    BEGIN
+        dbms_output.put_line('inner emp_id ='||emp_id); -- Display the value as 7799.
+        dbms_output.put_line('outer_var ='||outer_var); -- Cite variables of an outer block.
+    END;
+    dbms_output.put_line('outer emp_id ='||emp_id); -- Display the value as 7788.
+END;
+/
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0525.html b/docs/dws/dev/dws_04_0525.html new file mode 100644 index 00000000..e9cc0b3f --- /dev/null +++ b/docs/dws/dev/dws_04_0525.html @@ -0,0 +1,32 @@ + + +

Assignment Statement

+

Syntax

Figure 1 shows the syntax diagram for assigning a value to a variable.

+
Figure 1 assignment_value::=
+

The above syntax diagram is explained as follows:

+
  • variable_name indicates the name of a variable.
  • value can be a value or an expression. The type of value must be compatible with the type of variable_name.
+
+

Examples

1
+2
+3
+4
+5
+6
+7
DECLARE
+    emp_id  INTEGER := 7788; --Assignment
+BEGIN
+    emp_id := 5; --Assignment
+    emp_id := 5*7784;
+END;
+/
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0526.html b/docs/dws/dev/dws_04_0526.html new file mode 100644 index 00000000..0e8c5665 --- /dev/null +++ b/docs/dws/dev/dws_04_0526.html @@ -0,0 +1,118 @@ + + +

Call Statement

+

Syntax

Figure 1 shows the syntax diagram for calling a clause.

+
Figure 1 call_clause::=
+

The above syntax diagram is explained as follows:

+
  • procedure_name specifies the name of a stored procedure.
  • parameter specifies the parameters for the stored procedure. You can set no parameter or multiple parameters.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
-- Create the stored procedure proc_staffs:
+CREATE OR REPLACE PROCEDURE proc_staffs
+(
+section     NUMBER(6),
+salary_sum out NUMBER(8,2),
+staffs_count out INTEGER
+)
+IS
+BEGIN
+SELECT sum(salary), count(*) INTO salary_sum, staffs_count FROM staffs where section_id = section;
+END;
+/
+
+-- Create the stored procedure proc_return:
+CREATE OR REPLACE PROCEDURE proc_return
+AS
+v_num NUMBER(8,2);
+v_sum INTEGER;
+BEGIN
+proc_staffs(30, v_sum, v_num);  --Invoke a statement
+dbms_output.put_line(v_sum||'#'||v_num);
+RETURN;   --Return a statement
+END;
+/
+
+-- Invoke a stored procedure proc_return:
+CALL proc_return();
+
+-- Delete a stored procedure:
+DROP PROCEDURE proc_staffs;
+DROP PROCEDURE proc_return;
+
+--Create the function func_return.
+CREATE OR REPLACE FUNCTION func_return returns void
+language plpgsql
+AS $$
+DECLARE
+v_num INTEGER := 1;
+BEGIN
+dbms_output.put_line(v_num);
+RETURN;   --Return a statement
+END $$;
+
+
+-- Invoke the function func_return.
+ CALL func_return();
+1
+
+-- Delete the function:
+ DROP FUNCTION func_return;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0527.html b/docs/dws/dev/dws_04_0527.html new file mode 100644 index 00000000..b71de56c --- /dev/null +++ b/docs/dws/dev/dws_04_0527.html @@ -0,0 +1,21 @@ + + +

Dynamic Statements

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0528.html b/docs/dws/dev/dws_04_0528.html new file mode 100644 index 00000000..aa82c81e --- /dev/null +++ b/docs/dws/dev/dws_04_0528.html @@ -0,0 +1,133 @@ + + +

Executing Dynamic Query Statements

+

You can perform dynamic queries using EXECUTE IMMEDIATE or OPEN FOR in GaussDB(DWS). EXECUTE IMMEDIATE dynamically executes SELECT statements and OPEN FOR combines use of cursors. If you need to store query results in a data set, use OPEN FOR.

+

EXECUTE IMMEDIATE

Figure 1 shows the syntax diagram.

+
Figure 1 EXECUTE IMMEDIATE dynamic_select_clause::=
+

Figure 2 shows the syntax diagram for using_clause.

+
Figure 2 using_clause-1
+

The above syntax diagram is explained as follows:

+
  • define_variable: specifies variables to store single-line query results.
  • USING IN bind_argument: specifies where the variable passed to the dynamic SQL value is stored, that is, in the dynamic placeholder of dynamic_select_string.
  • USING OUT bind_argument: specifies where the dynamic SQL returns the value of the variable.
    • In query statements, INTO and OUT cannot coexist.
    • A placeholder name starts with a colon (:) followed by digits, characters, or strings, corresponding to bind_argument in the USING clause.
    • bind_argument can only be a value, variable, or expression. It cannot be a database object such as a table name, column name, and data type. That is, bind_argument cannot be used to transfer schema objects for dynamic SQL statements. If a stored procedure needs to transfer database objects through bind_argument to construct dynamic SQL statements (generally, DDL statements), you are advised to use double vertical bars (||) to concatenate dynamic_select_clause with a database object.
    • A dynamic PL/SQL block allows duplicate placeholders. That is, a placeholder can correspond to only one bind_argument in the USING clause.
    +
    +
+

Example

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
--Retrieve values from dynamic statements (INTO clause).
+DECLARE
+   staff_count  VARCHAR2(20);
+BEGIN
+   EXECUTE IMMEDIATE 'select count(*) from staffs'
+      INTO staff_count;
+   dbms_output.put_line(staff_count);
+END;
+/
+
+--Pass and retrieve values (the INTO clause is used before the USING clause).
+CREATE OR REPLACE PROCEDURE dynamic_proc
+AS
+   staff_id     NUMBER(6) := 200;
+   first_name   VARCHAR2(20);
+   salary       NUMBER(8,2);
+BEGIN
+   EXECUTE IMMEDIATE 'select first_name, salary from staffs where staff_id = :1'
+       INTO first_name, salary
+       USING IN staff_id;
+   dbms_output.put_line(first_name || ' ' || salary);
+END;
+/
+
+-- Invoke the stored procedure.
+CALL dynamic_proc();
+
+-- Delete the stored procedure.
+DROP PROCEDURE dynamic_proc;
+
+ +
+
+

OPEN FOR

Dynamic query statements can be executed by using OPEN FOR to open dynamic cursors.

+

For details about the syntax, see Figure 3.

+
Figure 3 open_for::=
+

Parameter description:

+
  • cursor_name: specifies the name of the cursor to be opened.
  • dynamic_string: specifies the dynamic query statement.
  • USING value: applies when a placeholder exists in dynamic_string.
+

For use of cursors, see Cursors.

+

Example

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
DECLARE
+    name          VARCHAR2(20);
+    phone_number  VARCHAR2(20);
+    salary        NUMBER(8,2);
+    sqlstr        VARCHAR2(1024);
+
+    TYPE app_ref_cur_type IS REF CURSOR; -- Define the cursor type.
+    my_cur app_ref_cur_type; -- Define the cursor variable.
+    
+BEGIN
+    sqlstr := 'select first_name,phone_number,salary from staffs
+         where section_id = :1';
+    OPEN my_cur FOR sqlstr USING '30'; -- Open the cursor. using is optional.
+    FETCH my_cur INTO name, phone_number, salary; -- Retrieve the data.
+    WHILE my_cur%FOUND LOOP
+          dbms_output.put_line(name||'#'||phone_number||'#'||salary);
+          FETCH my_cur INTO name, phone_number, salary;
+    END LOOP;
+    CLOSE my_cur; -- Close the cursor.
+END;
+/
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0529.html b/docs/dws/dev/dws_04_0529.html new file mode 100644 index 00000000..2667a28c --- /dev/null +++ b/docs/dws/dev/dws_04_0529.html @@ -0,0 +1,88 @@ + + +

Executing Dynamic Non-query Statements

+

Syntax

Figure 1 shows the syntax diagram.

+
Figure 1 noselect::=
+

Figure 2 shows the syntax diagram for using_clause.

+
Figure 2 using_clause-2
+

The above syntax diagram is explained as follows:

+

USING IN bind_argument is used to specify the variable that transfers values to dynamic SQL statements. It is used when a placeholder exists in dynamic_noselect_string. That is, a placeholder is replaced by the corresponding bind_argument when a dynamic SQL statement is executed. Note that bind_argument can only be a value, variable, or expression, and cannot be a database object such as a table name, column name, and data type. If a stored procedure needs to transfer database objects through bind_argument to construct dynamic SQL statements (generally, DDL statements), you are advised to use double vertical bars (||) to concatenate dynamic_select_clause with a database object. In addition, a dynamic PL/SQL block allows duplicate placeholders. That is, a placeholder can correspond to only one bind_argument.

+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
-- Create a table:
+CREATE TABLE sections_t1
+(
+   section       NUMBER(4) ,
+   section_name  VARCHAR2(30),
+   manager_id    NUMBER(6),
+   place_id      NUMBER(4) 
+)  
+DISTRIBUTE BY hash(manager_id);
+
+--Declare a variable:
+DECLARE 
+   section       NUMBER(4) := 280; 
+   section_name  VARCHAR2(30) := 'Info support'; 
+   manager_id    NUMBER(6) := 103;
+   place_id      NUMBER(4) := 1400;
+   new_colname   VARCHAR2(10) := 'sec_name';
+BEGIN 
+-- Execute the query:
+    EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :4)' 
+       USING section, section_name, manager_id,place_id; 
+-- Execute the query (duplicate placeholders):
+    EXECUTE IMMEDIATE 'insert into sections_t1 values(:1, :2, :3, :1)' 
+       USING section, section_name, manager_id; 
+-- Run the ALTER statement. (You are advised to use double vertical bars (||) to concatenate the dynamic DDL statement with a database object.)
+    EXECUTE IMMEDIATE 'alter table sections_t1 rename section_name to ' || new_colname;
+END; 
+/
+
+-- Query data:
+SELECT * FROM sections_t1;
+
+--Delete the table.
+DROP TABLE sections_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0530.html b/docs/dws/dev/dws_04_0530.html new file mode 100644 index 00000000..0d0c5738 --- /dev/null +++ b/docs/dws/dev/dws_04_0530.html @@ -0,0 +1,81 @@ + + +

Dynamically Calling Stored Procedures

+

This section describes how to dynamically call store procedures. You must use anonymous statement blocks to package stored procedures or statement blocks and append IN and OUT behind the EXECUTE IMMEDIATE...USING statement to input and output parameters.

+

Syntax

Figure 1 shows the syntax diagram.

+
Figure 1 call_procedure::=
+

Figure 2 shows the syntax diagram for using_clause.

+
Figure 2 using_clause-3
+

The above syntax diagram is explained as follows:

+
  • CALL procedure_name: calls the stored procedure.
  • [:placeholder1,:placeholder2,...]: specifies the placeholder list of the stored procedure parameters. The numbers of the placeholders and the parameters are the same.
  • USING [IN|OUT|IN OUT]bind_argument: specifies where the variable passed to the stored procedure parameter value is stored. The modifiers in front of bind_argument and of the corresponding parameter are the same.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
--Create the stored procedure proc_add:
+CREATE OR REPLACE PROCEDURE proc_add
+(
+    param1    in   INTEGER,
+    param2    out  INTEGER,
+    param3    in   INTEGER
+)
+AS
+BEGIN
+   param2:= param1 + param3;
+END;
+/
+
+DECLARE
+    input1 INTEGER:=1;
+    input2 INTEGER:=2;
+    statement  VARCHAR2(200);
+    param2     INTEGER;
+BEGIN
+   --Declare the call statement:
+    statement := 'call proc_add(:col_1, :col_2, :col_3)';
+   --Execute the statement:
+    EXECUTE IMMEDIATE statement
+        USING IN input1, OUT param2, IN input2;
+    dbms_output.put_line('result is: '||to_char(param2));
+END;
+/
+
+-- Delete the stored procedure.
+DROP PROCEDURE proc_add;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0531.html b/docs/dws/dev/dws_04_0531.html new file mode 100644 index 00000000..d0252b71 --- /dev/null +++ b/docs/dws/dev/dws_04_0531.html @@ -0,0 +1,59 @@ + + +

Dynamically Calling Anonymous Blocks

+

This section describes how to execute anonymous blocks in dynamic statements. Append IN and OUT behind the EXECUTE IMMEDIATE...USING statement to input and output parameters.

+

Syntax

Figure 1 shows the syntax diagram.

+
Figure 1 call_anonymous_block::=
+

Figure 2 shows the syntax diagram for using_clause.

+
Figure 2 using_clause-4
+

The above syntax diagram is explained as follows:

+
  • The execute part of an anonymous block starts with a BEGIN statement, has a break with an END statement, and ends with a semicolon (;).
  • USING [IN|OUT|IN OUT]bind_argument: specifies where the variable passed to the stored procedure parameter value is stored. The modifiers in front of bind_argument and of the corresponding parameter are the same.
  • The input and output parameters in the middle of an anonymous block are designated by placeholders. The numbers of the placeholders and the parameters are the same. The sequences of the parameters corresponding to the placeholders and the USING parameters are the same.
  • Currently in GaussDB(DWS), when dynamic statements call anonymous blocks, placeholders cannot be used to pass input and output parameters in an EXCEPTION statement.
+
+

Example

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
--Create the stored procedure dynamic_proc.
+CREATE OR REPLACE PROCEDURE dynamic_proc
+AS
+   staff_id     NUMBER(6) := 200;
+   first_name   VARCHAR2(20);
+   salary       NUMBER(8,2);
+BEGIN
+--Execute the anonymous block.
+    EXECUTE IMMEDIATE 'begin select first_name, salary into :first_name, :salary from staffs where staff_id= :dno; end;'
+       USING OUT first_name, OUT salary, IN staff_id;
+   dbms_output.put_line(first_name|| ' ' || salary);
+END;
+/
+
+-- Invoke the stored procedure.
+CALL dynamic_proc();
+
+-- Delete the stored procedure.
+DROP PROCEDURE dynamic_proc;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0532.html b/docs/dws/dev/dws_04_0532.html new file mode 100644 index 00000000..4c8dda19 --- /dev/null +++ b/docs/dws/dev/dws_04_0532.html @@ -0,0 +1,27 @@ + + +

Control Statements

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0533.html b/docs/dws/dev/dws_04_0533.html new file mode 100644 index 00000000..c4d0eadd --- /dev/null +++ b/docs/dws/dev/dws_04_0533.html @@ -0,0 +1,18 @@ + + +

RETURN Statements

+

In GaussDB(DWS), data can be returned in either of the following ways: RETURN, RETURN NEXT, or RETURN QUERY. RETURN NEXT and RETURN QUERY are used only for functions and cannot be used for stored procedures.

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0534.html b/docs/dws/dev/dws_04_0534.html new file mode 100644 index 00000000..dccbdf9b --- /dev/null +++ b/docs/dws/dev/dws_04_0534.html @@ -0,0 +1,17 @@ + + +

RETURN

+

Syntax

Figure 1 shows the syntax diagram for a return statement.

+
Figure 1 return_clause::=
+

The syntax details are as follows:

+

This statement returns control from a stored procedure or function to a caller.

+
+

Examples

See Examples for call statement examples.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0535.html b/docs/dws/dev/dws_04_0535.html new file mode 100644 index 00000000..ce5e4777 --- /dev/null +++ b/docs/dws/dev/dws_04_0535.html @@ -0,0 +1,97 @@ + + +

RETURN NEXT and RETURN QUERY

+

Syntax

When creating a function, specify SETOF datatype for the return values.

+

return_next_clause::=

+

+

return_query_clause::=

+

+

The syntax details are as follows:

+

If a function needs to return a result set, use RETURN NEXT or RETURN QUERY to add results to the result set, and then continue to execute the next statement of the function. As the RETURN NEXT or RETURN QUERY statement is executed repeatedly, more and more results will be added to the result set. After the function is executed, all results are returned.

+

RETURN NEXT can be used for scalar and compound data types.

+

RETURN QUERY has a variant RETURN QUERY EXECUTE. You can add dynamic queries and add parameters to the queries by using USING.

+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
CREATE TABLE t1(a int);
+INSERT INTO t1 VALUES(1),(10);
+
+--RETURN NEXT
+CREATE OR REPLACE FUNCTION fun_for_return_next() RETURNS SETOF t1 AS $$
+DECLARE
+   r t1%ROWTYPE;
+BEGIN
+   FOR r IN select * from t1
+   LOOP
+      RETURN NEXT r;
+   END LOOP;
+   RETURN;
+END;
+$$ LANGUAGE PLPGSQL;
+call fun_for_return_next();
+ a
+---
+ 1
+ 10
+(2 rows)
+
+-- RETURN QUERY
+CREATE OR REPLACE FUNCTION fun_for_return_query() RETURNS SETOF t1 AS $$
+DECLARE
+   r t1%ROWTYPE;
+BEGIN
+   RETURN QUERY select * from t1;
+END;
+$$
+language plpgsql;
+call fun_for_return_next();
+ a
+---
+ 1
+ 10
+(2 rows)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0536.html b/docs/dws/dev/dws_04_0536.html new file mode 100644 index 00000000..ebcc0529 --- /dev/null +++ b/docs/dws/dev/dws_04_0536.html @@ -0,0 +1,121 @@ + + +

Conditional Statements

+

Conditional statements are used to decide whether given conditions are met. Operations are executed based on the decisions made.

+

GaussDB(DWS) supports five usages of IF:

+
  • IF_THEN
    Figure 1 IF_THEN::=
    +

    IF_THEN is the simplest form of IF. If the condition is true, statements are executed. If it is false, they are skipped.

    +

    Example

    +
    1
    +2
    +3
    IF v_user_id <> 0 THEN
    +    UPDATE users SET email = v_email WHERE user_id = v_user_id;
    +END IF;
    +
    + +
    +
  • IF_THEN_ELSE
    Figure 2 IF_THEN_ELSE::=
    +

    IF-THEN-ELSE statements add ELSE branches and can be executed if the condition is false.

    +

    Example

    +
    1
    +2
    +3
    +4
    +5
    +6
    IF parentid IS NULL OR parentid = ''
    +THEN
    +    RETURN;
    +ELSE
    +    hp_true_filename(parentid); -- Call the stored procedure.
    +END IF;
    +
    + +
    +
  • IF_THEN_ELSE IF

    IF statements can be nested in the following way:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    IF sex = 'm' THEN
    +    pretty_sex := 'man';
    +ELSE
    +    IF sex = 'f' THEN
    +        pretty_sex := 'woman';
    +    END IF;
    +END IF;
    +
    + +
    +

    Actually, this is a way of an IF statement nesting in the ELSE part of another IF statement. Therefore, an END IF statement is required for each nesting IF statement and another END IF statement to end the parent IF-ELSE statement. To set multiple options, use the following form:

    +
  • IF_THEN_ELSIF_ELSE
    Figure 3 IF_THEN_ELSIF_ELSE::=
    +

    Example

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    IF number_tmp = 0 THEN
    +    result := 'zero';
    +ELSIF number_tmp > 0 THEN 
    +    result := 'positive';
    +ELSIF number_tmp < 0 THEN
    +    result := 'negative';
    +ELSE
    +    result := 'NULL';
    +END IF;
    +
    + +
    +
  • IF_THEN_ELSEIF_ELSE

    ELSEIF is an alias of ELSIF.

    +
    Example
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    CREATE OR REPLACE PROCEDURE proc_control_structure(i in integer) 
    +AS
    +    BEGIN
    +        IF i > 0 THEN
    +            raise info 'i:% is greater than 0. ',i; 
    +        ELSIF i < 0 THEN
    +            raise info 'i:% is smaller than 0. ',i; 
    +        ELSE
    +            raise info 'i:% is equal to 0. ',i; 
    +        END IF;
    +        RETURN;
    +    END;
    +/
    +
    +CALL proc_control_structure(3);
    +
    +-- Delete the stored procedure:
    +DROP PROCEDURE proc_control_structure;
    +
    + +
    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0537.html b/docs/dws/dev/dws_04_0537.html new file mode 100644 index 00000000..80d78558 --- /dev/null +++ b/docs/dws/dev/dws_04_0537.html @@ -0,0 +1,241 @@ + + +

Loop Statements

+

Simple LOOP Statements

The syntax diagram is as follows.

+
Figure 1 loop::=
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
CREATE OR REPLACE PROCEDURE proc_loop(i in integer, count out integer) 
+AS 
+    BEGIN 
+        count:=0; 
+        LOOP 
+        IF count > i THEN 
+            raise info 'count is %. ', count;  
+            EXIT; 
+        ELSE 
+            count:=count+1; 
+        END IF; 
+        END LOOP; 
+    END;
+/
+
+CALL proc_loop(10,5);
+
+ +
+

The loop must be exploited together with EXIT; otherwise, a dead loop occurs.

+
+
+

WHILE-LOOP Statements

The syntax diagram is as follows.

+
Figure 2 while_loop::=
+

If the conditional expression is true, a series of statements in the WHILE statement are repeatedly executed and the condition is decided each time the loop body is executed.

+

Examples

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
CREATE TABLE integertable(c1 integer) DISTRIBUTE BY hash(c1); 
+CREATE OR REPLACE PROCEDURE proc_while_loop(maxval in integer) 
+AS 
+    DECLARE 
+    i int :=1;  
+    BEGIN 
+        WHILE i < maxval LOOP 
+            INSERT INTO integertable VALUES(i); 
+            i:=i+1; 
+        END LOOP; 
+    END; 
+/
+
+-- Invoke a function:
+CALL proc_while_loop(10);
+
+-- Delete the stored procedure and table:
+DROP PROCEDURE proc_while_loop;
+DROP TABLE integertable;
+
+ +
+
+

FOR_LOOP (Integer variable) Statement

The syntax diagram is as follows.

+
Figure 3 for_loop::=
+
  • The variable name is automatically defined as the integer type and exists only in this loop. The variable name falls between lower_bound and upper_bound.
  • When the keyword REVERSE is used, the lower bound must be greater than or equal to the upper bound; otherwise, the loop body is not executed.
+
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
-- Loop from 0 to 5:
+CREATE OR REPLACE PROCEDURE proc_for_loop()
+AS
+    BEGIN
+    FOR I IN 0..5 LOOP
+        DBMS_OUTPUT.PUT_LINE('It is '||to_char(I) || ' time;') ;
+    END LOOP;
+END;
+/
+
+-- Invoke a function:
+CALL proc_for_loop();
+
+-- Delete the stored procedure:
+DROP PROCEDURE proc_for_loop;
+
+ +
+
+

FOR_LOOP Query Statements

The syntax diagram is as follows.

+
Figure 4 for_loop_query::=
+

The variable target is automatically defined, its type is the same as that in the query result, and it is valid only in this loop. The target value is the query result.

+
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
-- Display the query result from the loop:
+CREATE OR REPLACE PROCEDURE proc_for_loop_query()
+AS 
+    record VARCHAR2(50);
+BEGIN 
+    FOR record IN SELECT spcname FROM pg_tablespace LOOP 
+    dbms_output.put_line(record); 
+    END LOOP; 
+END; 
+/
+
+-- Invoke a function.
+CALL proc_for_loop_query();
+
+-- Delete the stored procedure.
+DROP PROCEDURE proc_for_loop_query;
+
+ +
+
+

FORALL Batch Query Statements

The syntax diagram is as follows.

+
Figure 5 forall::=
+

The variable index is automatically defined as the integer type and exists only in this loop. The index value falls between low_bound and upper_bound.

+
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
CREATE TABLE hdfs_t1 (
+  title NUMBER(6),
+  did VARCHAR2(20),
+  data_peroid VARCHAR2(25),
+  kind VARCHAR2(25),
+  interval VARCHAR2(20),
+  time DATE,
+  isModified VARCHAR2(10)
+) 
+DISTRIBUTE BY hash(did);
+
+INSERT INTO hdfs_t1 VALUES( 8, 'Donald', 'OConnell', 'DOCONNEL', '650.507.9833', to_date('21-06-1999', 'dd-mm-yyyy'), 'SH_CLERK' );
+
+CREATE OR REPLACE PROCEDURE proc_forall()
+AS 
+BEGIN 
+    FORALL i IN 100..120 
+        insert into hdfs_t1(title) values(i);
+END; 
+/
+
+-- Invoke a function:
+CALL proc_forall();
+
+-- Query the invocation result of the stored procedure:
+SELECT * FROM hdfs_t1 WHERE title BETWEEN 100 AND 120;
+
+-- Delete the stored procedure and table:
+DROP PROCEDURE proc_forall;
+DROP TABLE hdfs_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0538.html b/docs/dws/dev/dws_04_0538.html new file mode 100644 index 00000000..bad60cb3 --- /dev/null +++ b/docs/dws/dev/dws_04_0538.html @@ -0,0 +1,82 @@ + + +

Branch Statements

+

Syntax

Figure 1 shows the syntax diagram.

+
Figure 1 case_when::=
+

Figure 2 shows the syntax diagram for when_clause.

+
Figure 2 when_clause::=
+

Parameter description:

+
  • case_expression: specifies the variable or expression.
  • when_expression: specifies the constant or conditional expression.
  • statement: specifies the statement to execute.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
CREATE OR REPLACE PROCEDURE proc_case_branch(pi_result in integer, pi_return out integer)
+AS 
+    BEGIN 
+        CASE pi_result 
+            WHEN 1 THEN 
+                pi_return := 111; 
+            WHEN 2 THEN 
+                pi_return := 222; 
+            WHEN 3 THEN 
+                pi_return := 333; 
+            WHEN 6 THEN 
+                pi_return := 444; 
+            WHEN 7 THEN 
+                pi_return := 555; 
+            WHEN 8 THEN 
+                pi_return := 666; 
+            WHEN 9 THEN 
+                pi_return := 777; 
+            WHEN 10 THEN 
+                pi_return := 888; 
+            ELSE 
+                pi_return := 999; 
+        END CASE; 
+        raise info 'pi_return : %',pi_return ; 
+END; 
+/
+
+CALL proc_case_branch(3,0);
+
+-- Delete the stored procedure:
+DROP PROCEDURE proc_case_branch;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0539.html b/docs/dws/dev/dws_04_0539.html new file mode 100644 index 00000000..820e895b --- /dev/null +++ b/docs/dws/dev/dws_04_0539.html @@ -0,0 +1,33 @@ + + +

NULL Statements

+

In PL/SQL programs, NULL statements are used to indicate "nothing should be done", equal to placeholders. They grant meanings to some statements and improve program readability.

+

Syntax

The following shows example use of NULL statements.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
DECLARE
+    ...
+BEGIN
+    ...
+    IF v_num IS NULL THEN
+        NULL; --No data needs to be processed.
+    END IF;
+END;
+/
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0540.html b/docs/dws/dev/dws_04_0540.html new file mode 100644 index 00000000..00ed6d80 --- /dev/null +++ b/docs/dws/dev/dws_04_0540.html @@ -0,0 +1,183 @@ + + +

Error Trapping Statements

+
By default, any error occurring in a PL/SQL function aborts execution of the function, and indeed of the surrounding transaction as well. You can trap errors and restore from them by using a BEGIN block with an EXCEPTION clause. The syntax is an extension of the normal syntax for a BEGIN block:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
[<<label>>]
+[DECLARE
+    declarations]
+BEGIN
+    statements
+EXCEPTION
+    WHEN condition [OR condition ...] THEN
+        handler_statements
+    [WHEN condition [OR condition ...] THEN
+        handler_statements
+    ...]
+END;
+
+ +
+
+

If no error occurs, this form of block simply executes all the statements, and then control passes to the next statement after END. But if an error occurs within the statements, further processing of the statements is abandoned, and control passes to the EXCEPTION list. The list is searched for the first condition matching the error that occurred. If a match is found, the corresponding handler_statements are executed, and then control passes to the next statement after END. If no match is found, the error propagates out as though the EXCEPTION clause were not there at all:

+

The error can be caught by an enclosing block with EXCEPTION, or if there is none it aborts processing of the function.

+

The condition names can be any of those shown in GaussDB(DWS) Error Code Reference. The special condition name OTHERS matches every error type except QUERY_CANCELED.

+

If a new error occurs within the selected handler_statements, it cannot be caught by this EXCEPTION clause, but is propagated out. A surrounding EXCEPTION clause could catch it.

+

When an error is caught by an EXCEPTION clause, the local variables of the PL/SQL function remain as they were when the error occurred, but all changes to persistent database state within the block are rolled back.

+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
CREATE TABLE mytab(id INT,firstname VARCHAR(20),lastname VARCHAR(20)) DISTRIBUTE BY hash(id);
+
+INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');
+
+CREATE FUNCTION fun_exp() RETURNS INT
+AS $$
+DECLARE
+    x INT :=0;
+    y INT;
+BEGIN
+    UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
+    x := x + 1;
+    y := x / 0;
+EXCEPTION
+    WHEN division_by_zero THEN
+        RAISE NOTICE 'caught division_by_zero';
+        RETURN x;
+END;$$
+LANGUAGE plpgsql;
+
+call fun_exp();
+NOTICE:  caught division_by_zero
+ fun_exp 
+---------
+       1
+(1 row)
+
+select * from mytab;
+ id | firstname | lastname 
+----+-----------+----------
+    | Tom       | Jones
+(1 row)
+
+DROP FUNCTION fun_exp();
+DROP TABLE mytab;
+
+ +
+

When control reaches the assignment to y, it will fail with a division_by_zero error. This will be caught by the EXCEPTION clause. The value returned in the RETURN statement will be the incremented value of x.

+

A block containing an EXCEPTION clause is more expensive to enter and exit than a block without one. Therefore, do not use EXCEPTION without need.

+

In the following scenario, an exception cannot be caught, and the entire transaction rolls back. The threads of the nodes participating the stored procedure exit abnormally due to node failure and network fault, or the source data is inconsistent with that of the table structure of the target table during the COPY FROM operation.

+
+

Example: Exceptions with UPDATE/INSERT

+

This example uses exception handling to perform either UPDATE or INSERT, as appropriate:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
CREATE TABLE db (a INT, b TEXT);
+
+CREATE FUNCTION merge_db(key INT, data TEXT) RETURNS VOID AS
+$$
+BEGIN
+    LOOP
+
+-- Try updating the key:
+        UPDATE db SET b = data WHERE a = key;
+        IF found THEN
+            RETURN;
+        END IF;
+-- Not there, so try to insert the key. If someone else inserts the same key concurrently, we could get a unique-key failure.
+        BEGIN
+            INSERT INTO db(a,b) VALUES (key, data);
+            RETURN;
+        EXCEPTION WHEN unique_violation THEN
+        -- Loop to try the UPDATE again:
+        END;
+     END LOOP;
+END;
+$$
+LANGUAGE plpgsql;
+
+SELECT merge_db(1, 'david');
+SELECT merge_db(1, 'dennis');
+
+-- Delete FUNCTION and TABLE:
+DROP FUNCTION merge_db;
+DROP TABLE db ;
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0541.html b/docs/dws/dev/dws_04_0541.html new file mode 100644 index 00000000..d821cbcb --- /dev/null +++ b/docs/dws/dev/dws_04_0541.html @@ -0,0 +1,179 @@ + + +

GOTO Statements

+

The GOTO statement unconditionally transfers the control from the current statement to a labeled statement. The GOTO statement changes the execution logic. Therefore, use this statement only when necessary. Alternatively, you can use the EXCEPTION statement to handle issues in special scenarios. To run the GOTO statement, the labeled statement must be unique.

+

Syntax

label declaration ::=

+
+

+

goto statement ::=

+

+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
CREATE OR REPLACE PROCEDURE GOTO_test()
+AS 
+DECLARE
+    v1  int;
+BEGIN
+    v1  := 0;
+        LOOP
+        EXIT WHEN v1 > 100;
+                v1 := v1 + 2;
+                if v1 > 25 THEN
+                        GOTO pos1;
+                END IF;
+        END LOOP;
+<<pos1>>
+v1 := v1 + 10;
+raise info 'v1 is %. ', v1;
+END;
+/
+
+call GOTO_test();
+DROP PROCEDURE GOTO_test(); 
+
+ +
+
+

Constraints

The GOTO statement has the following constraints:

+
+
  • The GOTO statement does not allow multiple labeled statements even if they are in different blocks.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    BEGIN
    +  GOTO pos1; 
    +  <<pos1>>
    +  SELECT * FROM ...
    +  <<pos1>>
    +  UPDATE t1 SET ...
    +END;
    +
    + +
    +
+
  • The GOTO statement cannot transfer control to the IF, CASE, or LOOP statement.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    BEGIN
    +   GOTO pos1; 
    +   IF valid THEN
    +     <<pos1>>
    +     SELECT * FROM ...
    +   END IF;
    + END;
    +
    + +
    +
+
  • The GOTO statement cannot transfer control from one IF clause to another, or from one WHEN clause in the CASE statement to another.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    BEGIN 
    +   IF valid THEN
    +     GOTO pos1;
    +     SELECT * FROM ...
    +   ELSE
    +     <<pos1>>
    +     UPDATE t1 SET ...
    +   END IF;
    + END;
    +
    + +
    +
+
  • The GOTO statement cannot transfer control from an outer block to an inner BEGIN-END block.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    BEGIN
    +   GOTO pos1;  
    +   BEGIN
    +     <<pos1>>
    +     UPDATE t1 SET ...
    +   END;
    + END;
    +
    + +
    +
+
  • The GOTO statement cannot transfer control from an EXCEPTION block to the current BEGIN-END block but can transfer to an outer BEGIN-END block.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    BEGIN
    +   <<pos1>>
    +   UPDATE t1 SET ...
    +   EXCEPTION
    +     WHEN condition THEN
    +        GOTO pos1;
    + END;
    +
    + +
    +
+
  • If the labeled statement in the GOTO statement does not exist, you need to add the NULL statement.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    DECLARE
    +   done  BOOLEAN;
    +BEGIN
    +   FOR i IN 1..50 LOOP
    +      IF done THEN
    +         GOTO end_loop;
    +      END IF;
    +      <<end_loop>>  -- not allowed unless an executable statement follows
    +      NULL; -- add NULL statement to avoid error
    +   END LOOP;  -- raises an error without the previous NULL
    +END;
    +/
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0542.html b/docs/dws/dev/dws_04_0542.html new file mode 100644 index 00000000..61304b26 --- /dev/null +++ b/docs/dws/dev/dws_04_0542.html @@ -0,0 +1,17 @@ + + +

Other Statements

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0543.html b/docs/dws/dev/dws_04_0543.html new file mode 100644 index 00000000..c721d750 --- /dev/null +++ b/docs/dws/dev/dws_04_0543.html @@ -0,0 +1,11 @@ + + +

Lock Operations

+

GaussDB(DWS) provides multiple lock modes to control concurrent accesses to table data. These modes are used when Multi-Version Concurrency Control (MVCC) cannot give expected behaviors. Alike, most GaussDB(DWS) commands automatically apply appropriate locks to ensure that called tables are not deleted or modified in an incompatible manner during command execution. For example, when concurrent operations exist, ALTER TABLE cannot be executed on the same table.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0544.html b/docs/dws/dev/dws_04_0544.html new file mode 100644 index 00000000..fd6f57e0 --- /dev/null +++ b/docs/dws/dev/dws_04_0544.html @@ -0,0 +1,13 @@ + + +

Cursor Operations

+

GaussDB(DWS) provides cursors as a data buffer for users to store execution results of SQL statements. Each cursor region has a name. Users can use SQL statements to obtain records one by one from cursors and grant them to master variables, then being processed further by host languages.

+

Cursor operations include cursor definition, open, fetch, and close operations.

+

For the complete example of cursor operations, see Explicit Cursor.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0545.html b/docs/dws/dev/dws_04_0545.html new file mode 100644 index 00000000..523e22cf --- /dev/null +++ b/docs/dws/dev/dws_04_0545.html @@ -0,0 +1,21 @@ + + +

Cursors

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0546.html b/docs/dws/dev/dws_04_0546.html new file mode 100644 index 00000000..2ce039d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0546.html @@ -0,0 +1,39 @@ + + +

Overview

+

To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers to context areas. With cursors, stored procedures can control alterations in context areas.

+

If JDBC is used to call a stored procedure whose returned value is a cursor, the returned cursor is not available.

+
+

Cursors are classified into explicit cursors and implicit cursors. Table 1 shows the usage conditions of explicit and implicit cursors for different SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 1 Cursor usage conditions

SQL Statement

+

Cursor

+

Non-query statements

+

Implicit

+

Query statements with single-line results

+

Implicit or explicit

+

Query statements with multi-line results

+

Explicit

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0547.html b/docs/dws/dev/dws_04_0547.html new file mode 100644 index 00000000..0b05a601 --- /dev/null +++ b/docs/dws/dev/dws_04_0547.html @@ -0,0 +1,243 @@ + + +

Explicit Cursor

+

An explicit cursor is used to process query statements, particularly when the query results contain multiple records.

+

Procedure

An explicit cursor performs the following six PL/SQL steps to process query statements:

+
  1. Define a static cursor: Define a cursor name and its corresponding SELECT statement.

    Figure 1 shows the syntax diagram for defining a static cursor.

    +
    Figure 1 static_cursor_define::=
    +

    Parameter description:

    +
    • cursor_name: defines a cursor name.
    • parameter: specifies cursor parameters. Only input parameters are allowed in the following format:
      parameter_name datatype
      +
    • select_statement: specifies a query statement.
    +

    The system automatically determines whether the cursor can be used for backward fetches based on the execution plan.

    +
    +

    Define a dynamic cursor: Define a ref cursor, which means that the cursor can be opened dynamically by a set of static SQL statements. Define the type of the ref cursor first and then the cursor variable of this cursor type. Dynamically bind a SELECT statement through OPEN FOR when the cursor is opened.

    +

    Figure 2 and Figure 3 show the syntax diagrams for defining a dynamic cursor.

    +
    Figure 2 cursor_typename::=
    +

    GaussDB(DWS) supports the dynamic cursor type sys_refcursor. A function or stored procedure can use the sys_refcursor parameter to pass on or pass out the cursor result set. A function can return sys_refcursor to return the cursor result set.

    +
    Figure 3 dynamic_cursor_define::=
    +

  2. Open the static cursor: Execute the SELECT statement corresponding to the cursor. The query result is placed in the work area and the pointer directs to the head of the work area to identify the cursor result set. If the cursor query statement contains the FOR UPDATE option, the OPEN statement locks the data row corresponding to the cursor result set in the database table.

    Figure 4 shows the syntax diagram for opening a static cursor.

    +
    Figure 4 open_static_cursor::=
    +

    Open the dynamic cursor: Use the OPEN FOR statement to open the dynamic cursor and the SQL statement is dynamically bound.

    +

    Figure 5 shows the syntax diagram for opening a dynamic cursor.

    +
    Figure 5 open_dynamic_cursor::=
    +

    A PL/SQL program cannot use the OPEN statement to repeatedly open a cursor.

    +

  3. Fetch cursor data: Retrieve data rows in the result set and place them in specified output variables.

    Figure 6 shows the syntax diagram for fetching cursor data.

    +
    Figure 6 fetch_cursor::=
    +

  4. Process the record.
  5. Continue to process until the active set has no record.
  6. Close the cursor: When fetching and finishing the data in the cursor result set, close the cursor immediately to release system resources used by the cursor and invalidate the work area of the cursor so that the FETCH statement cannot be used to fetch data any more. A closed cursor can be reopened using the OPEN statement.

    Figure 7 shows the syntax diagram for closing a cursor.

    +
    Figure 7 close_cursor::=
    +

+
+

Attributes

Cursor attributes are used to control program procedures or learn about program status. When a DML statement is executed, the PL/SQL opens a built-in cursor and processes its result. A cursor is a memory segment for maintaining query results. It is opened when a DML statement is executed and closed when the execution is finished. An explicit cursor has the following attributes:

+
  • %FOUND: Boolean attribute, which returns TRUE if the last fetch returns a row.
  • %NOTFOUND: Boolean attribute, which works opposite to the %FOUND attribute.
  • %ISOPEN: Boolean attribute, which returns TRUE if the cursor has been opened.
  • %ROWCOUNT: numeric attribute, which returns the number of records fetched from the cursor.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
-- Specify the method for passing cursor parameters:
+CREATE OR REPLACE PROCEDURE cursor_proc1()
+AS 
+DECLARE
+    DEPT_NAME VARCHAR(100);
+    DEPT_LOC NUMBER(4);
+    -- Define a cursor:
+    CURSOR C1 IS 
+        SELECT section_name, place_id FROM sections WHERE section_id <= 50;
+    CURSOR C2(sect_id INTEGER) IS
+        SELECT section_name, place_id FROM sections WHERE section_id <= sect_id;
+    TYPE CURSOR_TYPE IS REF CURSOR;
+    C3 CURSOR_TYPE;
+    SQL_STR VARCHAR(100);
+BEGIN
+    OPEN C1;-- Open the cursor:
+    LOOP
+        -- Fetch data from the cursor:
+        FETCH C1 INTO DEPT_NAME, DEPT_LOC;
+        EXIT WHEN C1%NOTFOUND;
+        DBMS_OUTPUT.PUT_LINE(DEPT_NAME||'---'||DEPT_LOC);
+    END LOOP;
+    CLOSE C1;-- Close the cursor.
+
+    OPEN C2(10);
+    LOOP
+        FETCH C2 INTO DEPT_NAME, DEPT_LOC;
+        EXIT WHEN C2%NOTFOUND;
+        DBMS_OUTPUT.PUT_LINE(DEPT_NAME||'---'||DEPT_LOC);
+    END LOOP;
+    CLOSE C2;
+    
+    SQL_STR := 'SELECT section_name, place_id FROM sections WHERE section_id <= :DEPT_NO;';
+    OPEN C3 FOR SQL_STR USING 50;
+    LOOP
+        FETCH C3 INTO DEPT_NAME, DEPT_LOC;
+        EXIT WHEN C3%NOTFOUND;
+        DBMS_OUTPUT.PUT_LINE(DEPT_NAME||'---'||DEPT_LOC);
+    END LOOP;
+    CLOSE C3;
+END;
+/
+
+CALL cursor_proc1();
+
+DROP PROCEDURE cursor_proc1;
+
+ +
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
-- Increase the salary of employees whose salary is lower than CNY3000 by CNY500:
+CREATE TABLE staffs_t1 AS TABLE staffs;
+
+CREATE OR REPLACE PROCEDURE cursor_proc2()
+AS 
+DECLARE
+   V_EMPNO  NUMBER(6);
+   V_SAL    NUMBER(8,2);
+   CURSOR C IS SELECT staff_id, salary FROM staffs_t1; 
+BEGIN
+   OPEN C;
+   LOOP
+      FETCH C INTO V_EMPNO, V_SAL;
+      EXIT WHEN C%NOTFOUND; 
+      IF V_SAL<=3000 THEN
+            UPDATE staffs_t1 SET salary =salary + 500 WHERE staff_id = V_EMPNO;
+      END IF;
+   END LOOP;
+   CLOSE C;
+END; 
+/
+
+CALL cursor_proc2();
+
+-- Drop the stored procedure:
+DROP PROCEDURE cursor_proc2;
+DROP TABLE staffs_t1;
+
+ +
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
-- Use function parameters of the SYS_REFCURSOR type:
+CREATE OR REPLACE PROCEDURE proc_sys_ref(O OUT SYS_REFCURSOR)
+IS 
+C1 SYS_REFCURSOR; 
+BEGIN 
+OPEN C1 FOR SELECT section_ID FROM sections ORDER BY section_ID; 
+O := C1; 
+END; 
+/
+
+DECLARE 
+C1 SYS_REFCURSOR; 
+TEMP NUMBER(4); 
+BEGIN 
+proc_sys_ref(C1); 
+LOOP 
+  FETCH C1 INTO TEMP; 
+  DBMS_OUTPUT.PUT_LINE(C1%ROWCOUNT);
+  EXIT WHEN C1%NOTFOUND; 
+END LOOP;  
+END; 
+/
+
+-- Drop the stored procedure:
+DROP PROCEDURE proc_sys_ref;
+
+ +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0548.html b/docs/dws/dev/dws_04_0548.html new file mode 100644 index 00000000..c5088d20 --- /dev/null +++ b/docs/dws/dev/dws_04_0548.html @@ -0,0 +1,68 @@ + + +

Implicit Cursor

+

The system automatically sets implicit cursors for non-query statements, such as ALTER and DROP, and creates work areas for these statements. These implicit cursors are named SQL, which is defined by the system.

+

Overview

Implicit cursor operations, such as definition, opening, value-grant, and closing, are automatically performed by the system. Users can use only the attributes of implicit cursors to complete operations. The data stored in the work area of an implicit cursor is the latest SQL statement, and is not related to the user-defined explicit cursors.

+

Format call: SQL%

+

INSERT, UPDATE, DROP, and SELECT statements do not require defined cursors.

+
+
+

Attributes

An implicit cursor has the following attributes:

+
  • SQL%FOUND: Boolean attribute, which returns TRUE if the last fetch returns a row.
  • SQL%NOTFOUND: Boolean attribute, which works opposite to the SQL%FOUND attribute.
  • SQL%ROWCOUNT: numeric attribute, which returns the number of records fetched from the cursor.
  • SQL%ISOPEN: Boolean attribute, whose value is always FALSE. Close implicit cursors immediately after an SQL statement is executed.
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
-- Delete all employees in a department from the EMP table. If the department has no employees, delete the department from the DEPT table.
+CREATE TABLE staffs_t1 AS TABLE staffs;
+CREATE TABLE sections_t1 AS TABLE sections;
+
+CREATE OR REPLACE PROCEDURE proc_cursor3() 
+AS 
+    DECLARE
+    V_DEPTNO NUMBER(4) := 100;
+    BEGIN
+        DELETE FROM staffs WHERE section_ID = V_DEPTNO;
+        -- Proceed based on cursor status:
+        IF SQL%NOTFOUND THEN
+        DELETE FROM sections_t1 WHERE section_ID = V_DEPTNO;
+        END IF;
+    END;
+/
+
+CALL proc_cursor3();
+
+-- Drop the stored procedure and the temporary table:
+DROP PROCEDURE proc_cursor3;
+DROP TABLE staffs_t1;
+DROP TABLE sections_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0549.html b/docs/dws/dev/dws_04_0549.html new file mode 100644 index 00000000..99672ebf --- /dev/null +++ b/docs/dws/dev/dws_04_0549.html @@ -0,0 +1,98 @@ + + +

Cursor Loop

+

The use of cursors in WHILE and LOOP statements is called a cursor loop. Generally, OPEN, FETCH, and CLOSE statements are needed in cursor loop. The following describes a loop that is applicable to a static cursor loop without executing the four steps of a static cursor.

+

Syntax

Figure 1 shows the syntax diagram for the FOR AS loop.

+
Figure 1 FOR_AS_loop::=
+
+

Precautions

  • The UPDATE operation for the queried table is not allowed in the loop statement.
  • The variable loop_name is automatically defined and is valid only in this loop. The type and value of loop_name are the same as those of the query result of select_statement.
+
+
  • The %FOUND, %NOTFOUND, and %ROWCOUNT attributes access the same internal variable in GaussDB(DWS). Transactions and anonymous blocks cannot be accessed by multiple cursors at the same time.
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
BEGIN
+FOR ROW_TRANS IN 
+        SELECT first_name FROM staffs 
+    LOOP 
+        DBMS_OUTPUT.PUT_LINE (ROW_TRANS.first_name );
+    END LOOP;
+END;
+/
+
+-- Create a table:
+CREATE TABLE integerTable1( A INTEGER) DISTRIBUTE BY hash(A);
+CREATE TABLE integerTable2( B INTEGER) DISTRIBUTE BY hash(B);
+INSERT INTO integerTable2 VALUES(2);
+
+-- Multiple cursors share the parameters of cursor attributes:
+DECLARE
+   CURSOR C1 IS SELECT A FROM integerTable1;--Declare the cursor.
+   CURSOR C2 IS SELECT B FROM integerTable2;
+   PI_A INTEGER;
+   PI_B INTEGER;
+BEGIN
+    OPEN C1;-- Open the cursor.
+   OPEN C2;
+   FETCH C1 INTO PI_A; ----  The value of C1%FOUND and C2%FOUND is FALSE.
+   FETCH C2 INTO PI_B; ----  The value of C1%FOUND and C2%FOUND is TRUE.
+-- Determine the cursor status:
+   IF C1%FOUND THEN
+       IF C2%FOUND THEN
+         DBMS_OUTPUT.PUT_LINE('Dual cursor share paremeter.');
+      END IF;
+   END IF;
+    CLOSE C1;-- Close the cursor.
+   CLOSE C2;
+END;
+/
+
+-- Drop the temporary table:
+DROP TABLE integerTable1;
+DROP TABLE integerTable2;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0550.html b/docs/dws/dev/dws_04_0550.html new file mode 100644 index 00000000..e35d8f69 --- /dev/null +++ b/docs/dws/dev/dws_04_0550.html @@ -0,0 +1,25 @@ + + +

Advanced Packages

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0551.html b/docs/dws/dev/dws_04_0551.html new file mode 100644 index 00000000..1a05ce68 --- /dev/null +++ b/docs/dws/dev/dws_04_0551.html @@ -0,0 +1,870 @@ + + +

DBMS_LOB

+

Related Interfaces

Table 1 provides all interfaces supported by the DBMS_LOB package.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBMS_LOB

API

+

Description

+

DBMS_LOB.GETLENGTH

+

Obtains and returns the specified length of a LOB object.

+

DBMS_LOB.OPEN

+

Opens a LOB and returns a LOB descriptor.

+

DBMS_LOB.READ

+

Loads a part of LOB contents to BUFFER area according to the specified length and initial position offset.

+

DBMS_LOB.WRITE

+

Copies contents in BUFFER area to LOB according to the specified length and initial position offset.

+

DBMS_LOB.WRITEAPPEND

+

Copies contents in BUFFER area to the end part of LOB according to the specified length.

+

DBMS_LOB.COPY

+

Copies contents in BLOB to another BLOB according to the specified length and initial position offset.

+

DBMS_LOB.ERASE

+

Deletes contents in BLOB according to the specified length and initial position offset.

+

DBMS_LOB.CLOSE

+

Closes a LOB descriptor.

+

DBMS_LOB.INSTR

+

Returns the position of the Nth occurrence of a character string in LOB.

+

DBMS_LOB.COMPARE

+

Compares two LOBs or a certain part of two LOBs.

+

DBMS_LOB.SUBSTR

+

Reads the substring of a LOB and returns the number of read bytes or the number of characters.

+

DBMS_LOB.TRIM

+

Truncates the LOB of a specified length. After the execution is complete, the length of the LOB is set to the length specified by the newlen parameter.

+

DBMS_LOB.CREATETEMPORARY

+

Creates a temporary BLOB or CLOB.

+

DBMS_LOB.APPEND

+

Adds the content of a LOB to another LOB.

+
+
+
  • DBMS_LOB.GETLENGTH

    Specifies the length of a LOB type object obtained and returned by the stored procedure GETLENGTH.

    +

    The function prototype of DBMS_LOB.GETLENGTH is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_LOB.GETLENGTH (
    +lob_loc    IN   BLOB)
    +RETURN INTEGER;
    +
    +DBMS_LOB.GETLENGTH (
    +lob_loc    IN   CLOB)
    +RETURN INTEGER;
    +
    + +
    + +
    + + + + + + + +
    Table 2 DBMS_LOB.GETLENGTH interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB type object whose length is to be obtained

    +
    +
    +
  • DBMS_LOB.OPEN

    A stored procedure opens a LOB and returns a LOB descriptor. This process is used only for compatibility.

    +

    The function prototype of DBMS_LOB.OPEN is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_LOB.LOB (
    +lob_loc INOUT BLOB,
    +open_mode IN BINARY_INTEGER);
    +
    +DBMS_LOB.LOB (
    +lob_loc INOUT CLOB,
    +open_mode IN BINARY_INTEGER);
    +
    + +
    + +
    + + + + + + + + + + +
    Table 3 DBMS_LOB.OPEN interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    BLOB or CLOB descriptor that is opened

    +

    open_mode IN BINARY_INTEGER

    +

    Open mode (currently, DBMS_LOB.LOB_READWRITE is supported)

    +
    +
    +
  • DBMS_LOB.READ

    The stored procedure READ loads a part of LOB contents to BUFFER according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.READ is:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    DBMS_LOB.READ (
    +lob_loc     IN           BLOB,
    +amount      IN           INTEGER,
    +offset      IN           INTEGER,
    +buffer      OUT          RAW);
    +
    +DBMS_LOB.READ (
    +lob_loc    IN            CLOB,
    +amount     IN OUT        INTEGER,
    +offset     IN            INTEGER,
    +buffer     OUT           VARCHAR2);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    Table 4 DBMS_LOB.READ interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB type object to be loaded

    +

    amount

    +

    Load data length

    +
    NOTE:

    If the read length is negative, the error message "ERROR: argument 2 is null, invalid, or out of range." is displayed.

    +
    +

    offset

    +

    Indicates where to start reading the LOB contents, that is, the offset bytes to initial position of LOB contents.

    +

    buffer

    +

    Target buffer to store the loaded LOB contents

    +
    +
    +
  • DBMS_LOB.WRITE

    The stored procedure WRITE copies contents in BUFFER to LOB variables according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.WRITE is:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    DBMS_LOB.WRITE (
    +lob_loc    IN OUT     BLOB,
    +amount     IN         INTEGER,
    +offset     IN         INTEGER,
    +buffer     IN         RAW);
    +
    +DBMS_LOB.WRITE (
    +lob_loc   IN OUT      CLOB,
    +amount    IN          INTEGER,
    +offset    IN          INTEGER,
    +buffer    IN          VARCHAR2);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    Table 5 DBMS_LOB.WRITE interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB type object to be written

    +

    amount

    +

    Write data length

    +
    NOTE:

    If the write data is shorter than 1 or longer than the contents to be written, an error is reported.

    +
    +

    offset

    +

    Indicates where to start writing the LOB contents, that is, the offset bytes to initial position of LOB contents.

    +
    NOTE:

    If the offset is shorter than 1 or longer than the maximum length of LOB type contents, an error is reported.

    +
    +

    buffer

    +

    Content to be written

    +
    +
    +
  • DBMS_LOB.WRITEAPPEND

    The stored procedure WRITEAPPEND copies contents in BUFFER to the end part of LOB according to the specified length.

    +

    The function prototype of DBMS_LOB.WRITEAPPEND is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    DBMS_LOB.WRITEAPPEND (
    +lob_loc     IN OUT     BLOB,
    +amount      IN         INTEGER,
    +buffer      IN         RAW);
    +
    +DBMS_LOB.WRITEAPPEND (
    +lob_loc     IN OUT     CLOB,
    +amount      IN         INTEGER,
    +buffer      IN         VARCHAR2);
    +
    + +
    + +
    + + + + + + + + + + + + + +
    Table 6 DBMS_LOB.WRITEAPPEND interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB type object to be written

    +

    amount

    +

    Write data length

    +
    NOTE:

    If the write data is shorter than 1 or longer than the contents to be written, an error is reported.

    +
    +

    buffer

    +

    Content to be written

    +
    +
    +
  • DBMS_LOB.COPY

    The stored procedure COPY copies contents in BLOB to another BLOB according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.COPY is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_LOB.COPY (
    +dest_lob      IN OUT     BLOB,
    +src_lob       IN         BLOB,
    +amount        IN         INTEGER,
    +dest_offset   IN         INTEGER  DEFAULT 1,
    +src_offset    IN         INTEGER  DEFAULT 1);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 7 DBMS_LOB.COPY interface parameters

    Parameter

    +

    Description

    +

    dest_lob

    +

    BLOB type object to be pasted

    +

    src_lob

    +

    BLOB type object to be copied

    +

    amount

    +

    Length of the copied data

    +
    NOTE:

    If the copied data is shorter than 1 or longer than the maximum length of BLOB type contents, an error is reported.

    +
    +

    dest_offset

    +

    Indicates where to start pasting the BLOB contents, that is, the offset bytes to initial position of BLOB contents.

    +
    NOTE:

    If the offset is shorter than 1 or longer than the maximum length of BLOB type contents, an error is reported.

    +
    +

    src_offset

    +

    Indicates where to start copying the BLOB contents, that is, the offset bytes to initial position of BLOB contents.

    +
    NOTE:

    If the offset is shorter than 1 or longer than the length of source BLOB, an error is reported.

    +
    +
    +
    +
  • DBMS_LOB.ERASE

    The stored procedure ERASE deletes contents in BLOB according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.ERASE is:

    +
    1
    +2
    +3
    +4
    DBMS_LOB.ERASE (
    +lob_loc          IN OUT   BLOB,
    +amount           IN OUT   INTEGER,
    +offset           IN       INTEGER DEFAULT 1);
    +
    + +
    + +
    + + + + + + + + + + + + + +
    Table 8 DBMS_LOB.ERASE interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    BLOB type object whose contents are to be deleted

    +

    amount

    +

    Length of contents to be deleted

    +
    NOTE:

    If the deleted data is shorter than 1 or longer than the maximum length of BLOB type contents, an error is reported.

    +
    +

    offset

    +

    Indicates where to start deleting the BLOB contents, that is, the offset bytes to initial position of BLOB contents.

    +
    NOTE:

    If the offset is shorter than 1 or longer than the maximum length of BLOB type contents, an error is reported.

    +
    +
    +
    +
  • DBMS_LOB.CLOSE

    The procedure CLOSE disables the enabled contents of LOB according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.CLOSE is:

    +
    1
    +2
    +3
    +4
    +5
    DBMS_LOB.CLOSE(
    +src_lob       IN              BLOB);
    +
    +DBMS_LOB.CLOSE (
    +src_lob      IN               CLOB);
    +
    + +
    + +
    + + + + + + + +
    Table 9 DBMS_LOB.CLOSE interface parameters

    Parameter

    +

    Description

    +

    src_loc

    +

    LOB type object to be disabled

    +
    +
    +
  • DBMS_LOB.INSTR

    This function returns the Nth occurrence position in LOB. If invalid values are entered, NULL is returned. The invalid values include offset < 1 or offset > LOBMAXSIZE, nth < 1, and nth > LOBMAXSIZE.

    +

    The function prototype of DBMS_LOB.INSTR is:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    DBMS_LOB.INSTR (
    +lob_loc     IN     BLOB,
    +pattern     IN     RAW,
    +offset      IN     INTEGER := 1,
    +nth         IN     INTEGER := 1)
    +RETURN INTEGER;
    +
    +DBMS_LOB.INSTR (
    +lob_loc    IN     CLOB,
    +pattern    IN     VARCHAR2 ,
    +offset     IN     INTEGER := 1,
    +nth        IN     INTEGER := 1)
    +RETURN INTEGER;
    +
    + +
    + +
    + + + + + + + + + + + + + + + + +
    Table 10 DBMS_LOB.INSTR interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB descriptor to be searched for

    +

    pattern

    +

    Matched pattern. It is RAW for BLOB and TEXT for CLOB.

    +

    offset

    +

    For BLOB, the absolute offset is in the unit of byte. For CLOB, the offset is in the unit of character. The matching start position is 1.

    +

    nth

    +

    Number of pattern matching times. The minimum value is 1.

    +
    +
    +
  • DBMS_LOB.COMPARE

    This function compares two LOBs or a certain part of two LOBs.

    +
    • If the two parts are equal, 0 is returned. Otherwise, a non-zero value is returned.
    • If the first CLOB is smaller than the second, -1 is returned. If the first CLOB is larger than the second, 1 is returned.
    • If any of the amount, offset_1, and offset_2 parameters is invalid, NULL is returned. The valid offset range is 1 to LOBMAXSIZE.
    +

    The function prototype of DBMS_LOB.READ is:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    DBMS_LOB.COMPARE (
    +lob_1     IN     BLOB,
    +lob_2     IN     BLOB,
    +amount    IN     INTEGER := DBMS_LOB.LOBMAXSIZE,
    +offset_1  IN     INTEGER := 1,
    +offset_2  IN     INTEGER := 1)
    +RETURN INTEGER;
    +
    +DBMS_LOB.COMPARE (
    +lob_1     IN     CLOB,
    +lob_2     IN     CLOB,
    +amount    IN     INTEGER := DBMS_LOB.LOBMAXSIZE,
    +offset_1  IN     INTEGER := 1,
    +offset_2  IN     INTEGER := 1)
    +RETURN INTEGER;
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    Table 11 DBMS_LOB.COMPARE interface parameters

    Parameter

    +

    Description

    +

    lob_1

    +

    First LOB descriptor to be compared

    +

    lob_2

    +

    Second LOB descriptor to be compared

    +

    amount

    +

    Number of characters or bytes to be compared. The maximum value is DBMS_LOB.LOBMAXSIZE.

    +

    offset_1

    +

    Offset of the first LOB descriptor. The initial position is 1.

    +

    offset_2

    +

    Offset of the second LOB descriptor. The initial position is 1.

    +
    +
    +
    +
  • DBMS_LOB.SUBSTR

    This function reads the substring of a LOB and returns the number of read bytes or the number of characters. If amount > 1, amount < 32767, offset < 1, or offset > LOBMAXSIZE, NULL is returned.

    +

    The function prototype of DBMS_LOB.SUBSTR is:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    DBMS_LOB.SUBSTR (
    +lob_loc     IN     BLOB,
    +amount      IN     INTEGER := 32767,
    +offset      IN     INTEGER := 1)
    +RETURN RAW;
    +
    +DBMS_LOB.SUBSTR (
    +lob_loc    IN     CLOB,
    +amount     IN     INTEGER := 32767,
    +offset     IN     INTEGER := 1)
    +RETURN VARCHAR2;
    +
    + +
    + +
    + + + + + + + + + + + + + +
    Table 12 DBMS_LOB.SUBSTR interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB descriptor of the substring to be read. For BLOB, the return value is the number of read bytes. For CLOB, the return value is the number of characters.

    +

    offset

    +

    Number of bytes or characters to be read.

    +

    buffer

    +

    Number of characters or bytes offset from the start position.

    +
    +
    +
  • DBMS_LOB.TRIM

    This stored procedure truncates the LOB of a specified length. After this stored procedure is executed, the length of the LOB is set to the length specified by the newlen parameter. If an empty LOB is truncated, no execution result is displayed. If the specified length is longer than the length of LOB, an exception occurs.

    +

    The function prototype of DBMS_LOB.TRIM is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_LOB.TRIM (
    +lob_loc     IN OUT     BLOB,
    +newlen      IN         INTEGER);
    +
    +DBMS_LOB.TRIM (
    +lob_loc    IN          OUT CLOB,
    +newlen     IN          INTEGER);
    +
    + +
    + +
    + + + + + + + + + + +
    Table 13 DBMS_LOB.TRIM interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    BLOB type object to be read

    +

    newlen

    +

    After truncation, the new LOB length for BLOB is in the unit of byte and that for CLOB is in the unit of character.

    +
    +
    +
  • DBMS_LOB.CREATETEMPORARY

    This stored procedure creates a temporary BLOB or CLOB and is used only for syntax compatibility.

    +

    The function prototype of DBMS_LOB.CREATETEMPORARY is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    DBMS_LOB.CREATETEMPORARY (
    +lob_loc    IN OUT      BLOB,
    +cache      IN          BOOLEAN,
    +dur        IN          INTEGER);
    +
    +DBMS_LOB.CREATETEMPORARY (
    +lob_loc    IN OUT     CLOB,
    +cache      IN         BOOLEAN,
    +dur        IN         INTEGER);
    +
    + +
    + +
    + + + + + + + + + + + + + +
    Table 14 DBMS_LOB.CREATETEMPORARY interface parameters

    Parameter

    +

    Description

    +

    lob_loc

    +

    LOB descriptor

    +

    cache

    +

    This parameter is used only for syntax compatibility.

    +

    dur

    +

    This parameter is used only for syntax compatibility.

    +
    +
    +
  • DBMS_LOB.APPEND

    The stored procedure READ loads a part of BLOB contents to BUFFER according to the specified length and initial position offset.

    +

    The function prototype of DBMS_LOB.APPEND is:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_LOB.APPEND (
    +dest_lob    IN OUT       BLOB,
    +src_lob     IN           BLOB);
    +
    +DBMS_LOB.APPEND (
    +dest_lob    IN OUT       CLOB,
    +src_lob     IN           CLOB);
    +
    + +
    + +
    + + + + + + + + + + +
    Table 15 DBMS_LOB.APPEND interface parameters

    Parameter

    +

    Description

    +

    dest_lob

    +

    LOB descriptor to be written

    +

    src_lob

    +

    LOB descriptor to be read

    +
    +
    +
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
-- Obtain the length of the character string.
+SELECT DBMS_LOB.GETLENGTH('12345678');
+
+DECLARE
+myraw  RAW(100);
+amount INTEGER :=2;
+buffer INTEGER :=1;
+begin
+DBMS_LOB.READ('123456789012345',amount,buffer,myraw);
+dbms_output.put_line(myraw);
+end;
+/
+
+CREATE TABLE blob_Table (t1 blob) DISTRIBUTE BY REPLICATION;
+CREATE TABLE blob_Table_bak (t2 blob) DISTRIBUTE BY REPLICATION;
+INSERT INTO blob_Table VALUES('abcdef');
+INSERT INTO blob_Table_bak VALUES('22222');
+
+DECLARE
+str varchar2(100) := 'abcdef';
+source raw(100);
+dest blob;
+copyto blob;
+amount int;
+PSV_SQL varchar2(100);
+PSV_SQL1 varchar2(100);
+a int :=1;
+len int;
+BEGIN
+source := utl_raw.cast_to_raw(str);
+amount := utl_raw.length(source);
+
+PSV_SQL :='select * from blob_Table for update';
+PSV_SQL1 := 'select * from blob_Table_bak for update';
+
+EXECUTE IMMEDIATE PSV_SQL into dest;
+EXECUTE IMMEDIATE PSV_SQL1 into copyto;
+
+DBMS_LOB.WRITE(dest, amount, 1, source);
+DBMS_LOB.WRITEAPPEND(dest, amount, source);
+
+DBMS_LOB.ERASE(dest, a, 1);
+DBMS_OUTPUT.PUT_LINE(a);
+DBMS_LOB.COPY(copyto, dest, amount, 10, 1);
+DBMS_LOB.CLOSE(dest);
+RETURN;
+END;
+/
+
+--Delete the table.
+DROP TABLE blob_Table;
+DROP TABLE blob_Table_bak;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0552.html b/docs/dws/dev/dws_04_0552.html new file mode 100644 index 00000000..143d4e68 --- /dev/null +++ b/docs/dws/dev/dws_04_0552.html @@ -0,0 +1,101 @@ + + +

DBMS_RANDOM

+

Related Interfaces

Table 1 provides all interfaces supported by the DBMS_RANDOM package.

+ +
+ + + + + + + + + + +
Table 1 DBMS_RANDOM interface parameters

API

+

Description

+

DBMS_RANDOM.SEED

+

Sets a seed for a random number.

+

DBMS_RANDOM.VALUE

+

Generates a random number between a specified low and a specified high.

+
+
+
  • DBMS_RANDOM.SEED

    The stored procedure SEED is used to set a seed for a random number. The DBMS_RANDOM.SEED function prototype is:

    +
    1
    DBMS_RANDOM.SEED (seed  IN  INTEGER);
    +
    + +
    + +
    + + + + + + + +
    Table 2 DBMS_RANDOM.SEED interface parameters

    Parameter

    +

    Description

    +

    seed

    +

    Generates a seed for a random number.

    +
    +
    +
+
  • DBMS_RANDOM.VALUE

    The stored procedure VALUE generates a random number between a specified low and a specified high. The DBMS_RANDOM.VALUE function prototype is:

    +
    1
    +2
    +3
    +4
    DBMS_RANDOM.VALUE(
    +low  IN  NUMBER,
    +high IN  NUMBER)
    +RETURN NUMBER;
    +
    + +
    + +
    + + + + + + + + + + +
    Table 3 DBMS_RANDOM.VALUE interface parameters

    Parameter

    +

    Description

    +

    low

    +

    Sets the low bound for a random number. The generated random number is greater than or equal to the low.

    +

    high

    +

    Sets the high bound for a random number. The generated random number is less than the high.

    +
    +
    +
+

The only requirement is that the parameter type is NUMERIC regardless of the right and left bound values.

+
+
+

Examples

+
1
+2
+3
+4
+5
-- Generate a random number between 0 and 1:
+SELECT DBMS_RANDOM.VALUE(0,1);
+
+-- Add the low and high parameters to an integer within the specified range and intercept smaller values from the result. (The maximum value cannot be a possible value.) Therefore, use the following code for an integer between 0 and 99:
+SELECT TRUNC(DBMS_RANDOM.VALUE(0,100));
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0553.html b/docs/dws/dev/dws_04_0553.html new file mode 100644 index 00000000..219f9595 --- /dev/null +++ b/docs/dws/dev/dws_04_0553.html @@ -0,0 +1,121 @@ + + +

DBMS_OUTPUT

+

Related Interfaces

Table 1 provides all interfaces supported by the DBMS_OUTPUT package.

+ +
+ + + + + + + + + + + + + +
Table 1 DBMS_OUTPUT

API

+

Description

+

DBMS_OUTPUT.PUT_LINE

+

Outputs the specified text. The text length cannot exceed 32,767 bytes.

+

DBMS_OUTPUT.PUT

+

Outputs the specified text to the front of the specified text without adding a line break. The text length cannot exceed 32,767 bytes.

+

DBMS_OUTPUT.ENABLE

+

Sets the buffer area size. If this interface is not specified, the maximum buffer size is 20,000 bytes and the minimum buffer size is 2000 bytes. If the specified buffer size is less than 2000 bytes, the default minimum buffer size is applied.

+
+
+
  • DBMS_OUTPUT.PUT_LINE
+

The PUT_LINE procedure writes a row of text carrying a line end symbol in the buffer. The DBMS_OUTPUT.PUT_LINE function prototype is:

+
1
+2
DBMS_OUTPUT.PUT_LINE (
+item IN VARCHAR2);
+
+ +
+ +
+ + + + + + + +
Table 2 DBMS_OUTPUT.PUT_LINE interface parameters

Parameter

+

Description

+

item

+

Specifies the text that was written to the buffer.

+
+
+
  • DBMS_OUTPUT.PUT
+

The stored procedure PUT outputs the specified text to the front of the specified text without adding a linefeed. The DBMS_OUTPUT.PUT function prototype is:

+
1
+2
DBMS_OUTPUT.PUT (
+item IN VARCHAR2);
+
+ +
+ +
+ + + + + + + +
Table 3 DBMS_OUTPUT.PUT interface parameters

Parameter

+

Description

+

item

+

Specifies the text that was written to the specified text.

+
+
+
  • DBMS_OUTPUT.ENABLE
+

The stored procedure ENABLE sets the output buffer size. If the size is not specified, it contains a maximum of 20,000 bytes. The DBMS_OUTPUT.ENABLE function prototype is:

+
1
+2
DBMS_OUTPUT.ENABLE (
+buf IN INTEGER);
+
+ +
+ +
+ + + + + + + +
Table 4 DBMS_OUTPUT.ENABLE interface parameters

Parameter

+

Description

+

buf

+

Sets the buffer area size.

+
+
+
+

Examples

1
+2
+3
+4
+5
+6
BEGIN
+    DBMS_OUTPUT.ENABLE(50);
+    DBMS_OUTPUT.PUT ('hello, ');
+    DBMS_OUTPUT.PUT_LINE('database!');-- Displaying "hello, database!"
+END;
+/
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0554.html b/docs/dws/dev/dws_04_0554.html new file mode 100644 index 00000000..78bceb0c --- /dev/null +++ b/docs/dws/dev/dws_04_0554.html @@ -0,0 +1,198 @@ + + +

UTL_RAW

+

Related Interfaces

Table 1 provides all interfaces supported by the UTL_RAW package.

+ +
+ + + + + + + + + + + + + + + + +
Table 1 UTL_RAW

API

+

Description

+

UTL_RAW.CAST_FROM_BINARY_INTEGER

+

Converts an INTEGER type value to a binary representation (RAW type).

+

UTL_RAW.CAST_TO_BINARY_INTEGER

+

Converts a binary representation (RAW type) to an INTEGER type value.

+

UTL_RAW.LENGTH

+

Obtains the length of the RAW type object.

+

UTL_RAW.CAST_TO_RAW

+

Converts a VARCHAR2 type value to a binary expression (RAW type).

+
+
+

The external representation of the RAW type data is hexadecimal and its internal storage form is binary. For example, the representation of the RAW type data 11001011 is 'CB'. The input of the actual type conversion is 'CB'.

+
+
  • UTL_RAW.CAST_FROM_BINARY_INTEGER

    The stored procedure CAST_FROM_BINARY_INTEGER converts an INTEGER type value to a binary representation (RAW type).

    +

    The UTL_RAW.CAST_FROM_BINARY_INTEGER function prototype is:

    +
    1
    +2
    +3
    +4
    UTL_RAW.CAST_FROM_BINARY_INTEGER (
    +n           IN  INTEGER,
    +endianess   IN  INTEGER)
    +RETURN RAW;
    +
    + +
    + +
    + + + + + + + + + + +
    Table 2 UTL_RAW.CAST_FROM_BINARY_INTEGER interface parameters

    Parameter

    +

    Description

    +

    n

    +

    Specifies the INTEGER type value to be converted to the RAW type.

    +

    endianess

    +

    Specifies the INTEGER type value 1 or 2 of the byte sequence. (1 indicates BIG_ENDIAN and 2 indicates LITTLE-ENDIAN.)

    +
    +
    +
  • UTL_RAW.CAST_TO_BINARY_INTEGER

    The stored procedure CAST_TO_BINARY_INTEGER converts an INTEGER type value in a binary representation (RAW type) to the INTEGER type.

    +

    The UTL_RAW.CAST_TO_BINARY_INTEGER function prototype is:

    +
    1
    +2
    +3
    +4
    UTL_RAW.CAST_TO_BINARY_INTEGER (
    +r          IN  RAW,
    +endianess  IN  INTEGER)
    +RETURN BINARY_INTEGER;
    +
    + +
    + +
    + + + + + + + + + + +
    Table 3 UTL_RAW.CAST_TO_BINARY_INTEGER interface parameters

    Parameter

    +

    Description

    +

    r

    +

    Specifies an INTEGER type value in a binary representation (RAW type).

    +

    endianess

    +

    Specifies the INTEGER type value 1 or 2 of the byte sequence. (1 indicates BIG_ENDIAN and 2 indicates LITTLE-ENDIAN.)

    +
    +
    +
  • UTL_RAW.LENGTH

    The stored procedure LENGTH returns the length of a RAW type object.

    +

    The UTL_RAW.LENGTH function prototype is:

    +
    1
    +2
    +3
    UTL_RAW.LENGTH(
    +r      IN RAW)
    +RETURN INTEGER;
    +
    + +
    + +
    + + + + + + + +
    Table 4 UTL_RAW.LENGTH interface parameters

    Parameter

    +

    Description

    +

    r

    +

    Specifies a RAW type object.

    +
    +
    +
  • UTL_RAW.CAST_TO_RAW

    The stored procedure CAST_TO_RAW converts a VARCHAR2 type object to the RAW type.

    +

    The UTL_RAW.CAST_TO_RAW function prototype is:

    +
    1
    +2
    +3
    UTL_RAW.CAST_TO_RAW(
    +c      IN VARCHAR2)
    +RETURN RAW;
    +
    + +
    + +
    + + + + + + + +
    Table 5 UTL_RAW.CAST_TO_RAW interface parameters

    Parameter

    +

    Description

    +

    c

    +

    Specifies a VARCHAR2 type object to be converted.

    +
    +
    +
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
-- Perform operations on RAW data in a stored procedure.
+CREATE OR REPLACE PROCEDURE proc_raw
+AS
+str varchar2(100) := 'abcdef';
+source raw(100);
+amount integer;
+BEGIN
+source := utl_raw.cast_to_raw(str);--Convert the type.
+amount := utl_raw.length(source);--Obtain the length.
+dbms_output.put_line(amount);
+END;
+/
+
+-- Invoke the stored procedure.
+CALL proc_raw();
+
+-- Delete the stored procedure.
+DROP PROCEDURE proc_raw;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0555.html b/docs/dws/dev/dws_04_0555.html new file mode 100644 index 00000000..68dd7e2d --- /dev/null +++ b/docs/dws/dev/dws_04_0555.html @@ -0,0 +1,571 @@ + + +

DBMS_JOB

+

Related Interfaces

Table 1 lists all interfaces supported by the DBMS_JOB package.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBMS_JOB

Interface

+

Description

+

DBMS_JOB.SUBMIT

+

Submits a job to the job queue. The job number is automatically generated by the system.

+

DBMS_JOB.ISUBMIT

+

Submits a job to the job queue. The job number is specified by the user.

+

DBMS_JOB.REMOVE

+

Removes a job from the job queue by job number.

+

DBMS_JOB.BROKEN

+

Disables or enables job execution.

+

DBMS_JOB.CHANGE

+

Modifies user-definable attributes of a job, including the job description, next execution time, and execution interval.

+

DBMS_JOB.WHAT

+

Modifies the job description of a job.

+

DBMS_JOB.NEXT_DATE

+

Modifies the next execution time of a job.

+

DBMS_JOB.INTERVAL

+

Modifies the execution interval of a job.

+

DBMS_JOB.CHANGE_OWNER

+

Modifies the owner of a job.

+
+
+
  • DBMS_JOB.SUBMIT

    The stored procedure SUBMIT submits a job provided by the system.

    +

    A prototype of the DBMS_JOB.SUBMIT function is as follows:

    +
    1
    +2
    +3
    +4
    +5
    DMBS_JOB.SUBMIT(
    +what         IN   TEXT,
    +next_date    IN   TIMESTAMP DEFAULT sysdate,
    +job_interval IN   TEXT  DEFAULT 'null',
    +job          OUT  INTEGER);
    +
    + +
    +

    When a job is created (using DBMS_JOB), the system binds the current database and the username to the job by default. This function can be invoked by using call or select. If you invoke this function by using select, there is no need to specify output parameters. To invoke this function within a stored procedure, use perform.

    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2 DBMS_JOB.SUBMIT interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    what

    +

    text

    +

    IN

    +

    No

    +

    SQL statement to be executed. One or multiple DMLs, anonymous blocks, and SQL statements that invoke stored procedures, or all three combined are supported.

    +

    next_date

    +

    timestamp

    +

    IN

    +

    No

    +

    Specifies the next time the job will be executed. The default value is the current system time (sysdate). If the specified time has past, the job is executed at the time it is submitted.

    +

    interval

    +

    text

    +

    IN

    +

    Yes

    +

    Calculates the next time to execute the job. It can be an interval expression, or sysdate followed by a numeric value, for example, sysdate+1.0/24. If this parameter is left blank or set to null, the job will be executed only once, and the job status will change to 'd' afterward.

    +

    job

    +

    integer

    +

    OUT

    +

    No

    +

    Specifies the job number. The value ranges from 1 to 32767. When dbms.submit is invoked using select, this parameter can be skipped.

    +
    +
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select DBMS_JOB.SUBMIT('call pro_xxx();', to_date('20180101','yyyymmdd'),'sysdate+1');
    +
    +select DBMS_JOB.SUBMIT('call pro_xxx();', to_date('20180101','yyyymmdd'),'sysdate+1.0/24');
    +
    +CALL DBMS_JOB.SUBMIT('INSERT INTO T_JOB  VALUES(1);  call pro_1(); call pro_2();', add_months(to_date('201701','yyyymm'),1), 'date_trunc(''day'',SYSDATE) + 1 +(8*60+30.0)/(24*60)' ,:jobid);
    +
    + +
    +
+
  • DBMS_JOB.ISUBMIT

    ISUBMIT has the same syntax function as SUBMIT, but the first parameter of ISUBMIT is an input parameter, that is, a specified job number. In contrast, that last parameter of SUBMIT is an output parameter, indicating the job number automatically generated by the system.

    +

    For example:

    +
    1
    CALL dbms_job.isubmit(101, 'insert_msg_statistic1;', sysdate, 'sysdate+3.0/24');
    +
    + +
    +
  • DBMS_JOB.REMOVE

    The stored procedure REMOVE deletes a specified job.

    +

    A prototype of the DBMS_JOB.REMOVE function is as follows:

    +
    1
    REMOVE(job  IN  INTEGER);
    +
    + +
    + +
    + + + + + + + + + + + + + +
    Table 3 DBMS_JOB.REMOVE interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +
    +
    +

    For example:

    +
    CALL dbms_job.remove(101);
    +
  • DBMS_JOB.BROKEN

    The stored procedure BROKEN sets the broken flag of a job.

    +

    A prototype of the DBMS_JOB.BROKEN function is as follows:

    +
    1
    +2
    +3
    +4
    DMBS_JOB.BROKEN(
    +job          IN   INTEGER,
    +broken       IN   BOOLEAN,
    +next_date    IN   TIMESTAMP  DEFAULT  sysdate);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 4 DBMS_JOB.BROKEN interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    broken

    +

    boolean

    +

    IN

    +

    No

    +

    Specifies the status flag, true for broken and false for not broken. Setting this parameter to true or false updates the current job. If the parameter is left blank, the job status remains unchanged.

    +

    next_date

    +

    timestamp

    +

    IN

    +

    Yes

    +

    Specifies the next execution time. The default is the current system time. If broken is set to true, next_date is updated to '4000-1-1'. If broken is false and next_date is not empty, next_date is updated for the job. If next_date is empty, it will not be updated. This parameter can be omitted, and its default value will be used in this case.

    +
    +
    +

    For example:

    +
    1
    +2
    CALL dbms_job.broken(101, true);
    +CALL dbms_job.broken(101, false, sysdate);
    +
    + +
    +
  • DBMS_JOB.CHANGE

    The stored procedure CHANGE modifies user-definable attributes of a job, including the job content, next-execution time, and execution interval.

    +

    A prototype of the DBMS_JOB.CHANGE function is as follows:

    +
    1
    +2
    +3
    +4
    +5
    DMBS_JOB.CHANGE(
    +job          IN   INTEGER,
    +what         IN   TEXT,
    +next_date    IN   TIMESTAMP,
    +interval     IN   TEXT);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 5 DBMS_JOB.CHANGE interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    what

    +

    text

    +

    IN

    +

    Yes

    +

    Specifies the name of the stored procedure or SQL statement block that is executed. If this parameter is left blank, the system does not update the what parameter for the specified job. Otherwise, the system updates the what parameter for the specified job.

    +

    next_date

    +

    timestamp

    +

    IN

    +

    Yes

    +

    Specifies the next execution time. If this parameter is left blank, the system does not update the next_date parameter for the specified job. Otherwise, the system updates the next_date parameter for the specified job.

    +

    interval

    +

    text

    +

    IN

    +

    Yes

    +

    Specifies the time expression for calculating the next time the job will be executed. If this parameter is left blank, the system does not update the interval parameter for the specified job. Otherwise, the system updates the interval parameter for the specified job after necessary validity check. If this parameter is set to null, the job will be executed only once, and the job status will change to 'd' afterward.

    +
    +
    +

    For example:

    +
    1
    +2
    CALL dbms_job.change(101, 'call userproc();', sysdate, 'sysdate + 1.0/1440');
    +CALL dbms_job.change(101, 'insert into tbl_a values(sysdate);', sysdate, 'sysdate + 1.0/1440');
    +
    + +
    +
  • DBMS_JOB.WHAT

    The stored procedure WHAT modifies the procedures to be executed by a specified job.

    +

    A prototype of the DBMS_JOB.WHAT function is as follows:

    +
    1
    +2
    +3
    DMBS_JOB.WHAT(
    +job             IN     INTEGER,
    +what            IN     TEXT);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 6 DBMS_JOB.WHAT interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    what

    +

    text

    +

    IN

    +

    No

    +

    Specifies the name of the stored procedure or SQL statement block that is executed.

    +
    +
    +
    • If the value specified by the what parameter is one or multiple executable SQL statements, program blocks, or stored procedures, this procedure can be executed successfully; otherwise, it will fail to be executed.
    • If the what parameter is a simple statement such as insert and update, a schema name must be added in front of the table name.
    +
    +

    For example:

    +
    1
    +2
    CALL dbms_job.what(101, 'call userproc();');
    +CALL dbms_job.what(101, 'insert into tbl_a values(sysdate);');
    +
    + +
    +
  • DBMS_JOB.NEXT_DATE

    The stored procedure NEXT_DATE modifies the next-execution time attribute of a job.

    +

    A prototype of the DBMS_JOB.NEXT_DATE function is as follows:

    +
    1
    +2
    +3
    DMBS_JOB.NEXT_DATE(
    +job          IN    INTEGER,
    +next_date    IN    TIMESTAMP);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 7 DBMS_JOB.NEXT_DATE interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    next_date

    +

    timestamp

    +

    IN

    +

    No

    +

    Specifies the next execution time.

    +
    +
    +

    If the specified next_date value is earlier than the current date, the job is executed once immediately.

    +
    +

    For example:

    +
    1
    CALL dbms_job.next_date(101, sysdate);
    +
    + +
    +
  • DBMS_JOB.INTERVAL

    The stored procedure INTERVAL modifies the execution interval attribute of a job.

    +

    A prototype of the DBMS_JOB.INTERVAL function is as follows:

    +
    1
    +2
    +3
    DMBS_JOB.INTERVAL(
    +job              IN   INTEGER,
    +interval         IN   TEXT);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 8 DBMS_JOB.INTERVAL interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    interval

    +

    text

    +

    IN

    +

    Yes

    +

    Specifies the time expression for calculating the next time the job will be executed. If this parameter is left blank or set to null, the job will be executed only once, and the job status will change to 'd' afterward. interval must be a valid time or interval type.

    +
    +
    +

    For example:

    +
    1
    CALL dbms_job.interval(101, 'sysdate + 1.0/1440');
    +
    + +
    +

    For a job that is currently running (that is, job_status is 'r'), it is not allowed to use remove, change, next_date, what, or interval to delete or modify job parameters.

    +
    +
+
+
  • DBMS_JOB.CHANGE_OWNER

    The stored procedure CHANGE_OWNER modifies the owner of a job.

    +

    A prototype of the DBMS_JOB.CHANGE_OWNER function is as follows:

    +
    1
    +2
    +3
    DMBS_JOB.CHANGE_OWNER(
    +job             IN     INTEGER,
    +new_owner       IN     NAME);
    +
    + +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 9 DBMS_JOB.CHANGE_OWNER interface parameters

    Parameter

    +

    Type

    +

    Input/Output Parameter

    +

    Can Be Empty

    +

    Description

    +

    job

    +

    integer

    +

    IN

    +

    No

    +

    Specifies the job number.

    +

    new_owner

    +

    name

    +

    IN

    +

    No

    +

    Specifies the new username.

    +
    +
    +

    For example:

    +
    1
    CALL dbms_job.change_owner(101, 'alice');
    +
    + +
    +
+

Constraints

  1. After a new job is created, this job belongs to the current coordinator only, that is, this job can be scheduled and executed only on the current coordinator. Other coordinators will not schedule or execute this job. All coordinators can query, modify, and delete jobs created on other CNs.
  2. Create, update, and delete jobs only using the procedures provided by the DBMS_JOB package. These procedures synchronize job information between different CNs and associate primary keys between the pg_jobs tables. If you use DML statements to add, delete, or modify records in the pg_jobs table, job information will become inconsistent between CNs and system catalogs may fail to be associated, compromising internal job management.
  3. Each user-created task is bound to a CN. If the automatic migration function is not enabled, task statuses cannot be updated in real time when the CN is faulty during task execution. When a CN fails, all jobs on this CN cannot be scheduled or executed until the CN is restored manually. Enable the automatic migration function on CNs, so that jobs on the faulty CN will be migrated to other CNs for scheduling.
  4. For each job, the hosting CN updates the real-time job information (including the job status, last execution start time, last execution end time, next execution start time, the number of execution failures if any) to the pg_jobs table, and synchronizes the information to other CNs, ensuring consistent job information between different CNs. In the case of CN failures, job information synchronization is reattempted by the hosting CNs, which increases job execution time. Although job information fails to be synchronized between CNs, job information can still be properly updated in the pg_jobs table on the hosting CNs, and jobs can be executed successfully. After a CN recovers, job information such as job execution time and status in its pg_jobs table may be incorrect and will be updated only after the jobs are executed again on related CNs.
  5. For each job, a thread is established to execute it. If multiple jobs are triggered concurrently as scheduled, the system will need some time to start the required threads, resulting in a latency of 0.1 ms in job execution.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0556.html b/docs/dws/dev/dws_04_0556.html new file mode 100644 index 00000000..f125c466 --- /dev/null +++ b/docs/dws/dev/dws_04_0556.html @@ -0,0 +1,987 @@ + + +

DBMS_SQL

+

Related Interfaces

Table 1 lists interfaces supported by the DBMS_SQL package.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBMS_SQL

API

+

Description

+

DBMS_SQL.OPEN_CURSOR

+

Opens a cursor.

+

DBMS_SQL.CLOSE_CURSOR

+

Closes an open cursor.

+

DBMS_SQL.PARSE

+

Transmits a group of SQL statements to a cursor. Currently, only the SELECT statement is supported.

+

DBMS_SQL.EXECUTE

+

Performs a set of dynamically defined operations on the cursor.

+

DBMS_SQL.FETCHE_ROWS

+

Reads a row of cursor data.

+

DBMS_SQL.DEFINE_COLUMN

+

Dynamically defines a column.

+

DBMS_SQL.DEFINE_COLUMN_CHAR

+

Dynamically defines a column of the CHAR type.

+

DBMS_SQL.DEFINE_COLUMN_INT

+

Dynamically defines a column of the INT type.

+

DBMS_SQL.DEFINE_COLUMN_LONG

+

Dynamically defines a column of the LONG type.

+

DBMS_SQL.DEFINE_COLUMN_RAW

+

Dynamically defines a column of the RAW type.

+

DBMS_SQL.DEFINE_COLUMN_TEXT

+

Dynamically defines a column of the TEXT type.

+

DBMS_SQL.DEFINE_COLUMN_UNKNOWN

+

Dynamically defines a column of an unknown type.

+

DBMS_SQL.COLUMN_VALUE

+

Reads a dynamically defined column value.

+

DBMS_SQL.COLUMN_VALUE_CHAR

+

Reads a dynamically defined column value of the CHAR type.

+

DBMS_SQL.COLUMN_VALUE_INT

+

Reads a dynamically defined column value of the INT type.

+

DBMS_SQL.COLUMN_VALUE_LONG

+

Reads a dynamically defined column value of the LONG type.

+

DBMS_SQL.COLUMN_VALUE_RAW

+

Reads a dynamically defined column value of the RAW type.

+

DBMS_SQL.COLUMN_VALUE_TEXT

+

Reads a dynamically defined column value of the TEXT type.

+

DBMS_SQL.COLUMN_VALUE_UNKNOWN

+

Reads a dynamically defined column value of an unknown type.

+

DBMS_SQL.IS_OPEN

+

Checks whether a cursor is opened.

+
+
+
  • You are advised to use dbms_sql.define_column and dbms_sql.column_value to define columns.
  • If the size of the result set is greater than the value of work_mem, the result set will be flushed to disk. The value of work_mem must be no greater than 512 MB.
+
+
  • DBMS_SQL.OPEN_CURSOR

    This function opens a cursor and is the prerequisite for the subsequent dbms_sql operations. This function does not transfer any parameter. It automatically generates cursor IDs in an ascending order and returns values to integer variables.

    +

    The function prototype of DBMS_SQL.OPEN_CURSOR is:

    +
    1
    +2
    +3
    DBMS_SQL.OPEN_CURSOR (
    +)
    +RETURN INTEGER;
    +
    + +
    +
  • DBMS_SQL.CLOSE_CURSOR

    This function closes a cursor. It is the end of each dbms_sql operation. If this function is not invoked when the stored procedure ends, the memory is still occupied by the cursor. Therefore, remember to close a cursor when you do not need to use it. If an exception occurs, the stored procedure exits but the cursor is not closed. Therefore, you are advised to include this interface in the exception handling of the stored procedure.

    +

    The function prototype of DBMS_SQL.CLOSE_CURSOR is:

    +
    1
    +2
    +3
    +4
    DBMS_SQL.CLOSE_CURSOR (
    +cursorid     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    + +
    + + + + + + + +
    Table 2 DBMS_SQL.CLOSE_CURSOR interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be closed

    +
    +
    +
+
  • DBMS_SQL.PARSE

    This function parses the query statement of a given cursor. The input query statement is executed immediately. Currently, only the SELECT query statement can be parsed. The statement parameters can be transferred only through the TEXT type. The length cannot exceed 1 GB.

    +
    The function prototype of DBMS_SQL.PARSE is:
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_SQL.PARSE (
    +cursorid     IN INTEGER,
    +query_string IN TEXT,
    +label        IN INTEGER
    +)
    +RETURN BOOLEAN;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + +
    Table 3 DBMS_SQL.PARSE interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor whose query statement is parsed

    +

    query_string

    +

    Query statements to be parsed

    +

    language_flag

    +

    Version language number. Currently, only 1 is supported.

    +
    +
    +
  • DBMS_SQL.EXECUTE

    This function executes a given cursor. This function receives a cursor ID. The obtained data after is used for subsequent operations. Currently, only the SELECT query statement can be executed.

    +
    The function prototype of DBMS_SQL.EXECUTE is:
    1
    +2
    +3
    +4
    DBMS_SQL.EXECUTE(
    +cursorid     IN INTEGER,
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + +
    Table 4 DBMS_SQL.EXECUTE interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor whose query statement is parsed

    +
    +
    +
  • DBMS_SQL.FETCHE_ROWS

    This function returns the number of data rows that meet query conditions. Each time the interface is executed, the system obtains a set of new rows until all data is read.

    +
    The function prototype of DBMS_SQL.FETCHE_ROWS is:
    1
    +2
    +3
    +4
    DBMS_SQL.FETCHE_ROWS(
    +cursorid     IN INTEGER,
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + +
    Table 5 DBMS_SQL.FETCH_ROWS interface parameters

    Parameter Name

    +

    Description

    +

    curosorid

    +

    ID of the cursor to be executed

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN

    This function defines columns returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_SQL.DEFINE_COLUMN(
    +cursorid     IN INTEGER,
    +position     IN INTEGER,
    +column_ref   IN ANYELEMENT,
    +column_size     IN INTEGER default 1024
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + +
    Table 6 DBMS_SQL.DEFINE_COLUMN interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column_ref

    +

    Variable of any type. You can select an appropriate interface to dynamically define columns based on variable types.

    +

    column_size

    +

    Length of a defined column

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_CHAR

    This function defines columns of the CHAR type returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_CHAR is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_SQL.DEFINE_COLUMN_CHAR(
    +cursorid     IN INTEGER,
    +position     IN INTEGER,
    +column       IN TEXT,
    +column_size     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + +
    Table 7 DBMS_SQL.DEFINE_COLUMN_CHAR interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column

    +

    Parameter to be defined

    +

    column_size

    +

    Length of a dynamically defined column

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_INT

    This function defines columns of the INT type returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_INT is:
    1
    +2
    +3
    +4
    +5
    DBMS_SQL.DEFINE_COLUMN_INT(
    +cursorid     IN INTEGER,
    +position     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + +
    Table 8 DBMS_SQL.DEFINE_COLUMN_INT interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_LONG

    This function defines columns of a long type (not LONG) returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type. The maximum size of a long column is 1 GB.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_LONG is:
    1
    +2
    +3
    +4
    +5
    DBMS_SQL.DEFINE_COLUMN_LONG(
    +cursorid     IN INTEGER,
    +position     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + +
    Table 9 DBMS_SQL.DEFINE_COLUMN_LONG interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_RAW

    This function defines columns of the RAW type returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_RAW is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    DBMS_SQL.DEFINE_COLUMN_RAW(
    +cursorid     IN INTEGER,
    +position     IN INTEGER,
    +column       IN BYTEA,
    +column_size     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + +
    Table 10 DBMS_SQL.DEFINE_COLUMN_RAW interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column

    +

    Parameter of the RAW type

    +

    column_size

    +

    Column length

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_TEXT

    This function defines columns of the TEXT type returned from a given cursor and can be used only for the cursors defined by SELECT. The defined columns are identified by the relative positions in the query list. The data type of the input variable determines the column type.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_TEXT is:
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_SQL.DEFINE_COLUMN_CHAR(
    +cursorid     IN INTEGER,
    +position     IN INTEGER,
    +max_size     IN INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + +
    Table 11 DBMS_SQL.DEFINE_COLUMN_TEXT interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    max_size

    +

    Maximum length of the defined TEXT type

    +
    +
    +
  • DBMS_SQL.DEFINE_COLUMN_UNKNOWN

    This function processes columns of unknown data types returned from a given cursor and is used only for the system to report an error and exist when the type cannot be identified.

    +
    The function prototype of DBMS_SQL.DEFINE_COLUMN_UNKNOWN is:
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_SQL.DEFINE_COLUMN_CHAR(
    +cursorid     IN INTEGER,
    +position     IN INTEGER,
    +column       IN TEXT
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + +
    Table 12 DBMS_SQL.DEFINE_COLUMN_UNKNOWN interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column

    +

    Dynamically defined parameter

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE

    This function returns the cursor element value specified by a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE is:
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_SQL.COLUMN_VALUE(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER,
    +column_value             INOUT ANYELEMENT
    +)
    +RETURN ANYELEMENT;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + +
    Table 13 DBMS_SQL.COLUMN_VALUE interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column_value

    +

    Return value of a defined column

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_CHAR

    This function returns the value of the CHAR type in a specified position of a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE_CHAR is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    DBMS_SQL.COLUMN_VALUE_CHAR(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER,
    +column_value             INOUT CHARACTER,
    +err_num                  INOUT NUMERIC default 0,
    +actual_length            INOUT INTEGER default 1024
    +)
    +RETURN RECORD;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 14 DBMS_SQL.COLUMN_VALUE_CHAR interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column_value

    +

    Return value

    +

    err_num

    +

    Error No. It is an output parameter and the argument must be a variable. Currently, the output value is –1 regardless of the argument.

    +

    actual_length

    +

    Length of a return value

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_INT
    This function returns the value of the INT type in a specified position of a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS. The function prototype of DBMS_SQL.COLUMN_VALUE_INT is:
    1
    +2
    +3
    +4
    +5
    DBMS_SQL.COLUMN_VALUE_INT(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER
    +)
    +RETURN INTEGER;
    +
    + +
    +
    + +
    + + + + + + + + + + +
    Table 15 DBMS_SQL.COLUMN_VALUE_INT interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_LONG

    This function returns the value of a long type (not LONG or BIGINT) in a specified position of a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE_LONG is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    DBMS_SQL.COLUMN_VALUE_LONG(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER,
    +length                   IN    INTEGER,
    +off_set                  IN    INTEGER,
    +column_value             INOUT TEXT,
    +actual_length            INOUT INTEGER default 1024
    +)
    +RETURN RECORD;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    Table 16 DBMS_SQL.COLUMN_VALUE_LONG interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    length

    +

    Length of a return value

    +

    off_set

    +

    Start position of a return value

    +

    column_value

    +

    Return value

    +

    actual_length

    +

    Length of a return value

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_RAW

    This function returns the value of the RAW type in a specified position of a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE_RAW is:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    DBMS_SQL.COLUMN_VALUE_RAW(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER,
    +column_value             INOUT BYTEA,
    +err_num                  INOUT NUMERIC default 0,
    +actual_length            INOUT INTEGER default 1024
    +)
    +RETURN RECORD;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + + + + + + + +
    Table 17 DBMS_SQL.COLUMN_VALUE_RAW interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column_value

    +

    Returned column value

    +

    err_num

    +

    Error No. It is an output parameter and the argument must be a variable. Currently, the output value is –1 regardless of the argument.

    +

    actual_length

    +

    Length of a return value. The value longer than this length will be truncated.

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_TEXT

    This function returns the value of the TEXT type in a specified position of a cursor and accesses the data obtained by DBMS_SQL.FETCH_ROWS.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE_TEXT is:
    1
    +2
    +3
    +4
    +5
    DBMS_SQL.COLUMN_VALUE_TEXT(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER
    +)
    +RETURN TEXT;
    +
    + +
    +
    + +
    + + + + + + + + + + +
    Table 18 DBMS_SQL.COLUMN_VALUE_TEXT interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +
    +
    +
  • DBMS_SQL.COLUMN_VALUE_UNKNOWN

    This function returns the value of an unknown type in a specified position of a cursor. This is an error handling interface when the type is not unknown.

    +
    The function prototype of DBMS_SQL.COLUMN_VALUE_UNKNOWN is:
    1
    +2
    +3
    +4
    +5
    +6
    DBMS_SQL.COLUMN_VALUE_UNKNOWN(
    +cursorid                 IN    INTEGER,
    +position                 IN    INTEGER,
    +COLUMN_TYPE              IN    TEXT
    +)
    +RETURN TEXT;
    +
    + +
    +
    + +
    + + + + + + + + + + + + + +
    Table 19 DBMS_SQL.COLUMN_VALUE_UNKNOWN interface parameters

    Parameter Name

    +

    Description

    +

    cursorid

    +

    ID of the cursor to be executed

    +

    position

    +

    Position of a dynamically defined column in the query

    +

    column_type

    +

    Returned parameter type

    +
    +
    +
  • DBMS_SQL.IS_OPEN
+

This function returns the status of a cursor: open, parse, execute, or define. The value is TRUE. If the status is unknown, an error is reported. In other cases, the value is FALSE.

+
The function prototype of DBMS_SQL.IS_OPEN is:
1
+2
+3
+4
DBMS_SQL.IS_OPEN(
+cursorid                 IN    INTEGER
+)
+RETURN BOOLEAN;
+
+ +
+
+ +
+ + + + + + + +
Table 20 DBMS_SQL.IS_OPEN interface parameters

Parameter Name

+

Description

+

cursorid

+

ID of the cursor to be queried

+
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
-- Perform operations on RAW data in a stored procedure.
+create or replace procedure pro_dbms_sql_all_02(in_raw raw,v_in int,v_offset int)
+as 
+cursorid int;
+v_id int;
+v_info bytea :=1;
+query varchar(2000);
+execute_ret int;
+define_column_ret_raw bytea :='1';
+define_column_ret int;
+begin
+drop table if exists pro_dbms_sql_all_tb1_02 ;
+create table pro_dbms_sql_all_tb1_02(a int ,b blob);
+insert into pro_dbms_sql_all_tb1_02 values(1,HEXTORAW('DEADBEEE'));
+insert into pro_dbms_sql_all_tb1_02 values(2,in_raw);
+query := 'select * from pro_dbms_sql_all_tb1_02 order by 1';
+-- Open a cursor.
+cursorid := dbms_sql.open_cursor();
+-- Compile the cursor.
+dbms_sql.parse(cursorid, query, 1);
+-- Define a column.
+define_column_ret:= dbms_sql.define_column(cursorid,1,v_id);
+define_column_ret_raw:= dbms_sql.define_column_raw(cursorid,2,v_info,10);
+-- Execute the cursor.
+execute_ret := dbms_sql.execute(cursorid);
+loop 
+exit when (dbms_sql.fetch_rows(cursorid) <= 0);
+-- Obtain values.
+dbms_sql.column_value(cursorid,1,v_id);
+dbms_sql.column_value_raw(cursorid,2,v_info,v_in,v_offset);
+-- Output the result.
+dbms_output.put_line('id:'|| v_id || ' info:' || v_info);
+end loop;
+-- Close the cursor.
+dbms_sql.close_cursor(cursorid);
+end;
+/
+-- Invoke the stored procedure.
+call pro_dbms_sql_all_02(HEXTORAW('DEADBEEF'),0,1);
+
+-- Delete the stored procedure.
+DROP PROCEDURE pro_dbms_sql_all_02;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0558.html b/docs/dws/dev/dws_04_0558.html new file mode 100644 index 00000000..8a3d2509 --- /dev/null +++ b/docs/dws/dev/dws_04_0558.html @@ -0,0 +1,114 @@ + + +

Debugging

+

Syntax

RAISE has the following five syntax formats:

+
Figure 1 raise_format::=
+
Figure 2 raise_condition::=
+
Figure 3 raise_sqlstate::=
+
Figure 4 raise_option::=
+
Figure 5 raise::=
+

Parameter description:

+
  • The level option is used to specify the error level, that is, DEBUG, LOG, INFO, NOTICE, WARNING, or EXCEPTION (default). EXCEPTION throws an error that normally terminates the current transaction and the others only generate information at their levels. The log_min_messages and client_min_messages parameters control whether the error messages of specific levels are reported to the client and are written to the server log.
  • format: specifies the error message text to be reported, a format character string. The format character string can be appended with an expression for insertion to the message text. In a format character string, % is replaced by the parameter value attached to format and %% is used to print %. For example:
    --v_job_id replaces % in the character string.
    +RAISE NOTICE 'Calling cs_create_job(%)',v_job_id;
    +
  • option = expression: inserts additional information to an error report. The keyword option can be MESSAGE, DETAIL, HINT, or ERRCODE, and each expression can be any character string.
    • MESSAGE: specifies the error message text. This option cannot be used in a RAISE statement that contains a format character string in front of USING.
    • DETAIL: specifies detailed information of an error.
    • HINT: prints hint information.
    • ERRCODE: designates an error code (SQLSTATE) to a report. A condition name or a five-character SQLSTATE error code can be used.
    +
  • condition_name: specifies the condition name corresponding to the error code.
  • sqlstate: specifies the error code.
+

If neither a condition name nor an SQLSTATE is designated in a RAISE EXCEPTION command, the RAISE EXCEPTION (P0001) is used by default. If no message text is designated, the condition name or SQLSTATE is used as the message text by default.

+

If the SQLSTATE designates an error code, the error code is not limited to a defined error code. It can be any error code containing five digits or ASCII uppercase rather than 00000. Do not use an error code ended with three zeros because this kind of error codes are type codes and can be captured by the whole category.

+
+

The syntax described in Figure 5 does not append any parameter. This form is used only for the EXCEPTION statement in a BEGIN block so that the error can be re-processed.

+
+
+

Examples

Display error and hint information when a transaction terminates:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
CREATE OR REPLACE PROCEDURE proc_raise1(user_id in integer)
+AS 
+BEGIN 
+RAISE EXCEPTION 'Noexistence ID --> %',user_id USING HINT = 'Please check your user ID'; 
+END; 
+/
+
+call proc_raise1(300011);
+
+-- Execution result:
+ERROR:  Noexistence ID --> 300011
+HINT:  Please check your user ID
+
+ +
+
+
Two methods are available for setting SQLSTATE:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
CREATE OR REPLACE PROCEDURE proc_raise2(user_id in integer)
+AS 
+BEGIN 
+RAISE 'Duplicate user ID: %',user_id USING ERRCODE = 'unique_violation'; 
+END; 
+/
+
+\set VERBOSITY verbose
+call proc_raise2(300011);
+
+-- Execution result:
+ERROR:  Duplicate user ID: 300011
+SQLSTATE: 23505
+LOCATION:  exec_stmt_raise, pl_exec.cpp:3482
+
+ +
+
+

If the main parameter is a condition name or SQLSTATE, the following applies:

+

RAISE division_by_zero;

+

RAISE SQLSTATE '22012';

+

For example:

+
CREATE OR REPLACE PROCEDURE division(div in integer, dividend in integer) 
+AS 
+DECLARE 
+res int; 
+    BEGIN 
+    IF dividend=0 THEN 
+        RAISE division_by_zero; 
+        RETURN; 
+    ELSE 
+        res := div/dividend; 
+        RAISE INFO 'division result: %', res;
+        RETURN; 
+    END IF; 
+    END; 
+/
+call division(3,0);
+
+-- Execution result:
+ERROR:  division_by_zero
+
Alternatively:
1
RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
+
+ +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0559.html b/docs/dws/dev/dws_04_0559.html new file mode 100644 index 00000000..06acd69e --- /dev/null +++ b/docs/dws/dev/dws_04_0559.html @@ -0,0 +1,19 @@ + + +

System Catalogs and System Views

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0560.html b/docs/dws/dev/dws_04_0560.html new file mode 100644 index 00000000..82e0f577 --- /dev/null +++ b/docs/dws/dev/dws_04_0560.html @@ -0,0 +1,15 @@ + + +

Overview of System Catalogs and System Views

+

System catalogs are used by GaussDB(DWS) to store structure metadata. They are a core component the GaussDB(DWS) database system and provide control information for the database system. These system catalogs contain cluster installation information and information about various queries and processes in GaussDB(DWS). You can collect information about the database by querying the system catalog.

+

System views provide ways to query system catalogs and internal database status. If some columns in one or more tables in a database are frequently searched for, an administrator can define a view for these columns, and then users can directly access these columns in the view without entering search criteria. A view is different from a basic table. It is only a virtual object rather than a physical one. A database only stores the definition of a view and does not store its data. The data is still stored in the original base table. If data in the base table changes, the data in the view changes accordingly. In this sense, a view is like a window through which users can know their interested data and data changes in the database. A view is triggered every time it is referenced.

+

In separation of duty, non-administrators have no permission to view system catalogs and views. In other scenarios, system catalogs and views are either visible only to administrators or visible to all users. Some of the following system catalogs and views have marked the need of administrator permissions. They are accessible only to administrators.

+

Do not add, delete, or modify system catalogs or system views. Manual modification or damage to system catalogs or system views may cause system information inconsistency, system control exceptions, or even cluster unavailability.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0561.html b/docs/dws/dev/dws_04_0561.html new file mode 100644 index 00000000..d7087b87 --- /dev/null +++ b/docs/dws/dev/dws_04_0561.html @@ -0,0 +1,158 @@ + + +

System Catalogs

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0562.html b/docs/dws/dev/dws_04_0562.html new file mode 100644 index 00000000..b474db3d --- /dev/null +++ b/docs/dws/dev/dws_04_0562.html @@ -0,0 +1,106 @@ + + +

GS_OBSSCANINFO

+

GS_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table on OBS in a query.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_OBSSCANINFO columns

Name

+

Type

+

Reference

+

Description

+

query_id

+

bigint

+

-

+

Specifies a query ID.

+

user_id

+

text

+

-

+

Specifies a database user who performs queries.

+

table_name

+

text

+

-

+

Specifies the name of a foreign table on OBS.

+

file_type

+

text

+

-

+

Specifies the format of files storing the underlying data.

+

time_stamp

+

time_stam

+

-

+

Specifies the scanning start time.

+

actual_time

+

double

+

-

+

Specifies the scanning execution time in seconds.

+

file_scanned

+

bigint

+

-

+

Specifies the number of files scanned.

+

data_size

+

double

+

-

+

Specifies the size of data scanned in bytes.

+

billing_info

+

text

+

-

+

Specifies the reserved fields.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0564.html b/docs/dws/dev/dws_04_0564.html new file mode 100644 index 00000000..f742d70d --- /dev/null +++ b/docs/dws/dev/dws_04_0564.html @@ -0,0 +1,132 @@ + + +

GS_WLM_INSTANCE_HISTORY

+

The GS_WLM_INSTANCE_HISTORY system catalog stores information about resource usage related to CN or DN instances. Each record in the system table indicates the resource usage of an instance at a specific time point, including the memory, number of CPU cores, disk I/O, physical I/O of the process, and logical I/O of the process.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_INSTANCE_HISTORY column

Name

+

Type

+

Description

+

instancename

+

text

+

Instance name

+

timestamp

+

timestamp with time zone

+

Timestamp

+

used_cpu

+

int

+

CPU usage of an instance

+

free_mem

+

int

+

Unused memory of an instance (unit: MB)

+

used_mem

+

int

+

Used memory of an instance (unit: MB)

+

io_await

+

real

+

Specifies the io_wait value (average value within 10 seconds) of the disk used by an instance.

+

io_util

+

real

+

Specifies the io_util value (average value within 10 seconds) of the disk used by an instance.

+

disk_read

+

real

+

Specifies the disk read rate (average value within 10 seconds) of an instance (unit: KB/s).

+

disk_write

+

real

+

The disk write rate (average value within 10 seconds) of an instance (unit: KB/s).

+

process_read

+

bigint

+

Specifies the read rate (excluding the number of bytes read from the disk pagecache) of the corresponding instance process that reads data from a disk. (Unit: KB/s)

+

process_write

+

bigint

+

Specifies the write rate (excluding the number of bytes written to the disk pagecache) of the corresponding instance process that writes data to a disk within 10 seconds. (Unit: KB/s)

+

logical_read

+

bigint

+

CN instance: N/A

+

DN instance: Specifies the logical read byte rate of the instance in the statistical interval (10 seconds). (Unit: KB/s)

+

logical_write

+

bigint

+

CN instance: N/A

+

DN instance: Specifies the logical write byte rate of the instance within the statistical interval (10 seconds). (Unit: KB/s)

+

read_counts

+

bigint

+

CN instance: N/A

+

DN instance: Specifies the total number of logical read operations of the instance in the statistical interval (10 seconds).

+

write_counts

+

bigint

+

CN instance: N/A

+

DN instance: Specifies the total number of logical write operations of the instance in the statistical interval (10 seconds).

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0565.html b/docs/dws/dev/dws_04_0565.html new file mode 100644 index 00000000..8fe4f934 --- /dev/null +++ b/docs/dws/dev/dws_04_0565.html @@ -0,0 +1,187 @@ + + +

GS_WLM_OPERATOR_INFO

+

GS_WLM_OPERATOR_INFO records operators of completed jobs. The data is dumped from the kernel to a system catalog.

+
  • This system catalog's schema is dbms_om.
  • This system catalog has a distribution column, the gaussdb column, in PostgreSQL databases only, not other databases.
  • The pg_catalog has the GS_WLM_OPERATOR_INFO view.
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_OPERATOR_INFO columns

Name

+

Type

+

Description

+

nodename

+

text

+

Name of the CN where the statement is executed

+

queryid

+

bigint

+

Internal query_id used for statement execution

+

pid

+

bigint

+

Thread ID of the backend

+

plan_node_id

+

integer

+

plan_node_id of the execution plan of a query

+

plan_node_name

+

text

+

Name of the operator corresponding to plan_node_id

+

start_time

+

timestamp with time zone

+

Time when an operator starts to process the first data record

+

duration

+

bigint

+

Total execution time of an operator. The unit is ms.

+

query_dop

+

integer

+

Degree of parallelism (DOP) of the current operator

+

estimated_rows

+

bigint

+

Number of rows estimated by the optimizer

+

tuple_processed

+

bigint

+

Number of elements returned by the current operator

+

min_peak_memory

+

integer

+

Minimum peak memory used by the current operator on all DNs. The unit is MB.

+

max_peak_memory

+

integer

+

Maximum peak memory used by the current operator on all DNs. The unit is MB.

+

average_peak_memory

+

integer

+

Average peak memory used by the current operator on all DNs. The unit is MB.

+

memory_skew_percent

+

integer

+

Memory usage skew of the current operator among DNs

+

min_spill_size

+

integer

+

Minimum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

max_spill_size

+

integer

+

Maximum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

average_spill_size

+

integer

+

Average spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

spill_skew_percent

+

integer

+

DN spill skew when a spill occurs

+

min_cpu_time

+

bigint

+

Minimum execution time of the operator on all DNs. The unit is ms.

+

max_cpu_time

+

bigint

+

Maximum execution time of the operator on all DNs. The unit is ms.

+

total_cpu_time

+

bigint

+

Total execution time of the operator on all DNs. The unit is ms.

+

cpu_skew_percent

+

integer

+

Skew of the execution time among DNs.

+

warning

+

text

+

Warning. The following warnings are displayed:

+
  1. Sort/SetOp/HashAgg/HashJoin spill
  2. Spill file size large than 256MB
  3. Broadcast size large than 100MB
  4. Early spill
  5. Spill times is greater than 3
  6. Spill on memory adaptive
  7. Hash table conflict
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0566.html b/docs/dws/dev/dws_04_0566.html new file mode 100644 index 00000000..7efa2692 --- /dev/null +++ b/docs/dws/dev/dws_04_0566.html @@ -0,0 +1,13 @@ + + +

GS_WLM_SESSION_INFO

+

GS_WLM_SESSION_INFO records load management information about a completed job executed on all CNs. The data is dumped from the kernel to a system catalog.

+
  • This system catalog's schema is dbms_om.
  • This system catalog has a distribution column, the gaussdb column, in PostgreSQL databases only, not other databases.
  • The pg_catalog has the GS_WLM_SESSION_INFO view.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0567.html b/docs/dws/dev/dws_04_0567.html new file mode 100644 index 00000000..dac64373 --- /dev/null +++ b/docs/dws/dev/dws_04_0567.html @@ -0,0 +1,150 @@ + + +

GS_WLM_USER_RESOURCE_HISTORY

+

The GS_WLM_USER_RESOURCE_HISTORY system table stores information about resources used by users and is valid only on CNs. Each record in the system table indicates the resource usage of a user at a time point, including the memory, number of CPU cores, storage space, temporary space, operator flushing space, logical I/O traffic, number of logical I/O times, and logical I/O rate. The memory, CPU, and I/O monitoring items record only the resource usage of complex jobs.

+

Data in the GS_WLM_USER_RESOURCE_HISTORY system table comes from the PG_TOTAL_USER_RESOURCE_INFO view.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_USER_RESOURCE_HISTORY column

Name

+

Type

+

Description

+

username

+

text

+

Username

+

timestamp

+

timestamp with time zone

+

Timestamp

+

used_memory

+

int

+

Specifies the used memory (unit: MB)

+

total_memory

+

int

+

Available memory (unit: MB). 0 indicates that the available memory is not limited and depends on the maximum memory available in the database.

+

used_cpu

+

real

+

Number of CPU cores in use

+

total_cpu

+

int

+

Total number of CPU cores of the Cgroup associated with a user on the node

+

used_space

+

bigint

+

Used storage space (unit: KB)

+

total_space

+

bigint

+

Available storage space (unit: KB). -1 indicates that the storage space is not limited.

+

used_temp_space

+

bigint

+

Used temporary storage space (unit: KB)

+

total_temp_space

+

bigint

+

Available temporary storage space (unit: KB). -1 indicates that the maximum temporary storage space is not limited.

+

used_spill_space

+

bigint

+

Used space of operator flushing (unit: KB)

+

total_spill_space

+

bigint

+

Available storage space for operator flushing (unit: KB). The value -1 indicates that the maximum operator flushing space is not limited.

+

read_kbytes

+

bigint

+

Byte traffic of read operations in a monitoring period (unit: KB)

+

write_kbytes

+

bigint

+

Byte traffic of write operations in a monitoring period (unit: KB)

+

read_counts

+

bigint

+

Number of read operations in a monitoring period.

+

write_counts

+

bigint

+

Number of write operations in a monitoring period.

+

read_speed

+

real

+

Byte rate of read operations in a monitoring period (unit: KB)

+

write_speed

+

real

+

Byte rate of write operations in a monitoring period (unit: KB)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0568.html b/docs/dws/dev/dws_04_0568.html new file mode 100644 index 00000000..fcd2430a --- /dev/null +++ b/docs/dws/dev/dws_04_0568.html @@ -0,0 +1,97 @@ + + +

PG_AGGREGATE

+

pg_aggregate records information about aggregation functions. Each entry in pg_aggregate is an extension of an entry in pg_proc. The pg_proc entry carries the aggregate's name, input and output data types, and other information that is similar to ordinary functions.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AGGREGATE columns

Name

+

Type

+

Reference

+

Description

+

aggfnoid

+

regproc

+

PG_PROC.oid

+

PG_PROC OID of the aggregate function

+

aggtransfn

+

regproc

+

PG_PROC.oid

+

Transition function

+

aggcollectfn

+

regproc

+

PG_PROC.oid

+

Aggregate function

+

aggfinalfn

+

regproc

+

PG_PROC.oid

+

Final function (zero if none)

+

aggsortop

+

oid

+

PG_OPERATOR.oid

+

Associated sort operator (zero if none)

+

aggtranstype

+

oid

+

PG_TYPE.oid

+

Data type of the aggregate function's internal transition (state) data

+

agginitval

+

text

+

-

+

Initial value of the transition state. This is a text column containing the initial value in its external string representation. If this column is null, the transition state value starts out null.

+

agginitcollect

+

text

+

-

+

Initial value of the collection state. This is a text column containing the initial value in its external string representation. If this column is null, the collection state value starts out null.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0569.html b/docs/dws/dev/dws_04_0569.html new file mode 100644 index 00000000..60802ed5 --- /dev/null +++ b/docs/dws/dev/dws_04_0569.html @@ -0,0 +1,313 @@ + + +

PG_AM

+

PG_AM records information about index access methods. There is one row for each index access method supported by the system.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AM columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

amname

+

name

+

-

+

Name of the access method

+

amstrategies

+

smallint

+

-

+

Number of operator strategies for this access method, or zero if access method does not have a fixed set of operator strategies

+

amsupport

+

smallint

+

-

+

Number of support routines for this access method

+

amcanorder

+

boolean

+

-

+

Whether the access method supports ordered scans sorted by the indexed column's value

+

amcanorderbyop

+

boolean

+

-

+

Whether the access method supports ordered scans sorted by the result of an operator on the indexed column

+

amcanbackward

+

boolean

+

-

+

Whether the access method supports backward scanning

+

amcanunique

+

boolean

+

-

+

Whether the access method supports unique indexes

+

amcanmulticol

+

boolean

+

-

+

Whether the access method supports multi-column indexes

+

amoptionalkey

+

boolean

+

-

+

Whether the access method supports a scan without any constraint for the first index column

+

amsearcharray

+

boolean

+

-

+

Whether the access method supports ScalarArrayOpExpr searches

+

amsearchnulls

+

boolean

+

-

+

Whether the access method supports IS NULL/NOT NULL searches

+

amstorage

+

boolean

+

-

+

Whether an index storage data type can differ from a column data type

+

amclusterable

+

boolean

+

-

+

Whether an index of this type can be clustered on

+

ampredlocks

+

boolean

+

-

+

Whether an index of this type manages fine-grained predicate locks

+

amkeytype

+

oid

+

PG_TYPE.oid

+

Type of data stored in index, or zero if not a fixed type

+

aminsert

+

regproc

+

PG_PROC.oid

+

"Insert this tuple" function

+

ambeginscan

+

regproc

+

PG_PROC.oid

+

"Prepare for index scan" function

+

amgettuple

+

regproc

+

PG_PROC.oid

+

"Next valid tuple" function, or zero if none

+

amgetbitmap

+

regproc

+

PG_PROC.oid

+

"Fetch all valid tuples" function, or zero if none

+

amrescan

+

regproc

+

PG_PROC.oid

+

"(Re)start index scan" function

+

amendscan

+

regproc

+

PG_PROC.oid

+

"Clean up after index scan" function

+

ammarkpos

+

regproc

+

PG_PROC.oid

+

"Mark current scan position" function

+

amrestrpos

+

regproc

+

PG_PROC.oid

+

"Restore marked scan position" function

+

ammerge

+

regproc

+

PG_PROC.oid

+

"Merge multiple indexes" function

+

ambuild

+

regproc

+

PG_PROC.oid

+

"Build new index" function

+

ambuildempty

+

regproc

+

PG_PROC.oid

+

"Build empty index" function

+

ambulkdelete

+

regproc

+

PG_PROC.oid

+

Bulk-delete function

+

amvacuumcleanup

+

regproc

+

PG_PROC.oid

+

Post-VACUUM cleanup function

+

amcanreturn

+

regproc

+

PG_PROC.oid

+

Function to check whether index supports index-only scans, or zero if none

+

amcostestimate

+

regproc

+

PG_PROC.oid

+

Function to estimate cost of an index scan

+

amoptions

+

regproc

+

PG_PROC.oid

+

Function to parse and validate reloptions for an index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0570.html b/docs/dws/dev/dws_04_0570.html new file mode 100644 index 00000000..76758ff0 --- /dev/null +++ b/docs/dws/dev/dws_04_0570.html @@ -0,0 +1,108 @@ + + +

PG_AMOP

+

PG_AMOP records information about operators associated with access method operator families. There is one row for each operator that is a member of an operator family. A family member can be either a search operator or an ordering operator. An operator can appear in more than one family, but cannot appear in more than one search position nor more than one ordering position within a family.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AMOP columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

amopfamily

+

oid

+

PG_OPFAMILY.oid

+

Operator family this entry is for

+

amoplefttype

+

oid

+

PG_TYPE.oid

+

Left-hand input data type of operator

+

amoprighttype

+

oid

+

PG_TYPE.oid

+

Right-hand input data type of operator

+

amopstrategy

+

smallint

+

-

+

Number of operator strategies

+

amoppurpose

+

"char"

+

-

+

Operator purpose, either s for search or o for ordering

+

amopopr

+

oid

+

PG_OPERATOR.oid

+

OID of the operator

+

amopmethod

+

oid

+

PG_AM.oid

+

Index access method the operator family is for

+

amopsortfamily

+

oid

+

PG_OPFAMILY.oid

+

The btree operator family this entry sorts according to, if an ordering operator; zero if a search operator

+
+
+

A "search" operator entry indicates that an index of this operator family can be searched to find all rows satisfying WHERE indexed_column operator constant. Obviously, such an operator must return a Boolean value, and its left-hand input type must match the index's column data type.

+

An "ordering" operator entry indicates that an index of this operator family can be scanned to return rows in the order represented by ORDER BY indexed_column operator constant. Such an operator could return any sortable data type, though again its left-hand input type must match the index's column data type. The exact semantics of the ORDER BY are specified by the amopsortfamily column, which must reference a btree operator family for the operator's result type.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0571.html b/docs/dws/dev/dws_04_0571.html new file mode 100644 index 00000000..e190f158 --- /dev/null +++ b/docs/dws/dev/dws_04_0571.html @@ -0,0 +1,80 @@ + + +

PG_AMPROC

+

PG_AMPROC records information about the support procedures associated with the access method operator families. There is one row for each support procedure belonging to an operator family.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AMPROC columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

amprocfamily

+

oid

+

PG_OPFAMILY.oid

+

Operator family this entry is for

+

amproclefttype

+

oid

+

PG_TYPE.oid

+

Left-hand input data type of associated operator

+

amprocrighttype

+

oid

+

PG_TYPE.oid

+

Right-hand input data type of associated operator

+

amprocnum

+

smallint

+

-

+

Support procedure number

+

amproc

+

regproc

+

PG_PROC.oid

+

OID of the procedure

+
+
+

The usual interpretation of the amproclefttype and amprocrighttype columns is that they identify the left and right input types of the operator(s) that a particular support procedure supports. For some access methods these match the input data type(s) of the support procedure itself, for others not. There is a notion of "default" support procedures for an index, which are those with amproclefttype and amprocrighttype both equal to the index opclass's opcintype.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0572.html b/docs/dws/dev/dws_04_0572.html new file mode 100644 index 00000000..852975a3 --- /dev/null +++ b/docs/dws/dev/dws_04_0572.html @@ -0,0 +1,51 @@ + + +

PG_ATTRDEF

+

PG_ATTRDEF stores default values of columns.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_ATTRDEF columns

Name

+

Type

+

Description

+

adrelid

+

oid

+

Table to which the column belongs

+

adnum

+

smallint

+

Number of the column

+

adbin

+

pg_node_tree

+

Internal representation of the default value of the column

+

adsrc

+

text

+

Internal representation of the readable default value

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0573.html b/docs/dws/dev/dws_04_0573.html new file mode 100644 index 00000000..72431b7a --- /dev/null +++ b/docs/dws/dev/dws_04_0573.html @@ -0,0 +1,187 @@ + + +

PG_ATTRIBUTE

+

PG_ATTRIBUTE records information about table columns.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_ATTRIBUTE columns

Name

+

Type

+

Description

+

attrelid

+

oid

+

Table to which the column belongs

+

attname

+

name

+

Column name

+

atttypid

+

oid

+

Column type

+

attstattarget

+

integer

+

Controls the level of details of statistics collected for this column by ANALYZE.

+
  • A zero value indicates that no statistics should be collected.
  • A negative value says to use the system default statistics target.
  • The exact meaning of positive values is data type-dependent.
+

For scalar data types, attstattarget is both the target number of "most common values" to collect, and the target number of histogram bins to create.

+

attlen

+

smallint

+

Copy of pg_type.typlen of the column's type

+

attnum

+

smallint

+

Number of a column.

+

attndims

+

integer

+

Number of dimensions if the column is an array; otherwise, the value is 0.

+

attcacheoff

+

integer

+

This column is always -1 on disk. When it is loaded into a row descriptor in the memory, it may be updated to cache the offset of the columns in the row.

+

atttypmod

+

integer

+

Type-specific data supplied at table creation time (for example, the maximum length of a varchar column). This column is used as the third parameter when passing to type-specific input functions and length coercion functions. The value will generally be -1 for types that do not need ATTTYPMOD.

+

attbyval

+

boolean

+

Copy of pg_type.typbyval of the column's type

+

attstorage

+

"char"

+

Copy of pg_type.typstorage of this column's type

+

attalign

+

"char"

+

Copy of pg_type.typalign of the column's type

+

attnotnull

+

boolean

+

A not-null constraint. It is possible to change this column to enable or disable the constraint.

+

atthasdef

+

boolean

+

Indicates that this column has a default value, in which case there will be a corresponding entry in the pg_attrdef table that actually defines the value.

+

attisdropped

+

boolean

+

Whether the column has been dropped and is no longer valid. A dropped column is still physically present in the table but is ignored by the analyzer, so it cannot be accessed through SQL.

+

attislocal

+

boolean

+

Whether the column is defined locally in the relation. Note that a column can be locally defined and inherited simultaneously.

+

attcmprmode

+

tinyint

+

Compressed modes for a specific column The compressed mode includes:

+
  • ATT_CMPR_NOCOMPRESS
  • ATT_CMPR_DELTA
  • ATT_CMPR_DICTIONARY
  • ATT_CMPR_PREFIX
  • ATT_CMPR_NUMSTR
+

attinhcount

+

integer

+

Number of direct ancestors this column has. A column with an ancestor cannot be dropped nor renamed.

+

attcollation

+

oid

+

Defined collation of a column

+

attacl

+

aclitem[]

+

Permissions for column-level access

+

attoptions

+

text[]

+

Property-level options

+

attfdwoptions

+

text[]

+

Property-level external data options

+

attinitdefval

+

bytea

+

attinitdefval stores the default value expression. ADD COLUMN in a row-store table must use this column.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0574.html b/docs/dws/dev/dws_04_0574.html new file mode 100644 index 00000000..05a1719d --- /dev/null +++ b/docs/dws/dev/dws_04_0574.html @@ -0,0 +1,213 @@ + + +

PG_AUTHID

+

PG_AUTHID records information about the database authentication identifiers (roles). The concept of users is contained in that of roles. A user is actually a role whose rolcanlogin has been set. Any role, whether the rolcanlogin is set or not, can use other roles as members.

+

For a cluster, only one pg_authid exists which is not available for every database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AUTHID columns

Column

+

Type

+

Description

+

oid

+

oid

+

Row identifier (hidden attribute; must be explicitly selected)

+

rolname

+

name

+

Role name

+

rolsuper

+

boolean

+

Whether the role is the initial system administrator with the highest permission

+

rolinherit

+

boolean

+

Whether the role automatically inherits permissions of roles it is a member of

+

rolcreaterole

+

boolean

+

Whether the role can create more roles

+

rolcreatedb

+

boolean

+

Whether the role can create databases

+

rolcatupdate

+

boolean

+

Whether the role can directly update system catalogs. Only the initial system administrator whose usesysid is 10 has this permission. It is not available for other users.

+

rolcanlogin

+

boolean

+

Whether a role can log in, that is, whether a role can be given as the initial session authorization identifier.

+

rolreplication

+

boolean

+

Indicates that the role is a replicated one (an adaptation syntax and no actual meaning).

+

rolauditadmin

+

boolean

+

Indicates that the role is an audit user.

+

rolsystemadmin

+

boolean

+

Indicates that the role is an administrator.

+

rolconnlimit

+

integer

+

For roles that can log in, this sets maximum number of concurrent connections this role can make. -1 means no limit.

+

rolpassword

+

text

+

Password (possibly encrypted); NULL if no password.

+

rolvalidbegin

+

timestamp with time zone

+

Account validity start time; NULL if no start time

+

rolvaliduntil

+

timestamp with time zone

+

Password expiry time; NULL if no expiration

+

rolrespool

+

name

+

Resource pool that a user can use

+

roluseft

+

boolean

+

Whether the role can perform operations on foreign tables

+

rolparentid

+

oid

+

OID of a group user to which the user belongs

+

roltabspace

+

Text

+

Storage space of the user permanent table

+

rolkind

+

char

+

Special type of user, including private users, logical cluster administrators, and common users.

+

rolnodegroup

+

oid

+

OID of a node group associated with a user. The node group must be a logical cluster.

+

roltempspace

+

Text

+

Storage space of the user temporary table

+

rolspillspace

+

Text

+

Operator disk spill space of the user

+

rolexcpdata

+

text

+

Reserved column

+

rolauthinfo

+

text

+

Additional information when LDAP authentication is used. If other authentication modes are used, the value is NULL.

+

rolpwdexpire

+

integer

+

Password expiration time. Users can change their password before it expires. After the password expires, only the administrator can change the password. The value -1 indicates that the password never expires.

+

rolpwdtime

+

timestamp with time zone

+

Time when a password is created

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0575.html b/docs/dws/dev/dws_04_0575.html new file mode 100644 index 00000000..08e2555c --- /dev/null +++ b/docs/dws/dev/dws_04_0575.html @@ -0,0 +1,44 @@ + + +

PG_AUTH_HISTORY

+

PG_AUTH_HISTORY records the authentication history of the role. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_AUTH_HISTORY columns

Name

+

Type

+

Description

+

roloid

+

oid

+

ID of the role

+

passwordtime

+

timestamp with time zone

+

Time of password creation and change

+

rolpassword

+

text

+

Role password that is encrypted using MD5 or SHA256, or that is not encrypted

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0576.html b/docs/dws/dev/dws_04_0576.html new file mode 100644 index 00000000..f2311002 --- /dev/null +++ b/docs/dws/dev/dws_04_0576.html @@ -0,0 +1,51 @@ + + +

PG_AUTH_MEMBERS

+

PG_AUTH_MEMBERS records the membership relations between roles.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AUTH_MEMBERS columns

Name

+

Type

+

Description

+

roleid

+

oid

+

ID of a role that has a member

+

member

+

oid

+

ID of a role that is a member of ROLEID

+

grantor

+

oid

+

ID of a role that grants this membership

+

admin_option

+

boolean

+

Whether a member can grant membership in ROLEID to others

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0577.html b/docs/dws/dev/dws_04_0577.html new file mode 100644 index 00000000..5b3d008f --- /dev/null +++ b/docs/dws/dev/dws_04_0577.html @@ -0,0 +1,60 @@ + + +

PG_CAST

+

PG_CAST records conversion relationships between data types.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_CAST columns

Name

+

Type

+

Description

+

castsource

+

oid

+

OID of the source data type

+

casttarget

+

oid

+

OID of the target data type

+

castfunc

+

oid

+

OID of the conversion function. If the value is 0, no conversion function is required.

+

castcontext

+

"char"

+

Conversion mode between the source and target data types

+
  • e indicates that only explicit conversion can be performed (using the CAST or :: syntax).
  • i indicates that only implicit conversion can be performed.
  • a indicates that both explicit and implicit conversion can be performed between data types.
+

castmethod

+

"char"

+

Conversion method

+
  • f indicates that conversion is performed using the specified function in the castfunc column.
  • b indicates that binary forcible conversion rather than the specified function in the castfunc column is performed between data types.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0578.html b/docs/dws/dev/dws_04_0578.html new file mode 100644 index 00000000..e69716a5 --- /dev/null +++ b/docs/dws/dev/dws_04_0578.html @@ -0,0 +1,401 @@ + + +

PG_CLASS

+

PG_CLASS records database objects and their relations.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_CLASS columns

Name

+

Type

+

Description

+

oid

+

oid

+

Row identifier (hidden attribute; must be explicitly selected)

+

relname

+

name

+

Name of an object, such as a table, index, or view

+

relnamespace

+

oid

+

OID of the namespace that contains the relationship

+

reltype

+

oid

+

Data type that corresponds to this table's row type (the index is 0 because the index does not have pg_type record)

+

reloftype

+

oid

+

OID is of composite type. 0 indicates other types.

+

relowner

+

oid

+

Owner of the relationship

+

relam

+

oid

+

Specifies the access method used, such as B-tree and hash, if this is an index

+

relfilenode

+

oid

+

Name of the on-disk file of this relationship. If such file does not exist, the value is 0.

+

reltablespace

+

oid

+

Tablespace in which this relationship is stored. If its value is 0, the default tablespace in this database is used. This column is meaningless if the relationship has no on-disk file.

+

relpages

+

double precision

+

Size of the on-disk representation of this table in pages (of size BLCKSZ). This is only an estimate used by the optimizer.

+

reltuples

+

double precision

+

Number of rows in the table. This is only an estimate used by the optimizer.

+

relallvisible

+

integer

+

Number of pages marked as all visible in the table. This column is used by the optimizer for optimizing SQL execution. It is updated by VACUUM, ANALYZE, and a few DDL statements such as CREATE INDEX.

+

reltoastrelid

+

oid

+

OID of the TOAST table associated with this table. The OID is 0 if no TOAST table exists.

+

The TOAST table stores large columns "offline" in a secondary table.

+

reltoastidxid

+

oid

+

OID of the index for a TOAST table. The OID is 0 for a table other than a TOAST table.

+

reldeltarelid

+

oid

+

OID of a Delta table

+

Delta tables belong to column-store tables. They store long tail data generated during data import.

+

reldeltaidx

+

oid

+

OID of the index for a Delta table

+

relcudescrelid

+

oid

+

OID of a CU description table

+

CU description tables (Desc tables) belong to column-store tables. They control whether storage data in the HDFS table directory is visible.

+

relcudescidx

+

oid

+

OID of the index for a CU description table

+

relhasindex

+

boolean

+

Its value is true if this column is a table and has (or recently had) at least one index.

+

It is set by CREATE INDEX but is not immediately cleared by DROP INDEX. If the VACUUM process detects that a table has no index, it clears the relhasindex column and sets the value to false.

+

relisshared

+

boolean

+

Its value is true if the table is shared across all databases in the cluster. Only certain system catalogs (such as pg_database) are shared.

+

relpersistence

+

"char"

+
  • p indicates a permanent table.
  • u indicates a non-log table.
  • t indicates a temporary table.
+

relkind

+

"char"

+
  • r indicates an ordinary table.
  • i indicates an index.
  • S indicates a sequence.
  • v indicates a view.
  • c indicates the composite type.
  • t indicates a TOAST table.
  • f indicates a foreign table.
+

relnatts

+

smallint

+

Number of user columns in the relationship (excluding system columns) pg_attribute has the same number of rows corresponding to the user columns.

+

relchecks

+

smallint

+

Number of constraints on a table. For details, see PG_CONSTRAINT.

+

relhasoids

+

boolean

+

Its value is true if an OID is generated for each row of the relationship.

+

relhaspkey

+

boolean

+

Its value is true if the table has (or once had) a primary key.

+

relhasrules

+

boolean

+

Its value is true if the table has rules. See table PG_REWRITE to check whether it has rules.

+

relhastriggers

+

boolean

+

Its value is true if the table has (or once had) triggers. See PG_TRIGGER.

+

relhassubclass

+

boolean

+

Its value is true if the table has (or once had) any inheritance child table.

+

relcmprs

+

tinyint

+

Whether the compression feature is enabled for the table. Note that only batch insertion triggers compression so ordinary CRUD does not trigger compression.

+
  • 0 indicates other tables that do not support compression (primarily system tables, on which the compression attribute cannot be modified).
  • 1 indicates that the compression feature of the table data is NOCOMPRESS or has no specified keyword.
  • 2 indicates that the compression feature of the table data is COMPRESS.
+

relhasclusterkey

+

boolean

+

Whether the local cluster storage is used

+

relrowmovement

+

boolean

+

Whether the row migration is allowed when the partitioned table is updated

+
  • true indicates that the row migration is allowed.
  • false indicates that the row migration is not allowed.
+

parttype

+

"char"

+

Whether the table or index has the property of a partitioned table

+
  • p indicates that the table or index has the property of a partitioned table.
  • n indicates that the table or index does not have the property of a partitioned table.
  • v indicates that the table is the value partitioned table in the HDFS.
+

relfrozenxid

+

xid32

+

All transaction IDs before this one have been replaced with a permanent ("frozen") transaction ID in this table. This column is used to track whether the table needs to be vacuumed in order to prevent transaction ID wraparound (or to allow pg_clog to be shrunk). The value is 0 (InvalidTransactionId) if the relationship is not a table.

+

To ensure forward compatibility, this column is reserved. The relfrozenxid64 column is added to record the information.

+

relacl

+

aclitem[]

+

Access permissions

+

The command output of the query is as follows:

+
1
rolename=xxxx/yyyy  --Assigning privileges to a role
+
+ +
+
1
=xxxx/yyyy --Assigning the permission to public
+
+ +
+

xxxx indicates the assigned privileges, and yyyy indicates the roles that are assigned to the privileges. For details about permission descriptions, see Table 2.

+

reloptions

+

text[]

+

Access-method-specific options, as "keyword=value" strings

+

relfrozenxid64

+

xid

+

All transaction IDs before this one have been replaced with a permanent ("frozen") transaction ID in this table. This column is used to track whether the table needs to be vacuumed in order to prevent transaction ID wraparound (or to allow pg_clog to be shrunk). The value is 0 (InvalidTransactionId) if the relationship is not a table.

+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Description of privileges

Parameter

+

Description

+

r

+

SELECT (read)

+

w

+

UPDATE (write)

+

a

+

INSERT (insert)

+

d

+

DELETE

+

D

+

TRUNCATE

+

x

+

REFERENCES

+

t

+

TRIGGER

+

X

+

EXECUTE

+

U

+

USAGE

+

C

+

CREATE

+

c

+

CONNECT

+

T

+

TEMPORARY

+

A

+

ANALYZE|ANALYSE

+

arwdDxtA

+

ALL PRIVILEGES (used for tables)

+

*

+

Authorization options for preceding permissions

+
+
+

Examples

View the OID and relfilenode of a table.

+
1
select oid,relname,relfilenode from pg_class where relname = 'table_name';
+
+ +
+

Count row-store tables.

+
1
select 'row count:'||count(1) as point from pg_class where relkind = 'r' and oid > 16384 and reloptions::text not like '%column%' and reloptions::text not like '%internal_mask%';
+
+ +
+

Count column-store tables.

+
1
select 'column count:'||count(1) as point from pg_class where relkind = 'r' and oid > 16384 and reloptions::text like '%column%';
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0579.html b/docs/dws/dev/dws_04_0579.html new file mode 100644 index 00000000..98a98e74 --- /dev/null +++ b/docs/dws/dev/dws_04_0579.html @@ -0,0 +1,88 @@ + + +

PG_COLLATION

+

PG_COLLATION records the available collations, which are essentially mappings from an SQL name to operating system locale categories.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COLLATION columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

collname

+

name

+

-

+

Collation name (unique per namespace and encoding)

+

collnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains this collation

+

collowner

+

oid

+

PG_AUTHID.oid

+

Owner of the collation

+

collencoding

+

integer

+

-

+

Encoding in which the collation is applicable, or -1 if it works for any encoding

+

collcollate

+

name

+

-

+

LC_COLLATE for this collation object

+

collctype

+

name

+

-

+

LC_CTYPE for this collation object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0580.html b/docs/dws/dev/dws_04_0580.html new file mode 100644 index 00000000..b837ab87 --- /dev/null +++ b/docs/dws/dev/dws_04_0580.html @@ -0,0 +1,210 @@ + + +

PG_CONSTRAINT

+

PG_CONSTRAINT records check, primary key, unique, and foreign key constraints on the tables.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_CONSTRAINT columns

Name

+

Type

+

Description

+

conname

+

name

+

Constraint name (not necessarily unique)

+

connamespace

+

oid

+

OID of the namespace that contains the constraint

+

contype

+

"char"

+
  • c indicates check constraints.
  • f indicates foreign key constraints.
  • p indicates primary key constraints.
  • u indicates unique constraints.
  • t indicates trigger constraints.
+

condeferrable

+

boolean

+

Whether the constraint can be deferrable

+

condeferred

+

boolean

+

Whether the constraint can be deferrable by default

+

convalidated

+

boolean

+

Whether the constraint is valid Currently, only foreign key and check constraints can be set to false.

+

conrelid

+

oid

+

Table containing this constraint. The value is 0 if it is not a table constraint.

+

contypid

+

oid

+

Domain containing this constraint. The value is 0 if it is not a domain constraint.

+

conindid

+

oid

+

ID of the index associated with the constraint

+

confrelid

+

oid

+

Referenced table if this constraint is a foreign key; otherwise, the value is 0.

+

confupdtype

+

"char"

+

Foreign key update action code

+
  • a indicates no action.
  • r indicates restriction.
  • c indicates cascading.
  • n indicates that the parameter is set to null.
  • d indicates that the default value is used.
+

confdeltype

+

"char"

+

Foreign key deletion action code

+
  • a indicates no action.
  • r indicates restriction.
  • c indicates cascading.
  • n indicates that the parameter is set to null.
  • d indicates that the default value is used.
+

confmatchtype

+

"char"

+

Foreign key match type

+
  • f indicates full match.
  • p indicates partial match.
  • u indicates simple match (not specified).
+

conislocal

+

boolean

+

Whether the local constraint is defined for the relationship

+

coninhcount

+

integer

+

Number of direct inheritance parent tables this constraint has. When the number is not 0, the constraint cannot be deleted or renamed.

+

connoinherit

+

boolean

+

Whether the constraint can be inherited

+

consoft

+

boolean

+

Whether the column indicates an informational constraint.

+

conopt

+

boolean

+

Whether you can use Informational Constraint to optimize the execution plan.

+

conkey

+

smallint[]

+

Column list of the constrained control if this column is a table constraint

+

confkey

+

smallint[]

+

List of referenced columns if this column is a foreign key

+

conpfeqop

+

oid[]

+

ID list of the equality operators for PK = FK comparisons if this column is a foreign key

+

conppeqop

+

oid[]

+

ID list of the equality operators for PK = PK comparisons if this column is a foreign key

+

conffeqop

+

oid[]

+

ID list of the equality operators for FK = FK comparisons if this column is a foreign key

+

conexclop

+

oid[]

+

ID list of the per-column exclusion operators if this column is an exclusion constraint

+

conbin

+

pg_node_tree

+

Internal representation of the expression if this column is a check constraint

+

consrc

+

text

+

Human-readable representation of the expression if this column is a check constraint

+
+
+
  • consrc is not updated when referenced objects change; for example, it will not track renaming of columns. Rather than relying on this field, it's best to use pg_get_constraintdef() to extract the definition of a check constraint.
  • pg_class.relchecks must be consistent with the number of check-constraint entries in this table for each relationship.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0581.html b/docs/dws/dev/dws_04_0581.html new file mode 100644 index 00000000..63ea6530 --- /dev/null +++ b/docs/dws/dev/dws_04_0581.html @@ -0,0 +1,97 @@ + + +

PG_CONVERSION

+

PG_CONVERSION records encoding conversion information.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_CONVERSION columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

conname

+

name

+

-

+

Conversion name (unique in a namespace)

+

connamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains this conversion

+

conowner

+

oid

+

PG_AUTHID.oid

+

Owner of the conversion

+

conforencoding

+

integer

+

-

+

Source encoding ID

+

contoencoding

+

integer

+

-

+

Destination encoding ID

+

conproc

+

regproc

+

PG_PROC.oid

+

Conversion procedure

+

condefault

+

boolean

+

-

+

Its value is true if this is the default conversion.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0582.html b/docs/dws/dev/dws_04_0582.html new file mode 100644 index 00000000..5ee6b3c5 --- /dev/null +++ b/docs/dws/dev/dws_04_0582.html @@ -0,0 +1,123 @@ + + +

PG_DATABASE

+

PG_DATABASE records information about the available databases.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_DATABASE columns

Name

+

Type

+

Description

+

datname

+

name

+

Database name

+

datdba

+

oid

+

Owner of the database, usually the user who created it

+

encoding

+

integer

+

Database encoding.

+

You can use pg_encoding_to_char() to convert this number to the encoding name.

+

datcollate

+

name

+

Sequence used by the database

+

datctype

+

name

+

Character type used by the database

+

datistemplate

+

boolean

+

Whether this column can serve as a template database

+

datallowconn

+

boolean

+

If false then no one can connect to this database. This column is used to protect the template0 database from being altered.

+

datconnlimit

+

integer

+

Maximum number of concurrent connections allowed on this database. -1 indicates no limit.

+

datlastsysoid

+

oid

+

Last system OID in the database

+

datfrozenxid

+

xid32

+

Tracks whether the database needs to be vacuumed in order to prevent transaction ID wraparound.

+

To ensure forward compatibility, this column is reserved. The datfrozenxid64 column is added to record the information.

+

dattablespace

+

oid

+

Default tablespace of the database

+

datcompatibility

+

name

+

Database compatibility mode

+

datacl

+

aclitem[]

+

Access permissions

+

datfrozenxid64

+

xid

+

Tracks whether the database needs to be vacuumed in order to prevent transaction ID wraparound.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0583.html b/docs/dws/dev/dws_04_0583.html new file mode 100644 index 00000000..d4672892 --- /dev/null +++ b/docs/dws/dev/dws_04_0583.html @@ -0,0 +1,44 @@ + + +

PG_DB_ROLE_SETTING

+

PG_DB_ROLE_SETTING records the default values of configuration items bonded to each role and database when the database is running.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_DB_ROLE_SETTING columns

Name

+

Type

+

Description

+

setdatabase

+

oid

+

Database corresponding to the configuration items; the value is 0 if the database is not specified

+

setrole

+

oid

+

Role corresponding to the configuration items; the value is 0 if the role is not specified

+

setconfig

+

text[]

+

Default value of configuration items when the database is running

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0584.html b/docs/dws/dev/dws_04_0584.html new file mode 100644 index 00000000..e093f0b0 --- /dev/null +++ b/docs/dws/dev/dws_04_0584.html @@ -0,0 +1,80 @@ + + +

PG_DEFAULT_ACL

+

PG_DEFAULT_ACL records the initial privileges assigned to the newly created objects.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_DEFAULT_ACL columns

Name

+

Type

+

Description

+

defaclrole

+

oid

+

ID of the role associated with the permission

+

defaclnamespace

+

oid

+

Namespace associated with the permission; the value is 0 if no ID

+

defaclobjtype

+

"char"

+

Object type of the permission:

+
  • r indicates a table or view.
  • S indicates a sequence.
  • f indicates a function.
  • T indicates a type.
+

defaclacl

+

aclitem[]

+

Access permissions that this type of object should have on creation

+
+
+

Example

Run the following command to view the initial permissions of the new user role1:

+
1
+2
+3
+4
select * from PG_DEFAULT_ACL;
+ defaclrole | defaclnamespace | defaclobjtype |    defaclacl
+------------+-----------------+---------------+-----------------
+      16820 |           16822 | r             | {role1=r/user1}
+
+ +
+

You can also run the following statement to convert the format:

+
1
SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Granter",  n.nspname AS "Schema",  CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' END AS "Type",  pg_catalog.array_to_string(d.defaclacl, E', ') AS "Access privileges" FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace ORDER BY 1, 2, 3;
+
+ +
+

If the following information is displayed, user1 grants role1 the read permission on schema user1.

+
1
+2
+3
+4
 Granter | Schema | Type  | Access privileges
+---------+--------+-------+-------------------
+ user1   | user1  | table | role1=r/user1
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0585.html b/docs/dws/dev/dws_04_0585.html new file mode 100644 index 00000000..1211646c --- /dev/null +++ b/docs/dws/dev/dws_04_0585.html @@ -0,0 +1,132 @@ + + +

PG_DEPEND

+

PG_DEPEND records the dependency relationships between database objects. This information allows DROP commands to find which other objects must be dropped by DROP CASCADE or prevent dropping in the DROP RESTRICT case.

+

See also PG_SHDEPEND, which provides a similar function for dependencies involving objects that are shared across a database cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_DEPEND columns

Name

+

Type

+

Reference

+

Description

+

classid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog the dependent object is in

+

objid

+

oid

+

Any OID column

+

OID of the specific dependent object

+

objsubid

+

integer

+

-

+

For a table column, this is the column number (the objid and classid refer to the table itself). For all other object types, this column is 0.

+

refclassid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog the referenced object is in

+

refobjid

+

oid

+

Any OID column

+

OID of the specific referenced object

+

refobjsubid

+

integer

+

-

+

For a table column, this is the column number (the refobjid and refclassid refer to the table itself). For all other object types, this column is 0.

+

deptype

+

"char"

+

-

+

A code defining the specific semantics of this dependency relationship

+
+
+

In all cases, a pg_depend entry indicates that the referenced object cannot be dropped without also dropping the dependent object. However, there are several subflavors defined by deptype:

+
  • DEPENDENCY_NORMAL (n): A normal relationship between separately-created objects. The dependent object can be dropped without affecting the referenced object. The referenced object can only be dropped by specifying CASCADE, in which case the dependent object is dropped, too. Example: a table column has a normal dependency on its data type.
  • DEPENDENCY_AUTO (a): The dependent object can be dropped separately from the referenced object, and should be automatically dropped (regardless of RESTRICT or CASCADE mode) if the referenced object is dropped. Example: a named constraint on a table is made autodependent on the table, so that it will go away if the table is dropped.
  • DEPENDENCY_INTERNAL (i): The dependent object was created as part of creation of the referenced object, and is only a part of its internal implementation. A DROP of the dependent object will be disallowed outright (We'll tell the user to issue a DROP against the referenced object, instead). A DROP of the referenced object will be propagated through to drop the dependent object whether CASCADE is specified or not. Example: A trigger created to enforce a foreign-key constraint is made internally dependent on the constraint's PG_CONSTRAINT entry.
  • DEPENDENCY_EXTENSION (e): dependent objects depended object extension of a member. For details, see PG_EXTENSION. The dependent object can be dropped via DROP EXTENSION on the referenced object. Functionally this dependency type acts the same as an internal dependency, but it is kept separate for clarity and to simplify gs_dump.
  • DEPENDENCY_PIN (p): There is no dependent object. This type of entry is a signal that the system itself depends on the referenced object, and so that object must never be deleted. Entries of this type are created only by initdb. The columns for the dependent object contain zeroes.
+

Examples

Query the table that depends on the database object sequence serial1.

+
  1. Query the OID of the sequence serial1 in the system catalog PG_CLASS.
    1
    +2
    +3
    +4
    +5
    SELECT oid FROM pg_class WHERE relname ='serial1';
    +  oid
    +-------
    + 17815
    +(1 row)
    +
    + +
    +
  2. Use the system catalog PG_DEPEND and the OID of serial1 to obtain the objects that depend on serial1.
    1
    +2
    +3
    +4
    +5
    +6
    SELECT * FROM pg_depend WHERE objid ='17815';
    + classid | objid | objsubid | refclassid | refobjid | refobjsubid | deptype
    +---------+-------+----------+------------+----------+-------------+---------
    +    1259 | 17815 |        0 |       2615 |     2200 |           0 | n
    +    1259 | 17815 |        0 |       1259 |    17812 |           1 | a
    +(2 rows)
    +
    + +
    +
  3. Obtain the OID of the table that depends on the serial1 sequence based on the refobjid field and query the table name. The result indicates that the table customer_address depends on serial1.
    1
    +2
    +3
    +4
    +5
    SELECT relname FROM pg_class where oid='17812';
    +     relname
    +------------------
    + customer_address
    +(1 row)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0586.html b/docs/dws/dev/dws_04_0586.html new file mode 100644 index 00000000..84ad2a86 --- /dev/null +++ b/docs/dws/dev/dws_04_0586.html @@ -0,0 +1,62 @@ + + +

PG_DESCRIPTION

+

PG_DESCRIPTION records optional descriptions (comments) for each database object. Descriptions of many built-in system objects are provided in the initial contents of PG_DESCRIPTION.

+

See also PG_SHDESCRIPTION, which performs a similar function for descriptions involving objects that are shared across a database cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_DESCRIPTION columns

Name

+

Type

+

Reference

+

Description

+

objoid

+

oid

+

Any OID column

+

OID of the object this description pertains to

+

classoid

+

oid

+

PG_CLASSoid

+

OID of the system catalog this object appears in

+

objsubid

+

integer

+

-

+

For a comment on a table column, this is the column number (the objoid and classoid refer to the table itself). For all other object types, this column is 0.

+

description

+

text

+

-

+

Arbitrary text that serves as the description of this object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0588.html b/docs/dws/dev/dws_04_0588.html new file mode 100644 index 00000000..c05487e9 --- /dev/null +++ b/docs/dws/dev/dws_04_0588.html @@ -0,0 +1,63 @@ + + +

PG_ENUM

+

PG_ENUM records entries showing the values and labels for each enum type. The internal representation of a given enum value is actually the OID of its associated row in pg_enum.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_ENUM columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

enumtypid

+

oid

+

PG_TYPE.oid

+

OID of the pg_type entry that contains this enum value

+

enumsortorder

+

real

+

-

+

Sort position of this enum value within its enum type

+

enumlabel

+

name

+

-

+

Textual label for this enum value

+
+
+

The OIDs for PG_ENUM rows follow a special rule: even-numbered OIDs are guaranteed to be ordered in the same way as the sort ordering of their enum type. That is, if two even OIDs belong to the same enum type, the smaller OID must have the smaller enumsortorder value. Odd-numbered OID values need bear no relationship to the sort order. This rule allows the enum comparison routines to avoid catalog lookups in many common cases. The routines that create and alter enum types attempt to assign even OIDs to enum values whenever possible.

+

When an enum type is created, its members are assigned sort-order positions from 1 to n. But members added later might be given negative or fractional values of enumsortorder. The only requirement on these values is that they be correctly ordered and unique within each enum type.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0589.html b/docs/dws/dev/dws_04_0589.html new file mode 100644 index 00000000..c9cd1b0b --- /dev/null +++ b/docs/dws/dev/dws_04_0589.html @@ -0,0 +1,72 @@ + + +

PG_EXTENSION

+

PG_EXTENSION records information about the installed extensions. By default, GaussDB(DWS) has 12 extensions, that is, PLPGSQL, DIST_FDW, FILE_FDW, HDFS_FDW, HSTORE, PLDBGAPI, DIMSEARCH, PACKAGES, GC_FDW, UUID-OSSP, LOG_FDW, and ROACH_API.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_EXTENSION

Name

+

Type

+

Description

+

extname

+

name

+

Extension name

+

extowner

+

oid

+

Owner of the extension

+

extnamespace

+

oid

+

Namespace containing the extension's exported objects

+

extrelocatable

+

boolean

+

Its value is true if the extension can be relocated to another schema.

+

extversion

+

text

+

Version number of the extension

+

extconfig

+

oid[]

+

Configuration information about the extension

+

extcondition

+

text[]

+

Filter conditions for the extension's configuration information

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0590.html b/docs/dws/dev/dws_04_0590.html new file mode 100644 index 00000000..85bf8582 --- /dev/null +++ b/docs/dws/dev/dws_04_0590.html @@ -0,0 +1,88 @@ + + +

PG_EXTENSION_DATA_SOURCE

+

PG_EXTENSION_DATA_SOURCE records information about external data source. An external data source contains information about an external database, such as its password encoding. It is mainy used with Extension Connector.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_EXTENSION_DATA_SOURCE columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

srcname

+

name

+

-

+

Name of an external data source

+

srcowner

+

oid

+

PG_AUTHID.oid

+

Owner of an external data source

+

srctype

+

text

+

-

+

Type of an external data source. It is NULL by default.

+

srcversion

+

text

+

-

+

Type of an external data source. It is NULL by default.

+

srcacl

+

aclitem[]

+

-

+

Access permissions

+

srcoptions

+

text[]

+

-

+

Option used for foreign data sources. It is a keyword=value string.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0591.html b/docs/dws/dev/dws_04_0591.html new file mode 100644 index 00000000..debbb25f --- /dev/null +++ b/docs/dws/dev/dws_04_0591.html @@ -0,0 +1,88 @@ + + +

PG_FOREIGN_DATA_WRAPPER

+

PG_FOREIGN_DATA_WRAPPER records foreign-data wrapper definitions. A foreign-data wrapper is the mechanism by which external data, residing on foreign servers, is accessed.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_FOREIGN_DATA_WRAPPER columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

fdwname

+

name

+

-

+

Name of the foreign-data wrapper

+

fdwowner

+

oid

+

PG_AUTHID.oid

+

Owner of the foreign-data wrapper

+

fdwhandler

+

oid

+

PG_PROC.oid

+

References a handler function that is responsible for supplying execution routines for the foreign-data wrapper. Its value is 0 if no handler is provided.

+

fdwvalidator

+

oid

+

PG_PROC.oid

+

References a validator function that is responsible for checking the validity of the options given to the foreign-data wrapper, as well as options for foreign servers and user mappings using the foreign-data wrapper. Its value is 0 if no validator is provided.

+

fdwacl

+

aclitem[]

+

-

+

Access permissions

+

fdwoptions

+

text[]

+

-

+

Option used for foreign data wrappers. It is a keyword=value string.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0592.html b/docs/dws/dev/dws_04_0592.html new file mode 100644 index 00000000..0af86ffe --- /dev/null +++ b/docs/dws/dev/dws_04_0592.html @@ -0,0 +1,97 @@ + + +

PG_FOREIGN_SERVER

+

PG_FOREIGN_SERVER records the foreign server definitions. A foreign server describes a source of external data, such as a remote server. Foreign servers are accessed via foreign-data wrappers.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_FOREIGN_SERVER columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

srvname

+

name

+

-

+

Name of the foreign server

+

srvowner

+

oid

+

PG_AUTHID.oid

+

Owner of the foreign server

+

srvfdw

+

oid

+

PG_FOREIGN_DATA_WRAPPER.oid

+

OID of the foreign-data wrapper of this foreign server

+

srvtype

+

text

+

-

+

Type of the server (optional)

+

srvversion

+

text

+

-

+

Version of the server (optional)

+

srvacl

+

aclitem[]

+

-

+

Access permissions

+

srvoptions

+

text[]

+

-

+

Option used for foreign servers. It is a keyword=value string.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0593.html b/docs/dws/dev/dws_04_0593.html new file mode 100644 index 00000000..88bab5d3 --- /dev/null +++ b/docs/dws/dev/dws_04_0593.html @@ -0,0 +1,51 @@ + + +

PG_FOREIGN_TABLE

+

PG_FOREIGN_TABLE records auxiliary information about foreign tables.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_FOREIGN_TABLE columns

Name

+

Type

+

Description

+

ftrelid

+

oid

+

OID of the foreign table

+

ftserver

+

oid

+

OID of the server where the foreign table is located

+

ftwriteonly

+

boolean

+

Whether data can be written in the foreign table

+

ftoptions

+

text[]

+

Foreign table options

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0594.html b/docs/dws/dev/dws_04_0594.html new file mode 100644 index 00000000..5b7774fd --- /dev/null +++ b/docs/dws/dev/dws_04_0594.html @@ -0,0 +1,150 @@ + + +

PG_INDEX

+

PG_INDEX records part of the information about indexes. The rest is mostly in PG_CLASS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_INDEX columns

Name

+

Type

+

Description

+

indexrelid

+

oid

+

OID of the pg_class entry for this index

+

indrelid

+

oid

+

OID of the pg_class entry for the table this index is for

+

indnatts

+

smallint

+

Number of columns in an index

+

indisunique

+

boolean

+

This index is a unique index if the value is true.

+

indisprimary

+

boolean

+

This index represents the primary key of the table if the value is true. If this value is true, the value of indisunique is true.

+

indisexclusion

+

boolean

+

This index supports exclusion constraints if the value is true.

+

indimmediate

+

boolean

+

A uniqueness check is performed upon data insertion if the value is true.

+

indisclustered

+

boolean

+

The table was last clustered on this index if the value is true.

+

indisusable

+

boolean

+

This index supports insert/select if the value is true.

+

indisvalid

+

boolean

+

This index is valid for queries if the value is true. If this column is false, this index is possibly incomplete and must still be modified by INSERT/UPDATE operations, but it cannot safely be used for queries. If it is a unique index, the uniqueness property is also not true.

+

indcheckxmin

+

boolean

+

If the value is true, queries must not use the index until the xmin of this row in pg_index is below their TransactionXmin event horizon, because the table may contain broken HOT chains with incompatible rows that they can see.

+

indisready

+

boolean

+

If the value is true, this index is ready for inserts. If the value is false, this index is ignored when data is inserted or modified.

+

indkey

+

int2vector

+

This is an array of indnatts values that indicate which table columns this index creates. For example, a value of 1 3 means that the first and the third columns make up the index key. 0 in this array indicates that the corresponding index attribute is an expression over the table columns, rather than a simple column reference.

+

indcollation

+

oidvector

+

+

ID of each column used by the index

+

indclass

+

oidvector

+

For each column in the index key, this column contains the OID of the operator class to use. For details, see PG_OPCLASS.

+

indoption

+

int2vector

+

Array of values that store per-column flag bits. The meaning of the bits is defined by the index's access method.

+

indexprs

+

pg_node_tree

+

Expression trees (in nodeToString() representation) for index attributes that are not simple column references. It is a list with one element for each zero entry in INDKEY. NULL if all index attributes are simple references.

+

indpred

+

pg_node_tree

+

Expression tree (in nodeToString() representation) for partial index predicate. If the index is not a partial index, the value is null.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0595.html b/docs/dws/dev/dws_04_0595.html new file mode 100644 index 00000000..414bd949 --- /dev/null +++ b/docs/dws/dev/dws_04_0595.html @@ -0,0 +1,52 @@ + + +

PG_INHERITS

+

PG_INHERITS records information about table inheritance hierarchies. There is one entry for each direct child table in the database. Indirect inheritance can be determined by following chains of entries.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_INHERITS columns

Name

+

Type

+

Reference

+

Description

+

inhrelid

+

oid

+

PG_CLASS.oid

+

OID of the child table

+

inhparent

+

oid

+

PG_CLASS.oid

+

OID of the parent table

+

inhseqno

+

integer

+

-

+

If there is more than one direct parent for a child table (multiple inheritances), this number tells the order in which the inherited columns are to be arranged. The count starts at 1.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0596.html b/docs/dws/dev/dws_04_0596.html new file mode 100644 index 00000000..56aa95fc --- /dev/null +++ b/docs/dws/dev/dws_04_0596.html @@ -0,0 +1,135 @@ + + +

PG_JOBS

+

PG_JOBS records detailed information about jobs created by users. Dedicated threads poll the pg_jobs table and trigger jobs based on scheduled job execution time. This table belongs to the Shared Relation category. All job records are visible to all databases.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_JOBS columns

Name

+

Type

+

Description

+

job_id

+

integer

+

Job ID, primary key, unique (with a unique index)

+

what

+

text

+

Job content

+

log_user

+

oid

+

Username of the job creator

+

priv_user

+

oid

+

User ID of the job executor

+

job_db

+

oid

+

OID of the database where the job is executed

+

job_nsp

+

oid

+

OID of the namespace where a job is running

+

job_node

+

oid

+

CN node on which the job will be created and executed

+

is_broken

+

boolean

+

Job invalid or not. If a job fails to be executed for 16 consecutive times, is_broken is automatically set to true and the job will not be executed later.

+

start_date

+

timestamp without time zone

+

Start time of the first job execution, accurate to millisecond

+

next_run_date

+

timestamp without time zone

+

Scheduled time of the next job execution, accurate to millisecond

+

failure_count

+

smallint

+

Number of times the job has started and failed. If a job fails to be executed for 16 consecutive times, no more attempt will be made on it.

+

interval

+

text

+

Job execution interval

+

last_start_date

+

timestamp without time zone

+

Start time of the last job execution, accurate to millisecond

+

last_end_date

+

timestamp without time zone

+

End time of the last job execution, accurate to millisecond

+

last_suc_date

+

timestamp without time zone

+

Start time of the last successful job execution, accurate to millisecond

+

this_run_date

+

timestamp without time zone

+

Start time of the ongoing job execution, accurate to millisecond

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0597.html b/docs/dws/dev/dws_04_0597.html new file mode 100644 index 00000000..bccce061 --- /dev/null +++ b/docs/dws/dev/dws_04_0597.html @@ -0,0 +1,106 @@ + + +

PG_LANGUAGE

+

PG_LANGUAGE records programming languages. You can use them and interfaces to write functions or stored procedures.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_LANGUAGE columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

lanname

+

name

+

-

+

Name of the language

+

lanowner

+

oid

+

PG_AUTHID.oid

+

Owner of the language

+

lanispl

+

boolean

+

-

+

The value is false for internal languages (such as SQL) and true for user-defined languages. Currently, gs_dump still uses this to determine which languages need to be dumped, but this might be replaced by a different mechanism in the future.

+

lanpltrusted

+

boolean

+

-

+

Its value is true if this is a trusted language, which means that it is believed not to grant access to anything outside the normal SQL execution environment. Only the initial user can create functions in untrusted languages.

+

lanplcallfoid

+

oid

+

PG_PROC.oid

+

For external languages, this references the language handler, which is a special function that is responsible for executing all functions that are written in the particular language.

+

laninline

+

oid

+

PG_PROC.oid

+

This references a function that is responsible for executing "inline" anonymous code blocks (DO blocks). The value is 0 if inline blocks are not supported.

+

lanvalidator

+

oid

+

PG_PROC.oid

+

This references a language validator function that is responsible for checking the syntax and validity of new functions when they are created. The value is 0 if no validator is provided.

+

lanacl

+

aclitem[]

+

-

+

Access permissions

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0598.html b/docs/dws/dev/dws_04_0598.html new file mode 100644 index 00000000..22503c9a --- /dev/null +++ b/docs/dws/dev/dws_04_0598.html @@ -0,0 +1,54 @@ + + +

PG_LARGEOBJECT

+

PG_LARGEOBJECT records the data making up large objects A large object is identified by an OID assigned when it is created. Each large object is broken into segments or "pages" small enough to be conveniently stored as rows in pg_largeobject. The amount of data per page is defined to be LOBLKSIZE (which is currently BLCKSZ/4, or typically 2 kB).

+

It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_LARGEOBJECT columns

Name

+

Type

+

Reference

+

Description

+

loid

+

oid

+

PG_LARGEOBJECT_METADATA.oid

+

Identifier of the large object that includes this page

+

pageno

+

integer

+

-

+

Page number of this page within its large object (counting from zero)

+

data

+

bytea

+

-

+

Actual data stored in the large object. This will never be more than LOBLKSIZE bytes and might be less.

+
+
+

Each row of pg_largeobject holds data for one page of a large object, beginning at byte offset (pageno * LOBLKSIZE) within the object. The implementation allows sparse storage: pages might be missing, and might be shorter than LOBLKSIZE bytes even if they are not the last page of the object. Missing regions within a large object are read as zeroes.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0599.html b/docs/dws/dev/dws_04_0599.html new file mode 100644 index 00000000..11394d59 --- /dev/null +++ b/docs/dws/dev/dws_04_0599.html @@ -0,0 +1,52 @@ + + +

PG_LARGEOBJECT_METADATA

+

PG_LARGEOBJECT_METADATA records metadata associated with large objects. The actual large object data is stored in PG_LARGEOBJECT.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_LARGEOBJECT_METADATA columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

lomowner

+

oid

+

PG_AUTHID.oid

+

Owner of the large object

+

lomacl

+

aclitem[]

+

-

+

Access permissions

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0600.html b/docs/dws/dev/dws_04_0600.html new file mode 100644 index 00000000..e83aa5c0 --- /dev/null +++ b/docs/dws/dev/dws_04_0600.html @@ -0,0 +1,65 @@ + + +

PG_NAMESPACE

+

PG_NAMESPACE records the namespaces, that is, schema-related information.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_NAMESPACE columns

Name

+

Type

+

Description

+

nspname

+

name

+

Name of the namespace

+

nspowner

+

oid

+

Owner of the namespace

+

nsptimeline

+

bigint

+

Timeline when the namespace is created on the DN This column is for internal use and valid only on the DN.

+

nspacl

+

aclitem[]

+

Access permissions For details, see GRANT and REVOKE.

+

permspace

+

bigint

+

Quota of a schema's permanent tablespace

+

usedspace

+

bigint

+

Used size of a schema's permanent tablespace

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0601.html b/docs/dws/dev/dws_04_0601.html new file mode 100644 index 00000000..b79665f9 --- /dev/null +++ b/docs/dws/dev/dws_04_0601.html @@ -0,0 +1,69 @@ + + +

PG_OBJECT

+

PG_OBJECT records the user creation, creation time, last modification time, and last analyzing time of objects of specified types (types existing in object_type).

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OBJECT columns

Name

+

Type

+

Description

+

object_oid

+

oid

+

Object identifier.

+

object_type

+

"char"

+

Object type:

+
  • r indicates a table, which can be an ordinary table or a temporary table.
  • i indicates an index.
  • s indicates a sequence.
  • v indicates a view.
  • p indicates a stored procedure and function.
+

creator

+

oid

+

ID of the creator.

+

ctime

+

timestamp with time zone

+

Object creation time.

+

mtime

+

timestamp with time zone

+

Time when the object was last modified. By default, the ALTER, COMMENT, GRANT, REVOKE, and TRUNCATE operations are recorded.

+

If light_object_mtime is configured for behavior_compat_options, the GRANT, REVOKE, and TRUNCATE operations are not recorded.

+

last_analyze_time

+

timestamp with time zone

+

Time when an object is analyzed for the last time.

+
+
+
  • Only normal user operations are recorded. Operations before the object upgrade and during the initdb process cannot be recorded.
  • ctime and mtime are the start time of the transaction.
  • The time of object modification due to capacity expansion is also recorded.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0602.html b/docs/dws/dev/dws_04_0602.html new file mode 100644 index 00000000..b4ced81c --- /dev/null +++ b/docs/dws/dev/dws_04_0602.html @@ -0,0 +1,106 @@ + + +

PG_OBSSCANINFO

+

PG_OBSSCANINFO defines the OBS runtime information scanned in cluster acceleration scenarios. Each record corresponds to a piece of runtime information of a foreign table on OBS in a query.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OBSSCANINFO columns

Name

+

Type

+

Reference

+

Description

+

query_id

+

bigint

+

-

+

Query ID

+

user_id

+

text

+

-

+

Database user who performs queries

+

table_name

+

text

+

-

+

Name of a foreign table on OBS

+

file_type

+

text

+

-

+

Format of files storing the underlying data

+

time_stamp

+

time_stam

+

-

+

Scanning start time

+

actual_time

+

double

+

-

+

Scanning execution time, in seconds

+

file_scanned

+

bigint

+

-

+

Number of files scanned

+

data_size

+

double

+

-

+

Size of data scanned, in bytes

+

billing_info

+

text

+

-

+

Reserved columns

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0603.html b/docs/dws/dev/dws_04_0603.html new file mode 100644 index 00000000..cd4cc287 --- /dev/null +++ b/docs/dws/dev/dws_04_0603.html @@ -0,0 +1,108 @@ + + +

PG_OPCLASS

+

PG_OPCLASS defines index access method operator classes.

+

Each operator class defines semantics for index columns of a particular data type and a particular index access method. An operator class essentially specifies that a particular operator family is applicable to a particular indexable column data type. The set of operators from the family that are actually usable with the indexed column are whichever ones accept the column's data type as their lefthand input.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OPCLASS columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

opcmethod

+

oid

+

PG_AM.oid

+

Index access method the operator class is for

+

opcname

+

name

+

-

+

Name of the operator class

+

opcnamespace

+

oid

+

PG_NAMESPACE.oid

+

Namespace to which the operator class belongs

+

opcowner

+

oid

+

PG_AUTHID.oid

+

Owner of the operator class

+

opcfamily

+

oid

+

PG_OPFAMILY.oid

+

Operator family containing the operator class

+

opcintype

+

oid

+

PG_TYPE.oid

+

Data type that the operator class indexes

+

opcdefault

+

boolean

+

-

+

Whether the operator class is the default for opcintype. If it is, its value is true.

+

opckeytype

+

oid

+

PG_TYPE.oid

+

Type of data stored in index, or zero if same as opcintype

+
+
+

An operator class's opcmethod must match the opfmethod of its containing operator family. Also, there must be no more than one pg_opclass row having opcdefault true for any given combination of opcmethod and opcintype.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0604.html b/docs/dws/dev/dws_04_0604.html new file mode 100644 index 00000000..86e03b3b --- /dev/null +++ b/docs/dws/dev/dws_04_0604.html @@ -0,0 +1,160 @@ + + +

PG_OPERATOR

+

PG_OPERATOR records information about operators.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OPERATOR columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

oprname

+

name

+

-

+

Name of the operator

+

oprnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains this operator

+

oprowner

+

oid

+

PG_AUTHID.oid

+

Owner of the operator

+

oprkind

+

"char"

+

-

+
  • b: infix ("both")
  • l: prefix ("left")
  • r: postfix ("right")
+

oprcanmerge

+

boolean

+

-

+

Whether the operator supports merge joins

+

oprcanhash

+

boolean

+

-

+

Whether the operator supports hash joins

+

oprleft

+

oid

+

PG_TYPE.oid

+

Type of the left operand

+

oprright

+

oid

+

PG_TYPE.oid

+

Type of the right operand

+

oprresult

+

oid

+

PG_TYPE.oid

+

Type of the result

+

oprcom

+

oid

+

PG_OPERATOR.oid

+

Commutator of this operator, if any

+

oprnegate

+

oid

+

PG_OPERATOR.oid

+

Negator of this operator, if any

+

oprcode

+

regproc

+

PG_PROC.oid

+

Function that implements this operator

+

oprrest

+

regproc

+

PG_PROC.oid

+

Restriction selectivity estimation function for this operator

+

oprjoin

+

regproc

+

PG_PROC.oid

+

Join selectivity estimation function for this operator

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0605.html b/docs/dws/dev/dws_04_0605.html new file mode 100644 index 00000000..be1f81b2 --- /dev/null +++ b/docs/dws/dev/dws_04_0605.html @@ -0,0 +1,72 @@ + + +

PG_OPFAMILY

+

PG_OPFAMILY defines operator families.

+

Each operator family is a collection of operators and associated support routines that implement the semantics specified for a particular index access method. Furthermore, the operators in a family are all "compatible", in a way that is specified by the access method. The operator family concept allows cross-data-type operators to be used with indexes and to be reasoned about using knowledge of access method semantics.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OPFAMILY columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

opfmethod

+

oid

+

PG_AM.oid

+

Index access method the operator family is for

+

opfname

+

name

+

-

+

Name of the operator family

+

opfnamespace

+

oid

+

PG_NAMESPACE.oid

+

Namespace of the operator family

+

opfowner

+

oid

+

PG_AUTHID.oid

+

Owner of the operator family

+
+
+

The majority of the information defining an operator family is not in PG_OPFAMILY, but in the associated PG_AMOP, PG_AMPROC, and PG_OPCLASS.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0606.html b/docs/dws/dev/dws_04_0606.html new file mode 100644 index 00000000..ea19b305 --- /dev/null +++ b/docs/dws/dev/dws_04_0606.html @@ -0,0 +1,224 @@ + + +

PG_PARTITION

+

PG_PARTITION records all partitioned tables, table partitions, toast tables on table partitions, and index partitions in the database. Partitioned index information is not stored in the PG_PARTITION system catalog.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_PARTITION columns

Name

+

Type

+

Description

+

relname

+

name

+

Names of the partitioned tables, table partitions, TOAST tables on table partitions, and index partitions

+

parttype

+

"char"

+

Object type

+
  • r indicates a partitioned table.
  • p indicates a table partition.
  • x indicates an index partition.
  • t indicates a TOAST table.
+

parentid

+

oid

+

OID of the partitioned table in PG_CLASS when the object is a partitioned table or table partition

+

OID of the partitioned index when the object is an index partition

+

rangenum

+

integer

+

Reserved field.

+

intervalnum

+

integer

+

Reserved field.

+

partstrategy

+

"char"

+

Partition policy of the partitioned table. The following policies are supported:

+

r indicates the range partition.

+

v indicates the numeric partition

+

relfilenode

+

oid

+

Physical storage locations of the table partition, index partition, and TOAST table on the table partition.

+

reltablespace

+

oid

+

OID of the tablespace containing the table partition, index partition, TOAST table on the table partition

+

relpages

+

double precision

+

Statistics: numbers of data pages of the table partition and index partition

+

reltuples

+

double precision

+

Statistics: numbers of tuples of the table partition and index partition.

+

relallvisible

+

integer

+

Statistics: number of visible data pages of the table partition and index partition.

+

reltoastrelid

+

oid

+

OID of the TOAST table corresponding to the table partition

+

reltoastidxid

+

oid

+

OID of the TOAST table index corresponding to the table partition

+

indextblid

+

oid

+

OID of the table partition corresponding to the index partition

+

indisusable

+

boolean

+

Whether the index partition is available

+

reldeltarelid

+

oid

+

OID of a Delta table

+

reldeltaidx

+

oid

+

OID of the index for a Delta table

+

relcudescrelid

+

oid

+

OID of a CU description table

+

relcudescidx

+

oid

+

OID of the index for a CU description table

+

relfrozenxid

+

xid32

+

Frozen transaction ID

+

To ensure forward compatibility, this column is reserved. The relfrozenxid64 column is added to record the information.

+

intspnum

+

integer

+

Number of tablespaces that the interval partition belongs to

+

partkey

+

int2vector

+

Column number of the partition key

+

intervaltablespace

+

oidvector

+

Tablespace that the interval partition belongs to. Interval partitions fall in the tablespaces in the round-robin manner

+

interval

+

text[]

+

Interval value of the interval partition

+

boundaries

+

text[]

+

Upper boundary of the range partition and interval partition

+

transit

+

text[]

+

Transit of the interval partition

+

reloptions

+

text[]

+

Storage property of a partition used for collecting online scale-out information. Same as pg_class.reloptions, it is a keyword=value string.

+

relfrozenxid64

+

xid

+

Frozen transaction ID

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0607.html b/docs/dws/dev/dws_04_0607.html new file mode 100644 index 00000000..0b2ff893 --- /dev/null +++ b/docs/dws/dev/dws_04_0607.html @@ -0,0 +1,79 @@ + + +

PG_PLTEMPLATE

+

PG_PLTEMPLATE records template information for procedural languages.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_PLTEMPLATE columns

Name

+

Type

+

Description

+

tmplname

+

name

+

Name of the language for which this template is used

+

tmpltrusted

+

boolean

+

The value is true if the language is considered trusted.

+

tmpldbacreate

+

boolean

+

The value is true if the language is created by the owner of the database.

+

tmplhandler

+

text

+

Name of the call handler function

+

tmplinline

+

text

+

Name of the anonymous block handler. If no name of the block handler exists, the value is null.

+

tmplvalidator

+

text

+

Name of the verification function. If no verification function is available, the value is null.

+

tmpllibrary

+

text

+

Path of the shared library that implements languages

+

tmplacl

+

aclitem[]

+

Access permissions for template (not yet used)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0608.html b/docs/dws/dev/dws_04_0608.html new file mode 100644 index 00000000..13f6172a --- /dev/null +++ b/docs/dws/dev/dws_04_0608.html @@ -0,0 +1,271 @@ + + +

PG_PROC

+

PG_PROC records information about functions or procedures.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_PROC columns

Name

+

Type

+

Description

+

proname

+

name

+

Name of the function

+

pronamespace

+

oid

+

OID of the namespace that contains the function

+

proowner

+

oid

+

Owner of the function

+

prolang

+

oid

+

Implementation language or call interface of the function

+

procost

+

real

+

Estimated execution cost

+

prorows

+

real

+

Estimate number of result rows

+

provariadic

+

oid

+

Data type of parameter element

+

protransform

+

regproc

+

Simplified call method for this function

+

proisagg

+

boolean

+

Whether this function is an aggregate function

+

proiswindow

+

boolean

+

Whether this function is a window function

+

prosecdef

+

boolean

+

Whether this function is a security definer (such as a "setuid" function)

+

proleakproof

+

boolean

+

Whether this function has side effects. If no leakproof treatment is provided for parameters, the function throws errors.

+

proisstrict

+

boolean

+

The function returns null if any call parameter is null. In that case the function does not actually be called at all. Functions that are not "strict" must be prepared to process null inputs.

+

proretset

+

boolean

+

The function returns a set, that is, multiple values of the specified data type.

+

provolatile

+

"char"

+

Whether the function's result depends only on its input parameters, or is affected by outside factors

+
  • It is i for "immutable" functions, which always deliver the same result for the same inputs.
  • It is s for "stable" functions, whose results (for fixed inputs) do not change within a scan.
  • It is v for "volatile" functions, whose results may change at any time.
+

pronargs

+

smallint

+

Number of parameters

+

pronargdefaults

+

smallint

+

Number of parameters that have default values

+

prorettype

+

oid

+

OID of the returned parameter type

+

proargtypes

+

oidvector

+

Array with the data types of the function parameters. This array includes only input parameters (including INOUT parameters) and thus represents the call signature of the function.

+

proallargtypes

+

oid[]

+

Array with the data types of the function parameters. This array includes all parameter types (including OUT and INOUT parameters); however, if all the parameters are IN parameters, this column is null. Note that array subscripting is 1-based, whereas for historical reasons, and proargtypes is subscripted from 0.

+

proargmodes

+

"char"[]

+

Array with the modes of the function parameters.

+
  • i indicates IN parameters.
  • o indicates OUT parameters.
  • b indicates INOUT parameters.
+

If all the parameters are IN parameters, this column is null. Note that subscripts of this array correspond to positions of proallargtypes not proargtypes.

+

proargnames

+

text[]

+

Array that stores the names of the function parameters. Parameters without a name are set to empty strings in the array. If none of the parameters have a name, this column is null. Note that subscripts correspond to positions of proallargtypes not proargtypes.

+

proargdefaults

+

pg_node_tree

+

Expression tree of the default value. This is the list of PRONARGDEFAULTS elements.

+

prosrc

+

text

+

A definition that describes a function or stored procedure. In an interpreting language, it is the function source code, a link symbol, a file name, or any body content specified when a function or stored procedure is created, depending on how a language or calling is used.

+

probin

+

text

+

Additional information about how to call the function. Again, the interpretation is language-specific.

+

proconfig

+

text[]

+

Function's local settings for run-time configuration variables.

+

proacl

+

aclitem[]

+

Access permissions For details, see GRANT and REVOKE.

+

prodefaultargpos

+

int2vector

+

Locations of the function default values. Not only the last few parameters have default values.

+

fencedmode

+

boolean

+

Execution mode of a function, indicating whether a function is executed in fence or not fence mode. If the execution mode is fence, the function is executed in the fork process that is reworked. The default value is fence.

+

proshippable

+

boolean

+

Whether a function can be pushed down to DNs. The default value is false.

+
  • Functions of the IMMUTABLE type can always be pushed down to the DNs.
  • Functions of the STABLE or VOLATILE type can be pushed down to DNs only if their attribute is SHIPPABLE.
+

propackage

+

boolean

+

Indicates whether the function supports overloading, which is mainly used for the Oracle style function. The default value is false.

+
+
+

Examples

Query the OID of a specified function. For example, obtain the OID 1295 of the justify_days function.

+
1
+2
+3
+4
+5
SELECT oid FROM pg_proc where proname ='justify_days';
+ oid
+------
+ 1295
+(1 row)
+
+ +
+

Query whether a function is an aggregate function. For example, the justify_days function is a non-aggregate function.

+
1
+2
+3
+4
+5
SELECT proisagg FROM pg_proc where proname ='justify_days';
+ proisagg
+----------
+ f
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0609.html b/docs/dws/dev/dws_04_0609.html new file mode 100644 index 00000000..1ea2439e --- /dev/null +++ b/docs/dws/dev/dws_04_0609.html @@ -0,0 +1,81 @@ + + +

PG_RANGE

+

PG_RANGE records information about range types.

+

This is in addition to the types' entries in PG_TYPE.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_RANGE columns

Name

+

Type

+

Reference

+

Description

+

rngtypid

+

oid

+

PG_TYPE.oid

+

OID of the range type

+

rngsubtype

+

oid

+

PG_TYPE.oid

+

OID of the element type (subtype) of this range type

+

rngcollation

+

oid

+

PG_COLLATION.oid

+

OID of the collation used for range comparisons, or 0 if none

+

rngsubopc

+

oid

+

PG_OPCLASS.oid

+

OID of the subtype's operator class used for range comparisons

+

rngcanonical

+

regproc

+

PG_PROC.oid

+

OID of the function to convert a range value into canonical form, or 0 if none

+

rngsubdiff

+

regproc

+

PG_PROC.oid

+

OID of the function to return the difference between two element values as double precision, or 0 if none

+
+
+

rngsubopc (plus rngcollation, if the element type is collatable) determines the sort ordering used by the range type. rngcanonical is used when the element type is discrete.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0610.html b/docs/dws/dev/dws_04_0610.html new file mode 100644 index 00000000..99d3135b --- /dev/null +++ b/docs/dws/dev/dws_04_0610.html @@ -0,0 +1,102 @@ + + +

PG_REDACTION_COLUMN

+

PG_REDACTION_COLUMN records the information about the redacted columns.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_REDACTION_COLUMN columns

Name

+

Type

+

Description

+

object_oid

+

oid

+

OID of the object to be redacted.

+

column_attrno

+

smallint

+

attrno of the redacted column.

+

function_type

+

integer

+

Redaction type.

+
NOTE:

This column is reserved. It is used only for forward compatibility of redacted column information in earlier versions. The value can be 0 (NONE) or 1 (FULL).

+
+

function_parameters

+

text

+

Parameters used when the redaction type is partial (reserved).

+

regexp_pattern

+

text

+

Pattern string when the redaction type is regexp (reserved).

+

regexp_replace_string

+

text

+

Replacement string when the redaction type is regexp (reserved).

+

regexp_position

+

integer

+

Start and end replacement positions when the redaction type is regexp (reserved).

+

regexp_occurrence

+

integer

+

Replacement times when the redaction type is regexp (reserved).

+

regexp_match_parameter

+

text

+

Regular control parameter used when the redaction type is regexp (reserved).

+

column_description

+

text

+

Description of the redacted column.

+

function_expr

+

pg_node_tree

+

Internal representation of the redaction function.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0611.html b/docs/dws/dev/dws_04_0611.html new file mode 100644 index 00000000..258dd82a --- /dev/null +++ b/docs/dws/dev/dws_04_0611.html @@ -0,0 +1,61 @@ + + +

PG_REDACTION_POLICY

+

PG_REDACTION_POLICY records information about the object to be redacted.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_REDACTION_POLICY columns

Name

+

Type

+

Description

+

object_oid

+

oid

+

OID of the object to be redacted.

+

policy_name

+

name

+

Name of the redact policy.

+

enable

+

boolean

+

Policy status (enabled or disabled).

+
NOTE:

The value can be:

+
  • true: enabled.
  • false: disabled.
+
+

expression

+

pg_node_tree

+

Policy effective expression (for users).

+

policy_description

+

text

+

Description of a policy.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0612.html b/docs/dws/dev/dws_04_0612.html new file mode 100644 index 00000000..2735a6ef --- /dev/null +++ b/docs/dws/dev/dws_04_0612.html @@ -0,0 +1,68 @@ + + +

PG_RLSPOLICY

+

PG_RLSPOLICY displays the information about row-level access control policies.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_RLSPOLICY columns

Name

+

Type

+

Description

+

polname

+

name

+

Name of a row-level access control policy

+

polrelid

+

oid

+

Table OID of a row-level access control policy

+

polcmd

+

char

+

SQL operations affected by a row-level access control policy. The options are *(ALL), r(SELECT), w(UPDATE), and d(DELETE).

+

polpermissive

+

boolean

+

Type of a row-level access control policy

+
NOTE:

Values of polpermissive:

+
  • true: The row-level access control policy is a permissive policy.
  • false: The row-level access control policy is a restrictive policy.
+
+

polroles

+

oid[]

+

OID of database user affected by a row-level access control policy

+

polqual

+

pg_node_tree

+

SQL condition expression of a row-level access control policy

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0613.html b/docs/dws/dev/dws_04_0613.html new file mode 100644 index 00000000..0533db56 --- /dev/null +++ b/docs/dws/dev/dws_04_0613.html @@ -0,0 +1,100 @@ + + +

PG_RESOURCE_POOL

+

PG_RESOURCE_POOL records the information about database resource pool.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_RESOURCE_POOL columns

Name

+

Type

+

Description

+

respool_name

+

name

+

Name of the resource pool

+

mem_percent

+

integer

+

Percentage of the memory configuration

+

cpu_affinity

+

bigint

+

Value of cores bound to the CPU

+

control_group

+

name

+

Name of the Cgroup where the resource pool is located

+

active_statements

+

integer

+

Maximum number of concurrent statements in the resource pool

+

max_dop

+

integer

+

Maximum concurrency. This is a reserved parameter.

+

memory_limit

+

name

+

Maximum memory of resource pool

+

parentid

+

oid

+

OID of the parent resource pool

+

io_limits

+

integer

+

Upper limit of IOPS. It is counted by ones for column storage and by 10 thousands for row storage.

+

io_priority

+

text

+

I/O priority set for jobs that consume many I/O resources. It takes effect when the I/O usage reaches 90%.

+

is_foreign

+

boolean

+

Indicates whether the resource pool can be used for users outside the logical cluster. If it is set to true, the resource pool controls the resources of common users who do not belong to the current resource pool.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0614.html b/docs/dws/dev/dws_04_0614.html new file mode 100644 index 00000000..3bb28ce1 --- /dev/null +++ b/docs/dws/dev/dws_04_0614.html @@ -0,0 +1,81 @@ + + +

PG_REWRITE

+

PG_REWRITE records rewrite rules defined for tables and views.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_REWRITE columns

Name

+

Type

+

Description

+

rulename

+

name

+

Rule name

+

ev_class

+

oid

+

Name of the table that uses the rule

+

ev_attr

+

smallint

+

Column this rule is for (always 0 to indicate the entire table)

+

ev_type

+

"char"

+

Event type for this rule:

+
  • 1 = SELECT
  • 2 = UPDATE
  • 3 = INSERT
  • 4 = DELETE
+

ev_enabled

+

"char"

+

Controls in which mode the rule fires

+
  • O: The rule fires in "origin" and "local" modes.
  • D: The rule is disabled.
  • R: The rule fires in "replica" mode.
  • A: The rule always fires.
+

is_instead

+

boolean

+

Its value is true if the rule is an INSTEAD rule.

+

ev_qual

+

pg_node_tree

+

Expression tree (in the form of a nodeToString() representation) for the rule's qualifying condition

+

ev_action

+

pg_node_tree

+

Query tree (in the form of a nodeToString() representation) for the rule's action

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0615.html b/docs/dws/dev/dws_04_0615.html new file mode 100644 index 00000000..8e4818a5 --- /dev/null +++ b/docs/dws/dev/dws_04_0615.html @@ -0,0 +1,71 @@ + + +

PG_SECLABEL

+

PG_SECLABEL records security labels on database objects.

+

See also PG_SHSECLABEL, which performs a similar function for security labels of database objects that are shared across a database cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SECLABEL columns

Name

+

Type

+

Reference

+

Description

+

objoid

+

oid

+

Any OID column

+

OID of the object this security label pertains to

+

classoid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog that contains the object

+

objsubid

+

integer

+

-

+

For a security label on a table column, this is the column number.

+

provider

+

text

+

-

+

Label provider associated with this label

+

label

+

text

+

-

+

Security label applied to this object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0616.html b/docs/dws/dev/dws_04_0616.html new file mode 100644 index 00000000..fa48519b --- /dev/null +++ b/docs/dws/dev/dws_04_0616.html @@ -0,0 +1,104 @@ + + +

PG_SHDEPEND

+

PG_SHDEPEND records the dependency relationships between database objects and shared objects, such as roles. This information allows GaussDB(DWS) to ensure that those objects are unreferenced before attempting to delete them.

+

See also PG_DEPEND, which performs a similar function for dependencies involving objects within a single database.

+

Unlike most system catalogs, PG_SHDEPEND is shared across all databases of a cluster: there is only one copy of PG_SHDEPEND per cluster, not one per database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SHDEPEND columns

Name

+

Type

+

Reference

+

Description

+

dbid

+

oid

+

PG_DATABASE.oid

+

OID of the database the dependent object is in. The value is 0 for a shared object.

+

classid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog the dependent object is in.

+

objid

+

oid

+

Any OID column

+

OID of the specific dependent object

+

objsubid

+

integer

+

-

+

For a table column, this is the column number (the objid and classid refer to the table itself). For all other object types, this column is 0.

+

refclassid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog the referenced object is in (must be a shared catalog)

+

refobjid

+

oid

+

Any OID column

+

OID of the specific referenced object

+

deptype

+

"char"

+

-

+

Code segment defining the specific semantics of this dependency relationship. See the following text for details.

+

objfile

+

text

+

-

+

Path of the user-defined C function library file.

+
+
+

In all cases, a pg_shdepend entry indicates that the referenced object cannot be dropped without also dropping the dependent object. However, there are several subflavors defined by deptype:

+
  • SHARED_DEPENDENCY_OWNER (o)

    The referenced object (which must be a role) is the owner of the dependent object.

    +
  • SHARED_DEPENDENCY_ACL (a)

    The referenced object (which must be a role) is mentioned in the ACL (access control list, i.e., privileges list) of the dependent object. (A SHARED_DEPENDENCY_ACL entry is not made for the owner of the object, since the owner will have a SHARED_DEPENDENCY_OWNER entry anyway.)

    +
  • SHARED_DEPENDENCY_PIN (p)

    There is no dependent object. This type of entry is a signal that the system itself depends on the referenced object, and so that object must never be deleted. Entries of this type are created only by initdb. The columns for the dependent object contain zeroes.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0617.html b/docs/dws/dev/dws_04_0617.html new file mode 100644 index 00000000..66b91d9e --- /dev/null +++ b/docs/dws/dev/dws_04_0617.html @@ -0,0 +1,54 @@ + + +

PG_SHDESCRIPTION

+

PG_SHDESCRIPTION records optional comments for shared database objects. Descriptions can be manipulated with the COMMENT command and viewed with psql's \d commands.

+

See also PG_DESCRIPTION, which performs a similar function for descriptions involving objects within a single database.

+

Unlike most system catalogs, PG_SHDESCRIPTION is shared across all databases of a cluster. There is only one copy of PG_SHDESCRIPTION per cluster, not one per database.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SHDESCRIPTION columns

Name

+

Type

+

Reference

+

Description

+

objoid

+

oid

+

Any OID column

+

OID of the object this description pertains to

+

classoid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog where the object resides

+

description

+

text

+

-

+

Arbitrary text that serves as the description of this object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0618.html b/docs/dws/dev/dws_04_0618.html new file mode 100644 index 00000000..f21c0368 --- /dev/null +++ b/docs/dws/dev/dws_04_0618.html @@ -0,0 +1,64 @@ + + +

PG_SHSECLABEL

+

PG_SHSECLABEL records security labels on shared database objects. Security labels can be manipulated with the SECURITY LABEL command.

+

For an easier way to view security labels, see PG_SECLABELS.

+

See also PG_SECLABEL, which performs a similar function for security labels involving objects within a single database.

+

Unlike most system catalogs, PG_SHSECLABEL is shared across all databases of a cluster. There is only one copy of PG_SHSECLABEL per cluster, not one per database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SHSECLABEL columns

Name

+

Type

+

Reference

+

Description

+

objoid

+

oid

+

Any OID column

+

OID of the object this security label pertains to

+

classoid

+

oid

+

PG_CLASS.oid

+

OID of the system catalog where the object resides

+

provider

+

text

+

-

+

Label provider associated with this label

+

label

+

text

+

-

+

Security label applied to this object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0619.html b/docs/dws/dev/dws_04_0619.html new file mode 100644 index 00000000..4888d10d --- /dev/null +++ b/docs/dws/dev/dws_04_0619.html @@ -0,0 +1,120 @@ + + +

PG_STATISTIC

+

PG_STATISTIC records statistics about tables and index columns in a database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATISTIC columns

Name

+

Type

+

Description

+

starelid

+

oid

+

Table or index which the described column belongs to

+

starelkind

+

"char"

+

Type of an object

+

staattnum

+

smallint

+

Number of the described column in the table, starting from 1

+

stainherit

+

boolean

+

Whether to collect statistics for objects that have inheritance relationship

+

stanullfrac

+

real

+

Percentage of column entries that are null

+

stawidth

+

integer

+

Average stored width, in bytes, of non-null entries

+

stadistinct

+

real

+

Number of distinct, not-null data values in the column for all DNs

+
  • A value greater than zero is the actual number of distinct values.
  • A value less than zero is the negative of a multiplier for the number of rows in the table. (For example, stadistinct=-0.5 indicates that values in a column appear twice on average.)
  • 0 indicates that the number of distinct values is unknown.
+

stakindN

+

smallint

+

Code number stating that the type of statistics is stored in Slot N of the pg_statistic row.

+

Value range: 1 to 5

+

staopN

+

oid

+

Operator used to generate the statistics stored in Slot N. For example, a histogram slot shows the < operator that defines the sort order of the data.

+

Value range: 1 to 5

+

stanumbersN

+

real[]

+

Numerical statistics of the appropriate type for Slot N. The value is null if the slot kind does not involve numerical values.

+

Value range: 1 to 5

+

stavaluesN

+

anyarray

+

Column data values of the appropriate type for Slot N. The value is null if the slot type does not store any data values. Each array's element values are actually of the specific column's data type so there is no way to define these columns' type more specifically than anyarray.

+

Value range: 1 to 5

+

stadndistinct

+

real

+

Number of unique non-null data values in the dn1 column

+
  • A value greater than zero is the actual number of distinct values.
  • A value less than zero is the negative of a multiplier for the number of rows in the table. (For example, stadistinct=-0.5 indicates that values in a column appear twice on average.)
  • 0 indicates that the number of distinct values is unknown.
+

staextinfo

+

text

+

Information about extension statistics (reserved)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0620.html b/docs/dws/dev/dws_04_0620.html new file mode 100644 index 00000000..2b6649d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0620.html @@ -0,0 +1,120 @@ + + +

PG_STATISTIC_EXT

+

PG_STATISTIC_EXT records the extended statistics of tables in a database, such as statistics of multiple columns. Statistics of expressions will be supported later. You can specify the extended statistics to be collected. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATISTIC_EXT columns

Parameter

+

Type

+

Description

+

starelid

+

oid

+

Table or index which the described column belongs to

+

starelkind

+

"char"

+

Type of an object

+

stainherit

+

boolean

+

Whether to collect statistics for objects that have inheritance relationship

+

stanullfrac

+

real

+

Percentage of column entries that are null

+

stawidth

+

integer

+

Average stored width, in bytes, of non-null entries

+

stadistinct

+

real

+

Number of distinct, not-null data values in the column for all DNs

+
  • A value greater than zero is the actual number of distinct values.
  • A value less than zero is the negative of a multiplier for the number of rows in the table. (For example, stadistinct=-0.5 indicates that values in a column appear twice on average.)
  • 0 indicates that the number of distinct values is unknown.
+

stadndistinct

+

real

+

Number of unique non-null data values in the dn1 column

+
  • A value greater than zero is the actual number of distinct values.
  • A value less than zero is the negative of a multiplier for the number of rows in the table. (For example, stadistinct=-0.5 indicates that values in a column appear twice on average.)
  • 0 indicates that the number of distinct values is unknown.
+

stakindN

+

smallint

+

Code number stating that the type of statistics is stored in Slot N of the pg_statistic row.

+

Value range: 1 to 5

+

staopN

+

oid

+

Operator used to generate the statistics stored in Slot N. For example, a histogram slot shows the < operator that defines the sort order of the data.

+

Value range: 1 to 5

+

stakey

+

int2vector

+

Array of a column ID

+

stanumbersN

+

real[]

+

Numerical statistics of the appropriate type for Slot N. The value is null if the slot kind does not involve numerical values.

+

Value range: 1 to 5

+

stavaluesN

+

anyarray

+

Column data values of the appropriate type for Slot N. The value is null if the slot type does not store any data values. Each array's element values are actually of the specific column's data type so there is no way to define these columns' type more specifically than anyarray.

+

Value range: 1 to 5

+

staexprs

+

pg_node_tree

+

Expression corresponding to the extended statistics information.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0621.html b/docs/dws/dev/dws_04_0621.html new file mode 100644 index 00000000..17cdc533 --- /dev/null +++ b/docs/dws/dev/dws_04_0621.html @@ -0,0 +1,58 @@ + + +

PG_SYNONYM

+

PG_SYNONYM records the mapping between synonym object names and other database object names.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SYNONYM columns

Name

+

Type

+

Description

+

synname

+

name

+

Synonym name.

+

synnamespace

+

oid

+

OID of the namespace where the synonym is located.

+

synowner

+

oid

+

Owner of a synonym, usually the OID of the user who created it.

+

synobjschema

+

name

+

Schema name specified by the associated object.

+

synobjname

+

name

+

Name of the associated object.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0622.html b/docs/dws/dev/dws_04_0622.html new file mode 100644 index 00000000..4bf622cf --- /dev/null +++ b/docs/dws/dev/dws_04_0622.html @@ -0,0 +1,58 @@ + + +

PG_TABLESPACE

+

PG_TABLESPACE records tablespace information.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TABLESPACE columns

Name

+

Type

+

Description

+

spcname

+

name

+

Name of the tablespace

+

spcowner

+

oid

+

Owner of the tablespace, usually the user who created it

+

spcacl

+

aclitem[]

+

Access permissions For details, see GRANT and REVOKE.

+

spcoptions

+

text[]

+

Specifies options of the tablespace.

+

spcmaxsize

+

text

+

Maximum size of the available disk space, in bytes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0623.html b/docs/dws/dev/dws_04_0623.html new file mode 100644 index 00000000..103d55e9 --- /dev/null +++ b/docs/dws/dev/dws_04_0623.html @@ -0,0 +1,131 @@ + + +

PG_TRIGGER

+

PG_TRIGGER records the trigger information.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Name

+

Type

+

Description

+

tgrelid

+

oid

+

OID of the table where the trigger is located.

+

tgname

+

name

+

Trigger name.

+

tgfoid

+

oid

+

Trigger OID.

+

tgtype

+

smallint

+

Trigger type

+

tgenabled

+

"char"

+

O: The trigger fires in "origin" or "local" mode.

+

D: The trigger is disabled.

+

R: The trigger fires in "replica" mode.

+

A: The trigger always fires.

+

tgisinternal

+

boolean

+

Internal trigger ID. If the value is true, it indicates an internal trigger.

+

tgconstrrelid

+

oid

+

The table referenced by the integrity constraint

+

tgconstrindid

+

oid

+

Index of the integrity constraint

+

tgconstraint

+

oid

+

OID of the constraint trigger in the pg_constraint

+

tgdeferrable

+

boolean

+

The constraint trigger is of the DEFERRABLE type.

+

tginitdeferred

+

boolean

+

whether the trigger is of the INITIALLY DEFERRED type

+

tgnargs

+

smallint

+

Input parameters number of the trigger function

+

tgattr

+

int2vector

+

Column ID specified by the trigger. If no column is specified, an empty array is used.

+

tgargs

+

bytea

+

Parameter transferred to the trigger

+

tgqual

+

pg_node_tree

+

Indicates the WHEN condition of the trigger. If the WHEN condition does not exist, the value is null.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0624.html b/docs/dws/dev/dws_04_0624.html new file mode 100644 index 00000000..131504a7 --- /dev/null +++ b/docs/dws/dev/dws_04_0624.html @@ -0,0 +1,80 @@ + + +

PG_TS_CONFIG

+

PG_TS_CONFIG records entries representing text search configurations. A configuration specifies a particular text search parser and a list of dictionaries to use for each of the parser's output token types.

+

The parser is shown in the PG_TS_CONFIG entry, but the token-to-dictionary mapping is defined by subsidiary entries in PG_TS_CONFIG_MAP.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TS_CONFIG columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

cfgname

+

name

+

-

+

Text search configuration name

+

cfgnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace where the configuration resides

+

cfgowner

+

oid

+

PG_AUTHID.oid

+

Owner of the configuration

+

cfgparser

+

oid

+

PG_TS_PARSER.oid

+

OID of the text search parser for this configuration

+

cfoptions

+

text[]

+

-

+

Configuration options

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0625.html b/docs/dws/dev/dws_04_0625.html new file mode 100644 index 00000000..7eebc0d4 --- /dev/null +++ b/docs/dws/dev/dws_04_0625.html @@ -0,0 +1,61 @@ + + +

PG_TS_CONFIG_MAP

+

PG_TS_CONFIG_MAP records entries showing which text search dictionaries should be consulted, and in what order, for each output token type of each text search configuration's parser.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TS_CONFIG_MAP columns

Name

+

Type

+

Reference

+

Description

+

mapcfg

+

oid

+

PG_TS_CONFIG.oid

+

OID of the PG_TS_CONFIG entry owning this map entry

+

maptokentype

+

integer

+

-

+

A token type emitted by the configuration's parser

+

mapseqno

+

integer

+

-

+

Order in which to consult this entry

+

mapdict

+

oid

+

PG_TS_DICT.oid

+

OID of the text search dictionary to consult

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0626.html b/docs/dws/dev/dws_04_0626.html new file mode 100644 index 00000000..35445ac6 --- /dev/null +++ b/docs/dws/dev/dws_04_0626.html @@ -0,0 +1,80 @@ + + +

PG_TS_DICT

+

PG_TS_DICT records entries that define text search dictionaries. A dictionary depends on a text search template, which specifies all the implementation functions needed. The dictionary itself provides values for the user-settable parameters supported by the template.

+

This division of labor allows dictionaries to be created by unprivileged users. The parameters are specified by a text string dictinitoption, whose format and meaning vary depending on the template.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TS_DICT columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

dictname

+

name

+

-

+

Text search dictionary name

+

dictnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains the dictionary

+

dictowner

+

oid

+

PG_AUTHID.oid

+

Owner of the dictionary

+

dicttemplate

+

oid

+

PG_TS_TEMPLATE.oid

+

OID of the text search template for this dictionary

+

dictinitoption

+

text

+

-

+

Initialization option string for the template

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0627.html b/docs/dws/dev/dws_04_0627.html new file mode 100644 index 00000000..c07d7e23 --- /dev/null +++ b/docs/dws/dev/dws_04_0627.html @@ -0,0 +1,97 @@ + + +

PG_TS_PARSER

+

PG_TS_PARSER records entries defining text search parsers. A parser splits input text into lexemes and assigns a token type to each lexeme. Since a parser must be implemented by C functions, parsers can be created only by database administrators.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TS_PARSER columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

prsname

+

name

+

-

+

Text search parser name

+

prsnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains the parser

+

prsstart

+

regproc

+

PG_PROC.oid

+

OID of the parser's startup function

+

prstoken

+

regproc

+

PG_PROC.oid

+

OID of the parser's next-token function

+

prsend

+

regproc

+

PG_PROC.oid

+

OID of the parser's shutdown function

+

prsheadline

+

regproc

+

PG_PROC.oid

+

OID of the parser's headline function

+

prslextype

+

regproc

+

PG_PROC.oid

+

OID of the parser's lextype function

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0628.html b/docs/dws/dev/dws_04_0628.html new file mode 100644 index 00000000..b90ddd5a --- /dev/null +++ b/docs/dws/dev/dws_04_0628.html @@ -0,0 +1,70 @@ + + +

PG_TS_TEMPLATE

+

PG_TS_TEMPLATE records entries defining text search templates. A template provides a framework for text search dictionaries. Since a template must be implemented by C functions, templates can be created only by database administrators.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TS_TEMPLATE columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

tmplname

+

name

+

-

+

Text search template name

+

tmplnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace that contains the template

+

tmplinit

+

regproc

+

PG_PROC.oid

+

OID of the template's initialization function

+

tmpllexize

+

regproc

+

PG_PROC.oid

+

OID of the template's lexize function

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0629.html b/docs/dws/dev/dws_04_0629.html new file mode 100644 index 00000000..096ffed1 --- /dev/null +++ b/docs/dws/dev/dws_04_0629.html @@ -0,0 +1,241 @@ + + +

PG_TYPE

+

PG_TYPE records the information about data types.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TYPE columns

Name

+

Type

+

Description

+

typname

+

name

+

Data type name

+

typnamespace

+

oid

+

OID of the namespace that contains this type

+

typowner

+

oid

+

Owner of this type

+

typlen

+

smallint

+

Number of bytes in the internal representation of the type for a fixed-size type. But for a variable-length type, typlen is negative.

+
  • -1 indicates a "varlena" type (one that has a length word).
  • -2 indicates a null-terminated C string.
+

typbyval

+

boolean

+

Whether the value of this type is passed by parameter or reference of this column. TYPBYVAL is false if the type of TYPLEN is not 1, 2, 4, or 8, because values of this type are always passed by reference of this column. TYPBYVAL can be false even the TYPLEN is passed by parameter of this column.

+

typtype

+

char

+
  • b indicates a basic type.
  • c indicates a composite type, for example, a table's row type.
  • e indicates an enumeration type.
  • p indicates a pseudo type.
+

For details, see typrelid and typbasetype.

+

typcategory

+

char

+

typcategory is an arbitrary classification of data types that is used by the parser to determine which implicit casts should be "preferred".

+

typispreferred

+

boolean

+

Whether data is converted. It is true if conversion is performed when data meets the conversion rules specified by TYPCATEGORY.

+

typisdefined

+

boolean

+

The value is true if the type is defined. The value is false if this is a placeholder entry for a not-yet-defined type. When it is false, type name, namespace, and OID are the only dependable objects.

+

typdelim

+

char

+

Character that separates two values of this type when parsing array input. Note that the delimiter is associated with the array element data type, not the array data type.

+

typrelid

+

oid

+

If this is a composite type (see typtype), then this column points to the pg_class entry that defines the corresponding table. For a free-standing composite type, the pg_class entry does not represent a table, but it is required for the type's pg_attribute entries to link to. The value is 0 for non-composite types.

+

typelem

+

oid

+

If typelem is not 0 then it identifies another row in pg_type. The current type can be subscripted like an array yielding values of type typelem. The current type can then be subscripted like an array yielding values of type typelem. A "true" array type is variable length (typlen = -1), but some fixed-length (typlen > 0) types also have nonzero typelem, for example name and point. If a fixed-length type has a typelem, its internal representation must be some number of values of the typelem data type with no other data. Variable-length array types have a header defined by the array subroutines.

+

typarray

+

oid

+

Indicates that the corresponding type record is available in pg_type if the value is not 0.

+

typinput

+

regproc

+

Input conversion function (text format)

+

typoutput

+

regproc

+

Output conversion function (text format)

+

typreceive

+

regproc

+

Input conversion function (binary format). If no input conversion function, the value is 0.

+

typsend

+

regproc

+

output conversion function (binary format). If no output conversion function, the value is 0.

+

typmodin

+

regproc

+

Type modifier input function. The value is 0 if the type does not support modifiers.

+

typmodout

+

regproc

+

Type modifier output function. The value is 0 if the type does not support modifiers.

+

typanalyze

+

regproc

+

Custom ANALYZE function. The value is 0 if the standard function is used.

+

typalign

+

char

+

Alignment required when storing a value of this type. It applies to storage on disk as well as most representations of the value inside PostgreSQL. When multiple values are stored consecutively, such as in the representation of a complete row on disk, padding is inserted before a data of this type so that it begins on the specified boundary. The alignment reference is the beginning of the first datum in the sequence. Possible values are:

+
  • c: char alignment, that is, no alignment needed
  • s: short alignment (2 bytes on most machines)
  • i: int alignment (4 bytes on most machines).
  • d: double alignment (8 bytes on many machines, but by no means all)
+
NOTICE:

For types used in system catalogs, the size and alignment defined in pg_type must agree with the way that the compiler lays out the column in a structure representing a table row.

+
+

typstorage

+

char

+

typstorage tells for varlena types (those with typlen = -1) if the type is prepared for toasting and what the default strategy for attributes of this type should be. Possible values are:

+
  • p indicates that values are always stored plain.
  • e: Value can be stored in a "secondary" relationship (if the relation has one, see pg_class.reltoastrelid).
  • m: Values can be stored compressed inline.
  • x: Values can be stored compressed inline or stored in secondary storage.
+
NOTICE:

m domains can also be moved out to secondary storage, but only as a last resort (e and x domains are moved first).

+
+

typenotnull

+

boolean

+

Represents a NOTNULL constraint on a type. Currently, it is used for domains only.

+

typbasetype

+

oid

+

If this is a domain (see typtype), then typbasetype identifies the type that this one is based on. The value is 0 if this type is not a derived type.

+

typtypmod

+

integer

+

Records the typtypmod to be applied to domains' base types by domains (the value is -1 if the base type does not use typmod). The value is -1 if this type is not a domain.

+

typndims

+

integer

+

Number of array dimensions for a domain that is an array (that is, typbasetype is an array type; the domain's typelem matches the base type's typelem). The value is 0 for types other than domains over array types.

+

typcollation

+

oid

+

Sequence rule for specified types. Sequencing is not supported if the value is 0.

+

typdefaultbin

+

pg_node_tree

+

nodeToString() representation of a default expression for the type if the value is non-null. Currently, this column is only used for domains.

+

typdefault

+

text

+

The value is null if a type has no associated default value. If typdefaultbin is not null, typdefault must contain a human-readable version of the default expression represented by typdefaultbin. If typdefaultbin is null and typdefault is not, then typdefault is the external representation of the type's default value, which can be fed to the type's input converter to produce a constant.

+

typacl

+

aclitem[]

+

Access permissions

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0630.html b/docs/dws/dev/dws_04_0630.html new file mode 100644 index 00000000..bcf85772 --- /dev/null +++ b/docs/dws/dev/dws_04_0630.html @@ -0,0 +1,62 @@ + + +

PG_USER_MAPPING

+

PG_USER_MAPPING records the mappings from local users to remote.

+

It is accessible only to users with system administrator rights. You can use view PG_USER_MAPPINGS to query common users.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_USER_MAPPING columns

Name

+

Type

+

Reference

+

Description

+

oid

+

oid

+

-

+

Row identifier (hidden attribute; must be explicitly selected)

+

umuser

+

oid

+

PG_AUTHID.oid

+

OID of the local role being mapped, 0 if the user mapping is public

+

umserver

+

oid

+

PG_FOREIGN_SERVER.oid

+

OID of the foreign server that contains this mapping

+

umoptions

+

text[]

+

-

+

Option used for user mapping. It is a keyword=value string.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0631.html b/docs/dws/dev/dws_04_0631.html new file mode 100644 index 00000000..8f09fec1 --- /dev/null +++ b/docs/dws/dev/dws_04_0631.html @@ -0,0 +1,66 @@ + + +

PG_USER_STATUS

+

PG_USER_STATUS records the states of users that access to the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_USER_STATUS columns

Name

+

Type

+

Description

+

roloid

+

oid

+

ID of the role

+

failcount

+

integer

+

Specifies the number of failed attempts.

+

locktime

+

timestamp with time zone

+

Time at which the role is locked

+

rolstatus

+

smallint

+

Role state

+
  • 0: normal
  • 1 indicates that the role is locked for some time because the failed login attempts exceed the threshold
  • 2 indicates that the role is locked by the administrator.
+

permspace

+

bigint

+

Size of the permanent table storage space used by a role in the current instance.

+

tempspace

+

bigint

+

Size of the temporary table storage space used by a role in the current instance.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0632.html b/docs/dws/dev/dws_04_0632.html new file mode 100644 index 00000000..966c57e7 --- /dev/null +++ b/docs/dws/dev/dws_04_0632.html @@ -0,0 +1,51 @@ + + +

PG_WORKLOAD_ACTION

+

PG_WORKLOAD_ACTION records information about query_band.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_WORKLOAD_ACTION columns

Name

+

Type

+

Description

+

qband

+

name

+

query_band key-value pairs

+

class

+

name

+

Class of the object associated with query_band

+

object

+

name

+

Object associated with query_band

+

action

+

name

+

Action of the object associated with query_band

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0633.html b/docs/dws/dev/dws_04_0633.html new file mode 100644 index 00000000..900b8250 --- /dev/null +++ b/docs/dws/dev/dws_04_0633.html @@ -0,0 +1,94 @@ + + +

PGXC_CLASS

+

PGXC_CLASS records the replicated or distributed information for each table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_CLASS columns

Name

+

Type

+

Description

+

pcrelid

+

oid

+

Table OID

+

pclocatortype

+

"char"

+

Locator type

+
  • H: hash
  • M: Modulo
  • N: Round Robin
  • R: Replicate
+

pchashalgorithm

+

smallint

+

Distributed tuple using the hash algorithm

+

pchashbuckets

+

smallint

+

Value of a harsh container

+

pgroup

+

name

+

Name of the node group

+

redistributed

+

"char"

+

The table has been redistributed.

+

redis_order

+

integer

+

Redistribution sequence

+

pcattnum

+

int2vector

+

Column number used as a distribution key

+

nodeoids

+

oidvector_extend

+

List of distributed table node OIDs

+

options

+

text

+

Extension status information. This is a reserved column in the system.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0634.html b/docs/dws/dev/dws_04_0634.html new file mode 100644 index 00000000..b30aebe9 --- /dev/null +++ b/docs/dws/dev/dws_04_0634.html @@ -0,0 +1,74 @@ + + +

PGXC_GROUP

+

PGXC_GROUP records information about node groups.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_GROUP columns

Name

+

Type

+

Description

+

group_name

+

name

+

Name of the node group

+

in_redistribution

+

"char"

+

Whether redistribution is required

+
  • n indicates that the Node Group is not redistributed.
  • y indicates the source Node Group in redistribution.
  • t indicates the destination Node Group in redistribution.
+

group_members

+

oidvector_extend

+

Node OID list of the node group

+

group_buckets

+

text

+

Distributed data bucket group

+

is_installation

+

boolean

+

Whether to install a sub-cluster

+

group_acl

+

aclitem[]

+

Access permissions

+

group_kind

+

"char"

+

Node Group type

+
  • i indicates an installation Node Group.
  • n indicates a Node Group in a common, non-logical cluster.
  • v indicates a Node Group in a logical cluster.
  • e indicates an elastic cluster.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0635.html b/docs/dws/dev/dws_04_0635.html new file mode 100644 index 00000000..482f5050 --- /dev/null +++ b/docs/dws/dev/dws_04_0635.html @@ -0,0 +1,150 @@ + + +

PGXC_NODE

+

PGXC_NODE records information about cluster nodes.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_NODE columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

node_type

+

"char"

+

Node type

+

C: CN

+

D: DN

+

node_port

+

integer

+

Port ID of the node

+

node_host

+

name

+

Host name or IP address of a node. (If a virtual IP address is configured, its value is a virtual IP address.)

+

node_port1

+

integer

+

Port number of a replication node

+

node_host1

+

name

+

Host name or IP address of a replication node. (If a virtual IP address is configured, its value is a virtual IP address.)

+

hostis_primary

+

boolean

+

Whether a switchover occurs between the primary and the standby server on the current node

+

nodeis_primary

+

boolean

+

Whether the current node is preferred to execute non-query operations in the replication table

+

nodeis_preferred

+

boolean

+

Whether the current node is preferred to execute queries in the replication table

+

node_id

+

integer

+

Node identifier

+

sctp_port

+

integer

+

Specifies the port used by the TCP proxy communication library or SCTP communication library of the primary node to listen to the data channel.

+

control_port

+

integer

+

Specifies the port used by the TCP proxy communication library or SCTP communication library of the primary node to listen to the control channel.

+

sctp_port1

+

integer

+

Specifies the port used by the TCP proxy communication library or SCTP communication library of the standby node to listen to the data channel.

+

control_port1

+

integer

+

Specifies the port used by the TCP proxy communication library or SCTP communication library of the standby node to listen to the control channel.

+

nodeis_central

+

boolean

+

Indicates that the current node is the central node.

+
+
+

Examples

Query the CN and DN information of the cluster:

+
 select * from pgxc_node;
+  node_name   | node_type | node_port |   node_host    | node_port1 |   node_host1   | hostis_primary | nodeis_primary | nodeis_preferred
+ |   node_id   | sctp_port | control_port | sctp_port1 | control_port1 | nodeis_central
+--------------+-----------+-----------+----------------+------------+----------------+----------------+----------------+-----------------
+-+-------------+-----------+--------------+------------+---------------+----------------
+ dn_6001_6002 | D         |     40000 | 172.**.***.**1 |      45000 | 172.**.**.**2 | t              | f              | f
+ |  1644780306 |     40002 |        40003 |      45002 |         45003 | f
+ dn_6003_6004 | D         |     40000 | 172.**.**.**2  |      45000 | 172.**.**.**3  | t              | f              | f
+ |  -966646068 |     40002 |        40003 |      45002 |         45003 | f
+ dn_6005_6006 | D         |     40000 | 172.**.**.**3  |      45000 | 172.**.***.**1 | t              | f              | f
+ |   868850011 |     40002 |        40003 |      45002 |         45003 | f
+ cn_5001      | C         |      8000 | 172.**.***.**1 |       8000 | 172.**.***.**1 | t              | f              | f
+ |  1120683504 |      8002 |         8003 |          0 |             0 | f
+ cn_5002      | C         |      8000 | 172.**.**.**2  |       8000 | 172.**.**.**2  | t              | f              | f
+ | -1736975100 |      8002 |         8003 |          0 |             0 | f
+ cn_5003      | C         |      8000 | localhost      |       8000 | localhost      | t              | f              | f
+ |  -125853378 |      8002 |         8003 |          0 |             0 | t
+(6 rows)
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0639.html b/docs/dws/dev/dws_04_0639.html new file mode 100644 index 00000000..26030778 --- /dev/null +++ b/docs/dws/dev/dws_04_0639.html @@ -0,0 +1,484 @@ + + +

System Views

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0640.html b/docs/dws/dev/dws_04_0640.html new file mode 100644 index 00000000..58399fe5 --- /dev/null +++ b/docs/dws/dev/dws_04_0640.html @@ -0,0 +1,44 @@ + + +

ALL_ALL_TABLES

+

ALL_ALL_TABLES displays the tables or views accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 ALL_ALL_TABLES columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the table or the view

+

table_name

+

name

+

Name of the table or the view

+

tablespace_name

+

name

+

Tablespace where the table or view is located

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0641.html b/docs/dws/dev/dws_04_0641.html new file mode 100644 index 00000000..604d89de --- /dev/null +++ b/docs/dws/dev/dws_04_0641.html @@ -0,0 +1,59 @@ + + +

ALL_CONSTRAINTS

+

ALL_CONSTRAINTS displays information about constraints accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_CONSTRAINTS columns

Name

+

Type

+

Description

+

constraint_name

+

vcharacter varying(64)

+

Constraint name

+

constraint_type

+

text

+

Constraint type

+
  • C: Check constraint.
  • F: Foreign key constraint
  • P: Primary key constraint
  • U: Unique constraint.
+

table_name

+

character varying(64)

+

Name of constraint-related table

+

index_owner

+

character varying(64)

+

Owner of constraint-related index (only for the unique constraint and primary key constraint)

+

index_name

+

character varying(64)

+

Name of constraint-related index (only for the unique constraint and primary key constraint)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0642.html b/docs/dws/dev/dws_04_0642.html new file mode 100644 index 00000000..c16de3c7 --- /dev/null +++ b/docs/dws/dev/dws_04_0642.html @@ -0,0 +1,51 @@ + + +

ALL_CONS_COLUMNS

+

ALL_CONS_COLUMNS displays information about constraint columns accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_CONS_COLUMNS columns

Name

+

Type

+

Description

+

table_name

+

character varying(64)

+

Name of constraint-related table

+

column_name

+

character varying(64)

+

Name of constraint-related column

+

constraint_name

+

character varying(64)

+

Constraint name

+

position

+

smallint

+

Position of the column in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0643.html b/docs/dws/dev/dws_04_0643.html new file mode 100644 index 00000000..b2b841cb --- /dev/null +++ b/docs/dws/dev/dws_04_0643.html @@ -0,0 +1,51 @@ + + +

ALL_COL_COMMENTS

+

ALL_COL_COMMENTS displays the comment information about table columns accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_COL_COMMENTS columns

Name

+

Type

+

Description

+

column_name

+

character varying(64)

+

Column name

+

table_name

+

character varying(64)

+

Table name

+

owner

+

character varying(64)

+

Table owner

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0644.html b/docs/dws/dev/dws_04_0644.html new file mode 100644 index 00000000..86e1434a --- /dev/null +++ b/docs/dws/dev/dws_04_0644.html @@ -0,0 +1,88 @@ + + +

ALL_DEPENDENCIES

+

ALL_DEPENDENCIES displays dependencies between functions and advanced packages accessible to the current user.

+

Currently in GaussDB(DWS), this table is empty without any record due to information constraints.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_DEPENDENCIES columns

Name

+

Type

+

Description

+

owner

+

character varying(30)

+

Owner of the object

+

name

+

character varying(30)

+

Object name

+

type

+

character varying(17)

+

Type of the object

+

referenced_owner

+

character varying(30)

+

Owner of the referenced object

+

referenced_name

+

character varying(64)

+

Name of the referenced object

+

referenced_type

+

character varying(17)

+

Type of the referenced object

+

referenced_link_name

+

character varying(128)

+

Name of the link to the referenced object

+

schemaid

+

numeric

+

ID of the current schema

+

dependency_type

+

character varying(4)

+

Dependency type (REF or HARD)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0645.html b/docs/dws/dev/dws_04_0645.html new file mode 100644 index 00000000..cd952967 --- /dev/null +++ b/docs/dws/dev/dws_04_0645.html @@ -0,0 +1,65 @@ + + +

ALL_IND_COLUMNS

+

ALL_IND_COLUMNS displays all index columns accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_IND_COLUMNS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

name

+

Column name

+

column_position

+

smallint

+

Position of column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0646.html b/docs/dws/dev/dws_04_0646.html new file mode 100644 index 00000000..13c72676 --- /dev/null +++ b/docs/dws/dev/dws_04_0646.html @@ -0,0 +1,65 @@ + + +

ALL_IND_EXPRESSIONS

+

ALL_IND_EXPRESSIONS displays information about the expression indexes accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_IND_EXPRESSIONS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_expression

+

text

+

Function-based index expression of a specified column

+

column_position

+

smallint

+

Position of a column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0647.html b/docs/dws/dev/dws_04_0647.html new file mode 100644 index 00000000..cf1223c6 --- /dev/null +++ b/docs/dws/dev/dws_04_0647.html @@ -0,0 +1,65 @@ + + +

ALL_INDEXES

+

ALL_INDEXES displays information about indexes accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_INDEXES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_name

+

character varying(64)

+

Name of the table corresponding to the index.

+

uniqueness

+

text

+

Whether the index is a unique index

+

generated

+

character varying(1)

+

Whether the index name is generated by the system

+

partitioned

+

character(3)

+

Whether the index has the property of the partition table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0648.html b/docs/dws/dev/dws_04_0648.html new file mode 100644 index 00000000..edc939c6 --- /dev/null +++ b/docs/dws/dev/dws_04_0648.html @@ -0,0 +1,74 @@ + + +

ALL_OBJECTS

+

ALL_OBJECTS displays all database objects accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_OBJECTS columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the object

+

object_name

+

name

+

Object name

+

object_id

+

oid

+

OID of the object

+

object_type

+

name

+

Type of the object

+

namespace

+

oid

+

ID of the namespace where the object resides

+

created

+

timestamp with time zone

+

Object creation time

+

last_ddl_time

+

timestamp with time zone

+

The last time when an object was modified.

+
+
+

For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0649.html b/docs/dws/dev/dws_04_0649.html new file mode 100644 index 00000000..046540ad --- /dev/null +++ b/docs/dws/dev/dws_04_0649.html @@ -0,0 +1,37 @@ + + +

ALL_PROCEDURES

+

ALL_PROCEDURES displays information about all stored procedures or functions accessible to the current user.

+ +
+ + + + + + + + + + + + + +
Table 1 ALL_PROCEDURES columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the object

+

object_name

+

name

+

Object name

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0650.html b/docs/dws/dev/dws_04_0650.html new file mode 100644 index 00000000..05b2fccd --- /dev/null +++ b/docs/dws/dev/dws_04_0650.html @@ -0,0 +1,66 @@ + + +

ALL_SEQUENCES

+

ALL_SEQUENCES displays all sequences accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_SEQUENCES columns

Name

+

Type

+

Description

+

sequence_owner

+

name

+

Owner of the sequence

+

sequence_name

+

name

+

Name of the sequence

+

min_value

+

bigint

+

Minimum value of the sequence

+

max_value

+

bigint

+

Maximum value of the sequence

+

increment_by

+

bigint

+

Value by which the sequence is incremented

+

cycle_flag

+

character(1)

+

Whether the sequence is a cycle sequence. The value can be Y or N.

+
  • Y indicates that it is a cycle sequence.
  • N indicates that it is not a cycle sequence.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0651.html b/docs/dws/dev/dws_04_0651.html new file mode 100644 index 00000000..261ac95a --- /dev/null +++ b/docs/dws/dev/dws_04_0651.html @@ -0,0 +1,51 @@ + + +

ALL_SOURCE

+

ALL_SOURCE displays information about stored procedures or functions accessible to the current user, and provides the columns defined by the stored procedures and functions.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_SOURCE columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the object

+

name

+

name

+

Object name

+

type

+

name

+

Type of the object

+

text

+

text

+

Definition of the object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0652.html b/docs/dws/dev/dws_04_0652.html new file mode 100644 index 00000000..79dafa56 --- /dev/null +++ b/docs/dws/dev/dws_04_0652.html @@ -0,0 +1,65 @@ + + +

ALL_SYNONYMS

+

ALL_SYNONYMS displays all synonyms accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_SYNONYMS columns

Name

+

Type

+

Description

+

owner

+

text

+

Owner of a synonym.

+

schema_name

+

text

+

Name of the schema to which the synonym belongs.

+

synonym_name

+

text

+

Synonym name.

+

table_owner

+

text

+

Owner of the associated object.

+

table_schema_name

+

text

+

Schema name of the associated object.

+

table_name

+

text

+

Name of the associated object.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0653.html b/docs/dws/dev/dws_04_0653.html new file mode 100644 index 00000000..af5ed6f3 --- /dev/null +++ b/docs/dws/dev/dws_04_0653.html @@ -0,0 +1,100 @@ + + +

ALL_TAB_COLUMNS

+

ALL_TAB_COLUMNS displays description information about columns of the tables accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_TAB_COLUMNS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the table

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

character varying(64)

+

Column name

+

data_type

+

character varying(128)

+

Data type of the column

+

column_id

+

integer

+

Column ID generated when the object is created or column is added

+

data_length

+

integer

+

Length of the column in the unit of bytes

+

avg_col_len

+

numeric

+

Average length of a column in the unit of bytes

+

nullable

+

bpchar

+

Whether the column can be empty. For the primary key constraint and non-null constraint, the value is n.

+

data_precision

+

integer

+

Indicates the precision of the data type. This parameter is valid for the numeric data type and NULL for other types.

+

data_scale

+

integer

+

Number of decimal places. This parameter is valid for the numeric data type. For other data types, the value of this parameter is 0.

+

char_length

+

numeric

+

Column length in the unit of bytes. This parameter is valid only for the varchar, nvarchar2, bpchar, and char types.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0654.html b/docs/dws/dev/dws_04_0654.html new file mode 100644 index 00000000..54a857b2 --- /dev/null +++ b/docs/dws/dev/dws_04_0654.html @@ -0,0 +1,44 @@ + + +

ALL_TAB_COMMENTS

+

ALL_TAB_COMMENTS displays comments about all tables and views accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 ALL_TAB_COMMENTS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the table or the view

+

table_name

+

character varying(64)

+

Name of the table or the view

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0655.html b/docs/dws/dev/dws_04_0655.html new file mode 100644 index 00000000..1a87fca5 --- /dev/null +++ b/docs/dws/dev/dws_04_0655.html @@ -0,0 +1,74 @@ + + +

ALL_TABLES

+

ALL_TABLES displays all the tables accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_TABLES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

tablespace_name

+

character varying(64)

+

Name of the tablespace that contains the table

+

status

+

character varying(8)

+

Whether the current record is valid

+

temporary

+

character(1)

+

Whether the table is a temporary table

+
  • Y indicates that it is a temporary table.
  • N indicates that it is not a temporary table.
+

dropped

+

character varying

+

Whether the current record is deleted

+
  • YES indicates that it is deleted.
  • NO indicates that it is not deleted.
+

num_rows

+

numeric

+

The estimated number of rows in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0656.html b/docs/dws/dev/dws_04_0656.html new file mode 100644 index 00000000..5e32c4f0 --- /dev/null +++ b/docs/dws/dev/dws_04_0656.html @@ -0,0 +1,37 @@ + + +

ALL_USERS

+

ALL_USERS displays all users of the database visible to the current user, however, it does not describe the users.

+ +
+ + + + + + + + + + + + + +
Table 1 ALL_USERS columns

Name

+

Type

+

Description

+

username

+

name

+

User name

+

user_id

+

oid

+

OID of the user

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0657.html b/docs/dws/dev/dws_04_0657.html new file mode 100644 index 00000000..298fb6ee --- /dev/null +++ b/docs/dws/dev/dws_04_0657.html @@ -0,0 +1,51 @@ + + +

ALL_VIEWS

+

ALL_VIEWS displays the description about all views accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 ALL_VIEWS columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the view

+

view_name

+

name

+

Name of the view

+

text_length

+

integer

+

Text length of the view

+

text

+

text

+

Text in the view

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0658.html b/docs/dws/dev/dws_04_0658.html new file mode 100644 index 00000000..9905bf46 --- /dev/null +++ b/docs/dws/dev/dws_04_0658.html @@ -0,0 +1,37 @@ + + +

DBA_DATA_FILES

+

DBA_DATA_FILES displays the description of database files. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + +
Table 1 DBA_DATA_FILES columns

Name

+

Type

+

Description

+

tablespace_name

+

name

+

Name of the tablespace to which the file belongs

+

bytes

+

double precision

+

Length of the file in bytes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0659.html b/docs/dws/dev/dws_04_0659.html new file mode 100644 index 00000000..36c8a297 --- /dev/null +++ b/docs/dws/dev/dws_04_0659.html @@ -0,0 +1,30 @@ + + +

DBA_USERS

+

DBA_USERS displays all user names in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + +
Table 1 DBA_USERS columns

Name

+

Type

+

Description

+

username

+

character varying(64)

+

User name

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0660.html b/docs/dws/dev/dws_04_0660.html new file mode 100644 index 00000000..26315a5e --- /dev/null +++ b/docs/dws/dev/dws_04_0660.html @@ -0,0 +1,51 @@ + + +

DBA_COL_COMMENTS

+

DBA_COL_COMMENTS displays information about table colum comments in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_COL_COMMENTS columns

Name

+

Type

+

Description

+

column_name

+

character varying(64)

+

Column name

+

table_name

+

character varying(64)

+

Table name

+

owner

+

character varying(64)

+

Table owner

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0661.html b/docs/dws/dev/dws_04_0661.html new file mode 100644 index 00000000..90ff069e --- /dev/null +++ b/docs/dws/dev/dws_04_0661.html @@ -0,0 +1,59 @@ + + +

DBA_CONSTRAINTS

+

DBA_CONSTRAINTS displays information about table constraints in database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_CONSTRAINTS columns

Name

+

Type

+

Description

+

constraint_name

+

vcharacter varying(64)

+

Constraint name

+

constraint_type

+

text

+

Constraint type

+
  • C: Check constraint.
  • F: Foreign key constraint
  • P: Primary key constraint
  • U: Unique constraint.
+

table_name

+

character varying(64)

+

Name of constraint-related table

+

index_owner

+

character varying(64)

+

Owner of constraint-related index (only for the unique constraint and primary key constraint)

+

index_name

+

character varying(64)

+

Name of constraint-related index (only for the unique constraint and primary key constraint)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0662.html b/docs/dws/dev/dws_04_0662.html new file mode 100644 index 00000000..32fc582c --- /dev/null +++ b/docs/dws/dev/dws_04_0662.html @@ -0,0 +1,51 @@ + + +

DBA_CONS_COLUMNS

+

DBA_CONS_COLUMNS displays information about constraint columns in database tables. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_CONS_COLUMNS columns

Name

+

Type

+

Description

+

table_name

+

character varying(64)

+

Name of constraint-related table

+

column_name

+

character varying(64)

+

Name of constraint-related column

+

constraint_name

+

character varying(64)

+

Constraint name

+

position

+

smallint

+

Position of the column in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0663.html b/docs/dws/dev/dws_04_0663.html new file mode 100644 index 00000000..6179f011 --- /dev/null +++ b/docs/dws/dev/dws_04_0663.html @@ -0,0 +1,65 @@ + + +

DBA_IND_COLUMNS

+

DBA_IND_COLUMNS displays column information about all indexes in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_IND_COLUMNS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

name

+

Column name

+

column_position

+

smallint

+

Position of column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0664.html b/docs/dws/dev/dws_04_0664.html new file mode 100644 index 00000000..a50d0fa8 --- /dev/null +++ b/docs/dws/dev/dws_04_0664.html @@ -0,0 +1,65 @@ + + +

DBA_IND_EXPRESSIONS

+

DBA_IND_EXPRESSIONS displays the information about expression indexes in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_IND_EXPRESSIONS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_expression

+

text

+

The function-based index expression of a specified column

+

column_position

+

smallint

+

Position of column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0665.html b/docs/dws/dev/dws_04_0665.html new file mode 100644 index 00000000..70588728 --- /dev/null +++ b/docs/dws/dev/dws_04_0665.html @@ -0,0 +1,72 @@ + + +

DBA_IND_PARTITIONS

+

DBA_IND_PARTITIONS displays information about all index partitions in the database. Each index partition of a partitioned table in the database, if present, has a row of records in DBA_IND_PARTITIONS. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_IND_PARTITIONS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Name of the owner of the partitioned index to which the index partition belongs

+

schema

+

character varying(64)

+

Schema of the partitioned index to which the index partition belongs

+

index_name

+

character varying(64)

+

Index name of the partitioned table to which the index partition belongs

+

partition_name

+

character varying(64)

+

Name of the index partition

+

index_partition_usable

+

boolean

+

Whether the index partition is available

+

high_value

+

text

+

Upper boundary of the partition corresponding to the index partition

+

def_tablespace_name

+

name

+

Tablespace name of the index partition

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0666.html b/docs/dws/dev/dws_04_0666.html new file mode 100644 index 00000000..121b8159 --- /dev/null +++ b/docs/dws/dev/dws_04_0666.html @@ -0,0 +1,65 @@ + + +

DBA_INDEXES

+

DBA_INDEXES displays all indexes in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_INDEXES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the index

+

index_name

+

character varying(64)

+

Index name

+

table_name

+

character varying(64)

+

Name of the table corresponding to the index

+

uniqueness

+

text

+

Whether the index is a unique index

+

generated

+

character varying(1)

+

Whether the index name is generated by the system

+

partitioned

+

character(3)

+

Whether the index has the property of the partition table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0667.html b/docs/dws/dev/dws_04_0667.html new file mode 100644 index 00000000..275c5979 --- /dev/null +++ b/docs/dws/dev/dws_04_0667.html @@ -0,0 +1,75 @@ + + +

DBA_OBJECTS

+

DBA_OBJECTS displays all database objects in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_OBJECTS columns

Name

+

Type

+

Description

+

owner

+

name

+

Owner of the object

+

object_name

+

name

+

Object name

+

object_id

+

oid

+

OID of the object

+

object_type

+

name

+

Type of the object

+

namespace

+

oid

+

Namespace containing the object

+

created

+

timestamp with time zone

+

Object creation time

+

last_ddl_time

+

timestamp with time zone

+

The last time when an object was modified.

+
+
+

For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.

+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0668.html b/docs/dws/dev/dws_04_0668.html new file mode 100644 index 00000000..efde4960 --- /dev/null +++ b/docs/dws/dev/dws_04_0668.html @@ -0,0 +1,81 @@ + + +

DBA_PART_INDEXES

+

DBA_PART_INDEXES displays information about all partitioned table indexes in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_PART_INDEXES columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Name of the owner of the partitioned table index

+

schema

+

character varying(64)

+

Schema of the partitioned table index

+

index_name

+

character varying(64)

+

Name of the partitioned table index

+

table_name

+

character varying(64)

+

Name of the partitioned table to which the partitioned table index belongs

+

partitioning_type

+

text

+

Partition policy of the partitioned table

+
NOTE:

Currently, only range partitioning is supported.

+
+

partition_count

+

bigint

+

Number of index partitions of the partitioned table index

+

def_tablespace_name

+

name

+

Tablespace name of the partitioned table index

+

partitioning_key_count

+

integer

+

Number of partition keys of the partitioned table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0669.html b/docs/dws/dev/dws_04_0669.html new file mode 100644 index 00000000..81b09f75 --- /dev/null +++ b/docs/dws/dev/dws_04_0669.html @@ -0,0 +1,74 @@ + + +

DBA_PART_TABLES

+

DBA_PART_TABLES displays information about all partitioned tables in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_PART_TABLES columns

Name

+

Type

+

Description

+

table_owner

+

character varying(64)

+

Name of the owner of the partitioned table

+

schema

+

character varying(64)

+

Schema of the partitioned table

+

table_name

+

character varying(64)

+

Name of the partitioned table

+

partitioning_type

+

text

+

Partition policy of the partitioned table

+
NOTE:

Currently, only range partitioning is supported.

+
+

partition_count

+

bigint

+

Number of partitions of the partitioned table

+

def_tablespace_name

+

name

+

Tablespace name of the partitioned table

+

partitioning_key_count

+

integer

+

Number of partition keys of the partitioned table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0670.html b/docs/dws/dev/dws_04_0670.html new file mode 100644 index 00000000..e3aa17fd --- /dev/null +++ b/docs/dws/dev/dws_04_0670.html @@ -0,0 +1,44 @@ + + +

DBA_PROCEDURES

+

DBA_PROCEDURES displays information about all stored procedures and functions in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 DBA_PROCEDURES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the stored procedure or the function

+

object_name

+

character varying(64)

+

Name of the stored procedure or the function

+

argument_number

+

smallint

+

Number of the input parameters in the stored procedure

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0671.html b/docs/dws/dev/dws_04_0671.html new file mode 100644 index 00000000..4f2b051c --- /dev/null +++ b/docs/dws/dev/dws_04_0671.html @@ -0,0 +1,37 @@ + + +

DBA_SEQUENCES

+

DBA_SEQUENCES displays information about all sequences in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + +
Table 1 DBA_SEQUENCES columns

Name

+

Type

+

Description

+

sequence_owner

+

character varying(64)

+

Owner of the sequence

+

sequence_name

+

character varying(64)

+

Name of the sequence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0672.html b/docs/dws/dev/dws_04_0672.html new file mode 100644 index 00000000..73825ce1 --- /dev/null +++ b/docs/dws/dev/dws_04_0672.html @@ -0,0 +1,44 @@ + + +

DBA_SOURCE

+

DBA_SOURCE displays all stored procedures or functions in the database, and it provides the columns defined by the stored procedures or functions. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 DBA_SOURCE columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the stored procedure or the function

+

name

+

character varying(64)

+

Name of the stored procedure or the function

+

text

+

text

+

Definition of the stored procedure or the function

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0673.html b/docs/dws/dev/dws_04_0673.html new file mode 100644 index 00000000..dc06d88e --- /dev/null +++ b/docs/dws/dev/dws_04_0673.html @@ -0,0 +1,65 @@ + + +

DBA_SYNONYMS

+

DBA_SYNONYMS displays all synonyms in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_SYNONYMS columns

Name

+

Type

+

Description

+

owner

+

text

+

Owner of a synonym.

+

schema_name

+

text

+

Name of the schema to which the synonym belongs.

+

synonym_name

+

text

+

Synonym name.

+

table_owner

+

text

+

Owner of the associated object.

+

table_schema_name

+

text

+

Schema name of the associated object.

+

table_name

+

text

+

Name of the associated object.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0674.html b/docs/dws/dev/dws_04_0674.html new file mode 100644 index 00000000..f64a1278 --- /dev/null +++ b/docs/dws/dev/dws_04_0674.html @@ -0,0 +1,107 @@ + + +

DBA_TAB_COLUMNS

+

DBA_TAB_COLUMNS displays the columns of tables. Each column of a table in the database has a row in DBA_TAB_COLUMNS. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_TAB_COLUMNS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

character varying(64)

+

Column name

+

data_type

+

character varying(128)

+

Data type of the column

+

column_id

+

integer

+

Sequence number of the column when the table is created

+

data_length

+

integer

+

Length of the column in the unit of bytes

+

comments

+

text

+

Comments

+

avg_col_len

+

numeric

+

Average length of a column in the unit of bytes

+

nullable

+

bpchar

+

Whether the column can be empty. For the primary key constraint and non-null constraint, the value is n.

+

data_precision

+

integer

+

Indicates the precision of the data type. This parameter is valid for the numeric data type, however its value is NULL for other types.

+

data_scale

+

integer

+

Number of decimal places. This parameter is valid for the numeric data type. For other data types, the value of this parameter is 0.

+

char_length

+

numeric

+

Column length (in the unit of bytes) which is valid only for varchar, nvarchar2, bpchar, and char types.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0675.html b/docs/dws/dev/dws_04_0675.html new file mode 100644 index 00000000..fc686125 --- /dev/null +++ b/docs/dws/dev/dws_04_0675.html @@ -0,0 +1,44 @@ + + +

DBA_TAB_COMMENTS

+

DBA_TAB_COMMENTS displays comments about all tables and views in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 DBA_TAB_COMMENTS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the table or the view

+

table_name

+

character varying(64)

+

Name of the table or the view

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0676.html b/docs/dws/dev/dws_04_0676.html new file mode 100644 index 00000000..49dca363 --- /dev/null +++ b/docs/dws/dev/dws_04_0676.html @@ -0,0 +1,65 @@ + + +

DBA_TAB_PARTITIONS

+

DBA_TAB_PARTITIONS displays information about all partitions in the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_TAB_PARTITIONS columns

Name

+

Type

+

Description

+

table_owner

+

character varying(64)

+

Owner of the table that contains the partition

+

schema

+

character varying(64)

+

Schema of the partitioned table

+

table_name

+

character varying(64)

+

Table name

+

partition_name

+

character varying(64)

+

Name of the partition

+

high_value

+

text

+

Upper boundary of the range partition and interval partition

+

tablespace_name

+

name

+

Name of the tablespace that contains the partition

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0677.html b/docs/dws/dev/dws_04_0677.html new file mode 100644 index 00000000..4bfeae6e --- /dev/null +++ b/docs/dws/dev/dws_04_0677.html @@ -0,0 +1,74 @@ + + +

DBA_TABLES

+

DBA_TABLES displays all tables in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 DBA_TABLES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

tablespace_name

+

character varying(64)

+

Name of the tablespace that contains the table

+

status

+

character varying(8)

+

Whether the current record is valid

+

temporary

+

character(1)

+

Whether the table is a temporary table

+
  • Y indicates that it is a temporary table.
  • N indicates that it is not a temporary table.
+

dropped

+

character varying

+

Whether the current record is deleted

+
  • YES indicates that it is deleted.
  • NO indicates that it is not deleted.
+

num_rows

+

numeric

+

The estimated number of rows in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0678.html b/docs/dws/dev/dws_04_0678.html new file mode 100644 index 00000000..475d5595 --- /dev/null +++ b/docs/dws/dev/dws_04_0678.html @@ -0,0 +1,30 @@ + + +

DBA_TABLESPACES

+

DBA_TABLESPACES displays information about available tablespaces. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + +
Table 1 DBA_TABLESPACES columns

Name

+

Type

+

Description

+

tablespace_name

+

character varying(64)

+

Name of the tablespace

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0679.html b/docs/dws/dev/dws_04_0679.html new file mode 100644 index 00000000..16a25f67 --- /dev/null +++ b/docs/dws/dev/dws_04_0679.html @@ -0,0 +1,44 @@ + + +

DBA_TRIGGERS

+

DBA_TRIGGERS displays information about triggers in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 DBA_TRIGGERS columns

Name

+

Type

+

Description

+

trigger_name

+

character varying(64)

+

Trigger name

+

table_name

+

character varying(64)

+

Name of the table that defines the trigger

+

table_owner

+

character varying(64)

+

Owner of the table that defines the trigger

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0680.html b/docs/dws/dev/dws_04_0680.html new file mode 100644 index 00000000..22b99286 --- /dev/null +++ b/docs/dws/dev/dws_04_0680.html @@ -0,0 +1,37 @@ + + +

DBA_VIEWS

+

DBA_VIEWS displays views in the database. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + +
Table 1 DBA_VIEWS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the view

+

view_name

+

character varying(64)

+

View name

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0681.html b/docs/dws/dev/dws_04_0681.html new file mode 100644 index 00000000..0bfed48c --- /dev/null +++ b/docs/dws/dev/dws_04_0681.html @@ -0,0 +1,30 @@ + + +

DUAL

+

DUAL is automatically created by the database based on the data dictionary. It has only one text column in only one row for storing expression calculation results. It is accessible to all users.

+ +
+ + + + + + + + + +
Table 1 DUAL columns

Name

+

Type

+

Description

+

dummy

+

text

+

Expression calculation result

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0682.html b/docs/dws/dev/dws_04_0682.html new file mode 100644 index 00000000..3b2fa849 --- /dev/null +++ b/docs/dws/dev/dws_04_0682.html @@ -0,0 +1,12 @@ + + +

GLOBAL_REDO_STAT

+

GLOBAL_REDO_STAT displays the total statistics of XLOG redo operations on all nodes in a cluster. Except the avgiotim column (indicating the average redo write time of all nodes), the names of the other columns in this view are the same as those in the PV_REDO_STAT view. The respective meanings of the other columns are the sum of the values of the same columns in the PV_REDO_STAT view on each node.

+

This view is accessible only to users with system administrator rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0683.html b/docs/dws/dev/dws_04_0683.html new file mode 100644 index 00000000..094fb7d8 --- /dev/null +++ b/docs/dws/dev/dws_04_0683.html @@ -0,0 +1,11 @@ + + +

GLOBAL_REL_IOSTAT

+

GLOBAL_REL_IOSTAT displays the total disk I/O statistics of all nodes in a cluster. The name of each column in this view is the same as that in the GS_REL_IOSTAT view, but the column meaning is the sum of the value of the same column in the GS_REL_IOSTAT view on each node. This view is accessible only to users with system administrator rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0684.html b/docs/dws/dev/dws_04_0684.html new file mode 100644 index 00000000..272ce0ba --- /dev/null +++ b/docs/dws/dev/dws_04_0684.html @@ -0,0 +1,197 @@ + + +

GLOBAL_STAT_DATABASE

+

GLOBAL_STAT_DATABASE displays the status and statistics of databases on all nodes in a cluster.

+
  • When you query the GLOBAL_STAT_DATABASE view on a CN, the respective values of all columns returned, except stats_reset (indicating the status reset time on the current CN), are the sum of values on related nodes in the cluster. Note that the sum range varies depending on the logical meaning of each column in the GLOBAL_STAT_DATABASE view.
  • When you query the GLOBAL_STAT_DATABASE view on a DN, the query result is the same as that in Table 1.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GLOBAL_STAT_DATABASE columns

Name

+

Type

+

Description

+

Sum Range

+

datid

+

oid

+

Database OID

+

-

+

datname

+

name

+

Database name

+

-

+

numbackends

+

integer

+

Number of backends currently connected to this database on the current node. This is the only column in this view that reflects the current state value. All columns return the accumulated value since the last reset.

+

CN

+

xact_commit

+

bigint

+

Number of transactions in this database that have been committed on the current node

+

CN

+

xact_rollback

+

bigint

+

Number of transactions in this database that have been rolled back on the current node

+

CN

+

blks_read

+

bigint

+

Number of disk blocks read in this database on the current node

+

DN

+

blks_hit

+

bigint

+

Number of disk blocks found in the buffer cache on the current node, that is, the number of blocks hit in the cache. (This only includes hits in the GaussDB(DWS) buffer cache, not in the file system cache.)

+

DN

+

tup_returned

+

bigint

+

Number of rows returned by queries in this database on the current node

+

DN

+

tup_fetched

+

bigint

+

Number of rows fetched by queries in this database on the current node

+

DN

+

tup_inserted

+

bigint

+

Number of rows inserted in this database on the current node

+

DN

+

tup_updated

+

bigint

+

Number of rows updated in this database on the current node

+

DN

+

tup_deleted

+

bigint

+

Number of rows deleted from this database on the current node

+

DN

+

conflicts

+

bigint

+

Number of queries canceled due to database recovery conflicts on the current node (conflicts occurring only on the standby server). For details, see PG_STAT_DATABASE_CONFLICTS.

+

CN and DN

+

temp_files

+

bigint

+

Number of temporary files created by this database on the current node. All temporary files are counted, regardless of why the temporary file was created (for example, sorting or hashing), and regardless of the log_temp_files setting.

+

DN

+

temp_bytes

+

bigint

+

Size of temporary files written to this database on the current node. All temporary files are counted, regardless of why the temporary file was created, and regardless of the log_temp_files setting.

+

DN

+

deadlocks

+

bigint

+

Number of deadlocks in this database on the current node

+

CN and DN

+

blk_read_time

+

double precision

+

Time spent reading data file blocks by backends in this database on the current node, in milliseconds

+

DN

+

blk_write_time

+

double precision

+

Time spent writing into data file blocks by backends in this database on the current node, in milliseconds

+

DN

+

stats_reset

+

timestamp with time zone

+

Time when the database statistics are reset on the current node

+

-

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0685.html b/docs/dws/dev/dws_04_0685.html new file mode 100644 index 00000000..5368ebde --- /dev/null +++ b/docs/dws/dev/dws_04_0685.html @@ -0,0 +1,79 @@ + + +

GLOBAL_WORKLOAD_SQL_COUNT

+

GLOBAL_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in all workload Cgroups in a cluster, including the number of SELECT, UPDATE, INSERT, and DELETE statements and the number of DDL, DML, and DCL statements.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GLOBAL_WORKLOAD_SQL_COUNT columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

select_count

+

bigint

+

Number of SELECT statements

+

update_count

+

bigint

+

Number of UPDATE statements

+

insert_count

+

bigint

+

Number of INSERT statements

+

delete_count

+

bigint

+

Number of DELETE statements

+

ddl_count

+

bigint

+

Number of DDL statements

+

dml_count

+

bigint

+

Number of DML statements

+

dcl_count

+

bigint

+

Number of DCL statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0686.html b/docs/dws/dev/dws_04_0686.html new file mode 100644 index 00000000..a948b70b --- /dev/null +++ b/docs/dws/dev/dws_04_0686.html @@ -0,0 +1,142 @@ + + +

GLOBAL_WORKLOAD_SQL_ELAPSE_TIME

+

GLOBAL_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in all workload Cgroups in a cluster, including the maximum, minimum, average, and total response time of SELECT, UPDATE, INSERT, and DELETE statements. The unit is microsecond.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GLOBAL_WORKLOAD_SQL_ELAPSE_TIME columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

total_select_elapse

+

bigint

+

Total response time of SELECT

+

max_select_elapse

+

bigint

+

Maximum response time of SELECT

+

min_select_elapse

+

bigint

+

Minimum response time of SELECT

+

avg_select_elapse

+

bigint

+

Average response time of SELECT

+

total_update_elapse

+

bigint

+

Total response time of UPDATE

+

max_update_elapse

+

bigint

+

Maximum response time of UPDATE

+

min_update_elapse

+

bigint

+

Minimum response time of UPDATE

+

avg_update_elapse

+

bigint

+

Average response time of UPDATE

+

total_insert_elapse

+

bigint

+

Total response time of INSERT

+

max_insert_elapse

+

bigint

+

Maximum response time of INSERT

+

min_insert_elapse

+

bigint

+

Minimum response time of INSERT

+

avg_insert_elapse

+

bigint

+

Average response time of INSERT

+

total_delete_elapse

+

bigint

+

Total response time of DELETE

+

max_delete_elapse

+

bigint

+

Maximum response time of DELETE

+

min_delete_elapse

+

bigint

+

Minimum response time of DELETE

+

avg_delete_elapse

+

bigint

+

Average response time of DELETE

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0687.html b/docs/dws/dev/dws_04_0687.html new file mode 100644 index 00000000..c6359c24 --- /dev/null +++ b/docs/dws/dev/dws_04_0687.html @@ -0,0 +1,72 @@ + + +

GLOBAL_WORKLOAD_TRANSACTION

+

GLOBAL_WORKLOAD_TRANSACTION provides the total transaction information about workload Cgroups on all CNs in the cluster. This view is accessible only to users with system administrator rights. It is valid only when the real-time resource monitoring function is enabled, that is, enable_resource_track is on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GLOBAL_WORKLOAD_TRANSACTION columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

commit_counter

+

bigint

+

Total number of submission times on each CN

+

rollback_counter

+

bigint

+

Total number of rollback times on each CN

+

resp_min

+

bigint

+

Minimum response time of the cluster

+

resp_max

+

bigint

+

Maximum response time of the cluster

+

resp_avg

+

bigint

+

Average response time on each CN

+

resp_total

+

bigint

+

Total response time on each CN

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0688.html b/docs/dws/dev/dws_04_0688.html new file mode 100644 index 00000000..2aaaf173 --- /dev/null +++ b/docs/dws/dev/dws_04_0688.html @@ -0,0 +1,93 @@ + + +

GS_ALL_CONTROL_GROUP_INFO

+

GS_ALL_CONTROL_GROUP_INFO displays all Cgroup information in a database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_ALL_CONTROL_GROUP_INFO columns

Name

+

Type

+

Description

+

name

+

text

+

Name of the Cgroup

+

type

+

text

+

Type of the Cgroup

+

gid

+

bigint

+

Cgroup ID

+

classgid

+

bigint

+

ID of the Class Cgroup to which a Workload belongs

+

class

+

text

+

Class Cgroup

+

workload

+

text

+

Workload Cgroup

+

shares

+

bigint

+

CPU quota allocated to a Cgroup

+

limits

+

bigint

+

Limit of CPUs allocated to a Cgroup

+

wdlevel

+

bigint

+

Workload Cgroup level

+

cpucores

+

text

+

Usage of CPU cores in a Cgroup

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0689.html b/docs/dws/dev/dws_04_0689.html new file mode 100644 index 00000000..9c19e3f4 --- /dev/null +++ b/docs/dws/dev/dws_04_0689.html @@ -0,0 +1,72 @@ + + +

GS_CLUSTER_RESOURCE_INFO

+

GS_CLUSTER_RESOURCE_INFO displays a DN resource summary.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_CLUSTER_RESOURCE_INFO columns

Name

+

Type

+

Description

+

min_mem_util

+

integer

+

Minimum memory usage of a DN

+

max_mem_util

+

integer

+

Maximum memory usage of a DN

+

min_cpu_util

+

integer

+

Minimum CPU usage of a DN

+

max_cpu_util

+

integer

+

Maximum CPU usage of a DN

+

min_io_util

+

integer

+

Minimum I/O usage of a DN

+

max_io_util

+

integer

+

Maximum I/O usage of a DN

+

used_mem_rate

+

integer

+

Maximum physical memory usage

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0690.html b/docs/dws/dev/dws_04_0690.html new file mode 100644 index 00000000..e0a0d4bc --- /dev/null +++ b/docs/dws/dev/dws_04_0690.html @@ -0,0 +1,246 @@ + + +

GS_INSTR_UNIQUE_SQL

+

Unique SQL Definition

The database parses each received SQL text string and generates an internal parsing tree. The database traverses the parsing tree and ignores constant values in the parsing tree. In this case, an integer value is calculated using a certain algorithm. This integer is used as the Unique SQL ID to uniquely identify this type of SQL. SQLs with the same Unique SQL ID are called Unique SQLs.

+
+

Examples

Assume that the user enters the following SQL statements in sequence:

+
select * from t1 where id = 1;
+select * from t1 where id = 2;
+
+

The statistics of the two SQL statements are aggregated to the same Unique SQL statement.

+
select * from t1 where id = ?;
+

GS_INSTR_UNIQUE_SQL View

The GS_INSTR_UNIQUE_SQL view displays the execution information about the Unique SQL statements collected by the current node, including:

+
  • Unique SQL ID and normalized SQL text string. The normalized SQL text is described in Examples.
  • Number of execution times (number of successful execution times) and response time (SQL execution time in the database, including the maximum, minimum, and total time)
  • Cache/IO information, including the number of physical reads and logical reads of a block. Only information about successfully executed SQL statements on each DN is collected. The statistical value is related to factors such as the amount of data processed during query execution, used memory, whether the query is executed for multiple times, memory management policy, and whether there are other concurrent queries. The statistical value reflects the number of physical reads and logical reads of the buffer block in the entire query execution process. The statistical value may vary according to the execution time.
  • Row activities, such as the number of returned rows, updated rows, inserted rows, deleted rows, sequentially scanned rows, and randomly scanned rows in the result set of the SELECT statement. Except that the number of rows returned by the result set is the same as the number of rows in the result set of the SELECT statement and is recorded only on the CN, the activity information of other rows is recorded on the DN. The statistical value reflects the row activities during the entire query execution process, including scanning and modifying related system catalogs, metadata tables, and data tables. The value of this parameter is related to the data volume and related parameter settings. That is, the statistical value is greater than or equal to the scanning and modification times of actual data tables.
  • Time distribution, including DB_TIME/CPU_TIME/EXECUTION_TIME/PARSE_TIME/PLAN_TIME/REWRITE_TIME/PL_EXECUTION_TIME/PL_COMPILATION_TIME/NET_SEND_TIME/DATA_IO_TIME. For details, see Table 1. The information is collected on both CNs and DNs and is displayed during view query.
  • Number of soft and hard parsing times, such as the number of soft parsing times (cache plan) and hard parsing times (generation plan). If the cache plan is executed this time, the number of soft parsing times increases by 1. If the generation plan is regenerated this time, the number of hard parsing times increases by 1. This number is counted on both CNs and DNs and is displayed during view query.
+

The Unique SQL statistics function has the following restrictions:

+
  • Detailed statistics are displayed only for successfully executed SQL statements. Otherwise, only query, node, and user information are recorded.
  • Based on the Unique SQL ID generation algorithm, different IDs may be generated when the same SQL statement is executed on different nodes.
  • If the Unique SQL statistics function is enabled, the CN collects statistics on all received queries, including tool and user queries.
  • If an SQL statement contains multiple SQL statements or similar stored procedures, a Unique SQL statement is generated for the outermost SQL statement. The statistics of all sub-SQL statements are summarized to the Unique SQL record.
  • The response time statistics of Unique SQL does not include the time of the NET_SEND_TIME phase. Therefore, there is no comparison between EXECUTION_TIME and elapse_time.
  • parse_time of clauses cannot be calculated for begin;...;commit and similar transaction blocks.
+

When a common user accesses the GS_INSTR_UNIQUE_SQL view, only the Unique SQL information about the user is displayed. When an administrator accesses the GS_INSTR_UNIQUE_SQL view, all Unique SQL information about the current node is displayed. The GS_INSTR_UNIQUE_SQL view can be queried on both CNs and DNs. The DN displays the Unique SQL statistics of the local node, and the CN displays the complete Unique SQL statistics of the local node. That is, the CN collects the Unique SQL execution information of the CN from other CNs and DNs and displays the information. You can query the GS_INSTR_UNIQUE_SQL view to locate the top SQL statements that consume different resources, providing a basis for cluster performance optimization and maintenance.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_INSTR_UNIQUE_SQL columns

Name

+

Type

+

Description

+

node_name

+

name

+

Name of the CN that receives SQL statements

+

node_id

+

integer

+

Node ID, which is the same as the value of node_id in the pgxc_node table

+

user_name

+

name

+

Username

+

user_id

+

oid

+

User ID

+

unique_sql_id

+

bigint

+

Normalized Unique SQL ID

+

query

+

text

+

Normalized SQL text. The maximum length is equal to the value of the GUC parameter track_activity_query_size.

+

n_calls

+

bigint

+

Number of successful execution times

+

min_elapse_time

+

bigint

+

Minimum running time of the SQL statement in the database (unit: μs)

+

max_elapse_time

+

bigint

+

Maximum running time of SQL statements in the database (unit: μs)

+

total_elapse_time

+

bigint

+

Total running time of SQL statements in the database (unit: μs)

+

n_returned_rows

+

bigint

+

Row activity - Number of rows in the result set returned by the SELECT statement

+

n_tuples_fetched

+

bigint

+

Row activity - Randomly scan rows (column-store tables/foreign tables are not counted.)

+

n_tuples_returned

+

bigint

+

Row activity - Sequential scan rows (Column-store tables/foreign tables are not counted.)

+

n_tuples_inserted

+

bigint

+

Row activity - Inserted rows

+

n_tuples_updated

+

bigint

+

Row activity - Updated rows

+

n_tuples_deleted

+

bigint

+

Row activity - Deleted rows

+

n_blocks_fetched

+

bigint

+

Block access times of the buffer, that is, physical read/I/O

+

n_blocks_hit

+

bigint

+

Block hits of the buffer, that is, logical read/cache

+

n_soft_parse

+

bigint

+

Number of soft parsing times (cache plan)

+

n_hard_parse

+

bigint

+

Number of hard parsing times (generation plan)

+

db_time

+

bigint

+

Valid DB execution time, including the waiting time and network sending time. If multiple threads are involved in query execution, the value of DB_TIME is the sum of DB_TIME of multiple threads (unit: μs).

+

cpu_time

+

bigint

+

CPU execution time, excluding the sleep time (unit: μs)

+

execution_time

+

bigint

+

SQL execution time in the query executor, DDL statements, and statements (such as Copy statements) that are not executed by the executor are not counted (unit: μs).

+

parse_time

+

bigint

+

SQL parsing time (unit: μs)

+

plan_time

+

bigint

+

SQL generation plan time (unit: μs)

+

rewrite_time

+

bigint

+

SQL rewriting time (unit: μs)

+

pl_execution_time

+

bigint

+

Execution time of the plpgsql procedural language function (unit: μs)

+

pl_compilation_time

+

bigint

+

Compilation time of the plpgsql procedural language function (unit: μs)

+

net_send_time

+

bigint

+

Network time, including the time spent by the CN in sending data to the client and the time spent by the DN in sending data to the CN (unit: μs)

+

data_io_time

+

bigint

+

File I/O time (unit: μs)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0691.html b/docs/dws/dev/dws_04_0691.html new file mode 100644 index 00000000..3144bd9b --- /dev/null +++ b/docs/dws/dev/dws_04_0691.html @@ -0,0 +1,51 @@ + + +

GS_REL_IOSTAT

+

GS_REL_IOSTAT displays disk I/O statistics on the current node. In the current version, only one page is read or written in each read or write operation. Therefore, the number of read/write times is the same as the number of pages.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_REL_IOSTAT columns

Name

+

Type

+

Description

+

phyrds

+

bigint

+

Number of disk reads

+

phywrts

+

bigint

+

Number of disk writes

+

phyblkrd

+

bigint

+

Number of read pages

+

phyblkwrt

+

bigint

+

Number of written pages

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0692.html b/docs/dws/dev/dws_04_0692.html new file mode 100644 index 00000000..9a27281b --- /dev/null +++ b/docs/dws/dev/dws_04_0692.html @@ -0,0 +1,11 @@ + + +

GS_NODE_STAT_RESET_TIME

+

The GS_NODE_STAT_RESET_TIME view provides the reset time of statistics on the current node and returns the timestamp with the time zone. For details, see the get_node_stat_reset_time() function in "Functions and Operators > System Administration Functions > Other Functions" in SQL Syntax.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0693.html b/docs/dws/dev/dws_04_0693.html new file mode 100644 index 00000000..9b0494f8 --- /dev/null +++ b/docs/dws/dev/dws_04_0693.html @@ -0,0 +1,86 @@ + + +

GS_SESSION_CPU_STATISTICS

+

GS_SESSION_CPU_STATISTICS displays load management information about CPU usage of ongoing complex jobs executed by the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_SESSION_CPU_STATISTICS columns

Name

+

Type

+

Description

+

datid

+

oid

+

OID of the database this backend is connected to

+

usename

+

name

+

Name of the user logging in to the backend

+

pid

+

bigint

+

ID of a backend process

+

start_time

+

timestamp with time zone

+

Time when the statement starts to be executed

+

min_cpu_time

+

bigint

+

Minimum CPU time of the statement across all DNs. The unit is ms.

+

max_cpu_time

+

bigint

+

Maximum CPU time of the statement across all DNs. The unit is ms.

+

total_cpu_time

+

bigint

+

Total CPU time of the statement across all DNs. The unit is ms.

+

query

+

text

+

Statement that is being executed

+

node_group

+

text

+

Logical cluster of the user running the statement

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0694.html b/docs/dws/dev/dws_04_0694.html new file mode 100644 index 00000000..5c808644 --- /dev/null +++ b/docs/dws/dev/dws_04_0694.html @@ -0,0 +1,89 @@ + + +

GS_SESSION_MEMORY_STATISTICS

+

GS_SESSION_MEMORY_STATISTICS displays load management information about memory usage of ongoing complex jobs executed by the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_SESSION_MEMORY_STATISTICS columns

Name

+

Type

+

Description

+

datid

+

oid

+

OID of the database this backend is connected to

+

usename

+

name

+

Name of the user logging in to the backend

+

pid

+

bigint

+

ID of a backend process

+

start_time

+

timestamp with time zone

+

Time when the statement starts to be executed

+

min_peak_memory

+

integer

+

Minimum memory peak of a statement across all DNs, in MB

+

max_peak_memory

+

integer

+

Maximum memory peak of a statement across all DNs, in MB

+

spill_info

+

text

+

Information about statement flushing into disks on DNs

+

None indicates that the statement has not been flushed to disks on any DNs.

+

All indicates that the statement has been flushed to disks on every DN.

+

[a:b] indicates that the statement has been flushed to disks on a of b DNs.

+

query

+

text

+

Statement that is being executed

+

node_group

+

text

+

Logical cluster of the user running the statement

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0695.html b/docs/dws/dev/dws_04_0695.html new file mode 100644 index 00000000..73e7e5f1 --- /dev/null +++ b/docs/dws/dev/dws_04_0695.html @@ -0,0 +1,209 @@ + + +

GS_SQL_COUNT

+

GS_SQL_COUNT displays statistics about the five types of statements (SELECT, INSERT, UPDATE, DELETE, and MERGE INTO) executed on the current node of the database, including the number of execution times, response time (the maximum, minimum, average, and total response time of the other four types of statements except the MERGE INTO statement, in microseconds), and the number of execution times of DDL, DML, and DCL statements.

+

The classification of DDL, DML, and DCL statements in the GS_SQL_COUNT view is slightly different from that of the SQL syntaxt. The details are as follows:

+
  • User-related statements, such as CREATE/ALTER/DROP USER and CREATE/ALTER/DROP ROLE, are of the DCL type.
  • Transaction-related statements such as BEGIN/COMMIT/SET CONSTRAINTS/ROLLBACK/SAVEPOINT/START are of the DCL type.
  • ALTER SYSTEM KILL SESSION is equivalent to the SELECT pg_terminate_backend() statement and is of the DML type.
+

The classification of other statements is similar to the definition in the SQL syntax.

+

When a common user queries the GS_SQL_COUNT view, only the statistics of this user in the current node can be viewed. When a user with the administrator permissions queries the GS_SQL_COUNT view, the statistics of all users in the current node can be viewed. When the cluster or the node is restarted, the statistics are cleared and the counting restarts. The counting is based on the number of queries received by the node, including the queries performed inside the cluster. Statistics about the GS_SQL_COUNT view are collected only on CNs, and SQL statements sent from other CNs are not collected. No result is returned when you query the view on a DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_SQL_COUNT columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

user_name

+

name

+

User name

+

select_count

+

bigint

+

Number of SELECT statements

+

update_count

+

bigint

+

Number of UPDATE statements

+

insert_count

+

bigint

+

Number of INSERT statements

+

delete_count

+

bigint

+

Number of DELETE statements

+

mergeinto_count

+

bigint

+

Number of MERGE INTO statements

+

ddl_count

+

bigint

+

Number of DDL statements

+

dml_count

+

bigint

+

Number of DML statements

+

dcl_count

+

bigint

+

Number of DCL statements

+

total_select_elapse

+

bigint

+

Total response time of SELECT statements

+

avg_select_elapse

+

bigint

+

Average response time of SELECT statements

+

max_select_elapse

+

bigint

+

Maximum response time of SELECT statements

+

min_select_elapse

+

bigint

+

Minimum response time of SELECT statements

+

total_update_elapse

+

bigint

+

Total response time of UPDATE statements

+

avg_update_elapse

+

bigint

+

Average response time of UPDATE statements

+

max_update_elapse

+

bigint

+

Maximum response time of UPDATE statements

+

min_update_elapse

+

bigint

+

Minimum response time of UPDATE statements

+

total_delete_elapse

+

bigint

+

Total response time of DELETE statements

+

avg_delete_elapse

+

bigint

+

Average response time of DELETE statements

+

max_delete_elapse

+

bigint

+

Maximum response time of DELETE statements

+

min_delete_elapse

+

bigint

+

Minimum response time of DELETE statements

+

total_insert_elapse

+

bigint

+

Total response time of INSERT statements

+

avg_insert_elapse

+

bigint

+

Average response time of INSERT statements

+

max_insert_elapse

+

bigint

+

Maximum response time of INSERT statements

+

min_insert_elapse

+

bigint

+

Minimum response time of INSERT statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0696.html b/docs/dws/dev/dws_04_0696.html new file mode 100644 index 00000000..81c55458 --- /dev/null +++ b/docs/dws/dev/dws_04_0696.html @@ -0,0 +1,90 @@ + + +

GS_WAIT_EVENTS

+

GS_WAIT_EVENTS displays statistics about waiting status and events on the current node.

+

The values of statistical columns in this view are accumulated only when the enable_track_wait_event GUC parameter is set to on. If enable_track_wait_event is set to off during statistics measurement, the statistics will no longer be accumulated, but the existing values are not affected. If enable_track_wait_event is off, 0 row is returned when this view is queried.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WAIT_EVENTS columns

Name

+

Type

+

Description

+

nodename

+

name

+

Node name

+

type

+

text

+

Event type, which can be STATUS, LOCK_EVENT, LWLOCK_EVENT, or IO_EVENT

+

event

+

text

+

Event name. For details, see PG_THREAD_WAIT_STATUS.

+

wait

+

bigint

+

Number of times an event occurs. This column and all the columns below are values accumulated during process running.

+

failed_wait

+

bigint

+

Number of waiting failures. In the current version, this column is used only for counting timeout errors and waiting failures of locks such as LOCK and LWLOCK.

+

total_wait_time

+

bigint

+

Total duration of the event

+

avg_wait_time

+

bigint

+

Average duration of the event

+

max_wait_time

+

bigint

+

Maximum wait time of the event

+

min_wait_time

+

bigint

+

Minimum wait time of the event

+
+
+

In the current version, for events whose type is LOCK_EVENT, LWLOCK_EVENT, or IO_EVENT, the display scope of GS_WAIT_EVENTS is the same as that of the corresponding events in the PG_THREAD_WAIT_STATUS view.

+

For events whose type is STATUS, GS_WAIT_EVENTS displays the following waiting status columns. For details, see the PG_THREAD_WAIT_STATUS view.

+
  • acquire lwlock
  • acquire lock
  • wait io
  • wait pooler get conn
  • wait pooler abort conn
  • wait pooler clean conn
  • wait transaction sync
  • wait wal sync
  • wait data sync
  • wait producer ready
  • create index
  • analyze
  • vacuum
  • vacuum full
  • gtm connect
  • gtm begin trans
  • gtm commit trans
  • gtm rollback trans
  • gtm create sequence
  • gtm alter sequence
  • gtm get sequence val
  • gtm set sequence val
  • gtm drop sequence
  • gtm rename sequence
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0701.html b/docs/dws/dev/dws_04_0701.html new file mode 100644 index 00000000..355e0b02 --- /dev/null +++ b/docs/dws/dev/dws_04_0701.html @@ -0,0 +1,11 @@ + + +

GS_WLM_OPERAROR_INFO

+

This view displays the execution information about operators in the query statements that have been executed on the current CN. The information comes from the system catalog dbms_om. gs_wlm_operator_info.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0702.html b/docs/dws/dev/dws_04_0702.html new file mode 100644 index 00000000..406f6251 --- /dev/null +++ b/docs/dws/dev/dws_04_0702.html @@ -0,0 +1,12 @@ + + +

GS_WLM_OPERATOR_HISTORY

+

This view displays the records of operators in jobs that have been executed by the current user on the current CN.

+

This view is used by Database Manager to query data from the kernel. Data in the kernel is cleared every 3 minutes.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0703.html b/docs/dws/dev/dws_04_0703.html new file mode 100644 index 00000000..37b20eb6 --- /dev/null +++ b/docs/dws/dev/dws_04_0703.html @@ -0,0 +1,185 @@ + + +

GS_WLM_OPERATOR_STATISTICS

+

GS_WLM_OPERATOR_STATISTICS displays the operators of the jobs that are being executed by the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_OPERATOR_STATISTICS columns

Name

+

Type

+

Description

+

queryid

+

bigint

+

Internal query_id used for statement execution

+

pid

+

bigint

+

ID of the backend thread

+

plan_node_id

+

integer

+

plan_node_id of the execution plan of a query

+

plan_node_name

+

text

+

Name of the operator corresponding to plan_node_id

+

start_time

+

timestamp with time zone

+

Time when an operator starts to process the first data record

+

duration

+

bigint

+

Total execution time of an operator. The unit is ms.

+

status

+

text

+

Execution status of the current operator. Its value can be finished or running.

+

query_dop

+

integer

+

DOP of the current operator

+

estimated_rows

+

bigint

+

Number of rows estimated by the optimizer

+

tuple_processed

+

bigint

+

Number of elements returned by the current operator

+

min_peak_memory

+

integer

+

Minimum peak memory used by the current operator on all DNs. The unit is MB.

+

max_peak_memory

+

integer

+

Maximum peak memory used by the current operator on all DNs. The unit is MB.

+

average_peak_memory

+

integer

+

Average peak memory used by the current operator on all DNs. The unit is MB.

+

memory_skew_percent

+

integer

+

Memory usage skew of the current operator among DNs

+

min_spill_size

+

integer

+

Minimum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

max_spill_size

+

integer

+

Maximum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

average_spill_size

+

integer

+

Average spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

spill_skew_percent

+

integer

+

DN spill skew when a spill occurs

+

min_cpu_time

+

bigint

+

Minimum execution time of the operator on all DNs. The unit is ms.

+

max_cpu_time

+

bigint

+

Maximum execution time of the operator on all DNs. The unit is ms.

+

total_cpu_time

+

bigint

+

Total execution time of the operator on all DNs. The unit is ms.

+

cpu_skew_percent

+

integer

+

Skew of the execution time among DNs.

+

warning

+

text

+

Warning. The following warnings are displayed:

+
  1. Sort/SetOp/HashAgg/HashJoin spill
  2. Spill file size large than 256MB
  3. Broadcast size large than 100MB
  4. Early spill
  5. Spill times is greater than 3
  6. Spill on memory adaptive
  7. Hash table conflict
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0704.html b/docs/dws/dev/dws_04_0704.html new file mode 100644 index 00000000..d8df7453 --- /dev/null +++ b/docs/dws/dev/dws_04_0704.html @@ -0,0 +1,11 @@ + + +

GS_WLM_SESSION_INFO

+

This view displays the execution information about the query statements that have been executed on the current CN. The information comes from the system catalog dbms_om. gs_wlm_session_info.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0705.html b/docs/dws/dev/dws_04_0705.html new file mode 100644 index 00000000..6ab5bcfd --- /dev/null +++ b/docs/dws/dev/dws_04_0705.html @@ -0,0 +1,342 @@ + + +

GS_WLM_SESSION_HISTORY

+

GS_WLM_SESSION_HISTORY displays load management information about a completed job executed by the current user on the current CN. This view is used by Database Manager to query data from GaussDB(DWS). Data in the GaussDB(DWS) is cleared every 3 minutes.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_SESSION_HISTORY columns

Name

+

Type

+

Description

+

datid

+

oid

+

OID of the database this backend is connected to

+

dbname

+

text

+

Name of the database the backend is connected to

+

schemaname

+

text

+

Schema name

+

nodename

+

text

+

Name of the CN where the statement is run

+

username

+

text

+

User name used for connecting to the backend

+

application_name

+

text

+

Name of the application that is connected to the backend

+

client_addr

+

inet

+

IP address of the client connected to this backend. If this column is null, it indicates either that the client is connected via a Unix socket on the server machine or that this is an internal process such as autovacuum.

+

client_hostname

+

text

+

Host name of the connected client, as reported by a reverse DNS lookup of client_addr. This column will only be non-null for IP connections, and only when log_hostname is enabled.

+

client_port

+

integer

+

TCP port number that the client uses for communication with this backend, or -1 if a Unix socket is used

+

query_band

+

text

+

Job type, which is specified by the query_band parameter. The default value is a null string.

+

block_time

+

bigint

+

Duration that a statement is blocked before being executed, including the statement parsing and optimization duration. The unit is ms.

+

start_time

+

timestamp with time zone

+

Time when the statement starts to be run

+

finish_time

+

timestamp with time zone

+

Time when the statement execution ends

+

duration

+

bigint

+

Execution time of a statement. The unit is ms.

+

estimate_total_time

+

bigint

+

Estimated execution time of a statement. The unit is ms.

+

status

+

text

+

Final statement execution status. Its value can be finished (normal) or aborted (abnormal).

+

abort_info

+

text

+

Exception information displayed if the final statement execution status is aborted.

+

resource_pool

+

text

+

Resource pool used by the user

+

control_group

+

text

+

Cgroup used by the statement

+

min_peak_memory

+

integer

+

Minimum memory peak of a statement across all DNs. The unit is MB.

+

max_peak_memory

+

integer

+

Maximum memory peak of a statement across all DNs. The unit is MB.

+

average_peak_memory

+

integer

+

Average memory usage during statement execution. The unit is MB.

+

memory_skew_percent

+

integer

+

Memory usage skew of a statement among DNs.

+

spill_info

+

text

+

Statement spill information on all DNs.

+

None indicates that the statement has not been flushed to disks on any DNs.

+

All indicates that the statement has been flushed to disks on every DN.

+

[a:b] indicates that the statement has been flushed to disks on a of b DNs.

+

min_spill_size

+

integer

+

Minimum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

max_spill_size

+

integer

+

Maximum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

average_spill_size

+

integer

+

Average spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

spill_skew_percent

+

integer

+

DN spill skew when a spill occurs

+

min_dn_time

+

bigint

+

Minimum execution time of a statement across all DNs. The unit is ms.

+

max_dn_time

+

bigint

+

Maximum execution time of a statement across all DNs. The unit is ms.

+

average_dn_time

+

bigint

+

Average execution time of a statement across all DNs. The unit is ms.

+

dntime_skew_percent

+

integer

+

Execution time skew of a statement among DNs.

+

min_cpu_time

+

bigint

+

Minimum CPU time of a statement across all DNs. The unit is ms.

+

max_cpu_time

+

bigint

+

Maximum CPU time of a statement across all DNs. The unit is ms.

+

total_cpu_time

+

bigint

+

Total CPU time of a statement across all DNs. The unit is ms.

+

cpu_skew_percent

+

integer

+

CPU time skew of a statement among DNs.

+

min_peak_iops

+

integer

+

Minimum IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

max_peak_iops

+

integer

+

Maximum IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

average_peak_iops

+

integer

+

Average IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

iops_skew_percent

+

integer

+

I/O skew across DNs.

+

warning

+

text

+

Warning. The following warnings and warnings related to SQL self-diagnosis tuning are displayed:

+
  1. Spill file size large than 256MB
  2. Broadcast size large than 100MB
  3. Early spill
  4. Spill times is greater than 3
  5. Spill on memory adaptive
  6. Hash table conflict
+

queryid

+

bigint

+

Internal query ID used for statement execution

+

query

+

text

+

Statement executed

+

query_plan

+

text

+

Execution plan of a statement

+

node_group

+

text

+

Logical cluster of the user running the statement

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0706.html b/docs/dws/dev/dws_04_0706.html new file mode 100644 index 00000000..4a7cc58c --- /dev/null +++ b/docs/dws/dev/dws_04_0706.html @@ -0,0 +1,349 @@ + + +

GS_WLM_SESSION_STATISTICS

+

GS_WLM_SESSION_STATISTICS displays load management information about jobs being executed by the current user on the current CN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WLM_SESSION_STATISTICS columns

Name

+

Type

+

Description

+

datid

+

oid

+

OID of the database this backend is connected to

+

dbname

+

name

+

Name of the database the backend is connected to

+

schemaname

+

text

+

Schema name

+

nodename

+

text

+

Name of the CN where the statement is executed

+

username

+

name

+

User name used for connecting to the backend

+

application_name

+

text

+

Name of the application that is connected to the backend

+

client_addr

+

inet

+

IP address of the client connected to this backend. If this column is null, it indicates either that the client is connected via a Unix socket on the server machine or that this is an internal process such as autovacuum.

+

client_hostname

+

text

+

Host name of the connected client, as reported by a reverse DNS lookup of client_addr. This column will only be non-null for IP connections, and only when log_hostname is enabled.

+

client_port

+

integer

+

TCP port number that the client uses for communication with this backend, or -1 if a Unix socket is used

+

query_band

+

text

+

Job type, which is specified by the GUC parameter query_band parameter. The default value is a null string.

+

pid

+

bigint

+

Process ID of the backend

+

block_time

+

bigint

+

Block time before the statement is executed. The unit is ms.

+

start_time

+

timestamp with time zone

+

Time when the statement starts to be executed

+

duration

+

bigint

+

For how long a statement has been executing. The unit is ms.

+

estimate_total_time

+

bigint

+

Estimated execution time of a statement. The unit is ms.

+

estimate_left_time

+

bigint

+

Estimated remaining time of statement execution. The unit is ms.

+

enqueue

+

text

+

Workload management resource status

+

resource_pool

+

name

+

Resource pool used by the user

+

control_group

+

text

+

Cgroup used by the statement

+

estimate_memory

+

integer

+

Estimated memory used by the statement. The unit is MB.

+

min_peak_memory

+

integer

+

Minimum memory peak of a statement across all DNs. The unit is MB.

+

max_peak_memory

+

integer

+

Maximum memory peak of a statement across all DNs. The unit is MB.

+

average_peak_memory

+

integer

+

Average memory usage during statement execution. The unit is MB.

+

memory_skew_percent

+

integer

+

Memory usage skew of a statement among DNs.

+

spill_info

+

text

+

Statement spill information on all DNs.

+

None indicates that the statement has not been flushed to disks on any DNs.

+

All indicates that the statement has been flushed to disks on every DN.

+

[a:b] indicates that the statement has been flushed to disks on a of b DNs.

+

min_spill_size

+

integer

+

Minimum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

max_spill_size

+

integer

+

Maximum spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

average_spill_size

+

integer

+

Average spilled data among all DNs when a spill occurs. The unit is MB. The default value is 0.

+

spill_skew_percent

+

integer

+

DN spill skew when a spill occurs

+

min_dn_time

+

bigint

+

Minimum execution time of a statement across all DNs. The unit is ms.

+

max_dn_time

+

bigint

+

Maximum execution time of a statement across all DNs. The unit is ms.

+

average_dn_time

+

bigint

+

Average execution time of a statement across all DNs. The unit is ms.

+

dntime_skew_percent

+

bigint

+

Execution time skew of a statement among DNs.

+

min_cpu_time

+

bigint

+

Minimum CPU time of a statement across all DNs. The unit is ms.

+

max_cpu_time

+

bigint

+

Maximum CPU time of a statement across all DNs. The unit is ms.

+

total_cpu_time

+

bigint

+

Total CPU time of a statement across all DNs. The unit is ms.

+

cpu_skew_percent

+

integer

+

CPU time skew of a statement among DNs.

+

min_peak_iops

+

integer

+

Minimum IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

max_peak_iops

+

integer

+

Maximum IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

average_peak_iops

+

integer

+

Average IOPS peak of a statement across all DNs. It is counted by ones in a column-store table and by ten thousands in a row-store table.

+

iops_skew_percent

+

integer

+

I/O skew across DNs.

+

warning

+

text

+

Warning. The following warnings and warnings related to SQL self-diagnosis tuning are displayed:

+
  1. Spill file size large than 256MB
  2. Broadcast size large than 100MB
  3. Early spill
  4. Spill times is greater than 3
  5. Spill on memory adaptive
  6. Hash table conflict
+

queryid

+

bigint

+

Internal query ID used for statement execution

+

query

+

text

+

Statement that is being executed

+

query_plan

+

text

+

Execution plan of a statement

+

node_group

+

text

+

Logical cluster of the user running the statement

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0708.html b/docs/dws/dev/dws_04_0708.html new file mode 100644 index 00000000..30731104 --- /dev/null +++ b/docs/dws/dev/dws_04_0708.html @@ -0,0 +1,11 @@ + + +

GS_WLM_SQL_ALLOW

+

GS_WLM_SQL_ALLOW displays the configured resource management SQL whitelist, including the default SQL whitelist and the SQL whitelist configured using the GUC parameter wlm_sql_allow_list.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0709.html b/docs/dws/dev/dws_04_0709.html new file mode 100644 index 00000000..ccab85d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0709.html @@ -0,0 +1,79 @@ + + +

GS_WORKLOAD_SQL_COUNT

+

GS_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on the current node, including the number of SELECT, UPDATE, INSERT, and DELETE statements and the number of DDL, DML, and DCL statements.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WORKLOAD_SQL_COUNT columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

select_count

+

bigint

+

Number of SELECT statements

+

update_count

+

bigint

+

Number of UPDATE statements

+

insert_count

+

bigint

+

Number of INSERT statements

+

delete_count

+

bigint

+

Number of DELETE statements

+

ddl_count

+

bigint

+

Number of DDL statements

+

dml_count

+

bigint

+

Number of DML statements

+

dcl_count

+

bigint

+

Number of DCL statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0710.html b/docs/dws/dev/dws_04_0710.html new file mode 100644 index 00000000..85692e15 --- /dev/null +++ b/docs/dws/dev/dws_04_0710.html @@ -0,0 +1,142 @@ + + +

GS_WORKLOAD_SQL_ELAPSE_TIME

+

GS_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on the current node, including the maximum, minimum, average, and total response time of SELECT, UPDATE, INSERT, and DELETE statements. The unit is microsecond.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WORKLOAD_SQL_ELAPSE_TIME columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

total_select_elapse

+

bigint

+

Total response time of SELECT statements

+

max_select_elapse

+

bigint

+

Maximum response time of SELECT statements

+

min_select_elapse

+

bigint

+

Minimum response time of SELECT statements

+

avg_select_elapse

+

bigint

+

Average response time of SELECT statements

+

total_update_elapse

+

bigint

+

Total response time of UPDATE statements

+

max_update_elapse

+

bigint

+

Maximum response time of UPDATE statements

+

min_update_elapse

+

bigint

+

Minimum response time of UPDATE statements

+

avg_update_elapse

+

bigint

+

Average response time of UPDATE statements

+

total_insert_elapse

+

bigint

+

Total response time of INSERT statements

+

max_insert_elapse

+

bigint

+

Maximum response time of INSERT statements

+

min_insert_elapse

+

bigint

+

Minimum response time of INSERT statements

+

avg_insert_elapse

+

bigint

+

Average response time of INSERT statements

+

total_delete_elapse

+

bigint

+

Total response time of DELETE statements

+

max_delete_elapse

+

bigint

+

Maximum response time of DELETE statements

+

min_delete_elapse

+

bigint

+

Minimum response time of DELETE statements

+

avg_delete_elapse

+

bigint

+

Average response time of DELETE statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0711.html b/docs/dws/dev/dws_04_0711.html new file mode 100644 index 00000000..37ded879 --- /dev/null +++ b/docs/dws/dev/dws_04_0711.html @@ -0,0 +1,72 @@ + + +

GS_WORKLOAD_TRANSACTION

+

GS_WORKLOAD_TRANSACTION provides transaction information about workload cgroups on a single CN. The database records the number of times that each workload Cgroup commits and rolls back transactions and the response time of transaction commitment and rollback, in microseconds.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_WORKLOAD_TRANSACTION columns

Name

+

Type

+

Description

+

workload

+

name

+

Workload Cgroup name

+

commit_counter

+

bigint

+

Number of the commit times

+

rollback_counter

+

bigint

+

Number of rollbacks

+

resp_min

+

bigint

+

Minimum response time

+

resp_max

+

bigint

+

Maximum response time

+

resp_avg

+

bigint

+

Average response time

+

resp_total

+

bigint

+

Total response time

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0712.html b/docs/dws/dev/dws_04_0712.html new file mode 100644 index 00000000..76f1b107 --- /dev/null +++ b/docs/dws/dev/dws_04_0712.html @@ -0,0 +1,58 @@ + + +

GS_STAT_DB_CU

+

GS_STAT_DB_CU displsys CU hits in a database and in each node in a cluster. You can clear it using gs_stat_reset().

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_STAT_DB_CU columns

Name

+

Type

+

Description

+

node_name1

+

text

+

Node name

+

db_name

+

text

+

Database name

+

mem_hit

+

integer

+

Number of memory hits

+

hdd_sync_read

+

integer

+

Number of hard disk synchronous reads

+

hdd_asyn_read

+

integer

+

Number of hard disk asynchronous reads

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0713.html b/docs/dws/dev/dws_04_0713.html new file mode 100644 index 00000000..3c549906 --- /dev/null +++ b/docs/dws/dev/dws_04_0713.html @@ -0,0 +1,51 @@ + + +

GS_STAT_SESSION_CU

+

GS_STAT_SESSION_CU displays the CU hit rate of running sessions on each node in a cluster. This data about a session is cleared when you exit this session or restart the cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_STAT_SESSION_CU columns

Name

+

Type

+

Description

+

node_name1

+

text

+

Node name

+

mem_hit

+

integer

+

Number of memory hits

+

hdd_sync_read

+

integer

+

Number of hard disk synchronous reads

+

hdd_asyn_read

+

integer

+

Number of hard disk asynchronous reads

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0714.html b/docs/dws/dev/dws_04_0714.html new file mode 100644 index 00000000..24e3db2a --- /dev/null +++ b/docs/dws/dev/dws_04_0714.html @@ -0,0 +1,45 @@ + + +

GS_TOTAL_NODEGROUP_MEMORY_DETAIL

+

GS_TOTAL_NODEGROUP_MEMORY_DETAIL displays statistics about memory usage of the logical cluster that the current database belongs to in the unit of MB.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 GS_TOTAL_NODEGROUP_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

ngname

+

text

+

Name of a logical cluster

+

memorytype

+

text

+

Memory type. Its value can be:

+
  • ng_total_memory: total memory of the logical cluster
  • ng_used_memory: memory usage of the logical cluster
  • ng_estimate_memory: estimated memory usage of the logical cluster
  • ng_foreignrp_memsize: total memory of the external resource pool of the logical cluster
  • ng_foreignrp_memsize: memory usage of the external resource pool of the logical cluster
  • ng_foreignrp_peaksize: peak memory usage of the external resource pool of the logical cluster
  • ng_foreignrp_mempct: percentage of the external resource pool of the logical cluster to the total memory of the logical cluster
  • ng_foreignrp_estmsize: estimated memory usage of the external resource pool of the logical cluster
+

memorymbytes

+

integer

+

Size of allocated memory-typed memory

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0715.html b/docs/dws/dev/dws_04_0715.html new file mode 100644 index 00000000..76a1b80b --- /dev/null +++ b/docs/dws/dev/dws_04_0715.html @@ -0,0 +1,72 @@ + + +

GS_USER_TRANSACTION

+

GS_USER_TRANSACTION provides transaction information about users on a single CN. The database records the number of times that each user commits and rolls back transactions and the response time of transaction commitment and rollback, in microseconds.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_USER_TRANSACTION columns

Name

+

Type

+

Description

+

usename

+

name

+

Username

+

commit_counter

+

bigint

+

Number of the commit times

+

rollback_counter

+

bigint

+

Number of rollbacks

+

resp_min

+

bigint

+

Minimum response time

+

resp_max

+

bigint

+

Maximum response time

+

resp_avg

+

bigint

+

Average response time

+

resp_total

+

bigint

+

Total response time

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0716.html b/docs/dws/dev/dws_04_0716.html new file mode 100644 index 00000000..af96090f --- /dev/null +++ b/docs/dws/dev/dws_04_0716.html @@ -0,0 +1,59 @@ + + +

GS_VIEW_DEPENDENCY

+

GS_VIEW_DEPENDENCY allows you to query the direct dependencies of all views visible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_VIEW_DEPENDENCY columns

Column

+

Type

+

Description

+

objschema

+

name

+

View space name

+

objname

+

name

+

View name

+

refobjschema

+

name

+

Name of the space where the dependent object resides

+

refobjname

+

name

+

Name of a dependent object

+

relobjkind

+

char

+

Type of a dependent object

+
  • r: table
  • v: view
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0717.html b/docs/dws/dev/dws_04_0717.html new file mode 100644 index 00000000..6534f714 --- /dev/null +++ b/docs/dws/dev/dws_04_0717.html @@ -0,0 +1,65 @@ + + +

GS_VIEW_INVALID

+

GS_VIEW_INVALID queries all unavailable views visible to the current user. If the base table, function, or synonym that the view depends on is abnormal, the validtype column of the view is displayed as "invalid".

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_VIEW_INVALID columns

Column

+

Type

+

Description

+

oid

+

oid

+

OID of the view

+

schemaname

+

name

+

View space name

+

viewname

+

name

+

Name of the view

+

viewowner

+

name

+

Owner of the view

+

definition

+

text

+

Definition of the view

+

validtype

+

text

+

View validity flag

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0718.html b/docs/dws/dev/dws_04_0718.html new file mode 100644 index 00000000..146a2b78 --- /dev/null +++ b/docs/dws/dev/dws_04_0718.html @@ -0,0 +1,79 @@ + + +

PG_AVAILABLE_EXTENSION_VERSIONS

+

PG_AVAILABLE_EXTENSION_VERSIONS displays the extension versions of certain database features.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AVAILABLE_EXTENSION_VERSIONS columns

Name

+

Type

+

Description

+

name

+

name

+

Extension name

+

version

+

text

+

Version name

+

installed

+

boolean

+

The value is true if the version of this extension is currently installed.

+

superuser

+

boolean

+

The value is true if only system administrators are allowed to install this extension.

+

relocatable

+

boolean

+

The value is true if an extension can be relocated to another schema.

+

schema

+

name

+

Name of the schema that the extension must be installed into. The value is null if the extension is partially or fully relocatable.

+

requires

+

name[]

+

Names of prerequisite extensions. The value is null if there are no prerequisite extensions.

+

comment

+

text

+

Comment string from the extension's control file

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0719.html b/docs/dws/dev/dws_04_0719.html new file mode 100644 index 00000000..c33fb1d2 --- /dev/null +++ b/docs/dws/dev/dws_04_0719.html @@ -0,0 +1,51 @@ + + +

PG_AVAILABLE_EXTENSIONS

+

PG_AVAILABLE_EXTENSIONS displays the extended information about certain database features.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_AVAILABLE_EXTENSIONS columns

Name

+

Type

+

Description

+

name

+

name

+

Extension name

+

default_version

+

text

+

Name of default version. The value is NULL if none is specified.

+

installed_version

+

text

+

Currently installed version of the extension. The value is NULL if no version is installed.

+

comment

+

text

+

Comment string from the extension's control file

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0720.html b/docs/dws/dev/dws_04_0720.html new file mode 100644 index 00000000..99a3768f --- /dev/null +++ b/docs/dws/dev/dws_04_0720.html @@ -0,0 +1,121 @@ + + +

PG_BULKLOAD_STATISTICS

+

On any normal node in a cluster, PG_BULKLOAD_STATISTICS displays the execution status of the import and export services. Each import or export service corresponds to a record. This view is accessible only to users with system administrators rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_BULKLOAD_STATISTICS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

db_name

+

text

+

Database name

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

tid

+

bigint

+

ID of the current thread

+

lwtid

+

integer

+

Lightweight thread ID

+

session_id

+

bigint

+

GDS session ID

+

direction

+

text

+

Service type. The options are gds to file, gds from file, gds to pipe, gds from pipe, copy from, and copy to.

+

query

+

text

+

Query statement

+

address

+

text

+

Location of the foreign table used for data import and export

+

query_start

+

timestamp with time zone

+

Start time of data import or export

+

total_bytes

+

bigint

+

Total size of data to be processed

+

This parameter is specified only when a GDS common file is to be imported and the record in the row comes from a CN. Otherwise, left this parameter unspecified.

+

phase

+

text

+

Execution phase of the current service import and export. The options are INITIALIZING, TRANSFER_DATA, and RELEASE_RESOURCE.

+

done_lines

+

bigint

+

Number of lines that have been transferred

+

done_bytes

+

bigint

+

Number of bytes that have been transferred

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0721.html b/docs/dws/dev/dws_04_0721.html new file mode 100644 index 00000000..280c24e2 --- /dev/null +++ b/docs/dws/dev/dws_04_0721.html @@ -0,0 +1,86 @@ + + +

PG_COMM_CLIENT_INFO

+

PG_COMM_CLIENT_INFO stores the client connection information of a single node. (You can query this view on a DN to view the information about the connection between the CN and DN.)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COMM_CLIENT_INFO columns

Name

+

Type

+

Description

+

node_name

+

text

+

Current node name.

+

app

+

text

+

Client application name

+

tid

+

bigint

+

Thread ID of the current thread.

+

lwtid

+

integer

+

Lightweight thread ID of the current thread.

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

socket

+

integer

+

It is displayed if the connection is a physical connection.

+

remote_ip

+

text

+

Peer node IP address.

+

remote_port

+

text

+

Peer node port.

+

logic_id

+

integer

+

If the connection is a logical connection, sid is displayed. If -1 is displayed, the current connection is a physical connection.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0722.html b/docs/dws/dev/dws_04_0722.html new file mode 100644 index 00000000..77511557 --- /dev/null +++ b/docs/dws/dev/dws_04_0722.html @@ -0,0 +1,74 @@ + + +

PG_COMM_DELAY

+

PG_COMM_DELAY displays the communication library delay status for a single DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COMM_DELAY columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

remote_name

+

text

+

Name of the peer node

+

remote_host

+

text

+

IP address of the peer

+

stream_num

+

integer

+

Number of logical stream connections used by the current physical connection

+

min_delay

+

integer

+

Minimum delay of the current physical connection within 1 minute. Its unit is microsecond.

+
NOTE:

A negative result is invalid. Wait until the delay status is updated and query again.

+
+

average

+

integer

+

Average delay of the current physical connection within 1 minute. The unit is microsecond.

+

max_delay

+

integer

+

Maximum delay of the current physical connection within 1 minute. The unit is microsecond.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0723.html b/docs/dws/dev/dws_04_0723.html new file mode 100644 index 00000000..a55ad0aa --- /dev/null +++ b/docs/dws/dev/dws_04_0723.html @@ -0,0 +1,114 @@ + + +

PG_COMM_STATUS

+

PG_COMM_STATUS displays the communication library status for a single DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COMM_STATUS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Specifies the node name.

+

rxpck/s

+

integer

+

Receiving rate of the communication library on a node. The unit is byte/s.

+

txpck/s

+

integer

+

Sending rate of the communication library on a node. The unit is byte/s.

+

rxkB/s

+

bigint

+

Receiving rate of the communication library on a node. The unit is KB/s.

+

txkB/s

+

bigint

+

Sending rate of the communication library on a node. The unit is KB/s.

+

buffer

+

bigint

+

Size of the buffer of the Cmailbox.

+

memKB(libcomm)

+

bigint

+

Communication memory size of the libcomm process, in KB.

+

memKB(libpq)

+

bigint

+

Communication memory size of the libpq process, in KB.

+

%USED(PM)

+

integer

+

Real-time usage of the postmaster thread.

+

%USED (sflow)

+

integer

+

Real-time usage of the gs_sender_flow_controller thread.

+

%USED (rflow)

+

integer

+

Real-time usage of the gs_receiver_flow_controller thread.

+

%USED (rloop)

+

integer

+

Highest real-time usage among multiple gs_receivers_loop threads.

+

stream

+

integer

+

Total number of used logical connections.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0724.html b/docs/dws/dev/dws_04_0724.html new file mode 100644 index 00000000..62d9c1d9 --- /dev/null +++ b/docs/dws/dev/dws_04_0724.html @@ -0,0 +1,143 @@ + + +

PG_COMM_RECV_STREAM

+

PG_COMM_RECV_STREAM displays the receiving stream status of all the communication libraries for a single DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COMM_RECV_STREAM columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

local_tid

+

bigint

+

ID of the thread using this stream

+

remote_name

+

text

+

Name of the peer node

+

remote_tid

+

bigint

+

Peer thread ID

+

idx

+

integer

+

Peer DN ID in the local DN

+

sid

+

integer

+

Stream ID in the physical connection

+

tcp_sock

+

integer

+

TCP socket used in the stream

+

state

+

text

+

Current status of the stream

+
  • UNKNOWN: The logical connection is unknown.
  • READY: The logical connection is ready.
  • RUN: The logical connection receives packets normally.
  • HOLD: The logical connection is waiting to receive packets.
  • CLOSED: The logical connection is closed.
  • TO_CLOSED: The logical connection is to be closed.
+

query_id

+

bigint

+

debug_query_id corresponding to the stream

+

pn_id

+

integer

+

plan_node_id of the query executed by the stream

+

send_smp

+

integer

+

smpid of the sender of the query executed by the stream

+

recv_smp

+

integer

+

smpid of the receiver of the query executed by the stream

+

recv_bytes

+

bigint

+

Total data volume received from the stream. The unit is byte.

+

time

+

bigint

+

Current life cycle service duration of the stream. The unit is ms.

+

speed

+

bigint

+

Average receiving rate of the stream. The unit is byte/s.

+

quota

+

bigint

+

Current communication quota value of the stream. The unit is Byte.

+

buff_usize

+

bigint

+

Current size of the data cache of the stream. The unit is byte.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0725.html b/docs/dws/dev/dws_04_0725.html new file mode 100644 index 00000000..7a171fca --- /dev/null +++ b/docs/dws/dev/dws_04_0725.html @@ -0,0 +1,143 @@ + + +

PG_COMM_SEND_STREAM

+

PG_COMM_SEND_STREAM displays the sending stream status of all the communication libraries for a single DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_COMM_SEND_STREAM columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

local_tid

+

bigint

+

ID of the thread using this stream

+

remote_name

+

text

+

Name of the peer node

+

remote_tid

+

bigint

+

Peer thread ID

+

idx

+

integer

+

Peer DN ID in the local DN

+

sid

+

integer

+

Stream ID in the physical connection

+

tcp_sock

+

integer

+

TCP socket used in the stream

+

state

+

text

+

Current status of the stream

+
  • UNKNOWN: The logical connection is unknown.
  • READY: The logical connection is ready.
  • RUN: The logical connection sends packets normally.
  • HOLD: The logical connection is waiting to send packets.
  • CLOSED: The logical connection is closed.
  • TO_CLOSED: The logical connection is to be closed.
+

query_id

+

bigint

+

debug_query_id corresponding to the stream

+

pn_id

+

integer

+

plan_node_id of the query executed by the stream

+

send_smp

+

integer

+

smpid of the sender of the query executed by the stream

+

recv_smp

+

integer

+

smpid of the receiver of the query executed by the stream

+

send_bytes

+

bigint

+

Total data volume sent by the stream. The unit is Byte.

+

time

+

bigint

+

Current life cycle service duration of the stream. The unit is ms.

+

speed

+

bigint

+

Average sending rate of the stream. The unit is Byte/s.

+

quota

+

bigint

+

Current communication quota value of the stream. The unit is Byte.

+

wait_quota

+

bigint

+

Extra time generated when the stream waits the quota value. The unit is ms.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0726.html b/docs/dws/dev/dws_04_0726.html new file mode 100644 index 00000000..a3163188 --- /dev/null +++ b/docs/dws/dev/dws_04_0726.html @@ -0,0 +1,30 @@ + + +

PG_CONTROL_GROUP_CONFIG

+

PG_CONTROL_GROUP_CONFIG displays the Cgroup configuration information in the system.

+ +
+ + + + + + + + + +
Table 1 PG_CONTROL_GROUP_CONFIG columns

Name

+

Type

+

Description

+

pg_control_group_config

+

text

+

Configuration information of the cgroup

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0727.html b/docs/dws/dev/dws_04_0727.html new file mode 100644 index 00000000..4502b5fb --- /dev/null +++ b/docs/dws/dev/dws_04_0727.html @@ -0,0 +1,65 @@ + + +

PG_CURSORS

+

PG_CURSORS displays the cursors that are currently available.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_CURSORS columns

Name

+

Type

+

Description

+

name

+

text

+

Cursor name

+

statement

+

text

+

Query statement when the cursor is declared to change

+

is_holdable

+

boolean

+

Whether the cursor is holdable (that is, it can be accessed after the transaction that declared the cursor has committed). If it is, its value is true.

+

is_binary

+

boolean

+

Whether the cursor was declared BINARY. If it was, its value is true.

+

is_scrollable

+

boolean

+

Whether the cursor is scrollable (that is, it allows rows to be retrieved in a nonsequential manner). If it is, its value is true.

+

creation_time

+

timestamp with time zone

+

Timestamp at which the cursor is declared

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0728.html b/docs/dws/dev/dws_04_0728.html new file mode 100644 index 00000000..b56ac924 --- /dev/null +++ b/docs/dws/dev/dws_04_0728.html @@ -0,0 +1,137 @@ + + +

PG_EXT_STATS

+

PG_EXT_STATS displays extension statistics stored in the PG_STATISTIC_EXT table. The extension statistics means multiple columns of statistics.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_EXT_STATS columns

Name

+

Type

+

Reference

+

Description

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

Name of the schema that contains a table

+

tablename

+

name

+

PG_CLASS.relname

+

Name of a table

+

attname

+

int2vector

+

PG_STATISTIC_EXT.stakey

+

Indicates the columns to be combined for collecting statistics.

+

inherited

+

boolean

+

-

+

Includes inherited sub-columns if the value is true; otherwise, indicates the column in a specified table.

+

null_frac

+

real

+

-

+

Percentage of column combinations that are null to all records

+

avg_width

+

integer

+

-

+

Average width of column combinations. The unit is byte.

+

n_distinct

+

real

+

-

+
  • Estimated number of distinct values in a column combination if the value is greater than 0
  • Negative of the number of distinct values divided by the number of rows if the value is less than 0
+

The negated form is used when ANALYZE believes that the number of distinct values is likely to increase as the table grows.

+

The positive form is used when the column seems to have a fixed number of possible values. For example, -1 indicates that the number of distinct values is the same as the number of rows for a column combination.

+
  • The number of distinct values is unknown if the value is 0.
+

n_dndistinct

+

real

+

-

+

Number of unique not-null data values in the dn1 column combination

+
  • Exact number of distinct values if the value is greater than 0
  • Negative of the number of distinct values divided by the number of rows if the value is less than 0 For example, if a value in a column combination appears twice in average, n_dndistinct equals -0.5.
  • The number of distinct values is unknown if the value is 0.
+

most_common_vals

+

anyarray

+

-

+

List of the most common values in a column combination. If this combination does not have the most common values, most_common_vals_null will be NULL. None of the most common values in most_common_vals is NULL.

+

most_common_freqs

+

real[]

+

-

+

List of the frequencies of the most common values, that is, the number of occurrences of each value divided by the total number of rows. (NULL if most_common_vals is NULL)

+

most_common_vals_null

+

anyarray

+

-

+

List of the most common values in a column combination. If this combination does not have the most common values, most_common_vals_null will be NULL. At least one of the common values in most_common_vals_null is NULL.

+

most_common_freqs_null

+

real[]

+

-

+

List of the frequencies of the most common values, that is, the number of occurrences of each value divided by the total number of rows. (NULL if most_common_vals_null is NULL)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0729.html b/docs/dws/dev/dws_04_0729.html new file mode 100644 index 00000000..b4e3214c --- /dev/null +++ b/docs/dws/dev/dws_04_0729.html @@ -0,0 +1,58 @@ + + +

PG_GET_INVALID_BACKENDS

+

PG_GET_INVALID_BACKENDS displays the information about backend threads on the CN that are connected to the current standby DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_GET_INVALID_BACKENDS columns

Name

+

Type

+

Description

+

pid

+

bigint

+

Thread ID

+

node_name

+

text

+

Node information connected to the backend thread

+

dbname

+

name

+

Name of the connected database

+

backend_start

+

timestamp with time zone

+

Backend thread startup time

+

query

+

text

+

Query statement performed by the backend thread

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0730.html b/docs/dws/dev/dws_04_0730.html new file mode 100644 index 00000000..36fff8c3 --- /dev/null +++ b/docs/dws/dev/dws_04_0730.html @@ -0,0 +1,121 @@ + + +

PG_GET_SENDERS_CATCHUP_TIME

+

PG_GET_SENDERS_CATCHUP_TIME displays the catchup information of the currently active primary/standby instance sending thread on a single DN.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_GET_SENDERS_CATCHUP_TIME columns

Name

+

Type

+

Description

+

pid

+

bigint

+

Current sender thread ID

+

lwpid

+

integer

+

Current sender lwpid

+

local_role

+

text

+

Local role

+

peer_role

+

text

+

Peer role

+

state

+

text

+

Current sender's replication status

+

type

+

text

+

Current sender type

+

catchup_start

+

timestamp with time zone

+

Startup time of a catchup task

+

catchup_end

+

timestamp with time zone

+

End time of a catchup task

+

catchup_type

+

text

+

Catchup task type, full or incremental

+

catchup_bcm_filename

+

text

+

BCM file executed by the current catchup task

+

catchup_bcm_finished

+

integer

+

Number of BCM files completed by a catchup task

+

catchup_bcm_total

+

integer

+

Total number of BCM files to be operated by a catchup task

+

catchup_percent

+

text

+

Completion percentage of a catchup task

+

catchup_remaining_time

+

text

+

Estimated remaining time of a catchup task

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0731.html b/docs/dws/dev/dws_04_0731.html new file mode 100644 index 00000000..ce63d261 --- /dev/null +++ b/docs/dws/dev/dws_04_0731.html @@ -0,0 +1,44 @@ + + +

PG_GROUP

+

PG_GROUP displays the database role authentication and the relationship between roles.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_GROUP columns

Name

+

Type

+

Description

+

groname

+

name

+

Group name

+

grosysid

+

oid

+

Group ID

+

grolist

+

oid[]

+

An array, including all the role IDs in this group

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0732.html b/docs/dws/dev/dws_04_0732.html new file mode 100644 index 00000000..3b9e196e --- /dev/null +++ b/docs/dws/dev/dws_04_0732.html @@ -0,0 +1,70 @@ + + +

PG_INDEXES

+

PG_INDEXES displays access to useful information about each index in the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_INDEXES columns

Name

+

Type

+

Reference

+

Description

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

Name of the schema that contains tables and indexes

+

tablename

+

name

+

PG_CLASS.relname

+

Name of the table for which the index serves

+

indexname

+

name

+

PG_CLASS.relname

+

Index name

+

tablespace

+

name

+

PG_TABLESPACE.spcname

+

Name of the tablespace that contains the index

+

indexdef

+

text

+

-

+

Index definition (a reconstructed CREATE INDEX command)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0733.html b/docs/dws/dev/dws_04_0733.html new file mode 100644 index 00000000..ea436df0 --- /dev/null +++ b/docs/dws/dev/dws_04_0733.html @@ -0,0 +1,146 @@ + + +

PG_JOB

+

The PG_JOB view replaces the PG_JOB system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB system catalog is changed to the PG_JOBS system catalog. For details about PG_JOBS, see PG_JOBS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_JOB columns

Name

+

Type

+

Description

+

job_id

+

bigint

+

Job ID

+

current_postgres_pid

+

bigint

+

If the current job has been executed, the PostgreSQL thread ID of this job is recorded. The default value is -1, indicating that the job has not yet been executed.

+

log_user

+

name

+

User name of the job creator

+

priv_user

+

name

+

User name of the job executor

+

dbname

+

name

+

Name of the database where the job is executed

+

node_name

+

name

+

CN node on which the job will be created and executed

+

job_status

+

text

+

Status of the current job. The value range is r, s, f, or d. The default value is s. The indications are as follows:

+
  • r=running
  • s=successfully finished
  • f=job failed
  • d=disable
+

If a job fails to be executed for 16 consecutive times, job_status is automatically set to d, and no more attempt will be made on this job.

+
NOTE:
  • Note: When you disable a scheduled task (by setting job_queue_processes to 0), the thread monitor the job execution is not started, and the job_status will not be updated. You can ignore the job_status.
  • Only when the scheduled task function is enabled (that is, when job_queue_processes is not 0), the system updates the value of job_status based on the real-time job status.
+
+

start_date

+

timestamp without time zone

+

Start time of the first job execution, precise to millisecond

+

next_run_date

+

timestamp without time zone

+

Scheduled time of the next job execution, accurate to millisecond

+

failure_count

+

smallint

+

Number of times the job has started and failed. If a job fails to be executed for 16 consecutive times, no more attempt will be made on it.

+

interval

+

text

+

Job execution interval

+

last_start_date

+

timestamp without time zone

+

Start time of the last job execution, accurate to millisecond

+

last_end_date

+

timestamp without time zone

+

End time of the last job execution, accurate to millisecond

+

last_suc_date

+

timestamp without time zone

+

Start time of the last successful job execution, accurate to millisecond

+

this_run_date

+

timestamp without time zone

+

Start time of the ongoing job execution, accurate to millisecond

+

nspname

+

name

+

Name of the namespace where a job is running

+

what

+

text

+

Job content

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0734.html b/docs/dws/dev/dws_04_0734.html new file mode 100644 index 00000000..854e3a72 --- /dev/null +++ b/docs/dws/dev/dws_04_0734.html @@ -0,0 +1,37 @@ + + +

PG_JOB_PROC

+

The PG_JOB_PROC view replaces the PG_JOB_PROC system catalog in earlier versions and provides forward compatibility with earlier versions. The original PG_JOB_PROC and PG_JOB system catalogs are merged into the PG_JOBS system catalog in the current version. For details about the PG_JOBS system catalog, see PG_JOBS.

+ +
+ + + + + + + + + + + + + +
Table 1 PG_JOB_PROC columns

Name

+

Type

+

Description

+

job_id

+

bigint

+

Job ID

+

what

+

text

+

Job content

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0735.html b/docs/dws/dev/dws_04_0735.html new file mode 100644 index 00000000..7f426c1d --- /dev/null +++ b/docs/dws/dev/dws_04_0735.html @@ -0,0 +1,146 @@ + + +

PG_JOB_SINGLE

+

PG_JOB_SINGLE displays job information about the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_JOB_SINGLE columns

Name

+

Type

+

Description

+

job_id

+

bigint

+

Job ID

+

current_postgres_pid

+

bigint

+

If the current job has been executed, the PostgreSQL thread ID of this job is recorded. The default value is -1, indicating that the job has not yet been executed.

+

log_user

+

name

+

User name of the job creator

+

priv_user

+

name

+

User name of the job executor

+

dbname

+

name

+

Name of the database where the job is executed

+

node_name

+

name

+

CN node on which the job will be created and executed

+

job_status

+

text

+

Status of the current job. The value range is r, s, f, or d. The default value is s. The indications are as follows:

+
  • r=running
  • s=successfully finished
  • f=job failed
  • d=disable
+

If a job fails to be executed for 16 consecutive times, job_status is automatically set to d, and no more attempt will be made on this job.

+
NOTE:
  • Note: When you disable a scheduled task (by setting job_queue_processes to 0), the thread monitor the job execution is not started, and the job_status will not be updated. You can ignore the job_status.
  • Only when the scheduled task function is enabled (that is, when job_queue_processes is not 0), the system updates the value of job_status based on the real-time job status.
+
+

start_date

+

timestamp without time zone

+

Start time of the first job execution, precise to millisecond

+

next_run_date

+

timestamp without time zone

+

Scheduled time of the next job execution, accurate to millisecond

+

failure_count

+

smallint

+

Number of times the job has started and failed. If a job fails to be executed for 16 consecutive times, no more attempt will be made on it.

+

interval

+

text

+

Job execution interval

+

last_start_date

+

timestamp without time zone

+

Start time of the last job execution, accurate to millisecond

+

last_end_date

+

timestamp without time zone

+

End time of the last job execution, accurate to millisecond

+

last_suc_date

+

timestamp without time zone

+

Start time of the last successful job execution, accurate to millisecond

+

this_run_date

+

timestamp without time zone

+

Start time of the ongoing job execution, accurate to millisecond

+

nspname

+

name

+

Name of the namespace where a job is running

+

what

+

text

+

Job content

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0736.html b/docs/dws/dev/dws_04_0736.html new file mode 100644 index 00000000..c27cb42a --- /dev/null +++ b/docs/dws/dev/dws_04_0736.html @@ -0,0 +1,86 @@ + + +

PG_LIFECYCLE_DATA_DISTRIBUTE

+

PG_LIFECYCLE_DATA_DISTRIBUTE displays the distribution of cold and hot data in a multi-temperature table of OBS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_LIFECYCLE_DATA_DISTRIBUTE columns

Name

+

Type

+

Description

+

schemaname

+

name

+

Schema name

+

tablename

+

name

+

Current table name

+

nodename

+

name

+

Node name

+

hotpartition

+

text

+

Hot partition on the DN

+

coldpartition

+

text

+

Cold partition on the DN

+

switchablepartition

+

text

+

Switchable partition on the DN

+

hotdatasize

+

text

+

Data size of the hot partition on the DN

+

colddatasize

+

text

+

Data size of the cold partition on the DN

+

switchabledatasize

+

text

+

Data size of the switchable partition on the DN

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0737.html b/docs/dws/dev/dws_04_0737.html new file mode 100644 index 00000000..e9a0eac4 --- /dev/null +++ b/docs/dws/dev/dws_04_0737.html @@ -0,0 +1,162 @@ + + +

PG_LOCKS

+

PG_LOCKS displays information about the locks held by open transactions.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_LOCKS columns

Name

+

Type

+

Reference

+

Description

+

locktype

+

text

+

-

+

Type of the locked object: relation, extend, page, tuple, transactionid, virtualxid, object, userlock, and advisory

+

database

+

oid

+

PG_DATABASE.oid

+

OID of the database in which the locked target exists

+
  • The OID is 0 if the target is a shared object.
  • The OID is NULL if the locked target is a transaction.
+

relation

+

oid

+

PG_CLASS.oid

+

OID of the relationship targeted by the lock. The value is NULL if the object is neither a relationship nor part of a relationship.

+

page

+

integer

+

-

+

Page number targeted by the lock within the relationship. If the object is neither a relation page nor row page, the value is NULL.

+

tuple

+

smallint

+

-

+

Row number targeted by the lock within the page. If the object is not a row, the value is NULL.

+

virtualxid

+

text

+

-

+

Virtual ID of the transaction targeted by the lock. If the object is not a virtual transaction ID, the value is NULL.

+

transactionid

+

xid

+

-

+

ID of the transaction targeted by the lock. If the object is not a transaction ID, the value is NULL.

+

classid

+

oid

+

PG_CLASS.oid

+

OID of the system table that contains the object. If the object is not a general database object, the value is NULL.

+

objid

+

oid

+

-

+

OID of the lock target within its system table. If the target is not a general database object, the value is NULL.

+

objsubid

+

smallint

+

-

+

Column number for a column in the table. The value is 0 if the target is some other object type. If the object is not a general database object, the value is NULL.

+

virtualtransaction

+

text

+

-

+

Virtual ID of the transaction holding or awaiting this lock

+

pid

+

bigint

+

-

+

Logical ID of the server thread holding or awaiting this lock. This is NULL if the lock is held by a prepared transaction.

+

mode

+

text

+

-

+

Lock mode held or desired by this thread For more information about lock modes, see "LOCK" in GaussDB(DWS) SQL Syntax Reference.

+

+

granted

+

boolean

+

-

+
  • The value is true if the lock is a held lock.
  • The value is false if the lock is an awaited lock.
+

fastpath

+

boolean

+

-

+

Whether the lock is obtained through fast-path (true) or main lock table (false)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0738.html b/docs/dws/dev/dws_04_0738.html new file mode 100644 index 00000000..140d43a8 --- /dev/null +++ b/docs/dws/dev/dws_04_0738.html @@ -0,0 +1,72 @@ + + +

PG_NODE_ENV

+

PG_NODE_ENVO displays the environmental variable information about the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_NODE_ENV columns

Name

+

Type

+

Description

+

node_name

+

text

+

Name of the current node

+

host

+

text

+

Host name of the current node

+

process

+

integer

+

Process ID of the current node

+

port

+

integer

+

Port ID of the current node

+

installpath

+

text

+

Installation directory of current node

+

datapath

+

text

+

Data directory of the current node

+

log_directory

+

text

+

Log directory of the current node

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0739.html b/docs/dws/dev/dws_04_0739.html new file mode 100644 index 00000000..4267ee72 --- /dev/null +++ b/docs/dws/dev/dws_04_0739.html @@ -0,0 +1,58 @@ + + +

PG_OS_THREADS

+

PG_OS_THREADS displays the status information about all the threads under the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_OS_THREADS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Name of the current node

+

pid

+

bigint

+

Thread number running under the current node process

+

lwpid

+

integer

+

Lightweight thread ID corresponding to the PID

+

thread_name

+

text

+

Thread name corresponding to the PID

+

creation_time

+

timestamp with time zone

+

Thread creation time corresponding to the PID

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0740.html b/docs/dws/dev/dws_04_0740.html new file mode 100644 index 00000000..7546f7a8 --- /dev/null +++ b/docs/dws/dev/dws_04_0740.html @@ -0,0 +1,87 @@ + + +

PG_POOLER_STATUS

+

PG_POOLER_STATUS displays the cache connection status in the pooler. PG_POOLER_STATUS can only query on the CN, and displays the connection cache information about the pooler module.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_POOLER_STATUS columns

Name

+

Type

+

Description

+

database

+

text

+

Database name

+

user_name

+

text

+

User name

+

tid

+

bigint

+

ID of a thread connected to the CN

+

node_oid

+

bigint

+

OID of the node connected

+

node_name

+

name

+

Name of the node connected

+

in_use

+

boolean

+

Whether the connection is in use

+
  • t (true): indicates that the connection is in use.
  • f (false): indicates that the connection is not in use.
+

fdsock

+

bigint

+

Peer socket.

+

remote_pid

+

bigint

+

Peer thread ID.

+

session_params

+

text

+

GUC session parameter delivered by the connection.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0741.html b/docs/dws/dev/dws_04_0741.html new file mode 100644 index 00000000..96c85da7 --- /dev/null +++ b/docs/dws/dev/dws_04_0741.html @@ -0,0 +1,59 @@ + + +

PG_PREPARED_STATEMENTS

+

PG_PREPARED_STATEMENTS displays all prepared statements that are available in the current session.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_PREPARED_STATEMENTS columns

Name

+

Type

+

Description

+

name

+

text

+

Identifier of the prepared statement

+

statement

+

text

+

Query string for creating this prepared statement For prepared statements created through SQL, this is the PREPARE statement submitted by the client. For prepared statements created through the frontend/backend protocol, this is the text of the prepared statement itself.

+

prepare_time

+

timestamp with time zone

+

Timestamp when the prepared statement is created

+

parameter_types

+

regtype[]

+

Expected parameter types for the prepared statement in the form of an array of regtype. The OID corresponding to an element of this array can be obtained by casting the regtype value to oid.

+

from_sql

+

boolean

+

How a prepared statement was created

+
  • true: The prepared statement was created through the PREPARE statement.
  • false The statement was prepared through the frontend/backend protocol.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0742.html b/docs/dws/dev/dws_04_0742.html new file mode 100644 index 00000000..17ff4930 --- /dev/null +++ b/docs/dws/dev/dws_04_0742.html @@ -0,0 +1,70 @@ + + +

PG_PREPARED_XACTS

+

PG_PREPARED_XACTS displays information about transactions that are currently prepared for two-phase commit.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_PREPARED_XACTS columns

Name

+

Type

+

Reference

+

Description

+

transaction

+

xid

+

-

+

Numeric transaction identifier of the prepared transaction

+

gid

+

text

+

-

+

Global transaction identifier that was assigned to the transaction

+

prepared

+

timestamp with time zone

+

-

+

Time at which the transaction is prepared for commit

+

owner

+

name

+

PG_AUTHID.rolname

+

Name of the user that executes the transaction

+

database

+

name

+

PG_DATABASE.datname

+

Name of the database in which the transaction is executed

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0743.html b/docs/dws/dev/dws_04_0743.html new file mode 100644 index 00000000..b617c779 --- /dev/null +++ b/docs/dws/dev/dws_04_0743.html @@ -0,0 +1,58 @@ + + +

PG_QUERYBAND_ACTION

+

PG_QUERYBAND_ACTION displays information about the object associated with query_band and the query_band query order.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_QUERYBAND_ACTION columns

Name

+

Type

+

Description

+

qband

+

text

+

query_band key-value pairs

+

respool_id

+

oid

+

OID of the resource pool associated with query_band

+

respool

+

text

+

Name of the resource pool associated with query_band

+

priority

+

text

+

Intra-queue priority associated with query_band

+

qborder

+

integer

+

query_band query order

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0744.html b/docs/dws/dev/dws_04_0744.html new file mode 100644 index 00000000..493b7a39 --- /dev/null +++ b/docs/dws/dev/dws_04_0744.html @@ -0,0 +1,93 @@ + + +

PG_REPLICATION_SLOTS

+

PG_REPLICATION_SLOTS displays the replication node information.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_REPLICATION_SLOTS columns

Name

+

Type

+

Description

+

slot_name

+

text

+

Name of a replication node

+

plugin

+

name

+

Name of the output plug-in of the logical replication slot

+

slot_type

+

text

+

Type of a replication node

+

datoid

+

oid

+

OID of the database on the replication node

+

database

+

name

+

Name of the database on the replication node

+

active

+

boolean

+

Whether the replication node is active

+

xmin

+

xid

+

Transaction ID of the replication node

+

catalog_xmin

+

text

+

ID of the earliest-decoded transaction corresponding to the logical replication slot

+

restart_lsn

+

text

+

Xlog file information on the replication node

+

dummy_standby

+

boolean

+

Whether the replication node is the dummy standby node

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0745.html b/docs/dws/dev/dws_04_0745.html new file mode 100644 index 00000000..166e93c2 --- /dev/null +++ b/docs/dws/dev/dws_04_0745.html @@ -0,0 +1,232 @@ + + +

PG_ROLES

+

PG_ROLES displays information about database roles.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_ROLES columns

Name

+

Type

+

Reference

+

Description

+

rolname

+

name

+

-

+

Role name

+

rolsuper

+

boolean

+

-

+

Whether the role is the initial system administrator with the highest permission

+

rolinherit

+

boolean

+

-

+

Whether the role inherits permissions for this type of roles

+

rolcreaterole

+

boolean

+

-

+

Whether the role can create other roles

+

rolcreatedb

+

boolean

+

-

+

Whether the role can create databases

+

rolcatupdate

+

boolean

+

-

+

Whether the role can update system tables directly. Only the initial system administrator whose usesysid is 10 has this permission. It is not available for other users.

+

rolcanlogin

+

boolean

+

-

+

Whether the role can log in to the database

+

rolreplication

+

boolean

+

-

+

Whether the role can be replicated

+

rolauditadmin

+

boolean

+

-

+

Whether the role is an audit system administrator

+

rolsystemadmin

+

boolean

+

-

+

Whether the role is a system administrator

+

rolconnlimit

+

integer

+

-

+

Sets the maximum number of concurrent connections this role can make if this role can log in. -1 indicates no limit.

+

rolpassword

+

text

+

-

+

Not the password (always reads as ********)

+

rolvalidbegin

+

timestamp with time zone

+

-

+

Account validity start time; null if no start time

+

rolvaliduntil

+

timestamp with time zone

+

-

+

Password expiry time; null if no expiration

+

rolrespool

+

name

+

-

+

Resource pool that a user can use

+

rolparentid

+

oid

+

PG_AUTHID.rolparentid

+

OID of a group user to which the user belongs

+

roltabspace

+

text

+

-

+

The storage space of the user permanent table.

+

roltempspace

+

text

+

-

+

The storage space of the user temporary table.

+

rolspillspace

+

text

+

-

+

The operator disk flushing space of the user.

+

rolconfig

+

text[]

+

-

+

Session defaults for runtime configuration variables

+

oid

+

oid

+

PG_AUTHID.oid

+

ID of the role

+

roluseft

+

boolean

+

PG_AUTHID.roluseft

+

Whether the role can perform operations on foreign tables

+

nodegroup

+

name

+

-

+

Name of the logical cluster associated with the role. If no logical cluster is associated, this column is left empty.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0746.html b/docs/dws/dev/dws_04_0746.html new file mode 100644 index 00000000..e10f5448 --- /dev/null +++ b/docs/dws/dev/dws_04_0746.html @@ -0,0 +1,51 @@ + + +

PG_RULES

+

PG_RULES displays information about rewrite rules.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_RULES columns

Name

+

Type

+

Description

+

schemaname

+

name

+

Name of the schema that contains the table

+

tablename

+

name

+

Name of the table the rule is for

+

rulename

+

name

+

Rule name

+

definition

+

text

+

Rule definition (a reconstructed creation command)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0747.html b/docs/dws/dev/dws_04_0747.html new file mode 100644 index 00000000..9e4b2d96 --- /dev/null +++ b/docs/dws/dev/dws_04_0747.html @@ -0,0 +1,93 @@ + + +

PG_RUNNING_XACTS

+

PG_RUNNING_XACTS displays the running transaction information on the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_RUNNING_XACTS columns

Name

+

Type

+

Description

+

handle

+

integer

+

Handle corresponding to the transaction in GTM

+

gxid

+

xid

+

Transaction ID

+

state

+

tinyint

+

Transaction status (3: prepared; 0: starting)

+

node

+

text

+

Node name

+

xmin

+

xid

+

Minimum transaction ID xmin on the node

+

vacuum

+

boolean

+

Whether the current transaction is lazy vacuum

+

timeline

+

bigint

+

Number of database restarts

+

prepare_xid

+

xid

+

Transaction ID in the prepared status. If the status is not prepared, the value is 0.

+

pid

+

bigint

+

Thread ID corresponding to the transaction

+

next_xid

+

xid

+

Transaction ID sent from a CN to a DN

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0748.html b/docs/dws/dev/dws_04_0748.html new file mode 100644 index 00000000..9cb3414d --- /dev/null +++ b/docs/dws/dev/dws_04_0748.html @@ -0,0 +1,97 @@ + + +

PG_SECLABELS

+

PG_SECLABELS displays information about security labels.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SECLABEL columns

Name

+

Type

+

Reference

+

Description

+

objoid

+

oid

+

Any OID column

+

OID of the object this security label pertains to

+

classoid

+

oid

+

PG_CLASS.oid

+

OID of the system table that contains the object

+

objsubid

+

integer

+

-

+

For a security label on a table column, this is the column number (the objoid and classoid refer to the table itself). For all other object types, this column is 0.

+

objtype

+

text

+

-

+

Type of the object to which this label applies

+

objnamespace

+

oid

+

PG_NAMESPACE.oid

+

OID of the namespace for this object, if applicable; otherwise NULL.

+

objname

+

text

+

-

+

Name of the object to which the label applies

+

provider

+

text

+

PG_SECLABEL.provider

+

Label provider associated with this label

+

label

+

text

+

PG_SECLABEL.label

+

Security label applied to this object

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0749.html b/docs/dws/dev/dws_04_0749.html new file mode 100644 index 00000000..e1b68a5d --- /dev/null +++ b/docs/dws/dev/dws_04_0749.html @@ -0,0 +1,196 @@ + + +

PG_SESSION_WLMSTAT

+

PG_SESSION_WLMSTAT displays the corresponding load management information about the task currently executed by the user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SESSION_WLMSTAT columns

Column

+

Type

+

Description

+

datid

+

oid

+

OID of the database this backend is connected to

+

datname

+

name

+

Name of the database the backend is connected to

+

threadid

+

bigint

+

ID of the backend thread

+

processid

+

integer

+

Thread PID of the backend

+

usesysid

+

oid

+

OID of the user who logged into the backend

+

appname

+

text

+

Name of the application that is connected to the backend

+

usename

+

name

+

Name of the user logged in to the backend

+

priority

+

bigint

+

Priority of Cgroup where the statement is located

+

attribute

+

text

+

Statement attributes

+
  • Ordinary: default attribute of a statement before it is parsed by the database
+
  • Simple: simple statements
  • Complicated: complicated statements
  • Internal: internal statement of the database
+

block_time

+

bigint

+

Pending duration of the statements by now (unit: s)

+

elapsed_time

+

bigint

+

Actual execution duration of the statements by now (unit: s)

+

total_cpu_time

+

bigint

+

Total CPU usage duration of the statement on the DN in the last period (unit: s)

+

cpu_skew_percent

+

integer

+

CPU usage inclination ratio of the statement on the DN in the last period

+

statement_mem

+

integer

+

Estimated memory required for statement execution. This column is reserved.

+

active_points

+

integer

+

Number of concurrently active points occupied by the statement in the resource pool

+

dop_value

+

integer

+

DOP value obtained by the statement from the resource pool

+

control_group

+

text

+

Cgroup currently used by the statement

+

status

+

text

+

Status of a statement, including:

+
  • pending
  • running
  • finished (If enqueue is set to StoredProc or Transaction, this state indicates that only a part of jobs in the statement have been executed. This state persists until the finish of this statement.)
  • aborted: terminated unexpectedly
  • active: normal status except for those above
  • unknown: unknown status
+

enqueue

+

text

+

Current queuing status of the statements, including:

+
  • Global: queuing in the global queue
  • Respool: queuing in the resource pool queue
  • CentralQueue: queuing on the CCN
  • Transaction: being in a transaction block
  • StoredProc: being in a stored procedure
  • None: not in a queue
  • Forced None: being forcibly executed (transaction block statement or stored procedure statement are) because the statement waiting time exceeds the specified value
+

resource_pool

+

name

+

Current resource pool where the statements are located.

+

query

+

text

+

Text of this backend's most recent query If state is active, this column shows the executing query. In all other states, it shows the last query that was executed.

+

isplana

+

bool

+

In logical cluster mode, indicates whether a statement occupies the resources of other logical clusters. The default value is f (does not occupy).

+

node_group

+

text

+

Logical cluster of the user running the statement

+

lane

+

text

+

Fast or slow lane for statement queries.

+
  • fast: fast lane
  • slow: slow lane
  • none: not controlled
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0750.html b/docs/dws/dev/dws_04_0750.html new file mode 100644 index 00000000..2b9dac16 --- /dev/null +++ b/docs/dws/dev/dws_04_0750.html @@ -0,0 +1,87 @@ + + +

PG_SESSION_IOSTAT

+

PG_SESSION_IOSTAT displays the I/O load management information about the task currently executed by the user.

+

IOPS is counted by ones for column storage and by thousands for row storage.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SESSION_IOSTAT columns

Name

+

Type

+

Description

+

query_id

+

bigint

+

Job ID

+

mincurriops

+

integer

+

Minimum I/O of the current job across DNs

+

maxcurriops

+

integer

+

Maximum I/O of the current job across DNs

+

minpeakiops

+

integer

+

Minimum peak I/O of the current job across DNs

+

maxpeakiops

+

integer

+

Maximum peak I/O of the current job across DNs

+

io_limits

+

integer

+

io_limits set for the job

+

io_priority

+

text

+

io_priority set for the job

+

query

+

text

+

Job

+

node_group

+

text

+

Logical cluster of the user running the job

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0751.html b/docs/dws/dev/dws_04_0751.html new file mode 100644 index 00000000..7ee63d89 --- /dev/null +++ b/docs/dws/dev/dws_04_0751.html @@ -0,0 +1,135 @@ + + +

PG_SETTINGS

+

PG_SETTINGS displays information about parameters of the running database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SETTINGS columns

Name

+

Type

+

Description

+

name

+

text

+

Parameter name

+

setting

+

text

+

Current value of the parameter

+

unit

+

text

+

Implicit unit of the parameter

+

category

+

text

+

Logical group of the parameter

+

short_desc

+

text

+

Brief description of the parameter

+

extra_desc

+

text

+

Detailed description of the parameter

+

context

+

text

+

Context of parameter values including internal, backend, superuser, and user

+

vartype

+

text

+

Parameter type. It can be bool, enum, integer, real, or string.

+

source

+

text

+

Method of assigning the parameter value

+

min_val

+

text

+

Minimum value of the parameter. If the parameter type is not numeric data, the value of this column is null.

+

max_val

+

text

+

Maximum value of the parameter. If the parameter type is not numeric data, the value of this column is null.

+

enumvals

+

text[]

+

Valid values of an enum-typed parameter. If the parameter type is not enum, the value of this column is null.

+

boot_val

+

text

+

Default parameter value used upon the database startup

+

reset_val

+

text

+

Default parameter value used upon the database reset

+

sourcefile

+

text

+

Configuration file used to set parameter values. If parameter values are not configured using the configuration file, the value of this column is null.

+

sourceline

+

integer

+

Row number of the configuration file for setting parameter values. If parameter values are not configured using the configuration file, the value of this column is null.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0752.html b/docs/dws/dev/dws_04_0752.html new file mode 100644 index 00000000..37cb0694 --- /dev/null +++ b/docs/dws/dev/dws_04_0752.html @@ -0,0 +1,161 @@ + + +

PG_SHADOW

+

PG_SHADOW displays properties of all roles that are marked as rolcanlogin in PG_AUTHID.

+

The name stems from the fact that this table should not be readable by the public since it contains passwords. PG_USER is a publicly readable view on PG_SHADOW that blanks out the password column.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SHADOW columns

Name

+

Type

+

Reference

+

Description

+

usename

+

name

+

PG_AUTHID.rolname

+

User name

+

usesysid

+

oid

+

PG_AUTHID.oid

+

ID of a user

+

usecreatedb

+

boolean

+

-

+

Indicates that the user can create databases.

+

usesuper

+

boolean

+

-

+

Indicates that the user is an administrator.

+

usecatupd

+

boolean

+

-

+

Indicates that the user can update system catalogs. Even the system administrator cannot do this unless this column is true.

+

userepl

+

boolean

+

-

+

User can initiate streaming replication and put the system in and out of backup mode.

+

passwd

+

text

+

-

+

Password (possibly encrypted); null if none. See PG_AUTHID for details about how encrypted passwords are stored.

+

valbegin

+

timestamp with time zone

+

-

+

Account validity start time; null if no start time

+

valuntil

+

timestamp with time zone

+

-

+

Password expiry time; null if no expiration

+

respool

+

name

+

-

+

Resource pool used by the user

+

parent

+

oid

+

-

+

Parent resource pool

+

spacelimit

+

text

+

-

+

The storage space of the permanent table.

+

tempspacelimit

+

text

+

-

+

The storage space of the temporary table.

+

spillspacelimit

+

text

+

-

+

The operator disk flushing space.

+

useconfig

+

text[ ]

+

-

+

Session defaults for runtime configuration variables

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0753.html b/docs/dws/dev/dws_04_0753.html new file mode 100644 index 00000000..173307d9 --- /dev/null +++ b/docs/dws/dev/dws_04_0753.html @@ -0,0 +1,65 @@ + + +

PG_SHARED_MEMORY_DETAIL

+

PG_SHARED_MEMORY_DETAIL displays usage information about all the shared memory contexts.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_SHARED_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

contextname

+

text

+

Name of the context in the memory

+

level

+

smallint

+

Hierarchy of the memory context

+

parent

+

text

+

Context of the parent memory

+

totalsize

+

bigint

+

Total size of the shared memory, in bytes

+

freesize

+

bigint

+

Remaining size of the shared memory, in bytes

+

usedsize

+

bigint

+

Used size of the shared memory, in bytes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0754.html b/docs/dws/dev/dws_04_0754.html new file mode 100644 index 00000000..5de680df --- /dev/null +++ b/docs/dws/dev/dws_04_0754.html @@ -0,0 +1,163 @@ + + +

PG_STATS

+

PG_STATS displays the single-column statistics stored in the pg_statistic table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATS columns

Name

+

Type

+

Reference

+

Description

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

Name of the schema that contains the table

+

tablename

+

name

+

PG_CLASS.relname

+

Name of the table

+

attname

+

name

+

PG_ATTRIBUTE.attname

+

Column name

+

inherited

+

boolean

+

-

+

Includes inherited sub-columns if the value is true; otherwise, indicates the column in a specified table.

+

null_frac

+

real

+

-

+

Percentage of column entries that are null

+

avg_width

+

integer

+

-

+

Average width in bytes of column's entries

+

n_distinct

+

real

+

-

+
  • Estimated number of distinct values in the column if the value is greater than 0
  • Negative of the number of distinct values divided by the number of rows if the value is less than 0
+

The negated form is used when ANALYZE believes that the number of distinct values is likely to increase as the table grows.

+

The positive form is used when the column seems to have a fixed number of possible values. For example, -1 indicates a unique column in which the number of distinct values is the same as the number of rows.

+

n_dndistinct

+

real

+

-

+

Number of unique non-null data values in the dn1 column

+
  • Exact number of distinct values if the value is greater than 0
  • Negative of the number of distinct values divided by the number of rows if the value is less than 0 (For example, if the value of a column appears twice in average, set n_dndistinct=-0.5.)
  • The number of distinct values is unknown if the value is 0.
+

most_common_vals

+

anyarray

+

-

+

List of the most common values in a column. If this combination does not have the most common values, it will be NULL.

+

most_common_freqs

+

real[]

+

-

+

List of the frequencies of the most common values, that is, the number of occurrences of each value divided by the total number of rows. (NULL if most_common_vals is NULL)

+

histogram_bounds

+

anyarray

+

-

+

List of values that divide the column's values into groups of equal proportion. The values in most_common_vals, if present, are omitted from this histogram calculation. This field is null if the field data type does not have a < operator or if the most_common_vals list accounts for the entire population.

+

correlation

+

real

+

-

+

Statistical correlation between physical row ordering and logical ordering of the column values. It ranges from -1 to +1. When the value is near to -1 or +1, an index scan on the column is estimated to be cheaper than when it is near to zero, due to reduction of random access to the disk. This column is null if the column data type does not have a < operator.

+

most_common_elems

+

anyarray

+

-

+

Specifies a list of non-null element values most often appearing.

+

most_common_elem_freqs

+

real[]

+

-

+

Specifies a list of the frequencies of the most common element values.

+

elem_count_histogram

+

real[]

+

-

+

Specifies a histogram of the counts of distinct non-null element values.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0755.html b/docs/dws/dev/dws_04_0755.html new file mode 100644 index 00000000..3610206e --- /dev/null +++ b/docs/dws/dev/dws_04_0755.html @@ -0,0 +1,177 @@ + + +

PG_STAT_ACTIVITY

+

PG_STAT_ACTIVITY displays information about the current user's queries.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_ACTIVITY columns

Name

+

Type

+

Description

+

datid

+

oid

+

OID of the database that the user session connects to in the backend

+

datname

+

name

+

Name of the database that the user session connects to in the backend

+

pid

+

bigint

+

Process ID of the backend

+

usesysid

+

oid

+

OID of the user logging in to the backend

+

usename

+

name

+

OID of the user logging in to the backend

+

application_name

+

text

+

Name of the application connected to the backend

+

client_addr

+

inet

+

IP address of the client connected to the backend If this column is null, it indicates either that the client is connected via a Unix socket on the server machine or that this is an internal process such as autovacuum.

+

client_hostname

+

text

+

Host name of the connected client, as reported by a reverse DNS lookup of client_addr. This column will only be non-null for IP connections, and only when log_hostname is enabled.

+

client_port

+

integer

+

TCP port number that the client uses for communication with this backend, or -1 if a Unix socket is used

+

backend_start

+

timestamp with time zone

+

Startup time of the backend process, that is, the time when the client connects to the server.

+

xact_start

+

timestamp with time zone

+

Time when the current transaction was started, or NULL if no transaction is active. If the current query is the first of its transaction, this column is equal to the query_start column.

+

query_start

+

timestamp with time zone

+

Time when the currently active query was started, or if state is not active, when the last query was started

+

state_change

+

timestamp with time zone

+

Time for the last status change

+

waiting

+

boolean

+

Whether the backend is currently waiting on a lock. If it is, its value is true.

+

enqueue

+

text

+

Queuing status of a statement. Its value can be:

+
  • waiting in queue: The statement is in the queue.
  • waiting in global queue: The statement is in the global queue.
  • waiting in respool queue: The statement is in the resource pool queue.
  • waiting in ccn queue: The job is in the CCN queue.
  • Empty: The statement is running.
+

state

+

text

+

Current overall state of this backend. Its value can be:

+
  • active: The backend is executing queries.
  • idle: The backend is waiting for new client commands.
  • idle in transaction: The backend is in a transaction, but there is no statement being executed in the transaction.
  • idle in transaction (aborted): The backend is in a transaction, but there are statements failed in the transaction.
  • fastpath function call: The backend is executing a fast-path function.
  • disabled: This state is reported if track_activities is disabled in this backend.
+
NOTE:

Common users can view only their own session status. The state information of other accounts is empty. For example, after user judy is connected to the database, the state information of user joe and the initial user omm in pg_stat_activity is empty.

+
SELECT datname, usename, usesysid, state,pid FROM pg_stat_activity;
+
 datname  | usename | usesysid | state  |       pid
+----------+---------+----------+--------+-----------------
+ gaussdb |  dbadmin    |       10 |        | 139968752121616
+ gaussdb | dbadmin     |       10 |        | 139968903116560
+ db_tpcds | judy    |    16398 | active | 139968391403280
+ gaussdb | dbadmin     |       10 |        | 139968643069712
+ gaussdb | dbadmin     |       10 |        | 139968680818448
+ gaussdb | joe     |    16390 |        | 139968563377936
+(6 rows)
+
+

resource_pool

+

name

+

Resource pool used by the user

+

query_id

+

bigint

+

ID of a query

+

query

+

text

+

Text of this backend's most recent query If state is active, this column shows the executing query. In all other states, it shows the last query that was executed.

+

connection_info

+

text

+

A string in JSON format recording the driver type, driver version, driver deployment path, and process owner of the connected database (for details, see connection_info)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0757.html b/docs/dws/dev/dws_04_0757.html new file mode 100644 index 00000000..715570ff --- /dev/null +++ b/docs/dws/dev/dws_04_0757.html @@ -0,0 +1,80 @@ + + +

PG_STAT_ALL_INDEXES

+

PG_STAT_ALL_INDEXES displays access informaton about all indexes in the database, with information about each index displayed in a row.

+

Indexes can be used via either simple index scans or "bitmap" index scans. In a bitmap scan the output of several indexes can be combined via AND or OR rules, so it is difficult to associate individual heap row fetches with specific indexes when a bitmap scan is used. Therefore, a bitmap scan increments the pg_stat_all_indexes.idx_tup_read count(s) for the index(es) it uses, and it increments the pg_stat_all_tables.idx_tup_fetch count for the table, but it does not affect pg_stat_all_indexes.idx_tup_fetch.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_ALL_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

OID of the table for this index

+

indexrelid

+

oid

+

OID of this index

+

schemaname

+

name

+

Name of the schema this index is in

+

relname

+

name

+

Name of the table for this index

+

indexrelname

+

name

+

Name of this index

+

idx_scan

+

bigint

+

Number of index scans initiated on this index

+

idx_tup_read

+

bigint

+

Number of index entries returned by scans on this index

+

idx_tup_fetch

+

bigint

+

Number of live table rows fetched by simple index scans using this index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0758.html b/docs/dws/dev/dws_04_0758.html new file mode 100644 index 00000000..72862ed1 --- /dev/null +++ b/docs/dws/dev/dws_04_0758.html @@ -0,0 +1,177 @@ + + +

PG_STAT_ALL_TABLES

+

PG_STAT_ALL_TABLES displays access information about all rows in all tables (including TOAST tables) in the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_ALL_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Name of the table

+

seq_scan

+

bigint

+

Number of sequential scans started on the table

+

seq_tup_read

+

bigint

+

Number of rows that have live data fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans

+

idx_tup_fetch

+

bigint

+

Number of rows that have live data fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows updated by HOT (no separate index update is required)

+

n_live_tup

+

bigint

+

Estimated number of live rows

+

n_dead_tup

+

bigint

+

Estimated number of dead rows

+

last_vacuum

+

timestamp with time zone

+

Last time at which this table was manually vacuumed (excluding VACUUM FULL)

+

last_autovacuum

+

timestamp with time zone

+

Last time at which this table was automatically vacuumed

+

last_analyze

+

timestamp with time zone

+

Last time at which this table was analyzed

+

last_autoanalyze

+

timestamp with time zone

+

Last time at which this table was automatically vacuumed

+

vacuum_count

+

bigint

+

Number of vacuum operations (excluding VACUUM FULL)

+

autovacuum_count

+

bigint

+

Number of autovacuum operations

+

analyze_count

+

bigint

+

Number of analyze operations

+

autoanalyze_count

+

bigint

+

Number of autoanalyze operations

+

last_data_changed

+

timestamp with time zone

+

Last time at which this table was updated (by INSERT/UPDATE/DELETE or EXCHANGE/TRUNCATE/DROP partition). This column is recorded only on the local CN.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0759.html b/docs/dws/dev/dws_04_0759.html new file mode 100644 index 00000000..4d4bb639 --- /dev/null +++ b/docs/dws/dev/dws_04_0759.html @@ -0,0 +1,79 @@ + + +

PG_STAT_BAD_BLOCK

+

PG_STAT_BAD_BLOCK displays statistics about page or CU verification failures after a node is started.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_BAD_BLOCK columns

Name

+

Type

+

Description

+

nodename

+

text

+

Node name

+

databaseid

+

integer

+

Database OID

+

tablespaceid

+

integer

+

Tablespace OID

+

relfilenode

+

integer

+

File object ID

+

forknum

+

integer

+

File type

+

error_count

+

integer

+

Number of verification failures

+

first_time

+

timestamp with time zone

+

Time of the first occurrence

+

last_time

+

timestamp with time zone

+

Time of the latest occurrence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0760.html b/docs/dws/dev/dws_04_0760.html new file mode 100644 index 00000000..c925b1ae --- /dev/null +++ b/docs/dws/dev/dws_04_0760.html @@ -0,0 +1,100 @@ + + +

PG_STAT_BGWRITER

+

PG_STAT_BGWRITER displays statistics about the background writer process's activity.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_BGWRITER columns

Name

+

Type

+

Description

+

checkpoints_timed

+

bigint

+

Number of scheduled checkpoints that have been performed

+

checkpoints_req

+

bigint

+

Number of requested checkpoints that have been performed

+

checkpoint_write_time

+

double precision

+

Total amount of time that has been spent in the portion of checkpoint processing where files are written to disk, in milliseconds

+

checkpoint_sync_time

+

double precision

+

Total amount of time that has been spent in the portion of checkpoint processing where files are synchronized to disk, in milliseconds

+

buffers_checkpoint

+

bigint

+

Number of buffers written during checkpoints

+

buffers_clean

+

bigint

+

Number of buffers written by the background writer

+

maxwritten_clean

+

bigint

+

Number of times the background writer stopped a cleaning scan because it had written too many buffers

+

buffers_backend

+

bigint

+

Number of buffers written directly by a backend

+

buffers_backend_fsync

+

bigint

+

Number of times that a backend has to execute fsync

+

buffers_alloc

+

bigint

+

Number of buffers allocated

+

stats_reset

+

timestamp with time zone

+

Time at which these statistics were reset

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0761.html b/docs/dws/dev/dws_04_0761.html new file mode 100644 index 00000000..d48a5f5a --- /dev/null +++ b/docs/dws/dev/dws_04_0761.html @@ -0,0 +1,156 @@ + + +

PG_STAT_DATABASE

+

PG_STAT_DATABASE displays the status and statistics of each database on the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_DATABASE columns

Name

+

Type

+

Description

+

datid

+

oid

+

Database OID

+

datname

+

name

+

Database name

+

numbackends

+

integer

+

Number of backends currently connected to this database on the current node. This is the only column in this view that reflects the current state value. All columns return the accumulated value since the last reset.

+

xact_commit

+

bigint

+

Number of transactions in this database that have been committed on the current node

+

xact_rollback

+

bigint

+

Number of transactions in this database that have been rolled back on the current node

+

blks_read

+

bigint

+

Number of disk blocks read in this database on the current node

+

blks_hit

+

bigint

+

Number of disk blocks found in the buffer cache on the current node, that is, the number of blocks hit in the cache. (This only includes hits in the GaussDB(DWS) buffer cache, not in the file system cache.)

+

tup_returned

+

bigint

+

Number of rows returned by queries in this database on the current node

+

tup_fetched

+

bigint

+

Number of rows fetched by queries in this database on the current node

+

tup_inserted

+

bigint

+

Number of rows inserted in this database on the current node

+

tup_updated

+

bigint

+

Number of rows updated in this database on the current node

+

tup_deleted

+

bigint

+

Number of rows deleted from this database on the current node

+

conflicts

+

bigint

+

Number of queries canceled due to database recovery conflicts on the current node (conflicts occurring only on the standby server). For details, see PG_STAT_DATABASE_CONFLICTS.

+

temp_files

+

bigint

+

Number of temporary files created by this database on the current node. All temporary files are counted, regardless of why the temporary file was created (for example, sorting or hashing), and regardless of the log_temp_files setting.

+

temp_bytes

+

bigint

+

Size of temporary files written to this database on the current node. All temporary files are counted, regardless of why the temporary file was created, and regardless of the log_temp_files setting.

+

deadlocks

+

bigint

+

Number of deadlocks in this database on the current node

+

blk_read_time

+

double precision

+

Time spent reading data file blocks by backends in this database on the current node, in milliseconds

+

blk_write_time

+

double precision

+

Time spent writing into data file blocks by backends in this database on the current node, in milliseconds

+

stats_reset

+

timestamp with time zone

+

Time when the database statistics are reset on the current node

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0762.html b/docs/dws/dev/dws_04_0762.html new file mode 100644 index 00000000..d7fe28ff --- /dev/null +++ b/docs/dws/dev/dws_04_0762.html @@ -0,0 +1,72 @@ + + +

PG_STAT_DATABASE_CONFLICTS

+

PG_STAT_DATABASE_CONFLICTS displays statistics about database conflicts.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_DATABASE_CONFLICTS columns

Name

+

Type

+

Description

+

datid

+

oid

+

Database OID

+

datname

+

name

+

Database name

+

confl_tablespace

+

bigint

+

Number of conflicting tablespaces

+

confl_lock

+

bigint

+

Number of conflicting locks

+

confl_snapshot

+

bigint

+

Number conflicting snapshots

+

confl_bufferpin

+

bigint

+

Number of conflicting buffers

+

confl_deadlock

+

bigint

+

Number of conflicting deadlocks

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0763.html b/docs/dws/dev/dws_04_0763.html new file mode 100644 index 00000000..c0fc4df2 --- /dev/null +++ b/docs/dws/dev/dws_04_0763.html @@ -0,0 +1,80 @@ + + +

PG_STAT_GET_MEM_MBYTES_RESERVED

+

PG_STAT_GET_MEM_MBYTES_RESERVED displays the current activity information of a thread stored in memory. You need to specify the thread ID (pid in PG_STAT_ACTIVITY) for query. If the thread ID is set to 0, the current thread ID is used. For example:

+
1
SELECT pg_stat_get_mem_mbytes_reserved(0);
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_GET_MEM_MBYTES_RESERVED columns

Parameter

+

Description

+

ConnectInfo

+

Connection information

+

ParctlManager

+

Concurrency management information

+

GeneralParams

+

Basic parameter information

+

GeneralParams RPDATA

+

Basic resource pool information

+

ExceptionManager

+

Exception management information

+

CollectInfo

+

Collection information

+

GeneralInfo

+

Basic information

+

ParctlState

+

Concurrency status information

+

CPU INFO

+

CPU information

+

ControlGroup

+

Cgroup information

+

IOSTATE

+

I/O status information

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0764.html b/docs/dws/dev/dws_04_0764.html new file mode 100644 index 00000000..5a1cab2d --- /dev/null +++ b/docs/dws/dev/dws_04_0764.html @@ -0,0 +1,65 @@ + + +

PG_STAT_USER_FUNCTIONS

+

PG_STAT_USER_FUNCTIONS displays user-defined function status information in the namespace. (The language of the function is non-internal language.)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_USER_FUNCTIONS columns

Name

+

Type

+

Description

+

funcid

+

oid

+

Function OID

+

schemaname

+

name

+

Schema name

+

funcname

+

name

+

Function name

+

calls

+

bigint

+

Number of times this function has been called

+

total_time

+

double precision

+

Total time spent in this function and all other functions called by it

+

self_time

+

double precision

+

Total time spent in this function itself, excluding other functions called by it

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0765.html b/docs/dws/dev/dws_04_0765.html new file mode 100644 index 00000000..f260adf2 --- /dev/null +++ b/docs/dws/dev/dws_04_0765.html @@ -0,0 +1,79 @@ + + +

PG_STAT_USER_INDEXES

+

PG_STAT_USER_INDEXES displays information about the index status of user-defined ordinary tables and TOAST tables.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_USER_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID for the index

+

indexrelid

+

oid

+

Index OID

+

schemaname

+

name

+

Schema name for the index

+

relname

+

name

+

Table name for the index

+

indexrelname

+

name

+

Index name

+

idx_scan

+

bigint

+

Number of index scans

+

idx_tup_read

+

bigint

+

Number of index entries returned by scans on this index

+

idx_tup_fetch

+

bigint

+

Number of rows that have live data fetched by index scans

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0766.html b/docs/dws/dev/dws_04_0766.html new file mode 100644 index 00000000..fd41abd3 --- /dev/null +++ b/docs/dws/dev/dws_04_0766.html @@ -0,0 +1,170 @@ + + +

PG_STAT_USER_TABLES

+

PG_STAT_USER_TABLES displays status information about user-defined ordinary tables and TOAST tables in all namespaces.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_USER_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

seq_scan

+

bigint

+

Number of sequential scans started on the table. Data in this column is valid only for non-system catalogs on the local CN.

+

seq_tup_read

+

bigint

+

Number of rows that have live data fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans

+

idx_tup_fetch

+

bigint

+

Number of rows that have live data fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows updated by HOT (no separate index update is required)

+

n_live_tup

+

bigint

+

Estimated number of live rows

+

n_dead_tup

+

bigint

+

Estimated number of dead rows

+

last_vacuum

+

timestamp with time zone

+

Last time at which this table was manually vacuumed (excluding VACUUM FULL)

+

last_autovacuum

+

timestamp with time zone

+

Last time at which this table was automatically vacuumed

+

last_analyze

+

timestamp with time zone

+

Last time at which this table was analyzed

+

last_autoanalyze

+

timestamp with time zone

+

Last time at which this table was automatically analyzed

+

vacuum_count

+

bigint

+

Number of vacuum operations (excluding VACUUM FULL)

+

autovacuum_count

+

bigint

+

Number of autovacuum operations

+

analyze_count

+

bigint

+

Number of analyze operations

+

autoanalyze_count

+

bigint

+

Number of autoanalyze operations

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0767.html b/docs/dws/dev/dws_04_0767.html new file mode 100644 index 00000000..cd93900d --- /dev/null +++ b/docs/dws/dev/dws_04_0767.html @@ -0,0 +1,128 @@ + + +

PG_STAT_REPLICATION

+

PG_STAT_REPLICATION displays information about log synchronization status, such as the locations of the sender sending logs and the receiver receiving logs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_REPLICATION columns

Name

+

Type

+

Description

+

pid

+

bigint

+

PID of the thread

+

usesysid

+

oid

+

User system ID

+

usename

+

name

+

Username

+

application_name

+

text

+

Application name

+

client_addr

+

inet

+

Client address

+

client_hostname

+

text

+

Client name

+

client_port

+

integer

+

Client port number

+

backend_start

+

timestamp with time zone

+

Start time of the program

+

state

+

text

+

Log replication state (catch-up or consistent streaming)

+

sender_sent_location

+

text

+

Location where the sender sends logs

+

receiver_write_location

+

text

+

Location where the receiver writes logs

+

receiver_flush_location

+

text

+

Location where the receiver flushes logs

+

receiver_replay_location

+

text

+

Location where the receiver replays logs

+

sync_priority

+

integer

+

Priority of synchronous duplication (0 indicates asynchronization)

+

sync_state

+

text

+

Synchronization state (asynchronous duplication, synchronous duplication, or potential synchronization)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0768.html b/docs/dws/dev/dws_04_0768.html new file mode 100644 index 00000000..09a5d43b --- /dev/null +++ b/docs/dws/dev/dws_04_0768.html @@ -0,0 +1,79 @@ + + +

PG_STAT_SYS_INDEXES

+

PG_STAT_SYS_INDEXES displays the index status information about all the system catalogs in the pg_catalog and information_schema schemas.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_SYS_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID for the index

+

indexrelid

+

oid

+

Index OID

+

schemaname

+

name

+

Schema name for the index

+

relname

+

name

+

Table name for the index

+

indexrelname

+

name

+

Index name

+

idx_scan

+

bigint

+

Number of index scans

+

idx_tup_read

+

bigint

+

Number of index entries returned by scans on this index

+

idx_tup_fetch

+

bigint

+

Number of rows that have live data fetched by index scans

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0769.html b/docs/dws/dev/dws_04_0769.html new file mode 100644 index 00000000..3fbe8b3e --- /dev/null +++ b/docs/dws/dev/dws_04_0769.html @@ -0,0 +1,170 @@ + + +

PG_STAT_SYS_TABLES

+

PG_STAT_SYS_TABLES displays the statistics about the system catalogs of all the namespaces in pg_catalog and information_schema schemas.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_SYS_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

seq_scan

+

bigint

+

Number of sequential scans started on the table

+

seq_tup_read

+

bigint

+

Number of rows that have live data fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans

+

idx_tup_fetch

+

bigint

+

Number of rows that have live data fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows HOT updated (that is, with no separate index update required)

+

n_live_tup

+

bigint

+

Estimated number of live rows

+

n_dead_tup

+

bigint

+

Estimated number of dead rows

+

last_vacuum

+

timestamp with time zone

+

Last time at which this table was manually vacuumed (excluding VACUUM FULL)

+

last_autovacuum

+

timestamp with time zone

+

Last time at which this table was automatically vacuumed

+

last_analyze

+

timestamp with time zone

+

Last time at which this table was analyzed

+

last_autoanalyze

+

timestamp with time zone

+

Last time at which this table was automatically analyzed

+

vacuum_count

+

bigint

+

Number of vacuum operations (excluding VACUUM FULL)

+

autovacuum_count

+

bigint

+

Number of autovacuum operations

+

analyze_count

+

bigint

+

Number of analyze operations

+

autoanalyze_count

+

bigint

+

Number of autoanalyze operations

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0770.html b/docs/dws/dev/dws_04_0770.html new file mode 100644 index 00000000..8b0aff26 --- /dev/null +++ b/docs/dws/dev/dws_04_0770.html @@ -0,0 +1,100 @@ + + +

PG_STAT_XACT_ALL_TABLES

+

PG_STAT_XACT_ALL_TABLES displays the transaction status information about all ordinary tables and TOAST tables in the namespaces.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_XACT_ALL_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

seq_scan

+

bigint

+

Number of sequential scans started on the table

+

seq_tup_read

+

bigint

+

Number of live rows fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans started on the table

+

idx_tup_fetch

+

bigint

+

Number of live rows fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows HOT updated (that is, with no separate index update required)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0771.html b/docs/dws/dev/dws_04_0771.html new file mode 100644 index 00000000..8b18ae84 --- /dev/null +++ b/docs/dws/dev/dws_04_0771.html @@ -0,0 +1,100 @@ + + +

PG_STAT_XACT_SYS_TABLES

+

PG_STAT_XACT_SYS_TABLES displays the transaction status information of the system catalog in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_XACT_SYS_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

seq_scan

+

bigint

+

Number of sequential scans started on the table

+

seq_tup_read

+

bigint

+

Number of live rows fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans started on the table

+

idx_tup_fetch

+

bigint

+

Number of live rows fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows HOT updated (that is, with no separate index update required)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0772.html b/docs/dws/dev/dws_04_0772.html new file mode 100644 index 00000000..88409a11 --- /dev/null +++ b/docs/dws/dev/dws_04_0772.html @@ -0,0 +1,65 @@ + + +

PG_STAT_XACT_USER_FUNCTIONS

+

PG_STAT_XACT_USER_FUNCTIONS displays statistics about function executions, with statistics about each execution displayed in a row.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_XACT_USER_FUNCTIONS columns

Name

+

Type

+

Description

+

funcid

+

oid

+

Function OID

+

schemaname

+

name

+

Schema name

+

funcname

+

name

+

Function name

+

calls

+

bigint

+

Number of times this function has been called

+

total_time

+

double precision

+

Total time spent in this function and all other functions called by it

+

self_time

+

double precision

+

Total time spent in this function itself, excluding other functions called by it

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0773.html b/docs/dws/dev/dws_04_0773.html new file mode 100644 index 00000000..5c66362f --- /dev/null +++ b/docs/dws/dev/dws_04_0773.html @@ -0,0 +1,100 @@ + + +

PG_STAT_XACT_USER_TABLES

+

PG_STAT_XACT_USER_TABLES displays the transaction status information of the user table in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STAT_XACT_USER_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

seq_scan

+

bigint

+

Number of sequential scans started on the table

+

seq_tup_read

+

bigint

+

Number of live rows fetched by sequential scans

+

idx_scan

+

bigint

+

Number of index scans started on the table

+

idx_tup_fetch

+

bigint

+

Number of live rows fetched by index scans

+

n_tup_ins

+

bigint

+

Number of rows inserted

+

n_tup_upd

+

bigint

+

Number of rows updated

+

n_tup_del

+

bigint

+

Number of rows deleted

+

n_tup_hot_upd

+

bigint

+

Number of rows HOT updated (that is, with no separate index update required)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0774.html b/docs/dws/dev/dws_04_0774.html new file mode 100644 index 00000000..a88cb864 --- /dev/null +++ b/docs/dws/dev/dws_04_0774.html @@ -0,0 +1,72 @@ + + +

PG_STATIO_ALL_INDEXES

+

PG_STATIO_ALL_INDEXES contains each row of each index in the current database, showing I/O statistics about accesses to that specific index.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_ALL_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID for the index

+

indexrelid

+

oid

+

Index OID

+

schemaname

+

name

+

Schema name for the index

+

relname

+

name

+

Table name for the index

+

indexrelname

+

name

+

Index name

+

idx_blks_read

+

bigint

+

Number of disk blocks read from this index

+

idx_blks_hit

+

bigint

+

Number of buffer hits in this index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0775.html b/docs/dws/dev/dws_04_0775.html new file mode 100644 index 00000000..4c892a52 --- /dev/null +++ b/docs/dws/dev/dws_04_0775.html @@ -0,0 +1,58 @@ + + +

PG_STATIO_ALL_SEQUENCES

+

PG_STATIO_ALL_SEQUENCES contains each row of each sequence in the current database, showing I/O statistics about accesses to that specific sequence.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_ALL_SEQUENCES columns

Name

+

Type

+

Description

+

relid

+

oid

+

OID of this sequence

+

schemaname

+

name

+

Name of the schema this sequence is in

+

relname

+

name

+

Name of the sequence

+

blks_read

+

bigint

+

Number of disk blocks read from this sequence

+

blks_hit

+

bigint

+

Number of buffer hits in this sequence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0776.html b/docs/dws/dev/dws_04_0776.html new file mode 100644 index 00000000..07079c6c --- /dev/null +++ b/docs/dws/dev/dws_04_0776.html @@ -0,0 +1,100 @@ + + +

PG_STATIO_ALL_TABLES

+

PG_STATIO_ALL_TABLES contains one row for each table in the current database (including TOAST tables), showing I/O statistics about accesses to that specific table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_ALL_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

heap_blks_read

+

bigint

+

Number of disk blocks read from this table

+

heap_blks_hit

+

bigint

+

Number of buffer hits in this table

+

idx_blks_read

+

bigint

+

Number of disk blocks read from the index in this table

+

idx_blks_hit

+

bigint

+

Number of buffer hits in all indexes on this table

+

toast_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table (if any) in this table

+

toast_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table (if any) in this table

+

tidx_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table index (if any) in this table

+

tidx_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table index (if any) in this table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0777.html b/docs/dws/dev/dws_04_0777.html new file mode 100644 index 00000000..082f6593 --- /dev/null +++ b/docs/dws/dev/dws_04_0777.html @@ -0,0 +1,72 @@ + + +

PG_STATIO_SYS_INDEXES

+

PG_STATIO_SYS_INDEXES displays the I/O status information about all system catalog indexes in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_SYS_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID for the index

+

indexrelid

+

oid

+

Index OID

+

schemaname

+

name

+

Schema name for the index

+

relname

+

name

+

Table name for the index

+

indexrelname

+

name

+

Index name

+

idx_blks_read

+

bigint

+

Number of disk blocks read from this index

+

idx_blks_hit

+

bigint

+

Number of buffer hits in this index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0778.html b/docs/dws/dev/dws_04_0778.html new file mode 100644 index 00000000..3655a95c --- /dev/null +++ b/docs/dws/dev/dws_04_0778.html @@ -0,0 +1,58 @@ + + +

PG_STATIO_SYS_SEQUENCES

+

PG_STATIO_SYS_SEQUENCES displays the I/O status information about all the system sequences in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_SYS_SEQUENCES columns

Name

+

Type

+

Description

+

relid

+

oid

+

OID of this sequence

+

schemaname

+

name

+

Name of the schema this sequence is in

+

relname

+

name

+

Name of the sequence

+

blks_read

+

bigint

+

Number of disk blocks read from this sequence

+

blks_hit

+

bigint

+

Number of buffer hits in this sequence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0779.html b/docs/dws/dev/dws_04_0779.html new file mode 100644 index 00000000..b9806a51 --- /dev/null +++ b/docs/dws/dev/dws_04_0779.html @@ -0,0 +1,100 @@ + + +

PG_STATIO_SYS_TABLES

+

PG_STATIO_SYS_TABLES displays the I/O status information about all the system catalogs in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_SYS_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

heap_blks_read

+

bigint

+

Number of disk blocks read from this table

+

heap_blks_hit

+

bigint

+

Number of buffer hits in this table

+

idx_blks_read

+

bigint

+

Number of disk blocks read from all indexes in this table

+

idx_blks_hit

+

bigint

+

Number of buffer hits in all indexes on this table

+

toast_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table (if any) in this table

+

toast_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table (if any) in this table

+

tidx_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table index (if any) in this table

+

tidx_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table index (if any) in this table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0780.html b/docs/dws/dev/dws_04_0780.html new file mode 100644 index 00000000..b9fba8d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0780.html @@ -0,0 +1,73 @@ + + +

PG_STATIO_USER_INDEXES

+

PG_STATIO_USER_INDEXES displays the I/O status information about all the user relationship table indexes in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_USER_INDEXES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID for the index

+

indexrelid

+

oid

+

Index OID

+

schemaname

+

name

+

Schema name for the index

+

relname

+

name

+

Table name for the index

+

indexrelname

+

name

+

Index name

+

idx_blks_read

+

bigint

+

Number of disk blocks read from this index

+

idx_blks_hit

+

bigint

+

Number of buffer hits in this index

+
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0781.html b/docs/dws/dev/dws_04_0781.html new file mode 100644 index 00000000..1f90087b --- /dev/null +++ b/docs/dws/dev/dws_04_0781.html @@ -0,0 +1,58 @@ + + +

PG_STATIO_USER_SEQUENCES

+

PG_STATIO_USER_SEQUENCES displays the I/O status information about all the user relation table sequences in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_USER_SEQUENCES columns

Name

+

Type

+

Description

+

relid

+

oid

+

OID of this sequence

+

schemaname

+

name

+

Name of the schema this sequence is in

+

relname

+

name

+

Name of this sequence

+

blks_read

+

bigint

+

Number of disk blocks read from this sequence

+

blks_hit

+

bigint

+

Number of cache hits in this sequence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0782.html b/docs/dws/dev/dws_04_0782.html new file mode 100644 index 00000000..be7843c0 --- /dev/null +++ b/docs/dws/dev/dws_04_0782.html @@ -0,0 +1,100 @@ + + +

PG_STATIO_USER_TABLES

+

PG_STATIO_USER_TABLES displays the I/O status information about all the user relation tables in the namespace.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_STATIO_USER_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

schemaname

+

name

+

Schema name of the table

+

relname

+

name

+

Table name

+

heap_blks_read

+

bigint

+

Number of disk blocks read from this table

+

heap_blks_hit

+

bigint

+

Number of buffer hits in this table

+

idx_blks_read

+

bigint

+

Number of disk blocks read from the index in this table

+

idx_blks_hit

+

bigint

+

Number of buffer hits in all indexes on this table

+

toast_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table (if any) in this table

+

toast_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table (if any) in this table

+

tidx_blks_read

+

bigint

+

Number of disk blocks read from the TOAST table index (if any) in this table

+

tidx_blks_hit

+

bigint

+

Number of buffer hits in the TOAST table index (if any) in this table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0783.html b/docs/dws/dev/dws_04_0783.html new file mode 100644 index 00000000..9cf31bf5 --- /dev/null +++ b/docs/dws/dev/dws_04_0783.html @@ -0,0 +1,1074 @@ + + +

PG_THREAD_WAIT_STATUS

+

PG_THREAD_WAIT_STATUS allows you to test the block waiting status about the backend thread and auxiliary thread of the current instance.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_THREAD_WAIT_STATUS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Current node name

+

db_name

+

text

+

Database name

+

thread_name

+

text

+

Thread name

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

tid

+

bigint

+

Thread ID of the current thread

+

lwtid

+

integer

+

Lightweight thread ID of the current thread

+

ptid

+

integer

+

Parent thread of the streaming thread

+

tlevel

+

integer

+

Level of the streaming thread

+

smpid

+

integer

+

Concurrent thread ID

+

wait_status

+

text

+

Waiting status of the current thread. For details about the waiting status, see Table 2.

+

wait_event

+

text

+

If wait_status is acquire lock, acquire lwlock, or wait io, this column describes the lock, lightweight lock, and I/O information, respectively. If wait_status is not any of the three values, this column is empty.

+
+
+

The waiting statuses in the wait_status column are as follows:

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Waiting status list

Value

+

Description

+

none

+

Waiting for no event

+

acquire lock

+

Waiting for locking until the locking succeeds or times out

+

acquire lwlock

+

Waiting for a lightweight lock

+

wait io

+

Waiting for I/O completion

+

wait cmd

+

Waiting for network communication packet read to complete

+

wait pooler get conn

+

Waiting for pooler to obtain the connection

+

wait pooler abort conn

+

Waiting for pooler to terminate the connection

+

wait pooler clean conn

+

Waiting for pooler to clear connections

+

pooler create conn: [nodename], total N

+

Waiting for the pooler to set up a connection. The connection is being established with the node specified by nodename, and there are N connections waiting to be set up.

+

get conn

+

Obtaining the connection to other nodes

+

set cmd: [nodename]

+

Waiting for running the SET, RESET, TRANSACTION BLOCK LEVEL PARA SET, or SESSION LEVEL PARA SET statement on the connection. The statement is being executed on the node specified by nodename.

+

cancel query

+

Canceling the SQL statement that is being executed through the connection

+

stop query

+

Stopping the query that is being executed through the connection

+

wait node: [nodename](plevel), total N, [phase]

+

Waiting for receiving the data from a connected node. The thread is waiting for the data from the plevel thread of the node specified by nodename. The data of N connections is waiting to be returned. If phase is included, the possible phases are as follows:

+
  • begin: The transaction is being started.
  • commit: The transaction is being committed.
  • rollback: The transaction is being rolled back.
+

wait transaction sync: xid

+

Waiting for synchronizing the transaction specified by xid

+

wait wal sync

+

Waiting for the completion of wal log of synchronization from the specified LSN to the standby instance

+

wait data sync

+

Waiting for the completion of data page synchronization to the standby instance

+

wait data sync queue

+

Waiting for putting the data pages that are in the row storage or the CU in the column storage into the synchronization queue

+

flush data: [nodename](plevel), [phase]

+

Waiting for sending data to the plevel thread of the node specified by nodename. If phase is included, the possible phase is wait quota, indicating that the current communication flow is waiting for the quota value.

+

stream get conn: [nodename], total N

+

Waiting for connecting to the consumer object of the node specified by nodename when the stream flow is initialized. There are N consumers waiting to be connected.

+

wait producer ready: [nodename](plevel), total N

+

Waiting for each producer to be ready when the stream flow is initialized. The thread is waiting for the procedure of the plevel thread on the nodename node to be ready. There are N producers waiting to be ready.

+

synchronize quit

+

Waiting for the threads in the stream thread group to quit when the steam plan ends

+

nodegroup destroy

+

Waiting for destroying the stream node group when the steam plan ends

+

wait active statement

+

Waiting for job execution under resource and load control.

+

wait global queue

+

Waiting for job execution. The job is queuing in the global queue.

+

wait respool queue

+

Waiting for job execution. The job is queuing in the resource pool.

+

wait ccn queue

+

Waiting for job execution. The job is queuing on the central coordinator node (CCN).

+

gtm connect

+

Waiting for connecting to GTM.

+

gtm get gxid

+

Wait for obtaining xids from GTM.

+

gtm get snapshot

+

Wait for obtaining transaction snapshots from GTM.

+

gtm begin trans

+

Waiting for GTM to start a transaction.

+

gtm commit trans

+

Waiting for GTM to commit a transaction.

+

gtm rollback trans

+

Waiting for GTM to roll back a transaction.

+

gtm create sequence

+

Waiting for GTM to create a sequence.

+

gtm alter sequence

+

Waiting for GTM to modify a sequence.

+

gtm get sequence val

+

Waiting for obtaining the next value of a sequence from GTM.

+

gtm set sequence val

+

Waiting for GTM to set a sequence value.

+

gtm drop sequence

+

Waiting for GTM to delete a sequence.

+

gtm rename sequece

+

Waiting for GTM to rename a sequence.

+

analyze: [relname], [phase]

+

The thread is doing ANALYZE to the relname table. If phase is included, the possible phase is autovacuum, indicating that the database automatically enables the AutoVacuum thread to execute ANALYZE.

+

vacuum: [relname], [phase]

+

The thread is doing VACUUM to the relname table. If phase is included, the possible phase is autovacuum, indicating that the database automatically enables the AutoVacuum thread to execute VACUUM.

+

vacuum full: [relname]

+

The thread is doing VACUUM FULL to the relname table.

+

create index

+

An index is being created.

+

HashJoin - [ build hash | write file ]

+

The HashJoin operator is being executed. In this phase, you need to pay attention to the execution time-consuming.

+
  • build hash: The HashJoin operator is creating a hash table.
  • write file: The HashJoin operator is writing data to disks.
+

HashAgg - [ build hash | write file ]

+

The HashAgg operator is being executed. In this phase, you need to pay attention to the execution time-consuming.

+
  • build hash: The HashAgg operator is creating a hash table.
  • write file: The HashAgg operator is writing data to disks.
+

HashSetop - [build hash | write file ]

+

The HashSetop operator is being executed. In this phase, you need to pay attention to the execution time-consuming.

+
  • build hash: The HashSetop operator is creating a hash table.
  • write file: The HashSetop operator is writing data to disks.
+

Sort | Sort - write file

+

The Sort operator is being executed. write file indicates that the Sort operator is writing data to disks.

+

Material | Material - write file

+

The Material operator is being executed. write file indicates that the Material operator is writing data to disks.

+

wait sync consumer next step

+

The consumer (receive end) synchronously waits for the next iteration.

+

wait sync producer next step

+

The producer (transmit end) synchronously waits for the next iteration.

+
+
+

If wait_status is acquire lwlock, acquire lock, or wait io, there is an event performing I/O operations or waiting for obtaining the corresponding lightweight lock or transaction lock.

+

The following table describes the corresponding wait events when wait_status is acquire lwlock. (If wait_event is extension, the lightweight lock is dynamically allocated and is not monitored.)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3 List of wait events corresponding to lightweight locks

wait_event

+

Description

+

ShmemIndexLock

+

Used to protect the primary index table, a hash table, in shared memory

+

OidGenLock

+

Used to prevent different threads from generating the same OID

+

XidGenLock

+

Used to prevent two transactions from obtaining the same XID

+

ProcArrayLock

+

Used to prevent concurrent access to or concurrent modification on the ProcArray shared array

+

SInvalReadLock

+

Used to prevent concurrent execution with invalid message deletion

+

SInvalWriteLock

+

Used to prevent concurrent execution with invalid message write and deletion

+

WALInsertLock

+

Used to prevent concurrent execution with WAL insertion

+

WALWriteLock

+

Used to prevent concurrent write from a WAL buffer to a disk

+

ControlFileLock

+

Used to prevent concurrent read/write or concurrent write/write on the pg_control file

+

CheckpointLock

+

Used to prevent multi-checkpoint concurrent execution

+

CLogControlLock

+

Used to prevent concurrent access to or concurrent modification on the Clog control data structure

+

MultiXactGenLock

+

Used to allocate a unique MultiXact ID in serial mode

+

MultiXactOffsetControlLock

+

Used to prevent concurrent read/write or concurrent write/write on pg_multixact/offset

+

MultiXactMemberControlLock

+

Used to prevent concurrent read/write or concurrent write/write on pg_multixact/members

+

RelCacheInitLock

+

Used to add a lock before any operations are performed on the init file when messages are invalid

+

CheckpointerCommLock

+

Used to send file flush requests to a checkpointer. The request structure needs to be inserted to a request queue in serial mode.

+

TwoPhaseStateLock

+

Used to prevent concurrent access to or modification on two-phase information sharing arrays

+

TablespaceCreateLock

+

Used to check whether a tablespace already exists

+

BtreeVacuumLock

+

Used to prevent VACUUM from clearing pages that are being used by B-tree indexes

+

AutovacuumLock

+

Used to access the autovacuum worker array in serial mode

+

AutovacuumScheduleLock

+

Used to distribute tables requiring VACUUM in serial mode

+

SyncScanLock

+

Used to determine the start position of a relfilenode during heap scanning

+

NodeTableLock

+

Used to protect a shared structure that stores CN and DN information

+

PoolerLock

+

Used to prevent two threads from simultaneously obtaining the same connection from a connection pool

+

RelationMappingLock

+

Used to wait for the mapping file between system catalogs and storage locations to be updated

+

AsyncCtlLock

+

Used to prevent concurrent access to or concurrent modification on the sharing notification status

+

AsyncQueueLock

+

Used to prevent concurrent access to or concurrent modification on the sharing notification queue

+

SerializableXactHashLock

+

Used to prevent concurrent read/write or concurrent write/write on a sharing structure for serializable transactions

+

SerializableFinishedListLock

+

Used to prevent concurrent read/write or concurrent write/write on a shared linked list for completed serial transactions

+

SerializablePredicateLockListLock

+

Used to protect a linked list of serializable transactions that have locks

+

OldSerXidLock

+

Used to protect a structure that records serializable transactions that have conflicts

+

FileStatLock

+

Used to protect a data structure that stores statistics file information

+

SyncRepLock

+

Used to protect Xlog synchronization information during primary-standby replication

+

DataSyncRepLock

+

Used to protect data page synchronization information during primary-standby replication

+

CStoreColspaceCacheLock

+

Used to add a lock when CU space is allocated for a column-store table

+

CStoreCUCacheSweepLock

+

Used to add a lock when CU caches used by a column-store table are cyclically washed out

+

MetaCacheSweepLock

+

Used to add a lock when metadata is cyclically washed out

+

DfsConnectorCacheLock

+

Used to protect a global hash table where HDFS connection handles are cached

+

dummyServerInfoCacheLock

+

Used to protect a global hash table where the information about computing Node Group connections is cached

+

ExtensionConnectorLibLock

+

Used to add a lock when a specific dynamic library is loaded or uninstalled in ODBC connection initialization scenarios

+

SearchServerLibLock

+

Used to add a lock on the file read operation when a specific dynamic library is initially loaded in GPU-accelerated scenarios

+

DfsUserLoginLock

+

Used to protect a global linked table where HDFS user information is stored

+

DfsSpaceCacheLock

+

Used to ensure that the IDs of files to be imported to an HDFS table increase monotonically

+

LsnXlogChkFileLock

+

Used to serially update the Xlog flush points for primary and standby servers recorded in a specific structure

+

GTMHostInfoLock

+

Used to prevent concurrent access to or concurrent modification on GTM host information

+

ReplicationSlotAllocationLock

+

Used to add a lock when a primary server allocates stream replication slots during primary-standby replication

+

ReplicationSlotControlLock

+

Used to prevent concurrent update of replication slot status during primary-standby replication

+

ResourcePoolHashLock

+

Used to prevent concurrent access to or concurrent modification on a resource pool table, a hash table

+

WorkloadStatHashLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains SQL requests from the CN side

+

WorkloadIoStatHashLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains the I/O information of the current DN

+

WorkloadCGroupHashLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains Cgroup information

+

OBSGetPathLock

+

Used to prevent concurrent read/write or concurrent write/write on an OBS path

+

WorkloadUserInfoLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains user information about load management

+

WorkloadRecordLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains requests received by CNs during adaptive memory management

+

WorkloadIOUtilLock

+

Used to protect a structure that records iostat and CPU load information

+

WorkloadNodeGroupLock

+

Used to prevent concurrent access to or concurrent modification on a hash table that contains Node Group information in memory

+

JobShmemLock

+

Used to protect global variables in the shared memory that is periodically read during a scheduled task where MPP is compatible with Oracle

+

OBSRuntimeLock

+

Used to obtain environment variables, for example, GASSHOME

+

LLVMDumpIRLock

+

Used to export the assembly language for dynamically generating functions

+

LLVMParseIRLock

+

Used to compile and parse a finished IR function from the IR file at the start position of a query

+

RPNumberLock

+

Used by a DN on a computing Node Group to count the number of threads for a task where plans are being executed

+

ClusterRPLock

+

Used to control concurrent access on cluster load data maintained in a CCN of the cluster

+

CriticalCacheBuildLock

+

Used to load caches from a shared or local cache initialization file

+

WaitCountHashLock

+

Used to protect a shared structure in user statement counting scenarios

+

BufMappingLock

+

Used to protect operations on a table mapped to shared buffer

+

LockMgrLock

+

It is used to protect a common lock structure.

+

PredicateLockMgrLock

+

Used to protect a lock structure that has serializable transactions

+

OperatorRealTLock

+

Used to prevent concurrent access to or concurrent modification on a global structure that contains real-time data at the operator level

+

OperatorHistLock

+

Used to prevent concurrent access to or concurrent modification on a global structure that contains historical data at the operator level

+

SessionRealTLock

+

Used to prevent concurrent access to or concurrent modification on a global structure that contains real-time data at the query level

+

SessionHistLock

+

Used to prevent concurrent access to or concurrent modification on a global structure that contains historical data at the query level

+

CacheSlotMappingLock

+

Used to protect global CU cache information

+

BarrierLock

+

Used to ensure that only one thread is creating a barrier at a time

+
+
+

The following table describes the corresponding wait events when wait_status is wait io.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 4 List of wait events corresponding to I/Os

wait_event

+

Description

+

BufFileRead

+

Reads data from a temporary file to a specified buffer.

+

BufFileWrite

+

Writes the content of a specified buffer to a temporary file.

+

ControlFileRead

+

Reads the pg_control file, mainly during database startup, checkpoint execution, and primary/standby verification.

+

ControlFileSync

+

Flushes the pg_control file to a disk, mainly during database initialization.

+

ControlFileSyncUpdate

+

Flushes the pg_control file to a disk, mainly during database startup, checkpoint execution, and primary/standby verification.

+

ControlFileWrite

+

Writes to the pg_control file, mainly during database initialization.

+

ControlFileWriteUpdate

+

Updates the pg_control file, mainly during database startup, checkpoint execution, and primary/standby verification.

+

CopyFileRead

+

Reads a file during file copying.

+

CopyFileWrite

+

Writes a file during file copying.

+

DataFileExtend

+

Writes a file during file extension.

+

DataFileFlush

+

Flushes a table data file to a disk.

+

DataFileImmediateSync

+

Flushes a table data file to a disk immediately.

+

DataFilePrefetch

+

Reads a table data file asynchronously.

+

DataFileRead

+

Reads a table data file synchronously.

+

DataFileSync

+

Flushes table data file modifications to a disk.

+

DataFileTruncate

+

Truncates a table data file.

+

DataFileWrite

+

Writes a table data file.

+

LockFileAddToDataDirRead

+

Reads the postmaster.pid file.

+

LockFileAddToDataDirSync

+

Flushes the postmaster.pid file to a disk.

+

LockFileAddToDataDirWrite

+

Writes the PID information into the postmaster.pid file.

+

LockFileCreateRead

+

Read the LockFile file %s.lock.

+

LockFileCreateSync

+

Flushes the LockFile file %s.lock to a disk.

+

LockFileCreateWRITE

+

Writes the PID information into the LockFile file %s.lock.

+

RelationMapRead

+

Reads the mapping file between system catalogs and storage locations.

+

RelationMapSync

+

Flushes the mapping file between system catalogs and storage locations to a disk.

+

RelationMapWrite

+

Writes the mapping file between system catalogs and storage locations.

+

ReplicationSlotRead

+

Reads a stream replication slot file during a restart.

+

ReplicationSlotRestoreSync

+

Flushes a stream replication slot file to a disk during a restart.

+

ReplicationSlotSync

+

Flushes a temporary stream replication slot file to a disk during checkpoint execution.

+

ReplicationSlotWrite

+

Writes a temporary stream replication slot file during checkpoint execution.

+

SLRUFlushSync

+

Flushes the pg_clog, pg_subtrans, and pg_multixact files to a disk, mainly during checkpoint execution and database shutdown.

+

SLRURead

+

Reads the pg_clog, pg_subtrans, and pg_multixact files.

+

SLRUSync

+

Writes dirty pages into the pg_clog, pg_subtrans, and pg_multixact files, and flushes the files to a disk, mainly during checkpoint execution and database shutdown.

+

SLRUWrite

+

Writes the pg_clog, pg_subtrans, and pg_multixact files.

+

TimelineHistoryRead

+

Reads the timeline history file during database startup.

+

TimelineHistorySync

+

Flushes the timeline history file to a disk during database startup.

+

TimelineHistoryWrite

+

Writes to the timeline history file during database startup.

+

TwophaseFileRead

+

Reads the pg_twophase file, mainly during two-phase transaction submission and restoration.

+

TwophaseFileSync

+

Flushes the pg_twophase file to a disk, mainly during two-phase transaction submission and restoration.

+

TwophaseFileWrite

+

Writes the pg_twophase file, mainly during two-phase transaction submission and restoration.

+

WALBootstrapSync

+

Flushes an initialized WAL file to a disk during database initialization.

+

WALBootstrapWrite

+

Writes an initialized WAL file during database initialization.

+

WALCopyRead

+

Read operation generated when an existing WAL file is read for replication after archiving and restoration.

+

WALCopySync

+

Flushes a replicated WAL file to a disk after archiving and restoration.

+

WALCopyWrite

+

Write operation generated when an existing WAL file is read for replication after archiving and restoration.

+

WALInitSync

+

Flushes a newly initialized WAL file to a disk during log reclaiming or writing.

+

WALInitWrite

+

Initializes a newly created WAL file to 0 during log reclaiming or writing.

+

WALRead

+

Reads data from Xlogs during redo operations on two-phase files.

+

WALSyncMethodAssign

+

Flushes all open WAL files to a disk.

+

WALWrite

+

Writes a WAL file.

+
+
+

The following table describes the corresponding wait events when wait_status is acquire lock.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 5 List of wait events corresponding to transaction locks

wait_event

+

Description

+

relation

+

Adds a lock to a table.

+

extend

+

Adds a lock to a table being scaled out.

+

partition

+

Adds a lock to a partitioned table.

+

partition_seq

+

Adds a lock to a partition of a partitioned table.

+

page

+

Adds a lock to a table page.

+

tuple

+

Adds a lock to a tuple on a page.

+

transactionid

+

Adds a lock to a transaction ID.

+

virtualxid

+

Adds a lock to a virtual transaction ID.

+

object

+

Adds a lock to an object.

+

cstore_freespace

+

Adds a lock to idle column-store space.

+

userlock

+

Adds a lock to a user.

+

advisory

+

Adds an advisory lock.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0784.html b/docs/dws/dev/dws_04_0784.html new file mode 100644 index 00000000..e7685882 --- /dev/null +++ b/docs/dws/dev/dws_04_0784.html @@ -0,0 +1,115 @@ + + +

PG_TABLES

+

PG_TABLES displays access to each table in the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TABLES columns

Name

+

Type

+

Reference

+

Description

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

Name of the schema that contains the table

+

tablename

+

name

+

PG_CLASS.relname

+

Name of the table

+

tableowner

+

name

+

pg_get_userbyid(PG_CLASS.relowner)

+

Owner of the table

+

tablespace

+

name

+

PG_TABLESPACE.spcname

+

Tablespace that contains the table. The default value is null

+

hasindexes

+

boolean

+

PG_CLASS.relhasindex

+

Whether the table has (or recently had) an index. If it does, its value is true. Otherwise, its value is false.

+

hasrules

+

boolean

+

PG_CLASS.relhasruls

+

Whether the table has rules. If it does, its value is true. Otherwise, its value is false.

+

hastriggers

+

boolean

+

PG_CLASS.RELHASTRIGGERS

+

Whether the table has triggers. If it does, its value is true. Otherwise, its value is false.

+

tablecreator

+

name

+

pg_get_userbyid(PG_OBJECT.creator)

+

Table creator. If the creator has been deleted, no value is returned.

+

created

+

timestamp with time zone

+

PG_OBJECT.ctime

+

Time when the table was created.

+

last_ddl_time

+

timestamp with time zone

+

PG_OBJECT.mtime

+

Last time when the cluster was modified.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0785.html b/docs/dws/dev/dws_04_0785.html new file mode 100644 index 00000000..9372336b --- /dev/null +++ b/docs/dws/dev/dws_04_0785.html @@ -0,0 +1,60 @@ + + +

PG_TDE_INFO

+

PG_TDE_INFO displays the encryption information about the current cluster.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_TDE_INFO columns

Name

+

Type

+

Description

+

is_encrypt

+

text

+

Whether the cluster is an encryption cluster

+
  • f: Non-encryption cluster
  • t: Encryption cluster
+

g_tde_algo

+

text

+

Encryption algorithm

+
  • SM4-CTR-128
  • AES-CTR-128
+

remain

+

text

+

Reserved

+
+
+

Examples

Check whether the current cluster is encrypted, and check the encryption algorithm (if any) used by the current cluster.

+
1
+2
+3
+4
+5
SELECT * FROM PG_TDE_INFO;
+ is_encrypt | g_tde_algo  | remain
+------------+-------------+--------
+ f          | AES-CTR-128 | remain
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0786.html b/docs/dws/dev/dws_04_0786.html new file mode 100644 index 00000000..34b16869 --- /dev/null +++ b/docs/dws/dev/dws_04_0786.html @@ -0,0 +1,44 @@ + + +

PG_TIMEZONE_ABBREVS

+

PG_TIMEZONE_ABBREVS displays all time zone abbreviations that can be recognized by the input routines.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_TIMEZONE_ABBREVS columns

Name

+

Type

+

Description

+

abbrev

+

text

+

Time zone abbreviation

+

utc_offset

+

interval

+

Offset from UTC

+

is_dst

+

boolean

+

Whether the abbreviation indicates a daylight saving time (DST) zone. If it does, its value is true. Otherwise, its value is false.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0787.html b/docs/dws/dev/dws_04_0787.html new file mode 100644 index 00000000..17f2546f --- /dev/null +++ b/docs/dws/dev/dws_04_0787.html @@ -0,0 +1,51 @@ + + +

PG_TIMEZONE_NAMES

+

PG_TIMEZONE_NAMES displays all time zone names that can be recognized by SET TIMEZONE, along with their associated abbreviations, UTC offsets, and daylight saving time statuses.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TIMEZONE_NAMES columns

Name

+

Type

+

Description

+

name

+

text

+

Name of the time zone

+

abbrev

+

text

+

Time zone name abbreviation

+

utc_offset

+

interval

+

Offset from UTC

+

is_dst

+

boolean

+

Whether DST is used. If it is, its value is true. Otherwise, its value is false.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0788.html b/docs/dws/dev/dws_04_0788.html new file mode 100644 index 00000000..8f980afa --- /dev/null +++ b/docs/dws/dev/dws_04_0788.html @@ -0,0 +1,45 @@ + + +

PG_TOTAL_MEMORY_DETAIL

+

PG_TOTAL_MEMORY_DETAIL displays the memory usage of a certain node in the database.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PG_TOTAL_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

nodename

+

text

+

Node name

+

memorytype

+

text

+

It can be set to any of the following values:

+
  • max_process_memory: memory used by a GaussDB(DWS) cluster instance
  • process_used_memory: memory used by a GaussDB(DWS) process
  • max_dynamic_memory: maximum dynamic memory
  • dynamic_used_memory: used dynamic memory
  • dynamic_peak_memory: dynamic peak value of the memory
  • dynamic_used_shrctx: maximum dynamic shared memory context
  • dynamic_peak_shrctx: dynamic peak value of the shared memory context
  • max_shared_memory: maximum shared memory
  • shared_used_memory: used shared memory
  • max_cstore_memory: maximum memory allowed for column store
  • cstore_used_memory: memory used for column store
  • max_sctpcomm_memory: maximum memory allowed for the communication library
  • sctpcomm_used_memory: memory used for the communication library
  • sctpcomm_peak_memory: memory peak of the communication library
  • other_used_memory: other used memory
  • gpu_max_dynamic_memory: maximum GPU memory
  • gpu_dynamic_used_memory: sum of the available GPU memory and temporary GPU memory
  • gpu_dynamic_peak_memory: maximum memory used for GPU
  • pooler_conn_memory: memory used for pooler connections
  • pooler_freeconn_memory: memory used for idle pooler connections
  • storage_compress_memory: memory used for column-store compression and decompression
  • udf_reserved_memory: memory reserved for the UDF Worker process
  • mmap_used_memory: memory used for mmap
+

memorymbytes

+

integer

+

Size of the used memory (MB)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0789.html b/docs/dws/dev/dws_04_0789.html new file mode 100644 index 00000000..dd0bc3a0 --- /dev/null +++ b/docs/dws/dev/dws_04_0789.html @@ -0,0 +1,65 @@ + + +

PG_TOTAL_SCHEMA_INFO

+

PG_TOTAL_SCHEMA_INFO displays the storage usage of all schemas in each database. This view is valid only if use_workload_manager is set to on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Column

+

Type

+

Description

+

schemaid

+

oid

+

Schema OID

+

schemaname

+

text

+

Schema name

+

databaseid

+

oid

+

Database OID

+

databasename

+

name

+

Database name

+

usedspace

+

bigint

+

Size of the permanent table storage space used by the schema, in bytes.

+

permspace

+

bigint

+

Upper limit of the permanent table storage space of the schema, in bytes.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0790.html b/docs/dws/dev/dws_04_0790.html new file mode 100644 index 00000000..241dd106 --- /dev/null +++ b/docs/dws/dev/dws_04_0790.html @@ -0,0 +1,148 @@ + + +

PG_TOTAL_USER_RESOURCE_INFO

+

PG_TOTAL_USER_RESOURCE_INFO displays the resource usage of all users. Only administrators can query this view. This view is valid only if use_workload_manager is set to on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_TOTAL_USER_RESOURCE_INFO columns

Name

+

Type

+

Description

+

username

+

name

+

Username

+

used_memory

+

integer

+

Used memory (unit: MB)

+

total_memory

+

integer

+

Available memory (unit: MB). 0 indicates that the available memory is not limited and depends on the maximum memory available in the database.

+

used_cpu

+

double precision

+

Number of CPU cores in use. Only the CPU usage of complex jobs in the non-default resource pool is collected, and the value is the CPU usage of the related cgroup.

+

total_cpu

+

integer

+

Total number of CPU cores of the cgroup associated with a user on the node

+

used_space

+

bigint

+

Used permanent table storage space (unit: KB)

+

total_space

+

bigint

+

Available storage space (unit: KB). -1 indicates that the storage space is not limited.

+

used_temp_space

+

bigint

+

Used temporary table storage space (unit: KB)

+

total_temp_space

+

bigint

+

Available temporary table storage space (unit: KB). -1 indicates that the storage space is not limited.

+

used_spill_space

+

bigint

+

Size of the used operator flushing space, in KB

+

total_spill_space

+

bigint

+

Size of the available operator flushing space, in KB. The value -1 indicates that the operator flushing space is not limited.

+

read_kbytes

+

bigint

+

CN: total number of bytes read by a user's complex jobs on all DNs in the last 5 seconds. The unit is KB.

+

DN: total number of bytes read by a user's complex jobs from the instance startup time to the current time. The unit is KB.

+

write_kbytes

+

bigint

+

CN: total number of bytes written by a user's complex jobs on all DNs in the last 5 seconds. The unit is KB.

+

DN: total number of bytes written by a user's complex jobs from the instance startup time to the current time. The unit is KB.

+

read_counts

+

bigint

+

CN: total number of read times of a user's complex jobs on all DNs in the last 5 seconds. Unit: count.

+

DN: total number of read times of a user's complex jobs from the instance startup time to the current time. Unit: count.

+

write_counts

+

bigint

+

CN: total number of write times of a user's complex jobs on all DNs in the last 5 seconds. Unit: count.

+

DN: total number of write times of a user's complex jobs from the instance startup time to the current time. Unit: count.

+

read_speed

+

double precision

+

CN: average read rate of a user's complex jobs on a single DN in the last 5 seconds. (Unit: KB/s)

+

DN: indicates the average read rate of a user's complex jobs on a single DN in the last 5 seconds. (Unit: KB/s)

+

write_speed

+

double precision

+

CN: average write rate of a user's complex jobs on a single DN in the last 5 seconds. (Unit: KB/s)

+

DN: average write rate of a user's complex jobs on a single DN in the last 5 seconds. (Unit: KB/s)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0791.html b/docs/dws/dev/dws_04_0791.html new file mode 100644 index 00000000..518b3dde --- /dev/null +++ b/docs/dws/dev/dws_04_0791.html @@ -0,0 +1,135 @@ + + +

PG_USER

+

PG_USER displays information about users who can access the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_USER columns

Name

+

Type

+

Description

+

usename

+

name

+

User name

+

usesysid

+

oid

+

ID of this user

+

usecreatedb

+

boolean

+

Whether the user has the permission to create databases

+

usesuper

+

boolean

+

whether the user is the initial system administrator with the highest rights.

+

usecatupd

+

boolean

+

whether the user can directly update system tables. Only the initial system administrator whose usesysid is 10 has this permission. It is not available for other users.

+

userepl

+

boolean

+

Whether the user has the permission to duplicate data streams

+

passwd

+

text

+

Encrypted user password. The value is displayed as ********.

+

valbegin

+

timestamp with time zone

+

Account validity start time; null if no start time

+

valuntil

+

timestamp with time zone

+

Password expiry time; null if no expiration

+

respool

+

name

+

Resource pool where the user is in

+

parentid

+

oid

+

Parent user OID

+

spacelimit

+

text

+

The storage space of the permanent table.

+

tempspacelimit

+

text

+

The storage space of the temporary table.

+

spillspacelimit

+

text

+

The operator disk flushing space.

+

useconfig

+

text[]

+

Session defaults for run-time configuration variables

+

nodegroup

+

name

+

Name of the logical cluster associated with the user. If no logical cluster is associated, this column is left blank.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0792.html b/docs/dws/dev/dws_04_0792.html new file mode 100644 index 00000000..1e6ea51a --- /dev/null +++ b/docs/dws/dev/dws_04_0792.html @@ -0,0 +1,80 @@ + + +

PG_USER_MAPPINGS

+

PG_USER_MAPPINGS displays information about user mappings.

+

This is essentially a publicly readable view of PG_USER_MAPPING that leaves out the options column if the user has no rights to use it.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_USER_MAPPINGS columns

Name

+

Type

+

Reference

+

Description

+

umid

+

oid

+

PG_USER_MAPPING.oid

+

OID of the user mapping

+

srvid

+

oid

+

PG_FOREIGN_SERVER.oid

+

OID of the foreign server that contains this mapping

+

srvname

+

name

+

PG_FOREIGN_SERVER.srvname

+

Name of the foreign server

+

umuser

+

oid

+

PG_AUTHID.oid

+

OID of the local role being mapped, 0 if the user mapping is public

+

usename

+

name

+

-

+

Name of the local user to be mapped

+

umoptions

+

text[ ]

+

-

+

User mapping specific options. If the current user is the owner of the foreign server, its value is keyword=value strings. Otherwise, its value is null.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0793.html b/docs/dws/dev/dws_04_0793.html new file mode 100644 index 00000000..0d4e9f15 --- /dev/null +++ b/docs/dws/dev/dws_04_0793.html @@ -0,0 +1,61 @@ + + +

PG_VIEWS

+

PG_VIEWS displays basic information about each view in the database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_VIEWS columns

Name

+

Type

+

Reference

+

Description

+

schemaname

+

name

+

PG_NAMESPACE.nspname

+

Name of the schema that contains the view

+

viewname

+

name

+

PG_CLASS.relname

+

View name

+

viewowner

+

name

+

PG_AUTHID.Erolname

+

Owner of the view

+

definition

+

text

+

-

+

Definition of the view

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0794.html b/docs/dws/dev/dws_04_0794.html new file mode 100644 index 00000000..acc44cab --- /dev/null +++ b/docs/dws/dev/dws_04_0794.html @@ -0,0 +1,102 @@ + + +

PG_WLM_STATISTICS

+

PG_WLM_STATISTICS displays information about workload management after the task is complete or the exception has been handled.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PG_WLM_STATISTICS columns

Name

+

Type

+

Description

+

statement

+

text

+

Statement executed for exception handling

+

block_time

+

bigint

+

Block time before the statement is executed

+

elapsed_time

+

bigint

+

Elapsed time when the statement is executed

+

total_cpu_time

+

bigint

+

Total time used by the CPU on the DN when the statement is executed for exception handling

+

qualification_time

+

bigint

+

Period when the statement checks the inclination ratio

+

cpu_skew_percent

+

integer

+

CPU usage skew on the DN when the statement is executed for exception handling

+

control_group

+

text

+

Cgroup used when the statement is executed for exception handling

+

status

+

text

+

Statement status after it is executed for exception handling

+
  • pending: The statement is waiting to be executed.
  • running: The statement is being executed.
  • finished: The execution is finished normally.
  • abort: The execution is unexpectedly terminated.
+

action

+

text

+

Actions when statements are executed for exception handling

+
  • abort indicates terminating the operation.
  • adjust indicates executing the Cgroup adjustment operations. Currently, you can only perform the demotion operation.
  • finish indicates that the operation is normally finished.
+

queryid

+

bigint

+

Internal query ID used for statement execution

+

threadid

+

bigint

+

ID of the backend thread

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0795.html b/docs/dws/dev/dws_04_0795.html new file mode 100644 index 00000000..5f156317 --- /dev/null +++ b/docs/dws/dev/dws_04_0795.html @@ -0,0 +1,51 @@ + + +

PGXC_BULKLOAD_PROGRESS

+

PGXC_BULKLOAD_PROGRESS displays the progress of the service import. Only GDS common files can be imported. This view is accessible only to users with system administrators rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_BULKLOAD_PROGRESS columns

Name

+

Type

+

Description

+

session_id

+

bigint

+

GDS session ID

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

query

+

text

+

Query statement

+

progress

+

text

+

Progress percentage

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0796.html b/docs/dws/dev/dws_04_0796.html new file mode 100644 index 00000000..dad0631f --- /dev/null +++ b/docs/dws/dev/dws_04_0796.html @@ -0,0 +1,123 @@ + + +

PGXC_BULKLOAD_STATISTICS

+

PGXC_BULKLOAD_STATISTICS displays real-time statistics about service execution, such as GDS, COPY, and \COPY, on a CN. This view summarizes the real-time execution status of import and export services that are being executed on each node in the current cluster. In this way, you can monitor the real-time progress of import and export services and locate performance problems.

+

Columns in PGXC_BULKLOAD_STATISTICS are the same as those in PG_BULKLOAD_STATISTICS. This is because PGXC_BULKLOAD_STATISTICS is essentially the summary result of querying PG_BULKLOAD_STATISTICS on each node in the cluster.

+

This view is accessible only to users with system administrators rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_BULKLOAD_STATISTICS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

db_name

+

text

+

Database name

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

tid

+

bigint

+

ID of the current thread

+

lwtid

+

integer

+

Lightweight thread ID

+

session_id

+

bigint

+

GDS session ID

+

direction

+

text

+

Service type. The options are gds to file, gds from file, gds to pipe, gds from pipe, copy from, and copy to.

+

query

+

text

+

Query statement

+

address

+

text

+

Location of the foreign table used for data import and export

+

query_start

+

timestamp with time zone

+

Start time of data import or export

+

total_bytes

+

bigint

+

Total size of data to be processed

+

This parameter is specified only when a GDS common file is to be imported and the record in the row comes from a CN. Otherwise, left this parameter unspecified.

+

phase

+

text

+

Current phase. The options are INITIALIZING, TRANSFER_DATA, and RELEASE_RESOURCE.

+

done_lines

+

bigint

+

Number of lines that have been transferred

+

done_bytes

+

bigint

+

Number of bytes that have been transferred

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0797.html b/docs/dws/dev/dws_04_0797.html new file mode 100644 index 00000000..39521674 --- /dev/null +++ b/docs/dws/dev/dws_04_0797.html @@ -0,0 +1,86 @@ + + +

PGXC_COMM_CLIENT_INFO

+

PGXC_COMM_CLIENT_INFO stores the client connection information of all nodes. (You can query this view on a DN to view the information about the connection between the CN and DN.)

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_COMM_CLIENT_INFO columns

Name

+

Type

+

Description

+

node_name

+

text

+

Current node name.

+

app

+

text

+

Client application name

+

tid

+

bigint

+

Thread ID of the current thread.

+

lwtid

+

integer

+

Lightweight thread ID of the current thread.

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

socket

+

integer

+

It is displayed if the connection is a physical connection.

+

remote_ip

+

text

+

Peer node IP address.

+

remote_port

+

text

+

Peer node port.

+

logic_id

+

integer

+

If the connection is a logical connection, sid is displayed. If -1 is displayed, the current connection is a physical connection.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0798.html b/docs/dws/dev/dws_04_0798.html new file mode 100644 index 00000000..52147f59 --- /dev/null +++ b/docs/dws/dev/dws_04_0798.html @@ -0,0 +1,74 @@ + + +

PGXC_COMM_DELAY

+

PGXC_COMM_STATUS displays the communication library delay status for all the DNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_COMM_DELAY columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

remote_name

+

text

+

Name of the peer node

+

remote_host

+

text

+

IP address of the peer

+

stream_num

+

integer

+

Number of logical stream connections used by the current physical connection

+

min_delay

+

integer

+

Minimum delay of the current physical connection within 1 minute. Its unit is microsecond.

+
NOTE:

A negative result is invalid. Wait until the delay status is updated and query again.

+
+

average

+

integer

+

Average delay of the current physical connection within 1 minute. Its unit is microsecond.

+

max_delay

+

integer

+

Maximum delay of the current physical connection within 1 minute. Its unit is microsecond.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0799.html b/docs/dws/dev/dws_04_0799.html new file mode 100644 index 00000000..b4724417 --- /dev/null +++ b/docs/dws/dev/dws_04_0799.html @@ -0,0 +1,143 @@ + + +

PGXC_COMM_RECV_STREAM

+

PG_COMM_RECV_STREAM displays the receiving stream status of the communication libraries for all the DNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_COMM_RECV_STREAM columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

local_tid

+

bigint

+

ID of the thread using this stream

+

remote_name

+

text

+

Name of the peer node

+

remote_tid

+

bigint

+

Peer thread ID

+

idx

+

integer

+

Peer DN ID in the local DN

+

sid

+

integer

+

Stream ID in the physical connection

+

tcp_sock

+

integer

+

TCP socket used in the stream

+

state

+

text

+

Current status of the stream

+
  • UNKNOWN: The logical connection is unknown.
  • READY: The logical connection is ready.
  • RUN: The logical connection receives packets normally.
  • HOLD: The logical connection is waiting to receive packets.
  • CLOSED: The logical connection is closed.
  • TO_CLOSED: The logical connection is to be closed.
+

query_id

+

bigint

+

debug_query_id corresponding to the stream

+

pn_id

+

integer

+

plan_node_id of the query executed by the stream

+

send_smp

+

integer

+

smpid of the sender of the query executed by the stream

+

recv_smp

+

integer

+

smpid of the receiver of the query executed by the stream

+

recv_bytes

+

bigint

+

Total data volume received from the stream. The unit is byte.

+

time

+

bigint

+

Current life cycle service duration of the stream. The unit is ms.

+

speed

+

bigint

+

Average receiving rate of the stream. The unit is byte/s.

+

quota

+

bigint

+

Current communication quota value of the stream. The unit is Byte.

+

buff_usize

+

bigint

+

Current size of the data cache of the stream. The unit is byte.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0800.html b/docs/dws/dev/dws_04_0800.html new file mode 100644 index 00000000..1354d6a8 --- /dev/null +++ b/docs/dws/dev/dws_04_0800.html @@ -0,0 +1,143 @@ + + +

PGXC_COMM_SEND_STREAM

+

PGXC_COMM_SEND_STREAM displays the sending stream status of the communication libraries for all the DNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_COMM_SEND_STREAM columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

local_tid

+

bigint

+

ID of the thread using this stream

+

remote_name

+

text

+

Name of the peer node

+

remote_tid

+

bigint

+

Peer thread ID

+

idx

+

integer

+

Peer DN ID in the local DN

+

sid

+

integer

+

Stream ID in the physical connection

+

tcp_sock

+

integer

+

TCP socket used in the stream

+

state

+

text

+

Current status of the stream

+
  • UNKNOWN: The logical connection is unknown.
  • READY: The logical connection is ready.
  • RUN: The logical connection sends packets normally.
  • HOLD: The logical connection is waiting to send packets.
  • CLOSED: The logical connection is closed.
  • TO_CLOSED: The logical connection is to be closed.
+

query_id

+

bigint

+

debug_query_id corresponding to the stream

+

pn_id

+

integer

+

plan_node_id of the query executed by the stream

+

send_smp

+

integer

+

smpid of the sender of the query executed by the stream

+

recv_smp

+

integer

+

smpid of the receiver of the query executed by the stream

+

send_bytes

+

bigint

+

Total data volume sent by the stream. The unit is Byte.

+

time

+

bigint

+

Current life cycle service duration of the stream. The unit is ms.

+

speed

+

bigint

+

Average sending rate of the stream. The unit is Byte/s.

+

quota

+

bigint

+

Current communication quota value of the stream. The unit is Byte.

+

wait_quota

+

bigint

+

Extra time generated when the stream waits the quota value. The unit is ms.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0801.html b/docs/dws/dev/dws_04_0801.html new file mode 100644 index 00000000..be558190 --- /dev/null +++ b/docs/dws/dev/dws_04_0801.html @@ -0,0 +1,114 @@ + + +

PGXC_COMM_STATUS

+

PGXC_COMM_STATUS displays the communication library status for all the DNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_COMM_STATUS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

rxpck/s

+

integer

+

Receiving rate of the communication library on a node. The unit is byte/s.

+

txpck/s

+

integer

+

Sending rate of the communication library on a node. The unit is byte/s.

+

rxkB/s

+

bigint

+

Receiving rate of the communication library on a node. The unit is KB/s.

+

txkB/s

+

bigint

+

Sending rate of the communication library on a node. The unit is KB/s.

+

buffer

+

bigint

+

Size of the buffer of the Cmailbox.

+

memKB(libcomm)

+

bigint

+

Communication memory size of the libcomm process, in KB.

+

memKB(libpq)

+

bigint

+

Communication memory size of the libpq process, in KB.

+

%USED(PM)

+

integer

+

Real-time usage of the postmaster thread.

+

%USED (sflow)

+

integer

+

Real-time usage of the gs_sender_flow_controller thread.

+

%USED (rflow)

+

integer

+

Real-time usage of the gs_receiver_flow_controller thread.

+

%USED (rloop)

+

integer

+

Highest real-time usage among multiple gs_receivers_loop threads.

+

stream

+

integer

+

Total number of used logical connections.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0802.html b/docs/dws/dev/dws_04_0802.html new file mode 100644 index 00000000..b2428216 --- /dev/null +++ b/docs/dws/dev/dws_04_0802.html @@ -0,0 +1,185 @@ + + +

PGXC_DEADLOCK

+

PGXC_DEADLOCK displays lock wait information generated due to distributed deadlocks.

+

Currently, PGXC_DEADLOCK collects only lock wait information about locks whose locktype is relation, partition, page, tuple, or transactionid.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_DEADLOCK columns

Name

+

Type

+

Description

+

locktype

+

text

+

Type of the locked object

+

nodename

+

name

+

Name of the node where the locked object resides

+

dbname

+

name

+

Name of the database where the locked object resides. The value is NULL if the locked object is a transaction.

+

nspname

+

name

+

Name of the namespace of the locked object

+

relname

+

name

+

Name of the relation targeted by the lock. The value is NULL if the object is not a relation or part of a relation.

+

partname

+

name

+

Name of the partition targeted by the lock. The value is NULL if the locked object is not a partition.

+

page

+

integer

+

Number of the page targeted by the lock. The value is NULL if the locked object is neither a page nor a tuple.

+

tuple

+

smallint

+

Number of the tuple targeted by the lock. The value is NULL if the locked object is not a tuple.

+

transactionid

+

xid

+

ID of the transaction targeted by the lock. The value is NULL if the locked object is not a transaction.

+

waitusername

+

name

+

Name of the user who waits for the lock

+

waitgxid

+

xid

+

ID of the transaction that waits for the lock

+

waitxactstart

+

timestamp with time zone

+

Start time of the transaction that waits for the lock

+

waitqueryid

+

bigint

+

Latest query ID of the thread that waits for the lock

+

waitquery

+

text

+

Latest query statement of the thread that waits for the lock

+

waitpid

+

bigint

+

ID of the thread that waits for the lock

+

waitmode

+

text

+

Mode of the waited lock

+

holdusername

+

name

+

Name of the user who holds the lock

+

holdgxid

+

xid

+

ID of the transaction that holds the lock

+

holdxactstart

+

timestamp with time zone

+

Start time of the transaction that holds the lock

+

holdqueryid

+

bigint

+

Latest query ID of the thread that holds the lock

+

holdquery

+

text

+

Latest query statement of the thread that holds the lock

+

holdpid

+

bigint

+

ID of the thread that holds the lock

+

holdmode

+

text

+

Mode of the held lock

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0803.html b/docs/dws/dev/dws_04_0803.html new file mode 100644 index 00000000..a8dfd2e6 --- /dev/null +++ b/docs/dws/dev/dws_04_0803.html @@ -0,0 +1,89 @@ + + +

PGXC_GET_STAT_ALL_TABLES

+

PGXC_GET_STAT_ALL_TABLES displays information about insertion, update, and deletion operations on tables and the dirty page rate of tables.

+

Before running VACUUM FULL to a system catalog with a high dirty page rate, ensure that no user is performing operations it.

+

You are advised to run VACUUM FULL to tables (excluding system catalogs) whose dirty page rate exceeds 30% or run it based on service scenarios.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_GET_STAT_ALL_TABLES columns

Name

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

relname

+

name

+

Table name

+

schemaname

+

name

+

Schema name of the table

+

n_tup_ins

+

numeric

+

Number of inserted tuples

+

n_tup_upd

+

numeric

+

Number of updated tuples

+

n_tup_del

+

numeric

+

Number of deleted tuples

+

n_live_tup

+

numeric

+

Number of live tuples

+

n_dead_tup

+

numeric

+

Number of dead tuples

+

page_dirty_rate

+

numeric(5,2)

+

Dirty page rate (%) of a table

+
+
+

GaussDB(DWS) also provides the pgxc_get_stat_dirty_tables(int dirty_percent, int n_tuples) and pgxc_get_stat_dirty_tables(int dirty_percent, int n_tuples, text schema) functions to quickly filter out tables whose dirty page rate is greater than dirty_percent, number of dead tuples is greater than n_tuples, and schema name is schema. For details, see "Functions and Operators > System Administration Functions > Other Functions" in the SQL Syntax.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0804.html b/docs/dws/dev/dws_04_0804.html new file mode 100644 index 00000000..7babfb68 --- /dev/null +++ b/docs/dws/dev/dws_04_0804.html @@ -0,0 +1,102 @@ + + +

PGXC_GET_STAT_ALL_PARTITIONS

+

PGXC_GET_STAT_ALL_PARTITIONS displays information about insertion, update, and deletion operations on partitions of partitioned tables and the dirty page rate of tables.

+

The statistics of this view depend on the ANALYZE operation. To obtain the most accurate information, perform the ANALYZE operation on the partitioned table first.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_GET_STAT_ALL_PARTITIONS columns

Column

+

Type

+

Description

+

relid

+

oid

+

Table OID

+

partid

+

oid

+

Partition OID

+

schename

+

name

+

Schema name of a table

+

relname

+

name

+

Table name

+

partname

+

name

+

Partition name

+

n_tup_ins

+

numeric

+

Number of inserted tuples

+

n_tup_upd

+

numeric

+

Number of updated tuples

+

n_tup_del

+

numeric

+

Number of deleted tuples

+

n_live_tup

+

numeric

+

Number of live tuples

+

n_dead_tup

+

numeric

+

Number of dead tuples

+

page_dirty_rate

+

numeric(5,2)

+

Dirty page rate (%) of a table

+
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0805.html b/docs/dws/dev/dws_04_0805.html new file mode 100644 index 00000000..00f336c8 --- /dev/null +++ b/docs/dws/dev/dws_04_0805.html @@ -0,0 +1,86 @@ + + +

PGXC_GET_TABLE_SKEWNESS

+

PGXC_GET_TABLE_SKEWNESS displays the data skew on tables in the current database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_GET_TABLE_SKEWNESS columns

Name

+

Type

+

Description

+

schemaname

+

name

+

Schema name of a table

+

tablename

+

name

+

Name of a table

+

totalsize

+

numeric

+

Total size of a table, in bytes

+

avgsize

+

numeric(1000,0)

+

Average table size (total table size divided by the number of DNs), which is the ideal size of tables distributed on each DN

+

maxratio

+

numeric(4,3)

+

Ratio of the maximum table size on a single DN to the total table size

+

minratio

+

numeric(4,3)

+

Ratio of the minimum table size on a single DN to the total table size

+

skewsize

+

bigint

+

Table skew rate (the maximum table size on a single DN minus the minimum table size on a single DN)

+

skewratio

+

numeric(4,3)

+

Table skew rate (skew size divided by total table size)

+

skewstddev

+

numeric(1000,0)

+

Standard deviation of table distribution (For two tables of the same size, a larger deviation indicates a more severe skew.)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0806.html b/docs/dws/dev/dws_04_0806.html new file mode 100644 index 00000000..60cd6e0a --- /dev/null +++ b/docs/dws/dev/dws_04_0806.html @@ -0,0 +1,65 @@ + + +

PGXC_GTM_SNAPSHOT_STATUS

+

PGXC_GTM_SNAPSHOT_STATUS displays transaction information on the current GTM.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_GTM_SNAPSHOT_STATUS columns

Name

+

Type

+

Description

+

xmin

+

xid

+

Minimum ID of the running transactions

+

xmax

+

xid

+

ID of the transaction next to the executed transaction with the maximum ID

+

csn

+

integer

+

Sequence number of the transaction to be committed

+

oldestxmin

+

xid

+

Minimum ID of the executed transactions

+

xcnt

+

integer

+

Number of the running transactions

+

running_xids

+

text

+

IDs of the running transactions

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0807.html b/docs/dws/dev/dws_04_0807.html new file mode 100644 index 00000000..a00049f8 --- /dev/null +++ b/docs/dws/dev/dws_04_0807.html @@ -0,0 +1,11 @@ + + +

PGXC_INSTANCE_TIME

+

PGXC_INSTANCE_TIME displays the running time of processes on each node in the cluster and the time consumed in each execution phase. Except the node_name column, the other columns are the same as those in the PV_INSTANCE_TIME view. This view is accessible only to users with system administrator rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0808.html b/docs/dws/dev/dws_04_0808.html new file mode 100644 index 00000000..4c796103 --- /dev/null +++ b/docs/dws/dev/dws_04_0808.html @@ -0,0 +1,12 @@ + + +

PGXC_INSTR_UNIQUE_SQL

+

PGXC_INSTR_UNIQUE_SQL displays the complete Unique SQL statistics of all CN nodes in the cluster.

+

Only the system administrator can access this view. For details about the field, see GS_INSTR_UNIQUE_SQL.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0809.html b/docs/dws/dev/dws_04_0809.html new file mode 100644 index 00000000..0ac639bd --- /dev/null +++ b/docs/dws/dev/dws_04_0809.html @@ -0,0 +1,144 @@ + + +

PGXC_LOCK_CONFLICTS

+

PGXC_LOCK_CONFLICTS displays information about conflicting locks in the cluster.

+

When a lock is waiting for another lock or another lock is waiting for this one, a lock conflict occurs.

+

Currently, PGXC_LOCK_CONFLICTS collects only information about locks whose locktype is relation, partition, page, tuple, or transactionid.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_LOCK_CONFLICTS columns

Name

+

Type

+

Description

+

locktype

+

text

+

Type of the locked object

+

nodename

+

name

+

Name of the node where the locked object resides

+

dbname

+

name

+

Name of the database where the locked object resides. The value is NULL if the locked object is a transaction.

+

nspname

+

name

+

Name of the namespace of the locked object

+

relname

+

name

+

Name of the relation targeted by the lock. The value is NULL if the object is not a relation or part of a relation.

+

partname

+

name

+

Name of the partition targeted by the lock. The value is NULL if the locked object is not a partition.

+

page

+

integer

+

Number of the page targeted by the lock. The value is NULL if the locked object is neither a page nor a tuple.

+

tuple

+

smallint

+

Number of the tuple targeted by the lock. The value is NULL if the locked object is not a tuple.

+

transactionid

+

xid

+

ID of the transaction targeted by the lock. The value is NULL if the locked object is not a transaction.

+

username

+

name

+

Name of the user who applies for the lock

+

gxid

+

xid

+

ID of the transaction that applies for the lock

+

xactstart

+

timestamp with time zone

+

Start time of the transaction that applies for the lock

+

queryid

+

bigint

+

Latest query ID of the thread that applies for the lock

+

query

+

text

+

Latest query statement of the thread that applies for the lock

+

pid

+

bigint

+

ID of the thread that applies for the lock

+

mode

+

text

+

Lock mode

+

granted

+

boolean

+
  • TRUE if the lock has been held
  • FALSE if the lock is still waiting for another lock
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0810.html b/docs/dws/dev/dws_04_0810.html new file mode 100644 index 00000000..1d7715b3 --- /dev/null +++ b/docs/dws/dev/dws_04_0810.html @@ -0,0 +1,72 @@ + + +

PGXC_NODE_ENV

+

PGXC_NODE_ENV displays the environmental variables information about all nodes in a cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_NODE_ENV columns

Name

+

Type

+

Description

+

node_name

+

text

+

Names of all nodes in the cluster

+

host

+

text

+

Host names of all nodes in the cluster

+

process

+

integer

+

Process IDs of all nodes in the cluster

+

port

+

integer

+

Port numbers of all nodes in the cluster

+

installpath

+

text

+

Installation directory of all nodes in the cluster

+

datapath

+

text

+

Data directory of all nodes in the cluster

+

log_directory

+

text

+

Log directory of all nodes in the cluster

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0811.html b/docs/dws/dev/dws_04_0811.html new file mode 100644 index 00000000..ef9b8131 --- /dev/null +++ b/docs/dws/dev/dws_04_0811.html @@ -0,0 +1,11 @@ + + +

PGXC_NODE_STAT_RESET_TIME

+

PGXC_NODE_STAT_RESET_TIME displays the time when statistics of each node in the cluster are reset. All columns except node_name are the same as those in the GS_NODE_STAT_RESET_TIME view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0812.html b/docs/dws/dev/dws_04_0812.html new file mode 100644 index 00000000..87321423 --- /dev/null +++ b/docs/dws/dev/dws_04_0812.html @@ -0,0 +1,11 @@ + + +

PGXC_OS_RUN_INFO

+

PGXC_OS_RUN_INFO displays the OS running status of each node in the cluster. All columns except node_name are the same as those in the PV_OS_RUN_INFO view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0813.html b/docs/dws/dev/dws_04_0813.html new file mode 100644 index 00000000..3efbc9a1 --- /dev/null +++ b/docs/dws/dev/dws_04_0813.html @@ -0,0 +1,58 @@ + + +

PGXC_OS_THREADS

+

PGXC_OS_THREADS displays thread status information under all normal nodes in the current cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_OS_THREADS columns

Name

+

Type

+

Description

+

node_name

+

text

+

All normal node names in the cluster

+

pid

+

bigint

+

IDs of running threads among all normal node processes in the current cluster

+

lwpid

+

integer

+

Lightweight thread ID corresponding to the PID

+

thread_name

+

text

+

Thread name corresponding to the PID

+

creation_time

+

timestamp with time zone

+

Thread creation time corresponding to the PID

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0814.html b/docs/dws/dev/dws_04_0814.html new file mode 100644 index 00000000..dca3cfe7 --- /dev/null +++ b/docs/dws/dev/dws_04_0814.html @@ -0,0 +1,30 @@ + + +

PGXC_PREPARED_XACTS

+

PGXC_PREPARED_XACTS displays the two-phase transactions in the prepared phase.

+ +
+ + + + + + + + + +
Table 1 PGXC_PREPARED_XACTS columns

Name

+

Type

+

Description

+

pgxc_prepared_xact

+

text

+

Two-phase transactions in prepared phase

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0815.html b/docs/dws/dev/dws_04_0815.html new file mode 100644 index 00000000..7049ae56 --- /dev/null +++ b/docs/dws/dev/dws_04_0815.html @@ -0,0 +1,11 @@ + + +

PGXC_REDO_STAT

+

PGXC_REDO_STAT displays statistics on redoing Xlogs of each node in the cluster. All columns except node_name are the same as those in the PV_REDO_STAT view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0816.html b/docs/dws/dev/dws_04_0816.html new file mode 100644 index 00000000..e34ea452 --- /dev/null +++ b/docs/dws/dev/dws_04_0816.html @@ -0,0 +1,11 @@ + + +

PGXC_REL_IOSTAT

+

PGXC_REL_IOSTAT displays statistics on disk read and write of each node in the cluster. All columns except node_name are the same as those in the GS_REL_IOSTAT view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0817.html b/docs/dws/dev/dws_04_0817.html new file mode 100644 index 00000000..1c3f153f --- /dev/null +++ b/docs/dws/dev/dws_04_0817.html @@ -0,0 +1,11 @@ + + +

PGXC_REPLICATION_SLOTS

+

PGXC_REPLICATION_SLOTS displays the replication information of DNs in the cluster. All columns except node_name are the same as those in the PG_REPLICATION_SLOTS view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0818.html b/docs/dws/dev/dws_04_0818.html new file mode 100644 index 00000000..158da9fe --- /dev/null +++ b/docs/dws/dev/dws_04_0818.html @@ -0,0 +1,93 @@ + + +

PGXC_RUNNING_XACTS

+

PGXC_RUNNING_XACTS displays information about running transactions on each node in the cluster. The content is the same as that displayed in PG_RUNNING_XACTS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_RUNNING_XACTS columns

Name

+

Type

+

Description

+

handle

+

integer

+

Handle corresponding to the transaction in GTM

+

gxid

+

xid

+

Transaction ID

+

state

+

tinyint

+

Transaction status (3: prepared or 0: starting)

+

node

+

text

+

Node name

+

xmin

+

xid

+

Minimum transaction ID xmin on the node

+

vacuum

+

boolean

+

Whether the current transaction is lazy vacuum

+

timeline

+

bigint

+

Number of database restart

+

prepare_xid

+

xid

+

Transaction ID in prepared state. If the status is not prepared, the value is 0.

+

pid

+

bigint

+

Thread ID corresponding to the transaction

+

next_xid

+

xid

+

Transaction ID sent from a CN to a DN

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0819.html b/docs/dws/dev/dws_04_0819.html new file mode 100644 index 00000000..8557c663 --- /dev/null +++ b/docs/dws/dev/dws_04_0819.html @@ -0,0 +1,11 @@ + + +

PGXC_SETTINGS

+

PGXC_SETTINGS displays the database running status of each node in the cluster. All columns except node_name are the same as those in the PG_SETTINGS view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0820.html b/docs/dws/dev/dws_04_0820.html new file mode 100644 index 00000000..4a38007c --- /dev/null +++ b/docs/dws/dev/dws_04_0820.html @@ -0,0 +1,229 @@ + + +

PGXC_STAT_ACTIVITY

+

PGXC_STAT_ACTIVITY displays information about the query performed by the current user on all the CNs in the current cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_STAT_ACTIVITY columns

Name

+

Type

+

Description

+

coorname

+

text

+

Name of the CN in the current cluster

+

datid

+

oid

+

OID of the database that the user session connects to in the backend

+

datname

+

name

+

Name of the database that the user session connects to in the backend

+

pid

+

bigint

+

ID of the backend thread

+

usesysid

+

oid

+

OID of the user logging in to the backend

+

usename

+

name

+

Name of the user logging in to the backend

+

application_name

+

text

+

Name of the application connected to the backend

+

client_addr

+

inet

+

IP address of the client connected to the backend. If this column is null, it indicates either that the client is connected via a Unix socket on the server machine or that this is an internal process such as autovacuum.

+

client_hostname

+

text

+

Host name of the connected client, as reported by a reverse DNS lookup of client_addr. This column will only be non-null for IP connections, and only when log_hostname is enabled.

+

client_port

+

integer

+

TCP port number that the client uses for communication with this backend, or -1 if a Unix socket is used

+

backend_start

+

timestamp with time zone

+

Startup time of the backend process, that is, the time when the client connects to the server

+

xact_start

+

timestamp with time zone

+

Time when the current transaction was started, or NULL if no transaction is active. If the current query is the first of its transaction, this column is equal to the query_start column.

+

query_start

+

timestamp with time zone

+

Time when the currently active query was started, or time when the last query was started if state is not active

+

state_change

+

timestamp with time zone

+

Time for the last status change

+

waiting

+

boolean

+

If backend is currently waiting for a lock, the value is true.

+

enqueue

+

text

+
Queuing status of a statement. Its value can be:
  • waiting in global queue: The statement is in the global queue.
  • waiting in respool queue: The statement is in the resource pool queue.
  • waiting in ccn queue: The job is in the CCN queue.
  • Empty or no waiting queue: The statement is running.
+
+

state

+

text

+

Overall state of the backend. Its value can be:

+
  • active: The backend is executing a query.
  • idle: The backend is waiting for a new client command.
  • idle in transaction: The backend is in a transaction, but there is no statement being executed in the transaction.
  • idle in transaction (aborted): The backend is in a transaction, but there are statements failed in the transaction.
  • fastpath function call: The backend is executing a fast-path function.
  • disabled: This state is reported if track_activities is disabled in this backend.
+
NOTE:

Only system administrators can view the session status of their accounts. The state information of other accounts is empty. For example, after user judy is connected to the database, the state information of user joe and the initial user dbadmin in pgxc_stat_activity is empty.

+
SELECT datname, usename, usesysid, state,pid FROM pgxc_stat_activity;
+
 datname  | usename | usesysid | state  |       pid
+----------+---------+----------+--------+-----------------
+ gaussdb | dbadmin     |       10 |        | 139968752121616
+ gaussdb | dbadmin     |       10 |        | 139968903116560
+ db_tpcds | judy    |    16398 | active | 139968391403280
+ gaussdb | dbadmin     |       10 |        | 139968643069712
+ gaussdb | dbadmin     |       10 |        | 139968680818448
+ gaussdb | joe     |    16390 |        | 139968563377936
+(6 rows)
+
+

resource_pool

+

name

+

Resource pool used by the user

+

query_id

+

bigint

+

ID of a query

+

query

+

text

+

Text of this backend's most recent query If state is active, this column shows the running query. In all other states, it shows the last query that was executed.

+

connection_info

+

text

+

A string in JSON format recording the driver type, driver version, driver deployment path, and process owner of the connected database (for details, see connection_info)

+
+
+

Examples

Run the following command to view blocked query statements.

+
1
SELECT datname,usename,state,query FROM PGXC_STAT_ACTIVITY WHERE waiting = true;
+
+ +
+

Check the working status of the snapshot thread.

+
1
SELECT application_name,backend_start,state_change,state,query FROM PGXC_STAT_ACTIVITY WHERE application_name='WDRSnapshot';
+
+ +
+

View the running query statements.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT datname,usename,state,pid FROM PGXC_STAT_ACTIVITY;
+ datname  | usename | state  |       pid
+----------+---------+--------+-----------------
+ gaussdb | Ruby    | active | 140298793514752
+ gaussdb | Ruby    | active | 140298718004992
+ gaussdb | Ruby    | idle   | 140298650908416
+ gaussdb | Ruby    | idle   | 140298625742592
+ gaussdb | dbadmin | active | 140298575406848
+(5 rows)
+
+ +
+

View the number of session connections that have been used by postgres. 1 indicates the number of session connections that have been used by postgres.

+
1
+2
+3
+4
+5
SELECT COUNT(*) FROM PGXC_STAT_ACTIVITY WHERE DATNAME='postgres';
+ count 
+-------
+     1
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0821.html b/docs/dws/dev/dws_04_0821.html new file mode 100644 index 00000000..1be8bd12 --- /dev/null +++ b/docs/dws/dev/dws_04_0821.html @@ -0,0 +1,79 @@ + + +

PGXC_STAT_BAD_BLOCK

+

PGXC_STAT_BAD_BLOCK displays statistics about page or CU verification failures after all nodes in a cluster are started.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_STAT_BAD_BLOCK columns

Name

+

Type

+

Description

+

nodename

+

text

+

Node name

+

databaseid

+

integer

+

Database OID

+

tablespaceid

+

integer

+

Tablespace OID

+

relfilenode

+

integer

+

File object ID

+

forknum

+

integer

+

File type

+

error_count

+

integer

+

Number of verification failures

+

first_time

+

timestamp with time zone

+

Time of the first occurrence

+

last_time

+

timestamp with time zone

+

Time of the latest occurrence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0822.html b/docs/dws/dev/dws_04_0822.html new file mode 100644 index 00000000..009f9a25 --- /dev/null +++ b/docs/dws/dev/dws_04_0822.html @@ -0,0 +1,11 @@ + + +

PGXC_STAT_BGWRITER

+

PGXC_STAT_BGWRITER displays statistics on the background writer of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_BGWRITER view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0823.html b/docs/dws/dev/dws_04_0823.html new file mode 100644 index 00000000..fcad579a --- /dev/null +++ b/docs/dws/dev/dws_04_0823.html @@ -0,0 +1,11 @@ + + +

PGXC_STAT_DATABASE

+

PGXC_STAT_DATABASE displays the database status and statistics of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_DATABASE view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0824.html b/docs/dws/dev/dws_04_0824.html new file mode 100644 index 00000000..09329d62 --- /dev/null +++ b/docs/dws/dev/dws_04_0824.html @@ -0,0 +1,11 @@ + + +

PGXC_STAT_REPLICATION

+

PGXC_STAT_REPLICATION displays the log synchronization status of each node in the cluster. All columns except node_name are the same as those in the PG_STAT_REPLICATION view. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0825.html b/docs/dws/dev/dws_04_0825.html new file mode 100644 index 00000000..0e5764d0 --- /dev/null +++ b/docs/dws/dev/dws_04_0825.html @@ -0,0 +1,14 @@ + + +

PGXC_SQL_COUNT

+

PGXC_SQL_COUNT displays the node-level and user-level statistics for the SQL statements of SELECT, INSERT, UPDATE, DELETE, and MERGE INTO and DDL, DML, and DCL statements of each CN in a cluster in real time, identifies query types with heavy load, and measures the capability of a cluster or a node to perform a specific type of query. You can calculate QPS based on the quantities and response time of the preceding types of SQL statements at certain time points. For example, USER1 SELECT is counted as X1 at T1 and as X2 at T2. The SELECT QPS of the user can be calculated as follows: (X2 – X1)/(T2 – T1). In this way, the system can draw cluster-user-level QPS curve graphs and determine cluster throughput, monitoring changes in the service load of each user. If there are drastic changes, the system can locate the specific statement type (such as SELECT, INSERT, UPDATE, DELETE, and MERGE INTO). You can also observe QPS curves to determine the time points when problems occur and then locate the problems using other tools. The curves provide a basis for optimizing cluster performance and locating problems.

+

Columns in the PGXC_SQL_COUNT view are the same as those in the GS_SQL_COUNT view. For details, see Table 1.

+

If a MERGE INTO statement can be pushed down and a DN receives it, the statement will be counted on the DN and the value of the mergeinto_count column will increment by 1. If the pushdown is not allowed, the DN will receive an UPDATE or INSERT statement. In this case, the update_count or insert_count column will increment by 1.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0826.html b/docs/dws/dev/dws_04_0826.html new file mode 100644 index 00000000..a8770619 --- /dev/null +++ b/docs/dws/dev/dws_04_0826.html @@ -0,0 +1,152 @@ + + +

PGXC_THREAD_WAIT_STATUS

+

PGXC_THREAD_WAIT_STATUS displays all the call layer hierarchy relationship between threads of the SQL statements on all the nodes in a cluster, and the waiting status of the block for each thread, so that you can easily locate the causes of process response failures and similar phenomena.

+

The definitions of PGXC_THREAD_WAIT_STATUS view and PG_THREAD_WAIT_STATUS view are the same, because the essence of the PGXC_THREAD_WAIT_STATUS view is the query summary result of the PG_THREAD_WAIT_STATUS view on each node in the cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_THREAD_WAIT_STATUS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Current node name

+

db_name

+

text

+

Database name

+

thread_name

+

text

+

Thread name

+

query_id

+

bigint

+

Query ID. It is equivalent to debug_query_id.

+

tid

+

bigint

+

Thread ID of the current thread

+

lwtid

+

integer

+

Lightweight thread ID of the current thread

+

ptid

+

integer

+

Parent thread of the streaming thread

+

tlevel

+

integer

+

Level of the streaming thread

+

smpid

+

integer

+

Concurrent thread ID

+

wait_status

+

text

+

Waiting status of the current thread. For details about the waiting status, see Table 2.

+

wait_event

+

text

+

If wait_status is acquire lock, acquire lwlock, or wait io, this column describes the lock, lightweight lock, and I/O information, respectively. If wait_status is not any of the three values, this column is empty.

+
+
+

Example:

+

Assume you run a statement on coordinator1, and no response is returned after a long period of time. In this case, establish another connection to coordinator1 to check the thread status on it.

+
1
+2
+3
+4
+5
 select * from pg_thread_wait_status where query_id > 0;
+  node_name   | db_name  | thread_name  | query_id |       tid       | lwtid | ptid  | tlevel | smpid |     wait_status   |   wait_event   
+--------------+----------+--------------+----------+-----------------+-------+-------+--------+-------+----------------------
+ coordinator1 | gaussdb | gsql         | 20971544 | 140274089064208 | 22579 |       |      0 |     0 | wait node: datanode4 |
+(1 rows)
+
+ +
+

Furthermore, you can view the statement working status on each node in the entire cluster. In the following example, no DNs have threads blocked, and there is a huge amount of data to be read, causing slow execution.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
select * from pgxc_thread_wait_status where query_id=20971544;
+  node_name   | db_name  | thread_name  | query_id |       tid       | lwtid | ptid  | tlevel | smpid |     wait_status   |  wait_event   
+--------------+----------+--------------+----------+-----------------+-------+-------+--------+-------+----------------------
+ datanode1    | gaussdb | coordinator1 | 20971544 | 139902867994384 | 22735 |       |      0 |     0 | wait node: datanode3 |
+ datanode1    | gaussdb | coordinator1 | 20971544 | 139902838634256 | 22970 | 22735 |      5 |     0 | synchronize quit     |
+ datanode1    | gaussdb | coordinator1 | 20971544 | 139902607947536 | 22972 | 22735 |      5 |     1 | synchronize quit     |
+ datanode2    | gaussdb | coordinator1 | 20971544 | 140632156796688 | 22736 |       |      0 |     0 | wait node: datanode3 |
+ datanode2    | gaussdb | coordinator1 | 20971544 | 140632030967568 | 22974 | 22736 |      5 |     0 | synchronize quit     |
+ datanode2    | gaussdb | coordinator1 | 20971544 | 140632081299216 | 22975 | 22736 |      5 |     1 | synchronize quit     |
+ datanode3    | gaussdb | coordinator1 | 20971544 | 140323627988752 | 22737 |       |      0 |     0 | wait node: datanode3 |
+ datanode3    | gaussdb | coordinator1 | 20971544 | 140323523131152 | 22976 | 22737 |      5 |     0 | net flush data       |
+ datanode3    | gaussdb | coordinator1 | 20971544 | 140323548296976 | 22978 | 22737 |      5 |     1 | net flush data
+ datanode4    | gaussdb | coordinator1 | 20971544 | 140103024375568 | 22738 |       |      0 |     0 | wait node: datanode3
+ datanode4    | gaussdb | coordinator1 | 20971544 | 140102919517968 | 22979 | 22738 |      5 |     0 | synchronize quit     |
+ datanode4    | gaussdb | coordinator1 | 20971544 | 140102969849616 | 22980 | 22738 |      5 |     1 | synchronize quit     |
+ coordinator1 | gaussdb | gsql         | 20971544 | 140274089064208 | 22579 |       |      0 |     0 | wait node: datanode4  |
+(13 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0827.html b/docs/dws/dev/dws_04_0827.html new file mode 100644 index 00000000..1a8d3cd1 --- /dev/null +++ b/docs/dws/dev/dws_04_0827.html @@ -0,0 +1,45 @@ + + +

PGXC_TOTAL_MEMORY_DETAIL

+

PGXC_TOTAL_MEMORY_DETAIL displays the memory usage in the cluster.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PGXC_TOTAL_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

nodename

+

text

+

Node name

+

memorytype

+

text

+

Memory name, which can be set to any of the following values:

+
  • max_process_memory: memory used by a GaussDB(DWS) cluster instance
  • process_used_memory: memory used by a GaussDB(DWS) process
  • max_dynamic_memory: maximum dynamic memory
  • dynamic_used_memory: used dynamic memory
  • dynamic_peak_memory: dynamic peak value of the memory
  • dynamic_used_shrctx: maximum dynamic shared memory context
  • dynamic_peak_shrctx: dynamic peak value of the shared memory context
  • max_shared_memory: maximum shared memory
  • shared_used_memory: used shared memory
  • max_cstore_memory: maximum memory allowed for column store
  • cstore_used_memory: memory used for column store
  • max_sctpcomm_memory: maximum memory allowed for the communication library
  • sctpcomm_used_memory: memory used for the communication library
  • sctpcomm_peak_memory: memory peak of the communication library
  • other_used_memory: other used memory
  • gpu_max_dynamic_memory: maximum GPU memory
  • gpu_dynamic_used_memory: sum of the available GPU memory and temporary GPU memory
  • gpu_dynamic_peak_memory: maximum memory used for GPU
  • pooler_conn_memory: memory used for pooler connections
  • pooler_freeconn_memory: memory used for idle pooler connections
  • storage_compress_memory: memory used for column-store compression and decompression
  • udf_reserved_memory: memory reserved for the UDF Worker process
  • mmap_used_memory: memory used for mmap
+

memorymbytes

+

integer

+

Size of the used memory (MB)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0828.html b/docs/dws/dev/dws_04_0828.html new file mode 100644 index 00000000..477f59c5 --- /dev/null +++ b/docs/dws/dev/dws_04_0828.html @@ -0,0 +1,79 @@ + + +

PGXC_TOTAL_SCHEMA_INFO

+

PGXC_TOTAL_SCHEMA_INFO displays the schema space information of all instances in the cluster, providing visibility into the schema space usage of each instance. This view can be queried only on CNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_TOTAL_SCHEMA_INFO columns

Name

+

Type

+

Description

+

schemaname

+

text

+

Schema name

+

schemaid

+

oid

+

Schema OID

+

databasename

+

text

+

Database name

+

databaseid

+

oid

+

Database OID

+

nodename

+

text

+

Instance name

+

nodegroup

+

text

+

Name of the node group

+

usedspace

+

bigint

+

Size of used space

+

permspace

+

bigint

+

Upper limit of the space

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0829.html b/docs/dws/dev/dws_04_0829.html new file mode 100644 index 00000000..3dfff8e7 --- /dev/null +++ b/docs/dws/dev/dws_04_0829.html @@ -0,0 +1,72 @@ + + +

PGXC_TOTAL_SCHEMA_INFO_ANALYZE

+

PGXC_TOTAL_SCHEMA_INFO_ANALYZE displays the overall schema space information of the cluster, including the total cluster space, average space of instances, skew ratio, maximum space of a single instance, minimum space of a single instance, and names of the instances with the maximum space and minimum space. It provides visibility into the schema space usage of the entire cluster. This view can be queried only on CNs.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_TOTAL_SCHEMA_INFO_ANALYZE columns

Name

+

Type

+

Description

+

schemaname

+

text

+

Schema name

+

databasename

+

text

+

Database name

+

nodegroup

+

text

+

Name of the node group

+

total_value

+

bigint

+

Total cluster space in the current schema

+

avg_value

+

bigint

+

Average space of instances in the current schema

+

skew_percent

+

integer

+

Skew ratio

+

extend_info

+

text

+

Extended information, including the maximum space of a single instance, minimum space of a single instance, and names of the instances with the maximum sapce and minimum space

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0830.html b/docs/dws/dev/dws_04_0830.html new file mode 100644 index 00000000..9898c1f6 --- /dev/null +++ b/docs/dws/dev/dws_04_0830.html @@ -0,0 +1,79 @@ + + +

PGXC_USER_TRANSACTION

+

PGXC_USER_TRANSACTION provides transaction information about users on all CNs. It is accessible only to users with system administrator rights. This view is valid only when the real-time resource monitoring function is enabled, that is, when enable_resource_track is on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_USER_TRANSACTION columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

usename

+

name

+

Username

+

commit_counter

+

bigint

+

Number of the commit times

+

rollback_counter

+

bigint

+

Number of rollbacks

+

resp_min

+

bigint

+

Minimum response time

+

resp_max

+

bigint

+

Maximum response time

+

resp_avg

+

bigint

+

Average response time

+

resp_total

+

bigint

+

Total response time

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0831.html b/docs/dws/dev/dws_04_0831.html new file mode 100644 index 00000000..626f2580 --- /dev/null +++ b/docs/dws/dev/dws_04_0831.html @@ -0,0 +1,100 @@ + + +

PGXC_VARIABLE_INFO

+

PGXC_VARIABLE_INFO displays information about transaction IDs and OIDs of all nodes in a cluster.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_VARIABLE_INFO columns

Name

+

Type

+

Description

+

node_name

+

text

+

Node name

+

nextOid

+

oid

+

OID generated next time for a node

+

nextXid

+

xid

+

Transaction ID generated next time for a node

+

oldestXid

+

xid

+

Oldest transaction ID for a node

+

xidVacLimit

+

xid

+

Critical point that triggers forcible autovacuum

+

oldestXidDB

+

oid

+

OID of the database that has the minimum datafrozenxid on a node

+

lastExtendCSNLogpage

+

integer

+

Number of the last extended csnlog page

+

startExtendCSNLogpage

+

integer

+

Number of the page from which the csnlog extending starts

+

nextCommitSeqNo

+

integer

+

CSN generated next time for a node

+

latestCompletedXid

+

xid

+

Latest transaction ID on a node after the transaction commission or rollback

+

startupMaxXid

+

xid

+

Last transaction ID before a node is powered off

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0832.html b/docs/dws/dev/dws_04_0832.html new file mode 100644 index 00000000..83b01113 --- /dev/null +++ b/docs/dws/dev/dws_04_0832.html @@ -0,0 +1,11 @@ + + +

PGXC_WAIT_EVENTS

+

PGXC_WAIT_EVENTS displays statistics on the waiting status and events of each node in the cluster. The content is the same as that displayed in GS_WAIT_EVENTS. This view is accessible only to users with system administrators rights.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0836.html b/docs/dws/dev/dws_04_0836.html new file mode 100644 index 00000000..5d2b3280 --- /dev/null +++ b/docs/dws/dev/dws_04_0836.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_OPERATOR_HISTORY

+

PGXC_WLM_OPERATOR_HISTORY displays the operator information of completed jobs executed on all CNs. This view is used by Database Manager to query data from a database. Data in the database is cleared every 3 minutes.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see Table 1.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0837.html b/docs/dws/dev/dws_04_0837.html new file mode 100644 index 00000000..8c02d99d --- /dev/null +++ b/docs/dws/dev/dws_04_0837.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_OPERATOR_INFO

+

PGXC_WLM_OPERATOR_INFO displays the operator information of completed jobs executed on CNs. The data in this view is obtained from GS_WLM_OPERATOR_INFO.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see Table 1.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0838.html b/docs/dws/dev/dws_04_0838.html new file mode 100644 index 00000000..b8c1d761 --- /dev/null +++ b/docs/dws/dev/dws_04_0838.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_OPERATOR_STATISTICS

+

PGXC_WLM_OPERATOR_STATISTICS displays the operator information of jobs being executed on CNs.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see GS_WLM_OPERATOR_STATISTICS columns.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0839.html b/docs/dws/dev/dws_04_0839.html new file mode 100644 index 00000000..8667736c --- /dev/null +++ b/docs/dws/dev/dws_04_0839.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_SESSION_INFO

+

PGXC_WLM_SESSION_INFO displays load management information for completed jobs executed on all CNs. The data in this view is obtained from GS_WLM_SESSION_INFO.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see Table 1.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0840.html b/docs/dws/dev/dws_04_0840.html new file mode 100644 index 00000000..9f3e0b8a --- /dev/null +++ b/docs/dws/dev/dws_04_0840.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_SESSION_HISTORY

+

PGXC_WLM_SESSION_HISTORY displays load management information for completed jobs executed on all CNs. This view is used by Data Manager to query data from a database. Data in the database is cleared every 3 minutes. For details, see GS_WLM_SESSION_HISTORY.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see Table 1.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0841.html b/docs/dws/dev/dws_04_0841.html new file mode 100644 index 00000000..40ea2ccf --- /dev/null +++ b/docs/dws/dev/dws_04_0841.html @@ -0,0 +1,12 @@ + + +

PGXC_WLM_SESSION_STATISTICS

+

PGXC_WLM_SESSION_STATISTICS displays load management information about jobs that are being executed on CNs.

+

This view is accessible only to users with system administrators rights. For details about columns in the view, see Table 1.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0842.html b/docs/dws/dev/dws_04_0842.html new file mode 100644 index 00000000..56c04cfd --- /dev/null +++ b/docs/dws/dev/dws_04_0842.html @@ -0,0 +1,129 @@ + + +

PGXC_WLM_WORKLOAD_RECORDS

+

PGXC_WLM_WORKLOAD_RECORDS displays the status of job executed by the current user on CNs. It is accessible only to users with system administrator rights. This view is available only when enable_dynamic_workload is set to on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_WLM_WORKLOAD_RECORDS columns

Name

+

Type

+

Description

+

node_name

+

text

+

Name of the CN where the job is executed

+

thread_id

+

bigint

+

ID of the backend thread

+

processid

+

integer

+

lwpid of a thread

+

timestamp

+

bigint

+

Time when a statement starts to be executed

+

username

+

name

+

Name of the user logging in to the backend

+

memory

+

integer

+

Memory required by a statement

+

active_points

+

integer

+

Number of resources consumed by a statement in a resource pool

+

max_points

+

integer

+

Maximum number of resources in a resource pool

+

priority

+

integer

+

Priority of a job

+

resource_pool

+

text

+

Resource pool to which a job belongs

+

status

+

text

+

Job execution status. Its value can be:

+

pending

+

running

+

finished

+

aborted

+

unknown

+

control_group

+

text

+

Cgroups used by a job

+

enqueue

+

text

+

Queue that a job is in. Its value can be:

+

GLOBAL: global queue

+

RESPOOL: resource pool queue

+

ACTIVE: not in a queue

+

query

+

text

+

Statement that is being executed

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0843.html b/docs/dws/dev/dws_04_0843.html new file mode 100644 index 00000000..81aea248 --- /dev/null +++ b/docs/dws/dev/dws_04_0843.html @@ -0,0 +1,86 @@ + + +

PGXC_WORKLOAD_SQL_COUNT

+

PGXC_WORKLOAD_SQL_COUNT displays statistics on the number of SQL statements executed in workload Cgroups on all CNs in a cluster, including the number of SELECT, UPDATE, INSERT, and DELETE statements and the number of DDL, DML, and DCL statements. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_WORKLOAD_SQL_COUNT columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

workload

+

name

+

Workload Cgroup name

+

select_count

+

bigint

+

Number of SELECT statements

+

update_count

+

bigint

+

Number of UPDATE statements

+

insert_count

+

bigint

+

Number of INSERT statements

+

delete_count

+

bigint

+

Number of DELETE statements

+

ddl_count

+

bigint

+

Number of DDL statements

+

dml_count

+

bigint

+

Number of DML statements

+

dcl_count

+

bigint

+

Number of DCL statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0844.html b/docs/dws/dev/dws_04_0844.html new file mode 100644 index 00000000..bcb42fd2 --- /dev/null +++ b/docs/dws/dev/dws_04_0844.html @@ -0,0 +1,149 @@ + + +

PGXC_WORKLOAD_SQL_ELAPSE_TIME

+

PGXC_WORKLOAD_SQL_ELAPSE_TIME displays statistics on the response time of SQL statements in workload Cgroups on all CNs in a cluster, including the maximum, minimum, average, and total response time of SELECT, UPDATE, INSERT, and DELETE statements. The unit is microsecond. It is accessible only to users with system administrator rights.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_WORKLOAD_SQL_ELAPSE_TIME columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

workload

+

name

+

Workload Cgroup name

+

total_select_elapse

+

bigint

+

Total response time of SELECT statements

+

max_select_elapse

+

bigint

+

Maximum response time of SELECT statements

+

min_select_elapse

+

bigint

+

Minimum response time of SELECT statements

+

avg_select_elapse

+

bigint

+

Average response time of SELECT statements

+

total_update_elapse

+

bigint

+

Total response time of UPDATE statements

+

max_update_elapse

+

bigint

+

Maximum response time of UPDATE statements

+

min_update_elapse

+

bigint

+

Minimum response time of UPDATE statements

+

avg_update_elapse

+

bigint

+

Average response time of UPDATE statements

+

total_insert_elapse

+

bigint

+

Total response time of INSERT statements

+

max_insert_elapse

+

bigint

+

Maximum response time of INSERT statements

+

min_insert_elapse

+

bigint

+

Minimum response time of INSERT statements

+

avg_insert_elapse

+

bigint

+

Average response time of INSERT statements

+

total_delete_elapse

+

bigint

+

Total response time of DELETE statements

+

max_delete_elapse

+

bigint

+

Maximum response time of DELETE statements

+

min_delete_elapse

+

bigint

+

Minimum response time of DELETE statements

+

avg_delete_elapse

+

bigint

+

Average response time of DELETE statements

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0845.html b/docs/dws/dev/dws_04_0845.html new file mode 100644 index 00000000..2eaa5639 --- /dev/null +++ b/docs/dws/dev/dws_04_0845.html @@ -0,0 +1,79 @@ + + +

PGXC_WORKLOAD_TRANSACTION

+

PGXC_WORKLOAD_TRANSACTION provides transaction information about workload Cgroups on all CNs. It is accessible only to users with system administrator rights. This view is valid only when the real-time resource monitoring function is enabled, that is, when enable_resource_track is on.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PGXC_WORKLOAD_TRANSACTION columns

Name

+

Type

+

Description

+

node_name

+

name

+

Node name

+

workload

+

name

+

Workload Cgroup name

+

commit_counter

+

bigint

+

Number of the commit times

+

rollback_counter

+

bigint

+

Number of rollbacks

+

resp_min

+

bigint

+

Minimum response time (unit: μs)

+

resp_max

+

bigint

+

Maximum response time (unit: μs)

+

resp_avg

+

bigint

+

Average response time (unit: μs)

+

resp_total

+

bigint

+

Total response time (unit: μs)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0846.html b/docs/dws/dev/dws_04_0846.html new file mode 100644 index 00000000..7919df7b --- /dev/null +++ b/docs/dws/dev/dws_04_0846.html @@ -0,0 +1,88 @@ + + +

PLAN_TABLE

+

PLAN_TABLE displays the plan information collected by EXPLAIN PLAN. Plan information is in a session-level life cycle. After the session exits, the data will be deleted. Data is isolated between sessions and between users.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PLAN_TABLE columns

Name

+

Type

+

Description

+

statement_id

+

varchar2(30)

+

Query tag specified by a user

+

plan_id

+

bigint

+

ID of a plan to be queried

+

id

+

int

+

ID of each operator in a generated plan

+

operation

+

varchar2(30)

+

Operation description of an operator in a plan

+

options

+

varchar2(255)

+

Operation parameters

+

object_name

+

name

+

Name of an operated object. It is defined by users, not the object alias used in the query.

+

object_type

+

varchar2(30)

+

Object type

+

object_owner

+

name

+

User-defined schema to which an object belongs

+

projection

+

varchar2(4000)

+

Returned column information

+
+
+
  • A valid object_type value consists of a relkind type defined in PG_CLASS (TABLE ordinary table, INDEX, SEQUENCE, VIEW, FOREIGN TABLE, COMPOSITE TYPE, or TOASTVALUE TOAST table) and the rtekind type used in the plan (SUBQUERY, JOIN, FUNCTION, VALUES, CTE, or REMOTE_QUERY).
  • For RangeTableEntry (RTE), object_owner is the object description used in the plan. Non-user-defined objects do not have object_owner.
  • Information in the statement_id, object_name, object_owner, and projection columns is stored in letter cases specified by users and information in other columns is stored in uppercase.
  • PLAN_TABLE supports only SELECT and DELETE and does not support other DML operations.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0847.html b/docs/dws/dev/dws_04_0847.html new file mode 100644 index 00000000..e90c7bf7 --- /dev/null +++ b/docs/dws/dev/dws_04_0847.html @@ -0,0 +1,102 @@ + + +

PLAN_TABLE_DATA

+

PLAN_TABLE_DATA displays the plan information collected by EXPLAIN PLAN. Different from the PLAN_TABLE view, the system catalog PLAN_TABLE_DATA stores the plan information collected by all sessions and users.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PLAN_TABLE columns

Name

+

Type

+

Description

+

session_id

+

text

+

Session that inserts the data. Its value consists of a service thread start timestamp and a service thread ID. Values are constrained by NOT NULL.

+

user_id

+

oid

+

User who inserts the data. Values are constrained by NOT NULL.

+

statement_id

+

varchar2(30)

+

Query tag specified by a user

+

plan_id

+

bigint

+

ID of a plan to be queried

+

id

+

int

+

Node ID in a plan

+

operation

+

varchar2(30)

+

Operation description

+

options

+

varchar2(255)

+

Operation parameters

+

object_name

+

name

+

Name of an operated object. It is defined by users.

+

object_type

+

varchar2(30)

+

Object type

+

object_owner

+

name

+

User-defined schema to which an object belongs

+

projection

+

varchar2(4000)

+

Returned column information

+
+
+
  • PLAN_TABLE_DATA records data of all users and sessions on the current node. Only administrators can access all the data. Common users can view only their own data in the PLAN_TABLE view.
  • Data of inactive (exited) sessions is cleaned from PLAN_TABLE_DATA by gs_clean after being stored in this system catalog for a certain period of time (5 minutes by default). You can also manually run gs_clean -C to delete inactive session data from the table..
  • Data is automatically inserted into PLAN_TABLE_DATA after EXPLAIN PLAN is executed. Therefore, do not manually insert data into or update data in PLAN_TABLE_DATA. Otherwise, data in PLAN_TABLE_DATA may be disordered. To delete data from PLAN_TABLE_DATA, you are advised to use the PLAN_TABLE view.
  • Information in the statement_id, object_name, object_owner, and projection columns is stored in letter cases specified by users and information in other columns is stored in uppercase.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0848.html b/docs/dws/dev/dws_04_0848.html new file mode 100644 index 00000000..bc6c296d --- /dev/null +++ b/docs/dws/dev/dws_04_0848.html @@ -0,0 +1,114 @@ + + +

PV_FILE_STAT

+

By collecting statistics about the data file I/Os, PV_FILE_STAT displays the I/O performance of the data to detect the performance problems, such as abnormal I/O operations.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_FILE_STAT columns

Name

+

Type

+

Description

+

filenum

+

oid

+

File ID

+

dbid

+

oid

+

Database ID

+

spcid

+

oid

+

Tablespace ID

+

phyrds

+

bigint

+

Number of times of reading physical files

+

phywrts

+

bigint

+

Number of times of writing into physical files

+

phyblkrd

+

bigint

+

Number of times of reading physical file blocks

+

phyblkwrt

+

bigint

+

Number of times of writing into physical file blocks

+

readtim

+

bigint

+

Total duration of reading files. The unit is microsecond.

+

writetim

+

bigint

+

Total duration of writing files. The unit is microsecond.

+

avgiotim

+

bigint

+

Average duration of reading and writing files. The unit is microsecond.

+

lstiotim

+

bigint

+

Duration of the last file reading. The unit is microsecond.

+

miniotim

+

bigint

+

Minimum duration of reading and writing files. The unit is microsecond.

+

maxiowtm

+

bigint

+

Maximum duration of reading and writing files. The unit is microsecond.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0849.html b/docs/dws/dev/dws_04_0849.html new file mode 100644 index 00000000..db6f7731 --- /dev/null +++ b/docs/dws/dev/dws_04_0849.html @@ -0,0 +1,46 @@ + + +

PV_INSTANCE_TIME

+

PV_INSTANCE_TIME collects statistics on the running time of processes and the time consumed in each execution phase, in microseconds.

+

PV_INSTANCE_TIME records time consumption information of the current node. The time consumption information is classified into the following types:

+
  • DB_TIME: effective time spent by jobs in multi-core scenarios
  • CPU_TIME: CPU time spent
  • EXECUTION_TIME: time spent within executors
  • PARSE_TIME: time spent on parsing SQL statements
  • PLAN_TIME: time spent on generating plans
  • REWRITE_TIME: time spent on rewriting SQL statements
  • PL_EXECUTION_TIME: execution time of the PL/pgSQL stored procedure
  • PL_COMPILATION_TIME: compilation time of the PL/pgSQL stored procedure
  • NET_SEND_TIME: time spent on the network
  • DATA_IO_TIME: I/O time spent
+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PV_INSTANCE_TIME columns

Name

+

Type

+

Description

+

stat_id

+

integer

+

Type ID

+

stat_name

+

text

+

Running time type name

+

value

+

bigint

+

Running time value

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0850.html b/docs/dws/dev/dws_04_0850.html new file mode 100644 index 00000000..40412760 --- /dev/null +++ b/docs/dws/dev/dws_04_0850.html @@ -0,0 +1,58 @@ + + +

PV_OS_RUN_INFO

+

PV_OS_RUN_INFO displays the running status of the current operating system.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_OS_RUN_INFO columns

Name

+

Type

+

Description

+

id

+

integer

+

ID

+

name

+

text

+

Name of the OS running status

+

value

+

numeric

+

Value of the OS running status

+

comments

+

text

+

Remarks of the OS running status

+

cumulative

+

boolean

+

Whether the value of the OS running status is cumulative

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0851.html b/docs/dws/dev/dws_04_0851.html new file mode 100644 index 00000000..4a9db76b --- /dev/null +++ b/docs/dws/dev/dws_04_0851.html @@ -0,0 +1,51 @@ + + +

PV_SESSION_MEMORY

+

PV_SESSION_MEMORY displays statistics about memory usage at the session level in the unit of MB, including all the memory allocated to Postgres and Stream threads on DNs for jobs currently executed by users.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_SESSION_MEMORY columns

Name

+

Type

+

Description

+

sessid

+

text

+

Thread start time and ID

+

init_mem

+

integer

+

Memory allocated to the currently executed task before the task enters the executor, in MB

+

used_mem

+

integer

+

Memory allocated to the currently executed task, in MB

+

peak_mem

+

integer

+

Peak memory allocated to the currently executed task, in MB

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0852.html b/docs/dws/dev/dws_04_0852.html new file mode 100644 index 00000000..e96fc1e7 --- /dev/null +++ b/docs/dws/dev/dws_04_0852.html @@ -0,0 +1,134 @@ + + +

PV_SESSION_MEMORY_DETAIL

+

PV_SESSION_MEMORY_DETAIL displays statistics about thread memory usage by memory context.

+

The memory context TempSmallContextGroup collects information about all memory contexts whose value in the totalsize column is less than 8192 bytes in the current thread, and the number of the collected memory contexts is recorded in the usedsize column. Therefore, the totalsize and freesize columns for TempSmallContextGroup in the view display the corresponding information about all the memory contexts whose value in the totalsize column is less than 8192 bytes in the current thread, and the usedsize column displays the number of these memory contexts.

+

You can run the SELECT * FROM pv_session_memctx_detail (threadid,''); statement to record information about all memory contexts of a thread into the threadid_timestamp.log file in the /tmp/dumpmem directory. threadid can be obtained from the following table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_SESSION_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

sessid

+

text

+

Thread start time+thread ID (string: timestamp.threadid)

+

sesstype

+

text

+

Thread name

+

contextname

+

text

+

Name of the memory context

+

level

+

smallint

+

Hierarchy of the memory context

+

parent

+

text

+

Name of the parent memory context

+

totalsize

+

bigint

+

Total size of the memory context, in bytes

+

freesize

+

bigint

+

Total size of released memory in the memory context, in bytes

+

usedsize

+

bigint

+

Size of used memory in the memory context, in bytes. For TempSmallContextGroup, this parameter specifies the number of collected memory contexts.

+
+
+

Examples

Query the usage of all MemoryContexts on the current node.

+

Locate the thread in which the MemoryContext is created and used based on sessid. Check whether the memory usage meets the expectation based on totalsize, freesize, and usedsize to see whether memory leakage may occur.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
SELECT * FROM PV_SESSION_MEMORY_DETAIL order by totalsize desc;
+           sessid           |        sesstype         |                 contextname                 | level |            parent            | totalsize | freesize | usedsize
+----------------------------+-------------------------+---------------------------------------------+-------+------------------------------+-----------+----------+----------
+ 0.139975915622720          | postmaster              | gs_signal                                   |     1 | TopMemoryContext             |  17209904 |  8081136 |  9128768
+ 1667462258.139973631031040 | postgres                | SRF multi-call context                      |     5 | FunctionScan_139973631031040 |   1725504 |     3168 |  1722336
+ 1667461280.139973666686720 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   284456 |  1188088
+ 1667450443.139973877479168 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   356088 |  1116456
+ 1667462258.139973631031040 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   128216 |  1344328
+ 1667461250.139973915236096 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   226352 |  1246192
+ 1667450439.139974010144512 | WLMarbiter              | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   386736 |  1085808
+ 1667450439.139974151726848 | WDRSnapshot             | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   159720 |  1312824
+ 1667450439.139974026925824 | WLMmonitor              | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   297976 |  1174568
+ 1667451036.139973746386688 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   208064 |  1264480
+ 1667461250.139973950891776 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   270016 |  1202528
+ 1667450439.139974076212992 | WLMCalSpaceInfo         | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   393952 |  1078592
+ 1667450439.139974092994304 | WLMCollectWorker        | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |    94848 |  1377696
+ 1667461254.139973971343104 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   338544 |  1134000
+ 1667461280.139973822945024 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   284456 |  1188088
+ 1667450439.139974202070784 | JobScheduler            | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   216728 |  1255816
+ 1667450454.139973860697856 | postgres                | CacheMemoryContext                          |     1 | TopMemoryContext             |   1472544 |   388384 |  1084160
+ 0.139975915622720          | postmaster              | Postmaster                                  |     1 | TopMemoryContext             |   1004288 |    88792 |   915496
+ 1667450439.139974218852096 | AutoVacLauncher         | CacheMemoryContext                          |     1 | TopMemoryContext             |    948256 |   183488 |   764768
+ 1667461250.139973915236096 | postgres                | TempSmallContextGroup                       |     0 |                              |    584448 |   148032 |      119
+ 1667462258.139973631031040 | postgres                | TempSmallContextGroup                       |     0 |                              |    579712 |   162128 |      123
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0853.html b/docs/dws/dev/dws_04_0853.html new file mode 100644 index 00000000..6cf30d30 --- /dev/null +++ b/docs/dws/dev/dws_04_0853.html @@ -0,0 +1,58 @@ + + +

PV_SESSION_STAT

+

PV_SESSION_STAT displays session state statistics based on session threads or the AutoVacuum thread.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_SESSION_STAT columns

Name

+

Type

+

Description

+

sessid

+

text

+

Thread ID and start time

+

statid

+

integer

+

Statistics ID

+

statname

+

text

+

Name of the statistics session

+

statunit

+

text

+

Unit of the statistics session

+

value

+

bigint

+

Value of the statistics session

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0854.html b/docs/dws/dev/dws_04_0854.html new file mode 100644 index 00000000..6a16674b --- /dev/null +++ b/docs/dws/dev/dws_04_0854.html @@ -0,0 +1,51 @@ + + +

PV_SESSION_TIME

+

PV_SESSION_TIME displays statistics about the running time of session threads and time consumed in each execution phase, in microseconds.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_SESSION_TIME columns

Name

+

Type

+

Description

+

sessid

+

text

+

Thread ID and start time

+

stat_id

+

integer

+

Statistics ID

+

stat_name

+

text

+

Running time type name

+

value

+

bigint

+

Running time value

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0855.html b/docs/dws/dev/dws_04_0855.html new file mode 100644 index 00000000..9065afdc --- /dev/null +++ b/docs/dws/dev/dws_04_0855.html @@ -0,0 +1,45 @@ + + +

PV_TOTAL_MEMORY_DETAIL

+

PV_TOTAL_MEMORY_DETAIL displays statistics about memory usage of the current database node in the unit of MB.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 PV_TOTAL_MEMORY_DETAIL columns

Name

+

Type

+

Description

+

nodename

+

text

+

Node name

+

memorytype

+

text

+

Memory type. Its value can be:

+
  • max_process_memory: memory used by a GaussDB(DWS) cluster instance
  • process_used_memory: memory used by a GaussDB(DWS) process
  • max_dynamic_memory: maximum dynamic memory
  • dynamic_used_memory: used dynamic memory
  • dynamic_peak_memory: dynamic peak value of the memory
  • dynamic_used_shrctx: maximum dynamic shared memory context
  • dynamic_peak_shrctx: dynamic peak value of the shared memory context
  • max_shared_memory: maximum shared memory
  • shared_used_memory: used shared memory
  • max_cstore_memory: maximum memory allowed for column store
  • cstore_used_memory: memory used for column store
  • max_sctpcomm_memory: maximum memory allowed for the communication library
  • sctpcomm_used_memory: memory used for the communication library
  • sctpcomm_peak_memory: memory peak of the communication library
  • other_used_memory: other used memory
  • gpu_max_dynamic_memory: maximum GPU memory
  • gpu_dynamic_used_memory: sum of the available GPU memory and temporary GPU memory
  • gpu_dynamic_peak_memory: maximum memory used for GPU
  • pooler_conn_memory: memory used for pooler connections
  • pooler_freeconn_memory: memory used for idle pooler connections
  • storage_compress_memory: memory used for column-store compression and decompression
  • udf_reserved_memory: memory reserved for the UDF Worker process
  • mmap_used_memory: memory used for mmap
+

memorymbytes

+

integer

+

Size of allocated memory-typed memory

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0856.html b/docs/dws/dev/dws_04_0856.html new file mode 100644 index 00000000..13098894 --- /dev/null +++ b/docs/dws/dev/dws_04_0856.html @@ -0,0 +1,72 @@ + + +

PV_REDO_STAT

+

PV_REDO_STAT displays statistics on redoing Xlogs on the current node.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PV_REDO_STAT columns

Name

+

Type

+

Description

+

phywrts

+

bigint

+

Number of physical writes

+

phyblkwrt

+

bigint

+

Number of physical write blocks

+

writetim

+

bigint

+

Time consumed by physical writes

+

avgiotim

+

bigint

+

Average time for each write

+

lstiotim

+

bigint

+

Last write time

+

miniotim

+

bigint

+

Minimum write time

+

maxiowtm

+

bigint

+

Maximum write time

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0857.html b/docs/dws/dev/dws_04_0857.html new file mode 100644 index 00000000..229c3c7b --- /dev/null +++ b/docs/dws/dev/dws_04_0857.html @@ -0,0 +1,107 @@ + + +

REDACTION_COLUMNS

+

REDACTION_COLUMNS displays information about all redaction columns in the current database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 REDACTION_COLUMNS columns

Name

+

Type

+

Description

+

object_owner

+

name

+

Owner of the object to be redacted.

+

object_name

+

name

+

Redacted object name

+

column_name

+

name

+

Redacted column name

+

function_type

+

integer

+

Redaction type

+

function_parameters

+

text

+

Parameter used when the redaction type is partial (reserved)

+

regexp_pattern

+

text

+

Pattern string when the redaction type is regexp (reserved)

+

regexp_replace_string

+

text

+

Replacement string when the redaction type is regexp (reserved)

+

regexp_position

+

integer

+

Start and end replacement positions when the redaction type is regexp (reserved)

+

regexp_occurrence

+

integer

+

Replacement times when the redaction type is regexp (reserved)

+

regexp_match_parameter

+

text

+

Regular control parameter used when the redaction type is regexp (reserved)

+

function_info

+

text

+

Redaction function information

+

column_description

+

text

+

Description of the redacted column

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0858.html b/docs/dws/dev/dws_04_0858.html new file mode 100644 index 00000000..04c0651c --- /dev/null +++ b/docs/dws/dev/dws_04_0858.html @@ -0,0 +1,65 @@ + + +

REDACTION_POLICIES

+

REDACTION_POLICIES displays information about all redaction objects in the current database.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 REDACTION_POLICIES columns

Name

+

Type

+

Description

+

object_owner

+

name

+

Owner of the object to be redacted.

+

object_name

+

name

+

Redacted object name

+

policy_name

+

name

+

Name of the redact policy

+

expression

+

text

+

Policy effective expression (for users)

+

enable

+

boolean

+

Policy status (enabled or disabled)

+

policy_description

+

text

+

Description of a policy

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0859.html b/docs/dws/dev/dws_04_0859.html new file mode 100644 index 00000000..d876f720 --- /dev/null +++ b/docs/dws/dev/dws_04_0859.html @@ -0,0 +1,51 @@ + + +

USER_COL_COMMENTS

+

USER_COL_COMMENTS displays the column comments of the table accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_COL_COMMENTS columns

Name

+

Type

+

Description

+

column_name

+

character varying(64)

+

Column name

+

table_name

+

character varying(64)

+

Table name

+

owner

+

character varying(64)

+

Table owner

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0860.html b/docs/dws/dev/dws_04_0860.html new file mode 100644 index 00000000..52b552c6 --- /dev/null +++ b/docs/dws/dev/dws_04_0860.html @@ -0,0 +1,59 @@ + + +

USER_CONSTRAINTS

+

USER_CONSTRAINTS displays the table constraint information accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_CONSTRAINTS columns

Name

+

Type

+

Description

+

constraint_name

+

vcharacter varying(64)

+

Constraint name

+

constraint_type

+

text

+

Constraint type

+
  • C: Check constraint
  • F: Foreign key constraint
  • P: Primary key constraint
  • U: Unique constraint
+

table_name

+

character varying(64)

+

Name of constraint-related table

+

index_owner

+

character varying(64)

+

Owner of constraint-related index (only for the unique constraint and primary key constraint)

+

index_name

+

character varying(64)

+

Name of constraint-related index (only for the unique constraint and primary key constraint)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0861.html b/docs/dws/dev/dws_04_0861.html new file mode 100644 index 00000000..373e661c --- /dev/null +++ b/docs/dws/dev/dws_04_0861.html @@ -0,0 +1,51 @@ + + +

USER_CONS_COLUMNS

+

USER_CONSTRAINTS displays the information about constraint columns of the tables accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_CONS_COLUMNS columns

Name

+

Type

+

Description

+

table_name

+

character varying(64)

+

Name of constraint-related table

+

column_name

+

character varying(64)

+

Name of constraint-related column

+

constraint_name

+

character varying(64)

+

Constraint name

+

position

+

smallint

+

Position of the column in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0862.html b/docs/dws/dev/dws_04_0862.html new file mode 100644 index 00000000..8da2d0d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0862.html @@ -0,0 +1,65 @@ + + +

USER_INDEXES

+

USER_INDEXES displays index information in the current schema.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_INDEXES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_name

+

character varying(64)

+

Table name for the index

+

uniqueness

+

text

+

Whether the index is a unique index

+

generated

+

character varying(1)

+

Whether the index name is generated by the system

+

partitioned

+

character(3)

+

Whether the index has the property of the partition table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0863.html b/docs/dws/dev/dws_04_0863.html new file mode 100644 index 00000000..d395ee09 --- /dev/null +++ b/docs/dws/dev/dws_04_0863.html @@ -0,0 +1,65 @@ + + +

USER_IND_COLUMNS

+

USER_IND_COLUMNS displays column information about all indexes accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_IND_COLUMNS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

name

+

Column name

+

column_position

+

smallint

+

Position of column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0864.html b/docs/dws/dev/dws_04_0864.html new file mode 100644 index 00000000..c23ce27d --- /dev/null +++ b/docs/dws/dev/dws_04_0864.html @@ -0,0 +1,65 @@ + + +

USER_IND_EXPRESSIONS

+

USER_IND_EXPRESSIONS displays information about the function-based expression index accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_IND_EXPRESSIONS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Index owner

+

index_name

+

character varying(64)

+

Index name

+

table_owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_expression

+

text

+

Function-based index expression of a specified column

+

column_position

+

smallint

+

Position of column in the index

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0865.html b/docs/dws/dev/dws_04_0865.html new file mode 100644 index 00000000..a5718d15 --- /dev/null +++ b/docs/dws/dev/dws_04_0865.html @@ -0,0 +1,72 @@ + + +

USER_IND_PARTITIONS

+

USER_IND_PARTITIONS displays information about index partitions accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_IND_PARTITIONS columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Name of the owner of the partitioned table index to which the index partition belongs

+

schema

+

character varying(64)

+

Schema of the partitioned table index to which the index partition belongs

+

index_name

+

character varying(64)

+

Name of the partitioned table index to which the index partition belongs

+

partition_name

+

character varying(64)

+

Name of the index partition

+

index_partition_usable

+

boolean

+

Whether the index partition is available

+

high_value

+

text

+

Upper limit of the partition corresponding to the index partition

+

def_tablespace_name

+

name

+

Name of the tablespace of the index partition

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0866.html b/docs/dws/dev/dws_04_0866.html new file mode 100644 index 00000000..be659d7e --- /dev/null +++ b/docs/dws/dev/dws_04_0866.html @@ -0,0 +1,145 @@ + + +

USER_JOBS

+

USER_JOBS displays all jobs owned by the user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_JOBS columns

Name

+

Type

+

Description

+

job

+

int4

+

Job ID

+

log_user

+

name not null

+

User name of the job creator

+

priv_user

+

name not null

+

User name of the job executor

+

dbname

+

name not null

+

Database in which the job is created

+

start_date

+

timestamp without time zone

+

Job start time

+

start_suc

+

text

+

Start time of the successful job execution

+

last_date

+

timestamp without time zone

+

Start time of the last job execution

+

last_suc

+

text

+

Start time of the last successful job execution

+

this_date

+

timestamp without time zone

+

Start time of the ongoing job execution

+

this suc

+

text

+

Same as THIS_DATE

+

next_date

+

timestamp without time zone

+

Schedule time of the next job execution

+

next suc

+

text

+

Same as next_date

+

broken

+

text

+

Task status

+

Y: the system does not try to execute the task.

+

N: the system attempts to execute the task.

+

status

+

char

+

Status of the current job. The value range is 'r', 's', 'f', 'd'. The default value is 's'. The indications are as follows:

+
  • r: running
  • s: finished
  • f: failed
  • d: aborted
+

interval

+

text

+

Time expression used to calculate the next execution time. If this parameter is set to null, the job will be executed once only.

+

failures

+

smallint

+

Number of times the job has started and failed. If a job fails to be executed for 16 consecutive times, no more attempt will be made on it.

+

what

+

text

+

Body of the PL/SQL blocks or anonymous clock that the job executes

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0867.html b/docs/dws/dev/dws_04_0867.html new file mode 100644 index 00000000..d9d78471 --- /dev/null +++ b/docs/dws/dev/dws_04_0867.html @@ -0,0 +1,67 @@ + + +

USER_OBJECTS

+

USER_OBJECTS displays all database objects accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_OBJECTS columns

Name

+

Type

+

Description

+

object_name

+

name

+

Object name

+

object_id

+

oid

+

OID of the object

+

object_type

+

name

+

Type of the object (TABLE, INDEX, SEQUENCE, or VIEW)

+

namespace

+

oid

+

Namespace that the object belongs to

+

created

+

timestamp with time zone

+

Object creation time

+

last_ddl_time

+

timestamp with time zone

+

The last time when an object was modified.

+
+
+

For details about the value ranges of last_ddl_time and last_ddl_time, see PG_OBJECT.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0868.html b/docs/dws/dev/dws_04_0868.html new file mode 100644 index 00000000..b3613872 --- /dev/null +++ b/docs/dws/dev/dws_04_0868.html @@ -0,0 +1,79 @@ + + +

USER_PART_INDEXES

+

USER_PART_INDEXES displays information about partitioned table indexes accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_PART_INDEXES columns

Name

+

Type

+

Description

+

index_owner

+

character varying(64)

+

Name of the owner of the partitioned table index

+

schema

+

character varying(64)

+

Schema of the partitioned table index

+

index_name

+

character varying(64)

+

Name of the partitioned table index

+

table_name

+

character varying(64)

+

Name of the partitioned table to which the partitioned table index belongs

+

partitioning_type

+

text

+

Partition policy of the partitioned table

+

partition_count

+

bigint

+

Number of index partitions of the partitioned table index

+

def_tablespace_name

+

name

+

Name of the tablespace of the partitioned table index

+

partitioning_key_count

+

integer

+

Number of partition keys of the partitioned table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0869.html b/docs/dws/dev/dws_04_0869.html new file mode 100644 index 00000000..c21b9d63 --- /dev/null +++ b/docs/dws/dev/dws_04_0869.html @@ -0,0 +1,72 @@ + + +

USER_PART_TABLES

+

USER_PART_TABLES displays information about partitioned tables accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_PART_TABLES columns

Name

+

Type

+

Description

+

table_owner

+

character varying(64)

+

Name of the owner of the partitioned table

+

schema

+

character varying(64)

+

Schema of the partitioned table

+

table_name

+

character varying(64)

+

Name of the partitioned table

+

partitioning_type

+

text

+

Partition policy of the partitioned table

+

partition_count

+

bigint

+

Number of partitions of the partitioned table

+

def_tablespace_name

+

name

+

Name of the tablespace of the partitioned table

+

partitioning_key_count

+

integer

+

Number of partition keys of the partitioned table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0870.html b/docs/dws/dev/dws_04_0870.html new file mode 100644 index 00000000..55ec0d19 --- /dev/null +++ b/docs/dws/dev/dws_04_0870.html @@ -0,0 +1,44 @@ + + +

USER_PROCEDURES

+

USER_PROCEDURES displays information about all stored procedures and functions in the current schema.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 USER_PROCEDURES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the stored procedure or the function

+

object_name

+

character varying(64)

+

Name of the stored procedure or the function

+

argument_number

+

smallint

+

Number of the input parameters in the stored procedure

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0871.html b/docs/dws/dev/dws_04_0871.html new file mode 100644 index 00000000..308f9cfd --- /dev/null +++ b/docs/dws/dev/dws_04_0871.html @@ -0,0 +1,37 @@ + + +

USER_SEQUENCES

+

USER_SEQUENCES displays sequence information in the current schema.

+ +
+ + + + + + + + + + + + + +
Table 1 USER_SEQUENCES columns

Name

+

Type

+

Description

+

sequence_owner

+

character varying(64)

+

Owner of the sequence

+

sequence_name

+

character varying(64)

+

Name of the sequence

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0872.html b/docs/dws/dev/dws_04_0872.html new file mode 100644 index 00000000..3c684c1f --- /dev/null +++ b/docs/dws/dev/dws_04_0872.html @@ -0,0 +1,44 @@ + + +

USER_SOURCE

+

USER_SOURCE displays information about stored procedures or functions in this mode, and provides the columns defined by the stored procedures or the functions.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 USER_SOURCE columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the stored procedure or the function

+

name

+

character varying(64)

+

Name of the stored procedure or the function

+

text

+

text

+

Definition of the stored procedure or the function

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0873.html b/docs/dws/dev/dws_04_0873.html new file mode 100644 index 00000000..c22de99d --- /dev/null +++ b/docs/dws/dev/dws_04_0873.html @@ -0,0 +1,58 @@ + + +

USER_SYNONYMS

+

USER_SYNONYMS displays synonyms accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_SYNONYMS columns

Name

+

Type

+

Description

+

schema_name

+

text

+

Name of the schema to which the synonym belongs.

+

synonym_name

+

text

+

Synonym name.

+

table_owner

+

text

+

Owner of the associated object.

+

table_schema_name

+

text

+

Schema name of the associated object.

+

table_name

+

text

+

Name of the associated object.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0874.html b/docs/dws/dev/dws_04_0874.html new file mode 100644 index 00000000..1d138288 --- /dev/null +++ b/docs/dws/dev/dws_04_0874.html @@ -0,0 +1,107 @@ + + +

USER_TAB_COLUMNS

+

USER_TAB_COLUMNS displays information about table columns accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_TAB_COLUMNS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

column_name

+

character varying(64)

+

Column name

+

data_type

+

character varying(128)

+

Data type of the column

+

column_id

+

integer

+

Sequence number of the column when the table is created

+

data_length

+

integer

+

Length of the column in the unit of bytes

+

comments

+

text

+

Comments

+

avg_col_len

+

numeric

+

Average length of a column in the unit of bytes

+

nullable

+

bpchar

+

Whether the column can be empty. For the primary key constraint and non-null constraint, the value is n.

+

data_precision

+

integer

+

Precision of the data type. This parameter is valid for the numeric data type and NULL for other types.

+

data_scale

+

integer

+

Number of decimal places. This parameter is valid for the numeric data type and 0 for other types.

+

char_length

+

numeric

+

Column length in the unit of bytes which is valid only for the varchar, nvarchar2, bpchar, and char types.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0875.html b/docs/dws/dev/dws_04_0875.html new file mode 100644 index 00000000..3c458567 --- /dev/null +++ b/docs/dws/dev/dws_04_0875.html @@ -0,0 +1,44 @@ + + +

USER_TAB_COMMENTS

+

USER_TAB_COMMENTS displays comments about all tables and views accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 USER_TAB_COMMENTS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the table or the view

+

table_name

+

character varying(64)

+

Name of the table or the view

+

comments

+

text

+

Comments

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0876.html b/docs/dws/dev/dws_04_0876.html new file mode 100644 index 00000000..3a398772 --- /dev/null +++ b/docs/dws/dev/dws_04_0876.html @@ -0,0 +1,65 @@ + + +

USER_TAB_PARTITIONS

+

USER_TAB_PARTITIONS displays all table partitions accessible to the current user. Each partition of a partitioned table accessible to the current user has a piece of record in USER_TAB_PARTITIONS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_TAB_PARTITIONS columns

Name

+

Type

+

Description

+

table_owner

+

character varying(64)

+

Name of the owner of the partitioned table

+

schema

+

character varying(64)

+

Schema of the partitioned table

+

table_name

+

character varying(64)

+

Name of the partitioned table

+

partition_name

+

character varying(64)

+

Name of the table partition

+

high_value

+

text

+

Upper boundary of the table partition

+

tablespace_name

+

name

+

Name of the tablespace of the table partition

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0877.html b/docs/dws/dev/dws_04_0877.html new file mode 100644 index 00000000..259f90ae --- /dev/null +++ b/docs/dws/dev/dws_04_0877.html @@ -0,0 +1,74 @@ + + +

USER_TABLES

+

USER_TABLES displays table information in the current schema.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 USER_TABLES columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Table owner

+

table_name

+

character varying(64)

+

Table name

+

tablespace_name

+

character varying(64)

+

Name of the tablespace where the table is located

+

status

+

character varying(8)

+

Whether the current record is valid

+

temporary

+

character(1)

+

Whether the table is a temporary table

+
  • Y: temporary table
  • N: not a temporary table
+

dropped

+

character varying

+

Whether the current record is deleted

+
  • YES: deleted
  • NO: not deleted
+

num_rows

+

numeric

+

Estimated number of rows in the table

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0878.html b/docs/dws/dev/dws_04_0878.html new file mode 100644 index 00000000..a5af0aab --- /dev/null +++ b/docs/dws/dev/dws_04_0878.html @@ -0,0 +1,44 @@ + + +

USER_TRIGGERS

+

USER_TRIGGERS displays the information about triggers accessible to the current user.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 USER_TRIGGERS columns

Name

+

Type

+

Description

+

trigger_name

+

character varying(64)

+

Trigger name

+

table_name

+

character varying(64)

+

Name of the relationship table

+

table_owner

+

character varying(64)

+

Role name

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0879.html b/docs/dws/dev/dws_04_0879.html new file mode 100644 index 00000000..53f262da --- /dev/null +++ b/docs/dws/dev/dws_04_0879.html @@ -0,0 +1,37 @@ + + +

USER_VIEWS

+

USER_VIEWS displays information about all views in the current schema.

+ +
+ + + + + + + + + + + + + +
Table 1 USER_VIEWS columns

Name

+

Type

+

Description

+

owner

+

character varying(64)

+

Owner of the view

+

view_name

+

character varying(64)

+

View name

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0880.html b/docs/dws/dev/dws_04_0880.html new file mode 100644 index 00000000..1922164e --- /dev/null +++ b/docs/dws/dev/dws_04_0880.html @@ -0,0 +1,51 @@ + + +

V$SESSION

+

V$SESSION displays all session information about the current session.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 V$SESSION columns

Name

+

Type

+

Description

+

sid

+

bigint

+

OID of the background process of the current activity

+

serial#

+

integer

+

Sequence number of the active background process, which is 0 in GaussDB(DWS).

+

user#

+

oid

+

OID of the user that has logged in to the background process

+

username

+

name

+

Name of the user that has logged in to the background process

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0881.html b/docs/dws/dev/dws_04_0881.html new file mode 100644 index 00000000..180b3158 --- /dev/null +++ b/docs/dws/dev/dws_04_0881.html @@ -0,0 +1,51 @@ + + +

V$SESSION_LONGOPS

+

V$SESSION_LONGOPS displays the progress of ongoing operations.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 1 V$SESSION_LONGOPS columns

Name

+

Type

+

Description

+

sid

+

bigint

+

OID of the running background process

+

serial#

+

integer

+

Sequence number of the running background process, which is 0 in GaussDB(DWS).

+

sofar

+

integer

+

Completed workload, which is empty in GaussDB(DWS).

+

totalwork

+

integer

+

Total workload, which is empty in GaussDB(DWS).

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0883.html b/docs/dws/dev/dws_04_0883.html new file mode 100644 index 00000000..bcbf51d6 --- /dev/null +++ b/docs/dws/dev/dws_04_0883.html @@ -0,0 +1,61 @@ + + +

GUC Parameters

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0884.html b/docs/dws/dev/dws_04_0884.html new file mode 100644 index 00000000..689555e4 --- /dev/null +++ b/docs/dws/dev/dws_04_0884.html @@ -0,0 +1,37 @@ + + +

Viewing GUC Parameters

+

GaussDB(DWS) GUC parameters can control database system behaviors. You can check and adjust the GUC parameters based on your business scenario and data volume.

+
  • After a cluster is installed, you can check common database parameters on the GaussDB(DWS) management console.

    +
+
  • You can also connect to a cluster and run SQL commands to check the GUC parameters.
    • Run the SHOW command.
      To view a certain parameter, run the following command:
      1
      SHOW server_version;
      +
      + +
      +
      +

      server_version indicates the database version.

      +
      Run the following command to view all the parameters:
      1
      SHOW ALL;
      +
      + +
      +
      +
    +
    • Use the pg_settings view.
      To view a certain parameter, run the following command:
      1
      SELECT * FROM pg_settings WHERE NAME='server_version';
      +
      + +
      +
      +
      Run the following command to view values of all parameters:
      1
      SELECT * FROM pg_settings;
      +
      + +
      +
      +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0885.html b/docs/dws/dev/dws_04_0885.html new file mode 100644 index 00000000..bbaeb268 --- /dev/null +++ b/docs/dws/dev/dws_04_0885.html @@ -0,0 +1,85 @@ + + +

Configuring GUC Parameters

+

To ensure the optimal performance of GaussDB(DWS), you can adjust the GUC parameters in the database.

+

Parameter Types and Values

  • The GUC parameters of GaussDB(DWS) are classified into the following types:
    • SUSET: database administrator parameters. This type of parameters take effect immediately after they are set. You do not need to restart the cluster. If a parameter of this type is set in the current session, the parameter takes effect only in the current session.
    • USERSET: common user parameters. This type of parameters take effect immediately after they are set. You do not need to restart the cluster. If a parameter of this type is set in the current session, the parameter takes effect only in the current session.
    • POSTMASTER: database server parameters. This type of parameters take effect only after the cluster is restarted. After you modify a parameter of this type, the system displays a message indicating that the cluster is to be restarted. You are advised to manually restart the cluster during off-peak hours for the setting to take effect.
    • SIGHUP: global database parameters. This type of parameters take effect globally and cannot take effect for single sessions.
    • BACKEND: global database parameters. This type of parameters take effect globally and cannot take effect for single sessions.
    +
  • All parameter names are case insensitive. A parameter value can be an integer, floating point number, string, Boolean value, or enumerated value.
    • The Boolean values can be on/off, true/false, yes/no, or 1/0, and are case-insensitive.
    • The enumerated value range is specified in the enumvals column of the system catalog pg_settings.
    +
  • For parameters using units, specify their units during the setting, or default units are used.
    • The default units are specified in the unit column of pg_settings.
    • The unit of memory can be KB, MB, or GB.
    • The unit of time can be ms, s, min, h, or d.
    +
+
+

Setting GUC Parameters

You can configure GUC parameters in the following ways:

+
  • Method 1: After a cluster is created, you can log in to the GaussDB(DWS) management console and modify the database parameters of the cluster. For details, see "Modifying Database Parameters" in Data Warehouse Service (DWS) User Guide.
  • Method 2: Connect to a cluster and run SQL commands to configure the parameters of the SUSET or USERSET type.

    Configure parameters at database, user, or session levels.

    +
    • Set a database-level parameter.
      1
      ALTER DATABASE dbname SET paraname TO value;
      +
      + +
      +

      The setting takes effect in the next session.

      +
    • Set a user-level parameter.
      1
      ALTER USER username SET paraname TO value;
      +
      + +
      +

      The setting takes effect in the next session.

      +
    • Set a session-level parameter.
      1
      SET paraname TO value;
      +
      + +
      +

      Parameter value in the current session is changed. After you exit the session, the setting becomes invalid.

      +
    +
+
+

Procedure

The following example shows how to set explain_perf_mode.

+
  1. View the value of explain_perf_mode.

    1
    +2
    +3
    +4
    +5
    SHOW explain_perf_mode;
    + explain_perf_mode 
    +-------------------
    + normal
    +(1 row)
    +
    + +
    +

  2. Set explain_perf_mode.

    Perform one of the following operations:

    +
    • Set a database-level parameter.
      1
      ALTER DATABASE gaussdb SET explain_perf_mode TO pretty;
      +
      + +
      +

      If the following information is displayed, the setting has been modified.

      +
      ALTER DATABASE
      +

      The setting takes effect in the next session.

      +
    • Set a user-level parameter.
      1
      ALTER USER dbadmin SET explain_perf_mode TO pretty;
      +
      + +
      +

      If the following information is displayed, the setting has been modified.

      +
      ALTER USER
      +

      The setting takes effect in the next session.

      +
    • Set a session-level parameter.
      1
      SET explain_perf_mode TO pretty;
      +
      + +
      +

      If the following information is displayed, the setting has been modified.

      +
      SET
      +
    +

  3. Check whether the parameter is correctly set.

    1
    +2
    +3
    +4
    +5
    SHOW explain_perf_mode;
    + explain_perf_mode
    +--------------
    + pretty
    +(1 row)
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0886.html b/docs/dws/dev/dws_04_0886.html new file mode 100644 index 00000000..f4b470b4 --- /dev/null +++ b/docs/dws/dev/dws_04_0886.html @@ -0,0 +1,14 @@ + + +

GUC Parameter Usage

+

The database provides many operation parameters. Configuration of these parameters affects the behavior of the database system. Before modifying these parameters, learn the impact of these parameters on the database. Otherwise, unexpected results may occur.

+

Precautions

  • If the value range of a parameter is a string, the string should comply with the naming conventions of the path and file name in the OS running the database.
  • If the allowed maximum value of a parameter is INT_MAX, it indicates the maximum parameter value varies by OS.
  • If the allowed maximum value of a parameter is DBL_MAX, it indicates the maximum parameter value varies by OS.
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0888.html b/docs/dws/dev/dws_04_0888.html new file mode 100644 index 00000000..9e7a6fb7 --- /dev/null +++ b/docs/dws/dev/dws_04_0888.html @@ -0,0 +1,19 @@ + + +

Connection and Authentication

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0889.html b/docs/dws/dev/dws_04_0889.html new file mode 100644 index 00000000..d0568bf1 --- /dev/null +++ b/docs/dws/dev/dws_04_0889.html @@ -0,0 +1,43 @@ + + +

Connection Settings

+

This section describes parameters related to the connection mode between the client and server.

+

max_connections

Parameter description: Specifies the maximum number of allowed parallel connections to the database. This parameter influences the concurrent processing capability of the cluster.

+

Type: POSTMASTER

+

Value range: an integer. For CNs, the ranges from 1 to 16384. For DNs, the value ranges from 1 to 262143. Because there are internal connections in the cluster, the maximum value is rarely reached. If invalid value for parameter "max_connections" is displayed in the log, you need to decrease the max_connections value for DNs.

+

Default value: 800 for CNs and 5000 for DNs. If the default value is greater than the maximum value supported by kernel (determined when the gs_initdb command is executed), an error message will be displayed.

+

Setting suggestions:

+

Retain the default value of this parameter on the CN. Set this parameter on the DN to the following calculation result: Number of CNs x Value of this parameter on the CN.

+

If the parameter is set to a large value, GaussDB(DWS) requires more SystemV shared memories or semaphores, which may exceed the maximum default configuration of the OS. In this case, modify the value as needed.

+

The value of max_connections is related to max_prepared_transactions. Before setting max_connections, ensure that the value of max_prepared_transactions is greater than or equal to that of max_connections. In this way, each session has a prepared transaction in the waiting state.

+
+
+

sysadmin_reserved_connections

Parameter description: Specifies the minimum number of connections reserved for administrators.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 262143

+

Default value: 3

+
+

application_name

Parameter description: Specifies the name of the client program connecting to the database.

+

Type: USERSET

+

Value range: a string

+

Default value: gsql

+
+

connection_info

Parameter description: Specifies the database connection information, including the driver type, driver version, driver deployment path, and process owner. (This is an O&M parameter. Do not configure it by yourself.)

+

Type: USERSET

+

Value range: a string

+

Default value: an empty string

+
  • An empty string indicates that the driver connected to the database does not support automatic setting of the connection_info parameter or the parameter is not set by users in applications.
  • The following is an example of the concatenated value of connection_info:
    1
    {"driver_name":"ODBC","driver_version": "(GaussDB 8.1.1 build af002019) compiled at 2020-01-10 05:43:20 commit 6995 last mr 11566 debug","driver_path":"/usr/local/lib/psqlodbcw.so","os_user":"dbadmin"}
    +
    + +
    +

    driver_name and driver_version are displayed by default. Whether driver_path and os_user are displayed is determined by users.

    +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0890.html b/docs/dws/dev/dws_04_0890.html new file mode 100644 index 00000000..80ac839d --- /dev/null +++ b/docs/dws/dev/dws_04_0890.html @@ -0,0 +1,149 @@ + + +

Security and Authentication (postgresql.conf)

+

This section describes parameters about how to securely authenticate the client and server.

+

authentication_timeout

Parameter description: Specifies the longest duration to wait before the client authentication times out. If a client is not authenticated by the server within the timeout period, the server automatically breaks the connection from the client so that the faulty client does not occupy connection resources.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 600. The minimum unit is second (s).

+

Default value: 1 min

+
+

auth_iteration_count

Parameter description: Specifies the number of interactions during the generation of encryption information for authentication.

+

Type: SIGHUP

+

Value range: an integer ranging from 2048 to 134217728

+

Default value: 50000

+

If this parameter is set to a large value, performance deteriorates in operations involving password encryption, such as authentication and user creation. Set this parameter to an appropriate value based on the hardware conditions.

+
+
+

session_timeout

Parameter description: Specifies the longest duration with no operations after the connection to the server.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 86400. The minimum unit is second (s). 0 means to disable the timeout.

+

Default value: 10 min

+
  • The gsql client of GaussDB(DWS) has an automatic reconnection mechanism. If the initialized local connection of a user to the server times out, gsql disconnects from and reconnects to the server.
  • Connections from the pooler connection pool to other CNs and DNs are not controlled by the session_timeout parameter.
+
+
+

ssl

Parameter description: Specifies whether the SSL connection is enabled.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the SSL connection is enabled.
  • off indicates that the SSL connection is not enabled.
+

GaussDB(DWS) supports the SSL connection when the client connects to CNs. It is recommended that the SSL connection be enabled only on CNs.

+
+

Default value: on

+
+

ssl_ciphers

Parameter description: Specifies the encryption algorithm list supported by the SSL.

+

Type: POSTMASTER

+

Value range: a string. Separate multiple encryption algorithms with semicolons (;).

+

Default value: ALL

+
  • The default value of ssl_ciphers is ALL, indicating that all the following encryption algorithms are supported. Users are advised to retain the default value, unless there are other special requirements on the encryption algorithm.
    • TLS1_3_RFC_AES_128_GCM_SHA256
    • TLS1_3_RFC_AES_256_GCM_SHA384
    • TLS1_3_RFC_CHACHA20_POLY1305_SHA256
    • TLS1_3_RFC_AES_128_CCM_SHA256
    • TLS1_3_RFC_AES_128_CCM_8_SHA256
    +
  • Currently, SSL connection authentication supports only the TLS1.3 encryption algorithm, which has better performance and security. It is also compatible with SSL connection authentication between clients that comply with TLS1.2.
+
+
+

ssl_renegotiation_limit

Parameter description: Specifies the traffic volume over the SSL-encrypted channel before the session key is renegotiated. The renegotiation traffic limitation mechanism reduces the probability that attackers use the password analysis method to crack the key based on a huge amount of data but causes big performance losses. The traffic indicates the sum of sent and received traffic.

+

Type: USERSET

+

You are advised to retain the default value, that is, disable the renegotiation mechanism. You are not advised to use the gs_guc tool or other methods to set the ssl_renegotiation_limit parameter in the postgresql.conf file. The setting does not take effect.

+
+

Value range: an integer ranging from 0 to INT_MAX. The unit is KB. 0 indicates that the renegotiation mechanism is disabled.

+

Default value: 0

+
+

password_policy

Parameter description: Specifies whether to check the password complexity when you run the CREATE ROLE/USER or ALTER ROLE/USER command to create or modify a GaussDB(DWS) account.

+

Type: SIGHUP

+

For security purposes, do not disable the password complexity policy.

+
+

Value range: an integer, 0 or 1

+
  • 0 indicates that no password complexity policy is enabled.
  • 1 indicates that the default password complexity policy is disabled.
+

Default value: 1

+
+

password_reuse_time

Parameter description: Specifies whether to check the reuse days of the new password when you run the ALTER USER or ALTER ROLE command to change a user password.

+

Type: SIGHUP

+

When you change the password, the system checks the values of password_reuse_time and password_reuse_max.

+ +
+

Value range: a floating number ranging from 0 to 3650. The unit is day.

+
  • 0 indicates that the password reuse days are not checked.
  • A positive number indicates that the new password cannot be the one that is used within the specified days.
+

Default value: 60

+
+

password_reuse_max

Parameter description: Specifies whether to check the reuse times of the new password when you run the ALTER USER or ALTER ROLE command to change a user password.

+

Type: SIGHUP

+

When you change the password, the system checks the values of password_reuse_time and password_reuse_max.

+ +
+

Value range: an integer ranging from 0 to 1000

+
  • 0 indicates that the password reuse times are not checked.
  • A positive number indicates that the new password cannot be the one whose reuse times exceed the specified number.
+

Default value: 0

+
+

password_lock_time

Parameter description: Specifies the duration before an account is automatically unlocked.

+

Type: SIGHUP

+

The locking and unlocking functions take effect only when the values of password_lock_time and failed_login_attempts are positive numbers.

+
+

Value range: a floating number ranging from 0 to 365. The unit is day.

+
  • 0 indicates that the automatic locking function does not take effect if the password verification fails.
  • A positive number indicates the duration after which an account is automatically unlocked.
+

Default value: 1

+
+

failed_login_attempts

Parameter description: Specifies the maximum number of incorrect password attempts before an account is locked. The account will be automatically unlocked after the time specified in password_lock_time. For example, incorrect password attempts during login and password input failures when using the ALTER USER command

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 1000

+
  • 0 indicates that the automatic locking function does not take effect.
  • A positive number indicates that an account is locked when the number of incorrect password attempts reaches the value of failed_login_attempts.
+

Default value: 10

+
  • The locking and unlocking functions take effect only when the values of failed_login_attempts and password_lock_time are positive numbers.
  • failed_login_attempts works with the SSL connection mode of the client to identify the number of incorrect password attempts. If PGSSLMODE is set to allow or prefer, two connection requests are generated for a password connection request. One request attempts an SSL connection, and the other request attempts a non-SSL connection. In this case, the number of incorrect password attempts perceived by the user is the value of failed_login_attempts divided by 2.
+
+
+

password_encryption_type

Parameter description: Specifies the encryption type of user passwords.

+

Type: SIGHUP

+

Value range: an integer, 0, 1, or 2

+
  • 0 indicates that passwords are encrypted in MD5 mode.
  • 1 indicates that passwords are encrypted using SHA256, which is compatible with the MD5 user authentication method of the PostgreSQL client.
  • 2 indicates that passwords are encrypted using SHA256.
+
  • MD5 is not recommended because it is not a secure encryption algorithm.
  • If the cluster is upgraded from 8.0.0 or an earlier version to the current version, the default value of this parameter is the same as that of the cluster of the earlier version. For example, the default value of password_encryption_type in 8.0.0 is 1. After the cluster is upgraded from 8.0.0 to 8.1.1, the default value of password_encryption_type remains 1.
+
+

Default value: 2

+
+

password_min_length

Parameter description: Specifies the minimum account password length.

+

Type: SIGHUP

+

Value range: an integer. A password can contain 6 to 999 characters.

+

Default value: 8

+
+

password_max_length

Parameter description: Specifies the maximum account password length.

+

Type: SIGHUP

+

Value range: an integer. A password can contain 6 to 999 characters.

+

Default value: 32

+
+

password_min_uppercase

Parameter description: Specifies the minimum number of uppercase letters that an account password must contain.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 999.

+
  • 0 means no limit.
  • A positive integer indicates the minimum number of uppercase letters in the password specified for creating an account.
+

Default value: 0

+
+

password_min_lowercase

Parameter description: Specifies the minimum number of lowercase letters that an account password must contain.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 999.

+
  • 0 means no limit.
  • A positive integer indicates the minimum number of lowercase letters in the password specified for creating an account.
+

Default value: 0

+
+

password_min_digital

Parameter description: Specifies the minimum number of digits that an account password must contain.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 999.

+
  • 0 means no limit.
  • A positive integer indicates the minimum number of digits in the password specified for creating an account.
+

Default value: 0

+
+

password_min_special

Parameter description: Specifies the minimum number of special characters that an account password must contain.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 999.

+
  • 0 means no limit.
  • A positive integer indicates the minimum number of special characters in the password specified for creating an account.
+

Default value: 0

+
+

password_effect_time

Parameter description: Specifies the validity period of an account password.

+

Type: SIGHUP

+

Value range: a floating number ranging from 0 to 999. The unit is day.

+
  • 0 indicates the function of validity period restriction is disabled.
  • A floating point number from 1 to 999 indicates the validity period of the password specified for creating an account. When the password is about to expire or has expired, the system prompts the user to change the password.
+

Default value: 90

+
+

password_notify_time

Parameter description: Specifies how many days in advance users are notified before the account password expires.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 999. The unit is day.

+
  • 0 indicates the reminder is disabled.
  • A positive integer indicates how long before expiry the reminder will appear.
+

Default value: 7

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0891.html b/docs/dws/dev/dws_04_0891.html new file mode 100644 index 00000000..ae9a6e9f --- /dev/null +++ b/docs/dws/dev/dws_04_0891.html @@ -0,0 +1,126 @@ + + +

Communication Library Parameters

+

This section describes parameter settings and value ranges for communication libraries.

+

comm_tcp_mode

Parameter description: Specifies whether the communication library uses the TCP or SCTP protocol to set up a data channel. The modification of this parameter takes effect after the cluster is restarted.

+

Type: POSTMASTER

+

Value range: Boolean. If this parameter is set to on for CNs, the CNs connect to DNs using TCP. If this parameter is set to on for DNs, the DNs communicate with each other using TCP.

+

Default value: on

+
+

comm_sctp_port

Parameter description: Specifies the TCP or SCTP listening port used by the TCP proxy communication library or SCTP communication library, respectively.

+

Type: POSTMASTER

+

This port number is automatically allocated during cluster deployment. Do not change the parameter setting. If the port number is incorrectly set, the database communication fails.

+
+

Value range: an integer ranging from 0 to 65535

+

Default value: port + Number of primary DNs on the local host x 2 + Sequence number of the local DN on the local host

+
+

comm_control_port

Parameter description: Specifies the TCP listening port used by the TCP proxy communication library or SCTP communication library, respectively.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 65535

+

Default value: port + Number of primary DNs on the local host x 2 + Sequence number of the local DN on the local host + 1

+

This port number is automatically allocated during cluster deployment. Do not change the parameter setting. If the port number is incorrectly set, the database communication fails.

+
+
+

comm_max_datanode

Parameter description: Specifies the maximum number of DNs supported by the TCP proxy communication library or SCTP communication library.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 8192

+

Default value: actual number of DNs

+
+

comm_max_stream

Parameter description: Specifies the maximum number of concurrent data streams supported by the TCP proxy communication library or SCTP communication library. The value of this parameter must be greater than: Number of concurrent data streams x Number of operators in each stream x Square of SMP.

+

Type: POSTMASTER

+

Value range: an integer ranging from 1 to 60000

+

Default value: calculated by the following formula: min (query_dop_limit x query_dop_limit x 2 x 20, max_process_memory (bytes) x 0.005/(Maximum number of CNs + Number of current DNs)/260. If the value is less than 1024, 1024 is used. query_dop_limit = Number of CPU cores of a single server/Number of DNs of a single server.

+
  • You are not advised to set this parameter to a large value because this will cause high memory usage (256 bytes x comm_max_stream x comm_max_datanode). If the number of concurrent data streams is large, the query is complex and the smp is large, resulting in insufficient memory.
  • If the value of comm_max_datanode is small, the process memory is sufficient. In this case, you can increase the value of comm_max_stream.
+
+
+

comm_max_receiver

Parameter description: Specifies the maximum number of receiving threads for the TCP proxy communication library or SCTP communication library.

+

Type: POSTMASTER

+

Value range: an integer ranging from 1 to 50

+

Default value: 4

+
+

comm_quota_size

Parameter description: Specifies the maximum size of packets that can be consecutively sent by the TCP proxy communication library or SCTP communication library. When you use a 1GE NIC, a small value ranging from 20 KB to 40 KB is recommended.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 102400. The default unit is KB. The value 0 indicates that the quota mechanism is not used.

+

Default value: 1MB

+
+

comm_usable_memory

Parameter description: Specifies the maximum memory available for buffering on the TCP proxy communication library or SCTP communication library on a single DN.

+

Type: POSTMASTER

+

Value range: an integer ranging from 102400 to INT_MAX/2. The default unit is KB. The minimum size cannot be less than 1 GB for installation.

+

Default value: max_process_memory/8

+

This parameter must be specifically set based on environment memory and the deployment method. If it is too large, there may be out-of-memory (OOM). If it is too small, the performance of the TCP proxy communication library or SCTP communication library may deteriorate.

+
+
+

comm_memory_pool_percent

Parameter description: Specifies the percentage of the memory pool resources that can be used by the TCP proxy communication library or the SCTP communication library in a DN. This parameter is used to adaptively reserve memory used by the communication libraries.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 100

+

Default value: 0

+

If the memory used by the communication library is small, set this parameter to a small value. Otherwise, set it to a large value.

+
+
+

comm_client_bind

Parameter description: Specifies whether to bind the client of the communication library to a specified IP address when the client initiates a connection.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the client is bound to a specified IP address.
  • off indicates that the client is not bound to any IP addresses.
+

If multiple IP addresses of a node in a cluster are on the same communication network segment, set this parameter to on. In this case, the client is bound to the IP address specified by listen_addresses. The concurrency performance of a cluster depends on the number of random ports because a port can be used only by one client at a time.

+
+

Default value: off

+
+

comm_no_delay

Parameter description: Specifies whether to use the NO_DELAY attribute of the communication library connection. Restart the cluster for the setting to take effect.

+

Type: USERSET

+

Value range: Boolean

+

Default value: off

+

If packet loss occurs because a large number of packets are received per second, set this parameter to off to reduce the total number of packets.

+
+
+

comm_debug_mode

Parameter description: Specifies the debug mode of the TCP proxy communication library or SCTP communication library, that is, whether to print logs about the communication layer. The setting is effective at the session layer.

+

When the switch is set to on, the number of printed logs is huge, adding extra overhead and reducing database performance. Therefore, set the switch to on only in the debug mode.

+
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the detailed debug log of the communication library is printed.
  • off indicates the detailed debug log of the communication library is not printed.
+

Default value: off

+
+

comm_ackchk_time

Parameter description: Specifies the duration after which the communication library server automatically triggers ACK when no data package is received.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 20000. The unit is millisecond (ms). 0 indicates that automatic ACK triggering is disabled.

+

Default value: 2000

+
+

comm_timer_mode

Parameter description: Specifies the timer mode of the TCP proxy communication library or SCTP communication library, that is, whether to print timer logs in each phase of the communication layer. The setting is effective at the session layer.

+

When the switch is set to on, the number of printed logs is huge, adding extra overhead and reducing database performance. Therefore, set the switch to on only in the debug mode.

+
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the detailed timer log of the communication library is printed.
  • off indicates the detailed timer log of the communication library is not printed.
+

Default value: off

+
+

comm_stat_mode

Parameter description: Specifies the statistics mode of the TCP proxy communication library or SCTP communication library, that is, whether to print statistics about the communication layer. The setting is effective at the session layer.

+

When the switch is set to on, the number of printed logs is huge, adding extra overhead and reducing database performance. Therefore, set the switch to on only in the debug mode.

+
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the statistics log of the communication library is printed.
  • off indicates the statistics log of the communication library is not printed.
+

Default value: off

+
+

enable_stateless_pooler_reuse

Parameter description: Specifies whether to enable the pooler reuse mode. The setting takes effect after the cluster is restarted.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on or true indicates that the pooler reuse mode is enabled.
  • off or false indicates that the pooler reuse mode is disabled.

    Set this parameter to the same value for CNs and DNs. If enable_stateless_pooler_reuse is set to off for CNs and set to on for DNs, the cluster communication fails. Restart the cluster to make the setting take effect.

    +
    +
+

Default value: off

+
+

comm_cn_dn_logic_conn

Parameter description: Specifies a switch for logical connections between CNs and DNs. The parameter setting takes effect only after the cluster is restarted.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on or true indicates that the connections between CNs and DNs are logical, with the libcomm component in use.
  • off or false indicates that the connections between CNs and DNs are physical, with the libpq component in use.

    If comm_cn_dn_logic_conn is set to off for CNs and set to on for DNs, cluster communication will fail. You are advised to set this parameter to the same value for all CNs and DNs. Restart the cluster to make the setting take effect.

    +
    +
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0892.html b/docs/dws/dev/dws_04_0892.html new file mode 100644 index 00000000..028d199b --- /dev/null +++ b/docs/dws/dev/dws_04_0892.html @@ -0,0 +1,23 @@ + + +

Resource Consumption

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0893.html b/docs/dws/dev/dws_04_0893.html new file mode 100644 index 00000000..4e752f9c --- /dev/null +++ b/docs/dws/dev/dws_04_0893.html @@ -0,0 +1,139 @@ + + +

Memory

+

This section describes memory parameters.

+

Parameters described in this section take effect only after the database service restarts.

+
+

enable_memory_limit

Parameter description: Specifies whether to enable the logical memory management module.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates the logic memory management module is enabled.
  • off indicates the logic memory management module is disabled.
+

Default value: on

+

If the result of max_process_memory - shared_buffer - cstore_buffers is less than 2 GB, GaussDB(DWS) forcibly sets enable_memory_limit to off.

+
+
+

max_process_memory

Parameter description: Specifies the maximum physical memory of a database node.

+

Type: POSTMASTER

+

Value range: an integer ranging from 2 x 1024 x 1024 to INT_MAX/2. The unit is KB.

+

Default value: The value is automatically adapted by non-secondary DNs. The formula is (Physical memory size) x 0.6/(1 + Number of primary DNs). If the result is less than 2 GB, 2 GB is used by default. The default size of the secondary DN is 12 GB.

+

Setting suggestions:

+

On DNs, the value of this parameter is determined based on the physical system memory and the number of DNs deployed on a single node. Parameter value = (Physical memory – vm.min_free_kbytes) x 0.7/(n + Number of primary DNs). This parameter aims to ensure system reliability, preventing node OOM caused by increasing memory usage. vm.min_free_kbytes indicates OS memory reserved for kernels to receive and send data. Its value is at least 5% of the total memory. That is, max_process_memory = Physical memory x 0.665/(n + Number of primary DNs). If the cluster scale (number of nodes in the cluster) is smaller than 256, n=1; if the cluster scale is larger than 256 and smaller than 512, n=2; if the cluster scale is larger than 512, n=3.

+

Set this parameter on CNs to the same value as that on DNs.

+

RAM is the maximum memory allocated to the cluster.

+
+

shared_buffers

Parameter description: Specifies the size of shared memory used by GaussDB(DWS). If this parameter is set to a large value, GaussDB(DWS) may require more System V shared memory than the default setting.

+

Type: POSTMASTER

+

Value range: an integer ranging from 128 to INT_MAX. The unit is 8 KB.

+

Changing the value of BLCKSZ will result in a change in the minimum value of the shared_buffers.

+

Default value: 512 MB for CNs and 1 GB for DNs. If the maximum value allowed by the OS is smaller than 32 MB, this parameter will be automatically changed to the maximum value allowed by the OS during database initialization.

+

Setting suggestions:

+

Set this parameter for DNs to a value greater than that for CNs, because GaussDB(DWS) pushes most of its queries down to DNs.

+

It is recommended that shared_buffers be set to a value less than 40% of the memory. Set it to a large value for row-store tables and a small value for column-store tables. For column-store tables: shared_buffers = (Memory of a single server/Number of DNs on the single server) x 0.4 x 0.25

+

If you want to increase the value of shared_buffers, you also need to increase the value of checkpoint_segments, because a longer period of time is required to write a large amount of new or changed data.

+
+

bulk_write_ring_size

Parameter description: Specifies the size of the ring buffer used for data parallel import.

+

Type: USERSET

+

Value range: an integer ranging from 16384 to INT_MAX. The unit is KB.

+

Default value: 2 GB

+

Setting suggestions: Increase the value of this parameter on DNs if a large amount of data is to be imported.

+
+

temp_buffers

Parameter description: Specifies the maximum size of local temporary buffers used by each database session.

+

Type: USERSET

+

Value range: an integer ranging from 800 to INT_MAX/2. The unit is KB.

+

Default value: 8 MB

+
  • This parameter can be modified only before the first use of temporary tables within each session. Subsequent attempts to change the value of this parameter will not take effect on that session.
  • Based on the value of temp_buffers, a session allocates temporary buffers as required. The cost of setting a large value in sessions that do not require many temporary buffers is only a buffer descriptor. If a buffer is used, 8192 bytes will be consumed for it.
+
+
+

max_prepared_transactions

Parameter description: Specifies the maximum number of transactions that can stay in the prepared state simultaneously. If this parameter is set to a large value, GaussDB(DWS) may require more System V shared memory than the default setting.

+

When GaussDB(DWS) is deployed as an HA system, set this parameter on the standby server to the same value or a value greater than that on the primary server. Otherwise, queries will fail on the standby server.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 536870911. 800 indicates that the prepared transaction feature is disabled.

+

Default value: 800

+

Set this parameter to a value greater than or equal to that of max_connections to avoid failures in preparation.

+
+
+

work_mem

Parameter description: Specifies the memory used for internal sort operations and hash tables before data is written into temporary disk files. Sort operations are used for ORDER BY, DISTINCT, and merge joins. Hash tables are required for Hash joins as well as Hash-based aggregations and IN subqueries.

+

For a complex query, several sort or Hash operations may be running in parallel; each operation will be allowed to use as much memory as this value specifies. If the memory is insufficient, data is written into temporary files. In addition, several running sessions could be performing such operations concurrently. Therefore, the total memory used may be many times the value of work_mem.

+

Type: USERSET

+

Value range: an integer ranging from 64 to INT_MAX. The unit is KB.

+

Default value: 64 MB

+

Setting suggestions:

+

If the physical memory specified by work_mem is insufficient, additional operator calculation data will be written into temporary tables based on query characteristics and the degree of parallelism. This reduces performance by five to ten times, and prolongs the query response time from seconds to minutes.

+
  • In complex serial query scenarios, each query requires five to ten associated operations. Set work_mem using the following formula: work_mem = 50% of the memory/10.
  • In simple serial query scenarios, each query requires two to five associated operations. Set work_mem using the following formula: work_mem = 50% of the memory/5.
  • For concurrent queries, use the formula: work_mem = work_mem in serialized scenario/Number of concurrent SQL statements.
+
+

query_mem

Parameter description: Specifies the memory used by query. If the value of query_mem is greater than 0, the optimizer adjusts the estimated query memory to this value when generating an execution plan.

+

Type: USERSET

+

Value range: 0 or an integer greater than 32. The default unit is KB. If the value is set to a negative value or less than 32 MB, the default value 0 is used. In this case, the optimizer does not adjust the estimated query memory.

+

Default value: 0

+
+

query_max_mem

Parameter description: Specifies the maximum memory that can be used by query. If the value of query_max_mem is greater than 0, an error is reported when the query memory usage exceeds the value.

+

Type: USERSET

+

Value range: 0 or an integer greater than 32 MB. The default unit is KB. If the value is set to a negative value or less than 32 MB, the default value 0 is used. In this case, the query memory will not be limited based on the value.

+

Default value: 0

+
+

maintenance_work_mem

Parameter description: Specifies the maximum size of memory to be used for maintenance operations, such as VACUUM, CREATE INDEX, and ALTER TABLE ADD FOREIGN KEY. This parameter may affect the execution efficiency of VACUUM, VACUUM FULL, CLUSTER, and CREATE INDEX.

+

Type: USERSET

+

Value range: an integer ranging from 1024 to INT_MAX. The unit is KB.

+

Default value: 128 MB

+

Setting suggestions:

+
  • The value of this parameter must be greater than that of work_mem so database dump files can be more quickly cleared or restored. In a database session, only one maintenance operation can be performed at a time. Maintenance is usually performed when there are not much sessions.
  • When the Automatic Cleanup process is running, up to autovacuum_max_workers times of this memory may be allocated. Set maintenance_work_mem to a value equal to or larger than the value of work_mem.
  • If a large amount of data needs to be processed in the cluster, increase the value of this parameter in sessions.
+
+

psort_work_mem

Parameter description: Specifies the memory used for internal sort operations on column-store tables before data is written into temporary disk files. This parameter can be used for inserting tables with a partial cluster key or index, creating a table index, and deleting or updating a table.

+

Type: USERSET

+

Multiple running sessions may perform partial sorting on a table at the same time. Therefore, the total memory usage may be several times of the psort_work_mem value.

+
+

Value range: an integer ranging from 64 to INT_MAX. The unit is KB.

+

Default value: 512 MB

+
+

max_loaded_cudesc

Parameter description: Specifies the number of loaded CuDescs per column when a column-store table is scanned. Increasing the value will improve the query performance and increase the memory usage, particularly when there are many columns in the column tables.

+

Type: USERSET

+

Value range: an integer ranging from 100 to INT_MAX/2

+

Default value: 1024

+

When the value of max_loaded_cudesc is set to a large value, the memory may be insufficient.

+
+
+

max_stack_depth

Parameter description: Specifies the maximum safe depth of GaussDB(DWS) execution stack. The safety margin is required because the stack depth is not checked in every routine in the server, but only in key potentially-recursive routines, such as expression evaluation.

+

Type: SUSET

+

Configuration principles:

+
  • The ideal value of this parameter is the maximum stack size enforced by the kernel (value of ulimit -s).
  • If this parameter is set to a value greater than the actual kernel limit, a running recursive function may crash an individual backend process. In an OS where GaussDB(DWS) can check the kernel limit, such as the SLES, GaussDB(DWS) will prevent this parameter from being set to a value greater than the kernel limit.
  • Since not all the OSs provide this function, you are advised to set this parameter to a specific value.
+

Value range: an integer ranging from 100 to INT_MAX. The unit is KB.

+

Default value: 2 MB

+

2 MB is a small value and will not incur system breakdown in general, but may lead to execution failures of complex functions.

+
+
+

cstore_buffers

Parameter description: Specifies the size of the shared buffer used by ORC, Parquet, or CarbonData data of column-store tables and OBS or HDFS column-store foreign tables.

+

Type: POSTMASTER

+

Value range: an integer ranging from 16384 to INT_MAX. The unit is KB.

+

Default value: 32 MB

+

Setting suggestions:

+

Column-store tables use the shared buffer specified by cstore_buffers instead of that specified by shared_buffers. When column-store tables are mainly used, reduce the value of shared_buffers and increase that of cstore_buffers.

+

Use cstore_buffers to specify the cache of ORC, Parquet, or CarbonData metadata and data for OBS or HDFS foreign tables. The metadata cache size should be 1/4 of cstore_buffers and not exceed 2 GB. The remaining cache is shared by column-store data and foreign table column-store data.

+
+

enable_orc_cache

Parameter description: Specifies whether to reserve 1/4 of cstore_buffers for storing ORC metadata when the cstore buffer is initialized.

+

Type: POSTMASTER

+

Value range: Boolean

+

Default value: on

+
  • on indicates that the ORC metadata is cached, which improves the query performance of the HDFS table but occupies the column-store buffer resources. As a result, the column-store performance is compromised.
  • off indicates that the ORC metadata is not cached.
+
+

schedule_splits_threshold

Parameter description: Specifies the maximum number of files that can be stored in memory when you schedule an HDFS foreign table. If the number is exceeded, all files in the list will be spilled to disk for scheduling.

+

Type: USERSET

+

Value range: an integer ranging from 1 to INT_MAX

+

Default value: 60000

+
+

bulk_read_ring_size

Parameter description: Specifies the size of the ring buffer used for data parallel export.

+

Type: USERSET

+

Value range: an integer ranging from 256 to INT_MAX. The unit is KB.

+

Default value: 16 MB

+
+

check_cu_size_threshold

Parameter description: If the amount of data inserted to a CU is greater than the value of this parameter when data is inserted to a column-store table, the system starts row-level size verification to prevent the generation of a CU whose size is greater than 1 GB (non-compressed size).

+

Type: USERSET

+

Value range: an integer ranging from 0 to 1024. The unit is MB.

+

Default value: 1024 MB

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0894.html b/docs/dws/dev/dws_04_0894.html new file mode 100644 index 00000000..9d9ed4b3 --- /dev/null +++ b/docs/dws/dev/dws_04_0894.html @@ -0,0 +1,42 @@ + + +

Statement Disk Space Control

+

This section describes parameters related to statement disk space control, which are used to limit the disk space usage of statements.

+

sql_use_spacelimit

Parameter description: Specifies the space size for files to be spilled to disks when a single SQL statement is executed on a single DN. The managed space includes the space occupied by ordinary tables, temporary tables, and intermediate result sets to be flushed to disks. System administrators are also restricted by this parameter.

+

Type: USERSET

+

Value range: an integer ranging from -1 to INT_MAX. The unit is KB. –1 indicates no limit.

+

Default value: –1

+

Setting suggestion: You are advised to set sql_use_spacelimit to 10% of the total disk space where DNs reside. If two DNs exist on a single disk, set sql_use_spacelimit to 5% of the total disk space.

+

For example, if sql_use_spacelimit is set to 100 in the statement and the amount data spilled to disks on a single DN exceeds 100 KB, DWS stops the query and displays a message of threshold exceeding.

+
1
+2
insert into user1.t1 select * from user2.t1;
+ERROR:  The space used on DN (104 kB) has exceeded the sql use space limit (100 kB).
+
+ +
+

Handling suggestion:

+
  • Optimize the statement to reduce the data spilled to disks.
  • If the disk space is sufficient, increase the value of this parameter.
+
+
+

temp_file_limit

Parameter description: Specifies the total space for files spilled to disks in a single thread. For example, temporary files used by sorting and hash tables or cursors are controlled by this parameter.

+

This is a session-level setting.

+

Type: SUSET

+

Value range: an integer ranging from -1 to INT_MAX. The unit is KB. –1 indicates no limit.

+

Default value: –1

+

This parameter does not apply to disk space occupied by temporary tablespaces used for executing SQL queries.

+
+
+

bi_page_reuse_factor

Parameter description: Specifies the percentage of idle space of old pages that can be reused when page replication is used for data synchronization between primary and standby DNs in the scenario where data is inserted into row-store tables in batches.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 100. The value is a percentage. Value 0 indicates that the old pages are not reused and new pages are requested.

+

Default value: 70

+
  • In an upgrade, the default value of this parameter is the same as that in the cluster before the upgrade. In a newly installed 8.1.1.500 cluster, the default value of this parameter is 0.
  • You are not advised to set this parameter to a value less than 50 (except 0). If the idle space of the reused page is small, too much old page data will be transmitted between the primary and standby DNs. As a result, the batch insertion performance deteriorates.
  • You are not advised to set this parameter to a value greater than 90. If this parameter is set to a value greater than 90, idle pages will be frequently queried, but old pages cannot be reused.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0895.html b/docs/dws/dev/dws_04_0895.html new file mode 100644 index 00000000..0ada38a9 --- /dev/null +++ b/docs/dws/dev/dws_04_0895.html @@ -0,0 +1,17 @@ + + +

Kernel Resources

+

This section describes kernel resource parameters. Whether these parameters take effect depends on OS settings.

+

max_files_per_process

Parameter description: Specifies the maximum number of simultaneously open files allowed by each server process. If the kernel is enforcing a proper limit, setting this parameter is not required.

+

But on some platforms, especially on most BSD systems, the kernel allows independent processes to open far more files than the system can really support. If the message "Too many open files" is displayed, try to reduce the setting. Generally, the number of file descriptors must be greater than or equal to the maximum number of concurrent tasks multiplied by the number of primary DNs on the current physical machine (*max_files_per_process*3).

+

Type: POSTMASTER

+

Value range: an integer ranging from 25 to INT_MAX

+

Default value: 1000

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0896.html b/docs/dws/dev/dws_04_0896.html new file mode 100644 index 00000000..bb7a4b49 --- /dev/null +++ b/docs/dws/dev/dws_04_0896.html @@ -0,0 +1,44 @@ + + +

Cost-based Vacuum Delay

+

This feature allows administrators to reduce the I/O impact of the VACUUM and ANALYZE statements on concurrent database activities. It is often more important to prevent maintenance statements, such as VACUUM and ANALYZE, from affecting other database operations than to run them quickly. Cost-based vacuum delay provides a way for administrators to achieve this purpose.

+

Certain operations hold critical locks and should be complete as quickly as possible. In GaussDB(DWS), cost-based vacuum delays do not take effect during such operations. To avoid uselessly long delays in such cases, the actual delay is calculated as follows and is the maximum value of the following calculation results:

+
  • vacuum_cost_delay*accumulated_balance/vacuum_cost_limit
  • vacuum_cost_delay*4
+
+

Context

During the execution of the ANALYZE | ANALYSE and VACUUM statements, the system maintains an internal counter that keeps track of the estimated cost of the various I/O operations that are performed. When the accumulated cost reaches a limit (specified by vacuum_cost_limit), the process performing the operation will sleep for a short period of time (specified by vacuum_cost_delay). Then, the counter resets and the operation continues.

+

By default, this feature is disabled. To enable this feature, set vacuum_cost_delay to a value other than 0.

+
+

vacuum_cost_delay

Parameter description: Specifies the length of time that the process will sleep when vacuum_cost_limit has been exceeded.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 100. The unit is millisecond (ms). A positive number enables cost-based vacuum delay and 0 disables cost-based vacuum delay.

+

Default value: 0

+
  • On many systems, the effective resolution of sleep length is 10 ms. Therefore, setting this parameter to a value that is not a multiple of 10 has the same effect as setting it to the next higher multiple of 10.
  • This parameter is set to a small value, such as 10 or 20 milliseconds. Adjusting vacuum's resource consumption is best done by changing other parameters.
+
+
+

vacuum_cost_page_hit

Parameter description: Specifies the estimated cost for vacuuming a buffer found in the shared buffer. It represents the cost to lock the buffer pool, look up the shared Hash table, and scan the page.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 10000. The unit is millisecond (ms).

+

Default value: 1

+
+

vacuum_cost_page_miss

Parameter description: Specifies the estimated cost for vacuuming a buffer read from the disk. It represents the cost to lock the buffer pool, look up the shared Hash table, read the desired block from the disk, and scan the block.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 10000. The unit is millisecond (ms).

+

Default value: 10

+
+

vacuum_cost_page_dirty

Parameter description: Specifies the estimated cost charged when vacuum modifies a block that was previously clean. It represents the I/Os required to flush the dirty block out to disk again.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 10000. The unit is millisecond (ms).

+

Default value: 20

+
+

vacuum_cost_limit

Parameter description: Specifies the cost limit. The cleanup process will sleep if this limit is exceeded.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 10000. The unit is ms.

+

Default value: 200

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0898.html b/docs/dws/dev/dws_04_0898.html new file mode 100644 index 00000000..b7abd9f7 --- /dev/null +++ b/docs/dws/dev/dws_04_0898.html @@ -0,0 +1,57 @@ + + +

Asynchronous I/O Operations

+

enable_adio_debug

Parameter description: Specifies whether O&M personnel are allowed to generate some ADIO logs to locate ADIO issues. This parameter is used only by developers. Common users are advised not to use it.

+

Type: SUSET

+

Value range: Boolean

+
  • on or true indicates the log switch is enabled.
  • off or false indicates the log switch is disabled.
+

Default value: off

+
+

enable_fast_allocate

Parameter description: Specifies whether the quick allocation switch of the disk space is enabled. This switch can be enabled only in the XFS file system.

+

Type: SUSET

+

Value range: Boolean

+
  • on or true indicates that this function is enabled.
  • off or false indicates that the function is disabled.
+

Default value: off

+
+

prefetch_quantity

Parameter description: Specifies the number of row-store prefetches using the ADIO.

+

Type: USERSET

+

Value range: an integer ranging from 1024 to 1048576. The unit is 8 KB.

+

Default value: 32 MB

+
+

backwrite_quantity

Parameter description: Specifies the number of row-store writes using the ADIO.

+

Type: USERSET

+

Value range: an integer ranging from 1024 to 1048576. The unit is 8 KB.

+

Default value: 8MB

+
+

cstore_prefetch_quantity

Parameter description: Specifies the number of column-store prefetches using the ADIO.

+

Type: USERSET

+

Value range: an integer. The value range is from 1024 to 1048576 and the unit is KB.

+

Default value: 32 MB

+
+

cstore_backwrite_quantity

Parameter description: Specifies the number of column-store writes using the ADIO.

+

Type: USERSET

+

Value range: an integer. The value range is from 1024 to 1048576 and the unit is KB.

+

Default value: 8MB

+
+

cstore_backwrite_max_threshold

Parameter description: Specifies the maximum number of column-store writes buffered in the database using the ADIO.

+

Type: USERSET

+

Value range: An integer. The value range is from 4096 to INT_MAX/2 and the unit is KB.

+

Default value: 2 GB

+
+

fast_extend_file_size

Parameter description: Specifies the disk size that the row-store pre-scales using the ADIO.

+

Type: SUSET

+

Value range: an integer. The value range is from 1024 to 1048576 and the unit is KB.

+

Default value: 8MB

+
+

effective_io_concurrency

Parameter description: Specifies the number of requests that can be simultaneously processed by the disk subsystem. For the RAID array, the parameter value must be the number of disk drive spindles in the array.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 1000

+

Default value: 1

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0899.html b/docs/dws/dev/dws_04_0899.html new file mode 100644 index 00000000..bfe9b5a4 --- /dev/null +++ b/docs/dws/dev/dws_04_0899.html @@ -0,0 +1,40 @@ + + +

Parallel Data Import

+

GaussDB(DWS) provides a parallel data import function that enables a large amount of data to be imported in a fast and efficient manner. This section describes parameters for importing data in parallel in GaussDB(DWS).

+

raise_errors_if_no_files

Parameter description: Specifies whether distinguish between the problems "the number of imported file records is empty" and "the imported file does not exist". If this parameter is set to true and the problem "the imported file does not exist" occurs, GaussDB(DWS) will report the error message "file does not exist".

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates the messages of "the number of imported file records is empty" and "the imported file does not exist" are distinguished when files are imported.
  • off indicates the messages of "the number of imported file records is empty" and "the imported file does not exist" are not distinguished when files are imported.
+

Default value: off

+
+

partition_mem_batch

Parameter description: To optimize the inserting of column-store partitioned tables in batches, data is cached during the inserting process and then written to the disk in batches. You can use partition_mem_batch to specify the number of buffers. If the value is too large, much memory will be consumed. If it is too small, the performance of inserting column-store partitioned tables in batches will deteriorate.

+

Type: USERSET

+

Value range: 1 to 65535

+

Default value: 256

+
+

partition_max_cache_size

Parameter description: To optimize the inserting of column-store partitioned tables in batches, data is cached during the inserting process and then written to the disk in batches. You can use partition_max_cache_size to specify the size of the data buffer. If the value is too large, much memory will be consumed. If it is too small, the performance of inserting column-store partitioned tables in batches will deteriorate.

+

Type: USERSET

+

Value range: 4096 to INT_MAX/2. The minimum unit is KB.

+

Default value: 2 GB

+
+

gds_debug_mod

Parameter description: Specifies whether to enable the debug function of Gauss Data Service (GDS). This parameter is used to better locate and analyze GDS faults. After the debug function is enabled, types of packets received or sent by GDS, peer end of GDS during command interaction, and other interaction information about GDS are written into the logs of corresponding nodes. In this way, state switching on the GaussDB state machine and the current state are recorded. If this function is enabled, additional log I/O resources will be consumed, affecting log performance and validity. You are advised to enable this function only when locating GDS faults.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the GDS debug function is enabled.
  • off indicates that the GDS debug function is disabled.
+

Default value: off

+
+

enable_delta_store

Parameter description: This parameter has been discarded. You can set this parameter to on for forward compatibility, but the setting will not take effect.

+

For details about how to enable the delta table function of column-store tables, see the table-level parameter enable_delta in "CREATE TABLE" in the SQL Syntax.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the delta table function of column-store tables is enabled.
  • off indicates that the delta table function of column-store tables is disabled.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0900.html b/docs/dws/dev/dws_04_0900.html new file mode 100644 index 00000000..9969ead7 --- /dev/null +++ b/docs/dws/dev/dws_04_0900.html @@ -0,0 +1,19 @@ + + +

Write Ahead Logs

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0901.html b/docs/dws/dev/dws_04_0901.html new file mode 100644 index 00000000..05e0eb89 --- /dev/null +++ b/docs/dws/dev/dws_04_0901.html @@ -0,0 +1,67 @@ + + +

Settings

+

wal_level

Parameter description: Specifies the level of the information that is written to WALs.

+

Type: POSTMASTER

+

Value range: enumerated values

+
  • minimal

    Advantages: Certain bulk operations (including creating tables and indexes, executing cluster operations, and copying tables) are safely skipped in logging, which can make those operations much faster.

    +

    Disadvantages: WALs only contain basic information required for the recovery from a database server crash or an emergency shutdown. Archived WALs cannot be used to restore data.

    +
  • archive

    Adds logging required for WAL archiving, supporting the database restoration from archives.

    +
  • hot_standby
    • Further adds information required to run SQL queries on a standby server and takes effect after a server restart.
    • To enable read-only queries on a standby server, the wal_level parameter must be set to hot_standby on the primary server and the same value must be set on the standby server. There is little measurable difference in performance between using hot_standby and archive levels, so feedback is welcome if any production performance impacts are noticeable.
    +
+

Default value: hot_standby

+
  • To enable WAL archiving and data streaming replication between primary and standby servers, set this parameter to archive or hot_standby.
  • If this parameter is set to archive, hot_standby must be set to off. Otherwise, the database startup fails.
+
+
+

synchronous_commit

Parameter description: Specifies the synchronization mode of the current transaction.

+

Type: USERSET

+

Value range: enumerated values

+
  • on indicates synchronization logs of a standby server are flushed to disks.
  • off indicates asynchronous commit.
  • local indicates local commit.
  • remote_write indicates synchronization logs of a standby server are written to disks.
  • remote_receive indicates synchronization logs of a standby server are required to receive data.
+

Default value: on

+
+

wal_buffers

Parameter description: Specifies the number of XLOG_BLCKSZs used for storing WAL data. The size of each XLOG_BLCKSZ is 8 KB.

+

Type: POSTMASTER

+

Value range: -1 to 218. The unit is 8 KB.

+
  • If this parameter is set to -1, the value of wal_buffers is automatically changed to 1/32 of shared_buffers. The minimum value is 8 x XLOG_BLCKSZ, and the maximum value is 2048 x XLOG_BLCKSZ.
  • If it is set to a value smaller than 8, the value 8 is used. If it is set to a value greater than 2048, the value 2048 is used.
+

Default value: 16 MB

+

Setting suggestions: The content of WAL buffers is written to disks at each transaction commit, and setting this parameter to a large value does not significantly improve system performance. Setting this parameter to hundreds of megabytes can improve the disk writing performance on the server, to which a large number of transactions are committed. Based on experiences, the default value meets user requirements in most cases.

+
+

commit_delay

Parameter description: Specifies the duration of committed data be stored in the WAL buffer.

+

Type: USERSET

+

Value range: an integer, ranging from 0 to 100000 (unit: μs). 0 indicates no delay.

+

Default value: 0

+
  • When this parameter is set to a value other than 0, the committed transaction is stored in the WAL buffer instead of being written to the WAL immediately. Then, the WALwriter process flushes the buffer out to disks periodically.
  • If system load is high, other transactions are probably ready to be committed within the delay. If no transactions are waiting to be submitted, the delay is a waste of time.
+
+
+

commit_siblings

Parameter description: Specifies a limit on the number of ongoing transactions. If the number of ongoing transactions is greater than the limit, a new transaction will wait for the period of time specified by commit_delay before it is submitted. If the number of ongoing transactions is less than the limit, the new transaction is immediately written into a WAL.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 1000

+

Default value: 5

+
+

enable_xlog_group_insert

Parameter description: Specifies whether to enable the group insertion mode for WALs. Only the Kunpeng architecture supports this parameter.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on: enabled
  • off: disabled
+

Default value: on

+
+

wal_compression

Parameter description: Specifies whether to compress FPI pages.

+

Type: USERSET

+

Value range: Boolean

+
  • on: enable the compression
  • off: disable the compression
+

Default value: on

+
  • Only zlib compression algorithm is supported.
  • For clusters that are upgraded to the current version from an earlier version, this parameter is set to off by default. You can run the gs_guc command to enable the FPI compression function if needed.
  • If the current version is a newly installed version, this parameter is set to on by default.
  • If this parameter is manually enabled for a cluster upgraded from an earlier version, the cluster cannot be rolled back.
+
+
+

wal_compression_level

Parameter description: Specifies the compression level of zlib compression algorithm when the wal_compression parameter is enabled.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 9.

+
  • 0 indicates no compression.
  • 1 indicates the lowest compression ratio.
  • 9 indicates the highest compression ratio.
+

Default value: 9

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0902.html b/docs/dws/dev/dws_04_0902.html new file mode 100644 index 00000000..7cf95d1f --- /dev/null +++ b/docs/dws/dev/dws_04_0902.html @@ -0,0 +1,40 @@ + + +

Checkpoints

+

checkpoint_segments

Parameter description: Specifies the minimum number of WAL segment files in the period specified by checkpoint_timeout. The size of each log file is 16 MB.

+

Type: SIGHUP

+

Value range: an integer. The minimum value is 1.

+

Default value: 64

+

Increasing the value of this parameter speeds up the export of big data. Set this parameter based on checkpoint_timeout and shared_buffers. This parameter affects the number of WAL log segment files that can be reused. Generally, the maximum number of reused files in the pg_xlog folder is twice the number of checkpoint segments. The reused files are not deleted and are renamed to the WAL log segment files which will be later used.

+
+
+

checkpoint_timeout

Parameter description: Specifies the maximum time between automatic WAL checkpoints.

+

Type: SIGHUP

+

Value range: an integer ranging from 30 to 3600 (s)

+

Default value: 15min

+

If the value of checkpoint_segments is increased, you need to increase the value of this parameter. The increase of them further requires the increase of shared_buffers. Consider all these parameters during setting.

+
+
+

checkpoint_completion_target

Parameter description: Specifies the target of checkpoint completion, as a fraction of total time between checkpoints.

+

Type: SIGHUP

+

Value range: 0.0 to 1.0. The default value 0.5 indicates that each checkpoint must be completed within 50% of the checkpoint interval.

+

Default value: 0.5

+
+

checkpoint_warning

Parameter description: Specifies a time in seconds. If the checkpoint interval is close to this time due to filling of checkpoint segment files, a message is sent to the server log to increase the value of checkpoint_segments.

+

Type: SIGHUP

+

Value range: an integer (unit: s). 0 indicates that warning is disabled.

+

Default value: 5min

+

Recommended value: 5min

+
+

checkpoint_wait_timeout

Parameter description: Specifies the longest time that the checkpoint waits for the checkpointer thread to start.

+

Type: SIGHUP

+

Value range: an integer ranging from 2 to 3600 (s)

+

Default value: 1min

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0903.html b/docs/dws/dev/dws_04_0903.html new file mode 100644 index 00000000..9b692c9e --- /dev/null +++ b/docs/dws/dev/dws_04_0903.html @@ -0,0 +1,45 @@ + + +

Archiving

+

archive_mode

Parameter description: When archive_mode is enabled, completed WAL segments are sent to archive storage by setting archive_command.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on: The archiving is enabled.
  • off: The archiving is disabled.
+

Default value: off

+

When wal_level is set to minimal, archive_mode cannot be used.

+
+
+

archive_command

Parameter description: Specifies the command used to archive WALs set by the administrator. You are advised to set the archive log path to an absolute path.

+

Type: SIGHUP

+

Value range: a string

+

Default value: (disabled)

+
  • Any %p in the string is replaced with the absolute path of the file to archive, and any %f is replaced with only the file name. (The relative path is relative to the data directory.) Use %% to embed an actual % character in the command.
  • This command returns zero only if it succeeds. Example:
    1
    +2
    archive_command = 'cp --remove-destination %p /mnt/server/archivedir/%f' 
    +archive_command = 'copy %p /mnt/server/archivedir/%f'  # Windows
    +
    + +
    +
  • --remove-destination indicates that files will be overwritten during the archiving.
  • When archive_mode is set to on or not specified, a backup folder will be created in the pg_xlog directory and WALs will be compressed and copied to the pg_xlog/backup directory.
+
+
+

max_xlog_backup_size

Parameter description: Specifies the size of WAL logs backed up in the pg_xlog/backup directory.

+

Type: SIGHUP

+

Value range: an integer between 1048576 and 104857600. The unit is KB.

+

Default value: 2097152

+
  • The max_xlog_backup_size parameter setting takes effect only when archive_mode is enabled and archive_command is set to NULL.
  • The system checks the size of backup WALs in the pg_xlog/backup directory every minute. If the size exceeds the value specified by max_xlog_backup_size, the system deletes the earliest backup WALs until the size is less than the max_xlog_backup_size value × 0.9.
+
+
+

archive_timeout

Parameter description: Specifies the archiving period.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX. The unit is second. 0 indicates that archiving timeout is disabled.

+

Default value: 0

+
  • The server is forced to switch to a new WAL segment file with the period specified by this parameter.
  • Archived files that are closed early due to a forced switch are still of the same length as completely full files. Therefore, a very short archive_timeout will bloat the archive storage. You are advised to set archive_timeout to 60s.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0904.html b/docs/dws/dev/dws_04_0904.html new file mode 100644 index 00000000..4b0f73c1 --- /dev/null +++ b/docs/dws/dev/dws_04_0904.html @@ -0,0 +1,17 @@ + + +

HA Replication

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0905.html b/docs/dws/dev/dws_04_0905.html new file mode 100644 index 00000000..29128f4e --- /dev/null +++ b/docs/dws/dev/dws_04_0905.html @@ -0,0 +1,41 @@ + + +

Sending Server

+

wal_keep_segments

Parameter description: Specifies the number of Xlog file segments. Specifies the minimum number of transaction log files stored in the pg_xlog directory. The standby server obtains log files from the primary server for streaming replication.

+

Type: SIGHUP

+

Value range: an integer ranging from 2 to INT_MAX

+

Default value: 65

+

Setting suggestions:

+
  • During WAL archiving or recovery from a checkpoint on the server, the system retains more log files than the number specified by wal_keep_segments.
  • If this parameter is set to a too small value, a transaction log may have been overwritten by a new transaction log before requested by the standby server. As a result, the request fails, and the relationship between the primary and standby servers is interrupted.
  • If the HA system uses asynchronous transmission, increase the value of wal_keep_segments when data greater than 4 GB is continuously imported in COPY mode. Take T6000 board as an example. If the data to be imported reaches 50 GB, you are advised to set this parameter to 1000. You can dynamically restore the setting of this parameter after data import is complete and the WAL synchronization is proper.
+
+

wal_sender_timeout

Parameter description: Specifies the maximum duration that the sending server waits for the WAL reception in the receiver.

+

Type: SIGHUP

+
  • If the primary server contains a huge volume of data, increase the value of this parameter for database rebuilding.
  • This parameter cannot be set to a value larger than the value of wal_receiver_timeout or the timeout parameter for database rebuilding.
+
+

Value range: an integer ranging from 0 to INT_MAX. The unit is millisecond (ms).

+

Default value: 15s

+
+

max_replication_slots

Parameter description: Specifies the number of log replication slots on the primary server.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 262143

+

Default value: 8

+

A physical replication slot provides an automatic method to ensure that an Xlog is not removed from a primary DN before all the standby and secondary DNs receive it. Physical replication slots are used to support HA clusters. The number of physical replication slots required by a cluster is as follows: ratio of standby and secondary DNs to the primary DN in a ring of DNs. For example, if an HA cluster has 1 primary DN, 1 standby DN, and 1 secondary DN, the number of required physical replication slots will be 2.

+
Plan the number of logical replication slots as follows:
  • A logical replication slot can carry changes of only one database for decoding. If multiple databases are involved, create multiple logical replication slots.
  • If logical replication is needed by multiple target databases, create multiple logical replication slots in the source database. Each logical replication slot corresponds to one logical replication link.
+
+
+

max_build_io_limit

Parameter description: Specifies the data volume that can be read from the disk per second when the primary server provides a build session to the standby server.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 1048576. The unit is KB. The value 0 indicates that the I/O flow is not restricted when the primary server provides a build session to the standby server.

+

Default value: 0

+

Setting suggestions: Set this parameter based on the disk bandwidth and job model. If there is no flow restriction or job interference, for disks with good performance such as SSDs, a full build consumes a relatively small proportion of bandwidth and has little impact on service performance. In this case, you do not need to set the threshold. If the service performance of a common 10,000 rpm SAS disk deteriorates significantly during a build, you are advised to set the parameter to 20 MB.

+

This setting directly affects the build speed and completion time. Therefore, you are advised to set this parameter to a value larger than 10 MB. During off-peak hours, you are advised to remove the flow restriction to restore to the normal build speed.

+
  • This parameter is used during peak hours or when the disk I/O pressure of the primary server is high. It limits the build flow rate on the standby server to reduce the impact on primary server services. After the service peak hours, you can remove the restriction or reset the flow rate threshold.
  • You are advised to set a proper threshold based on service scenarios and disk performance.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0906.html b/docs/dws/dev/dws_04_0906.html new file mode 100644 index 00000000..9b0326d8 --- /dev/null +++ b/docs/dws/dev/dws_04_0906.html @@ -0,0 +1,39 @@ + + +

Primary Server

+

vacuum_defer_cleanup_age

Parameter description: Specifies the number of transactions by which VACUUM will defer the cleanup of invalid row-store table records, so that VACUUM and VACUUM FULL do not clean up deleted tuples immediately.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 1000000. 0 means no delay.

+

Default value: 0

+
+

data_replicate_buffer_size

Parameter description: Specifies the size of memory used by queues when the sender sends data pages to the receiver. The value of this parameter affects the buffer size copied for the replication between the primary and standby servers.

+

Type: POSTMASTER

+

Value range: an integer ranging from 4 to 1023. The unit is MB.

+

Default value: 128 MB

+
+

enable_data_replicate

Parameter description: Specifies the data synchronization mode between the primary and standby servers when data is imported to row-store tables in a database.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that data pages are used for the data synchronization between the primary and standby servers when data is imported to row-store tables in a database. This parameter cannot be set to on if replication_type is set to 1.
  • off indicates that the primary and standby servers synchronize data using Xlogs while the data is imported to a row-store table.
+

Default value: on

+
+

enable_incremental_catchup

Parameter description: Specifies the data catchup mode between the primary and standby nodes.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the standby node uses the incremental catchup mode. That is, the standby server scans local data files on the standby server to obtain the list of differential data files between the primary and standby nodes and then performs catchup between the primary and standby nodes.
  • off indicates that the standby node uses the full catchup mode. That is, the standby node scans all local data files on the primary node to obtain the list of differential data files between the primary and standby nodes and performs catchup between the primary and standby nodes.
+

Default value: on

+
+

wait_dummy_time

Parameter description: Specifies the maximum duration for the primary, standby, and secondary clusters to wait for the secondary cluster to start in sequence and the maximum duration for the secondary cluster to send the scanning list when incremental data catchup is enabled.

+

Type: SIGHUP

+

Value range: Integer, from 1 to INT_MAX, in seconds.

+

Default value: 300s

+

The unit can only be second.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0908.html b/docs/dws/dev/dws_04_0908.html new file mode 100644 index 00000000..9df4390e --- /dev/null +++ b/docs/dws/dev/dws_04_0908.html @@ -0,0 +1,21 @@ + + +

Query Planning

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0909.html b/docs/dws/dev/dws_04_0909.html new file mode 100644 index 00000000..82b80a72 --- /dev/null +++ b/docs/dws/dev/dws_04_0909.html @@ -0,0 +1,198 @@ + + +

Optimizer Method Configuration

+

These configuration parameters provide a crude method of influencing the query plans chosen by the query optimizer. If the default plan chosen by the optimizer for a particular query is not optimal, a temporary solution is to use one of these configuration parameters to force the optimizer to choose a different plan. Better ways include adjusting the optimizer cost constants, manually running ANALYZE, increasing the value of the default_statistics_target configuration parameter, and adding the statistics collected in a specific column using ALTER TABLE SET STATISTICS.

+

enable_bitmapscan

Parameter description: Controls whether the query optimizer uses the bitmap-scan plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_hashagg

Parameter description: Controls whether the query optimizer uses the Hash aggregation plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_hashjoin

Parameter description: Controls whether the query optimizer uses the Hash-join plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_indexscan

Parameter description: Controls whether the query optimizer uses the index-scan plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_indexonlyscan

Parameter description: Controls whether the query optimizer uses the index-only-scan plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_material

Parameter description: Controls whether the query optimizer uses materialization. It is impossible to suppress materialization entirely, but setting this parameter to off prevents the optimizer from inserting materialized nodes.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_mergejoin

Parameter description: Controls whether the query optimizer uses the merge-join plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: off

+
+

enable_nestloop

Parameter description: Controls whether the query optimizer uses the nested-loop join plan type to fully scan internal tables. It is impossible to suppress nested-loop joins entirely, but setting this parameter to off allows the optimizer to choose other methods if available.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: off

+
+

enable_index_nestloop

Parameter description: Controls whether the query optimizer uses the nested-loop join plan type to scan the parameterized indexes of internal tables.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the query optimizer uses the nested-loop join plan type.
  • off indicates the query optimizer does not use the nested-loop join plan type.
+

Default value: The default value for a newly installed cluster is on. If the cluster is upgraded from R8C10, the forward compatibility is retained. If the version is upgraded from R7C10 or an earlier version, the default value is off.

+
+

enable_seqscan

Parameter description: Controls whether the query optimizer uses the sequential scan plan type. It is impossible to suppress sequential scans entirely, but setting this variable to off allows the optimizer to preferentially choose other methods if available.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_sort

Parameter description: Controls whether the query optimizer uses the sort method. It is impossible to suppress explicit sorts entirely, but setting this variable to off allows the optimizer to preferentially choose other methods if available.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_tidscan

Parameter description: Controls whether the query optimizer uses the Tuple ID (TID) scan plan type.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_kill_query

Parameter description: In CASCADE mode, when a user is deleted, all the objects belonging to the user are deleted. This parameter specifies whether the queries of the objects belonging to the user can be unlocked when the user is deleted.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates the unlocking is allowed.
  • off indicates the unlocking is not allowed.
+

Default value: off

+
+

enforce_oracle_behavior

Parameter description: Controls the rule matching modes of regular expressions.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the ORACLE matching rule is used.
  • off indicates that the POSIX matching rule is used.
+

Default value: on

+
+

enable_stream_concurrent_update

Parameter description: Controls the use of stream in concurrent updates. This parameter is restricted by the enable_stream_operator parameter.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the optimizer can generate stream plans for the UPDATE statement.
  • off indicates that the optimizer can generate only non-stream plans for the UPDATE statement.
+

Default value: on

+
+

enable_stream_operator

Parameter description: Controls whether the query optimizer uses streams.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_stream_recursive

Parameter description: Specifies whether to push WITH RECURSIVE join queries to DNs for processing.

+

Type: USERSET

+

Value range: Boolean

+
  • on: WITH RECURSIVE join queries will be pushed down to DNs.
  • off: WITH RECURSIVE join queries will not be pushed down to DNs.
+

Default value: on

+
+

max_recursive_times

Parameter description: Specifies the maximum number of WITH RECURSIVE iterations.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 200

+
+

enable_vector_engine

Parameter description: Controls whether the query optimizer uses the vectorized executor.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_broadcast

Parameter description: Controls whether the query optimizer uses the broadcast distribution method when it evaluates the cost of stream.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

enable_change_hjcost

Parameter description: Specifies whether the optimizer excludes internal table running costs when selecting the Hash Join cost path. If it is set to on, tables with a few records and high running costs are more possible to be selected.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: off

+
+

enable_fstream

Parameter description: Controls whether the query optimizer uses streams when it delivers statements. This parameter is only used for external HDFS tables.

+

This parameter has been discarded. To reserve forward compatibility, set this parameter to on, but the setting does not make a difference.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: off

+
+

best_agg_plan

Parameter description: The query optimizer generates three plans for the aggregate operation under the stream:
  1. hashagg+gather(redistribute)+hashagg
  2. redistribute+hashagg(+gather)
  3. hashagg+redistribute+hashagg(+gather).
+
+

This parameter is used to control the query optimizer to generate which type of hashagg plans.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 3.

+
  • When the value is set to 1, the first plan is forcibly generated.
  • When the value is set to 2 and if the group by column can be redistributed, the second plan is forcibly generated. Otherwise, the first plan is generated.
  • When the value is set to 3 and if the group by column can be redistributed, the third plan is generated. Otherwise, the first plan is generated.
  • When the value is set to 0, the query optimizer chooses the most optimal plan based on the estimated costs of the three plans above.
+

Default value: 0

+
+

agg_redistribute_enhancement

Parameter description: When the aggregate operation is performed, which contains multiple group by columns and all of the columns are not in the distribution column, you need to select one group by column for redistribution. This parameter controls the policy of selecting a redistribution column.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the column that can be redistributed and evaluates the most distinct value for redistribution.
  • off indicates the first column that can be redistributed for redistribution.
+

Default value: off

+
+

enable_valuepartition_pruning

Parameter description: Specifies whether the DFS partitioned table is dynamically or statically optimized.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the DFS partitioned table is dynamically or statically optimized.
  • off indicates that the DFS partitioned table is not dynamically or statically optimized.
+

Default value: on

+
+

expected_computing_nodegroup

Parameter description: Specifies a computing Node Group or the way to choose such a group. The Node Group mechanism is now for internal use only. You do not need to set it.

+

During join or aggregation operations, a Node Group can be selected in four modes. In each mode, the specified candidate computing Node Groups are listed for the optimizer to select an appropriate one for the current operator.

+

Type: USERSET

+

Value range: a string

+
  • optimal: The list of candidate computing Node Groups consists of the Node Group where the operator's operation objects are located and the DNs in the Node Groups on which the current user has the COMPUTE permission.
  • query: The list of candidate computing Node Groups consists of the Node Group where the operator's operation objects are located and the DNs in the Node Groups where base tables involved in the query are located.
  • bind: If the current session user is a logical cluster user, the candidate computing Node Group is the Node Group of the logical cluster associated with the current user. If the session user is not a logical cluster user, the candidate computing Node Group selection rule is the same as that when this parameter is set to query.
  • Node Group name:
    • If enable_nodegroup_debug is set to off, the list of candidate computing Node Groups consists of the Node Group where the operator's operation objects are located and the specified Node Group.
    • If enable_nodegroup_debug is set to on, the specified Node Group is used as the candidate Node Group.
    +
+

Default value: bind

+
+

enable_nodegroup_debug

Parameter description: Specifies whether the optimizer assigns computing workloads to a specific Node Group when multiple Node Groups exist in an environment. The Node Group mechanism is now for internal use only. You do not need to set it.

+

This parameter takes effect only when expected_computing_nodegroup is set to a specific Node Group.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that computing workloads are assigned to the Node Group specified by expected_computing_nodegroup.
  • off indicates no Node Group is specified to compute.
+

Default value: off

+
+

stream_multiple

Parameter description: Specifies the weight used for optimizer to calculate the final cost of stream operators.

+

The base stream cost is multiplied by this weight to make the final cost.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 1

+

This parameter is applicable only to Redistribute and Broadcast streams.

+
+
+

qrw_inlist2join_optmode

Parameter description: Specifies whether enable inlist-to-join (inlist2join) query rewriting.

+

Type: USERSET

+

Value range: a string

+
  • disable: inlist2join disabled
  • cost_base: cost-based inlist2join query rewriting
  • rule_base: forcible rule-based inlist2join query rewriting
  • A positive integer: threshold of Inlist2join query rewriting. If the number of elements in the list is greater than the threshold, the rewriting is performed.
+

Default value: cost_base

+
+

skew_option

Parameter description: Specifies whether an optimization policy is used

+

Type: USERSET

+

Value range: a string

+
  • off: policy disabled
  • normal: radical policy. All possible skews are optimized.
  • lazy: conservative policy. Uncertain skews are ignored.
+

Default value: normal

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0910.html b/docs/dws/dev/dws_04_0910.html new file mode 100644 index 00000000..826b3d2c --- /dev/null +++ b/docs/dws/dev/dws_04_0910.html @@ -0,0 +1,51 @@ + + +

Optimizer Cost Constants

+

This section describes the optimizer cost constants. The cost variables described in this section are measured on an arbitrary scale. Only their relative values matter, therefore scaling them all in or out by the same factor will result in no differences in the optimizer's choices. By default, these cost variables are based on the cost of sequential page fetches, that is, seq_page_cost is conventionally set to 1.0 and the other cost variables are set with reference to the parameter. However, you can use a different scale, such as actual execution time in milliseconds.

+

seq_page_cost

Parameter description: Specifies the optimizer's estimated cost of a disk page fetch that is part of a series of sequential fetches.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 1

+
+

random_page_cost

Parameter description: Specifies the optimizer's estimated cost of an out-of-sequence disk page fetch.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 4

+
  • Although the server allows you to set the value of random_page_cost to less than that of seq_page_cost, it is not physically sensitive to do so. However, setting them equal makes sense if the database is entirely cached in RAM, because in that case there is no penalty for fetching pages out of sequence. Also, in a heavily-cached database you should lower both values relative to the CPU parameters, since the cost of fetching a page already in RAM is much smaller than it would normally be.
  • This value can be overwritten for tables and indexes in a particular tablespace by setting the tablespace parameter of the same name.
  • Comparing to seq_page_cost, reducing this value will cause the system to prefer index scans and raising it makes index scans relatively more expensive. You can increase or decrease both values at the same time to change the disk I/O cost relative to CPU cost.
+
+
+

cpu_tuple_cost

Parameter description: Specifies the optimizer's estimated cost of processing each row during a query.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 0.01

+
+

cpu_index_tuple_cost

Parameter description: Specifies the optimizer's estimated cost of processing each index entry during an index scan.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 0.005

+
+

cpu_operator_cost

Parameter description: Specifies the optimizer's estimated cost of processing each operator or function during a query.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 0.0025

+
+

effective_cache_size

Parameter description: Specifies the optimizer's assumption about the effective size of the disk cache that is available to a single query.

+

When setting this parameter you should consider both GaussDB(DWS)'s shared buffer and the kernel's disk cache. Also, take into account the expected number of concurrent queries on different tables, since they will have to share the available space.

+

This parameter has no effect on the size of shared memory allocated by GaussDB(DWS). It is used only for estimation purposes and does not reserve kernel disk cache. The value is in the unit of disk page. Usually the size of each page is 8192 bytes.

+

Type: USERSET

+

Value range: an integer ranging is from 1 to INT_MAX. The unit is 8 KB.

+

A value greater than the default one may enable index scanning, and a value less than the default one may enable sequence scanning.

+

Default value: 128 MB

+
+

allocate_mem_cost

Parameter description: Specifies the query optimizer's estimated cost of creating a Hash table for memory space using Hash join. This parameter is used for optimization when the Hash join estimation is inaccurate.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to DBL_MAX

+

Default value: 0

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0911.html b/docs/dws/dev/dws_04_0911.html new file mode 100644 index 00000000..b3af3cfe --- /dev/null +++ b/docs/dws/dev/dws_04_0911.html @@ -0,0 +1,59 @@ + + +

Genetic Query Optimizer

+

This section describes parameters related to genetic query optimizer. The genetic query optimizer (GEQO) is an algorithm that plans queries by using heuristic searching. This algorithm reduces planning time for complex queries and the cost of producing plans are sometimes inferior to those found by the normal exhaustive-search algorithm.

+

geqo

Parameter description: Controls the use of genetic query optimization.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates GEQO is enabled.
  • off indicates GEQO is disabled.
+

Default value: on

+

Generally, do not set this parameter to off. geqo_threshold provides more subtle control of GEQO.

+
+
+

geqo_threshold

Parameter description: Specifies the number of FROM items. Genetic query optimization is used to plan queries when the number of statements executed is greater than this value.

+

Type: USERSET

+

Value range: an integer ranging from 2 to INT_MAX

+

Default value: 12

+
  • For simpler queries it is best to use the regular, exhaustive-search planner, but for queries with many tables it is better to use GEQO to manage the queries.
  • A FULL OUTER JOIN construct counts as only one FROM item.
+
+
+

geqo_effort

Parameter description: Controls the trade-off between planning time and query plan quality in GEQO.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 10

+

Default value: 5

+
  • Larger values increase the time spent in query planning, but also increase the probability that an efficient query plan is chosen.
  • geqo_effort does not have direct effect. This parameter is only used to compute the default values for the other variables that influence GEQO behavior. You can manually set other parameters as required.
+
+
+

geqo_pool_size

Parameter description: Specifies the pool size used by GEQO, that is, the number of individuals in the genetic population.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX

+

The value of this parameter must be at least 2, and useful values are typically from 100 to 1000. If this parameter is set to 0, GaussDB(DWS) selects a proper value based on geqo_effort and the number of tables.

+
+

Default value: 0

+
+

geqo_generations

Parameter description: Specifies the number parameter iterations of the algorithm used by GEQO.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX

+

The value of this parameter must be at least 1, and useful values are typically from 100 to 1000. If it is set to 0, a suitable value is chosen based on geqo_pool_size.

+
+

Default value: 0

+
+

geqo_selection_bias

Parameter description: Specifies the selection bias used by GEQO. The selection bias is the selective pressure within the population.

+

Type: USERSET

+

Value range: a floating point number ranging from 1.5 to 2.0

+

Default value: 2

+
+

geqo_seed

Parameter description: Specifies the initial value of the random number generator used by GEQO to select random paths through the join order search space.

+

Type: USERSET

+

Value range: a floating point number ranging from 0.0 to 1.0

+

Varying the value changes the setting of join paths explored, and may result in a better or worse path being found.

+
+

Default value: 0

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0912.html b/docs/dws/dev/dws_04_0912.html new file mode 100644 index 00000000..2d4d5348 --- /dev/null +++ b/docs/dws/dev/dws_04_0912.html @@ -0,0 +1,203 @@ + + +

Other Optimizer Options

+

default_statistics_target

Parameter description: Specifies the default statistics target for table columns without a column-specific target set via ALTER TABLE SET STATISTICS. If this parameter is set to a positive number, it indicates the number of samples of statistics information. If this parameter is set to a negative number, percentage is used to set the statistic target. The negative number converts to its corresponding percentage, for example, -5 means 5%. During sampling, default_statistics_target * 300 is used as the size of the random sampling. For example, if the default value is 100, 100 x 300 pages are read in a random sampling.

+

Type: USERSET

+

Value range: an integer ranging from -100 to 10000

+
  • A larger positive number than the parameter value increases the time required to do ANALYZE, but might improve the quality of the optimizer's estimates.
  • Changing settings of this parameter may result in performance deterioration. If query performance deteriorates, you can:
    1. Restore to the default statistics.
    2. Use hints to optimize the query plan.
    +
  • If this parameter is set to a negative value, the number of samples is greater than or equal to 2% of the total data volume, and the number of records in user tables is less than 1.6 million, the time taken by running ANALYZE will be longer than when this parameter uses its default value.
  • If this parameter is set to a negative value, the autoanalyze function does not support percentage sampling. The sampling uses the default value of this parameter.
  • If this parameter is set to a positive value, you must have the ANALYZE permission to execute ANALYZE.
  • If this parameter is set to a negative value, that is, percentage sampling, you need to be granted the ANALYZE and SELECT permissions to execute ANALYZE.
+
+

Default value: 100

+
+

constraint_exclusion

Parameter description: Controls the query optimizer's use of table constraints to optimize queries.

+

Type: USERSET

+

Value range: enumerated values

+
  • on indicates the constraints for all tables are examined.
  • off: No constraints are examined.
  • partition indicates that only constraints for inherited child tables and UNION ALL subqueries are examined.

    When constraint_exclusion is set to on, the optimizer compares query conditions with the table's CHECK constraints, and omits scanning tables for which the conditions contradict the constraints.

    +
    +
+

Default value: partition

+

Currently, this parameter is set to on by default to partition tables. If this parameter is set to on, extra planning is imposed on simple queries, which has no benefits. If you have no partitioned tables, set it to off.

+
+
+

cursor_tuple_fraction

Parameter description: Specifies the optimizer's estimated fraction of a cursor's rows that are retrieved.

+

Type: USERSET

+

Value range: a floating point number ranging from 0.0 to 1.0

+

Smaller values than the default value bias the optimizer towards using fast start plans for cursors, which will retrieve the first few rows quickly while perhaps taking a long time to fetch all rows. Larger values put more emphasis on the total estimated time. At the maximum setting of 1.0, cursors are planned exactly like regular queries, considering only the total estimated time and how soon the first rows might be delivered.

+
+

Default value: 0.1

+
+

from_collapse_limit

Parameter description: Specifies whether the optimizer merges sub-queries into upper queries based on the resulting FROM list. The optimizer merges sub-queries into upper queries if the resulting FROM list would have no more than this many items.

+

Type: USERSET

+

Value range: an integer ranging from 1 to INT_MAX

+

Smaller values reduce planning time but may lead to inferior execution plans.

+
+

Default value: 8

+
+

join_collapse_limit

Parameter description: Specifies whether the optimizer rewrites JOIN constructs (except FULL JOIN) into lists of FROM items based on the number of the items in the result list.

+

Type: USERSET

+

Value range: an integer ranging from 1 to INT_MAX

+
  • Setting this parameter to 1 prevents join reordering. As a result, the join order specified in the query will be the actual order in which the relations are joined. The query optimizer does not always choose the optimal join order. Therefore, advanced users can temporarily set this variable to 1, and then specify the join order they desire explicitly.
  • Smaller values reduce planning time but lead to inferior execution plans.
+
+

Default value: 8

+
+

plan_mode_seed

Parameter description: This is a commissioning parameter. Currently, it supports only OPTIMIZE_PLAN and RANDOM_PLAN. OPTIMIZE_PLAN indicates the optimal plan, the cost of which is estimated using the dynamic planning algorithm, and its value is 0. RANDOM_PLAN indicates the plan that is randomly generated. If plan_mode_seed is set to -1, you do not need to specify the value of the seed identifier. Instead, the optimizer generates a random integer ranging from 1 to 2147483647, and then generates a random execution plan based on this random number. If plan_mode_seed is set to an integer ranging from 1 to 2147483647, you need to specify the value of the seed identifier, and the optimizer generates a random execution plan based on the seed value.

+

Type: USERSET

+

Value range: an integer ranging from -1 to 2147483647

+

Default value: 0

+
  • If plan_mode_seed is set to RANDOM_PLAN, the optimizer generates different random execution plans, which may not be the optimal. Therefore, to guarantee the query performance, the default value 0 is recommended during upgrade, scale-out, scale-in, and O&M.
  • If this parameter is not set to 0, the specified hint will not be used.
+
+
+

enable_hdfs_predicate_pushdown

Parameter description: Specifies whether the function of pushing down predicates the native data layer is enabled.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates this function is enabled.
  • off indicates this function is disabled.
+

Default value: on

+
+

enable_random_datanode

Parameter description: Specifies whether the function that random query about DNs in the replication table is enabled. A complete data table is stored on each DN for random retrieval to release the pressure on nodes.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates this function is enabled.
  • off indicates this function is disabled.
+

Default value: on

+
+

hashagg_table_size

Parameter description: Specifies the hash table size during the execution of the HASH AGG operation.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX/2

+

Default value: 0

+
+

enable_codegen

Parameter description: Specifies whether code optimization can be enabled. Currently, the code optimization uses the LLVM optimization.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates code optimization can be enabled.
  • off indicates code optimization cannot be enabled.

    Currently, the LLVM optimization only supports the vectorized executor and SQL on Hadoop features. You are advised to set this parameter to off in other cases.

    +
    +
+

Default value: on

+
+

codegen_strategy

Parameter description: Specifies the codegen optimization strategy that is used when an expression is converted to codegen-based.

+

Type: USERSET

+

Value range: enumerated values

+
  • partial indicates that you can still call the LLVM dynamic optimization strategy using the codegen framework of an expression even if functions that are not codegen-based exist in the expression.
  • pure indicates that the LLVM dynamic optimization strategy can be called only when all functions in an expression can be codegen-based.

    In the scenario where query performance reduces after the codegen function is enabled, you can set this parameter to pure. In other scenarios, do not change the default value partial of this parameter.

    +
    +
+

Default value: partial

+
+

enable_codegen_print

Parameter description: Specifies whether the LLVM IR function can be printed in logs.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the LLVM IR function can be printed in logs.
  • off indicates that the LLVM IR function cannot be printed in logs.
+

Default value: off

+
+

codegen_cost_threshold

Parameter description: The LLVM compilation takes some time to generate executable machine code. Therefore, LLVM compilation is beneficial only when the actual execution cost is more than the sum of the code required for generating machine code and the optimized execution cost. This parameter specifies a threshold. If the estimated execution cost exceeds the threshold, LLVM optimization is performed.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 10000

+
+

enable_constraint_optimization

Parameter description: Specifies whether the informational constraint optimization execution plan can be used for an HDFS foreign table.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates the plan can be used.
  • off indicates the plan cannot be used.
+

Default value: on

+
+

enable_bloom_filter

Parameter description: Specifies whether the BloomFilter optimization is used.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the BloomFilter optimization can be used.
  • off indicates the BloomFilter optimization cannot be used.
+

Default value: on

+
+

enable_extrapolation_stats

Parameter description: Specifies whether the extrapolation logic is used for data of DATE type based on historical statistics. The logic can increase the accuracy of estimation for tables whose statistics are not collected in time, but will possibly provide an overlarge estimation due to incorrect extrapolation. Enable the logic only in scenarios where the data of DATE type is periodically inserted.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the extrapolation logic is used for data of DATE type based on historical statistics.
  • off indicates that the extrapolation logic is not used for data of DATE type based on historical statistics.
+

Default value: off

+
+

autoanalyze

Parameter description: Specifies whether to allow automatic statistics collection for tables that have statistics when generating a plan. Foreign tables nor temporary tables with the ON COMMIT [DELETE ROWS|DROP] option can trigger autoanalyze. To collect statistics, you need to manually perform the ANALYZE operation. If an exception occurs in the database during the execution of autoanalyze on a table, after the database is recovered, the system may still prompt you to collect the statistics of the table when you run the statement again. In this case, manually perform the ANALYZE operation on the table to synchronize statistics.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the table statistics are automatically collected.
  • off indicates that the table statistics are not automatically collected.
+

Default value: on

+
+

query_dop

Parameter description: Specifies the user-defined degree of parallelism.

+

Type: USERSET

+

Value range: an integer ranging from -64 to 64.

+

[1, 64]: Fixed SMP is enabled, and the system will use the specified degree.

+

0: SMP adaptation function is enabled. The system dynamically selects the optimal parallelism degree [1,8] (x86 platforms) or [1,64] (Kunpeng platforms) for each query based on the resource usage and query plans.

+

[-64, -1]: SMP adaptation is enabled, and the system will dynamically select a degree from the limited range.

+
  • For TP services that mainly involve short queries, if services cannot be optimized through lightweight CNs or statement delivery, it will take a long time to generate an SMP plan. You are advised to set query_dop to 1. For AP services with complex statements, you are advised to set query_dop to 0.
  • After enabling concurrent queries, ensure you have sufficient CPU, memory, network, and I/O resources to achieve the optimal performance.
  • To prevent performance deterioration caused by an overly large value of query_dop, the system calculates the maximum number of available CPU cores for a DN and uses the number as the upper limit for this parameter. If the value of query_dop is greater than 4 and also the upper limit, the system resets query_dop to the upper limit.
+
+

Default value: 1

+
+

query_dop_ratio

Parameter description: Specifies the DOP multiple used to adjust the optimal DOP preset in the system when query_dop is set to 0. That is, DOP = Preset DOP x query_dop_ratio (ranging from 1 to 64). If this parameter is set to 1, the DOP cannot be adjusted.

+

Type: USERSET

+

Value range: a floating point number ranging from 0 to 64

+

Default value: 1

+
+

debug_group_dop

Parameter description: Specifies the unified DOP parallelism degree allocated to the groups that use the Stream operator as the vertex in the generated execution plan when the value of query_dop is 0. This parameter is used to manually specify the DOP for specific groups for performance optimization. Its format is G1,D1,G2,D2,...,, where G1 and G2 indicate the group IDs that can be obtained from logs and D1 and D2 indicate the specified DOP values and can be any positive integers.

+

Type: USERSET

+

Value range: a string

+

Default value: empty

+

This parameter is used only for internal optimization and cannot be set. You are advised to use the default value.

+
+
+

enable_analyze_check

Parameter description: Checks whether statistics were collected about tables whose reltuples and relpages are shown as 0 in pg_class during plan generation.

+

Type: SUSET

+

Value range: Boolean

+
  • on enables the check.
  • off disables the check.
+

Default value: on

+
+

enable_sonic_hashagg

Parameter description: Specifies whether to use the Hash Agg operator for column-oriented hash table design when certain constraints are met.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the Hash Agg operator is used for column-oriented hash table design when certain constraints are met.
  • off indicates that the Hash Agg operator is not used for column-oriented hash table design.
+
  • If enable_sonic_hashagg is enabled and certain constraints are met, the Hash Agg operator will be used for column-oriented hash table design, and the memory usage of the operator can be reduced. However, in scenarios where the code generation technology (enabled by enable_codegen) can significantly improve performance, the performance of the operator may deteriorate.
  • If enable_sonic_hashagg is set to on, when certain constraints are met, the hash aggregation operator designed for column-oriented hash tables is used and its name is displayed as Sonic Hash Aggregation in the output of the Explain Analyze/Performance operation. When the constraints are not met, the operator name is displayed as Hash Aggregation.
+
+

Default value: on

+
+

enable_sonic_hashjoin

Parameter description: Specifies whether to use the Hash Join operator for column-oriented hash table design when certain constraints are met.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the Hash Join operator is used for column-oriented hash table design when certain constraints are met.
  • off indicates that the Hash Join operator is not used for column-oriented hash table design.
+
  • Currently, the parameter can be used only for Inner Join.
  • If enable_sonic_hashjoin is enabled, the memory usage of the Hash Inner operator can be reduced. However, in scenarios where the code generation technology can significantly improve performance, the performance of the operator may deteriorate.
  • If enable_sonic_hashjoin is set to on, when certain constraints are met, the hash join operator designed for column-oriented hash tables is used and its name is displayed as Sonic Hash Join in the output of the Explain Analyze/Performance operation. When the constraints are not met, the operator name is displayed as Hash Join.
+
+

Default value: on

+
+

enable_sonic_optspill

Parameter description: Specifies whether to optimize the number of Hash Join or Hash Agg files written to disks in the sonic scenario. This parameter takes effect only when enable_sonic_hashjoin or enable_sonic_hashagg is enabled.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the number of files written to disks is optimized.
  • off indicates that the number of files written to disks is not optimized.
+

For the Hash Join or Hash Agg operator that meets the sonic condition, if this parameter is set to off, one file is written to disks for each column. If this parameter is set to on and the data types of different columns are similar, only one file (a maximum of five files) will be written to disks.

+
+

Default value: on

+
+

expand_hashtable_ratio

Parameter description: Specifies the expansion ratio used to resize the hash table during the execution of the Hash Agg and Hash Join operators.

+

Type: USERSET

+

Value range: a floating point number of 0 or ranging from 0.5 to 10

+
  • Value 0 indicates that the hash table is adaptively expanded based on the current memory size.
  • The value ranging from 0.5 to 10 indicates the multiple used to expand the hash table. Generally, a larger hash table delivers better performance but occupies more memory space. If the memory space is insufficient, data may be spilled to disks in advance, causing performance deterioration.
+
+

Default value: 0

+
+

plan_cache_mode

Parameter description: Specifies the policy for generating an execution plan in the prepare statement.

+

Type: USERSET

+

Value range: enumerated values

+
  • auto indicates that the custom plan or generic plan is selected by default.
  • force_generic_plan indicates that the generic plan is forcibly used.
  • force_custom_plan indicates that the custom plan is forcibly used.
+
  • This parameter is valid only for the prepare statement. It is used when the parameterized field in the prepare statement has severe data skew.
  • custom plan is a plan generated after you run a prepare statement where parameters in the execute statement is embedded in the prepare statement. The custom plan generates a plan based on specific parameters in the execute statement. This scheme generates a preferred plan based on specific parameters each time and has good execution performance. The disadvantage is that the plan needs to be regenerated before each execution, resulting in a large amount of repeated optimizer overhead.
  • generic plan is a plan generated for the prepare statement. The plan policy binds parameters to the plan when you run the execute statement and execute the plan. The advantage of this solution is that repeated optimizer overheads can be avoided in each execution. The disadvantage is that the plan may not be optimal when data skew occurs for the bound parameter field. When some bound parameters are used, the plan execution performance is poor.
+
+

Default value: auto

+
+

wlm_query_accelerate

Parameter description: Specifies whether the query needs to be accelerated when short query acceleration is enabled.

+

Type: USERSET

+

Value range: an integer ranging from –1 to 1

+
  • -1: indicates that short queries are controlled by the fast lane, and the long queries are controlled by the slow lane.
  • 0: indicates that queries are not accelerated. Both short and long queries are controlled by the slow lane.
  • 1: indicates that queries are accelerated. Both short queries and long queries are controlled by the fast lane.
+

Default value: –1

+
+

show_unshippable_warning

Parameter description: Specifies whether to print the alarm for the statement pushdown failure to the client.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Records the reason why the statement cannot be pushed down in a WARNING log and prints the log to the client.
  • off: Logs the reason why the statement cannot be pushed down only.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0913.html b/docs/dws/dev/dws_04_0913.html new file mode 100644 index 00000000..e970dbd1 --- /dev/null +++ b/docs/dws/dev/dws_04_0913.html @@ -0,0 +1,19 @@ + + +

Error Reporting and Logging

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0914.html b/docs/dws/dev/dws_04_0914.html new file mode 100644 index 00000000..964bc44c --- /dev/null +++ b/docs/dws/dev/dws_04_0914.html @@ -0,0 +1,35 @@ + + +

Logging Destination

+

log_truncate_on_rotation

Parameter description: Specifies the writing mode of the log files when logging_collector is set to on.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that GaussDB(DWS) overwrites the existing log file of the same name on the server.
  • off indicates that GaussDB(DWS) appends the log messages to the existing log file of the same name on the server.
+

Default value: off

+

Example:

+

Assume that you plan to keep logs in a period of 7 days, one log file is generated per day, log files generated on Monday are named server_log.Mon and named server_log.Tue on Tuesday (others are named in the same way), and log files generated on the same day in different weeks are overwritten. Implement the plan by performing the following operations: set log_filename to server_log.%a, log_truncate_on_rotation to on, and log_rotation_age to 1440 (indicating the valid duration of the log file is 24 hours).

+
+
+

log_rotation_age

Parameter description: Specifies the interval for creating a log file when logging_collector is set to on. If the difference between the current time and the time when the previous audit log file is created is greater than the value of log_rotation_age, a new log file will be generated.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 24 days. The unit is min, h, or d. 0 indicates that the time-based creation of new log files is disabled.

+

Default value: 1d

+
+

log_rotation_size

Parameter description: Specifies the maximum size of a server log file when logging_collector is set to on. If the total size of messages in a server log exceeds the capacity of the server log file, a log file will be generated.

+

Type: SIGHUP

+

Value range: an integer ranging from INT_MAX to 1024. The unit is KB.

+

0 indicates the capacity-based creation of new log files is disabled.

+

Default value: 20 MB

+
+

event_source

Parameter description: Specifies the identifier of the GaussDB(DWS) error messages in logs when log_destination is set to eventlog.

+

Type: POSTMASTER

+

Value range: a string

+

Default value: PostgreSQL

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0915.html b/docs/dws/dev/dws_04_0915.html new file mode 100644 index 00000000..b810258b --- /dev/null +++ b/docs/dws/dev/dws_04_0915.html @@ -0,0 +1,143 @@ + + +

Logging Time

+

client_min_messages

Parameter description: Specifies which level of messages are sent to the client. Each level covers all the levels following it. The lower the level is, the fewer messages are sent.

+

Type: USERSET

+

When the values of client_min_messages and log_min_messages are the same, the levels are different.

+
+

Valid values: Enumerated values. Valid values: debug5, debug4, debug3, debug2, debug1, info, log, notice, warning, error For details about the parameters, see Table 1.

+

Default value: notice

+
+

log_min_messages

Parameter description: Specifies which level of messages will be written into server logs. Each level covers all the levels following it. The lower the level is, the fewer messages will be written into the log.

+

Type: SUSET

+

When the values of client_min_messages and log_min_messages are the same, the levels are different.

+
+

Value range: enumerated type. Valid values: debug5, debug4, debug3, debug2, debug1, info, log, notice, warning, error, fatal, panic For details about the parameters, see Table 1.

+

Default value: warning

+
+

log_min_error_statement

Parameter description: Specifies which SQL statements that cause errors condition will be recorded in the server log.

+

Type: SUSET

+

Value range: enumerated type. Valid values: debug5, debug4, debug3, debug2, debug1, info, log, notice, warning, error, fatal, panic For details about the parameters, see Table 1.

+
  • The default is error, indicating that statements causing errors, log messages, fatal errors, or panics will be logged.
  • panic: This feature is disabled.
+
+

Default value: error

+
+

log_min_duration_statement

Parameter description: Specifies the threshold for logging statement execution durations. The execution duration that is greater than the specified value will be logged.

+

This parameter helps track query statements that need to be optimized. For clients using extended query protocol, durations of the Parse, Bind, and Execute are logged independently.

+

Type: SUSET

+

If this parameter and log_statement are used at the same time, statements recorded based on the value of log_statement will not be logged again after their execution duration exceeds the value of this parameter. If you are not using syslog, it is recommended that you log the process ID (PID) or session ID using log_line_prefix so that you can link the current statement message to the last logged duration.

+
+

Value range: an integer ranging from -1 to INT_MAX. The unit is millisecond.

+
  • If this parameter is set to 250, execution durations of SQL statements that run 250 ms or longer will be logged.
  • 0: Execution durations of all the statements are logged.
  • –1: This feature is disabled.
+

Default value: 30min

+
+

backtrace_min_messages

Parameter description: Prints the function's stack information to the server's log file if the level of information generated is greater than or equal to this parameter level.

+

Type: SUSET

+

This parameter is used for locating customer on-site problems. Because frequent stack printing will affect the system's overhead and stability, therefore, when you locate the onsite problems, set the value of this parameter to ranks other than fatal and panic.

+
+

Value range: enumerated values

+

Valid values: debug5, debug4, debug3, debug2, debug1, info, log, notice, warning, error, fatal, panic For details about the parameters, see Table 1.

+

Default value: panic

+
+

Table 1 explains the message security levels used in GaussDB(DWS). If logging output is sent to syslog or eventlog, severity is translated in GaussDB(DWS) as shown in the table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Message Severity Levels

Severity

+

Description

+

syslog

+

eventlog

+

debug[1-5]

+

Provides detailed debug information.

+

DEBUG

+

INFORMATION

+

log

+

Reports information of interest to administrators, for example, checkpoint activity.

+

INFO

+

INFORMATION

+

info

+

Provides information implicitly requested by the user, for example, output from VACUUM VERBOSE.

+

INFO

+

INFORMATION

+

notice

+

Provides information that might be helpful to users, for example, notice of truncation of long identifiers and index created as part of the primary key.

+

NOTICE

+

INFORMATION

+

warning

+

Provides warnings of likely problems, for example, COMMIT outside a transaction block.

+

NOTICE

+

WARNING

+

error

+

Reports an error that causes a command to terminate.

+

WARNING

+

ERROR

+

fatal

+

Reports the reason that causes a session to terminate.

+

ERR

+

ERROR

+

panic

+

Reports an error that caused all database sessions to terminate.

+

CRIT

+

ERROR

+
+
+

plog_merge_age

Parameter description: Specifies the output interval of performance log data.

+

Type: SUSET

+

This parameter value is in milliseconds. You are advised to set this parameter to a value that is a multiple of 1000. That is, the value is in seconds. Name extension of the performance log files controlled by this parameter is .prf. These log files are stored in the $GAUSSLOG/gs_profile/<node_name> directory. node_name is the value of pgxc_node_name in the postgres.conf file. You are advised not to use this parameter externally.

+
+

Value range: an integer ranging from 0 to INT_MAX. The unit is millisecond (ms).

+
  • 0 indicates that the current session will not output performance log data.
  • A value other than 0 indicates the output interval of performance log data. The smaller the value is, the more log data is output, resulting in more negative impact on the performance.
+

Default value: 3s

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0916.html b/docs/dws/dev/dws_04_0916.html new file mode 100644 index 00000000..c4e0b3d7 --- /dev/null +++ b/docs/dws/dev/dws_04_0916.html @@ -0,0 +1,178 @@ + + +

Logging Content

+

debug_print_parse

Parameter description: Specifies whether to print parsing tree results.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the printing result function is enabled.
  • off indicates the printing result function is disabled.
+

Default value: off

+
+

debug_print_rewritten

Parameter description: Specifies whether to print query rewriting results.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the printing result function is enabled.
  • off indicates the printing result function is disabled.
+

Default value: off

+
+

debug_print_plan

Parameter description: Specifies whether to print query execution results.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the printing result function is enabled.
  • off indicates the printing result function is disabled.
+

Default value: off

+
  • Debugging information about debug_print_parse, debug_print_rewritten, and debug_print_plan are printed only when the log level is set to log or higher. When these parameters are set to on, their debugging information will be recorded in server logs and will not be sent to client logs. You can change the log level by setting client_min_messages and log_min_messages.
  • Do not invoke the gs_encrypt_aes128 and gs_decrypt_aes128 functions when debug_print_plan is set to on, preventing the risk of sensitive information disclosure. You are advised to filter parameter information of the gs_encrypt_aes128 and gs_decrypt_aes128 functions in the log files generated when debug_print_plan is set to on, and then provide the information to external maintenance engineers for fault locating. After you finish using the logs, delete them as soon as possible.
+
+
+

debug_pretty_print

Parameter description: Specifies the logs produced by debug_print_parse, debug_print_rewritten, and debug_print_plan. The output format is more readable but much longer than the output generated when this parameter is set to off.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the indentation is enabled.
  • off indicates the indentation is disabled.
+

Default value: on

+
+

log_checkpoints

Parameter description: Specifies whether the statistics on the checkpoints and restart points are recorded in the server logs. When this parameter is set to on, statistics on checkpoints and restart points are recorded in the log messages, including the number of buffers to be written and the time spent in writing them.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the statistics on the checkpoints and restart points are recorded in the server logs.
  • off indicates the statistics on the checkpoints and restart points are not recorded in the server logs.
+

Default value: off

+
+

log_connections

Parameter description: Specifies whether to record connection request information of the client.

+

Type: BACKEND

+
  • Session connection parameter. Users are not advised to configure this parameter.
  • Some client programs, such as gsql, attempt to connect twice while determining if a password is required. In this case, duplicate connection receive messages do not necessarily indicate a problem.
+
+

Value range: Boolean

+
  • on indicates the request information is recorded.
  • off indicates the request information is not recorded.
+

Default value: off

+
+

log_disconnections

Parameter description: Specifies whether to record end connection request information of the client.

+

Type: BACKEND

+

Value range: Boolean

+
  • on indicates the request information is recorded.
  • off indicates the request information is not recorded.
+

Default value: off

+

Session connection parameter. Users are not advised to configure this parameter.

+
+
+

log_duration

Parameter description: Specifies whether to record the duration of every completed SQL statement. For clients using extended query protocols, the time required for parsing, binding, and executing steps are logged independently.

+

Type: SUSET

+

Value range: Boolean

+
  • If this parameter is set to off, the difference between setting this parameter and setting log_min_duration_statement is that exceeding log_min_duration_statement forces the text of the query to be logged, but this parameter does not.
  • If this parameter is set to on and log_min_duration_statement has a positive value, all durations are logged but the query text is included only for statements exceeding the threshold. This behavior can be used for gathering statistics in high-load situation.
+

Default value: on

+
+

log_error_verbosity

Parameter description: Specifies the amount of detail written in the server log for each message that is logged.

+

Type: SUSET

+

Value range: enumerated values

+
  • terse indicates that the output excludes the logging of DETAIL, HINT, QUERY, and CONTEXT error information.
  • verbose indicates that the output includes the SQLSTATE error code, the source code file name, function name, and number of the line in which the error occurs.
  • default indicates that the output includes the logging of DETAIL, HINT, QUERY, and CONTEXT error information, and excludes the SQLSTATE error code, the source code file name, function name, and number of the line in which the error occurs.
+

Default value: default

+
+

log_hostname

Parameter description: By default, connection log messages only show the IP address of the connected host. The host name can be recorded when this parameter is set to on. It may take some time to parse the host name. Therefore, the database performance may be affected.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the host name can be simultaneously recorded.
  • off indicates the host name cannot be simultaneously recorded.
+

Default value: off

+
+

log_lock_waits

Parameter description: If the time that a session used to wait a lock is longer than the value of deadlock_timeout, this parameter specifies whether to record this message in the database. This is useful in determining if lock waits are causing poor performance.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates the information is recorded.
  • off indicates the information is not recorded.
+

Default value: off

+
+

log_statement

Parameter description: Specifies whether to record SQL statements. For clients using extended query protocols, logging occurs when an execute message is received, and values of the Bind parameters are included (with any embedded single quotation marks doubled).

+

Type: SUSET

+

Statements that contain simple syntax errors are not logged even if log_statement is set to all, because the log message is emitted only after basic parsing has been completed to determine the statement type. If the extended query protocol is used, this setting also does not log statements before the execution phase (during parse analysis or planning). Set log_min_error_statement to ERROR or lower to log such statements.

+
+

Value range: enumerated values

+
  • none indicates that no statement is recorded.
  • ddl indicates that all data definition statements, such as CREATE, ALTER, and DROP, are recorded.
  • mod indicates that all DDL statements and data modification statements, such as INSERT, UPDATE, DELETE, TRUNCATE, and COPY FROM, are recorded.
  • all indicates that all statements are recorded. The PREPARE, EXECUTE, and EXPLAIN ANALYZE statements are also recorded.
+

Default value: none

+
+

log_temp_files

Parameter description: Specifies whether to record the delete information of temporary files. Temporary files can be created for sorting, hashing, and temporary querying results. A log entry is generated for each temporary file when it is deleted.

+

Type: SUSET

+

Value range: an integer ranging from -1 to INT_MAX. The unit is KB.

+
  • A positive value indicates that the delete information of temporary files whose values are larger than that of log_temp_files is recorded.
  • If the parameter is set to 0, all the delete information of temporary files is recorded.
  • If the parameter is set to -1, the delete information of no temporary files is recorded.
+

Default value: –1

+
+

log_timezone

Parameter description: Specifies the time zone used for time stamps written in the server log. Different from TimeZone, this parameter takes effect for all sessions in the database.

+

Type: SIGHUP

+

Value range: a string

+

Default value: PRC

+

The value can be changed when gs_initdb is used to set system environments.

+
+
+

logging_module

Parameter description: Specifies whether module logs can be output on the server. This parameter is a session-level parameter, and you are not advised to use the gs_guc tool to set it.

+

Type: USERSET

+

Value range: a string

+

Default value: off. All the module logs on the server can be viewed by running show logging_module.

+

Setting method: First, you can run show logging_module to view which module is controllable. For example, the query output result is as follows:

+
1
+2
+3
+4
show logging_module;
+logging_module
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ALL,on(),off(DFS,GUC,HDFS,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,PARQUET,CARBONDATA,SNAPSHOT,XACT,HANDLE,CLOG,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,INSTR,COMM_IPC,COMM_PARAM)
+(1 row)
+
+ +
+

Controllable modules are identified by uppercase letters, and the special ID ALL is used for setting all module logs. You can control module logs to be exported by setting the log modules to on or off. Enable log output for SSL:

+
1
+2
+3
+4
+5
+6
+7
set logging_module='on(SSL)';
+SET
+show logging_module;                                                                                                                                              logging_module                                               
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
+ALL,on(SSL),off(DFS,GUC,HDFS,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_CA
+RD,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,PARQUET,CARBONDATA,SNAPSHOT,XACT,HANDLE,CLOG,TQUAL,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,INSTR,COMM_IPC,COMM_PARAM,CSTORE)
+(1 row)
+
+ +
+

SSL log output is enabled.

+

The ALL identifier is equivalent to a shortcut operation. That is, logs of all modules can be enabled or disabled.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
set logging_module='off(ALL)';
+SET
+show logging_module;                                                                                                                                                logging_module                                              
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
+ALL,on(),off(DFS,GUC,HDFS,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_C
+ARD,OPT_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,PARQUET,CARBONDATA,SNAPSHOT,XACT,HANDLE,CLOG,TQUAL,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,INSTR,COMM_IPC,COMM_PARAM,CSTORE)
+(1 row)
+
+set logging_module='on(ALL)';
+SET
+show logging_module;                                                                                                                                               logging_module                                              
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
+ALL,on(DFS,GUC,HDFS,ORC,SLRU,MEM_CTL,AUTOVAC,CACHE,ADIO,SSL,GDS,TBLSPC,WLM,OBS,EXECUTOR,VEC_EXECUTOR,STREAM,LLVM,OPT,OPT_REWRITE,OPT_JOIN,OPT_AGG,OPT_SUBPLAN,OPT_SETOP,OPT_CARD,OP
+T_SKEW,UDF,COOP_ANALYZE,WLMCP,ACCELERATE,PLANHINT,PARQUET,CARBONDATA,SNAPSHOT,XACT,HANDLE,CLOG,TQUAL,EC,REMOTE,CN_RETRY,PLSQL,TEXTSEARCH,SEQ,INSTR,COMM_IPC,COMM_PARAM,CSTORE),off()
+(1 row)
+
+ +
+

Dependency relationship: The value of this parameter depends on the settings of log_min_messages.

+
+

enable_unshipping_log

Parameter description: Specifies whether to log statements that are not pushed down. The logs help locate performance issues that may be caused by statements not pushed down.

+

Type: SUSET

+

Value range: Boolean

+
  • on: Statements not pushed down will be logged.
  • off: Statements not pushed down will not be logged.
+

Default value: on

+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0918.html b/docs/dws/dev/dws_04_0918.html new file mode 100644 index 00000000..14b9e5b0 --- /dev/null +++ b/docs/dws/dev/dws_04_0918.html @@ -0,0 +1,27 @@ + + +

Alarm Detection

+

During cluster running, error scenarios can be detected in a timely manner to inform users as soon as possible.

+

enable_alarm

Parameter description: Enables the alarm detection thread to detect the fault scenarios that may occur in the database.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates the alarm detection thread can be enabled.
  • off indicates the alarm detection thread cannot be enabled.
+

Default value: on

+
+

connection_alarm_rate

Parameter description: Specifies the ratio restriction that the maximum number of allowed parallel connections to the database. The maximum number of concurrent connections to the database is max_connections x connection_alarm_rate.

+

Type: SIGHUP

+

Value range: a floating point number ranging from 0.0 to 1.0

+

Default value: 0.9

+
+

alarm_report_interval

Parameter description: Specifies the interval at which an alarm is reported.

+

Type: SIGHUP

+

Value range: a non-negative integer. The unit is second.

+

Default value: 10

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0919.html b/docs/dws/dev/dws_04_0919.html new file mode 100644 index 00000000..0f738337 --- /dev/null +++ b/docs/dws/dev/dws_04_0919.html @@ -0,0 +1,17 @@ + + +

Statistics During the Database Running

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0920.html b/docs/dws/dev/dws_04_0920.html new file mode 100644 index 00000000..5c2161f0 --- /dev/null +++ b/docs/dws/dev/dws_04_0920.html @@ -0,0 +1,110 @@ + + +

Query and Index Statistics Collector

+

The query and index statistics collector is used to collect statistics during database running. The statistics include the times of inserting and updating a table and an index, the number of disk blocks and tuples, and the time required for the last cleanup and analysis on each table. The statistics can be viewed by querying system view families pg_stats and pg_statistic. The following parameters are used to set the statistics collection feature in the server scope.

+

track_activities

Parameter description: Collects statistics about the commands that are being executed in session.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the statistics collection function is enabled.
  • off indicates that the statistics collection function is disabled.
+

Default value: on

+
+

track_counts

Parameter description: Collects statistics about data activities.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the statistics collection function is enabled.
  • off indicates that the statistics collection function is disabled.
+

When the database to be cleaned up is selected from the AutoVacuum automatic cleanup process, the database statistics are required. In this case, the default value is set to on.

+
+

Default value: on

+
+

track_io_timing

Parameter description: Collects statistics about I/O invoking timing in the database. The I/O timing statistics can be queried by using the pg_stat_database parameter.

+

Type: SUSET

+

Value range: Boolean

+
  • If this parameter is set to on, the collection function is enabled. In this case, the collector repeatedly queries the OS at the current time. As a result, large numbers of costs may occur on some platforms. Therefore, the default value is set to off.
  • off indicates that the statistics collection function is disabled.
+

Default value: off

+
+

track_functions

Parameter description: Collects statistics about invoking times and duration in a function.

+

Type: SUSET

+

When the SQL functions are set to inline functions queried by the invoking, these SQL functions cannot be traced no matter these functions are set or not.

+
+

Value range: enumerated values

+
  • pl indicates that only procedural language functions are traced.
  • all indicates that SQL and C language functions are traced.
  • none indicates that the function tracing function is disabled.
+

Default value: none

+
+

track_activity_query_size

Parameter description: Specifies byte counts of the current running commands used to trace each active session.

+

Type: POSTMASTER

+

Value range: an integer ranging from 100 to 102400

+

Default value: 1024

+
+

update_process_title

Parameter description: Collects statistics updated with a process name each time the server receives a new SQL statement.

+

The process name can be viewed on Windows task manager by running the ps command.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the statistics collection function is enabled.
  • off indicates that the statistics collection function is disabled.
+

Default value: off

+
+

track_thread_wait_status_interval

Parameter description: Specifies the interval of collecting the thread status information periodically.

+

Type: SUSET

+

Value range: an integer ranging from 0 to 1440. The unit is minute (min).

+

Default value: 30min

+
+

enable_save_datachanged_timestamp

Parameter description: Specifies whether to record the time when INSERT, UPDATE, DELETE, or EXCHANGE/TRUNCATE/DROP PARTITION is performed on table data.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the time when an operation is performed on table data will be recorded.
  • off indicates that the time when an operation is performed on table data will not be recorded.
+

Default value: on

+
+

instr_unique_sql_count

Parameter description: Specifies whether to collect Unique SQL statements and the maximum number of unique SQL statements that can be collected.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX

+
  • If it is set to 0, Unique SQL statistics are not collected.
  • If the value is greater than 0, the number of Unique SQL statements collected on the CN cannot exceed the value of this parameter. When the number of collected unique SQL statements reaches the upper limit, new unique SQL statements are not collected. In this case, you can increase the value of reload to continue collecting new unique SQL statements.
+

Default value: 0

+

If a new value is loaded using reload and the new value is less than the original value, the Unique SQL statistics collected by the corresponding CN will be cleared. Note that the clearing operation is performed by the background thread of the resource management module. If the GUC parameter use_workload_manager is set to off, the clearing operation may fail. In this case, you can use the reset_instr_unique_sql function for clearing.

+
+
+

track_sql_count

Parameter description: Specifies whether to collect statistics on the number of the SELECT, INSERT, UPDATE, DELETE, and MERGE INTO statements that are being executed in each session, the response time of the SELECT, INSERT, UPDATE, and DELETE statements, and the number of DDL, DML, and DCL statements.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the statistics collection function is enabled.
  • off indicates that the statistics collection function is disabled.
+

Default value: on

+
  • The track_sql_count parameter is restricted by the track_activities parameter.
    • If track_activities is set to on and track_sql_count is set to off, a warning message indicating that track_sql_count is disabled will be displayed when the view gs_sql_count, pgxc_sql_count, gs_workload_sql_count, pgxc_workload_sql_count, global_workload_sql_count, gs_workload_sql_elapse_time, pgxc_workload_sql_elapse_time, or global_workload_sql_elapse_time are queried.
    • If both track_activities and track_sql_count are set to off, two logs indicating that track_activities is disabled and track_sql_count is disabled will be displayed when the views are queried.
    • If track_activities is set to off and track_sql_count is set to on, a log indicating that track_activities is disabled will be displayed when the views are queried.
    +
+
  • If this parameter is disabled, querying the view returns 0.
+
+
+

enable_track_wait_event

Parameter description: Specifies whether to collect statistics on waiting events, including the number of occurrence times, number of failures, duration, maximum waiting time, minimum waiting time, and average waiting time.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the statistics collection function is enabled.
  • off indicates that the statistics collection function is disabled.
+

Default value: off

+
  • The enable_track_wait_event parameter is restricted by track_activities. Its functions cannot take effect no matter whether it is enabled if track_activities is disabled.
  • When track_activities or enable_track_wait_event is disabled, if you query the get_instr_wait_event function, gs_wait_events view, or pgxc_wait_events view, a message is displayed indicating that the GUC parameter is disabled and the query result is 0.
  • If track_activities or enable_track_wait_event is disabled during cluster running, GaussDB(DWS) will not collect statistics on waiting events. However, statistics that have been collected are not affected.
+
+
+

enable_wdr_snapshot

Parameter description: Specifies whether to enable the performance view snapshot function. After this function is enabled, GaussDB(DWS) will periodically create snapshots for some system performance views and save them permanently. In addition, it will accept manual snapshot creation requests.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the snapshot function is enabled.
  • off indicates that the snapshot function is disabled.
+

Default value: off

+
  • If the create_wdr_snapshot function is executed to manually create a view when the enable_wdr_snapshot parameter is disabled, a message is displayed indicating that the GUC parameter is not enabled.
  • If the enable_wdr_snapshot parameter is modified during the snapshot creation process, the snapshot that is being created is not affected. The modification takes effect when the snapshot is manually or periodically created next time.
+
+
+

wdr_snapshot_interval

Parameter description: Specifies the interval for automatically creating performance view snapshots.

+

Type: SIGHUP

+

Value range: an integer ranging from 10 to 180, in minutes

+

Default value: 60

+
  • The value of this parameter must be set in accordance with the cluster load. You are advised to set this parameter to a value greater than the time required for creating a snapshot.
  • If the value of wdr_snapshot_interval is less than the time required for creating a snapshot, the system will skip this snapshot creation because it finds that the previous snapshot creation is not complete when the time for this automatic snapshot creation arrives.
+
+
+

wdr_snapshot_retention_days

Parameter description: Specifies the maximum number of days for storing performance snapshot data.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 15 days

+

Default value: 8

+
  • If enable_wdr_snapshot is enabled, snapshot data that has been stored for wdr_snapshot_retention_days days will be automatically deleted.
  • The value of this parameter must be set in accordance with the available disk space. A larger value requires more disk space.
  • The modification of this parameter does not take effect immediately. The expired snapshot data will be cleared only when a snapshot is automatically created next time.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0921.html b/docs/dws/dev/dws_04_0921.html new file mode 100644 index 00000000..4e5aff2d --- /dev/null +++ b/docs/dws/dev/dws_04_0921.html @@ -0,0 +1,21 @@ + + +

Performance Statistics

+

During the running of the database, the lock access, disk I/O operation, and invalid message process are involved. All these operations are the bottleneck of the database performance. The performance statistics method provided by GaussDB(DWS) can facilitate the performance fault location.

+

Generating Performance Statistics Logs

Parameter description: For each query, the following four parameters control the performance statistics of corresponding modules recorded in the server log:

+
  • The og_parser_stats parameter controls the performance statistics of a parser recorded in the server log.
  • The log_planner_stats parameter controls the performance statistics of a query optimizer recorded in the server log.
  • The log_executor_stats parameter controls the performance statistics of an executor recorded in the server log.
  • The log_statement_stats parameter controls the performance statistics of the whole statement recorded in the server log.
+

All these parameters can only provide assistant analysis for administrators, which are similar to the getrusage() of the Linux OS.

+

Type: SUSET

+
  • log_statement_stats records the total statement statistics while other parameters only record statistics about each statement.
  • The log_statement_stats parameter cannot be enabled together with other parameters recording statistics about each statement.
+
+

Value range: Boolean

+
  • on indicates the function of recording performance statistics is enabled.
  • off indicates the function of recording performance statistics is disabled.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0922.html b/docs/dws/dev/dws_04_0922.html new file mode 100644 index 00000000..4093f85f --- /dev/null +++ b/docs/dws/dev/dws_04_0922.html @@ -0,0 +1,251 @@ + + +

Workload Management

+

If database resource usage is not controlled, concurrent tasks easily preempt resources. As a result, the OS will be overloaded and cannot respond to user tasks; or even crash and cannot provide any services to users. The GaussDB(DWS) workload management function balances the database workload based on available resources to avoid database overloading.

+

use_workload_manager

Parameter description: Specifies whether to enable the resource management function. This parameter must be applied on both CNs and DNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the resource management function is enabled.
  • off indicates the resource management function is disabled.
    • If a method in Setting GUC Parameters is used to change the parameter value, the new value takes effect only for the threads that are started after the change. In addition, the new value does not take effect for new jobs that are executed by backend threads and reused threads. You can make the new value take effect for these threads by using kill session or restarting the node.
    • After the value of use_workload_manager changes from off to on, the resource management view becomes available, and you can query the storage resource usage collected in the off state. If there are slight errors and the storage resource usage needs to be corrected, run the following command. If data is inserted into the table during the command execution, the statistics may be inaccurate.
      1
      select gs_wlm_readjust_user_space(0);
      +
      + +
      +
    +
    +
+

Default value: on

+
+

enable_control_group

Parameter description: Specifies whether to enable the Cgroup management function. This parameter must be applied on both CNs and DNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the Cgroup management function is enabled.
  • off indicates the Cgroup management function is disabled.
+

Default value: on

+

If a method in Setting GUC Parameters is used to change the parameter value, the new value takes effect only for the threads that are started after the change. In addition, the new value does not take effect for new jobs that are executed by backend threads and reused threads. You can make the new value take effect for these threads by using kill session or restarting the node.

+
+
+

enable_backend_control

Parameter description: Specifies whether to control the database permanent thread to the DefaultBackend Cgroup. This parameter must be applied on both CNs and DNs.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on: Controls the permanent thread to the DefaultBackend Cgroup.
  • off: Does not control the permanent thread to the DefaultBackend Cgroup.
+

Default value: on

+
+

enable_vacuum_control

Parameter description: Specifies whether to control the database permanent thread autoVacuumWorker to the Vacuum Cgroup. This parameter must be applied on both CNs and DNs.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on: Controls the database permanent thread autoVacuumWorker to the Vacuum Cgroup.
  • off: Does not control the database permanent thread autoVacuumWorker to the Vacuum Cgroup.
+

Default value: on

+
+

enable_perm_space

Parameter description: Specifies whether to enable the perm space function. This parameter must be applied on both CNs and DNs.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates the perm space function is enabled.
  • off indicates the perm space function is disabled.
+

Default value: on

+
+

enable_verify_active_statements

Parameter description: Specifies whether to enable the background calibration function in static adaptive load scenarios. This parameter must be used on CNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the background calibration function is enabled.
  • off indicates the background calibration function is disabled.
+

Default value: on

+
+

max_active_statements

Parameter description: Specifies the maximum global concurrency. This parameter applies to one CN.

+

The database administrator changes the value of this parameter based on system resources (for example, CPU, I/O, and memory resources) so that the system fully supports the concurrency tasks and avoids too many concurrency tasks resulting in system crash.

+

Type: SIGHUP

+

Value range: an integer ranging from -1 to INT_MAX. The values -1 and 0 indicate that the number of concurrent requests is not limited.

+

Default value: 60

+
+

parctl_min_cost

Parameter description: Specifies the minimum execution cost of a statement under the concurrency control of a resource pool.

+

Type: SIGHUP

+

Value range: an integer ranging from –1 to INT_MAX

+
  • If the value is –1 or the cost of executing statements is less than 10, the job is controlled by the fast lane.
  • If the value is greater than or equal to 0, and the cost of executing statements exceeds the value and is greater than or equal to 10, the statements are subject to the concurrent limit of a resource pool.
+

Default value: 100000

+
+

cgroup_name

Parameter description: Specifies the name of the Cgroup in use. It can be used to change the priorities of jobs in the queue of a Cgroup.

+

If you set cgroup_name and then session_respool, the Cgroups associated with session_respool take effect. If you reverse the order, Cgroups associated with cgroup_name take effect.

+

If the Workload Cgroup level is specified during the cgroup_name change, the database does not check the Cgroup level. The level ranges from 1 to 10.

+

Type: USERSET

+

You are not advised to set cgroup_name and session_respool at the same time.

+

Value range: a string

+

Default value: DefaultClass:Medium

+

DefaultClass:Medium indicates the Medium Cgroup belonging to the Timeshare Cgroup under the DefaultClass Cgroup.

+
+
+

cpu_collect_timer

Parameter description: Specifies how frequently CPU data is collected during statement execution on DNs.

+

The database administrator changes the value of this parameter based on system resources (for example, CPU, I/O, and memory resources) so that the system fully supports the concurrency tasks and avoids too many concurrency tasks resulting in system crash.

+

Type: SIGHUP

+

Value range: an integer ranging from -1 to INT_MAX. The unit is second.

+

Default value: 30

+
+

enable_cgroup_switch

Parameter description: Specifies whether the database automatically switches to the TopWD group when executing statements by group type.

+

Type: USERSET

+

Value range: Boolean

+
  • on: The database automatically switches to the TopWD group when executing statements by group type.
  • off: The database does not automatically switch to the TopWD group when executing statements by group type.
+

Default value: off

+
+

memory_tracking_mode

Parameter description: Specifies the memory information recording mode.

+

Type: USERSET

+

Value range:

+
  • none: Memory statistics is not collected.
  • normal: Only memory statistics is collected in real time and no file is generated.
  • executor: The statistics file is generated, containing the context information about all allocated memory used by the execution layer.
  • fullexec: The generated file includes the information about all memory contexts requested by the execution layer.
+

Default value: none

+
+

memory_detail_tracking

Parameter description: Specifies the sequence number of the memory background information distributed in the needed thread and plannodeid of the query where the current thread is located.

+

Type: USERSET

+

Value range: a string

+

Default value: empty

+

It is recommended that you retain the default value for this parameter.

+
+
+

enable_resource_track

Parameter description: Specifies whether the real-time resource monitoring function is enabled. This parameter must be applied on both CNs and DNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the resource monitoring function is enabled.
  • off indicates the resource monitoring function is disabled.
+

Default value: on

+
+

enable_resource_record

Parameter description: Specifies whether resource monitoring records are archived. If this parameter is set to on, records in the history views (GS_WLM_SESSION_HISTORY and GS_WLM_OPERATOR_HISTORY) are archived to the corresponding info views (GS_WLM_SESSION_INFO and GS_WLM_OPERATOR_INFO) at an interval of 3 minutes. After being archived, the records are deleted from the history views. This parameter must be applied on both CNs and DNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the resource monitoring records are archived.
  • off indicates that the resource monitoring records are not archived.
+

Default value: off

+
+

enable_user_metric_persistent

Parameter description: Specifies whether the user historical resource monitoring dumping function is enabled. If this function is enabled, data in view PG_TOTAL_USER_RESOURCE_INFO is periodically sampled and saved to system catalog GS_WLM_USER_RESOURCE_HISTORY.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the user historical resource monitoring dumping function is enabled.
  • off indicates that the user historical resource monitoring dumping function is disabled.
+

Default value: on

+
+

user_metric_retention_time

Parameter description: Specifies the retention time of the user historical resource monitoring data. This parameter is valid only when enable_user_metric_persistent is set to on.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 3650. The unit is day.

+
  • If this parameter is set to 0, user historical resource monitoring data is permanently stored.
  • If the value is greater than 0, user historical resource monitoring data is stored for the specified number of days.
+

Default value: 7

+
+

enable_instance_metric_persistent

Parameter description: Specifies whether the instance resource monitoring dumping function is enabled. When this function is enabled, the instance monitoring data is saved to the system catalog GS_WLM_INSTANCE_HISTORY.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the instance resource monitoring dumping function is enabled.
  • off: Specifies that the instance resource monitoring dumping function is disabled.
+

Default value: on

+
+

instance_metric_retention_time

Parameter description: Specifies the retention time of the instance historical resource monitoring data. This parameter is valid only when enable_instance_metric_persistent is set to on.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 3650. The unit is day.

+
  • If this parameter is set to 0, instance historical resource monitoring data is permanently stored.
  • If the value is greater than 0, the instance historical resource monitoring data is stored for the specified number of days.
+

Default value: 7

+
+

resource_track_level

Parameter description: Specifies the resource monitoring level of the current session. This parameter is valid only when enable_resource_track is set to on.

+

Type: USERSET

+

Value range: enumerated values

+
  • none: Resources are not monitored.
  • query: Enables query-level resource monitoring. If this function is enabled, the plan information (similar to the output information of EXPLAIN) of SQL statements will be recorded in top SQL statements.
  • perf: Enables the perf-level resource monitoring. If this function is enabled, the plan information (similar to the output information of EXPLAIN ANALYZE) that contains the actual execution time and the number of execution rows will be recorded in the top SQL.
  • operator: enables the operator-level resource monitoring. If this function is enabled, not only the information including the actual execution time and number of execution rows is recorded in the top SQL statement, but also the operator-level execution information is updated to the top SQL statement.
+

Default value: query

+
+

resource_track_cost

Parameter description: Specifies the minimum execution cost for resource monitoring on statements in the current session. This parameter is valid only when enable_resource_track is set to on.

+

Type: USERSET

+

Value range: an integer ranging from -1 to INT_MAX

+
  • –1 indicates that resource monitoring is disabled.
  • A value greater than or equal to 0 indicates that statements whose execution cost exceeds this value will be monitored.
+

Default value: 100000

+
+

resource_track_duration

Parameter description: Specifies the minimum statement execution time that determines whether information about jobs of a statement recorded in the real-time view (see Table 1) will be dumped to a historical view after the statement is executed. Job information will be dumped from the real-time view (with the suffix statistics) to a historical view (with the suffix history) if the statement execution time is no less than this value.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX. The unit is second (s).

+
  • 0 indicates that information about all statements recorded in the real-time resource monitoring view (see Table 1) will be archived into historical views.
  • If the value is greater than 0, information about statements recorded in the real-time resource monitoring view (see Table 1), whose execution time exceeds this value will be archived into historical views.
+

Default value: 1min

+
+

dynamic_memory_quota

Parameter description: Specifies the memory quota in adaptive load scenarios, that is, the proportion of maximum available memory to total system memory.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 100

+

Default value: 80

+
+

disable_memory_protect

Parameter description: Stops memory protection. To query system views when system memory is insufficient, set this parameter to on to stop memory protection. This parameter is used only to diagnose and debug the system when system memory is insufficient. Set it to off in other scenarios.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that memory protection stops.
  • off indicates that memory is protected.
+

Default value: off

+
+

query_band

Parameter description: Specifies the job type of the current session.

+

Type: USERSET

+

Value range: a string

+

Default value: empty

+
+

enable_bbox_dump

Parameter description: Specifies whether the black box function is enabled. The core files can be generated even through the core dump mechanism is not configured in the system. This parameter must be simultaneously used on CNs and DNs.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the black box function is enabled.
  • off indicates that the black box function is disabled.
+

Default value: off

+
+

enable_dynamic_workload

Parameter description: Specifies whether to enable the dynamic workload management function.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates the dynamic workload management function is enabled.
  • off indicates the dynamic workload management function is disabled.
+

Default value: on

+
  • If memory adaptation is enabled, you do not need to use work_mem to optimize the operator memory usage after collecting statistics. The system will generate a plan for each statement based on the current load, estimating the memory used by each operator and by the entire statement. In a concurrency scenario, statements are queued based on the system load and their memory usage.
  • The optimizer cannot accurately estimate the number of rows and will probably underestimate or overestimate memory usage. If the memory usage is underestimated, the allocated memory will be automatically increased during statement running. If the memory usage is overestimated, system resources will not be fully used, and the number of statements waiting in a queue will increase, which probably results in low performance. To improve performance, identify the statements whose estimated memory usage is much greater than the DN peak memory and adjust the value of query_max_mem. For details, see Adjusting Key Parameters During SQL Tuning.
+
+
+

bbox_dump_count

Parameter description: Specifies the maximum number of core files that are generated by GaussDB(DWS) and can be stored in the path specified by bbox_dump_path. If the number of core files exceeds this value, old core files will be deleted. This parameter is valid only if enable_bbox_dump is set to on.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 20

+

Default value: 8

+

When core files are generated during concurrent SQL statement execution, the number of files may be larger than the value of bbox_dump_count.

+
+
+

io_limits

Parameter description: Specifies the upper limit of IOPS triggered.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 1073741823

+

Default value: 0

+
+

io_priority

Parameter description: Specifies the I/O priority for jobs that consume many I/O resources. It takes effect when the I/O usage reaches 90%.

+

Type: USERSET

+

Value range: enumerated values

+
  • None indicates no control.
  • Low indicates that the IOPS is reduced to 20% of the original value.
  • Medium indicates that the IOPS is reduced to 50% of the original value.
  • High indicates that the IOPS is reduced to 80% of the original value.
+

Default value: None

+
+

session_respool

Parameter description: Specifies the resource pool associated with the current session.

+

Type: USERSET

+

If you set cgroup_name and then session_respool, the Cgroups associated with session_respool take effect. If you reverse the order, Cgroups associated with cgroup_name take effect.

+

If the Workload Cgroup level is specified during the cgroup_name change, the database does not check the Cgroup level. The level ranges from 1 to 10.

+

You are not advised to set cgroup_name and session_respool at the same time.

+

Value range: a string. This parameter can be set to the resource pool configured through create resource pool.

+

Default value: invalid_pool

+
+

enable_transaction_parctl

Parameter description: whether to control transaction block statements and stored procedure statements.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Transaction block statements and stored procedure statements are controlled.
  • off: Transaction block statements and stored procedure statements are not controlled.
+

Default value: on

+
+

session_statistics_memory

Parameter description: Specifies the memory size of a real-time query view.

+

Type: SIGHUP

+

Value range: an integer ranging from 5 MB to 50% of max_process_memory

+

Default value: 5 MB

+
+

session_history_memory

Parameter description: Specifies the memory size of a historical query view.

+

Type: SIGHUP

+

Value range: an integer ranging from 10 MB to 50% of max_process_memory

+

Default value: 100 MB

+
+

topsql_retention_time

Parameter description: Specifies the retention period of historical TopSQL data in the gs_wlm_session_info and gs_wlm_operator_info tables.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 3650. The unit is day.

+
  • If it is set to 0, the data is stored permanently.
  • If the value is greater than 0, the data is stored for the specified number of days.
+

Default value: 0

+

Before setting this GUC parameter to enable the data retention function, delete data from the gs_wlm_session_info and gs_wlm_operator_info tables.

+
+
+

transaction_pending_time

Parameter description: maximum queuing time of transaction block statements and stored procedure statements if enable_transaction_parctl is set to on.

+

Type: USERSET

+

Value range: an integer ranging from –1 to INT_MAX. The unit is second (s).

+
  • –1 or 0: No queuing timeout is specified for transaction block statements and stored procedure statements. The statements can be executed when resources are available.
  • Value greater than 0: If transaction block statements and stored procedure statements have been queued for a time longer than the specified value, they are forcibly executed regardless of the current resource situation.
+

Default value: 0

+

This parameter is valid only for internal statements of stored procedures and transaction blocks. That is, this parameter takes effect only for the statements whose enqueue value (for details, see PG_SESSION_WLMSTAT) is Transaction or StoredProc.

+
+
+

wlm_sql_allow_list

Parameter description: Specifies whitelisted SQL statements for resource management. Whitelisted SQL statements are not monitored by resource management.

+

Type: SIGHUP

+

Value range: a string

+

Default value: empty

+
  • One or more whitelisted SQL statements can be specified in wlm_sql_allow_list. If multiple SQL statements are to be whitelisted, use semicolons (;) to separate them.
  • The system determines whether SQL statements are monitored based on the prefix match. The SQL statements are case insensitive. For example, if wlm_sql_allow_list is set to 'SELECT', all SELECT statements are not monitored by the resource management module.
  • The system identifies spaces at the beginning of the parameter value. For example, 'SELECT' and ' SELECT' have different representations. ' SELECT' filters only the SELECT statements with spaces at the beginning.
  • The system has some whitelisted SQL statements by default, which cannot be modified. You can query the default whitelisted SQL statements and the SQL statements that have been successfully added to the whitelist by GUC through the system view gs_wlm_sql_allow.
  • New SQL statements cannot be appended to the whitelisted SQL statements specified by wlm_sql_allow_list but can be set only through overwriting. To add an SQL statement, query the original GUC value, add the new statement to the end of the original value, separate the statements with a semicolon (;), and set the GUC value again.
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0923.html b/docs/dws/dev/dws_04_0923.html new file mode 100644 index 00000000..9ebd01a0 --- /dev/null +++ b/docs/dws/dev/dws_04_0923.html @@ -0,0 +1,91 @@ + + +

Automatic Cleanup

+

The automatic cleanup process (autovacuum) in the system automatically runs the VACUUM and ANALYZE commands to recycle the record space marked by the deleted status and update statistics in the table.

+

autovacuum

Parameter description: Enables the automatic cleanup process (autovacuum) in the database. Ensure that the track_counts parameter is set to on before enabling the automatic cleanup process.

+

Type: SIGHUP

+
  • Set the autovacuum parameter to on if you want to enable the function to automatically clean up two-phase transactions after the system recovers from faults.
  • If autovacuum is set to on and the value of autovacuum_max_workers is 0, the system will not automatically clean up two-phase transactions. The system will clean up them after recovering from faults.
  • If autovacuum is set to on and the value of autovacuum_max_workers is greater than 0, the system will automatically clean up the two-phase transactions and processes after recovering from faults.
+
+

Even if the autovacuum parameter is set to off, the automatic cleanup process will be enabled automatically by the database when a transaction ID wrap is about to occur. When the create database or drop database operation fails, some nodes may be submitted or rolled back while others in the prepared status may not be submitted. In this case, the system cannot automatically restore these nodes and the manual restoration is required. The restoration steps are as follows:

+
  1. Use the gs_clean tool (setting the option parameter to -N) to query the xid of the abnormal two-phase transactions and nodes in the prepared state.
  2. Log in to the nodes whose transactions are in the prepared status. Administrators connect to an available database such as gaussdb to run the set xc_maintenance_mode = on statement.
  3. Submit or roll back the two-phase transactions (for example, submit or roll back a statement) based on global transaction status.
+
+

Value range: Boolean

+
  • on indicates the database automatic cleanup process is enabled.
  • off indicates the database automatic cleanup process is disabled.
+

Default value: off

+
+

autovacuum_mode

Parameter description: Specifies whether the autoanalyze or autovacuum function is enabled. This parameter is valid only when autovacuum is set to on.

+

Type: SIGHUP

+

Value range: enumerated values

+
  • analyze indicates that only autoanalyze is performed.
  • vacuum indicates that only autovacuum is performed.
  • mix indicates that both autoanalyze and autovacuum are performed.
  • none indicates that neither of them is performed.
+

Default value: mix

+
+

autoanalyze_timeout

Parameter description: Specifies the timeout period of autoanalyze. If the duration of autoanalyze on a table exceeds the value of autoanalyze_timeout, the autoanalyze is automatically canceled.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 2147483. The unit is second.

+

Default value: 5min

+
+

autovacuum_io_limits

Parameter description: Specifies the upper limit of I/Os triggered by the autovacuum process per second.

+

Type: SIGHUP

+

Value range: an integer ranging from –1 to 1073741823. –1 indicates that the default Cgroup is used.

+

Default value: –1

+
+

log_autovacuum_min_duration

Parameter description: Records each step performed by the automatic cleanup process to the server log when the execution time of the automatic cleanup process is greater than or equal to a certain value. This parameter helps track the automatic cleanup behaviors.

+

Type: SIGHUP

+

For example, set the log_autovacuum_min_duration parameter to 250 ms to record the information related to the automatic cleanup commands running the parameters whose values are greater than or equal to 250 ms.

+

Value range: an integer ranging from –1 to INT_MAX. The unit is ms.

+
  • If this parameter is set to 0, all the automatic cleanup operations are recorded in the log.
  • If this parameter is set to –1, all the automatic cleanup operations are not recorded in the log.
  • If this parameter is not set to –1, an automatic cleanup operation is skipped and a message is recorded due to lock conflicts.
+

Default value: –1

+
+

autovacuum_max_workers

Parameter description: Specifies the maximum number of automatic cleanup threads running at the same time.

+

Type: POSTMASTER

+

Value range: an integer ranging from 0 to 262143. 0 indicates that autovacuum is disabled.

+

Default value: 3

+
+

autovacuum_naptime

Parameter description: Specifies the interval between two automatic cleanup operations.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 2147483. The unit is second.

+

Default value: 10min

+
+

autovacuum_vacuum_threshold

Parameter description: Specifies the threshold for triggering the VACUUM operation. When the number of deleted or updated records in a table exceeds the specified threshold, the VACUUM operation is executed on this table.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 50

+
+

autovacuum_analyze_threshold

Parameter description: Specifies the threshold for triggering the ANALYZE operation. When the number of deleted, inserted, or updated records in a table exceeds the specified threshold, the ANALYZE operation is executed on this table.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 50

+
+

autovacuum_vacuum_scale_factor

Parameter description: Specifies the size scaling factor of a table added to the autovacuum_vacuum_threshold parameter when a VACUUM event is triggered.

+

Type: SIGHUP

+

Value range: a floating point number ranging from 0.0 to 100.0

+

Default value: 0.2

+
+

autovacuum_analyze_scale_factor

Parameter description: Specifies the size scaling factor of a table added to the autovacuum_analyze_threshold parameter when an ANALYZE event is triggered.

+

Type: SIGHUP

+

Value range: a floating point number ranging from 0.0 to 100.0

+

Default value: 0.1

+
+

autovacuum_freeze_max_age

Parameter description: Specifies the maximum age (in transactions) that a table's pg_class.relfrozenxid column can attain before a VACUUM operation is forced to prevent transaction ID wraparound within the table.

+

The old files under the subdirectory of pg_clog/ can also be deleted by the VACUUM operation. Even if the automatic cleanup process is forbidden, the system will invoke the automatic cleanup process to prevent the cyclic repetition.

+

Type: POSTMASTER

+

Value range: an integer ranging from 100000 to 576460752303423487

+

Default value: 20000000000

+
+

autovacuum_vacuum_cost_delay

Parameter description: Specifies the value of the cost delay used in the autovacuum operation.

+

Type: SIGHUP

+

Value range: an integer ranging from –1 to 100. The unit is ms. -1 indicates that the normal vacuum cost delay is used.

+

Default value: 20ms

+
+

autovacuum_vacuum_cost_limit

Parameter description: Specifies the value of the cost limit used in the autovacuum operation.

+

Type: SIGHUP

+

Value range: an integer ranging from –1 to 10000. -1 indicates that the normal vacuum cost limit is used.

+

Default value: –1

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0924.html b/docs/dws/dev/dws_04_0924.html new file mode 100644 index 00000000..9964242a --- /dev/null +++ b/docs/dws/dev/dws_04_0924.html @@ -0,0 +1,19 @@ + + +

Default Settings of Client Connection

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0925.html b/docs/dws/dev/dws_04_0925.html new file mode 100644 index 00000000..8fad9c5e --- /dev/null +++ b/docs/dws/dev/dws_04_0925.html @@ -0,0 +1,132 @@ + + +

Statement Behavior

+

This section describes related default parameters involved in the execution of SQL statements.

+

search_path

Parameter description: Specifies the order in which schemas are searched when an object is referenced with no schema specified. The value of this parameter consists of one or more schema names. Different schema names are separated by commas (,).

+

Type: USERSET

+
  • If the schema of a temporary table exists in the current session, the scheme can be listed in search_path by using the alias pg_temp, for example, 'pg_temp,public'. The schema of a temporary table has the highest search priority and is always searched before all the schemas specified in pg_catalog and search_path. Therefore, do not explicitly specify pg_temp to be searched after other schemas in search_path. This setting will not take effect and an error message will be displayed. If the alias pg_temp is used, the temporary schema will be only searched for database objects, including tables, views, and data types. Functions or operator names will not be searched for.
  • The schema of a system catalog, pg_catalog, has the second highest search priority and is the first to be searched among all the schemas, excluding pg_temp, specified in search_path. Therefore, do not explicitly specify pg_catalog to be searched after other schemas in search_path. This setting will not take effect and an error message will be displayed.
  • When an object is created without specifying a particular schema, the object will be placed in the first valid schema listed in search_path. An error will be reported if the search path is empty.
  • The current effective value of the search path can be examined through the SQL function current_schema. This is different from examining the value of search_path, because the current_schema function displays the first valid schema name in search_path.
+

Value range: a string

+
  • When this parameter is set to "$user", public, a database can be shared (where no users have private schemas, and all share use of public), and private per-user schemas and combinations of them are supported. Other effects can be obtained by modifying the default search path setting, either globally or per-user.
  • When this parameter is set to a null string (''), the system automatically converts it into a pair of double quotation marks ("").
  • If the content contains double quotation marks, the system considers them as insecure characters and converts each double quotation mark into a pair of double quotation marks.
+
+

Default value: "$user",public

+

$user indicates the name of the schema with the same name as the current session user. If the schema does not exist, $user will be ignored.

+
+
+

current_schema

Parameter description: Specifies the current schema.

+

Type: USERSET

+

Value range: a string

+

Default value: "$user",public

+

$user indicates the name of the schema with the same name as the current session user. If the schema does not exist, $user will be ignored.

+
+
+

default_tablespace

Parameter description: Specifies the default tablespace of the created objects (tables and indexes) when a CREATE command does not explicitly specify a tablespace.

+
  • The value of this parameter is either the name of a tablespace, or an empty string that specifies the use of the default tablespace of the current database. If a non-default tablespace is specified, users must have CREATE privilege for it. Otherwise, creation attempts will fail.
  • This parameter is not used for temporary tables. For them, the temp_tablespaces is consulted instead.
  • This parameter is not used when users create databases. By default, a new database inherits its tablespace setting from the template database.
+

Type: USERSET

+

Value range: a string. An empty string indicates that the default tablespace is used.

+

Default value: empty

+
+

default_storage_nodegroup

Parameter description: Specifies the Node Group where a table is created by default. This parameter takes effect only for ordinary tables.

+
  • installation indicates that tables will be created in the Node Group created during database installation.
  • A value other than installation indicates that tables will be created in the Node Group specified by this parameter.
+

Type: USERSET

+

Value range: a string

+

Default value: installation

+
+

default_colversion

Parameter description: Sets the storage format version of the column-store table that is created by default.

+

Type: SIGHUP

+

Value range: enumerated values

+
  • 1.0: Each column in a column-store table is stored in a separate file. The file name is relfilenode.C1.0, relfilenode.C2.0, relfilenode.C3.0, or similar.
  • 2.0: All columns of a column-store table are combined and stored in a file. The file is named relfilenode.C1.0.
+

Default value: 2.0

+
+

temp_tablespaces

Parameter description: Specifies tablespaces to which temporary objects will be created (temporary tables and their indexes) when a CREATE command does not explicitly specify a tablespace. Temporary files for sorting large data are created in these tablespaces.

+

The value of this parameter is a list of names of tablespaces. When there is more than one name in the list, GaussDB(DWS) chooses a random tablespace from the list upon the creation of a temporary object each time. Except that within a transaction, successively created temporary objects are placed in successive tablespaces in the list. If the element selected from the list is an empty string, GaussDB(DWS) will automatically use the default tablespace of the current database instead.

+

Type: USERSET

+

Value range: a string An empty string indicates that all temporary objects are created only in the default tablespace of the current database. For details, see default_tablespace.

+

Default value: empty

+
+

check_function_bodies

Parameter description: Specifies whether to enable validation of the function body string during the execution of CREATE FUNCTION. Verification is occasionally disabled to avoid problems, such as forward references when you restore function definitions from a dump.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that validation of the function body string is enabled during the execution of CREATE FUNCTION.
  • off indicates that validation of the function body string is disabled during the execution of CREATE FUNCTION.
+

Default value: on

+
+

default_transaction_isolation

Parameter description: Specifies the default isolation level of each transaction.

+

Type: USERSET

+

Value range: enumerated values

+
  • READ COMMITTED: Only committed data is read. This is the default.
  • READ UNCOMMITTED: GaussDB(DWS) does not support READ UNCOMMITTED. If READ UNCOMMITTED is set, READ COMMITTED is executed instead.
  • REPEATABLE READ: Only the data committed before transaction start is read. Uncommitted data or data committed in other concurrent transactions cannot be read.
  • SERIALIZABLE: GaussDB(DWS) does not support SERIALIZABLE. If SERIALIZABLE is set, REPEATABLE READ is executed instead.
+

Default value: READ COMMITTED

+
+

default_transaction_read_only

Parameter description: Specifies whether each new transaction is in read-only state.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates the transaction is in read-only state.
  • off indicates the transaction is in read/write state.
+

Default value: off

+
+

default_transaction_deferrable

Parameter description: Specifies the default delaying state of each new transaction. It currently has no effect on read-only transactions or those running at isolation levels lower than serializable.

+

GaussDB(DWS) does not support the serializable isolation level of each transaction. The parameter is insignificant.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates a transaction is delayed by default.
  • off indicates a transaction is not delayed by default.
+

Default value: off

+
+

session_replication_role

Parameter description: Specifies the behavior of replication-related triggers and rules for the current session.

+

Type: USERSET

+

Setting this parameter will discard all the cached execution plans.

+
+

Value range: enumerated values

+
  • origin indicates that the system copies operations such as insert, delete, and update from the current session.
  • replica indicates that the system copies operations such as insert, delete, and update from other places to the current session.
  • local indicates that the system will detect the role that has logged in to the database when using the function to copy operations and will perform related operations.
+

Default value: origin

+
+

statement_timeout

Parameter description: If the statement execution time (starting when the server receives the command) is longer than the duration specified by the parameter, error information is displayed when you attempt to execute the statement and the statement then exits.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 2147483647. The unit is ms.

+

Default value: 0

+
+

vacuum_freeze_min_age

Parameter description: Specifies the minimum cutoff age (in the same transaction), based on which VACUUM decides whether to replace transaction IDs with FrozenXID while scanning a table.

+

Type: USERSET

+

Value range: an integer from 0 to 576460752303423487.

+

Although you can set this parameter to a value ranging from 0 to 1000000000 anytime, VACUUM will limit the effective value to half the value of autovacuum_freeze_max_age by default.

+
+

Default value: 5000000000

+
+

vacuum_freeze_table_age

Parameter description: Specifies the time that VACUUM freezes tuples while scanning the whole table. VACUUM performs a whole-table scan if the value of the pg_class.relfrozenxid column of the table has reached the specified time.

+

Type: USERSET

+

Value range: an integer from 0 to 576460752303423487.

+

Although users can set this parameter to a value ranging from 0 to 2000000000 anytime, VACUUM will limit the effective value to 95% of autovacuum_freeze_max_age by default. Therefore, a periodic manual VACUUM has a chance to run before an anti-wraparound autovacuum is launched for the table.

+
+

Default value: 15000000000

+
+

bytea_output

Parameter description: Specifies the output format for values of the bytea type.

+

Type: USERSET

+

Value range: enumerated values

+
  • hex indicates the binary data is converted to the two-byte hexadecimal digit.
  • escape indicates the traditional PostgreSQL format is used. It takes the approach of representing a binary string as a sequence of ASCII characters, while converting those bytes that cannot be represented as an ASCII character into special escape sequences.
+

Default value: hex

+
+

xmlbinary

Parameter description: Specifies how binary values are to be encoded in XML.

+

Type: USERSET

+

Value range: enumerated values

+
  • base64
  • hex
+

Default value: base64

+
+

xmloption

Parameter description: Specifies whether DOCUMENT or CONTENT is implicit when converting between XML and string values.

+

Type: USERSET

+

Value range: enumerated values

+
  • document indicates an HTML document.
  • content indicates a common string.
+

Default value: content

+
+

max_compile_functions

Parameter description: Specifies the maximum number of function compilation results stored in the server. Excessive functions and compilation results generated during the storage may occupy large memory space. Setting this parameter to a proper value can reduce the memory usage and improve system performance.

+

Type: POSTMASTER

+

Value range: an integer ranging from 1 to INT_MAX

+

Default value: 1000

+
+

gin_pending_list_limit

Parameter description: Specifies the maximum size of the GIN pending list which is used when fastupdate is enabled. If the list grows larger than this maximum size, it is cleaned up by moving the entries in it to the main GIN data structure in batches. This setting can be overridden for individual GIN indexes by modifying index storage parameters.

+

Type: USERSET

+

Value range: an integer ranging from 64 to INT_MAX. The unit is KB.

+

Default value: 4 MB

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0926.html b/docs/dws/dev/dws_04_0926.html new file mode 100644 index 00000000..1d119bbd --- /dev/null +++ b/docs/dws/dev/dws_04_0926.html @@ -0,0 +1,96 @@ + + +

Zone and Formatting

+

This section describes parameters related to the time format setting.

+

DateStyle

Parameter description: Specifies the display format for date and time values, as well as the rules for interpreting ambiguous date input values.

+

This variable contains two independent components: the output format specifications (ISO, Postgres, SQL, or German) and the input/output order of year/month/day (DMY, MDY, or YMD). The two components can be set separately or together. The keywords Euro and European are synonyms for DMY; the keywords US, NonEuro, and NonEuropean are synonyms for MDY.

+

Type: USERSET

+

Value range: a string

+

Default value: ISO, MDY

+

gs_initdb will initialize this parameter so that its value is the same as that of lc_time.

+
+

Suggestion: The ISO format is recommended. Postgres, SQL, and German use abbreviations for time zones, such as EST, WST, and CST. These abbreviations can be ambiguous. For example, CST can represent Central Standard Time (USA) UT-6:00, Central Standard Time (Australia) UT+9:30, and others. This may lead to incorrect time zone conversion and cause errors.

+
+

IntervalStyle

Parameter description: Specifies the display format for interval values.

+

Type: USERSET

+

Value range: enumerated values

+
  • sql_standard indicates that output matching SQL standards will be generated.
  • postgres indicates that output matching PostgreSQL 8.4 will be generated when the DateStyle parameter is set to ISO.
  • postgres_verbose indicates that output matching PostgreSQL 8.4 will be generated when the DateStyle parameter is set to non_ISO.
  • iso_8601 indicates that output matching the time interval "format with designators" defined in ISO 8601 will be generated.
  • oracle indicates the output result that matches the numtodsinterval function in the Oracle database. For details, see numtodsinterval.
+

The IntervalStyle parameter also affects the interpretation of ambiguous interval input.

+
+

Default value: postgres

+
+

TimeZone

Parameter description: Specifies the time zone for displaying and interpreting time stamps.

+

Type: USERSET

+

Value range: a string. You can obtain it by querying the pg_timezone_names view.

+

Default value: PRC

+

gs_initdb will set a time zone value that is consistent with the system environment.

+
+
+

timezone_abbreviations

Parameter description: Specifies the time zone abbreviations that will be accepted by the server.

+

Type: USERSET

+

Value range: a string. You can obtain it by querying the pg_timezone_names view.

+

Default value: Default

+

Default indicates an abbreviation that works in most of the world. There are also other abbreviations, such as Australia and India that can be defined for a particular installation.

+
+
+

extra_float_digits

Parameter description: Specifies the number of digits displayed for floating-point values, including float4, float8, and geometric data types. The parameter value is added to the standard number of digits (FLT_DIG or DBL_DIG as appropriate).

+

Type: USERSET

+

Value range: an integer ranging from –15 to 3

+
  • This parameter can be set to 3 to include partially-significant digits. It is especially useful for dumping float data that needs to be restored exactly.
  • This parameter can also be set to a negative value to suppress unwanted digits.
+
+

Default value: 0

+
+

client_encoding

Parameter description: Specifies the client-side encoding type (character set).

+

Set this parameter as needed. Try to keep the client code and server code consistent to improve efficiency.

+

Type: USERSET

+

Value range: encoding compatible with PostgreSQL. UTF8 indicates that the database encoding is used.

+
  • You can run the locale -a command to check and set the system-supported zone and the corresponding encoding format.
  • By default, gs_initdb will initialize the setting of this parameter based on the current system environment. You can also run the locale command to check the current configuration environment.
  • To use consistent encoding for communication within a cluster, you are advised to retain the default value of client_encoding. Modification to this parameter in the postgresql.conf file (by using the gs_guc tool, for example) does not take effect.
+
+

Default value: UTF8

+

Recommended value: SQL_ASCII or UTF8

+
+

lc_messages

Parameter description: Specifies the language in which messages are displayed.

+

Valid values depend on the current system. On some systems, this zone category does not exist. Setting this variable will still work, but there will be no effect. In addition, translated messages for the desired language may not exist. In this case, you can still see the English messages.

+

Type: SUSET

+

Value range: a string

+
  • You can run the locale -a command to check and set the system-supported zone and the corresponding encoding format.
  • By default, gs_initdb will initialize the setting of this parameter based on the current system environment. You can also run the locale command to check the current configuration environment.
+
+

Default value: C

+
+

lc_monetary

Parameter description: Specifies the display format of monetary values. It affects the output of functions such as to_char. Valid values depend on the current system.

+

Type: USERSET

+

Value range: a string

+
  • You can run the locale -a command to check and set the system-supported zone and the corresponding encoding format.
  • By default, gs_initdb will initialize the setting of this parameter based on the current system environment. You can also run the locale command to check the current configuration environment.
+
+

Default value: C

+
+

lc_numeric

Parameter description: Specifies the display format of numbers. It affects the output of functions such as to_char. Valid values depend on the current system.

+

Type: USERSET

+

Value range: a string

+
  • You can run the locale -a command to check and set the system-supported zone and the corresponding encoding format.
  • By default, gs_initdb will initialize the setting of this parameter based on the current system environment. You can also run the locale command to check the current configuration environment.
+
+

Default value: C

+
+

lc_time

Parameter description: Specifies the display format of time and zones. It affects the output of functions such as to_char. Valid values depend on the current system.

+

Type: USERSET

+

Value range: a string

+
  • You can run the locale -a command to check and set the system-supported zone and the corresponding encoding format.
  • By default, gs_initdb will initialize the setting of this parameter based on the current system environment. You can also run the locale command to check the current configuration environment.
+
+

Default value: C

+
+

default_text_search_config

Parameter description: Specifies the text search configuration.

+

If the specified text search configuration does not exist, an error will be reported. If the specified text search configuration is deleted, set default_text_search_config again. Otherwise, an error will be reported, indicating incorrect configuration.

+
  • The text search configuration is used by text search functions that do not have an explicit argument specifying the configuration.
  • When a configuration file matching the environment is determined, gs_initdb will initialize the configuration file with a setting that corresponds to the environment.
+

Type: USERSET

+

Value range: a string

+

GaussDB(DWS) supports the following two configurations: pg_catalog.english and pg_catalog.simple.

+
+

Default value: pg_catalog.english

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0927.html b/docs/dws/dev/dws_04_0927.html new file mode 100644 index 00000000..8114ff91 --- /dev/null +++ b/docs/dws/dev/dws_04_0927.html @@ -0,0 +1,28 @@ + + +

Other Default Parameters

+

This section describes the default database loading parameters of the database system.

+

dynamic_library_path

Parameter description: Specifies the path for saving the shared database files that are dynamically loaded for data searching. When a dynamically loaded module needs to be opened and the file name specified in the CREATE FUNCTION or LOAD command does not have a directory component, the system will search this path for the required file.

+
The value of dynamic_library_path must be a list of absolute paths separated by colons (:) or by semi-colons (;) on the Windows OS. The special variable $libdir in the beginning of a path will be replaced with the module installation directory provided by GaussDB(DWS). Example:
1
dynamic_library_path = '/usr/local/lib/postgresql:/opt/testgs/lib:$libdir'
+
+ +
+
+

Type: SUSET

+

Value range: a string

+

If the value of this parameter is set to an empty character string, the automatic path search is turned off.

+
+

Default value: $libdir

+
+

gin_fuzzy_search_limit

Parameter description: Specifies the upper limit of the size of the set returned by GIN indexes.

+

Type: USERSET

+

Value range: an integer ranging from 0 to INT_MAX. The value 0 indicates no limit.

+

Default value: 0

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0928.html b/docs/dws/dev/dws_04_0928.html new file mode 100644 index 00000000..7f909863 --- /dev/null +++ b/docs/dws/dev/dws_04_0928.html @@ -0,0 +1,51 @@ + + +

Lock Management

+

In GaussDB(DWS), a deadlock may occur when concurrently executed transactions compete for resources. This section describes parameters used for managing transaction lock mechanisms.

+

deadlock_timeout

Parameter description: Specifies the time, in milliseconds, to wait on a lock before checking whether there is a deadlock condition. When the applied lock exceeds the preset value, the system will check whether a deadlock occurs.

+
  • The check for deadlock is relatively expensive. Therefore, the server does not check it when waiting for a lock every time. Deadlocks do not frequently occur when the system is running. Therefore, the system just needs to wait on the lock for a while before checking for a deadlock. Increasing this value reduces the time wasted in needless deadlock checks, but slows down reporting of real deadlock errors. On a heavily loaded server, you may need to raise it. The value you have set needs to exceed the transaction time. By doing this, the possibility that a lock will be released before the waiter decides to check for deadlocks will be reduced.
  • When log_lock_waits is set, this parameter also determines the duration you need to wait before a log message about the lock wait is issued. If you are trying to investigate locking delays, you need to set this parameter to a value smaller than normal deadlock_timeout.
+

Type: SUSET

+

Value range: an integer ranging from 1 to 2147483647. The unit is millisecond (ms).

+

Default value: 1s

+
+

lockwait_timeout

Parameter description: Specifies the longest time to wait before a single lock times out. If the time you wait before acquiring a lock exceeds the specified time, an error is reported.

+

Type: SUSET

+

Value range: an integer ranging from 0 to INT_MAX. The unit is millisecond (ms).

+

Default value: 20 min

+
+

update_lockwait_timeout

Parameter description: sets the maximum duration that a lock waits for concurrent updates on a row to complete when the concurrent update feature is enabled. If the time you wait before acquiring a lock exceeds the specified time, an error is reported.

+

Type: SUSET

+

Value range: an integer ranging from 0 to INT_MAX. The unit is millisecond (ms).

+

Default value: 2min

+
+

max_locks_per_transaction

Parameter description: Controls the average number of object locks allocated for each transaction.

+
  • The size of the shared lock table is calculated under the condition that a maximum of N independent objects need to be locked at any time. N = max_locks_per_transaction x (max_connections + max_prepared_transactions). Objects that do not exceed the preset number can be locked simultaneously at any time. You may need to increase this value when you modify many different tables in a single transaction. This parameter can only be set at database start.
  • If this parameter is set to a large value, GaussDB(DWS) may require more System V shared memory than the default setting.
  • When running a standby server, you must set this parameter to a value that is no less than that on the primary server. Otherwise, queries will not be allowed on the standby server.
+

Type: POSTMASTER

+

Value range: an integer ranging from 10 to INT_MAX

+

Default value: 256

+
+

max_pred_locks_per_transaction

Parameter description: Controls the average number of predicated locks allocated for each transaction.

+
  • The size of the shared and predicated lock table is calculated under the condition that a maximum of N independent objects need to be locked at any time. N = max_pred_locks_per_transaction x (max_connections + max_prepared_transactions). Objects that do not exceed the preset number can be locked simultaneously at any time. You may need to increase this value when you modify many different tables in a single transaction. This parameter can only be set at server start.
  • If this parameter is set to a large value, GaussDB(DWS) may require more System V shared memory than the default setting.
+

Type: POSTMASTER

+

Value range: an integer ranging from 10 to INT_MAX

+

Default value: 64

+
+

partition_lock_upgrade_timeout

Parameter description: Specifies the time to wait before the attempt of a lock upgrade from ExclusiveLock to AccessExclusiveLock times out on partitions.

+
  • When you do MERGE PARTITION and CLUSTER PARTITION on a partitioned table, temporary tables are used for data rearrangement and file exchange. To concurrently perform as many operations as possible on the partitions, ExclusiveLock is acquired for the partitions during data rearrangement and AccessExclusiveLock is acquired during file exchange.
  • Generally, a partition waits until it acquires a lock, or a timeout occurs if the partition waits for a period of time longer than specified by the lockwait_timeout parameter.
  • When doing MERGE PARTITION or CLUSTER PARTITION on a partitioned table, you need to acquire AccessExclusiveLock during file exchange. If the lock fails to be acquired, the acquisition is retried in 50 ms. This parameter specifies the time to wait before the lock acquisition attempt times out.
  • If this parameter is set to -1, the lock upgrade never times out. The lock upgrade is continuously retried until it succeeds.
+

Type: USERSET

+

Value range: an integer ranging from -1 to 3000. The unit is second (s).

+

Default value: 1800

+
+

enable_online_ddl_waitlock

Parameter description: Specifies whether to block DDL operations to wait for the release of cluster locks, such as pg_advisory_lock and pgxc_lock_for_backup. This parameter is mainly used in online OM operations and you are not advised to modify the settings.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that DDL operations will be blocked to wait for the release of cluster locks.
  • off indicates that DDL operations will not be blocked.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0929.html b/docs/dws/dev/dws_04_0929.html new file mode 100644 index 00000000..3c668e60 --- /dev/null +++ b/docs/dws/dev/dws_04_0929.html @@ -0,0 +1,18 @@ + + +

Version and Platform Compatibility

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0930.html b/docs/dws/dev/dws_04_0930.html new file mode 100644 index 00000000..75e4aecc --- /dev/null +++ b/docs/dws/dev/dws_04_0930.html @@ -0,0 +1,75 @@ + + +

Compatibility with Earlier Versions

+

This section describes the parameter control of the downward compatibility and external compatibility features of GaussDB(DWS). Backward compatibility of the database system provides support for the application of databases of earlier versions. This section describes parameters used for controlling backward compatibility of a database.

+

array_nulls

Parameter description: Determines whether the array input parser recognizes unquoted NULL as a null array element.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that null values can be entered in arrays.
  • off indicates backward compatibility with the old behavior. Arrays containing NULL values can still be created when this parameter is set to off.
+

Default value: on

+
+

backslash_quote

Parameter description: Determines whether a single quotation mark can be represented by \' in a string text.

+

Type: USERSET

+

When the string text meets the SQL standards, \ has no other meanings. This parameter only affects the handling of non-standard-conforming string texts, including escape string syntax (E'...').

+
+

Value range: enumerated values

+
  • on indicates that the use of \' is always allowed.
  • off indicates that the use of \' is rejected.
  • safe_encoding indicates that the use of \' is allowed only when client encoding does not allow ASCII \ within a multibyte character.
+

Default value: safe_encoding

+
+

default_with_oids

Parameter description: Determines whether CREATE TABLE and CREATE TABLE AS include an OID field in newly-created tables if neither WITH OIDS nor WITHOUT OIDS is specified. It also determines whether OIDs will be included in tables created by SELECT INTO.

+

It is not recommended that OIDs be used in user tables. Therefore, this parameter is set to off by default. When OIDs are required for a particular table, WITH OIDS needs to be specified during the table creation.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates CREATE TABLE and CREATE TABLE AS can include an OID field in newly-created tables.
  • off indicates CREATE TABLE and CREATE TABLE AS cannot include any OID field in newly-created tables.
+

Default value: off

+
+

escape_string_warning

Parameter description: Specifies a warning on directly using a backslash (\) as an escape in an ordinary character string.

+
  • Applications that wish to use a backslash (\) as an escape need to be modified to use escape string syntax (E'...'). This is because the default behavior of ordinary character strings is now to treat the backslash as an ordinary character in each SQL standard.
  • This variable can be enabled to help locate codes that need to be changed.
+

Type: USERSET

+

Value range: Boolean

+

Default value: on

+
+

lo_compat_privileges

Parameter description: Determines whether to enable backward compatibility for the privilege check of large objects.

+

Type: SUSET

+

Value range: Boolean

+

on indicates that the privilege check is disabled when users read or modify large objects. This setting is compatible with versions earlier than PostgreSQL 9.0.

+

Default value: off

+
+

quote_all_identifiers

Parameter description: When the database generates SQL, this parameter forcibly quotes all identifiers even if they are not keywords. This will affect the output of EXPLAIN as well as the results of functions, such as pg_get_viewdef. For details, see the --quote-all-identifiers parameter of gs_dump.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates the forcible quotation function is enabled.
  • off indicates the forcible quotation function is disabled.
+

Default value: off

+
+

sql_inheritance

Parameter description: Determines whether to inherit semantics.

+

Type: USERSET

+

Value range: Boolean

+

off indicates that child tables cannot be accessed by various commands. That is, an ONLY keyword is used by default. This setting is compatible with versions earlier than PostgreSQL 7.1.

+

Default value: on

+
+

standard_conforming_strings

Parameter description: Determines whether ordinary string texts ('...') treat backslashes as ordinary texts as specified in the SQL standard.

+
  • Applications can check this parameter to determine how string texts will be processed.
  • It is recommended that characters be escaped by using the escape string syntax (E'...').
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the function is enabled.
  • off indicates that the function is disabled.
+

Default value: on

+
+

synchronize_seqscans

Parameter description: Controls sequential scans of tables to synchronize with each other. Concurrent scans read the same data block about at the same time and share the I/O workload.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that a scan may start in the middle of the table and then "wrap around" the end to cover all rows to synchronize with the activity of scans already in progress. This may result in unpredictable changes in the row ordering returned by queries that have no ORDER BY clause.
  • off indicates that the scan always starts from the table heading.
+

Default value: on

+
+

enable_beta_features

Parameter description: Controls whether certain limited features, such as GDS table join, are available. These features are not explicitly prohibited in earlier versions, but are not recommended due to their limitations in certain scenarios.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the features are enabled and forward compatible, but may incur errors in certain scenarios.
  • off indicates that the features are disabled.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0931.html b/docs/dws/dev/dws_04_0931.html new file mode 100644 index 00000000..77a85093 --- /dev/null +++ b/docs/dws/dev/dws_04_0931.html @@ -0,0 +1,28 @@ + + +

Platform and Client Compatibility

+

Many platforms use the database system. External compatibility of the database system provides a lot of convenience for platforms.

+

transform_null_equals

Parameter description: Determines whether expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL. They return true if expr evaluates to NULL, and false otherwise.

+
  • The correct SQL-standard-compliant behavior of expr = NULL is to always return null (unknown).
  • Filtered forms in Microsoft Access generate queries that appear to use expr = NULL to test for null values. If you turn this option on, you can use this interface to access the database.
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates expressions of the form expr = NULL (or NULL = expr) are treated as expr IS NULL.
  • off indicates expr = NULL always returns NULL.
+

Default value: off

+

New users are always confused about the semantics of expressions involving NULL values. Therefore, off is used as the default value.

+
+
+

td_compatible_truncation

Parameter description: Determines whether to enable features compatible with a Teradata database. You can set this parameter to on when connecting to a database compatible with the Teradata database, so that when you perform the INSERT operation, overlong strings are truncated based on the allowed maximum length before being inserted into char- and varchar-type columns in the target table. This ensures all data is inserted into the target table without errors reported.

+
  • The string truncation function cannot be used if the INSERT statement includes a foreign table.
  • If inserting multi-byte character data (such as Chinese characters) to database with the character set byte encoding (SQL_ASCII, LATIN1), and the character data crosses the truncation position, the string is truncated based on its bytes instead of characters. Unexpected result will occur in tail after the truncation. If you want correct truncation result, you are advised to adopt encoding set such as UTF8, which has no character data crossing the truncation position.
+
+

Type: USERSET

+

Value range: Boolean

+
  • on indicates overlong strings are truncated.
  • off indicates overlong strings are not truncated.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0932.html b/docs/dws/dev/dws_04_0932.html new file mode 100644 index 00000000..9a6858c0 --- /dev/null +++ b/docs/dws/dev/dws_04_0932.html @@ -0,0 +1,49 @@ + + +

Fault Tolerance

+

This section describes parameters used for controlling the methods that the server processes an error occurring in the database system.

+

exit_on_error

Parameter description: Specifies whether to terminate the current session.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that any error will terminate the current session.
  • off indicates that only a FATAL error will terminate the current session.
+

Default value: off

+
+

omit_encoding_error

Parameter description: If this parameter is set to on and the client character set of the database is encoded in UTF-8 format, the occurring character encoding conversion errors will be recorded in logs. Additionally, converted characters that have conversion errors will be ignored and replaced with question marks (?).

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that characters that have conversion errors will be ignored and replaced with question marks (?), and error information will be recorded in logs.
  • off indicates that characters that have conversion errors cannot be converted and error information will be directly displayed.
+

Default value: off

+
+

max_query_retry_times

Parameter description: Specifies the maximum number of automatic retry times when an SQL statement error occurs. Currently, a statement can start retrying if the following errors occur: Connection reset by peer, Lock wait timeout, and Connection timed out. If this parameter is set to 0, the retry function is disabled.

+

Type: USERSET

+

Value range: an integer ranging from 0 to 20

+

Default value: 6

+
+

cn_send_buffer_size

Parameter description: Specifies the size of the data buffer used for data transmission on the CN.

+

Type: POSTMASTER

+

Value range: an integer ranging from 8 to 128. The unit is KB.

+

Default value: 8 KB

+
+

max_cn_temp_file_size

Parameter description: Specifies the maximum number of temporary files that can be used by the CN during automatic SQL statement retries. The value 0 indicates that no temporary file is used.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 10485760. The unit is KB.

+

Default value: 5 GB

+
+

retry_ecode_list

Parameter description: Specifies the list of SQL error types that support automatic retry.

+

Type: USERSET

+

Value range: a string

+

Default value: YY001 YY002 YY003 YY004 YY005 YY006 YY007 YY008 YY009 YY010 YY011 YY012 YY013 YY014 YY015 53200 08006 08000 57P01 XX003 XX009 YY016 CG003 CG004 F0011

+
+

data_sync_retry

Parameter description: Specifies whether to keep running the database when updated data fails to be written into disks by using the fsync function. In some OSs, no error is reported even if fsync has failed for multiple times. As a result, data is lost.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on: The database keeps running and fsync is executed again after fsync fails.
  • off: PANIC is reported and the database is stopped after fsync fails.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0933.html b/docs/dws/dev/dws_04_0933.html new file mode 100644 index 00000000..f862815f --- /dev/null +++ b/docs/dws/dev/dws_04_0933.html @@ -0,0 +1,59 @@ + + +

Connection Pool Parameters

+

When a connection pool is used to access the database, database connections are established and then stored in the memory as objects during system running. When you need to access the database, no new connection is established. Instead, an existing idle connection is selected from the connection pool. After you finish accessing the database, the database does not disable the connection but puts it back into the connection pool. The connection can be used for the next access request.

+

min_pool_size

Parameter description: Specifies the minimum number of connections between a CN's connection pool and another CN/DN.

+

Type: POSTMASTER

+

Value range: an integer ranging from 1 to 65535

+

Default value: 1

+
+

max_pool_size

Parameter description: Specifies the maximum number of connections between a CN's connection pool and another CN/DN.

+

Type: POSTMASTER

+

Value range: an integer ranging from 1 to 65535

+

Default value: 800

+
+

persistent_datanode_connections

Parameter description: Specifies whether to release the connection for the current session.

+

Type: USERSET

+

Value range: Boolean

+
  • off indicates that the connection for the current session will be released.
  • on indicates that the connection for the current session will not be released.

    After this function is enabled, a session may hold a connection but does not run a query. As a result, other query requests fail to be connected. To fix this problem, the number of sessions must be less than or equal to max_active_statements.

    +
    +
+

Default value: off

+
+

max_coordinators

Parameter description: Specifies the maximum number of CNs in a cluster.

+

Type: POSTMASTER

+

Value range: an integer ranging from 2 to 40

+

Default value: 40

+
+

max_datanodes

Parameter description: Specifies the maximum number of DNs in a cluster.

+

Type: POSTMASTER

+

Value range: an integer ranging from 2 to 65535

+

Default value: 4096

+
+

cache_connection

Parameter description: Specifies whether to reclaim the connections of a connection pool.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the connections of a connection pool will be reclaimed.
  • off indicates that the connections of a connection pool will not be reclaimed.
+

Default value: on

+
+

enable_force_reuse_connections

Parameter description: Specifies whether a session forcibly reuses a new connection.

+

Type: BACKEND

+

Value range: Boolean

+
  • on indicates that the new connection is forcibly used.
  • off indicates that the current connection is used.
+

Default value: off

+

Session connection parameter. Users are not advised to configure this parameter.

+
+
+

enable_pooler_parallel

Parameter description: Specifies whether a CN's connection pool can be connected in parallel mode.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that a CN's connection pool can be connected in parallel mode.
  • off indicates that a CN's connection pool cannot be connected in parallel mode.
+

Default value: on

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0934.html b/docs/dws/dev/dws_04_0934.html new file mode 100644 index 00000000..b6a88d03 --- /dev/null +++ b/docs/dws/dev/dws_04_0934.html @@ -0,0 +1,80 @@ + + +

Cluster Transaction Parameters

+

This section describes the settings and value ranges of cluster transaction parameters.

+

transaction_isolation

Parameter description: Specifies the isolation level of the current transaction.

+

Type: USERSET

+

Value range:

+
  • READ COMMITTED: Only committed data is read. This is the default.
  • READ UNCOMMITTED: GaussDB(DWS) does not support READ UNCOMMITTED. If READ UNCOMMITTED is set, READ COMMITTED is executed instead.
  • REPEATABLE READ: Only the data committed before transaction start is read. Uncommitted data or data committed in other concurrent transactions cannot be read.
  • SERIALIZABLE: GaussDB(DWS) does not support SERIALIZABLE. If SERIALIZABLE is set, REPEATABLE READ is executed instead.
+

Default value: READ COMMITTED

+
+

transaction_read_only

Parameter description: Specifies that the current transaction is a read-only transaction.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the current transaction is a read-only transaction.
  • off indicates that the current transaction can be a read/write transaction.
+

Default value: off for CNs and on for DNs

+
+

xc_maintenance_mode

Parameter description: Specifies whether the system is in maintenance mode.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that maintenance mode is enabled.
  • off indicates that the maintenance mode is disabled.
+

Default value: off

+

Enable the maintenance mode with caution to avoid cluster data inconsistencies.

+
+
+

allow_concurrent_tuple_update

Parameter description: Specifies whether to allow concurrent update.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates it is enabled.
  • off indicates it is disabled.
+

Default value: on

+
+

gtm_backup_barrier

Parameter description: Specifies whether to create a restoration point for the GTM starting point.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that a restoration point will be created for the GTM starting point.
  • off indicates that a restoration point will not be created for the GTM starting point.
+

Default value: off

+
+

gtm_conn_check_interval

Parameter description: Sets the CN to check whether the connection between the local thread and the primary GTM is normal.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX/1000. The unit is second.

+

Default value: 10s

+
+

transaction_deferrable

Parameter description: Specifies whether to delay the execution of a read-only serial transaction without incurring an execution failure. Assume this parameter is set to on. When the server detects that the tuples read by a read-only transaction are being modified by other transactions, it delays the execution of the read-only transaction until the other transactions finish modifying the tuples. Currently, this parameter is not used in GaussDB(DWS). Similar to this parameter, the default_transaction_deferrable parameter is used to specify whether to allow delayed execution of a transaction.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the execution of a read-only serial transaction can be delayed.
  • off indicates that the execution of a read-only serial transaction cannot be delayed.
+

Default value: off

+
+

enforce_two_phase_commit

Parameter description: This parameter is reserved for compatibility with earlier versions. This parameter is invalid in the current version.

+
+

enable_show_any_tuples

Parameter description: This parameter is available only in a read-only transaction and is used for analysis. When this parameter is set to on/true, all versions of tuples in the table are displayed.

+

Type: USERSET

+

Value range: Boolean

+
  • on/true indicates that all versions of tuples in the table are displayed.
  • off/false indicates that no versions of tuples in the table are displayed.
+

Default value: off

+
+

gtm_connect_retries

Parameter description: Specifies the number of GTM reconnection attempts.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 2147483647.

+

Default value: 30

+
+

enable_redistribute

Parameter description: Specifies whether unmatched nodes are redistributed.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that unmatched nodes are redistributed.
  • off indicates that unmatched nodes are not redistributed.
+

Default value: off

+
+

enable_gtm_free

Parameter description: Specifies whether the GTM-FREE mode is enabled. In large concurrency scenarios, the snapshots delivered by the GTM increase in number and size. The network between the GTM and the CN becomes the performance bottleneck. The GTM-FREE mode is used to eliminate the bottleneck. In this mode, the CN communicates with DNs instead of the GTM. The CN sends queries to each DN, which locally generates snapshots and xids, ensuring external write consistency but not external read consistency.

+

You are not advised to set this parameter to on in OLTP or OLAP scenarios where strong read consistency is required. This parameter is invalid for GaussDB(DWS).

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the GTM-FREE mode is enabled and the cluster ensures eventual read consistency.
  • off indicates that the GTM-FREE mode is disabled.
+

Default value: off

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0936.html b/docs/dws/dev/dws_04_0936.html new file mode 100644 index 00000000..3de261d3 --- /dev/null +++ b/docs/dws/dev/dws_04_0936.html @@ -0,0 +1,467 @@ + + +

Developer Operations

+

enable_light_colupdate

Parameter description: Specifies whether to enable the lightweight column-store update.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the lightweight column-store update is enabled.
  • off indicates that the lightweight column-store update is disabled.
+

Default value: off

+
+

enable_fast_query_shipping

Parameter description: Specifies whether to use the distributed framework for a query planner.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that execution plans are generated on CNs and DNs separately.
  • off indicates that the distributed framework is used. Execution plans are generated on CNs and then sent to DNs for execution.
+

Default value: on

+
+

enable_trigger_shipping

Parameter description: Specifies whether the trigger can be pushed to DNs for execution.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the trigger can be pushed to DNs for execution.
  • off indicates that the trigger cannot be pushed to DNs. It must be executed on the CN.
+

Default value: on

+
+

enable_remotejoin

Parameter description: Specifies whether JOIN operation plans can be delivered to DNs for execution.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that JOIN operation plans can be delivered to DNs for execution.
  • off indicates that JOIN operation plans cannot be delivered to DNs for execution.
+

Default value: on

+
+

enable_remotegroup

Parameter description: Specifies whether the execution plans of GROUP BY and AGGREGATE can be delivered to DNs for execution.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the execution plans of GROUP BY and AGGREGATE can be delivered to DNs for execution.
  • off indicates that the execution plans of GROUP BY and AGGREGATE cannot be delivered to DNs for execution.
+

Default value: on

+
+

enable_remotelimit

Parameter description: Specifies whether the execution plan specified in the LIMIT clause can be pushed down to DNs for execution.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the execution plan specified in the LIMIT clause can be pushed down to DNs for execution.
  • off indicates that the execution plan specified in the LIMIT clause cannot be delivered to DNs for execution.
+

Default value: on

+
+

enable_remotesort

Parameter description: Specifies whether the execution plan of the ORDER BY clause can be delivered to DNs for execution.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the execution plan of the ORDER BY clause can be delivered to DNs for execution.
  • off indicates that the execution plan of the ORDER BY clause cannot be delivered to DNs for execution.
+

Default value: on

+
+

enable_join_pseudoconst

Parameter description: Specifies whether joining with the pseudo constant is allowed. A pseudo constant indicates that the variables on both sides of a join are identical to the same constant.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that joining with the pseudo constant is allowed.
  • off indicates that joining with the pseudo constant is not allowed.
+

Default value: off

+
+

cost_model_version

Parameter description: Specifies the model used for cost estimation in the application scenario. This parameter affects the distinct estimation of the expression, HashJoin cost model, estimation of the number of rows, distribution key selection during redistribution, and estimation of the number of aggregate rows.

+

Type: USERSET

+

Value range: 0, 1, or 2

+
  • 0 indicates that the original cost estimation model is used.
  • 1 indicates that the enhanced distinct estimation of the expression, HashJoin cost estimation model, estimation of the number of rows, distribution key selection during redistribution, and estimation of the number of aggregate rows are used on the basis of 0.
  • 2 indicates that the ANALYZE sampling algorithm with better randomicity is used on the basis of 1 to improve the accuracy of statistics collection.
+

Default value: 1

+
+

debug_assertions

Parameter description: Specifies whether to enable various assertion checks. This parameter assists in debugging. If you are experiencing strange problems or crashes, set this parameter to on to identify programming defects. To use this parameter, the macro USE_ASSERT_CHECKING must be defined (through the configure option --enable-cassert) during the GaussDB(DWS) compilation.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that various assertion checks are enabled.
  • off indicates that various assertion checks are disabled.
+

This parameter is set to on by default if GaussDB(DWS) is compiled with various assertion checks enabled.

+
+

Default value: off

+
+

distribute_test_param

Parameter description: Specifies whether the embedded test stubs for testing the distribution framework take effect. In most cases, developers embed some test stubs in the code during fault injection tests. Each test stub is identified by a unique name. The value of this parameter is a triplet that includes three values: thread level, test stub name, and error level of the injected fault. The three values are separated by commas (,).

+

Type: USERSET

+

Value range: a string indicating the name of any embedded test stub.

+

Default value: -1, default, default

+
+

ignore_checksum_failure

Parameter description: Sets whether to ignore check failures (but still generates an alarm) and continues reading data. This parameter is valid only when enable_crc_check is set to on. Continuing reading data may result in breakdown, damaged data being transferred or hidden, failure of data recovery from remote nodes, or other serious problems. You are not advised to modify the settings.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that data check errors are ignored.
  • off indicates that data check errors are reported.
+

Default value: off

+
+

enable_colstore

Parameter description: Specifies whether to create a table as a column-store table by default when no storage method is specified. The value for each node must be the same. This parameter is used for tests. Users are not allowed to enable it.

+

Type: SUSET

+

Value range: Boolean

+

Default value: off

+
+

enable_force_vector_engine

Parameter description: Specifies whether to forcibly generate vectorized execution plans for a vectorized execution operator if the operator's child node is a non-vectorized operator. When this parameter is set to on, vectorized execution plans are forcibly generated. When enable_force_vector_engine is enabled, no matter it is a row-store table, column-store table, or hybrid row-column store table, if the plantree does not contain scenarios that do not support vectorization, the vectorized executor is forcibly used.

+

Type: USERSET

+

Value range: Boolean

+

Default value: off

+
+

enable_csqual_pushdown

Parameter description: Specifies whether to deliver filter criteria for a rough check during query.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that a rough check is performed with filter criteria delivered during query.
  • off indicates that a rough check is performed without filter criteria delivered during query.
+

Default value: on

+
+

explain_dna_file

Parameter description: Specifies the name of a CSV file exported when explain_perf_mode is set to run.

+

Type: USERSET

+

The value of this parameter must be an absolute path plus a file name with the extension .csv.

+
+

Value range: a string

+

Default value: NULL

+
+

explain_perf_mode

Parameter description: Specifies the display format of the explain command.

+

Type: USERSET

+

Value range: normal, pretty, summary, and run

+
  • normal indicates that the default printing format is used.
  • pretty indicates that the optimized display mode of GaussDB(DWS) is used. A new format contains a plan node ID, directly and effectively analyzing performance.
  • summary indicates that the analysis result based on such information is printed in addition to the printed information in the format specified by pretty.
  • run indicates that in addition to the printed information specified by summary, the database exports the information as a CSV file.
+

Default value: pretty

+
+

join_num_distinct

Parameter description: Controls the default distinct value of the join column or expression in application scenarios.

+

Type: USERSET

+

Value range: a double-precision floating point number greater than or equal to -100. Decimals may be truncated when displayed on clients.

+
  • If the value is greater than 0, the value is used as the default distinct value.
  • If the value is greater than or equal to -100 and less than 0, it means the percentage used to estimate the default distinct value.
  • If the value is 0, the default distinct value is 200.
+

Default value: -20

+
+

qual_num_distinct

Parameter description: Controls the default distinct value of the filter column or expression in application scenarios.

+

Type: USERSET

+

Value range: a double-precision floating point number greater than or equal to -100. Decimals may be truncated when displayed on clients.

+
  • If the value is greater than 0, the value is used as the default distinct value.
  • If the value is greater than or equal to -100 and less than 0, it means the percentage used to estimate the default distinct value.
  • If the value is 0, the default distinct value is 200.
+

Default value: 200

+
+

trace_notify

Parameter description: Specifies whether to generate a large amount of debugging output for the LISTEN and NOTIFY commands. client_min_messages or log_min_messages must be DEBUG1 or lower so that such output can be recorded in the logs on the client or server separately.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the function is enabled.
  • off indicates that the function is disabled.
+

Default value: off

+
+

trace_recovery_messages

Parameter description: Specifies whether to enable logging of recovery-related debugging output. This parameter allows users to overwrite the normal setting of log_min_messages, but only for specific messages. This is intended for use in debugging the standby server.

+

Type: SIGHUP

+

Value range: enumerated values. Valid values include debug5, debug4, debug3, debug2, debug1, and log. For details about the parameter values, see log_min_messages.

+

Default value: log

+
  • log indicates that recovery-related debugging information will not be logged.
  • Except the default value log, each of the other values indicates that recovery-related debugging information at the specified level will also be logged. Common settings of log_min_messages will unconditionally record information into server logs.
+
+
+

trace_sort

Parameter description: Specifies whether to display information about resource usage during sorting operations in logs. This parameter is available only when the macro TRACE_SORT is defined during the GaussDB(DWS) compilation. However, TRACE_SORT is currently defined by default.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the function is enabled.
  • off indicates that the function is disabled.
+

Default value: off

+
+

zero_damaged_pages

Parameter description: Specifies whether to detect a damaged page header that causes GaussDB(DWS) to report an error, aborting the current transaction.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the function is enabled.
  • off indicates that the function is disabled.
+
  • Setting this parameter to on causes the system to report a warning, pad the damaged page with zeros, and then continue with subsequent processing. This behavior will damage data, that is, all rows on the damaged page. However, it allows you to bypass the error and retrieve rows from any undamaged pages that are present in the table. Therefore, it is useful for restoring data that is damaged due to a hardware or software error. In most cases, you are not advised to set this parameter to on unless you do not want to restore data from the damaged pages of a table.
  • For a column-store table, the system will skip the entire CU and then continue processing. The supported scenarios include the CRC check failure, magic check failure, and incorrect CU length.
+
+

Default value: off

+
+

string_hash_compatible

Parameter description: Specifies whether to use the same method to calculate char-type hash values and varchar- or text-type hash values. Based on the setting of this parameter, you can determine whether a redistribution is required when a distribution column is converted from a char-type data distribution into a varchar- or text-type data distribution.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the same calculation method is used and a redistribution is not required.
  • off indicates that different calculation methods are used and a redistribution is required.
+

Calculation methods differ in the length of input strings used for calculating hash values. (For a char-type hash value, spaces following a string are not counted as the length. For a text- or varchar-type hash value, the spaces are counted.) The hash value affects the calculation result of queries. To avoid query errors, do not modify this parameter during database running once it is set.

+
+

Default value: off

+
+

replication_test

Parameter description: Specifies whether to enable internal testing on the data replication function.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that internal testing on the data replication function is enabled.
  • off indicates that internal testing on the data replication function is disabled.
+

Default value: off

+
+

cost_param

Parameter description: Controls use of different estimation methods in specific customer scenarios, allowing estimated values approximating to onsite values. This parameter can control various methods simultaneously by performing AND (&) operations on the bit for each method. A method is selected if its value is not 0.

+

If cost_param & 1 is not set to 0, an improvement mechanism is selected for calculating a non-equi join selection rate, which is more accurate in estimation of self-join (join between two same tables). In V300R002C00 and later, cost_param & 1=0 is not used. That is, an optimized formula is selected for calculation.

+

When cost_param & 2 is set to a value other than 0, the selection rate is estimated based on multiple filter criteria. The lowest selection rate among all filter criteria, but not the product of the selection rates for two tables under a specific filter criterion, is used as the total selection rate. This method is more accurate when a close correlation exists between the columns to be filtered.

+

When cost_param & 4 is not 0, the selected debugging model is not recommended when the stream node is evaluated.

+

When cost_param & 16 is not 0, the model between fully correlated and fully uncorrelated models is used to calculate the comprehensive selection rate of two or more filtering conditions or join conditions. If there are many filtering conditions, the strongly-correlated model is preferred.

+

Type: USERSET

+

Value range: an integer ranging from 1 to INT_MAX

+

Default value: 16

+
+

convert_string_to_digit

Parameter description: Specifies the implicit conversion priority, which determines whether to preferentially convert strings into numbers.

+

In MySQL-compatible mode, this parameter has no impact.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that strings are preferentially converted into numbers.
  • off indicates that strings are not preferentially converted into numbers.
+

Default value: on

+

Modify this parameter only when absolutely necessary because the modification will change the rule for converting internal data types and may cause unexpected results.

+
+
+

nls_timestamp_format

Parameter description: Specifies the default timestamp format.

+

Type: USERSET

+

Value range: a string

+

Default value: DD-Mon-YYYY HH:MI:SS.FF AM

+
+

enable_partitionwise

Parameter description: Specifies whether to select an intelligent algorithm for joining partitioned tables.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that an intelligent algorithm is selected.
  • off indicates that an intelligent algorithm is not selected.
+

Default value: off

+
+

enable_partition_dynamic_pruning

Parameter description: Specifies whether dynamic pruning is enabled during partition table scanning.

+

Type: USERSET

+

Value range: Boolean

+
  • on: enable
  • off: disable
+

Default value: on

+
+

max_user_defined_exception

Parameter description: Specifies the maximum number of exceptions. The default value cannot be changed.

+

Type: USERSET

+

Value range: an integer

+

Default value: 1000

+
+

datanode_strong_sync

Parameter description: This parameter no longer takes effect.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that forcible synchronization between stream nodes is enabled.
  • off indicates that forcible synchronization between stream nodes is disabled.
+

Default value: off

+
+

enable_debug_vacuum

Parameter description: Specifies whether to allow output of some VACUUM-related logs for problem locating. This parameter is used only by developers. Common users are advised not to use it.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on/true indicates that output of vacuum-related logs is allowed.
  • off/false indicates that output of vacuum-related logs is disallowed.
+

Default value: off

+
+

enable_global_stats

Parameter description: Specifies the current statistics mode. This parameter is used to compare global statistics generation plans and the statistics generation plans for a single DN. This parameter is used for tests. Users are not allowed to enable it.

+

Type: SUSET

+

Value range: Boolean

+
  • on or true indicates the global statistics mode.
  • off or false indicates the single-DN statistics mode.
+

Default value: on

+
+

enable_fast_numeric

Parameter description: Specifies whether to enable optimization for numeric data calculation. Calculation of numeric data is time-consuming. Numeric data is converted into int64- or int128-type data to improve numeric data calculation performance.

+

Type: USERSET

+

Value range: Boolean

+
  • on/true indicates that optimization for numeric data calculation is enabled.
  • off/false indicates that optimization for numeric data calculation is disabled.
+

Default value: on

+
+

enable_row_fast_numeric

Parameter description: Specifies the format in which numeric data in a row-store table is spilled to disks.

+

Type: USERSET

+

Value range: Boolean

+
  • on/true indicates that numeric data in a row-store table is spilled to disks in bigint format.
  • off/false indicates that numeric data in a row-store table is spilled to disks in the original format.
+

If this parameter is set to on, you are advised to enable enable_force_vector_engine to improve the query performance of large data sets. However, compared with the original format, there is a high probability that the bigint format occupies more disk space. For example, the TPC-H test set occupies about 7% more space (reference value, may vary depending on the environment).

+
+

Default value: off

+
+

rewrite_rule

Parameter description: Specifies the rewriting rule for enabled optional queries. Some query rewriting rules are optional. Enabling them cannot always improve query efficiency. In a specific customer scenario, you can set the query rewriting rules through the GUC parameter to achieve optimal query efficiency.

+

This parameter can control the combination of query rewriting rules, for example, there are multiple rewriting rules: rule1, rule2, rule3, and rule4. To set the parameters, you can perform the following operations:

+
set rewrite_rule=rule1;          --Enable query rewriting rule rule1.
+set rewrite_rule=rule2,rule3;    --Enable query rewriting rules rule2 and rule3.
+set rewrite_rule=none;           --Disable all optional query rewriting rules.
+

Type: USERSET

+

Value range: a string

+
  • none: Does not use any optional query rewriting rules.
  • lazyagg: Uses the Lazy Agg query rewriting rules for eliminating aggregation operations in subqueries.
  • magicset: Uses the Magic Set query rewriting rules (from the main query to subqueries).
  • uniquecheck: Uses the Unique Check rewriting rules. (The scenario where the target column does not contain the expression sublink of the aggregate function can be improved. The function can be enabled only when the value of the target column is unique after the sublink is aggregated based on the associated column. This function is recommended to be used by optimization engineers.)
  • disablerep: Uses the function that prohibit pulling up sublinks of the replication table. (Disable sublink pull-up for the replication table.)
  • projection_pushdown: Uses the Projection Pushdown rewriting rules.
+

Default value: magicset

+
+

enable_compress_spill

Parameter description: Specifies whether to enable the compression function of writing data to a disk.

+

Type: USERSET

+

Value range: Boolean

+
  • on/true indicates that optimization for writing data to a disk is enabled.
  • off/false indicates that optimization for writing data to a disk is disabled.
+

Default value: on

+
+

analysis_options

Parameter description: Specifies whether to enable function options in the corresponding options to use the corresponding location functions, including data verification and performance statistics. For details, see the options in the value range.

+

Type: USERSET

+

Value range: a string

+
  • LLVM_COMPILE indicates that the codegen compilation time of each thread is displayed on the explain performance page.
  • HASH_CONFLICT indicates that the log file in the pg_log directory of the DN process displays the hash table statistics, including the hash table size, hash chain length, and hash conflict information.
  • STREAM_DATA_CHECK indicates that a CRC check is performed on data before and after network data transmission.
+

Default value: off(ALL), which indicates that no location function is enabled.

+
+

resource_track_log

Parameter description: Specifies the log level of self-diagnosis. Currently, this parameter takes effect only in multi-column statistics.

+

Type: USERSET

+

Value range: a string

+
  • summary: Brief diagnosis information is displayed.
  • detail: Detailed diagnosis information is displayed.
+

Currently, the two parameter values differ only when there is an alarm about multi-column statistics not collected. If the parameter is set to summary, such an alarm will not be displayed. If it is set to detail, such an alarm will be displayed.

+

Default value: summary

+
+

hll_default_log2m

Parameter description: Specifies the number of buckets for HLL data. The number of buckets affects the precision of distinct values calculated by HLL. The more buckets there are, the smaller the deviation is. The deviation range is as follows: [–1.04/2log2m*1/2, +1.04/2log2m*1/2]

+

Type: USERSET

+

Value range: an integer ranging from 10 to 16

+

Default value: 11

+
+

hll_default_regwidth

Parameter description: Specifies the number of bits in each bucket for HLL data. A larger value indicates more memory occupied by HLL. hll_default_regwidth and hll_default_log2m determine the maximum number of distinct values that can be calculated by HLL. For details, see Table 1.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 5

+

Default value: 5

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Maximum number of calculated distinct values determined by hll_default_log2m and hll_default_regwidth

log2m

+

regwidth = 1

+

regwidth = 2

+

regwidth = 3

+

regwidth = 4

+

regwidth = 5

+

10

+

7.4e+02

+

3.0e+03

+

4.7e+04

+

1.2e+07

+

7.9e+11

+

11

+

1.5e+03

+

5.9e+03

+

9.5e+04

+

2.4e+07

+

1.6e+12

+

12

+

3.0e+03

+

1.2e+04

+

1.9e+05

+

4.8e+07

+

3.2e+12

+

13

+

5.9e+03

+

2.4e+04

+

3.8e+05

+

9.7e+07

+

6.3e+12

+

14

+

1.2e+04

+

4.7e+04

+

7.6e+05

+

1.9e+08

+

1.3e+13

+

15

+

2.4e+04

+

9.5e+04

+

1.5e+06

+

3.9e+08

+

2.5e+13

+
+
+
+

hll_default_expthresh

Parameter description: Specifies the default threshold for switching from the explicit mode to the sparse mode.

+

Type: USERSET

+

Value range: an integer ranging from –1 to 7 –1 indicates the auto mode; 0 indicates that the explicit mode is skipped; a value from 1 to 7 indicates that the mode is switched when the number of distinct values reaches 2hll_default_expthresh.

+

Default value: –1

+
+

hll_default_sparseon

Parameter description: Specifies whether to enable the sparse mode by default.

+

Type: USERSET

+

Valid value: 0 and 1 0 indicates that the sparse mode is disabled by default. 1 indicates that the sparse mode is enabled by default.

+

Default value: 1

+
+

hll_max_sparse

Parameter description: Specifies the size of max_sparse.

+

Type: USERSET

+

Value range: an integer ranging from –1 to INT_MAX

+

Default value: –1

+
+

enable_compress_hll

Parameter description: Specifies whether to enable memory optimization for HLL.

+

Type: USERSET

+

Value range: Boolean

+
  • on or true indicates that memory optimization is enabled.
  • off or false indicates that memory optimization is disabled.
+

Default value: off

+
+

udf_memory_limit

Parameter description: Controls the maximum physical memory that can be used when each CN or DN executes UDFs.

+

Type: POSTMASTER

+

Value range: an integer. The value range is from 200 x 1024 to the value of max_process_memory and the unit is KB.

+

Default value: 200 MB

+
+

FencedUDFMemoryLimit

Parameter description: Controls the virtual memory used by each fenced udf worker process.

+

Type: USERSET

+

Suggestion: You are not advised to set this parameter. You can set udf_memory_limit instead.

+

Value range: an integer. The unit can be KB, MB, or GB. 0 indicates that the memory is not limited.

+

Default value: 0

+
+

UDFWorkerMemHardLimit

Parameter description: Specifies the maximum value of fencedUDFMemoryLimit.

+

Type: POSTMASTER

+

Suggestion: You are not advised to set this parameter. You can set udf_memory_limit instead.

+

Value range: an integer. The unit can be KB, MB, or GB.

+

Default value: 1 GB

+
+

pljava_vmoptions

Parameter description: Specifies the startup parameters for JVMs used by the PL/Java function.

+

Type: SUSET

+

Value range: a string, supporting:

+
  • JDK8 JVM startup parameters.
  • JDK8 JVM system attributes (starting with –D, for example, –Djava.ext.dirs).
  • User-defined parameters (starting with –D, for example, –Duser.defined.option).
+

If pljava_vmoptions is set to a value beyond the value range, an error will be reported when PL/Java functions are used.

+
+

Default value: empty

+
+

javaudf_disable_feature

Parameter description: Specifies the granularity of Java UDF actions.

+

Type: SIGHUP

+

Value range: a string

+
  • none indicates that any action specified in other fine-grained parameters is enabled. When this parameter is set together with other parameters, none is invalid.
  • all indicates that all Java UDF functions are disabled. This option has the highest priority.
  • extdir indicates that the function of storing dependency JAR packages in a third-party path is disabled.
  • hadoop indicates that Hadoop functions are disabled.
  • reflection indicates that the reflection permission (ReflectPermission) is disabled during the execution of Java UDF functions.
  • loadlibrary indicates that the dynamic library loading permission (loadLibrary) is disabled during the execution of Java UDF functions.
  • net indicates that the network permission (NetPermission) is disabled during the execution of Java UDF functions.
  • socket indicates that the socket permission (SocketPermission) is disabled during the execution of Java UDF functions.
  • security indicates that the security configuration permission (SecurityPermission) is disabled during the execution of Java UDF functions.
  • classloader indicates that the classLoder creation permission (createClassLoader) is disabled during the execution of Java UDF functions.
  • access_declared_members indicates that the permission of accessing other declared members (accessDeclaredMembers) is disabled during the execution of Java UDF functions.
+

Default value: extdir,hadoop,reflection,loadlibrary,net,socket,security,classloader,access_declared_members

+
+

enable_pbe_optimization

Parameter description: Specifies whether the optimizer optimizes the query plan for statements executed in Parse Bind Execute (PBE) mode.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the optimizer optimizes the query plan.
  • off indicates that the optimization does not optimize the query plan.
+

Default value: on

+
+

enable_light_proxy

Parameter description: Specifies whether the optimizer optimizes the execution of simple queries on CNs.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates that the optimizer optimizes the execution.
  • off indicates that the optimization does not optimize the execution.
+

Default value: on

+
+

checkpoint_flush_after

Parameter description: Specifies the number of consecutive disk pages that the checkpointer writer thread writes before asynchronous flush. In GaussDB(DWS), the size of a disk page is 8 KB.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 256. 0 indicates that the asynchronous flush function is disabled. For example, if the value is 32, the checkpointer thread continuously writes 32 disk pages (that is, 32 x 8 = 256 KB) before asynchronous flush.

+

Default value: 32

+
+

enable_parallel_ddl

Parameter description: Controls whether multiple CNs can concurrently perform DDL operations on the same database object.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that DDL operations can be performed safely and that no distributed deadlock occurs.
  • off indicates that DDL operations cannot be performed safely and that distributed deadlocks may occur.
+

Default value: on

+
+

show_acce_estimate_detail

Parameter description: When the GaussDB(DWS) cluster is accelerated (acceleration_with_compute_pool is set to on), specifies whether the EXPLAIN statement displays the evaluation information about execution plan pushdown to computing Node Groups. The evaluation information is generally used by O&M personnel during maintenance, and it may affect the output display of the EXPLAIN statement. Therefore, this parameter is disabled by default. The evaluation information is displayed only if the verbose option of the EXPLAIN statement is enabled.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the evaluation information is displayed in the output of the EXPLAIN statement.
  • off indicates that the evaluation information is not displayed in the output of the EXPLAIN statement.
+

Default value: off

+
+

support_batch_bind

Parameter description: Specifies whether to batch bind and execute PBE statements through interfaces such as JDBC, ODBC, and Libpq.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that batch binding and execution are used.
  • off indicates that batch binding and execution are not used.
+

Default value: on

+
+

enable_immediate_interrupt

Parameter description: Specifies whether the execution of the current statement or session can be immediately interrupted in the signal processing function.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the execution of the current statement or session can be immediately interrupted in the signal processing function.
  • off indicates that the execution of the current statement or session cannot be immediately interrupted in the signal processing function.
+

Default value: off

+

Exercise caution when setting this parameter to on. If the execution of the current statement or session can be immediately interrupted in the signal processing function, the execution of some key processes may be interrupted, causing the failure to release the global lock in the system. It is recommended that this parameter be set to on only during system debugging or fault prevention.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0937.html b/docs/dws/dev/dws_04_0937.html new file mode 100644 index 00000000..e62e793c --- /dev/null +++ b/docs/dws/dev/dws_04_0937.html @@ -0,0 +1,17 @@ + + +

Auditing

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0938.html b/docs/dws/dev/dws_04_0938.html new file mode 100644 index 00000000..f9184087 --- /dev/null +++ b/docs/dws/dev/dws_04_0938.html @@ -0,0 +1,58 @@ + + +

Audit Switch

+

audit_enabled

Parameter description: Specifies whether to enable or disable the audit process. After the audit process is enabled, the auditing information written by the background process can be read from the pipe and written into audit files.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the auditing function is enabled.
  • off indicates that the auditing function is disabled.
+

Default value: on

+
+

audit_data_format

Parameter description: Specifies the format of the audit log files. Currently, only the binary format is supported.

+

Type: POSTMASTER

+

Value range: a string

+

Default value: binary

+
+

audit_rotation_interval

Parameter description: Specifies the interval of creating an audit log file. If the difference between the current time and the time when the previous audit log file is created is greater than the value of audit_rotation_interval, a new audit log file will be generated.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to INT_MAX/60. The unit is min.

+

Default value: 1d

+

Adjust this parameter only when required. Otherwise, audit_resource_policy may fail to take effect. To control the storage space and time of audit logs, set the audit_resource_policy, audit_space_limit, and audit_file_remain_time parameters.

+
+
+

audit_rotation_size

Parameter description: Specifies the maximum capacity of an audit log file. If the total number of messages in an audit log exceeds the value of audit_rotation_size, the server will generate a new audit log file.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 1024. The unit is MB.

+

Default value: 10 MB

+

Adjust this parameter only when required. Otherwise, audit_resource_policy may fail to take effect. To control the storage space and time of audit logs, set the audit_resource_policy, audit_space_limit, and audit_file_remain_time parameters.

+
+
+

audit_resource_policy

Parameter description: Specifies the policy for determining whether audit logs are preferentially stored by space or time.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that audit logs are preferentially stored by space. A maximum of audit_space_limit logs can be stored.
  • off indicates that audit logs are preferentially stored by time. A minimum duration of audit_file_remain_time logs must be stored. If the value of audit_file_remain_time is too large, the disk space occupied by stored audit logs reaches the value of audit_space_limit. In this case, the earliest audit files are deleted.
+

Default value: on

+
+

audit_file_remain_time

Parameter description: Specifies the minimum duration required for recording audit logs. This parameter is valid only when audit_resource_policy is set to off.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 730. The unit is day. 0 indicates that the storage duration is not limited.

+

Default value: 90

+
+

audit_space_limit

Parameter description: Specifies the total disk space occupied by audit files.

+

Type: SIGHUP

+

Value range: an integer ranging from 1024 KB to 1024 GB. The unit is KB.

+

Default value: 1GB

+
+

audit_file_remain_threshold

Parameter description: Specifies the maximum number of audit files in the audit directory.

+

Type: SIGHUP

+

Value range: an integer ranging from 1 to 1048576

+

Default value: 1048576

+

Ensure that the value of this parameter is 1048576. If the value is changed, the audit_resource_policy parameter may not take effect. To control the storage space and time of audit logs, use the audit_resource_policy, audit_space_limit, and audit_file_remain_time parameters.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0940.html b/docs/dws/dev/dws_04_0940.html new file mode 100644 index 00000000..de5090e5 --- /dev/null +++ b/docs/dws/dev/dws_04_0940.html @@ -0,0 +1,226 @@ + + +

Operation Audit

+

audit_operation_exec

Parameter description: Specifies whether to audit successful operations in GaussDB(DWS). Set this parameter as required.

+

Type: SIGHUP

+

Value range: a string

+
  • none: indicates that no audit item is configured. If any audit item is configured, none becomes invalid.
  • all: indicates that all successful operations are audited. This value overwrites the concurrent configuration of any other audit items. Note that even if this parameter is set to all, not all DDL operations are audited. You need to control the object level of DDL operations by referring to audit_system_object.
  • login: indicates that successful logins are audited.
  • logout: indicates that user logouts are audited.
  • database_process: indicates that database startup, stop, switchover, and recovery operations are audited.
  • user_lock: indicates that successful locking and unlocking operations are audited.
  • grant_revoke: indicates that successful granting and reclaiming of a user's permission are audited.
  • ddl: indicates that successful DDL operations are audited. DDL operations are controlled at a fine granularity based on operation objects. Therefore, audit_system_object is used to control the objects whose DDL operations are to be audited. (The audit function takes effect as long as audit_system_object is configured, no matter whether ddl is set.)
  • select: indicates that successful SELECT operations are audited.
  • copy: indicates that successful COPY operations are audited.
  • userfunc: indicates that successful operations for user-defined functions, stored procedures, and anonymous blocks are audited.
  • set: indicates that successful SET operations are audited.
  • transaction: indicates that successful transaction operations are audited.
  • vacuum: indicates that successful VACUUM operations are audited.
  • analyze: indicates that successful ANALYZE operations are audited.
  • explain: indicates that successful EXPLAIN operations are audited.
  • specialfunc: indicates that successful calls to special functions are audited. Special functions include pg_terminate_backend and pg_cancel_backend.
  • insert: indicates that successful INSERT operations are audited.
  • update: indicates that successful UPDATE operations are audited.
  • delete: indicates that successful DELETE operations are audited.
  • merge: indicates that successful MERGE operations are audited.
  • show: indicates that successful SHOW operations are audited.
  • checkpoint: indicates that successful CHECKPOINT operations are audited.
  • barrier: indicates that successful BARRIER operations are audited.
  • cluster: indicates that successful CLUSTER operations are audited.
  • comment: indicates that successful COMMENT operations are audited.
  • cleanconn: indicates that successful CLEANCONNECTION operations are audited.
  • prepare: indicates that successful PREPARE, EXECUTE, and DEALLOCATE operations are audited.
  • constraints: indicates that successful CONSTRAINTS operations are audited.
  • cursor: indicates that successful cursor operations are audited.
+

Default value: login, logout, database_process, user_lock, grant_revoke, set, transaction, and cursor

+
  • You are advised to reserve transaction. Otherwise, statements in a transaction will not be audited.
  • You are advised to reserve cursor. Otherwise, the SELECT statements in a cursor will not be audited. To audit the SELECT statement within transactions and cursors, retain both transaction and cursor audit items.
  • The Data Studio client automatically encapsulates SELECT statements using CURSOR.
+
+
+

audit_operation_error

Parameter description: Specifies whether to audit failed operations in GaussDB(DWS). Set this parameter as required.

+

Type: SIGHUP

+

Value range: a string

+
  • none: indicates that no audit item is configured. If any audit item is configured, none becomes invalid.
  • syn_success: synchronizes the audit_operation_exec configuration. To be specific, if the audit of a successful operation is configured, the corresponding failed operation is also audited. Note that even after syn_success is configured, you can continue to configure the audit of other failed operations. If audit_operation_exec is set to all, all failed operations are audited. If audit_operation_exec is set to none, syn_success is equivalent to none, that is, no audit item is configured.
  • parse: indicates that the failed command parsing is audited, including the timeout of waiting for a command execution.
  • login: indicates that failed logins are audited.
  • user_lock: indicates that failed locking and unlocking operations are audited.
  • violation: indicates that a user's access violation operations are audited.
  • grant_revoke: indicates that failed granting and reclaiming of a user's permission are audited.
  • ddl: indicates that failed DDL operations are audited. DDL operations are controlled at a fine granularity based on operation objects and configuration of audit_system_object. Therefore, failed DDL operations of the type specified in audit_system_object will be audited after ddl is configured.
  • select: indicates that failed SELECT operations are audited.
  • copy: indicates that failed COPY operations are audited.
  • userfunc: indicates that failed operations for user-defined functions, stored procedures, and anonymous blocks are audited.
  • set: indicates that failed SET operations are audited.
  • transaction: indicates that failed transaction operations are audited.
  • vacuum: indicates that failed VACUUM operations are audited.
  • analyze: indicates that failed ANALYZE operations are audited.
  • explain: indicates that failed EXPLAIN operations are audited.
  • specialfunc: indicates that failed calls to special functions are audited. Special functions include pg_terminate_backend and pg_cancel_backend.
  • insert: indicates that failed INSERT operations are audited.
  • update: indicates that failed UPDATE operations are audited.
  • delete: indicates that failed DELETE operations are audited.
  • merge: indicates that failed MERGE operations are audited.
  • show: indicates that failed SHOW operations are audited.
  • checkpoint: indicates that failed CHECKPOINT operations are audited.
  • barrier: indicates that failed BARRIER operations are audited.
  • cluster: indicates that failed CLUSTER operations are audited.
  • comment: indicates that failed COMMENT operations are audited.
  • cleanconn: indicates that failed CLEANCONNECTION operations are audited.
  • prepare: indicates that failed PREPARE, EXECUTE, and DEALLOCATE operations are audited.
  • constraints: indicates that failed CONSTRAINTS operations are audited.
  • cursor: indicates that failed cursor operations are audited.
  • blacklist: indicates that the blacklist execution failure is audited.
+

Default value: login

+
+

audit_inner_tool

Parameter description: Specifies whether to audit the operations of the internal maintenance tool in GaussDB(DWS).

+

Type: SIGHUP

+

Value range: Boolean

+
  • on: indicates that all operations of the internal maintenance tool are audited.
  • off: indicates that all operations of the internal maintenance tool are not audited.
+

Default value: off

+
+

audit_system_object

Parameter description: Specifies whether to audit the CREATE, DROP, and ALTER operations on the GaussDB(DWS) database object. The GaussDB(DWS) database objects include databases, users, schemas, and tables. The operations on the database object can be audited by changing the value of this parameter.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 4194303

+
  • 0 indicates that the function of auditing the CREATE, DROP, and ALTER operations on the GaussDB(DWS) database object can be disabled.
  • Other values indicate that the CREATE, DROP, and ALTER operations on a certain or some GaussDB(DWS) database objects are audited.
+

Value description:

+

The value of this parameter is calculated by 22 binary bits. The 22 binary bits represent 22 types of GaussDB(DWS) database objects. If the corresponding binary bit is set to 0, the CREATE, DROP, and ALTER operations on corresponding database objects are not audited. If it is set to 1, the CREATE, DROP, and ALTER operations are audited. For details about the audit content represented by these 22 binary bits, see Table 1.

+

Default value: 12303

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Meaning of each value for the audit_system_object parameter

Binary Bit

+

Meaning

+

Value Description

+

Bit 0

+

Whether to audit the CREATE, DROP, and ALTER operations on databases.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 1

+

Whether to audit the CREATE, DROP, and ALTER operations on schemas.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 2

+

Whether to audit the CREATE, DROP, and ALTER operations on users.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 3

+

Whether to audit the CREATE, DROP, ALTER, and TRUNCATE operations on tables.

+
  • 0 indicates that the CREATE, DROP, ALTER, and TRUNCATE operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, ALTER, and TRUNCATE operations on these objects are audited.
+

Bit 4

+

Whether to audit the CREATE, DROP, and ALTER operations on indexes.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 5

+

Whether to audit the CREATE, DROP, and ALTER operations on views.

+
  • 0 indicates that the CREATE and DROP operations on these objects are not audited.
  • 1 indicates that the CREATE and DROP operations on these objects are audited.
+

Bit 6

+

Whether to audit the CREATE, DROP, and ALTER operations on triggers.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 7

+

Whether to audit the CREATE, DROP, and ALTER operations on procedures/functions.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 8

+

Whether to audit the CREATE, DROP, and ALTER operations on tablespaces.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 9

+

Whether to audit the CREATE, DROP, and ALTER operations on resource pools.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 10

+

Whether to audit the CREATE, DROP, and ALTER operations on workloads.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 11

+

Whether to audit the CREATE, DROP, and ALTER operations on SERVER FOR HADOOP objects.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 12

+

Whether to audit the CREATE, DROP, and ALTER operations on data sources.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
+
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 13

+

Whether to audit the CREATE, DROP, and ALTER operations on Node Groups.

+
  • 0 indicates that the CREATE and DROP operations on these objects are not audited.
+
  • 1 indicates that the CREATE and DROP operations on these objects are audited.
+

Bit 14

+

Whether to audit the CREATE, DROP, and ALTER operations on ROW LEVEL SECURITY objects.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on these objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on these objects are audited.
+

Bit 15

+

Whether to audit the CREATE, DROP, and ALTER operations on types.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on types are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on types are audited.
+

Bit 16

+

Whether to audit the CREATE, DROP, and ALTER operations on text search objects (configurations and dictionaries)

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on text search objects are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on text search objects are audited.
+

Bit 17

+

Whether to audit the CREATE, DROP, and ALTER operations on directories.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on directories are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on directories are audited.
+

Bit 18

+

Whether to audit the CREATE, DROP, and ALTER operations on workloads.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on types are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on types are audited.
+

Bit 19

+

Whether to audit the CREATE, DROP, and ALTER operations on redaction policies.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on redaction policies are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on redaction policies are audited.
+

Bit 20

+

Whether to audit the CREATE, DROP, and ALTER operations on sequences.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on sequences are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on sequences are audited.
+

Bit 21

+

Whether to audit the CREATE, DROP, and ALTER operations on nodes.

+
  • 0 indicates that the CREATE, DROP, and ALTER operations on nodes are not audited.
  • 1 indicates that the CREATE, DROP, and ALTER operations on nodes are audited.
+
+
+
+

enableSeparationOfDuty

Parameter description: Specifies whether the separation of permissions is enabled.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the separation of permissions is enabled.
  • off indicates that the separation of permissions is disabled.
+

Default value: off

+
+

enable_grant_option

Parameter description: Specifies whether the with grant option function can be used in security mode.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the with grant option function can be used in security mode.
  • off indicates that the with grant option function cannot be used in security mode.
+

Default value: off

+
+

enable_copy_server_files

Parameter description: Specifies whether to enable the permission to copy server files.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the permission to copy server files is enabled.
  • off indicates that the permission to copy server files is disabled.
+

Default value: true

+

COPY FROM/TO file requires system administrator permissions. However, if the separation of permissions is enabled, system administrator permissions are different from initial user permissions. In this case, you can use enable_copy_server_file to control the COPY permission of system administrators to prevent escalation of their permissions.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0941.html b/docs/dws/dev/dws_04_0941.html new file mode 100644 index 00000000..01874db8 --- /dev/null +++ b/docs/dws/dev/dws_04_0941.html @@ -0,0 +1,25 @@ + + +

Transaction Monitoring

+

The automatic rollback transaction can be monitored and its statement problems can be located by setting the transaction timeout warning. In addition, the statements with long execution time can also be monitored.

+

transaction_sync_naptime

Parameter description: For data consistency, when the local transaction's status differs from that in the snapshot of the GTM, other transactions will be blocked. You need to wait for a few minutes until the transaction status of the local host is consistent with that of the GTM. The gs_clean tool is automatically triggered for cleansing when the waiting period on the CN exceeds that of transaction_sync_naptime. The tool will shorten the blocking time after it completes the cleansing.

+

Type: USERSET

+

Value range: an integer. The minimum value is 0. The unit is second.

+

Default value: 5s

+

If the value of this parameter is set to 0, gs_clean will not be automatically invoked for the cleansing before the blocking arrives the duration. Instead, the gs_clean tool is invoked by gs_clean_timeout. The default value is 5 minutes.

+
+
+

transaction_sync_timeout

Parameter description: For data consistency, when the local transaction's status differs from that in the snapshot of the GTM, other transactions will be blocked. You need to wait for a few minutes until the transaction status of the local host is consistent with that of the GTM. An exception is reported when the waiting duration on the CN exceeds the value of transaction_sync_timeout. Roll back the transaction to avoid system blocking due to long time of process response failures (for example, sync lock).

+

Type: USERSET

+

Value range: an integer. The minimum value is 0. The unit is second.

+

Default value: 10min

+
+
  • If the value is 0, no error is reported when the blocking times out or the transaction is rolled back.
  • The value of this parameter must be greater than gs_clean_timeout. Otherwise, unnecessary transaction rollback will probably occur due to a block timeout caused by residual transactions that have not been deleted by gs_clean on a DN.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0945.html b/docs/dws/dev/dws_04_0945.html new file mode 100644 index 00000000..c756d4aa --- /dev/null +++ b/docs/dws/dev/dws_04_0945.html @@ -0,0 +1,641 @@ + + +

Miscellaneous Parameters

+

enable_cluster_resize

Parameter description: If an SQL statement involves tables belonging to different groups, you can enable this parameter to push the execution plan of the statement to improve performance.

+

Type: SUSET

+

Value range: Boolean

+
  • on indicates the execution plan of the statement can be pushed.
  • off indicates the execution plan of the statement cannot be pushed.
+

Default value: off

+

This parameter is used for internal O&M. Do not set it to on unless absolutely necessary.

+
+
+

cstore_insert_mode

Parameter description: Specifies the storage location of data to be imported to an HDFS table. This parameter is needed for operations that involve data import, such as INSERT, UPDATE, COPY, and VACUUM FULL.

+

Type: USERSET

+

Value range: enumerated values

+
  • AUTO: The major part of imported data is stored in HDFS, and the tail is stored in the delta table.
  • DELTA: All the imported data is stored in the delta table.
  • MAIN: All the imported data is stored in HDFS.
+

Default value: auto

+

You can set other values as the default in the configuration file.

+
+
+

remote_read_mode

Parameter description: When enable_crc_check is set to on and the data read by the primary DN fails the verification, remote_read_mode is used to specify whether to enable remote read and whether to use secure authentication for connection upon the data verification failure. The setting takes effect only after the cluster is restarted.

+

Type: POSTMASTER

+

Value range: off, non_authentication, authentication

+
  • off: indicates that the remote read function is disabled.
  • non_authentication: indicates that the standby DN is connected and data is obtained when non-authentication is used.
  • authentication: indicates that the standby DN is connected and data is obtained through authentication. Before restarting the cluster, ensure that a certificate exists in the $GAUSSHOME/share/sslcert/grpc/ directory. Otherwise, the cluster cannot be started.
+

Default value: non_authentication

+
+

enable_upgrade_merge_lock_mode

Parameter description: If this parameter is set to on, the delta merge operation internally increases the lock level, and errors can be avoided when update and delete operations are performed at the same time.

+

Type: USERSET

+

Value range: Boolean

+
  • If this parameter is set to on, the delta merge operation internally increases the lock level. In this way, when any two of the DELTAMERGE, UPDATE, and DELETE operations are concurrently performed, an operation can be performed only after the previous one is complete.
  • If this parameter is set to off, and any two of the DELTAMERGE, UPDATE, and DELETE operations are concurrently performed to data in a row in the delta table of the HDFS table, errors will be reported during the later operation, and the operation will stop.
+

Default value: off

+
+

job_queue_processes

Parameter description: Specifies the number of jobs that can be concurrently executed. This parameter is a postmaster parameter. You can set it using gs_guc, and you need to restart gaussdb to make the setting take effect.

+

Type: POSTMASTER

+

Value range: 0 to 1000

+

Functions:

+
  • Setting job_queue_processes to 0 indicates that the scheduled task function is disabled and that no job will be executed. (Enabling scheduled tasks may affect the system performance. At sites where this function is not required, you are advised to disable it.)
  • Setting job_queue_processes to a value that is greater than 0 indicates that the scheduled task function is enabled and this value is the maximum number of tasks that can be concurrently processed.
+

After the scheduled task function is enabled, the job_scheduler thread at a scheduled interval polls the pg_jobs system catalog. The scheduled task check is performed every second by default.

+

Too many concurrent tasks consume many system resources, so you need to set the number of concurrent tasks to be processed. If the current number of concurrent tasks reaches job_queue_processes and some of them expire, these tasks will be postponed to the next polling period. Therefore, you are advised to set the polling interval (the interval parameter of the submit interface) based on the execution duration of each task to avoid the problem that tasks in the next polling period cannot be properly processed because overlong task execution time.

+

Note: If the number of parallel jobs is large and the value is too small, these jobs will wait in queues. However, a large parameter value leads to large resource consumption. You are advised to set this parameter to 100 and change it based on the system resource condition.

+

Default value: 10

+
+

ngram_gram_size

Parameter description: Specifies the length of the ngram parser segmentation.

+

Type: USERSET

+

Value range: an integer ranging from 1 to 4

+

Default value: 2

+
+

ngram_grapsymbol_ignore

Parameter description: Specifies whether the ngram parser ignores graphical characters.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Ignores graphical characters.
  • off: Does not ignore graphical characters.
+

Default value: off

+
+

ngram_punctuation_ignore

Parameter description: Specifies whether the ngram parser ignores punctuations.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Ignores punctuations.
  • off: Does not ignore punctuations.
+

Default value: on

+
+

zhparser_dict_in_memory

Parameter description: Specifies whether Zhparser adds a dictionary to memory.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on: Adds the dictionary to memory.
  • off: Does not add the dictionary to memory.
+

Default value: on

+
+

zhparser_multi_duality

Parameter description: Specifies whether Zhparser aggregates segments in long words with duality.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Aggregates segments in long words with duality.
  • off: Does not aggregate segments in long words with duality.
+

Default value: off

+
+

zhparser_multi_short

Parameter description: Specifies whether Zhparser executes long words composite divide.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Performs compound segmentation for long words.
  • off: Does not perform compound segmentation for long words.
+

Default value: on

+
+

zhparser_multi_zall

Parameter description: Specifies whether Zhparser displays all single words individually.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Displays all single words separately.
  • off: Does not display all single words separately.
+

Default value: off

+
+

zhparser_multi_zmain

Parameter description: Specifies whether Zhparser displays important single words separately.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Displays important single words separately.
  • off: Does not display important single words separately.
+

Default value: off

+
+

zhparser_punctuation_ignore

Parameter description: Specifies whether the Zhparser segmentation result ignores special characters including punctuations (\r and \n will not be ignored).

+

Type: USERSET

+

Value range: Boolean

+
  • on: Ignores all the special characters including punctuations.
  • off: Does not ignore all the special characters including punctuations.
+

Default value: on

+
+

zhparser_seg_with_duality

Parameter description: Specifies whether Zhparser aggregates segments in long words with duality.

+

Type: USERSET

+

Value range: Boolean

+
  • on: Aggregates segments in long words with duality.
  • off: Does not aggregate segments in long words with duality.
+

Default value: off

+
+

acceleration_with_compute_pool

Parameter description: Specifies whether to use the computing resource pool for acceleration when OBS is queried.

+

Type: USERSET

+

Value range: Boolean

+
  • on indicates that the query covering OBS is accelerated based on the cost when the computing resource pool is available.
  • off indicates that no query is accelerated using the computing resource pool.
+

Default value: off

+
+

behavior_compat_options

Parameter description: Specifies database compatibility behavior. Multiple items are separated by commas (,).

+

Type: USERSET

+

Value range: a string

+

Default value: In upgrade scenarios, the default value of this parameter is the same as that in the cluster before the upgrade. When a new cluster is installed, the default value of this parameter is check_function_conflicts to prevent serious problems caused by incorrect function attributes defined by users.

+
  • Currently, only Table 1 is supported.
  • Multiple items are separated by commas (,), for example, set behavior_compat_options='end_month_calculate,display_leading_zero';
  • strict_concat_functions and strict_text_concat_td are mutually exclusive.
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Compatibility configuration items

Configuration Item

+

Behavior

+

Applicable Compatibility Mode

+

display_leading_zero

+

Specifies how floating point numbers are displayed.

+
  • If this item is not specified, for a decimal number between -1 and 1, the 0 before the decimal point is not displayed. For example, 0.25 is displayed as .25.
  • If this item is specified, for a decimal number between -1 and 1, the 0 before the decimal point is displayed. For example, 0.25 is displayed as 0.25.
+

ORA

+

TD

+

end_month_calculate

+

Specifies the calculation logic of the add_months function.

+

Assume that the two parameters of the add_months function are param1 and param2, and that the sum of param1 and param2 is result.

+
  • If this item is not specified, and the Day of param1 indicates the last day of a month shorter than result, the Day in the calculation result will equal that in param1. For example:
+
1
+2
+3
+4
+5
select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-28 00:00:00
+(1 row)
+
+ +
+
  • If this item is specified, and the Day of param1 indicates the last day of a month shorter than result, the Day in the calculation result will equal that in result. For example:
+
1
+2
+3
+4
+5
select add_months('2018-02-28',3) from dual;
+add_months
+---------------------
+2018-05-31 00:00:00
+(1 row)
+
+ +
+

ORA

+

TD

+

compat_analyze_sample

+

Specifies the sampling behavior of the ANALYZE operation.

+

If this item is specified, the sample collected by the ANALYZE operation will be limited to around 30,000 records, controlling CN memory consumption and maintaining the stability of ANALYZE.

+

ORA

+

TD

+

MySQL

+

bind_schema_tablespace

+

Binds a schema with the tablespace with the same name.

+

If a tablespace name is the same as sche_name, default_tablespace will also be set to sche_name if search_path is set to sche_name.

+

ORA

+

TD

+

MySQL

+

bind_procedure_searchpath

+

Specifies the search path of the database object for which no schema name is specified.

+

If no schema name is specified for a stored procedure, the search is performed in the schema to which the stored procedure belongs.

+

If the stored procedure is not found, the following operations are performed:

+
  • If this item is not specified, the system reports an error and exits.
  • If this item is specified, the search continues based on the settings of search_path. If the issue persists, the system reports an error and exits.
+

ORA

+

TD

+

MySQL

+

correct_to_number

+

Controls the compatibility of the to_number() result.

+

If this item is specified, the result of the to_number() function is the same as that of PG11. Otherwise, the result is the same as that of Oracle.

+

ORA

+

unbind_divide_bound

+

Controls the range check on the result of integer division.

+
  • If this item is not specified, the division result is checked. If the result is out of the range, an error is reported. In the following example, an out-of-range error is reported because the value of INT_MIN/(-1) is greater than the value of INT_MAX.
+
SELECT (-2147483648)::int / (-1)::int;
+ERROR:  integer out of range
+
  • If this item is specified, the range of the division result does not need to be checked. In the following example, INT_MIN/(-1) can be used to obtain the output result INT_MAX+1.
+
SELECT (-2147483648)::int / (-1)::int;
+  ?column?
+------------
+ 2147483648
+(1 row)
+

ORA

+

TD

+

merge_update_multi

+

Performs an update if multiple rows are matched for MERGE INTO.

+

If this item is specified, no error is reported if multiple rows are matched. Otherwise, an error is reported (same as Oracle).

+

ORA

+

TD

+

return_null_string

+

Specifies how to display the empty result (empty string '') of the lpad(), rpad(), repeat(), regexp_split_to_table(), and split_part() functions.

+
  • If this item is not specified, the empty string is displayed as NULL.
+
1
+2
+3
+4
+5
select length(lpad('123',0,'*')) from dual;
+length
+--------
+
+(1 row)
+
+ +
+
  • If this item is specified, the empty string is displayed as single quotation marks ('').
+
1
+2
+3
+4
+5
select length(lpad('123',0,'*')) from dual;
+length
+--------
+0
+(1 row)
+
+ +
+

ORA

+

compat_concat_variadic

+

Specifies the compatibility of variadic results of the concat() and concat_ws() functions.

+

If this item is specified and a concat function has a parameter of the variadic type, different result formats in Oracle and Teradata are retained. If this item is not specified and a concat function has a parameter of the variadic type, the result format of Oracle is retained for both Oracle and Teradata.

+

ORA

+

TD

+

convert_string_digit_to_numeric

+

Specifies the type casting priority for binary BOOL operations on the CHAR type and INT type.

+
  • If this item is not specified, the type casting priority is the same as that of PG9.6.
  • After this item is configured, all binary BOOL operations of the CHAR type and INT type are forcibly converted to the NUMERIC type for computation.

    After this configuration item is set, the CHAR types that are affected include BPCHAR, VARCHAR, NVARCHAR2, and TEXT, and the INT types that are affected include INT1, INT2, INT4, and INT8.

    +
+
CAUTION:

This configuration item is valid only for binary BOOL operation, for example, INT2>TEXT and INT4=BPCHAR. Non-BOOL operation is not affected. This configuration item does not support conversion of UNKNOWN operations such as INT>'1.1'. After this configuration item is enabled, all BOOL operations of the CHAR and INT types are preferred to be converted to the NUMERIC type for computation, which affects the computation performance of the database. When the JOIN column is a combination of affected types, the execution plan is affected.

+
+

ORA

+

TD

+

MySQL

+

check_function_conflicts

+

Controls the check of the custom plpgsql/SQL function attributes.

+
  • If this parameter is not specified, the IMMUTABLE/STABLE/VOLATILE attributes of a custom function are not checked.
  • If this parameter is specified, the IMMUTABLE attribute of a custom function is checked. If the function contains a table or the STABLE/VOLATILE function, an error is reported during the function execution. In a custom function, a table or the STABLE/VOLATILE function conflicts with the IMMUTABLE attribute, thus function behaviors are not IMMUTABLE in this case.
+

For example, when this parameter is specified, an error is reported in the following scenarios:

+
CREATE OR replace FUNCTION sql_immutable (INTEGER)
+RETURNS INTEGER AS 'SELECT a+$1 from shipping_schema.t4 where a=1;'
+LANGUAGE SQL IMMUTABLE
+RETURNS NULL
+ON NULL INPUT;
+select sql_immutable(1);
+ERROR:  IMMUTABLE function cannot contain SQL statements with relation or Non-IMMUTABLE function.
+CONTEXT:  SQL function "sql_immutable" during startup
+referenced column: sql_immutable
+

ORA

+

TD

+

MySQL

+

varray_verification

+

Indicates whether to verify the array length and array type length. Compatible with GaussDB(DWS) versions earlier than 8.1.0.

+

If this parameter is specified, the array length and array type length are not verified.

+
Scenario 1
+CREATE OR REPLACE PROCEDURE varray_verification 
+AS 
+    TYPE org_varray_type IS varray(5) OF VARCHAR2(2); 
+    v_org_varray org_varray_type; 
+BEGIN 
+    v_org_varray(1) := '111'; --If the value exceeds the limit of VARCHAR2(2), the setting will be consistent with that in the historical version and no verification is performed after configuring this option.
+END; 
+/ 
+Scenario 2
+ CREATE OR REPLACE PROCEDURE varray_verification_i3_1 
+AS 
+    TYPE org_varray_type IS varray(2) OF NUMBER(2); 
+    v_org_varray org_varray_type; 
+BEGIN 
+    v_org_varray(3) := 1; --If the value exceeds the limit of varray(2) specified for array length, the setting will be consistent with that in the historical version and no verification is performed after configuring this option.
+END; 
+/ 
+

ORA

+

TD

+

strict_concat_functions

+

Indicates whether the textanycat() and anytextcat() functions are compatible with the return value if there are null parameters. This parameter and strict_text_concat_td are mutually exclusive.

+

In MySQL-compatible mode, this parameter has no impact.

+
  • If this configuration item is not specified, the returned values of the textanycat() and anytextcat() functions are the same as those in the Oracle database.
  • When this configuration item is specified, if there are null parameters in the textanycat() and anytextcat() functions, the returned value is also null. Different result formats in Oracle and Teradata are retained.
+

If this configuration item is not specified, the returned values of the textanycat() and anytextcat() functions are the same as those in the Oracle database.

+
SELECT textanycat('gauss', cast(NULL as BOOLEAN));
+ textanycat
+------------
+ gauss
+(1 row)
+
+SELECT 'gauss' || cast(NULL as BOOLEAN); -- In this case, the || operator is converted to the textanycat function.
+ ?column?
+----------
+ gauss
+(1 row)
+

When setting this configuration item, retain the results that are different from those in Oracle and Teradata:

+
SELECT textanycat('gauss', cast(NULL as BOOLEAN));
+ textanycat
+------------
+
+(1 row)
+
+SELECT 'gauss' || cast(NULL as BOOLEAN); -- In this case, the || operator is converted to the textanycat function.
+ ?column?
+----------
+
+(1 row)
+

ORA

+

TD

+

strict_text_concat_td

+

In Teradata compatible mode, whether the textcat(), textanycat() and anytextcat() functions are compatible with the return value if there are null parameters. This parameter and strict_concat_functions are mutually exclusive.

+
  • If this parameter is not specified, the return values of the textcat(), textanycat(), and anytextcat() functions in Teradata-compatible mode are the same as those in GaussDB(DWS).
  • When this parameter is specified, if the textcat(), textanycat(), and anytextcat() functions contain any null parameter values, the return value is null in the Teradata-compatible mode.
+

If this parameter is not specified, the returned values of the textcat(), textanycat(), and anytextcat() functions are the same as those in the GaussDB(DWS).

+
td_data_compatible_db=# SELECT textcat('abc', NULL);
+textcat
+---------
+abc
+(1 row)
+
td_data_compatible_db=# SELECT 'abc' || NULL; -- In this case, the operator || is converted to the textcat() function.
+?column?
+----------
+abc
+(1 row)
+

When this parameter is specified, NULL is returned if any of the textcat(), textanycat(), and anytextcat() functions returns a null value.

+
td_data_compatible_db=# SELECT textcat('abc', NULL);
+textcat
+---------
+
+(1 row)
+
td_data_compatible_db=# SELECT 'abc' || NULL;
+?column?
+----------
+
+(1 row)
+

TD

+

compat_display_ref_table

+

Sets the column display format in the view.

+
  • If this parameter is not specified, the prefix is used by default, in the tab.col format.
  • Specify this parameter to the same original definition. It is displayed only when the original definition contains a prefix.
+
SET behavior_compat_options='compat_display_ref_table';
+CREATE OR REPLACE VIEW viewtest2 AS SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a;
+SELECT pg_get_viewdef('viewtest2');
+pg_get_viewdef
+-----------------------------------------------------
+SELECT a.c1, c2, a.c3, 0 AS c4 FROM viewtest_tbl a;
+(1 row)
+

ORA

+

TD

+

para_support_set_func

+

Whether the input parameters of the COALESCE(), NVL(), GREATEST(), and LEAST() functions in a column-store table support multiple result set expressions.

+
  • If this item is not specified and the input parameter contains multiple result set expressions, an error is reported, indicating that the function is not supported.
+
1
+2
SELECT COALESCE(regexp_split_to_table(c3,'#'), regexp_split_to_table(c3,'#')) FROM regexp_ext2_tb1 ORDER BY 1 LIMIT 5;
+ERROR:  set-valued function called in context that cannot accept a set
+
+ +
+
  • When this configuration item is specified, the function input parameter can contain multiple result set expressions.
+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT COALESCE(regexp_split_to_table(c3,'#'), regexp_split_to_table(c3,'#')) FROM regexp_ext2_tb1 ORDER BY 1 LIMIT 5;
+ coalesce
+----------
+ a
+ a
+ a
+ a
+ a
+(5 rows)
+
+ +
+

ORA

+

TD

+

disable_select_truncate_parallel

+

Controls the DDL lock level such as TRUNCATE in a partitioned table.

+
  • If this item is specified, the concurrent execution of TRUNCATE and DML operations (such as SELECT) on different partitions is forbidden, and the fast query shipping (FQS) of the SELECT operation on the partitioned table is allowed. You can set this parameter in the OLTP database, where there are many simple queries on partitioned tables, and there is no requirement for concurrent TRUNCATE and DML operations on different partitions.
  • If this item is not specified, SELECT and TRUNCATE operations can be concurrently performed on different partitions in a partitioned table, and the FQS of the partitioned table is disabled to avoid possible inconsistency.
+

ORA

+

TD

+

MySQL

+

bpchar_text_without_rtrim

+

In Teradata-compatible mode, controls the space to be retained on the right during the character conversion from bpchar to text. If the actual length is less than the length specified by bpchar, spaces are added to the value to be compatible with the Teradata style of the bpchar character string.

+

Currently, ignoring spaces at the end of a string for comparison is not supported. If the concatenated string contains spaces at the end, the comparison is space-sensitive.

+

The following is an example:

+
td_compatibility_basic_db=# select length('a'::char(10)::text);
+length
+--------
+10
+(1 row)
+
+td_compatibility_basic_db=# select length('a'||'a'::char(10));
+length
+--------
+11
+(1 row)
+

TD

+

convert_empty_str_to_null_td

+

In Teradata-compatible mode, controls the to_date, to_timestamp, and to_number type conversion functions to return null when they encounter empty strings, and controls the format of the return value when the to_char function encounters an input parameter of the date type.

+

Example:

+

If this parameter is not specified:

+
td_compatibility_db=# select to_number('');
+ to_number 
+-----------
+         0
+(1 row)
+
+td_compatibility_db=# select to_date('');
+ERROR:  the format is not correct
+DETAIL:  invalid date length "0", must between 8 and 10.
+CONTEXT:  referenced column: to_date
+
+td_compatibility_db=# select to_timestamp('');
+      to_timestamp
+------------------------
+ 0001-01-01 00:00:00 BC
+(1 row)
+
+td_compatibility_db=# select to_char(date '2020-11-16');
+        to_char         
+------------------------
+ 2020-11-16 00:00:00+08
+(1 row)
+

If this parameter is specified, and parameters of to_number, to_date, and to_timestamp functions contain empty strings:

+
td_compatibility_db=# select to_number('');
+ to_number 
+-----------
+
+(1 row)
+
+td_compatibility_db=# select to_date('');
+ to_date 
+---------
+
+(1 row)
+
+td_compatibility_db=# select to_timestamp('');
+ to_timestamp
+--------------
+
+(1 row)
+
+td_compatibility_db=# select to_char(date '2020-11-16');
+  to_char   
+------------
+ 2020/11/16
+(1 row)
+

TD

+

disable_case_specific

+

Determines whether to ignore case sensitivity during character type match. This parameter is valid only in Teradata-compatible mode.

+
  • If this item is not specified, characters are case sensitive during character type match.
  • If this item is specified, characters are case insensitive during character type match.
+

After being specified, this item will affect five character types (CHAR, TEXT, BPCHAR, VARCHAR, and NVARCHAR), 12 operators (<, >, =, >=, <=, !=, <>, !=, like, not like, in, and not in), and expressions case when and decode.

+
CAUTION:

After this item is enabled, the UPPER function is added before the character type, which affects the estimation logic. Therefore, an enhanced estimation model is required. (Suggested settings: cost_param=16, cost_model_version = 1, join_num_distinct=-20, and qual_num_distinct=200)

+
+

TD

+

enable_interval_to_text

+

Controls the implicit conversion from the interval type to the text type.

+
  • When this option is enabled, the implicit conversion from the interval type to the text type is supported.
    SELECT TO_DATE('20200923', 'yyyymmdd') - TO_DATE('20200920', 'yyyymmdd') = '3'::text;
    +?column?
    +----------
    +f
    +(1 row)
    +
  • When this option is disabled, the implicit conversion from the interval type to the text type is not supported.
    SELECT TO_DATE('20200923', 'yyyymmdd') - TO_DATE('20200920', 'yyyymmdd') = '3'::text;
    +?column?
    +----------
    +t
    +(1 row)
    +
+

ORA

+

TD

+

MySQL

+

light_object_mtime

+

Specifies whether the mtime column in the pg_object system catalog records object operations.

+
  • If this parameter is configured, the GRANT, REVOKE, and TRUNCATE operations are not recorded by mtime, that is, the mtime column is not updated.
  • If this parameter is not configured (by default), the ALTER, COMMENT, GRANT, REVOKE, and TRUNCATE operations are recorded by mtime, that is, the mtime column is updated.
+

ORA

+

TD

+

MySQL

+
+
+
+

table_skewness_warning_threshold

Parameter description: Specifies the threshold for triggering a table skew alarm.

+

Type: SUSET

+

Value range: a floating point number ranging from 0 to 1

+

Default value: 1

+
+

table_skewness_warning_rows

Parameter description: Specifies the minimum number of rows for triggering a table skew alarm.

+

Type: SUSET

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 100000

+
+

max_cache_partition_num

Parameter description: Specifies the number of memory-saving partitions in column-store mode during redistribution after scale-out. If the number of partitions exceeds the upper limit, the earliest cached partition is directly written to the column-store file.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to 32767.

+
  • 0 indicates that the memory-saving mode is disabled in column storage.
  • Values from 1 to 32767 indicate the maximum number of partitions that can be cached in a partitioned table.
+

Default value: 0

+

This parameter is used for redistribution during scale-out. A proper value can reduce the memory consumption during redistribution of a partitioned column-store table. However, tables with unbalanced data distribution in some partitions may generate a large number of small CUs after the redistribution. If there are a large number of small CUs, execute the VACUUM FULL statement to merge them.

+
+
+

enable_prevent_job_task_startup

Parameter description: Specifies whether to prevent the thread startup of scheduled jobs. This is an internal parameter. You are not advised to change the value of this parameter.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on: Threads of scheduled jobs will not be started.
  • off: Threads of scheduled jobs will be started.
+

Default value: off

+

Set this parameter only on CNs.

+
+
+

auto_process_residualfile

Parameter description: Specifies whether to enable the residual file recording function.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the residual file recording function is enabled.
  • off indicates that the residual file recording function is disabled.
+

Default value: off

+
+

enable_view_update

Parameter description: Enables the view update function or not.

+

Type: POSTMASTER

+

Value range: Boolean

+
  • on indicates that the view update function is enabled.
  • off indicates that the view update function is disabled.
+

Default value: off

+
+

view_independent

Parameter description: Decouples views from tables, functions, and synonyms or not. After the base table is restored, automatic association and re-creation are supported.

+

Type: SIGHUP

+

Value range: Boolean

+
  • on indicates that the view decoupling function is enabled. Tables, functions, synonyms, and other views on which views depend can be deleted separately (except temporary tables and temporary views). Associated views are reserved but unavailable.
  • off indicates that the view decoupling function is disabled. Tables, functions, synonyms, and other views on which views depend cannot be deleted separately. You can only delete them in the cascade mode.
+

Default value: off

+
+

bulkload_report_threshold

Parameter description: Sets the threshold for reporting import and export statistics.

+

Type: SIGHUP

+

Value range: an integer ranging from 0 to INT_MAX

+

Default value: 50

+
+

assign_abort_xid

Parameter description: Determines the transaction to be aborted based on the specified XID in a query.

+

Type: USERSET

+

Value range: a character string with the specified XID

+

This parameter is used only for quick restoration if a user deletes data by mistake (DELETE operation). Do not use this parameter in other scenarios. Otherwise, visible transaction errors may occur.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0946.html b/docs/dws/dev/dws_04_0946.html new file mode 100644 index 00000000..bce4f38e --- /dev/null +++ b/docs/dws/dev/dws_04_0946.html @@ -0,0 +1,793 @@ + + +

Glossary

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Term

+

Description

+

A – E

+

ACID

+

Atomicity, Consistency, Isolation, and Durability (ACID). These are a set of properties of database transactions in a DBMS.

+

cluster ring

+

A cluster ring consists of several physical servers. The primary-standby-secondary relationships among its DNs do not involve external DNs. That is, none of the primary, standby, or secondary counterparts of DNs belonging to the ring are deployed in other rings. A ring is the smallest unit used for scaling.

+

Bgwriter

+

A background write thread created when the database starts. The thread pushes dirty pages in the database to a permanent device (such as a disk).

+

bit

+

The smallest unit of information handled by a computer. One bit is expressed as a 1 or a 0 in a binary numeral, or as a true or a false logical condition. A bit is physically represented by an element such as high or low voltage at one point in a circuit, or a small spot on a disk that is magnetized in one way or the other. A single bit conveys little information a human would consider meaningful. A group of eight bits, however, makes up a byte, which can be used to represent many types of information, such as a letter of the alphabet, a decimal digit, or other character.

+

Bloom filter

+

Bloom filter is a space-efficient binary vectorized data structure, conceived by Burton Howard Bloom in 1970, that is used to test whether an element is a member of a set. False positive matches are possible, but false negatives are not, in other words, a query returns either "possibly in set (possible error)" or "definitely not in set". In the cases, Bloom filter sacrificed the accuracy for time and space.

+

CCN

+

The Central Coordinator (CCN) is a node responsible for determining, queuing, and scheduling complex operations in each CN to enable the dynamic load management of GaussDB(DWS).

+

CIDR

+

Classless Inter-Domain Routing (CIDR). CIDR abandons the traditional class-based (class A: 8; class B: 16; and class C: 24) address allocation mode and allows the use of address prefixes of any length, effectively improving the utilization of address space. A CIDR address is in the format of IP address/Number of bits in a network ID. For example, in 192.168.23.35/21, 21 indicates that the first 21 bits are the network prefix and others are the host ID.

+

Cgroups

+

A control group (Cgroup), also called a priority group (PG) in GaussDB(DWS). The Cgroup is a kernel feature of SUSE Linux and Red Hat that can limit, account for, and isolate the resource usage of a collection of processes.

+

CLI

+

Command-line interface (CLI). Users use the CLI to interact with applications. Its input and output are based on texts. Commands are entered through keyboards or similar devices and are compiled and executed by applications. The results are displayed in text or graphic forms on the terminal interface.

+

CM

+

Cluster Manager (CM) manages and monitors the running status of functional units and physical resources in the distributed system, ensuring stable running of the entire system.

+

CMS

+

The Cluster Management Service (CMS) component manages the cluster status.

+

CN

+

The Coordinator (CN) stores database metadata, splits query tasks and supports their execution, and aggregates the query results returned from DNs.

+

CU

+

Compression Unit (CU) is the smallest storage unit in a column-storage table.

+

core file

+

A file that is created when memory overwriting, assertion failures, or access to invalid memory occurs in a process, causing it to fail. This file is then used for further analysis.

+

A core file contains a memory dump, in an all-binary and port-specific format. The name of a core file consists of the word "core" and the OS process ID.

+

The core file is available regardless of the type of platform.

+

core dump

+

When a program stops abnormally, the core dump, memory dump, or system dump records the state of the working memory of the program at that point in time. In practice, other key pieces of program state are usually dumped at the same time, including the processor registers, which may include the program counter and stack pointer, memory management information, and other processor and OS flags and information. A core dump is often used to assist diagnosis and computer program debugging.

+

DBA

+

A database administrator (DBA) instructs or executes database maintenance operations.

+

DBLINK

+

An object defining the path from one database to another. A remote database object can be queried with DBLINK.

+

DBMS

+

Database Management System (DBMS) is a piece of system management software that allows users to access information in a database. This is a collection of programs that allows you to access, manage, and query data in a database. A DBMS can be classified as memory DBMS or disk DBMS based on the location of the data.

+

DCL

+

Data control language (DCL)

+

DDL

+

Data definition language (DDL)

+

DML

+

Data manipulation language (DML)

+

DN

+

Datanode performs table data storage and query operations.

+

ETCD

+

The Editable Text Configuration Daemon (ETCD) is a distributed key-value storage system used for configuration sharing and service discovery (registration and search).

+

ETL

+

Extract-Transform-Load (ETL) refers to the process of data transmission from the source to the target database.

+

Extension Connector

+

Extension Connector is provided by GaussDB(DWS) to process data across clusters. It can send SQL statements to Spark, and can return execution results to your database.

+

Backup

+

A backup, or the process of backing up, refers to the copying and archiving of computer data in case of data loss.

+

backup and restoration

+

A collection of concepts, procedures, and strategies to protect data loss caused by invalid media or misoperations.

+

standby server

+

A node in the GaussDB(DWS) HA solution. It functions as a backup of the primary server. If the primary server is behaving abnormally, the standby server is promoted to primary, ensuring data service continuity.

+

crash

+

A crash (or system crash) is an event in which a computer or a program (such as a software application or an OS) ceases to function properly. Often the program will exit after encountering this type of error. Sometimes the offending program may appear to freeze or hang until a crash reporting service documents details of the crash. If the program is a critical part of the OS kernel, the entire computer may crash (possibly resulting in a fatal system error).

+

encoding

+

Encoding is representing data and information using code so that it can be processed and analyzed by a computer. Characters, digits, and other objects can be converted into digital code, or information and data can be converted into the required electrical pulse signals based on predefined rules.

+

encoding technology

+

A technology that presents data using a specific set of characters, which can be identified by computer hardware and software.

+

table

+

A set of columns and rows. Each column is referred to as a field. The value in each field represents a data type. For example, if a table contains people's names, cities, and states, it has three columns: Name, City, and State. In every row in the table, the Name column contains a name, the City column contains a city, and the State column contains a state.

+

tablespace

+

A tablespace is a logical storage structure that contains tables, indexes, large objects, and long data. A tablespace provides an abstract layer between physical data and logical data, and provides storage space for all database objects. When you create a table, you can specify which tablespace it belongs to.

+

concurrency control

+

A DBMS service that ensures data integrity when multiple transactions are concurrently executed in a multi-user environment. In a multi-threaded environment, GaussDB(DWS) concurrency control ensures that database operations are safe and all database transactions remain consistent at any given time.

+

query

+

Specifies requests sent to the database, such as updating, modifying, querying, or deleting information.

+

query operator

+

An iterator or a query tree node, which is a basic unit for the execution of a query. Execution of a query can be split into one or more query operators. Common query operators include scan, join, and aggregation.

+

query fragment

+

Each query task can be split into one or more query fragments. Each query fragment consists of one or more query operators and can independently run on a node. Query fragments exchange data through data flow operators.

+

durability

+

One of the ACID features of database transactions. Durability indicates that transactions that have been committed will permanently survive and not be rolled back.

+

stored procedure

+

A group of SQL statements compiled into a single execution plan and stored in a large database system. Users can specify a name and parameters (if any) for a stored procedure to execute the procedure.

+

OS

+

An operating system (OS) is loaded by a bootstrap program to a computer to manage other programs in the computer. applications on a computer or similar device.

+

secondary server

+

To ensure high cluster availability, the primary server synchronizes logs to the secondary server if data synchronization between the primary and standby servers fails. If the primary server suddenly breaks down, the standby server is promoted to primary and synchronizes logs from the secondary server for the duration of the breakdown.

+

BLOB

+

Binary large object (BLOB) is a collection of binary data stored in a database, such as videos, audio, and images.

+

dynamic load balancing

+

In GaussDB(DWS), dynamic load balancing automatically adjusts the number of concurrent jobs based on the usage of CPU, I/O, and memory to avoid service errors and to prevent the system from stop responding due to system overload.

+

segment

+

A segment in the database indicates a part containing one or more regions. Region is the smallest range of a database and consists of data blocks. One or more segments comprise a tablespace.

+

F – J

+

failover

+

Automatic switchover from a faulty node to its standby node. Reversely, automatic switchback from the standby node to the primary node is called failback.

+

FDW

+

A foreign data wrapper (FDW) is a SQL interface provided by Postgres. It is used to access big data objects stored in remote data so that DBAs can integrate data from unrelated data sources and store them in public schema in the database.

+

freeze

+

An operation automatically performed by the AutoVacuum Worker process when transaction IDs are exhausted. GaussDB(DWS) records transaction IDs in row headings. When a transaction reads a row, the transaction ID in the row heading and the actual transaction ID are compared to determine whether this row is explicit. Transaction IDs are integers containing no symbols. If exhausted, transaction IDs are re-calculated outside of the integer range, causing the explicit rows to become implicit. To prevent such a problem, the freeze operation marks a transaction ID as a special ID. Rows marked with these special transaction IDs are explicit to all transactions.

+

GDB

+

As a GNU debugger, GDB allows you to see what is going on 'inside' another program while it executes or what another program was doing the moment that it crashed. GDB can perform four main kinds of things (make PDK functions stronger) to help you catch bugs in the act:

+
  • Starts your program, specifying anything that might affect its behavior.
+
  • Stops a program in a specific condition.
+
  • Checks what happens when a program stops.
+
  • Changes things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
+

GDS

+

General Data Service (GDS). To import data to GaussDB(DWS), you need to deploy the tool on the server where the source data is stored so that DNs can use this tool to obtain data.

+

GIN index

+

Generalized inverted index (GIN) is used for handling cases where the items to be indexed are composite values, and the queries to be handled by the index need to search for element values that appear within the composite items.

+

GNU

+

The GNU Project was publicly announced on September 27, 1983 by Richard Stallman, aiming at building an OS composed wholly of free software. GNU is a recursive acronym for "GNU's Not Unix!". Stallman announced that GNU should be pronounced as Guh-NOO. Technically, GNU is similar to Unix in design, a widely used commercial OS. However, GNU is free software and contains no Unix code.

+

gsql

+

GaussDB(DWS) interaction terminal. It enables you to interactively type in queries, issue them to GaussDB(DWS), and view the query results. Queries can also be entered from files. gsql supports many meta commands and shell-like commands, allowing you to conveniently compile scripts and automate tasks.

+

GTM

+

Global Transaction Manager (GTM) manages the status of transactions.

+

GUC

+

Grand unified configuration (GUC) includes parameters for running databases, the values of which determine database system behavior.

+

HA

+

High availability (HA) is a solution in which two modules operate in primary/standby mode to achieve high availability. This solution helps to minimize the duration of service interruptions caused by routine maintenance (planned) or sudden system breakdowns (unplanned), improving the system and application usability.

+

HBA

+

Host-based authentication (HBA) allows hosts to authenticate on behalf of all or some of the system users. It can apply to all users on a system or a subset using the Match directive. This type of authentication can be useful for managing computing clusters and other fairly homogenous pools of machines. In all, three files on the server and one on the client must be modified to prepare for host-based authentication.

+

HDFS

+

Hadoop Distributed File System (HDFS) is a subproject of Apache Hadoop. HDFS is highly fault tolerant and is designed to run on low-end hardware. The HDFS provides high-throughput access to large data sets and is ideal for applications having large data sets.

+

server

+

A combination of hardware and software designed for providing clients with services. This word alone refers to the computer running the server OS, or the software or dedicated hardware providing services.

+

advanced package

+

Logical and functional stored procedures and functions provided by GaussDB(DWS).

+

isolation

+

One of the ACID features of database transactions. Isolation means that the operations inside a transaction and data used are isolated from other concurrent transactions. The concurrent transactions do not affect each other.

+

relational database

+

A database created using a relational model. It processes data using methods of set algebra.

+

archive thread

+

A thread started when the archive function is enabled on a database. The thread archives database logs to a specified path.

+

failover

+

The automatic substitution of a functionally equivalent system component for a failed one. The system component can be a processor, server, network, or database.

+

environment variable

+

An environment variable defines the part of the environment in which a process runs. For example, it can define the part of the environment as the main directory, command search path, terminal that is in use, or the current time zone.

+

checkpoint

+

A mechanism that stores data in the database memory to disks at a certain time. GaussDB(DWS) periodically stores the data of committed and uncommitted transactions to disks. The data and redo logs can be used for database restoration if a database restarts or breaks down.

+

encryption

+

A function hiding information content during data transmission to prevent the unauthorized use of the information.

+

node

+

Cluster nodes (or nodes) are physical and virtual severs that make up the GaussDB(DWS) cluster environment.

+

error correction

+

A technique that automatically detects and corrects errors in software and data streams to improve system stability and reliability.

+

process

+

An instance of a computer program that is being executed. A process may be made up of multiple threads of execution. Other processes cannot use a thread occupied by the process.

+

PITR

+

Point-In-Time Recovery (PITR) is a backup and restoration feature of GaussDB(DWS). Data can be restored to a specified point in time if backup data and WAL logs are normal.

+

record

+

In a relational database, a record corresponds to data in each row of a table.

+

cluster

+

A cluster is an independent system consisting of servers and other resources, ensuring high availability. In certain conditions, clusters can implement load balancing and concurrent processing of transactions.

+

K – O

+

LLVM

+

LLVM is short for Low Level Virtual Machine. Low Level Virtual Machine (LLVM) is a compiler framework written in C++ and is designed to optimize the compile-time, link-time, run-time, and idle-time of programs that are written in arbitrary programming languages. It is open to developers and compatible with existing scripts.

+

GaussDB(DWS) LLVM dynamic compilation can be used to generate customized machine code for each query to replace original common functions. Query performance is improved by reducing redundant judgment conditions and virtual function invocation, and by making local data more accurate during actual queries.

+

LVS

+

Linux Virtual Server (LVS), a virtual server cluster system, is used for balancing the load of a cluster.

+

MPP

+

Massive Parallel Processing (MPP) refers to cluster architecture that consists of multiple machines. The architecture is also called a cluster system.

+

MVCC

+

Multi-Version Concurrency Control (MVCC) is a protocol that allows a tuple to have multiple versions, on which different query operations can be performed. A basic advantage is that read and write operations do not conflict.

+

NameNode

+

The NameNode is the centerpiece of a Hadoop file system, managing the namespace of the file system and client access to files.

+

OLAP

+

Online analytical processing (OLAP) is the most important application in the database warehouse system. It is dedicated to complex analytical operations, helps decision makers and executives to make decisions, and rapidly and flexibly processes complex queries involving a great amount of data based on analysts' requirements. In addition, the OLAP provides decision makers with query results that are easy to understand, allowing them to learn the operating status of the enterprise. These decision makers can then produce informed and accurate solutions based on the query results.

+

OM

+

Operations Management (OM) provides management interfaces and tools for routine maintenance and configuration management of the cluster.

+

ORC

+

Optimized Row Columnar (ORC) is a widely used file format for structured data in a Hadoop system. It was introduced from the Hadoop HIVE project.

+

client

+

A computer or program that accesses or requests services from another computer or program.

+

free space management

+

A mechanism for managing free space in a table. This mechanism enables the database system to record free space in each table and establish an easy-to-search data structure, accelerating operations (such as INSERT) performed on the free space.

+

cross-cluster

+

In GaussDB(DWS), users can access data in other DBMS through foreign tables or using an Extension Connector. Such access is cross-cluster.

+

junk tuple

+

A tuple that is deleted using the DELETE and UPDATE statements. When deleting a tuple, GaussDB(DWS) only marks the tuples that are to be cleared. The Vacuum thread will then periodically clear these junk tuples.

+

column

+

An equivalent concept of "field". A database table consists of one or more columns. Together they describe all attributes of a record in the table.

+

logical node

+

Multiple logical nodes can be installed on the same node. A logical node is a database instance.

+

schema

+

Collection of database objects, including logical structures, such as tables, views, sequences, stored procedures, synonyms, indexes, clusters, and database links.

+

schema file

+

A SQL file that determines the database structure.

+

P – T

+

Page

+

Minimum memory unit for row storage in the GaussDB(DWS) relational object structure. The default size of a page is 8 KB.

+

PostgreSQL

+

An open-source DBMS developed by volunteers all over the world. PostgreSQL is not controlled by any companies or individuals. Its source code can be used for free.

+

Postgres-XC

+

Postgres-XC is an open source PostgreSQL cluster to provide write-scalable, synchronous, multi-master PostgreSQL cluster solution.

+

Postmaster

+

A thread started when the database service is started. It listens to connection requests from other nodes in the cluster or from clients.

+

After receiving and accepting a connection request from the standby server, the primary server creates a WAL Sender thread to interact with the standby server.

+

RHEL

+

Red Hat Enterprise Linux (RHEL)

+

redo log

+

A log that contains information required for performing an operation again in a database. If a database is faulty, redo logs can be used to restore the database to its original state.

+

SCTP

+

The Stream Control Transmission Protocol (SCTP) is a transport-layer protocol defined by Internet Engineering Task Force (IETF) in 2000. The protocol ensures the reliability of datagram transport based on unreliable service transmission protocols by transferring SCN narrowband signaling over IP network.

+

savepoint

+

A savepoint marks the end of a sub-transaction (also known as a nested transaction) in a relational DBMS. The process of a long transaction can be divided into several parts. After a part is successfully executed, a savepoint will be created. If later execution fails, the transaction will be rolled back to the savepoint instead of being totally rolled back. This is helpful for recovering database applications from complicated errors. If an error occurs in a multi-statement transaction, the application can possibly recover by rolling back to the save point without terminating the entire transaction.

+

session

+

A task created by a database for a connection when an application attempts to connect to the database. Sessions are managed by the session manager. They execute initial tasks to perform all user operations.

+

shared-nothing architecture

+

A distributed computing architecture, in which none of the nodes share CPUs or storage resources. This architecture has good scalability.

+

SLES

+

SUSE Linux Enterprise Server (SLES) is an enterprise Linux OS provided by SUSE.

+

SMP

+

Symmetric multiprocessing (SMP) lets multiple CPUs run on a computer and share the same memory and bus. To ensure an SMP system achieves high performance, an OS must support multi-tasking and multi-thread processing. In databases, SMP means to concurrently execute queries using the multi-thread technology, efficiently using all CPU resources and improving query performance.

+

SQL

+

Structure Query Language (SQL) is a standard database query language. It consists of DDL, DML, and DCL.

+

SSL

+

Secure Socket Layer (SSL) is a network security protocol introduced by Netscape. SSL is a security protocol based on the TCP and IP communications protocols and uses the public key technology. SSL supports a wide range of networks and provides three basic security services, all of which use the public key technology. SSL ensures the security of service communication through the network by establishing a secure connection between the client and server and then sending data through this connection.

+

convergence ratio

+

Downlink to uplink bandwidth ratio of a switch. A high convergence ratio indicates a highly converged traffic environment and severe packet loss.

+

TCP

+

Transmission Control Protocol (TCP) sends and receives data through the IP protocol. It splits data into packets for sending, and checks and reassembles received package to obtain original information. TCP is a connection-oriented, reliable protocol that ensures information correctness in transmission.

+

trace

+

A way of logging to record information about the way a program is executed. This information is typically used by programmers for debugging purposes. System administrators and technical support can diagnose common problems by using software monitoring tools and based on this information.

+

full backup

+

Backup of the entire database cluster.

+

full synchronization

+

A data synchronization mechanism specified in the GaussDB(DWS) HA solution. Used to synchronize all data from the primary server to a standby server.

+

Log File

+

A file to which a computer system writes a record of its activities.

+

transaction

+

A logical unit of work performed within a DBMS against a database. A transaction consists of a limited database operation sequence, and must have ACID features.

+

data

+

A representation of facts or directives for manual or automatic communication, explanation, or processing. Data includes constants, variables, arrays, and strings.

+

data redistribution

+

A process whereby a data table is redistributed among nodes after users change the data distribution mode.

+

data distribution

+

A mode in which table data is split and stored on each database instance in a distributed system. Table data can be distributed in hash, replication, or random mode. In hash mode, a hash value is calculated based on the value of a specified column in a tuple, and then the target storage location of the tuple is determined based on the mapping between nodes and hash values. In replication mode, tuples are replicated to all nodes. In random mode, data is randomly distributed to the nodes.

+

data partitioning

+

A division of a logical database or its constituent elements into multiple parts (partitions) whose data does not overlap based on specified ranges. Data is mapped to storage locations based on the value ranges of specific columns in a tuple.

+

Database Name

+

A collection of data that is stored together and can be accessed, managed, and updated. Data in a view in the database can be classified into the following types: numerals, full text, digits, and images.

+

DB instance

+

A database instance consists of a process in GaussDB(DWS) and files controlled by the process. GaussDB(DWS) installs multiple database instances on one physical node. GTM, CM, CN, and DN installed on cluster nodes are all database instances. A database instance is also called a logical node.

+

database HA

+

GaussDB(DWS) provides a highly reliable HA solution. Every logical node in GaussDB(DWS) is identified as a primary or standby node. Only one GaussDB(DWS) node is identified as primary at a time. When the HA system is deployed for the first time, the primary server synchronizes all data from each standby server (full synchronization). The HA system then synchronizes only data that is new or has been modified from each standby server (incremental synchronization). When the HA system is running, the primary server can receive data read and write operation requests and the standby servers only synchronize logs.

+

database file

+

A binary file that stores user data and the data inside the database system.

+

data flow operator

+

An operator that exchanges data among query fragments. By their input/output relationships, data flows can be categorized into Gather flows, Broadcast flows, and Redistribution flows. Gather combines multiple query fragments of data into one. Broadcast forwards the data of one query fragment to multiple query fragments. Redistribution reorganizes the data of multiple query fragments and then redistributes the reorganized data to multiple query fragments.

+

data dictionary

+

A reserved table within a database which is used to store information about the database itself. The information includes database design information, stored procedure information, user rights, user statistics, database process information, database increase statistics, and database performance statistics.

+

deadlock

+

Unresolved contention for the use of resources.

+

index

+

An ordered data structure in the database management system. An index accelerates querying and the updating of data in database tables.

+

statistics

+

Information that is automatically collected by databases, including table-level information (number of tuples and number of pages) and column-level information (column value range distribution histogram). Statistics in databases are used to estimate the cost of execution plans to find the plan with the lowest cost.

+

stop word

+

In computing, stop words are words which are filtered out before or after processing of natural language data (text), saving storage space and improving search efficiency.

+

U – Z

+

vacuum

+

A thread that is periodically started up by a database to clear junk tuples. Multiple Vacuum threads can be started concurrently by setting a parameter.

+

verbose

+

The VERBOSE option specifies the information to be displayed.

+

WAL

+

Write-ahead logging (WAL) is a standard method for logging a transaction. Corresponding logs must be written into a permanent device before a data file (carrier for a table and index) is modified.

+

WAL Receiver

+

A thread created by the standby server during database duplication. The thread is used to receive data and commands from the primary server and to tell the primary server that the data and commands have been acknowledged. Only one WAL receiver thread can run on one standby server.

+

WAL Sender

+

A thread created on the primary server when the primary server has received a connection request from a standby server during database replication. This thread is used to send data and commands to standby servers and to receive responses from the standby servers. Multiple WAL Sender threads may run on one primary server. Each WAL Sender thread corresponds to a connection request initiated by a standby server.

+

WAL Writer

+

A thread for writing redo logs that are created when a database is started. This thread is used to write logs in the memory to a permanent device, such as a disk.

+

WLM

+

The WorkLoad Manager (WLM) is a module for controlling and allocating system resources in GaussDB(DWS).

+

Xlog

+

A transaction log. A logical node can have only one Xlog file.

+

xDR

+

X detailed record. It refers to detailed records on the user and signaling plans and can be categorized into charging data records (CDRs), user flow data records (UFDRs), transaction detail records (TDRs), and data records (SDRs).

+

network backup

+

Network backup provides a comprehensive and flexible data protection solution to Microsoft Windows, UNIX, and Linux platforms. Network backup can back up, archive, and restore files, folders, directories, volumes, and partitions on a computer.

+

physical node

+

A physical machine or device.

+

system catalog

+

A table storing meta information about the database. The meta information includes user tables, indexes, columns, functions, and the data types in a database.

+

pushdown

+

GaussDB(DWS) is a distributed database, where CN can send a query plan to multiple DNs for parallel execution. This CN behavior is called pushdown. It achieves better query performance than extracting data to CN for query.

+

compression

+

Data compression, source coding, or bit-rate reduction involves encoding information that uses fewer bits than the original representation. Compression can be either lossy or lossless. Lossless compression reduces bits by identifying and eliminating statistical redundancy. No information is lost in lossless compression. Lossy compression reduces bits by identifying and removing unnecessary or unimportant information. The process of reducing the size of a data file is commonly referred as data compression, although its formal name is source coding (coding done at the source of the data, before it is stored or transmitted).

+

consistency

+

One of the ACID features of database transactions. Consistency is a database status. In such a status, data in the database must comply with integrity constraints.

+

metadata

+

Data that provides information about other data. Metadata describes the source, size, format, or other characteristics of data. In database columns, metadata explains the content of a data warehouse.

+

atomicity

+

One of the ACID features of database transactions. Atomicity means that a transaction is composed of an indivisible unit of work. All operations performed in a transaction must either be committed or uncommitted. If an error occurs during transaction execution, the transaction is rolled back to the state when it was not committed.

+

online scale-out

+

Online scale-out means that data can be saved to the database and query services are not interrupted during redistribution in GaussDB(DWS).

+

dirty page

+

A page that has been modified and is not written to a permanent device.

+

incremental backup

+

Incremental backup stores all files changed since the last valid backup.

+

incremental synchronization

+

A data synchronization mechanism in the GaussDB(DWS) HA solution. Only data modified since the last synchronization is synchronized to the standby server.

+

Host

+

A node that receives data read and write operations in the GaussDB(DWS) HA system and works with all standby servers. At any time, only one node in the HA system is identified as the primary server.

+

thesaurus

+

Standardized words or phrases that express document themes and are used for indexing and retrieval.

+

dump file

+

A specific type of the trace file. A dump is typically a one-time output of diagnostic data in response to an event, whereas a trace tends to be continuous output of diagnostic data.

+

resource pool

+

Resource pools used for allocating resources in GaussDB(DWS). By binding a user to a resource pool, you can limit the priority of the jobs executed by the user and resources available to the jobs.

+

tenant

+

A database service user who runs services using allocated computing (CPU, memory, and I/O) and storage resources. Service level agreements (SLAs) are met through resource management and isolation.

+

minimum restoration point

+

A method used by GaussDB(DWS) to ensure data consistency. During startup, GaussDB(DWS) checks consistency between the latest WAL logs and the minimum restoration point. If the record location of the minimum restoration point is greater than that of the latest WAL logs, the database fails to start.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0948.html b/docs/dws/dev/dws_04_0948.html new file mode 100644 index 00000000..7b55a092 --- /dev/null +++ b/docs/dws/dev/dws_04_0948.html @@ -0,0 +1,58 @@ + + +

GS_VIEW_DEPENDENCY_PATH

+

GS_VIEW_DEPENDENCY_PATH allows you to query the direct dependencies of all views visible to the current user. If the base table on which the view depends exists and the dependency between views at different levels is normal, you can use this view to query the dependency between views at different levels starting from the base table.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 GS_VIEW_DEPENDENCY_PATH columns

Column

+

Type

+

Description

+

objschema

+

name

+

View space name

+

objname

+

name

+

View name

+

refobjschema

+

name

+

Name of the space where the dependent object resides

+

refobjname

+

name

+

Name of a dependent object

+

path

+

text

+

Dependency path

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0949.html b/docs/dws/dev/dws_04_0949.html new file mode 100644 index 00000000..f3ee4adb --- /dev/null +++ b/docs/dws/dev/dws_04_0949.html @@ -0,0 +1,83 @@ + + +

Importing Data from One GaussDB(DWS) Cluster to Another

+

Function

You can create foreign tables to perform associated queries and import data between clusters.

+
+

Scenarios

  • Import data from one GaussDB(DWS) cluster to another.
  • Perform associated queries between clusters.
+
+

Precautions

  • The two clusters must be in the same region and AZ, and can communicate with each other through the VPC network.
  • The created foreign table must be of the same type and have the same columns as its corresponding remote table, which can only be a row-store, column-store, hash, or replication table.
  • If the associated table in another cluster is a replication table or has data skew, the query performance may be poor.
  • The status of the two clusters is Normal.
  • Do not modify, add, or delete the DDL of the source data table in the remote cluster. Otherwise, the query results may be inconsistent.
  • The two clusters can process SQL on other GaussDB databases based on a foreign table.
  • You are advised to configure LVS. If it is not configured, you are advised to use multiple CNs as the server addresses. Do not write the CN addresses of multiple clusters together.
  • Ensure that the two databases have the same encoding. Otherwise, an error may occur or the received data may be garbled characters.
  • If statistics have been collected on the remote table, run ANALYZE on the foreign table to obtain a better execution plan.
  • Only 8.0.0 and later versions are supported.
+
+

Procedure

  1. Create a server.

    CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS 
    +   (address '10.180.157.231:8000,10.180.157.130:8000' ,
    +  dbname 'gaussdb', 
    +  username 'xyz', 
    +  password 'xxxxxx'
    +);
    +
    • server_remote is the server name used for the foreign table.
    • address indicates the IP addresses and port numbers of CNs in the remote cluster. If LVS is configured, you are advised to enter only one LVS address. Otherwise, you are advised to set multiple CNs as server addresses.
    • dbname is the database name of the remote cluster.
    • username is the username used for connecting to the remote cluster. This user cannot be a system administrator.
    • password is the password used for logging in to the remote cluster.
    +
    +
    +

  2. Create a foreign table.

     CREATE FOREIGN TABLE region
    +(
    +    R_REGIONKEY INT4,
    +    R_NAME TEXT,
    +    R_COMMENT TEXT
    +)
    +SERVER
    +    server_remote
    +OPTIONS
    +(
    +    schema_name 'test',
    +    table_name 'region',
    +    encoding 'gbk'
    +);
    +
    • Foreign table columns cannot contain any constraints.
    • The column names types of the foreign table must be the same as those of its corresponding remote table.
    • schema_name specifies the schema of the foreign table corresponding to the remote cluster. If this parameter is not specified, the default schema is used.
    • table_name specifies the name of the foreign table corresponding to the remote cluster. If this parameter is not specified, the default foreign table name is used.
    • encoding specifies the encoding format of the remote cluster. If this parameter is not specified, the default encoding format is used.
    +
    +
    +

  3. View the foreign table.

    \d+ region
    +
    +                              Foreign table "public.region"
    +   Column    |  Type   | Modifiers | FDW Options | Storage  | Stats target | Description
    +-------------+---------+-----------+-------------+----------+--------------+-------------
    + r_regionkey | integer |           |             | plain    |              |
    + r_name      | text    |           |             | extended |              |
    + r_comment   | text    |           |             | extended |              |
    +Server: server_remote
    +FDW Options: (schema_name 'test', table_name 'region', encoding 'gbk')
    +FDW permition: read only
    +Has OIDs: no
    +Distribute By: ROUND ROBIN
    +Location Nodes: ALL DATANODES
    +

  4. Check the created server.

    \des+ server_remote
    +                                                                                                                               List of foreign servers
    +     Name      |  Owner  | Foreign-data wrapper | Access privileges | Type | Version |
    +                  FDW Options                                                                                    | Description
    +---------------+---------+----------------------+-------------------+------+---------+-----------------------------------------------------------------
    +-----------------------------------------------------------------------------------------------------------------+-------------
    + server_remote | dbadmin | gc_fdw               |                   |      |         | (address '10.180.157.231:8000,10.180.157.130:8000', dbname 'gaussdb'
    +, username 'xyz', password 'xxxxxx') |
    +(1 row)
    +

  5. Use the foreign table to import data or perform associated queries.

    • Import data.
       CREATE TABLE local_region
      +(
      +    R_REGIONKEY INT4,
      +    R_NAME TEXT,
      +    R_COMMENT TEXT
      +);
      +INSERT INTO local_region SELECT * FROM region;
      +
      • If a connection failure is reported, check the server information and ensure that the specified clusters are connected.
      • If an error is reported, indicating that the table does not exist, check whether the option information of the foreign table is correct.
      • If a column mismatch error is reported, check whether the column information of the foreign table is consistent with that of the corresponding table in the remote cluster.
      • If a version inconsistency error is reported, upgrade the cluster and try again.
      • If garbled characters are displayed, check the encoding format of the source data, re-create a foreign table, and specify the correct coding format.
      +
      +
      +
    • Perform an associated query.
      SELECT * FROM region, local_region WHERE local_region.R_NAME = region.R_NAME;
      +
      • A foreign table can be used as a local table to perform complex jobs.
      • If statistics have been collected on the remote cluster, run ANALYZE on the foreign table to obtain a better execution plan.
      • If there are fewer DNs in the local cluster than in the remote cluster, the local cluster needs to use SMP for better performance.
      +
      +
      +
    +

  6. Delete the foreign table.

    DROP FOREIGN TABLE region; 
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0970.html b/docs/dws/dev/dws_04_0970.html new file mode 100644 index 00000000..7f5e9f93 --- /dev/null +++ b/docs/dws/dev/dws_04_0970.html @@ -0,0 +1,67 @@ + + +

Common Performance Parameter Optimization Design

+

+

To improve the cluster performance, you can use multiple methods to optimize the database, including hardware configuration, software driver upgrade, and internal parameter adjustment of the database. This section describes some common parameters and recommended configurations.

+
  1. query_dop: user-defined query degree of parallelism (DOP)

    The SMP architecture uses abundant resources to obtain time. After the plan parallelism is executed, more resources are consumed, including the CPU, memory, I/O, and network bandwidth. As the DOP grows, the resource consumption increases.

    +
    • When resources become a bottleneck, the SMP cannot improve the performance and may even deteriorate the performance. In the case of a resource bottleneck, you are advised to disable the SMP.
    • If resources are sufficient, the higher the DOP, the more the performance is improved.
    +

    The SMP DOP can be configured at a session level and you are advised to enable the SMP before executing the query that meets the requirements. After the execution is complete, disable the SMP. Otherwise, SMP may affect services in peak hours.

    +

    The default value of query_dop is 1. You can set query_dop to 10 to enable the SMP in a session.

    +
  2. enable_dynamic_workload: dynamic load management

    Dynamic load management refers to the automatic queue control of complex queries based on user loads in a database. This fine-tunes system parameters without manual adjustment.

    +

    This parameter is enabled by default. Notes:

    +
    • A CN in the cluster is used as the Central Coordinator (CCN) for collecting and scheduling job execution. To query this CN, run gs_om -t status --detail. Its status will be displayed in Central Coordinator State. If there is no CCN, jobs will not be controlled by dynamic load management.
    • Simple query jobs (which are estimated to require less than 32 MB memory) and non-DML statements (statements other than INSERT, UPDATE, DELETE, and SELECT) have no adaptive load restrictions. Control the upper memory limits for them on a single CN using max_active_statements.
    • The default value of work_mem is 64 MB. In adaptive load scenarios, the value cannot be increased. If you increase it, memory cannot be controlled for certain statements, such as statements that have not been analyzed.
    • Reduce concurrency in the following scenarios, because high concurrency may lead to uncontrollable memory usage.
      • A single tuple occupies excessive memory, for example, a base table contains a column more than 1 MB wide.
      • A query is fully pushed down.
      • A statement occupies a large amount of memory on the CN, for example, a statement that cannot be pushed down or a cursor withholding statement.
      • An execution plan creates a hash table based on the hash join operator, and the table has many duplicate values and occupies a large amount of memory.
      • UDFs are used and occupy a large amount of memory.
      +
    +

    When configuring this parameter, you can set query_dop to 0 (adaptive). In this case, the system dynamically selects the optimal DOP between 1 and 8 for each query based on resource usage and plan characteristics. The enable_dynamic_workload parameter supports the dynamic memory allocation.

    +
  3. max_active_statements

    Specifies the maximum number of concurrent jobs. This parameter applies to all the jobs on one CN.

    +

    Set the value of this parameter based on system resources, such as CPU, I/O, and memory resources, to ensure that the system resources can be fully utilized and the system will not be crashed due to excessive concurrent jobs.

    +
    • If this parameter is set to -1 or 0, the number of global concurrent jobs is not limited.
    • In the point query scenario, you are advised to set this parameter to 100.
    • In an analytical query scenario, set this parameter to the number of CPU cores divided by the number of DNs. Generally, its value ranges from 5 to 8.
    +
  4. session_timeout

    By default, if a client is in idle state after connecting to a database, the client automatically disconnects from the database after the duration specified by the parameter.

    +

    You are advised to set this parameter to 0, indicating that the timeout setting is disabled to prevent disconnection due to timeout.

    +
  5. The five parameters that affect the database memory are as follows:
    max_process_memory, shared_buffers, cstore_buffers, work_mem, and maintenance_work_mem
    • max_process_memory

      max_process_memory is a logical memory management parameter. It is used to control the maximum available memory on a single CN or DN.

      +

      Formula: max_process_memory = Physical memory x 0.665/ (1 + Number of primary DNs)

      +
    • shared_buffers

      Specifies the size of the shared memory used by GaussDB(DWS). If the value of this parameter is increased, GaussDB(DWS) requires more System V shared memory than the default system setting.

      +

      You are advised to set shared_buffers to a value less than 40% of the memory. It is used to scan row-store tables. Formula: shared_buffers = (Memory of a single server/Number of DNs on a single server) x 0.4 x 0.25

      +
    +
    • cstore_buffers

      Specifies the size of the shared buffer used by column-store tables and column-store tables (ORC, Parquet, and CarbonData) of OBS and HDFS foreign tables.

      +

      For details about the calculation formula, see the formula in shared_buffers.

      +
    +
    • work_mem

      Specifies the size of the memory used by internal sequential operations and the Hash table before data is written into temporary disk files.

      +

      Sort operations are required for ORDER BY, DISTINCT, and merge joins. Hash tables are used in hash joins, hash-based aggregation, and hash-based processing of IN subqueries.

      +

      In a complex query, several sort or hash operations may run in parallel. Each operation will be allowed to use as much memory as this parameter specifies. If the memory is insufficient, data will be written into temporary files. In addition, several running sessions may be performing such operations concurrently. Therefore, the total memory used may be many times the value of work_mem.

      +

      The formulas are as follows:

      +

      For non-concurrent complex serial queries, each query requires five to ten associated operations. Configure work_mem using the following formula: work_mem = 50% of the memory/10.

      +

      For non-concurrent simple serial queries, each query requires two to five associated operations. Configure work_mem using the following formula: work_mem = 50% of the memory/5.

      +

      For concurrent queries, configure work_mem using the following formula: work_mem = work_mem for serial queries/Number of concurrent SQL statements.

      +
    • maintenance_work_mem

      maintenance_work_mem specifies the maximum size of memory used for maintenance operations, involving VACUUM, CREATE INDEX, and ALTER TABLE ADD FOREIGN KEY.

      +

      Setting suggestions:

      +

      If you set this parameter to a value greater than that of work_mem, database dump files can be cleaned up and restored more efficiently. In a database session, only one maintenance operation can be performed at a time. Maintenance is usually performed when there are not many sessions.

      +

      When the automatic cleanup process is running, up to autovacuum_max_workers times of the memory will be allocated. In this case, set maintenance_work_mem to a value greater than or equal to that of work_mem.

      +
    +
    +
  6. bulk_write_ring_size

    Specifies the size of a ring buffer used for parallel data import.

    +

    This parameter affects the database import performance. You are advised to increase the value of this parameter on DNs when a large amount of data is to be imported.

    +
  7. Two connection parameters:
    max_connections and max_prepared_transactions
    • max_connections

      Specifies the maximum number of concurrent connections to the database. This parameter affects the concurrent processing capability of the cluster.

      +

      Setting suggestions:

      +

      Retain the default value of this parameter on CNs. Set this parameter on DNs to a value calculated using this formula: Number of CNs x Value of this parameter on a CN.

      +

      If the value of this parameter is increased, GaussDB(DWS) may require more System V shared memory or semaphore, which may exceed the default maximum value of the OS. In this case, modify the value as needed.

      +
    +
    +
    • max_prepared_transactions

      Specifies the maximum number of transactions that can stay in the prepared state simultaneously. If the value of this parameter is increased, GaussDB(DWS) requires more System V shared memory than the default system setting.

      +
    +

    The value of max_connections is related to max_prepared_transactions. Before configuring max_connections, ensure that the value of max_prepared_transactions is greater than or equal to that of max_connections. In this way, each session has a prepared transaction in the waiting state.

    +
    +
  8. checkpoint_completion_target

    Specifies the target for which the checkpoint is completed.

    +

    Each checkpoint must be completed within 50% of the checkpoint interval.

    +

    The default value is 0.5. To improve the performance, you can change the value to 0.9.

    +
  9. data_replicate_buffer_size

    Specifies the memory used by queues when the sender sends data pages to the receiver. The value of this parameter affects the buffer size used for the replication from the primary server to the standby server.

    +

    The default value is 128 MB. If the server memory is 256 GB, you can increase the value to 512 MB.

    +
  10. wal_receiver_buffer_size

    Specifies the memory buffer size for the standby and secondary servers to store the received XLOG files.

    +

    The default value is 64 MB. If the server memory is 256 GB, you can increase the value to 128 MB.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0971.html b/docs/dws/dev/dws_04_0971.html new file mode 100644 index 00000000..76d2c5b3 --- /dev/null +++ b/docs/dws/dev/dws_04_0971.html @@ -0,0 +1,106 @@ + + +

PL/Java Usage

+
  • [Notice] Java UDFs can perform some Java logic calculation. Do not encapsulate services in Java UDFs.
  • [Notice] Do not connect to a database in any way (for example, by using JDBC) in Java functions.
  • [Notice] Only the data types listed in the following table can be used. User-defined types and complex data types (Java Array and derived classes) are not supported.
  • [Notice] User-defined aggregation functions (UDAFs) and user-defined table-generating functions (UDTFs) are not supported.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 PL/Java mapping for default data types

GaussDB(DWS)

+

Java

+

BOOLEAN

+

boolean

+

"char"

+

byte

+

bytea

+

byte[]

+

SMALLINT

+

short

+

INTEGER

+

int

+

BIGINT

+

long

+

FLOAT4

+

float

+

FLOAT8

+

double

+

CHAR

+

java.lang.String

+

VARCHAR

+

java.lang.String

+

TEXT

+

java.lang.String

+

name

+

java.lang.String

+

DATE

+

java.sql.Timestamp

+

TIME

+

java.sql.Time (stored value treated as local time)

+

TIMETZ

+

java.sql.Time

+

TIMESTAMP

+

java.sql.Timestamp

+

TIMESTAMPTZ

+

java.sql.Timestamp

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0972.html b/docs/dws/dev/dws_04_0972.html new file mode 100644 index 00000000..6fa1bc22 --- /dev/null +++ b/docs/dws/dev/dws_04_0972.html @@ -0,0 +1,33 @@ + + +

PL/pgSQL Usage

+

General Principles

  1. Development shall strictly comply with design documents.
  2. Program modules shall be highly cohesive and loosely coupled.
  3. Proper, comprehensive troubleshooting measures shall be developed.
  4. Code shall be reasonable and clear.
  5. Program names shall comply with a unified naming rule.
  6. Fully consider the program efficiency, including the program execution efficiency and database query and storage efficiency. Use efficient and effective processing methods.
  7. Program comments shall be detailed, correct, and standard.
  8. The commit or rollback operation shall be performed at the end of a stored procedure, unless otherwise required by applications.
  9. Programs shall support 24/7 processing. In the case of an interruption, the applications shall provide secure, easy-to-use resuming features.
  10. Application output shall be standard and simple. The output shall show the progress, error description, and execution results for application maintenance personnel, and provide clear and intuitive reports and documents for business personnel.
+
+

Programming Principles

  1. Use bound variables in SQL statements in the PL/pgSQL.
  2. RETURNING is recommended for SQL statements in PL/pgSQL.
  3. Principles for using stored procedures:
    1. Do not use more than 50 output parameters of the Varchar or Varchar2 type in a stored procedure.
    2. Do not use the LONG type for input or output parameters.
    3. Use the CLOB type for output strings that exceed 10 MB.
    +
  4. Variable declaration principles:
    1. Use %TYPE to declare a variable that has the same meaning as that of a column or variable in an application table.
    2. Use %ROWTYPE to declare a record that has the same meaning as that of a row in an application table.
    3. Each line of a variable declaration shall contain only one statement.
    4. Do not declare variables of the LONG type.
    +
  5. Principles for using cursors:
    1. Explicit cursors shall be closed after being used.
    2. A cursor variable shall be closed after being used. If the cursor variable needs to transfer data to an invoked application, the cursor shall be closed in the application. If the cursor variable is used only in a stored procedure, the cursor shall be closed explicitly.
    3. Before using DBMS_SQL.CLOSE_CURSOR to close a cursor, use DBMS_SQL.IS_OPEN to check whether the cursor is open.
    +
  6. Principles for collections:
    1. You are advised to use the FOR ALL statement instead of the FOR loop statement to reference elements in a collection.
    +
  7. Principles for using dynamic statements:
    1. Dynamic SQL shall not be used in the transaction programs of online systems.
    2. Dynamic SQL statements can be used to implement DDL statements and system control commands in PL/pgSQL.
    3. Variable binding is recommended.
    +
  8. Principles for assembling SQL statements:
    1. You are advised to use bound variables to assemble SQL statements.
    2. If the conditions for assembling SQL statements contain external input sources, the characters in the input conditions shall be checked to prevent attacks.
    3. In a PL/pgSQL script, the length of a single line of code cannot exceed 2499 characters.
    +
  9. Principles for using triggers:
    1. Triggers can be used to implement availability design in scenarios where differential data logs are irrelevant to service processing.
    2. Do not use triggers to implement service processing functions.
    +
+
+

Exception Handling Principles

Any error that occurs in a PL/pgSQL function aborts the execution of the function and related transactions. You can use a BEGIN block with an EXCEPTION clause to catch and fix errors.

+
  1. In a PL/pgSQL block, if an SQL statement cannot return a definite result, you are advised to handle exceptions (if any) in EXCEPTION. Otherwise, unhandled errors may be transferred to the external block and cause program logic errors.
  2. You can directly use the exceptions that have been defined in the system. DWS does not support custom exceptions.
  3. A block containing an EXCEPTION clause is more expensive to enter and exit than a block without one. Therefore, do not use EXCEPTION without need.
+
+

Writing Standard

  1. Variable naming rules:
    1. The input parameter format of a procedure or function is IN_Parameter_name. The parameter name shall be in uppercase.
    2. The output parameter format of a procedure or function is OUT_Parameter_name. The parameter name shall be in uppercase.
    3. The input and output parameter format of a procedure or function is IO_Parameter_name. The parameter name shall be in uppercase.
    4. Variables used in procedures and functions shall be composed of v_Variable_name. The variable name shall be in lower case.
    5. In query concatenation, the concatenation variable name of the WHERE statement shall be v_where, and the concatenation variable name of the SELECT statement shall be v_select.
    6. The record type (TYPE) name shall consist of T and a variable name. The name shall be in uppercase.
    7. A cursor name shall consist of CUR and a variable name. The name shall be in uppercase.
    8. The name of a reference cursor (REF CURSOR) shall consist of REF and a variable name. The name shall be in uppercase.
    +
  2. Rules for defining variable types:
    1. Use %TYPE to declare the type of a variable that has the same meaning as that of a column in an application table.
    2. Use %ROWTYPE to declare the type of a record that has the same meaning as that of a row in an application table.
    +
  3. Rules for writing comments:
    1. Comments shall be meaningful and shall not just repeat the code content.
    2. Comments shall be concise and easy to understand.
    3. Comments shall be provided at the beginning of each stored procedure or function. The comments shall contain a brief function description, author, compilation date, program version number, and program change history. The format of the comments at the beginning of stored procedures shall be the same.
    4. Comments shall be provided next to the input and output parameters to describe the meaning of variables.
    5. Comments shall be provided at the beginning of each block or large branch to briefly describe the function of the block. If an algorithm is used, comments shall be provided to describe the purpose and result of the algorithm.
    +
  4. Variable declaration format:

    Each line shall contain only one statement. To assign initial values, write them in the same line.

    +
  5. Letter case:

    Use uppercase letters except for variable names.

    +
  6. Indentation:

    In the statements used for creating a stored procedure, the keywords CREATE, AS/IS, BEGIN, and END at the same level shall have the same indent.

    +
  7. Statement rules:
    1. For statements that define variables, Each line shall contain only one statement.
    2. The keywords IF, ELSE IF, ELSE, and END at the same level shall have the same indent.
    3. The keywords CASE and END shall have the same indent. The keywords WHEN and ELSE shall be indented.
    4. The keywords LOOP and END LOOP at the same level shall have the same indent. Nested statements or statements at lower levels shall have more indent.
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0985.html b/docs/dws/dev/dws_04_0985.html new file mode 100644 index 00000000..fde9e476 --- /dev/null +++ b/docs/dws/dev/dws_04_0985.html @@ -0,0 +1,26 @@ + + +

Data Migration

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0986.html b/docs/dws/dev/dws_04_0986.html new file mode 100644 index 00000000..ab7d8e1b --- /dev/null +++ b/docs/dws/dev/dws_04_0986.html @@ -0,0 +1,21 @@ + + + +

Full Database Migration

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0987.html b/docs/dws/dev/dws_04_0987.html new file mode 100644 index 00000000..7549d644 --- /dev/null +++ b/docs/dws/dev/dws_04_0987.html @@ -0,0 +1,18 @@ + + +

Metadata Migration

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0988.html b/docs/dws/dev/dws_04_0988.html new file mode 100644 index 00000000..14db9ab5 --- /dev/null +++ b/docs/dws/dev/dws_04_0988.html @@ -0,0 +1,18 @@ + + +

Other Operations

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0994.html b/docs/dws/dev/dws_04_0994.html new file mode 100644 index 00000000..4336e87c --- /dev/null +++ b/docs/dws/dev/dws_04_0994.html @@ -0,0 +1,23 @@ + + + +

Sensitive Data Management

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_04_0995.html b/docs/dws/dev/dws_04_0995.html new file mode 100644 index 00000000..d8d4cb3a --- /dev/null +++ b/docs/dws/dev/dws_04_0995.html @@ -0,0 +1,100 @@ + + +

Using Functions for Encryption and Decryption

+

GaussDB(DWS) supports encryption and decryption of strings using the following functions:

+
  • gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod)

    Description: Encrypts an encryptstr string using the keystr key based on the encryption algorithm specified by cryptotype and cryptomode and the HMAC algorithm specified by hashmethod, and returns the encrypted string. cryptotype can be aes128, aes192, aes256, or sm4. cryptomode is cbc. hashmethod can be sha256, sha384, sha512, or sm3. Currently, the following types of data can be encrypted: numerals supported in the database; character type; RAW in binary type; and DATE, TIMESTAMP, and SMALLDATETIME in date/time type. The keystr length is related to the encryption algorithm and contains 1 to KeyLen bytes. If cryptotype is aes128 or sm4, KeyLen is 16; if cryptotype is aes192, KeyLen is 24; if cryptotype is aes256, KeyLen is 32.

    +

    Return type: text

    +

    Length of the return value: at least 4 x [(maclen + 56)/3] bytes and no more than 4 x [(Len + maclen + 56)/3] bytes, where Len indicates the string length (in bytes) before the encryption and maclen indicates the length of the HMAC value. If hashmethod is sha256 or sm3, maclen is 32; if hashmethod is sha384, maclen is 48; if hashmethod is sha512, maclen is 64. That is, if hashmethod is sha256 or sm3, the returned string contains 120 to 4 x [(Len + 88)/3] bytes; if hashmethod is sha384, the returned string contains 140 to 4 x [(Len + 104)/3] bytes; if hashmethod is sha512, the returned string contains 160 to 4 x [(Len + 120)/3] bytes.

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_encrypt('GaussDB(DWS)', '1234', 'aes128', 'cbc',  'sha256');
    +                                                        gs_encrypt                                                        
    +--------------------------------------------------------------------------------------------------------------------------
    + AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA==
    +(1 row)
    +
    + +
    +
    • This function is supported by version 8.1.1 or later clusters.
    • A decryption password is required during the execution of this function. For security purposes, the gsql tool does not record this function in the execution history. That is, the execution history of this function cannot be found in gsql by paging up and down.
    • Do not use the ge_encrypt and gs_encrypt_aes128 functions for the same data table.
    +
    +
  • gs_decrypt(decryptstr, keystr, cryptotype, cryptomode, hashmethod)

    Description: Decrypts a decryptstr string using the keystr key based on the encryption algorithm specified by cryptotype and cryptomode and the HMAC algorithm specified by hashmethod, and returns the decrypted string. The keystr used for decryption must be consistent with that used for encryption. keystr cannot be empty.

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_decrypt('AAAAAAAAAACcFjDcCSbop7D87sOa2nxTFrkE9RJQGK34ypgrOPsFJIqggI8tl+eMDcQYT3po98wPCC7VBfhv7mdBy7IVnzdrp0rdMrD6/zTl8w0v9/s2OA==', '1234', 'aes128', 'cbc', 'sha256');
    +  gs_decrypt  
    +--------------
    + GaussDB(DWS)
    +(1 row)
    +
    + +
    +
    • This function is supported by version 8.1.1 or later clusters.
    • A decryption password is required during the execution of this function. For security purposes, the gsql tool does not record this function in the execution history. That is, the execution history of this function cannot be found in gsql by paging up and down.
    • This function works with the gs_encrypt function, and the two functions must use the same encryption algorithm and HMAC algorithm.
    +
    +
  • gs_encrypt_aes128(encryptstr,keystr)

    Description: Encrypts encryptstr strings using keystr as the key and returns encrypted strings. The length of keystr ranges from 1 to 16 bytes. Currently, the following types of data can be encrypted: numerals supported in the database; character type; RAW in binary type; and DATE, TIMESTAMP, and SMALLDATETIME in date/time type.

    +

    Return type: text

    +

    Length of the return value: At least 92 bytes and no more than (4*[Len/3]+68) bytes, where Len indicates the length of the data before encryption (unit: byte).

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT gs_encrypt_aes128('MPPDB','1234');
    +
    +                               gs_encrypt_aes128
    +-------------------------------------------------------------------------------------
    +gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=
    +(1 row)
    +
    + +
    +
    • A decryption password is required during the execution of this function. For security purposes, the gsql tool does not record this function in the execution history. That is, the execution history of this function cannot be found in gsql by paging up and down.
    • Do not use the ge_encrypt and gs_encrypt_aes128 functions for the same data table.
    +
    +
  • gs_decrypt_aes128(decryptstr,keystr)

    Description: Decrypts a decryptstr string using the keystr key and returns the decrypted string. The keystr used for decryption must be consistent with that used for encryption. keystr cannot be empty.

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_decrypt_aes128('gwditQLQG8NhFw4OuoKhhQJoXojhFlYkjeG0aYdSCtLCnIUgkNwvYI04KbuhmcGZp8jWizBdR1vU9CspjuzI0lbz12A=','1234');
    + gs_decrypt_aes128 
    +-------------------
    + MPPDB
    +(1 row)
    +
    + +
    +
    • A decryption password is required during the execution of this function. For security purposes, the gsql tool does not record this function in the execution history. That is, the execution history of this function cannot be found in gsql by paging up and down.
    • This function works with the gs_encrypt_aes128 function.
    +
    +
  • gs_hash(hashstr, hashmethod)

    Description: Obtains the digest string of a hashstr string based on the algorithm specified by hashmethod. hashmethod can be sha256, sha384, sha512, or sm3. This function is supported by version 8.1.1 or later clusters.

    +

    Return type: text

    +

    Length of the return value: 64 bytes if hashmethod is sha256 or sm3; 96 bytes if hashmethod is sha384; 128 bytes if hashmethod is sha512

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_hash('GaussDB(DWS)', 'sha256');
    +                                             gs_hash                                              
    +--------------------------------------------------------------------------------------------------
    + e59069daa6541ae20af7c747662702c731b26b8abd7a788f4d15611aa0db608efdbb5587ba90789a983f85dd51766609
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_0998.html b/docs/dws/dev/dws_04_0998.html new file mode 100644 index 00000000..6d0bab4d --- /dev/null +++ b/docs/dws/dev/dws_04_0998.html @@ -0,0 +1,65 @@ + + +

MPP_TABLES

+

MPP_TABLES displays information about tables in PGXC_CLASS.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 MPP_TABLES columns

Name

+

Type

+

Description

+

schemaname

+

name

+

Name of the schema that contains the table

+

tablename

+

name

+

Name of a table

+

tableowner

+

name

+

Owner of the table

+

tablespace

+

name

+

Tablespace where the table is located.

+

pgroup

+

name

+

Name of a node cluster.

+

nodeoids

+

oidvector_extend

+

List of distributed table node OIDs

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_04_1000.html b/docs/dws/dev/dws_04_1000.html new file mode 100644 index 00000000..fd49ac2f --- /dev/null +++ b/docs/dws/dev/dws_04_1000.html @@ -0,0 +1,43 @@ + + + +

Developer Guide

+ +

+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_2000.html b/docs/dws/dev/dws_04_2000.html new file mode 100644 index 00000000..bd4f2be1 --- /dev/null +++ b/docs/dws/dev/dws_04_2000.html @@ -0,0 +1,47 @@ + + + +

SQL Syntax Reference

+ +

+
+ +
+ +
+ diff --git a/docs/dws/dev/dws_04_3333.html b/docs/dws/dev/dws_04_3333.html new file mode 100644 index 00000000..1f778f43 --- /dev/null +++ b/docs/dws/dev/dws_04_3333.html @@ -0,0 +1,27 @@ + + +

Change History

+
+
+ + + + + + + +

Released On

+

Description

+

2022-11-17

+

This issue is the first official release, adapts to DWS 8.1.1.202.

+

Feature Changes:

+

GUC Parameters:Added the GUC parameter included enable_light_colupdate,bi_page_reuse_factor,expand_hashtable_ratio,query_dop_ratio,enable_row_fast_numeric,enable_view_update,enable_grant_option).

+

Functions and Operators:Added the function included pgxc_wlm_get_schema_space(cstring),pgxc_wlm_analyze_schema_space(cstring),median(expression),gs_password_expiration,pgxc_get_lock_conflicts(),percentile_disc(const) within group(order by expression),percentile_cont(const) within group(order by expression).

+

System Views:Added system views included PGXC_TOTAL_SCHEMA_INFO,PGXC_TOTAL_SCHEMA_INFO_ANALYZE,GS_WLM_SQL_ALLOW,PGXC_BULKLOAD_PROGRESS,PGXC_BULKLOAD_STATISTICS,PG_BULKLOAD_STATISTICS.

+

Keyword:Added keywords included EXPIRATION,IFNULL and TIMESTAMPDIFF.

+

CREATE REDACTION POLICY:Added Custom data redaction.

+

Syntax Compatibility Differences Among Oracle, Teradata, and MySQL:Added MySQL Syntax Compatibility Differences .

+
+
+
+ diff --git a/docs/dws/dev/dws_06_0001.html b/docs/dws/dev/dws_06_0001.html new file mode 100644 index 00000000..91ff157b --- /dev/null +++ b/docs/dws/dev/dws_06_0001.html @@ -0,0 +1,20 @@ + + +

GaussDB(DWS) SQL

+

What Is SQL?

SQL is a standard computer language used to control the access to databases and manage data in databases.

+

SQL provides different statements to enable you to:

+
  • Query data.
  • Insert, update, and delete rows.
  • Create, replace, modify, and delete objects.
  • Control the access to a database and its objects.
  • Maintain the consistency and integrity of a database.
+

SQL consists of commands and functions that are used to manage databases and database objects. SQL can also forcibly implement the rules for data types, expressions, and texts. Therefore, section "SQL Reference" describes data types, expressions, functions, and operators in addition to SQL syntax.

+
+

Development of SQL Standards

Released SQL standards are as follows:

+
  • 1986: ANSI X3.135-1986, ISO/IEC 9075:1986, SQL-86
  • 1989: ANSI X3.135-1989, ISO/IEC 9075:1989, SQL-89
  • 1992: ANSI X3.135-1992, ISO/IEC 9075:1992, SQL-92 (SQL2)
  • 1999: ISO/IEC 9075:1999, SQL:1999 (SQL3)
  • 2003: ISO/IEC 9075:2003, SQL:2003 (SQL4)
  • 2011: ISO/IEC 9075:200N, SQL:2011 (SQL5)
+
+

Supported SQL Standards

GaussDB(DWS) is compatible with Postgres-XC features and supports the major features of SQL2, SQL3, and SQL4 by default.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0002.html b/docs/dws/dev/dws_06_0002.html new file mode 100644 index 00000000..0b810d97 --- /dev/null +++ b/docs/dws/dev/dws_06_0002.html @@ -0,0 +1,22 @@ + + +

Differences Between GaussDB(DWS) and PostgreSQL

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0003.html b/docs/dws/dev/dws_06_0003.html new file mode 100644 index 00000000..6ec3e451 --- /dev/null +++ b/docs/dws/dev/dws_06_0003.html @@ -0,0 +1,17 @@ + + +

GaussDB(DWS) gsql, PostgreSQL psql, and libpq

+

GaussDB(DWS) gsql and PostgreSQL psql

GaussDB(DWS) gsql differs from PostgreSQL psql in that the former has made the following changes to enhance security:

+
  • User passwords cannot be set by running the \password meta-command.
  • The \i+, \ir+, and \include_relative+ meta-commands and the input and output parameter -k are added to encrypt imported and exported files.
  • Historical command lines cannot be printed to files using the \s meta-command.
  • SQL statements related to sensitive operations, such as those containing passwords, are not recorded. Users cannot see such records when they turn pages or press up or down arrow keys to view the SQL history.
  • After a connection is set up, a message is displayed to inform users of password expiration and to show version information.
+

gsql provides the following additional functions based on psql:

+
  • The output format parameter -r is added to allow you to adjust the focus by pressing the Tab key or arrow keys when entering commands.
  • The \parallel meta-command is added to improve execution performance.
  • The \set RETRY meta-command is added to support retry upon statement errors.
  • Slashes (/) are used as the default terminator at the end of PL/SQL statements CREATE OR REPLACE FUNCTION/PROCEDURE.
+
+

libpq

During the development of certain GaussDB(DWS) functions such as the gsql client connection tool, PostgreSQL libpq is greatly modified. However, the libpq interface is not verified in application development. You are not advised to use this set of APIs for application development, because underlying risks probably exist. You can use the ODBC or JDBC APIs instead.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0004.html b/docs/dws/dev/dws_06_0004.html new file mode 100644 index 00000000..675a9893 --- /dev/null +++ b/docs/dws/dev/dws_06_0004.html @@ -0,0 +1,13 @@ + + +

Data Type Differences

+

For details about supported data types by GaussDB(DWS), see Data Types.

+

The following PostgreSQL data type is not supported:

+
  • Lines, a geometric type
  • pg_node_tree
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0005.html b/docs/dws/dev/dws_06_0005.html new file mode 100644 index 00000000..28c0978d --- /dev/null +++ b/docs/dws/dev/dws_06_0005.html @@ -0,0 +1,15 @@ + + +

Function Differences

+

For details about the functions supported by GaussDB(DWS), see Functions and Operators.

+

The following PostgreSQL functions are not supported:

+
  • Enum support functions
  • Access privilege inquiry functions
    • has_sequence_privilege(user, sequence, privilege)
    • has_sequence_privilege(sequence, privilege)
    +
  • System catalog information functions
    • pg_get_triggerdef(trigger_oid)
    • pg_get_triggerdef(trigger_oid, pretty_bool)
    +
  • Line functions
  • pg_node_tree
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0006.html b/docs/dws/dev/dws_06_0006.html new file mode 100644 index 00000000..c333675a --- /dev/null +++ b/docs/dws/dev/dws_06_0006.html @@ -0,0 +1,14 @@ + + +

PostgreSQL Features Unsupported by GaussDB(DWS)

+
  • Table inheritance
  • Table creation features:
    • Use REFERENCES reftable [ (refcolumn) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] to create a foreign key constraint for a table.
    • Use EXCLUDE [ USING index_method ] ( exclude_element WITH operator [, ... ] ) to create exclusion constraints for a table.
    +
  • Define or change the security tag of an object.
  • User-defined C functions
  • Create, modify, and delete operators.
  • Create, modify, and delete operator classes.
  • Create, modify, and delete operator families.
  • Create, modify, and delete text search parsers.
  • Create, modify, and delete text search templates.
  • Create, modify, and delete collations.
  • Create and delete rules.
  • Register, modify, and delete languages.
  • Create, modify, and delete domains.
  • Define, modify, and delete the conversion of character set encoding.
  • Define and delete casts.
  • Define, modify, and delete user mapping.
  • Generate a notification.
  • Listen to a notification.
  • Stop listening to a notification.
  • Load or reload a shared library file.
  • Release the session resources of a database.
  • Move a cursor backward.
+
The following features are disabled in GaussDB(DWS) for separation of rights:
  • TO PUBLIC of GRANT
  • COPY FROM FILE and COPY TO FILE of COPY
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0007.html b/docs/dws/dev/dws_06_0007.html new file mode 100644 index 00000000..51122ac0 --- /dev/null +++ b/docs/dws/dev/dws_06_0007.html @@ -0,0 +1,6505 @@ + + +

Keyword

+

The SQL contains reserved and non-reserved words. Standards require that reserved keywords not be used as other identifiers. Non-reserved keywords have special meanings only in a specific environment and can be used as identifiers in other environments.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 SQL keywords

Keyword

+

GaussDB(DWS)

+

SQL:1999

+

SQL-92

+

ABORT

+

Non-reserved

+

-

+

-

+

ABS

+

-

+

Non-reserved

+

-

+

ABSOLUTE

+

Non-reserved

+

Reserved

+

Reserved

+

ACCESS

+

Non-reserved

+

-

+

-

+

ACCOUNT

+

Non-reserved

+

-

+

-

+

ACTION

+

Non-reserved

+

Reserved

+

Reserved

+

ADA

+

-

+

Non-reserved

+

Non-reserved

+

ADD

+

Non-reserved

+

Reserved

+

Reserved

+

ADMIN

+

Non-reserved

+

Reserved

+

-

+

AFTER

+

Non-reserved

+

Reserved

+

-

+

AGGREGATE

+

Non-reserved

+

Reserved

+

-

+

ALIAS

+

-

+

Reserved

+

-

+

ALL

+

Reserved

+

Reserved

+

Reserved

+

ALLOCATE

+

-

+

Reserved

+

Reserved

+

ALSO

+

Non-reserved

+

-

+

-

+

ALTER

+

Non-reserved

+

Reserved

+

Reserved

+

ALWAYS

+

Non-reserved

+

-

+

-

+

ANALYSE

+

Reserved

+

-

+

-

+

ANALYZE

+

Reserved

+

-

+

-

+

AND

+

Reserved

+

Reserved

+

Reserved

+

ANY

+

Reserved

+

Reserved

+

Reserved

+

APP

+

Non-reserved

+

-

+

-

+

ARE

+

-

+

Reserved

+

Reserved

+

ARRAY

+

Reserved

+

Reserved

+

-

+

AS

+

Reserved

+

Reserved

+

Reserved

+

ASC

+

Reserved

+

Reserved

+

Reserved

+

ASENSITIVE

+

-

+

Non-reserved

+

-

+

ASSERTION

+

Non-reserved

+

Reserved

+

Reserved

+

ASSIGNMENT

+

Non-reserved

+

Non-reserved

+

-

+

ASYMMETRIC

+

Reserved

+

Non-reserved

+

-

+

AT

+

Non-reserved

+

Reserved

+

Reserved

+

ATOMIC

+

-

+

Non-reserved

+

-

+

ATTRIBUTE

+

Non-reserved

+

-

+

-

+

AUTHID

+

Reserved

+

-

+

-

+

AUTHINFO

+

Non-reserved

+

-

+

-

+

AUTHORIZATION

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

AUTOEXTEND

+

Non-reserved

+

-

+

-

+

AUTOMAPPED

+

Non-reserved

+

-

+

-

+

AVG

+

-

+

Non-reserved

+

Reserved

+

BACKWARD

+

Non-reserved

+

-

+

-

+

BARRIER

+

Non-reserved

+

-

+

-

+

BEFORE

+

Non-reserved

+

Reserved

+

-

+

BEGIN

+

Non-reserved

+

Reserved

+

Reserved

+

BETWEEN

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

BIGINT

+

Non-reserved (excluding functions and types)

+

-

+

-

+

BINARY

+

Reserved (functions and types allowed)

+

Reserved

+

-

+

BINARY_DOUBLE

+

Non-reserved (excluding functions and types)

+

-

+

-

+

BINARY_INTEGER

+

Non-reserved (excluding functions and types)

+

-

+

-

+

BIT

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

BITVAR

+

-

+

Non-reserved

+

-

+

BIT_LENGTH

+

-

+

Non-reserved

+

Reserved

+

BLOB

+

Non-reserved

+

Reserved

+

-

+

BOOLEAN

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

BOTH

+

Reserved

+

Reserved

+

Reserved

+

BUCKETS

+

Reserved

+

-

+

-

+

BREADTH

+

-

+

Reserved

+

-

+

BY

+

Non-reserved

+

Reserved

+

Reserved

+

C

+

-

+

Non-reserved

+

Non-reserved

+

CACHE

+

Non-reserved

+

-

+

-

+

CALL

+

Non-reserved

+

Reserved

+

-

+

CALLED

+

Non-reserved

+

Non-reserved

+

-

+

CARDINALITY

+

-

+

Non-reserved

+

-

+

CASCADE

+

Non-reserved

+

Reserved

+

Reserved

+

CASCADED

+

Non-reserved

+

Reserved

+

Reserved

+

CASE

+

Reserved

+

Reserved

+

Reserved

+

CAST

+

Reserved

+

Reserved

+

Reserved

+

CATALOG

+

Non-reserved

+

Reserved

+

Reserved

+

CATALOG_NAME

+

-

+

Non-reserved

+

Non-reserved

+

CHAIN

+

Non-reserved

+

Non-reserved

+

-

+

CHAR

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

CHARACTER

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

CHARACTERISTICS

+

Non-reserved

+

-

+

-

+

CHARACTER_LENGTH

+

-

+

Non-reserved

+

Reserved

+

CHARACTER_SET_CATALOG

+

-

+

Non-reserved

+

Non-reserved

+

CHARACTER_SET_NAME

+

-

+

Non-reserved

+

Non-reserved

+

CHARACTER_SET_SCHEMA

+

-

+

Non-reserved

+

Non-reserved

+

CHAR_LENGTH

+

-

+

Non-reserved

+

Reserved

+

CHECK

+

Reserved

+

Reserved

+

Reserved

+

CHECKED

+

-

+

Non-reserved

+

-

+

CHECKPOINT

+

Non-reserved

+

-

+

-

+

CLASS

+

Non-reserved

+

Reserved

+

-

+

CLEAN

+

Non-reserved

+

-

+

-

+

CLASS_ORIGIN

+

-

+

Non-reserved

+

Non-reserved

+

CLOB

+

Non-reserved

+

Reserved

+

-

+

CLOSE

+

Non-reserved

+

Reserved

+

Reserved

+

CLUSTER

+

Non-reserved

+

-

+

-

+

COALESCE

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

COBOL

+

-

+

Non-reserved

+

Non-reserved

+

COLLATE

+

Reserved

+

Reserved

+

Reserved

+

COLLATION

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

COLLATION_CATALOG

+

-

+

Non-reserved

+

Non-reserved

+

COLLATION_NAME

+

-

+

Non-reserved

+

Non-reserved

+

COLLATION_SCHEMA

+

-

+

Non-reserved

+

Non-reserved

+

COLUMN

+

Reserved

+

Reserved

+

Reserved

+

COLUMNS

+

Non-reserved

+

-

+

-

+

COLUMN_NAME

+

-

+

Non-reserved

+

Non-reserved

+

COMMAND_FUNCTION

+

-

+

Non-reserved

+

Non-reserved

+

COMMAND_FUNCTION_CODE

+

-

+

Non-reserved

+

-

+

COMMENT

+

Non-reserved

+

-

+

-

+

COMMENTS

+

Non-reserved

+

-

+

-

+

COMMIT

+

Non-reserved

+

Reserved

+

Reserved

+

COMMITTED

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

COMPATIBLE_ILLEGAL_CHARS

+

Non-reserved

+

-

+

-

+

COMPLETE

+

Non-reserved

+

-

+

-

+

COMPRESS

+

Non-reserved

+

-

+

-

+

COMPLETION

+

-

+

Reserved

+

-

+

CONCURRENTLY

+

Reserved (functions and types allowed)

+

-

+

-

+

CONDITION

+

-

+

-

+

-

+

CONDITION_NUMBER

+

-

+

Non-reserved

+

Non-reserved

+

CONFIGURATION

+

Non-reserved

+

-

+

-

+

CONNECT

+

-

+

Reserved

+

Reserved

+

CONNECTION

+

Non-reserved

+

Reserved

+

Reserved

+

CONNECTION_NAME

+

-

+

Non-reserved

+

Non-reserved

+

CONSTRAINT

+

Reserved

+

Reserved

+

Reserved

+

CONSTRAINTS

+

Non-reserved

+

Reserved

+

Reserved

+

CONSTRAINT_CATALOG

+

-

+

Non-reserved

+

Non-reserved

+

CONSTRAINT_NAME

+

-

+

Non-reserved

+

Non-reserved

+

CONSTRAINT_SCHEMA

+

-

+

Non-reserved

+

Non-reserved

+

CONSTRUCTOR

+

-

+

Reserved

+

-

+

CONTAINS

+

-

+

Non-reserved

+

-

+

CONTENT

+

Non-reserved

+

-

+

-

+

CONTINUE

+

Non-reserved

+

Reserved

+

Reserved

+

CONVERSION

+

Non-reserved

+

-

+

-

+

CONVERT

+

-

+

Non-reserved

+

Reserved

+

COORDINATOR

+

Non-reserved

+

-

+

-

+

COPY

+

Non-reserved

+

-

+

-

+

CORRESPONDING

+

-

+

Reserved

+

Reserved

+

COST

+

Non-reserved

+

-

+

-

+

COUNT

+

-

+

Non-reserved

+

Reserved

+

CREATE

+

Reserved

+

Reserved

+

Reserved

+

CROSS

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

CSV

+

Non-reserved

+

-

+

-

+

CUBE

+

-

+

Reserved

+

-

+

CURRENT

+

Non-reserved

+

Reserved

+

Reserved

+

CURRENT_CATALOG

+

Reserved

+

-

+

-

+

CURRENT_DATE

+

Reserved

+

Reserved

+

Reserved

+

CURRENT_PATH

+

-

+

Reserved

+

-

+

CURRENT_ROLE

+

Reserved

+

Reserved

+

-

+

CURRENT_SCHEMA

+

Reserved (functions and types allowed)

+

-

+

-

+

CURRENT_TIME

+

Reserved

+

Reserved

+

Reserved

+

CURRENT_TIMESTAMP

+

Reserved

+

Reserved

+

Reserved

+

CURRENT_USER

+

Reserved

+

Reserved

+

Reserved

+

CURSOR

+

Non-reserved

+

Reserved

+

Reserved

+

CURSOR_NAME

+

-

+

Non-reserved

+

Non-reserved

+

CYCLE

+

Non-reserved

+

Reserved

+

-

+

DATA

+

Non-reserved

+

Reserved

+

Non-reserved

+

DATE_FORMAT

+

Non-reserved

+

-

+

-

+

DATABASE

+

Non-reserved

+

-

+

-

+

DATAFILE

+

Non-reserved

+

-

+

-

+

DATE

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

DATETIME_INTERVAL_CODE

+

-

+

Non-reserved

+

Non-reserved

+

DATETIME_INTERVAL_PRECISION

+

-

+

Non-reserved

+

Non-reserved

+

DAY

+

Non-reserved

+

Reserved

+

Reserved

+

DBCOMPATIBILITY

+

Non-reserved

+

-

+

-

+

DEALLOCATE

+

Non-reserved

+

Reserved

+

Reserved

+

DEC

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

DECIMAL

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

DECLARE

+

Non-reserved

+

Reserved

+

Reserved

+

DECODE

+

Non-reserved (excluding functions and types)

+

-

+

-

+

DEFAULT

+

Reserved

+

Reserved

+

Reserved

+

DEFAULTS

+

Non-reserved

+

-

+

-

+

DEFERRABLE

+

Reserved

+

Reserved

+

Reserved

+

DEFERRED

+

Non-reserved

+

Reserved

+

Reserved

+

DEFINED

+

-

+

Non-reserved

+

-

+

DEFINER

+

Non-reserved

+

Non-reserved

+

-

+

DELETE

+

Non-reserved

+

Reserved

+

Reserved

+

DELIMITER

+

Non-reserved

+

-

+

-

+

DELIMITERS

+

Non-reserved

+

-

+

-

+

DELTA

+

Non-reserved

+

-

+

-

+

DEPTH

+

-

+

Reserved

+

-

+

DEREF

+

-

+

Reserved

+

-

+

DESC

+

Reserved

+

Reserved

+

Reserved

+

DESCRIBE

+

-

+

Reserved

+

Reserved

+

DESCRIPTOR

+

-

+

Reserved

+

Reserved

+

DESTROY

+

-

+

Reserved

+

-

+

DESTRUCTOR

+

-

+

Reserved

+

-

+

DETERMINISTIC

+

Non-reserved

+

Reserved

+

-

+

DIAGNOSTICS

+

-

+

Reserved

+

Reserved

+

DICTIONARY

+

Non-reserved

+

Reserved

+

-

+

DIRECT

+

Non-reserved

+

-

+

-

+

DIRECTORY

+

Non-reserved

+

-

+

-

+

DISABLE

+

Non-reserved

+

-

+

-

+

DISCARD

+

Non-reserved

+

-

+

-

+

DISCONNECT

+

-

+

Reserved

+

Reserved

+

DISPATCH

+

-

+

Non-reserved

+

-

+

DISTINCT

+

Reserved

+

Reserved

+

Reserved

+

DISTRIBUTE

+

Non-reserved

+

-

+

-

+

DISTRIBUTION

+

Non-reserved

+

-

+

-

+

DO

+

Reserved

+

-

+

-

+

DOCUMENT

+

Non-reserved

+

-

+

-

+

DOMAIN

+

Non-reserved

+

Reserved

+

Reserved

+

DOUBLE

+

Non-reserved

+

Reserved

+

Reserved

+

DROP

+

Non-reserved

+

Reserved

+

Reserved

+

DYNAMIC

+

-

+

Reserved

+

-

+

DYNAMIC_FUNCTION

+

-

+

Non-reserved

+

Non-reserved

+

DYNAMIC_FUNCTION_CODE

+

-

+

Non-reserved

+

-

+

EACH

+

Non-reserved

+

Reserved

+

-

+

ELASTIC

+

Non-reserved

+

-

+

-

+

ELSE

+

Reserved

+

Reserved

+

Reserved

+

ENABLE

+

Non-reserved

+

-

+

-

+

ENCODING

+

Non-reserved

+

-

+

-

+

ENCRYPTED

+

Non-reserved

+

-

+

-

+

END

+

Reserved

+

Reserved

+

Reserved

+

END-EXEC

+

-

+

Reserved

+

Reserved

+

ENFORCED

+

Non-reserved

+

-

+

-

+

ENUM

+

Non-reserved

+

-

+

-

+

EOL

+

Non-reserved

+

-

+

-

+

EQUALS

+

-

+

Reserved

+

-

+

ERRORS

+

Non-reserved

+

-

+

-

+

ESCAPE

+

Non-reserved

+

Reserved

+

Reserved

+

ESCAPING

+

Non-reserved

+

-

+

-

+

EVERY

+

Non-reserved

+

Reserved

+

-

+

EXCEPT

+

Reserved

+

Reserved

+

Reserved

+

EXCEPTION

+

-

+

Reserved

+

Reserved

+

EXCHANGE

+

Non-reserved

+

-

+

-

+

EXCLUDE

+

Non-reserved

+

-

+

-

+

EXCLUDING

+

Non-reserved

+

-

+

-

+

EXCLUSIVE

+

Non-reserved

+

-

+

-

+

EXEC

+

-

+

Reserved

+

Reserved

+

EXECUTE

+

Non-reserved

+

Reserved

+

Reserved

+

EXISTING

+

-

+

Non-reserved

+

-

+

EXISTS

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

EXPIRATION

+

Non-reserved

+

-

+

-

+

EXPLAIN

+

Non-reserved

+

-

+

-

+

EXTENSION

+

Non-reserved

+

-

+

-

+

EXTERNAL

+

Non-reserved

+

Reserved

+

Reserved

+

EXTRACT

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

FALSE

+

Reserved

+

Reserved

+

Reserved

+

FAMILY

+

Non-reserved

+

-

+

-

+

FAST

+

Non-reserved

+

-

+

-

+

FENCED

+

Non-reserved

+

-

+

-

+

FETCH

+

Reserved

+

Reserved

+

Reserved

+

FILEHEADER

+

Non-reserved

+

-

+

-

+

FILL_MISSING_FIELDS

+

Non-reserved

+

-

+

-

+

FINAL

+

-

+

Non-reserved

+

-

+

FIRST

+

Non-reserved

+

Reserved

+

Reserved

+

FIXED

+

Non-reserved

+

Reserved

+

Reserved

+

FLOAT

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

FOLLOWING

+

Non-reserved

+

-

+

-

+

FOR

+

Reserved

+

Reserved

+

Reserved

+

FORCE

+

Non-reserved

+

-

+

-

+

FOREIGN

+

Reserved

+

Reserved

+

Reserved

+

FORMATTER

+

Non-reserved

+

-

+

-

+

FORTRAN

+

-

+

Non-reserved

+

Non-reserved

+

FORWARD

+

Non-reserved

+

-

+

-

+

FOUND

+

-

+

Reserved

+

Reserved

+

FREE

+

-

+

Reserved

+

-

+

FREEZE

+

Reserved (functions and types allowed)

+

-

+

-

+

FROM

+

Reserved

+

Reserved

+

Reserved

+

FULL

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

FUNCTION

+

Non-reserved

+

Reserved

+

-

+

FUNCTIONS

+

Non-reserved

+

-

+

-

+

G

+

-

+

Non-reserved

+

-

+

GENERAL

+

-

+

Reserved

+

-

+

GENERATED

+

-

+

Non-reserved

+

-

+

GET

+

-

+

Reserved

+

Reserved

+

GLOBAL

+

Non-reserved

+

Reserved

+

Reserved

+

GO

+

-

+

Reserved

+

Reserved

+

GOTO

+

-

+

Reserved

+

Reserved

+

GRANT

+

Reserved

+

Reserved

+

Reserved

+

GRANTED

+

Non-reserved

+

Non-reserved

+

-

+

GREATEST

+

Non-reserved (excluding functions and types)

+

-

+

-

+

GROUP

+

Reserved

+

Reserved

+

Reserved

+

GROUPING

+

-

+

Reserved

+

-

+

HANDLER

+

Non-reserved

+

-

+

-

+

HAVING

+

Reserved

+

Reserved

+

Reserved

+

HEADER

+

Non-reserved

+

-

+

-

+

HIERARCHY

+

-

+

Non-reserved

+

-

+

HOLD

+

Non-reserved

+

Non-reserved

+

-

+

HOST

+

-

+

Reserved

+

-

+

HOUR

+

Non-reserved

+

Reserved

+

Reserved

+

IDENTIFIED

+

Non-reserved

+

-

+

-

+

IDENTITY

+

Non-reserved

+

Reserved

+

Reserved

+

IF

+

Non-reserved (excluding functions and types)

+

-

+

-

+

IFNULL

+

Non-reserved (excluding functions and types)

+

-

+

-

+

IGNORE

+

-

+

Reserved

+

-

+

IGNORE_EXTRA_DATA

+

Non-reserved

+

-

+

-

+

ILIKE

+

Reserved (functions and types allowed)

+

-

+

-

+

IMMEDIATE

+

Non-reserved

+

Reserved

+

Reserved

+

IMMUTABLE

+

Non-reserved

+

-

+

-

+

IMPLEMENTATION

+

-

+

Non-reserved

+

-

+

IMPLICIT

+

Non-reserved

+

-

+

-

+

IN

+

Reserved

+

Reserved

+

Reserved

+

INCLUDING

+

Non-reserved

+

-

+

-

+

INCREMENT

+

Non-reserved

+

-

+

-

+

INDEX

+

Non-reserved

+

-

+

-

+

INDEXES

+

Non-reserved

+

-

+

-

+

INDICATOR

+

-

+

Reserved

+

Reserved

+

INFIX

+

-

+

Non-reserved

+

-

+

INHERIT

+

Non-reserved

+

-

+

-

+

INHERITS

+

Non-reserved

+

-

+

-

+

INITIAL

+

Non-reserved

+

-

+

-

+

INITIALIZE

+

-

+

Reserved

+

-

+

INITIALLY

+

Reserved

+

Reserved

+

Reserved

+

INITRANS

+

Non-reserved

+

-

+

-

+

INLINE

+

Non-reserved

+

-

+

-

+

INNER

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

INOUT

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

INPUT

+

Non-reserved

+

Reserved

+

Reserved

+

INSENSITIVE

+

Non-reserved

+

Non-reserved

+

Reserved

+

INSERT

+

Non-reserved

+

Reserved

+

Reserved

+

INSTANCE

+

-

+

Non-reserved

+

-

+

INSTANTIABLE

+

-

+

Non-reserved

+

-

+

INSTEAD

+

Non-reserved

+

-

+

-

+

INT

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

INTEGER

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

INTERNAL

+

Reserved

+

-

+

-

+

INTERSECT

+

Reserved

+

Reserved

+

Reserved

+

INTERVAL

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

INTO

+

Reserved

+

Reserved

+

Reserved

+

INVOKER

+

Non-reserved

+

Non-reserved

+

-

+

IS

+

Reserved

+

Reserved

+

Reserved

+

ISNULL

+

Non-reserved (excluding functions and types)

+

-

+

-

+

ISOLATION

+

Non-reserved

+

Reserved

+

Reserved

+

ITERATE

+

-

+

Reserved

+

-

+

JOIN

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

K

+

-

+

Non-reserved

+

-

+

KEY

+

Non-reserved

+

Reserved

+

Reserved

+

KEY_MEMBER

+

-

+

Non-reserved

+

-

+

KEY_TYPE

+

-

+

Non-reserved

+

-

+

LABEL

+

Non-reserved

+

-

+

-

+

LANGUAGE

+

Non-reserved

+

Reserved

+

Reserved

+

LARGE

+

Non-reserved

+

Reserved

+

-

+

LAST

+

Non-reserved

+

Reserved

+

Reserved

+

LATERAL

+

-

+

Reserved

+

-

+

LC_COLLATE

+

Non-reserved

+

-

+

-

+

LC_CTYPE

+

Non-reserved

+

-

+

-

+

LEADING

+

Reserved

+

Reserved

+

Reserved

+

LEAKPROOF

+

Non-reserved

+

-

+

-

+

LEAST

+

Non-reserved (excluding functions and types)

+

-

+

-

+

LEFT

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

LENGTH

+

-

+

Non-reserved

+

Non-reserved

+

LESS

+

Reserved

+

Reserved

+

-

+

LEVEL

+

Non-reserved

+

Reserved

+

Reserved

+

LIKE

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

LIMIT

+

Reserved

+

Reserved

+

-

+

LISTEN

+

Non-reserved

+

-

+

-

+

LOAD

+

Non-reserved

+

-

+

-

+

LOCAL

+

Non-reserved

+

Reserved

+

Reserved

+

LOCALTIME

+

Reserved

+

Reserved

+

-

+

LOCALTIMESTAMP

+

Reserved

+

Reserved

+

-

+

LOCATION

+

Non-reserved

+

-

+

-

+

LOCATOR

+

-

+

Reserved

+

-

+

LOCK

+

Non-reserved

+

-

+

-

+

LOG

+

Non-reserved

+

-

+

-

+

LOGGING

+

Non-reserved

+

-

+

-

+

LOGIN

+

Non-reserved

+

-

+

-

+

LOOP

+

Non-reserved

+

-

+

-

+

LOWER

+

-

+

Non-reserved

+

Reserved

+

M

+

-

+

Non-reserved

+

-

+

MAP

+

-

+

Reserved

+

-

+

MAPPING

+

Non-reserved

+

-

+

-

+

MATCH

+

Non-reserved

+

Reserved

+

Reserved

+

MATCHED

+

Non-reserved

+

-

+

-

+

MAX

+

-

+

Non-reserved

+

Reserved

+

MAXEXTENTS

+

Non-reserved

+

-

+

-

+

MAXSIZE

+

Non-reserved

+

-

+

-

+

MAXTRANS

+

Non-reserved

+

-

+

-

+

MAXVALUE

+

Reserved

+

-

+

-

+

MERGE

+

Non-reserved

+

-

+

-

+

MESSAGE_LENGTH

+

-

+

Non-reserved

+

Non-reserved

+

MESSAGE_OCTET_LENGTH

+

-

+

Non-reserved

+

Non-reserved

+

MESSAGE_TEXT

+

-

+

Non-reserved

+

Non-reserved

+

METHOD

+

-

+

Non-reserved

+

-

+

MIN

+

-

+

Non-reserved

+

Reserved

+

MINEXTENTS

+

Non-reserved

+

-

+

-

+

MINUS

+

Reserved

+

-

+

-

+

MINUTE

+

Non-reserved

+

Reserved

+

Reserved

+

MINVALUE

+

Non-reserved

+

-

+

-

+

MOD

+

-

+

Non-reserved

+

-

+

MODE

+

Non-reserved

+

-

+

-

+

MODIFIES

+

-

+

Reserved

+

-

+

MODIFY

+

Reserved

+

Reserved

+

-

+

MODULE

+

-

+

Reserved

+

Reserved

+

MONTH

+

Non-reserved

+

Reserved

+

Reserved

+

MORE

+

-

+

Non-reserved

+

Non-reserved

+

MOVE

+

Non-reserved

+

-

+

-

+

MOVEMENT

+

Non-reserved

+

-

+

-

+

MUMPS

+

-

+

Non-reserved

+

Non-reserved

+

NAME

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

NAMES

+

Non-reserved

+

Reserved

+

Reserved

+

NATIONAL

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

NATURAL

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

NCHAR

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

NCLOB

+

-

+

Reserved

+

-

+

NEW

+

-

+

Reserved

+

-

+

NEXT

+

Non-reserved

+

Reserved

+

Reserved

+

NLSSORT

+

Reserved

+

-

+

-

+

NO

+

Non-reserved

+

Reserved

+

Reserved

+

NOCOMPRESS

+

Non-reserved

+

-

+

-

+

NOCYCLE

+

Non-reserved

+

-

+

-

+

NODE

+

Non-reserved

+

-

+

-

+

NOLOGGING

+

Non-reserved

+

-

+

-

+

NOLOGIN

+

Non-reserved

+

-

+

-

+

NOMAXVALUE

+

Non-reserved

+

-

+

-

+

NOMINVALUE

+

Non-reserved

+

-

+

-

+

NONE

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

NOT

+

Reserved

+

Reserved

+

Reserved

+

NOTHING

+

Non-reserved

+

-

+

-

+

NOTIFY

+

Non-reserved

+

-

+

-

+

NOTNULL

+

Reserved (functions and types allowed)

+

-

+

-

+

NOWAIT

+

Non-reserved

+

-

+

-

+

NULL

+

Reserved

+

Reserved

+

Reserved

+

NULLABLE

+

-

+

Non-reserved

+

Non-reserved

+

NULLIF

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

NULLS

+

Non-reserved

+

-

+

-

+

NUMBER

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Non-reserved

+

NUMERIC

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

NUMSTR

+

Non-reserved

+

-

+

-

+

NVARCHAR2

+

Non-reserved (excluding functions and types)

+

-

+

-

+

NVL

+

Non-reserved (excluding functions and types)

+

-

+

-

+

OBJECT

+

Non-reserved

+

Reserved

+

-

+

OCTET_LENGTH

+

-

+

Non-reserved

+

Reserved

+

OF

+

Non-reserved

+

Reserved

+

Reserved

+

OFF

+

Non-reserved

+

Reserved

+

-

+

OFFSET

+

Reserved

+

-

+

-

+

OIDS

+

Non-reserved

+

-

+

-

+

OLD

+

-

+

Reserved

+

-

+

ON

+

Reserved

+

Reserved

+

Reserved

+

ONLY

+

Reserved

+

Reserved

+

Reserved

+

OPEN

+

-

+

Reserved

+

Reserved

+

OPERATION

+

-

+

Reserved

+

-

+

OPERATOR

+

Non-reserved

+

-

+

-

+

OPTIMIZATION

+

Non-reserved

+

-

+

-

+

OPTION

+

Non-reserved

+

Reserved

+

Reserved

+

OPTIONS

+

Non-reserved

+

Non-reserved

+

-

+

OR

+

Reserved

+

Reserved

+

Reserved

+

ORDER

+

Reserved

+

Reserved

+

Reserved

+

ORDINALITY

+

-

+

Reserved

+

-

+

OUT

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

OUTER

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

OUTPUT

+

-

+

Reserved

+

Reserved

+

OVER

+

Non-reserved

+

-

+

-

+

OVERLAPS

+

Reserved (functions and types allowed)

+

Non-reserved

+

Reserved

+

OVERLAY

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

-

+

OVERRIDING

+

-

+

Non-reserved

+

-

+

OWNED

+

Non-reserved

+

-

+

-

+

OWNER

+

Non-reserved

+

-

+

-

+

PACKAGE

+

Non-reserved

+

-

+

-

+

PAD

+

-

+

Reserved

+

Reserved

+

PARAMETER

+

-

+

Reserved

+

-

+

PARAMETERS

+

-

+

Reserved

+

-

+

PARAMETER_MODE

+

-

+

Non-reserved

+

-

+

PARAMETER_NAME

+

-

+

Non-reserved

+

-

+

PARAMETER_ORDINAL_POSITION

+

-

+

Non-reserved

+

-

+

PARAMETER_SPECIFIC_CATALOG

+

-

+

Non-reserved

+

-

+

PARAMETER_SPECIFIC_NAME

+

-

+

Non-reserved

+

-

+

PARAMETER_SPECIFIC_SCHEMA

+

-

+

Non-reserved

+

-

+

PARSER

+

Non-reserved

+

-

+

-

+

PARTIAL

+

Non-reserved

+

Reserved

+

Reserved

+

PARTITION

+

Non-reserved

+

-

+

-

+

PARTITIONS

+

Non-reserved

+

-

+

-

+

PASCAL

+

-

+

Non-reserved

+

Non-reserved

+

PASSING

+

Non-reserved

+

-

+

-

+

PASSWORD

+

Non-reserved

+

-

+

-

+

PATH

+

-

+

Reserved

+

-

+

PCTFREE

+

Non-reserved

+

-

+

-

+

PER

+

Non-reserved

+

-

+

-

+

PERM

+

Non-reserved

+

-

+

-

+

PERCENT

+

Non-reserved

+

-

+

-

+

PERFORMANCE

+

Reserved

+

-

+

-

+

PLACING

+

Reserved

+

-

+

-

+

PLAN

+

Reserved

+

-

+

-

+

PLANS

+

Non-reserved

+

-

+

-

+

PLI

+

-

+

Non-reserved

+

Non-reserved

+

POLICY

+

Non-reserved

+

-

+

-

+

POOL

+

Non-reserved

+

-

+

-

+

POSITION

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

POSTFIX

+

-

+

Reserved

+

-

+

PRECEDING

+

Non-reserved

+

-

+

-

+

PRECISION

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

PREFERRED

+

Non-reserved

+

-

+

-

+

PREFIX

+

Non-reserved

+

Reserved

+

-

+

PREORDER

+

-

+

Reserved

+

-

+

PREPARE

+

Non-reserved

+

Reserved

+

Reserved

+

PREPARED

+

Non-reserved

+

-

+

-

+

PRESERVE

+

Non-reserved

+

Reserved

+

Reserved

+

PRIMARY

+

Reserved

+

Reserved

+

Reserved

+

PRIOR

+

Non-reserved

+

Reserved

+

Reserved

+

PRIVATE

+

Non-reserved

+

-

+

-

+

PRIVILEGE

+

Non-reserved

+

-

+

-

+

PRIVILEGES

+

Non-reserved

+

Reserved

+

Reserved

+

PROCEDURAL

+

Non-reserved

+

-

+

-

+

PROCEDURE

+

Reserved

+

Reserved

+

Reserved

+

PROFILE

+

Non-reserved

+

-

+

-

+

PUBLIC

+

-

+

Reserved

+

Reserved

+

QUERY

+

Non-reserved

+

-

+

-

+

QUOTE

+

Non-reserved

+

-

+

-

+

RANGE

+

Non-reserved

+

-

+

-

+

RAW

+

Non-reserved

+

-

+

-

+

READ

+

Non-reserved

+

Reserved

+

Reserved

+

READS

+

-

+

Reserved

+

-

+

REAL

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

REASSIGN

+

Non-reserved

+

-

+

-

+

REBUILD

+

Non-reserved

+

-

+

-

+

RECHECK

+

Non-reserved

+

-

+

-

+

RECURSIVE

+

Non-reserved

+

Reserved

+

-

+

REF

+

Non-reserved

+

Reserved

+

-

+

REFRESH

+

Non-reserved

+

-

+

-

+

REFERENCES

+

Reserved

+

Reserved

+

Reserved

+

REFERENCING

+

-

+

Reserved

+

-

+

REINDEX

+

Non-reserved

+

-

+

-

+

REJECT

+

Reserved

+

-

+

-

+

RELATIVE

+

Non-reserved

+

Reserved

+

Reserved

+

RELEASE

+

Non-reserved

+

-

+

-

+

RELOPTIONS

+

Non-reserved

+

-

+

-

+

REMOTE

+

Non-reserved

+

-

+

-

+

RENAME

+

Non-reserved

+

-

+

-

+

REPEATABLE

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

REPLACE

+

Non-reserved

+

-

+

-

+

REPLICA

+

Non-reserved

+

-

+

-

+

RESET

+

Non-reserved

+

-

+

-

+

RESIZE

+

Non-reserved

+

-

+

-

+

RESOURCE

+

Non-reserved

+

-

+

-

+

RESTART

+

Non-reserved

+

-

+

-

+

RESTRICT

+

Non-reserved

+

Reserved

+

Reserved

+

RESULT

+

-

+

Reserved

+

-

+

RETURN

+

Non-reserved

+

Reserved

+

-

+

RETURNED_LENGTH

+

-

+

Non-reserved

+

Non-reserved

+

RETURNED_OCTET_LENGTH

+

-

+

Non-reserved

+

Non-reserved

+

RETURNED_SQLSTATE

+

-

+

Non-reserved

+

Non-reserved

+

RETURNING

+

Reserved

+

-

+

-

+

RETURNS

+

Non-reserved

+

Reserved

+

-

+

REUSE

+

Non-reserved

+

-

+

-

+

REVOKE

+

Non-reserved

+

Reserved

+

Reserved

+

RIGHT

+

Reserved (functions and types allowed)

+

Reserved

+

Reserved

+

ROLE

+

Non-reserved

+

Reserved

+

-

+

ROLLBACK

+

Non-reserved

+

Reserved

+

Reserved

+

ROLLUP

+

-

+

Reserved

+

-

+

ROUTINE

+

-

+

Reserved

+

-

+

ROUTINE_CATALOG

+

-

+

Non-reserved

+

-

+

ROUTINE_NAME

+

-

+

Non-reserved

+

-

+

ROUTINE_SCHEMA

+

-

+

Non-reserved

+

-

+

ROW

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

ROWS

+

Non-reserved

+

Reserved

+

Reserved

+

ROW_COUNT

+

-

+

Non-reserved

+

Non-reserved

+

RULE

+

Non-reserved

+

-

+

-

+

SAVEPOINT

+

Non-reserved

+

Reserved

+

-

+

SCALE

+

-

+

Non-reserved

+

Non-reserved

+

SCHEMA

+

Non-reserved

+

Reserved

+

Reserved

+

SCHEMA_NAME

+

-

+

Non-reserved

+

Non-reserved

+

SCOPE

+

-

+

Reserved

+

-

+

SCROLL

+

Non-reserved

+

Reserved

+

Reserved

+

SEARCH

+

Non-reserved

+

Reserved

+

-

+

SECOND

+

Non-reserved

+

Reserved

+

Reserved

+

SECTION

+

-

+

Reserved

+

Reserved

+

SECURITY

+

Non-reserved

+

Non-reserved

+

-

+

SELECT

+

Reserved

+

Reserved

+

Reserved

+

SELF

+

-

+

Non-reserved

+

-

+

SENSITIVE

+

-

+

Non-reserved

+

-

+

SEQUENCE

+

Non-reserved

+

Reserved

+

-

+

SEQUENCES

+

Non-reserved

+

-

+

-

+

SERIALIZABLE

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

SERVER

+

Non-reserved

+

-

+

-

+

SERVER_NAME

+

-

+

Non-reserved

+

Non-reserved

+

SESSION

+

Non-reserved

+

Reserved

+

Reserved

+

SESSION_USER

+

Reserved

+

Reserved

+

Reserved

+

SET

+

Non-reserved

+

Reserved

+

Reserved

+

SETOF

+

Non-reserved (excluding functions and types)

+

-

+

-

+

SETS

+

-

+

Reserved

+

-

+

SHARE

+

Non-reserved

+

-

+

-

+

SHIPPABLE

+

Non-reserved

+

-

+

-

+

SHOW

+

Non-reserved

+

-

+

-

+

SIMILAR

+

Reserved (functions and types allowed)

+

Non-reserved

+

-

+

SIMPLE

+

Non-reserved

+

Non-reserved

+

-

+

SIZE

+

Non-reserved

+

Reserved

+

Reserved

+

SMALLDATETIME

+

Non-reserved (excluding functions and types)

+

-

+

-

+

SMALLDATETIME_FORMAT

+

Non-reserved

+

-

+

-

+

SMALLINT

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

SNAPSHOT

+

Non-reserved

+

-

+

-

+

SOME

+

Reserved

+

Reserved

+

Reserved

+

SOURCE

+

Non-reserved

+

Non-reserved

+

-

+

SPACE

+

-

+

Reserved

+

Reserved

+

SPECIFIC

+

-

+

Reserved

+

-

+

SPECIFICTYPE

+

-

+

Reserved

+

-

+

SPECIFIC_NAME

+

-

+

Non-reserved

+

-

+

SPILL

+

Non-reserved

+

-

+

-

+

SPLIT

+

Non-reserved

+

-

+

-

+

SQL

+

-

+

Reserved

+

Reserved

+

SQLCODE

+

-

+

-

+

Reserved

+

SQLERROR

+

-

+

-

+

Reserved

+

SQLEXCEPTION

+

-

+

Reserved

+

-

+

SQLSTATE

+

-

+

Reserved

+

Reserved

+

SQLWARNING

+

-

+

Reserved

+

-

+

STABLE

+

Non-reserved

+

-

+

-

+

STANDALONE

+

Non-reserved

+

-

+

-

+

START

+

Non-reserved

+

Reserved

+

-

+

STATE

+

-

+

Reserved

+

-

+

STATEMENT

+

Non-reserved

+

Reserved

+

-

+

STATEMENT_ID

+

Non-reserved

+

-

+

-

+

STATIC

+

-

+

Reserved

+

-

+

STATISTICS

+

Non-reserved

+

-

+

-

+

STDIN

+

Non-reserved

+

-

+

-

+

STDOUT

+

Non-reserved

+

-

+

-

+

STORAGE

+

Non-reserved

+

-

+

-

+

STORE

+

Non-reserved

+

-

+

-

+

STRICT

+

Non-reserved

+

-

+

-

+

STRIP

+

Non-reserved

+

-

+

-

+

STRUCTURE

+

-

+

Reserved

+

-

+

STYLE

+

-

+

Non-reserved

+

-

+

SUBCLASS_ORIGIN

+

-

+

Non-reserved

+

Non-reserved

+

SUBLIST

+

-

+

Non-reserved

+

-

+

SUBSTRING

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

SUM

+

-

+

Non-reserved

+

Reserved

+

SUPERUSER

+

Non-reserved

+

-

+

-

+

SYMMETRIC

+

Reserved

+

Non-reserved

+

-

+

SYNONYM

+

Non-reserved

+

-

+

-

+

SYS_REFCURSOR

+

Non-reserved

+

-

+

-

+

SYSDATE

+

Reserved

+

-

+

-

+

SYSID

+

Non-reserved

+

-

+

-

+

SYSTEM

+

Non-reserved

+

Non-reserved

+

-

+

SYSTEM_USER

+

-

+

Reserved

+

Reserved

+

TABLE

+

Reserved

+

Reserved

+

Reserved

+

TABLES

+

Non-reserved

+

-

+

-

+

TABLE_NAME

+

-

+

Non-reserved

+

Non-reserved

+

TEMP

+

Non-reserved

+

-

+

-

+

TEMPLATE

+

Non-reserved

+

-

+

-

+

TEMPORARY

+

Non-reserved

+

Reserved

+

Reserved

+

TERMINATE

+

-

+

Reserved

+

-

+

TEXT

+

Non-reserved

+

-

+

-

+

THAN

+

Non-reserved

+

Reserved

+

-

+

THEN

+

Reserved

+

Reserved

+

Reserved

+

TIME

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

TIME_FORMAT

+

Non-reserved

+

-

+

-

+

TIMESTAMP

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

TIMESTAMPDIFF

+

Non-reserved (excluding functions and types)

+

-

+

-

+

TIMESTAMP_FORMAT

+

Non-reserved

+

-

+

-

+

TIMEZONE_HOUR

+

-

+

Reserved

+

Reserved

+

TIMEZONE_MINUTE

+

-

+

Reserved

+

Reserved

+

TINYINT

+

Non-reserved (excluding functions and types)

+

-

+

-

+

TO

+

Reserved

+

Reserved

+

Reserved

+

TRAILING

+

Reserved

+

Reserved

+

Reserved

+

TRANSACTION

+

Non-reserved

+

Reserved

+

Reserved

+

TRANSACTIONS_COMMITTED

+

-

+

Non-reserved

+

-

+

TRANSACTIONS_ROLLED_BACK

+

-

+

Non-reserved

+

-

+

TRANSACTION_ACTIVE

+

-

+

Non-reserved

+

-

+

TRANSFORM

+

-

+

Non-reserved

+

-

+

TRANSFORMS

+

-

+

Non-reserved

+

-

+

TRANSLATE

+

-

+

Non-reserved

+

Reserved

+

TRANSLATION

+

-

+

Reserved

+

Reserved

+

TREAT

+

Non-reserved (excluding functions and types)

+

Reserved

+

-

+

TRIGGER

+

Non-reserved

+

Reserved

+

-

+

TRIGGER_CATALOG

+

-

+

Non-reserved

+

-

+

TRIGGER_NAME

+

-

+

Non-reserved

+

-

+

TRIGGER_SCHEMA

+

-

+

Non-reserved

+

-

+

TRIM

+

Non-reserved (excluding functions and types)

+

Non-reserved

+

Reserved

+

TRUE

+

Reserved

+

Reserved

+

Reserved

+

TRUNCATE

+

Non-reserved

+

-

+

-

+

TRUSTED

+

Non-reserved

+

-

+

-

+

TYPE

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

TYPES

+

Non-reserved

+

-

+

-

+

UESCAPE

+

-

+

-

+

-

+

UNBOUNDED

+

Non-reserved

+

-

+

-

+

UNCOMMITTED

+

Non-reserved

+

Non-reserved

+

Non-reserved

+

UNDER

+

-

+

Reserved

+

-

+

UNENCRYPTED

+

Non-reserved

+

-

+

-

+

UNION

+

Reserved

+

Reserved

+

Reserved

+

UNIQUE

+

Reserved

+

Reserved

+

Reserved

+

UNKNOWN

+

Non-reserved

+

Reserved

+

Reserved

+

UNLIMITED

+

Non-reserved

+

-

+

-

+

UNLISTEN

+

Non-reserved

+

-

+

-

+

UNLOCK

+

Non-reserved

+

-

+

-

+

UNLOGGED

+

Non-reserved

+

-

+

-

+

UNNAMED

+

-

+

Non-reserved

+

Non-reserved

+

UNNEST

+

-

+

Reserved

+

-

+

UNTIL

+

Non-reserved

+

-

+

-

+

UNUSABLE

+

Non-reserved

+

-

+

-

+

UPDATE

+

Non-reserved

+

Reserved

+

Reserved

+

UPPER

+

-

+

Non-reserved

+

Reserved

+

USAGE

+

-

+

Reserved

+

Reserved

+

USER

+

Reserved

+

Reserved

+

Reserved

+

USER_DEFINED_TYPE_CATALOG

+

-

+

Non-reserved

+

-

+

USER_DEFINED_TYPE_NAME

+

-

+

Non-reserved

+

-

+

USER_DEFINED_TYPE_SCHEMA

+

-

+

Non-reserved

+

-

+

USING

+

Reserved

+

Reserved

+

Reserved

+

VACUUM

+

Non-reserved

+

-

+

-

+

VALID

+

Non-reserved

+

-

+

-

+

VALIDATE

+

Non-reserved

+

-

+

-

+

VALIDATION

+

Non-reserved

+

-

+

-

+

VALIDATOR

+

Non-reserved

+

-

+

-

+

VALUE

+

Non-reserved

+

Reserved

+

Reserved

+

VALUES

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

VARCHAR

+

Non-reserved (excluding functions and types)

+

Reserved

+

Reserved

+

VARCHAR2

+

Non-reserved (excluding functions and types)

+

-

+

-

+

VARIABLE

+

-

+

Reserved

+

-

+

VARIADIC

+

Reserved

+

-

+

-

+

VARYING

+

Non-reserved

+

Reserved

+

Reserved

+

VCGROUP

+

Non-reserved

+

-

+

-

+

VERBOSE

+

Reserved (functions and types allowed)

+

-

+

-

+

VERIFY

+

Non-reserved

+

-

+

-

+

VERSION

+

Non-reserved

+

-

+

-

+

VIEW

+

Non-reserved

+

Reserved

+

Reserved

+

VOLATILE

+

Non-reserved

+

-

+

-

+

WHEN

+

Reserved

+

Reserved

+

Reserved

+

WHENEVER

+

-

+

Reserved

+

Reserved

+

WHERE

+

Reserved

+

Reserved

+

Reserved

+

WHITESPACE

+

Non-reserved

+

-

+

-

+

WINDOW

+

Reserved

+

-

+

-

+

WITH

+

Reserved

+

Reserved

+

Reserved

+

WITHIN

+

Non-reserved

+

-

+

-

+

WITHOUT

+

Non-reserved

+

Reserved

+

-

+

WORK

+

Non-reserved

+

Reserved

+

Reserved

+

WORKLOAD

+

Non-reserved

+

-

+

-

+

WRAPPER

+

Non-reserved

+

-

+

-

+

WRITE

+

Non-reserved

+

Reserved

+

Reserved

+

XML

+

Non-reserved

+

-

+

-

+

XMLATTRIBUTES

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLCONCAT

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLELEMENT

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLEXISTS

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLFOREST

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLNAMESPACES

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLPARSE

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLPI

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLROOT

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLSERIALIZE

+

Non-reserved (excluding functions and types)

+

-

+

-

+

XMLTABLE

+

Non-reserved (excluding functions and types)

+

-

+

-

+

YEAR

+

Non-reserved

+

Reserved

+

Reserved

+

YES

+

Non-reserved

+

-

+

-

+

ZONE

+

Non-reserved

+

Reserved

+

Reserved

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0008.html b/docs/dws/dev/dws_06_0008.html new file mode 100644 index 00000000..e85042c8 --- /dev/null +++ b/docs/dws/dev/dws_06_0008.html @@ -0,0 +1,47 @@ + + +

Data Types

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0009.html b/docs/dws/dev/dws_06_0009.html new file mode 100644 index 00000000..8df6533e --- /dev/null +++ b/docs/dws/dev/dws_06_0009.html @@ -0,0 +1,367 @@ + + +

Numeric Types

+

Numeric types consist of two-, four-, and eight-byte integers, four- and eight-byte floating-point numbers, and selectable-precision decimals.

+

For details about numeric operators and functions, see Mathematical Functions and Operators.

+

GaussDB(DWS) supports integers, arbitrary precision numbers, floating point types, and serial integers.

+

Integer Types

The types TINYINT, SMALLINT, INTEGER, BINARY_INTEGER, and BIGINT store whole numbers, that is, numbers without fractional components, of various ranges. Saving a number with a decimal in any of the data types will result in errors.

+
The type INTEGER is the common choice. Generally, use the SMALLINT type only if you are sure that the value range is within the SMALLINT value range. The storage speed of INTEGER is much faster. BIGINT is used only when the range of INTEGER is not large enough. +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Integer types

Column

+

Description

+

Storage Space

+

Range

+

TINYINT

+

Tiny integer, also called INT1

+

1 byte

+

0 ~ 255

+

SMALLINT

+

Small integer, also called INT2

+

2 bytes

+

-32,768 ~ +32,767

+

INTEGER

+

Typical choice for integer, also called INT4

+

4 bytes

+

-2,147,483,648 ~ +2,147,483,647

+

BINARY_INTEGER

+

INTEGER alias, compatible with Oracle

+

4 bytes

+

-2,147,483,648 ~ +2,147,483,647

+

BIGINT

+

Big integer, also called INT8

+

8 bytes

+

-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

+
+
+
+

Examples:

+
Create a table containing TINYINT, INTEGER, and BIGINT data.
1
+2
+3
+4
+5
+6
+7
CREATE TABLE int_type_t1 
+(
+    a TINYINT, 
+    b TINYINT,
+    c INTEGER,
+    d BIGINT
+);
+
+ +
+
+

Insert data.

+
1
INSERT INTO int_type_t1 VALUES(100, 10, 1000, 10000);
+
+ +
+

View data.

+
1
+2
+3
+4
+5
SELECT * FROM int_type_t1;
+  a  | b  |  c   |   d   
+-----+----+------+-------
+ 100 | 10 | 1000 | 10000
+(1 row)
+
+ +
+
+

Arbitrary Precision Types

The type NUMBER can store numbers with a very large number of digits. It is especially recommended for storing monetary amounts and other quantities where exactness is required. The arbitrary precision numbers require larger storage space and have lower storage efficiency, operation efficiency, and poorer compression ratio results than integer types.

+

The scale of a NUMBER value is the count of decimal digits in the fractional part, to the right of the decimal point. The precision of a NUMBER value is the total count of significant digits in the whole number, that is, the number of digits to both sides of the decimal point. So the number 23.5141 has a precision of 6 and a scale of 4. Integers can be considered to have a scale of zero.

+

To configure a numeric or decimal column, you are advised to specify both the maximum precision (p) and the maximum scale (s) of the column.

+

If the precision or scale of a value is greater than the declared scale of the column, the system will round the value to the specified number of fractional digits. Then, if the number of digits to the left of the decimal point exceeds the declared precision minus the declared scale, an error will be reported.

+ +
+ + + + + + + + + + + + + + + + +
Table 2 Any-precision types

Column

+

Description

+

Storage Space

+

Range

+

NUMERIC[(p[,s])],

+

DECIMAL[(p[,s])]

+

The value range of p (precision) is [1,1000], and the value range of s (standard) is [0,p].

+

The precision is specified by users. Every four decimal digits occupy two bytes, and an extra eight-byte overhead is added to the entire data.

+

Up to 131,072 digits before the decimal point; and up to 16,383 digits after the decimal point when no precision is specified

+

NUMBER[(p[,s])]

+

Alias for type NUMERIC, compatible with Oracle

+

The precision is specified by users. Every four decimal digits occupy two bytes, and an extra eight-byte overhead is added to the entire data.

+

Up to 131,072 digits before the decimal point; and up to 16,383 digits after the decimal point when no precision is specified

+
+
+

Examples:

+

Create a table with DECIMAL values.

+
1
CREATE TABLE decimal_type_t1 (DT_COL1 DECIMAL(10,4));
+
+ +
+

Insert data.

+
1
INSERT INTO decimal_type_t1 VALUES(123456.122331);
+
+ +
+

View data.

+
1
+2
+3
+4
+5
SELECT * FROM decimal_type_t1;
+   dt_col1   
+-------------
+ 123456.1223
+(1 row)
+
+ +
+
+

Floating-Point Types

The floating-point type is an inexact, variable-precision numeric type. This type is an implementation of IEEE Standard 754 for Binary Floating-Point Arithmetic (single and double precision, respectively), to the extent that the underlying processor, OS, and compiler support it.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3 Floating point types

Column

+

Description

+

Storage Space

+

Range

+

REAL,

+

FLOAT4

+

Single precision floating points, inexact

+

4 bytes

+

Six bytes of decimal digits

+

DOUBLE PRECISION,

+

FLOAT8

+

Double precision floating points, inexact

+

8 bytes

+

1E-307~1E+308,

+

15 bytes of decimal digits

+

FLOAT[(p)]

+

Floating points, inexact. The value range of precision (p) is [1,53].

+
NOTE:

p is the precision, indicating the total decimal digits.

+
+

4 or 8 bytes

+

REAL or DOUBLE PRECISION is selected as an internal identifier based on different precision (p). If no precision is specified, DOUBLE PRECISION is used as the internal identifier.

+

BINARY_DOUBLE

+

DOUBLE PRECISION alias, compatible with Oracle

+

8 bytes

+

1E-307~1E+308,

+

15 bytes of decimal digits

+

DEC[(p[,s])]

+

The value range of p (precision) is [1,1000], and the value range of s (standard) is [0,p].

+
NOTE:

p indicates the total digits, and s indicates the decimal digit.

+
+

The precision is specified by users. Every four decimal digits occupy two bytes, and an extra eight-byte overhead is added to the entire data.

+

Up to 131,072 digits before the decimal point; and up to 16,383 digits after the decimal point when no precision is specified

+

INTEGER[(p[,s])]

+

The value range of p (precision) is [1,1000], and the value range of s (standard) is [0,p].

+

The precision is specified by users. Every four decimal digits occupy two bytes, and an extra eight-byte overhead is added to the entire data.

+

Up to 131,072 digits before the decimal point; and up to 16,383 digits after the decimal point when no precision is specified

+
+
+

Examples:

+

Create a table with floating-point values.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
CREATE TABLE float_type_t2 
+(
+    FT_COL1 INTEGER,
+    FT_COL2 FLOAT4,
+    FT_COL3 FLOAT8,
+    FT_COL4 FLOAT(3),
+    FT_COL5 BINARY_DOUBLE,
+    FT_COL6 DECIMAL(10,4),
+    FT_COL7 INTEGER(6,3)
+) DISTRIBUTE BY HASH ( ft_col1);
+
+ +
+

Insert data.

+
1
INSERT INTO float_type_t2 VALUES(10,10.365456,123456.1234,10.3214, 321.321, 123.123654, 123.123654);
+
+ +
+

View data.

+
1
+2
+3
+4
+5
SELECT * FROM float_type_t2;
+ ft_col1 | ft_col2 |   ft_col3   | ft_col4 | ft_col5 | ft_col6  | ft_col7 
+---------+---------+-------------+---------+---------+----------+---------
+      10 | 10.3655 | 123456.1234 | 10.3214 | 321.321 | 123.1237 | 123.124
+(1 row)
+
+ +
+
+

Serial Integers

SMALLSERIAL, SERIAL, and BIGSERIAL are not true types, but merely a notational convenience for creating unique identifier columns. Therefore, an integer column is created and its default value plans to be read from a sequencer. A NOT NULL constraint is used to ensure NULL is not inserted. In most cases you would also want to attach a UNIQUE or PRIMARY KEY constraint to prevent duplicate values from being inserted unexpectedly. Lastly, the sequence is marked as "owned by" the column, so that it will be dropped if the column or table is dropped. Currently, the SERIAL column can be specified only when you create a table. You cannot add the SERIAL column in an existing table. In addition, SERIAL columns cannot be created in temporary tables. Because SERIAL is not a data type, columns cannot be converted to this type.

+ +
+ + + + + + + + + + + + + + + + + + + + + +
Table 4 Sequence integer

Column

+

Description

+

Storage Space

+

Range

+

SMALLSERIAL

+

Two-byte auto-incrementing integer

+

2 bytes

+

1 ~ 32,767

+

SERIAL

+

Four-byte auto-incrementing integer

+

4 bytes

+

1 ~ 2,147,483,647

+

BIGSERIAL

+

Eight-byte auto-incrementing integer

+

8 bytes

+

1 ~ 9,223,372,036,854,775,807

+
+
+

Examples:

+

Create a table with serial values.

+
1
CREATE TABLE smallserial_type_tab(a SMALLSERIAL);
+
+ +
+

Insert data.

+
1
INSERT INTO smallserial_type_tab VALUES(default);
+
+ +
+

Insert data again.

+
1
INSERT INTO smallserial_type_tab VALUES(default);
+
+ +
+

View data.

+
1
+2
+3
+4
+5
+6
SELECT * FROM smallserial_type_tab;  
+ a 
+---
+ 1
+ 2
+(2 rows)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0010.html b/docs/dws/dev/dws_06_0010.html new file mode 100644 index 00000000..3b9dff5d --- /dev/null +++ b/docs/dws/dev/dws_06_0010.html @@ -0,0 +1,46 @@ + + +

Monetary Types

+

The money type stores a currency amount with fixed fractional precision. The range shown in Table 1 assumes there are two fractional digits. Input is accepted in a variety of formats, including integer and floating-point literals, as well as typical currency formatting, such as $1,000.00. Output is generally in the latter form but depends on the locale.

+ +
+ + + + + + + + + + + +
Table 1 Monetary types

Name

+

Storage Size

+

Description

+

Range

+

money

+

8 bytes

+

Currency amount

+

-92233720368547758.08 to +92233720368547758.07

+
+
+

Values of the numeric, int, and bigint data types can be cast to money. Conversion from the real and double precision data types can be done by casting to numeric first, for example:

+
1
SELECT '12.34'::float8::numeric::money;
+
+ +
+

However, this is not recommended. Floating point numbers should not be used to handle money due to the potential for rounding errors.

+

A money value can be cast to numeric without loss of precision. Conversion to other types could potentially lose precision, and must also be done in two stages:

+
1
SELECT '52093.89'::money::numeric::float8;
+
+ +
+

When a money value is divided by another money value, the result is double precision (that is, a pure number, not money); the currency units cancel each other out in the division.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0011.html b/docs/dws/dev/dws_06_0011.html new file mode 100644 index 00000000..2c13d16f --- /dev/null +++ b/docs/dws/dev/dws_06_0011.html @@ -0,0 +1,98 @@ + + +

Boolean Type

+
+
+ + + + + + + + + + + +
Table 1 Boolean type

Name

+

Description

+

Storage Space

+

Value

+

BOOLEAN

+

Boolean type

+

1 byte

+
  • true
  • false
  • null (unknown)
+
+
+

Valid literal values for the "true" state are:

+

TRUE, 't', 'true', 'y', 'yes', '1'

+

Valid literal values for the "false" state include:

+

FALSE, 'f', 'false', 'n', 'no', '0'

+

TRUE and FALSE are standard expressions, compatible with SQL statements.

+

Examples

Data type boolean is displayed with letters t and f.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
-- Create a table:
+CREATE TABLE bool_type_t1  
+(
+    BT_COL1 BOOLEAN,
+    BT_COL2 TEXT
+) DISTRIBUTE BY HASH(BT_COL2);
+
+--Insert data:
+INSERT INTO bool_type_t1 VALUES (TRUE, 'sic est');
+
+INSERT INTO bool_type_t1 VALUES (FALSE, 'non est');
+
+-- View data:
+SELECT * FROM bool_type_t1;
+ bt_col1 | bt_col2 
+---------+---------
+ t       | sic est
+ f       | non est
+(2 rows)
+
+SELECT * FROM bool_type_t1 WHERE bt_col1 = 't';
+ bt_col1 | bt_col2 
+---------+---------
+ t       | sic est
+(1 row)
+
+-- Delete the tables:
+DROP TABLE bool_type_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0012.html b/docs/dws/dev/dws_06_0012.html new file mode 100644 index 00000000..8e0d09bb --- /dev/null +++ b/docs/dws/dev/dws_06_0012.html @@ -0,0 +1,249 @@ + + +

Character Types

+

Table 1 lists the character types that can be used in GaussDB(DWS). For string operators and related built-in functions, see Character Processing Functions and Operators.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Character types

Name

+

Description

+

Length

+

Storage Space

+

CHAR(n)

+

CHARACTER(n)

+

NCHAR(n)

+

Fixed-length character string. If the length is not reached, fill in spaces.

+

n indicates the string length. If it is not specified, the default precision 1 is used. The value of n is less than 10485761.

+

The maximum size is 10 MB.

+

VARCHAR(n)

+

CHARACTER VARYING(n)

+

Variable-length string.

+

n indicates the byte length. The value of n is less than 10485761.

+

The maximum size is 10 MB.

+

VARCHAR2(n)

+

Variable-length string. It is an alias for VARCHAR(n) type, compatible with Oracle.

+

n indicates the byte length. The value of n is less than 10485761.

+

The maximum size is 10 MB.

+

NVARCHAR2(n)

+

Variable-length string.

+

n indicates the string length. The value of n is less than 10485761.

+

The maximum size is 10 MB.

+

CLOB

+

Variable-length string. A big text object. It is an alias for TEXT type, compatible with Oracle.

+

-

+

The maximum size is 1,073,733,621 bytes (1 GB - 8203 bytes).

+

TEXT

+

Variable-length string.

+

-

+

The maximum size is 1,073,733,621 bytes (1 GB - 8203 bytes).

+
+
+
  • In addition to the size limitation on each column, the total size of each tuple is 1,073,733,621 bytes (1 GB – 8023 bytes).
  • For string data, you are advised to use variable-length strings and specify the maximum length. To avoid truncation, ensure that the specified maximum length is greater than the maximum number of characters to be stored. You are not advised to use fixed-length character types such as CHAR(n), NCHAR(n), and CHARACTER(n) unless you know that the data type is a fixed-length character string.
+
+

GaussDB(DWS) has two other fixed-length character types, as listed in Table 2.

+

The name type is used only in the internal system catalog as the storage identifier. The length of this type is 64 bytes (63 characters plus the terminator). This data type is not recommended for common users. When the name type is aligned with other data types (for example, in multiple branches of case when, one branch returns the name type and other branches return the text type), the name type may be aligned but characters may be truncated. If you do not want to have 64-bit truncated characters, you need to forcibly convert the name type to the text type.

+

The type "char" only uses one byte of storage. It is internally used in the system catalogs as a simplistic enumeration type.

+ +
+ + + + + + + + + + + + + +
Table 2 Special character types

Name

+

Description

+

Storage Space

+

name

+

Internal type for object names

+

64 bytes

+

"char"

+

Single-byte internal type

+

1 byte

+
+
+

Length

If a field is defined as char(n) or varchar(n). n indicates the maximum length. Regardless of the type, the length can not exceed 10485760 bytes (10 MB).

+

When the data length exceeds the specified length n, the error "value too long" is reported. Of course, you can also specify to automatically truncate the data that exceeds the length.

+

Example:

+
  1. Create table t1 and specify the character type of its columns.
    1
    CREATE TABLE t1 (a char(5),b varchar(5));
    +
    + +
    +
  2. An error is reported when the length of data inserted into the table t1 exceeds the specified length.
    1
    +2
    +3
    INSERT INTO t1 VALUES('bookstore','123');
    +ERROR:  value too long for type character(5)
    +CONTEXT:  referenced column: a
    +
    + +
    +
  3. Insert data into table t1 and specify that the data is automatically truncated when the length exceeds the specified bytes.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    INSERT INTO t1 VALUES('bookstore'::char(5),'12345678'::varchar(5));
    +INSERT 0 1
    +
    +SELECT a,b FROM t1;
    +   a   |   b
    +-------+-------
    + books | 12345
    +(1 row)
    +
    + +
    +
+
+

Fixed Length and Variable Length

All character types can be classified into fixed-length strings and variable-length strings.

+
  • For a fixed-length string, the length must be specified. If the length is not specified, the default length 1 is used. If the data length does not reach the specified length, spaces are automatically added to the end of the string. However, the added spaces are meaningless and will be ignored in actual use, such as comparison, sorting, and type conversion.
  • For a variable-length string, if the length is specified, the specified length indicates the maximum length of the data that can be stored. If the length is not specified, it means any length is available.
+

Example:

+
  1. Create table t2 and specify the character type of its columns.
    1
    CREATE TABLE t2 (a char(5),b varchar(5));
    +
    + +
    +
  2. Insert data into table t2 and query the byte length of column a. During table creation, the character type of column a is specified as char(5) and fixed-length. If the data length does not reach 5 bytes, spaces are added. Therefore, the queried data length is 5.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    INSERT INTO t2 VALUES('abc','abc');
    +INSERT 0 1
    +
    +SELECT a,lengthb(a),b FROM t2;
    +   a   | lengthb |  b
    +-------+---------+-----
    + abc   |       5 | abc
    +(1 row)
    +
    + +
    +
  3. After the conversion by using the function, the actual queried length of the column a is 3 bytes.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT a = b from t2;
    + ?column?
    +----------
    + t
    +(1 row)
    +
    +SELECT cast(a as text) as val,lengthb(val) FROM t2;
    + val | lengthb
    +-----+---------
    + abc |       3
    +(1 row)
    +
    + +
    +
+
+

Bytes and Characters

n means differently in VARCHAR2(n) and NVARCHAR2(n).

+
  • In VARCHAR2(n) n indicates the number of bytes.
  • In NVARCHAR2(n), n indicates the number of characters.

    Take an UTF8-encoded database as an example. A letter occupies one byte, and a Chinese character occupies three bytes. VARCHAR2(6) allows for six letters or two Chinese characters, and NVARCHAR2(6) allows for six letters or six Chinese characters.

    +
    +
+
+

Empty Strings and NULL

In Oracle compatibility mode, empty strings and NULL are not distinguished. When a statement is executed to query or import data, empty strings are processed as NULL.

+

As such, = " cannot be used as the query condition, and so does is ''. Otherwise, no result set is returned. The correct usage is is null, or is not null.

+

Example:

+
  1. Create table t4 and specify the character type of its columns.
    1
    CREATE TABLE t4 (a text);
    +
    + +
    +
  2. Insert data into table t4. The inserted value contains an empty string and NULL.
    1
    +2
    INSERT INTO t4 VALUES('abc'),(''),(null);
    +INSERT 0 3
    +
    + +
    +
  3. Check whether t4 contains null values.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    SELECT a,a isnull FROM t4;
    +  a  | ?column?
    +-----+----------
    +     | t
    +     | t
    + abc | f
    +(3 rows)
    +
    +SELECT a,a isnull FROM t4 WHERE a is null;
    + a | ?column?
    +---+----------
    +   | t
    +   | t
    +(2 rows)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0013.html b/docs/dws/dev/dws_06_0013.html new file mode 100644 index 00000000..74d4f8c1 --- /dev/null +++ b/docs/dws/dev/dws_06_0013.html @@ -0,0 +1,100 @@ + + +

Binary Data Types

+

Table 1 lists the binary data types that can be used in GaussDB(DWS).

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 Binary Data Types

Name

+

Description

+

Storage Space

+

BLOB

+

Binary large object.

+

Currently, BLOB only supports the following external access interfaces:

+
  • DBMS_LOB.GETLENGTH
  • DBMS_LOB.READ
  • DBMS_LOB.WRITE
  • DBMS_LOB.WRITEAPPEND
  • DBMS_LOB.COPY
  • DBMS_LOB.ERASE
+

For details about the interfaces, see DBMS_LOB.

+
NOTE:

Column storage cannot be used for the BLOB type.

+
+

The maximum size is 10,7373,3621 bytes (1 GB - 8203 bytes).

+

RAW

+

Variable-length hexadecimal string

+
NOTE:

Column storage cannot be used for the raw type.

+
+

4 bytes plus the actual hexadecimal string. The maximum size is 10,7373,3621 bytes (1 GB - 8203 bytes).

+

BYTEA

+

Variable-length binary string

+

4 bytes plus the actual binary string. The maximum size is 10,7373,3621 bytes (1 GB - 8203 bytes).

+
+
+

In addition to the size limitation on each column, the total size of each tuple is 8203 bytes less than 1 GB.

+
+

Examples

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
-- Create a table:
+CREATE TABLE blob_type_t1 
+(
+    BT_COL1 INTEGER,
+    BT_COL2 BLOB,
+    BT_COL3 RAW,
+    BT_COL4 BYTEA
+) DISTRIBUTE BY REPLICATION;
+
+--Insert data:
+INSERT INTO blob_type_t1 VALUES(10,empty_blob(),
+HEXTORAW('DEADBEEF'),E'\\xDEADBEEF');
+
+-- Query data in the table:
+SELECT * FROM blob_type_t1;
+ bt_col1 | bt_col2 | bt_col3  |  bt_col4   
+---------+---------+----------+------------
+      10 |         | DEADBEEF | \xdeadbeef
+(1 row)
+
+-- Delete the tables:
+DROP TABLE blob_type_t1;
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0014.html b/docs/dws/dev/dws_06_0014.html new file mode 100644 index 00000000..3cd0da14 --- /dev/null +++ b/docs/dws/dev/dws_06_0014.html @@ -0,0 +1,732 @@ + + +

Date/Time Types

+

Table 1 lists date and time types supported by GaussDB(DWS). For the operators and built-in functions of the types, see Date and Time Processing Functions and Operators.

+

If the time format of another database is different from that of GaussDB(DWS), modify the value of the DateStyle parameter to keep them consistent.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Date/Time types

Name

+

Description

+

Storage Space

+

DATE

+

In Oracle compatibility mode, it is equivalent to timestamp(0) and records the date and time.

+

In other modes, it records the date.

+

In Oracle compatibility mode, it occupies 8 bytes.

+

In Oracle compatibility mode, it occupies 4 bytes.

+

TIME [(p)] [WITHOUT TIME ZONE]

+

Specifies the time of day (no date).

+

p indicates the precision after the decimal point. The value ranges from 0 to 6.

+

8 bytes

+

TIME [(p)] [WITH TIME ZONE]

+

Specifies time within one day (with time zone).

+

p indicates the precision after the decimal point. The value ranges from 0 to 6.

+

12 bytes

+

TIMESTAMP[(p)] [WITHOUT TIME ZONE]

+

Specifies the date and time.

+

p indicates the precision after the decimal point. The value ranges from 0 to 6.

+

8 bytes

+

TIMESTAMP[(p)][WITH TIME ZONE]

+

Specifies the date and time (with time zone). TIMESTAMP is also called TIMESTAMPTZ.

+

p indicates the precision after the decimal point. The value ranges from 0 to 6.

+

8 bytes

+

SMALLDATETIME

+

Specifies the date and time (without time zone).

+

The precision level is minute. 31s to 59s are rounded into 1 minute.

+

8 bytes

+

INTERVAL DAY (l) TO SECOND (p)

+

Specifies the time interval (X days X hours X minutes X seconds).

+
  • l: indicates the precision of days. The value ranges from 0 to 6. To adapt to Oracle syntax, the precision functions are not supported.
  • p: indicates the precision of seconds. The value ranges from 0 to 6. The digit 0 at the end of a decimal number is not displayed.
+

16 bytes

+

INTERVAL [FIELDS] [ (p) ]

+

Specifies the time interval.

+
  • fields: YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, DAY TO HOUR, DAY TO MINUTE, DAY TO SECOND, HOUR TO MINUTE, HOUR TO SECOND, and MINUTE TO SECOND.
+
  • p: indicates the precision of seconds. The value ranges from 0 to 6. p takes effect only when fields are SECOND, DAY TO SECOND, HOUR TO SECOND, or MINUTE TO SECOND. The digit 0 at the end of a decimal number is not displayed.
+

12 bytes

+

reltime

+

Relative time interval. The format is:

+

X years X months X days XX:XX:XX

+
  • The Julian calendar is used. It specifies that a year has 365.25 days and a month has 30 days. The relative time interval needs to be calculated based on the input value. The output format is POSTGRES.
+

4 bytes

+
+
+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
--Create a table:
+CREATE TABLE date_type_tab(coll date);
+
+--Insert data:
+INSERT INTO date_type_tab VALUES (date '12-10-2010');
+
+-- View data:
+SELECT * FROM date_type_tab;
+        coll         
+---------------------
+ 2010-12-10 00:00:00
+(1 row)
+
+-- Delete the tables:
+DROP TABLE date_type_tab;
+
+--Create a table:
+CREATE TABLE time_type_tab (da time without time zone ,dai time with time zone,dfgh timestamp without time zone,dfga timestamp with time zone, vbg smalldatetime);
+
+--Insert data:
+INSERT INTO time_type_tab VALUES ('21:21:21','21:21:21 pst','2010-12-12','2013-12-11 pst','2003-04-12 04:05:06');
+
+-- View data:
+SELECT * FROM time_type_tab;
+    da    |     dai     |        dfgh         |          dfga          |         vbg         
+----------+-------------+---------------------+------------------------+---------------------
+ 21:21:21 | 21:21:21-08 | 2010-12-12 00:00:00 | 2013-12-11 16:00:00+08 | 2003-04-12 04:05:00
+(1 row)
+
+-- Delete the tables:
+DROP TABLE time_type_tab;
+
+--Create a table:
+CREATE TABLE day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4)); 
+
+--Insert data:
+INSERT INTO day_type_tab VALUES (1, INTERVAL '3' DAY);
+
+-- View data:
+SELECT * FROM day_type_tab;
+ a |   b    
+---+--------
+ 1 | 3 days
+(1 row)
+
+-- Delete the tables:
+DROP TABLE day_type_tab;
+
+--Create a table:
+CREATE TABLE year_type_tab(a int, b interval year (6));
+
+--Insert data:
+INSERT INTO year_type_tab VALUES(1,interval '2' year);
+
+-- View data:
+SELECT * FROM year_type_tab;
+ a |    b    
+---+---------
+ 1 | 2 years
+(1 row)
+
+-- Delete the tables:
+DROP TABLE year_type_tab;
+
+ +
+

Date Input

Date and time input is accepted in almost any reasonable formats, including ISO 8601, SQL-compatible, and traditional POSTGRES. The system allows you to customize the sequence of day, month, and year in the date input. Set the DateStyle parameter to MDY to select month-day-year interpretation, DMY to select day-month-year interpretation, or YMD to select year-month-day interpretation.

+

Remember that any date or time literal input needs to be enclosed with single quotes, and the syntax is as follows:

+

type [ ( p ) ] 'value'

+

The p that can be selected in the precision statement is an integer, indicating the number of fractional digits in the seconds column. Table 2 shows some possible inputs for the date type.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Date input

Example

+

Description

+

1999-01-08

+

ISO 8601 (recommended format). January 8, 1999 in any mode

+

January 8, 1999

+

Unambiguous in any date input mode

+

1/8/1999

+

January 8 in MDY mode. August 1 in DMY mode

+

1/18/1999

+

January 18 in MDY mode, rejected in other modes

+

01/02/03

+
  • January 2, 2003 in MDY mode
  • February 1, 2003 in DMY mode
  • February 3, 2001 in YMD mode
+

1999-Jan-08

+

January 8 in any mode

+

Jan-08-1999

+

January 8 in any mode

+

08-Jan-1999

+

January 8 in any mode

+

99-Jan-08

+

January 8 in YMD mode, else error

+

08-Jan-99

+

January 8, except error in YMD mode

+

Jan-08-99

+

January 8, except error in YMD mode

+

19990108

+

ISO 8601. January 8, 1999 in any mode

+

990108

+

ISO 8601. January 8, 1999 in any mode

+

1999.008

+

Year and day of year

+

J2451187

+

Julian date

+

January 8, 99 BC

+

Year 99 BC

+
+
+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
--Create a table:
+CREATE TABLE date_type_tab(coll date);
+
+--Insert data:
+INSERT INTO date_type_tab VALUES (date '12-10-2010');
+
+-- View data:
+SELECT * FROM date_type_tab;
+        coll         
+---------------------
+ 2010-12-10 00:00:00
+(1 row)
+
+-- View the date format:
+SHOW datestyle;
+ DateStyle 
+-----------
+ ISO, MDY
+(1 row)
+
+-- Configure the date format:
+SET datestyle='YMD';
+SET
+
+-- Insert data:
+INSERT INTO date_type_tab VALUES(date '2010-12-11');
+
+-- View data:
+SELECT * FROM date_type_tab;
+        coll         
+---------------------
+ 2010-12-10 00:00:00
+ 2010-12-11 00:00:00
+(2 rows)
+
+-- Delete the tables:
+DROP TABLE date_type_tab;
+
+ +
+
+

Times

The time-of-day types are TIME [(p)] [WITHOUT TIME ZONE] and TIME [(p)] [WITH TIME ZONE]. TIME alone is equivalent to TIME WITHOUT TIME ZONE.

+

If a time zone is specified in the input for TIME WITHOUT TIME ZONE, it is silently ignored.

+

For details about the time input types, see Table 3. For details about time zone input types, see Table 4.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3 Time input

Example

+

Description

+

05:06.8

+

ISO 8601

+

4:05:06

+

ISO 8601

+

4:05

+

ISO 8601

+

40506

+

ISO 8601

+

4:05 AM

+

Same as 04:05. AM does not affect value

+

4:05 PM

+

Same as 16:05. Input hour must be <= 12

+

04:05:06.789-8

+

ISO 8601

+

04:05:06-08:00

+

ISO 8601

+

04:05-08:00

+

ISO 8601

+

040506-08

+

ISO 8601

+

04:05:06 PST

+

Time zone specified by abbreviation

+

2003-04-12 04:05:06 America/New_York

+

Time zone specified by full name

+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Table 4 Time zone input

Example

+

Description

+

PST

+

Abbreviation (for Pacific Standard Time)

+

America/New_York

+

Full time zone name

+

-8:00

+

ISO-8601 offset for PST

+

-800

+

ISO-8601 offset for PST

+

-8

+

ISO-8601 offset for PST

+
+
+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
SELECT time '04:05:06';
+   time   
+----------
+ 04:05:06
+(1 row)
+
+SELECT time '04:05:06 PST';
+   time   
+----------
+ 04:05:06
+(1 row)
+
+SELECT time with time zone '04:05:06 PST';
+   timetz    
+-------------
+ 04:05:06-08
+(1 row)
+
+ +
+
+

Special Values

The special values supported by GaussDB(DWS) are converted to common date/time values when being read. For details, see Table 5.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 5 Special Values

Input String

+

Applicable Type

+

Description

+

epoch

+

date, timestamp

+

1970-01-01 00:00:00+00 (Unix system time zero)

+

infinity

+

timestamp

+

Later than any other timestamps

+

-infinity

+

timestamp

+

Earlier than any other timestamps

+

now

+

date, time, timestamp

+

Start time of the current transaction

+

today

+

date, timestamp

+

Today midnight

+

tomorrow

+

date, timestamp

+

Tomorrow midnight

+

yesterday

+

date, timestamp

+

Yesterday midnight

+

allballs

+

time

+

00:00:00.00 UTC

+
+
+
+

Interval Input

The input of reltime can be any valid interval in TEXT format. It can be a number (negative numbers and decimals are also allowed) or a specific time, which must be in SQL standard format, ISO-8601 format, or POSTGRES format. In addition, the text input needs to be enclosed with single quotation marks ('').

+

For details, see Table 6.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 6 Interval input

Input

+

Output

+

Description

+

60

+

2 mons

+

Numbers are used to indicate intervals. The default unit is day. Decimals and negative numbers are also allowed. Particularly, a negative interval syntactically means how long before.

+

31.25

+

1 mons 1 days 06:00:00

+

-365

+

-12 mons -5 days

+

1 years 1 mons 8 days 12:00:00

+

1 years 1 mons 8 days 12:00:00

+

Intervals are in POSTGRES format. They can contain both positive and negative numbers and are case-insensitive. Output is a simplified POSTGRES interval converted from the input.

+

-13 months -10 hours

+

-1 years -25 days -04:00:00

+

-2 YEARS +5 MONTHS 10 DAYS

+

-1 years -6 mons -25 days -06:00:00

+

P-1.1Y10M

+

-3 mons -5 days -06:00:00

+

Intervals are in ISO-8601 format. They can contain both positive and negative numbers and are case-insensitive. Output is a simplified POSTGRES interval converted from the input.

+

+

-12H

+

-12:00:00

+
+
+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
-- Create a table.
+CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);
+
+-- Insert data.
+INSERT INTO reltime_type_tab VALUES ('90', '90');
+INSERT INTO reltime_type_tab VALUES ('-366', '-366');
+INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25');
+INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS');
+INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00');
+INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');
+
+-- View data.
+SELECT * FROM reltime_type_tab;
+              col1              |                col2                 
+--------------------------------+-------------------------------------
+ 1975.25                        | 5 years 4 mons 29 days
+ -2 YEARS +5 MONTHS 10 DAYS     | -1 years -6 mons -25 days -06:00:00
+ P-1.1Y10M                      | -3 mons -5 days -06:00:00
+ -366                           | -1 years -18:00:00
+ 90                             | 3 mons
+ 30 DAYS 12:00:00               | 1 mon 12:00:00
+(6 rows)
+
+-- Delete tables.
+DROP TABLE reltime_type_tab;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0015.html b/docs/dws/dev/dws_06_0015.html new file mode 100644 index 00000000..d8c78345 --- /dev/null +++ b/docs/dws/dev/dws_06_0015.html @@ -0,0 +1,138 @@ + + +

Geometric Types

+

Table 1 lists the geometric types that can be used in GaussDB(DWS). The most fundamental type, the point, forms the basis for all of the other types.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Geometric Type

Name

+

Storage Space

+

Description

+

Representation

+

point

+

16 bytes

+

Point on a plane

+

(x,y)

+

lseg

+

32 bytes

+

Finite line segment

+

((x1,y1),(x2,y2))

+

box

+

32 bytes

+

Rectangular Box

+

((x1,y1),(x2,y2))

+

path

+

16+16n bytes

+

Closed path (similar to polygon)

+

((x1,y1),...)

+

path

+

16+16n bytes

+

Open path

+

[(x1,y1),...]

+

polygon

+

40+16n bytes

+

Polygon (similar to closed path)

+

((x1,y1),...)

+

circle

+

24 bytes

+

Circle

+

<(x,y),r> (center point and radius)

+
+
+

A rich set of functions and operators is available in GaussDB(DWS) to perform various geometric operations, such as scaling, translation, rotation, and determining intersections. For details, see Geometric Functions and Operators.

+

Points

Points are the fundamental two-dimensional building block for geometric types. Values of the point type are specified using either of the following syntaxes:

+
( x , y )
+x , y
+

where x and y are the respective coordinates, as floating-point numbers.

+

Points are output using the first syntax.

+
+

Line Segments

Line segments (lseg) are represented by pairs of points. Values of the lseg type are specified using any of the following syntaxes:

+
[ ( x1 , y1 ) , ( x2 , y2 ) ]
+( ( x1 , y1 ) , ( x2 , y2 ) )
+( x1 , y1 ) , ( x2 , y2 )
+x1 , y1   ,   x2 , y2
+

where (x1,y1) and (x2,y2) are the end points of the line segment.

+

Line segments are output using the first syntax.

+
+

Rectangular Box

Boxes are represented by pairs of points that are opposite corners of the box. Values of the box type are specified using any of the following syntaxes:

+
( ( x1 , y1 ) , ( x2 , y2 ) )
+( x1 , y1 ) , ( x2 , y2 )
+x1 , y1   ,   x2 , y2
+

where (x1,y1) and (x2,y2) are any two opposite corners of the box.

+

Boxes are output using the second syntax.

+

Any two opposite corners can be supplied on input, but in this order, the values will be reordered as needed to store the upper right and lower left corners.

+
+

Path

Paths are represented by lists of connected points. Paths can be open, where the first and last points in the list are considered not connected, or closed, where the first and last points are considered connected.

+

Values of the path type are specified using any of the following syntaxes:

+
[ ( x1 , y1 ) , ... , ( xn , yn ) ]
+( ( x1 , y1 ) , ... , ( xn , yn ) )
+( x1 , y1 ) , ... , ( xn , yn )
+( x1 , y1   , ... ,   xn , yn )
+x1 , y1   , ... ,   xn , yn
+

where the points are the end points of the line segments comprising the path. Square brackets ([]) indicate an open path, while parentheses (()) indicate a closed path. When the outermost parentheses are omitted, as in the third through fifth syntaxes, a closed path is assumed.

+

Paths are output using the first or second syntax.

+
+

Polygons

Polygons are represented by lists of points (the vertexes of the polygon). Polygons are very similar to closed paths, but are stored differently and have their own set of support functions.

+

Values of the polygon type are specified using any of the following syntaxes:

+
( ( x1 , y1 ) , ... , ( xn , yn ) )
+( x1 , y1 ) , ... , ( xn , yn )
+( x1 , y1   , ... ,   xn , yn )
+x1 , y1   , ... ,   xn , yn
+

where the points are the end points of the line segments comprising the boundary of the polygon.

+

Polygons are output using the first syntax.

+
+

Circle

Circles are represented by a center point and radius. Values of the circle type are specified using any of the following syntaxes:

+
< ( x , y ) , r >
+( ( x , y ) , r )
+( x , y ) , r
+x , y   , r
+

where (x,y) is the center point and r is the radius of the circle.

+

Circles are output using the first syntax.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0016.html b/docs/dws/dev/dws_06_0016.html new file mode 100644 index 00000000..ac9208a6 --- /dev/null +++ b/docs/dws/dev/dws_06_0016.html @@ -0,0 +1,167 @@ + + +

Network Address Types

+

GaussDB(DWS) offers data types to store IPv4, IPv6, and MAC addresses.

+

It is better to use network address types instead of plaintext types to store IPv4, IPv6, and MAC addresses, because these types offer input error checking and specialized operators and functions. For details, see Network Address Functions and Operators.

+ +
+ + + + + + + + + + + + + + + + + +
Table 1 Network Address Types

Name

+

Storage Space

+

Description

+

cidr

+

7 or 19 bytes

+

IPv4 or IPv6 networks

+

inet

+

7 or 19 bytes

+

IPv4 or IPv6 hosts and networks

+

macaddr

+

6 bytes

+

MAC addresses

+
+
+

When sorting inet or cidr data types, IPv4 addresses will always sort before IPv6 addresses, including IPv4 addresses encapsulated or mapped to IPv6 addresses, such as ::10.2.3.4 or ::ffff:10.4.3.2.

+

cidr

The cidr type (Classless Inter-Domain Routing) holds an IPv4 or IPv6 network specification. The format for specifying networks is address/y where address is the network represented as an IPv4 or IPv6 address, and y is the number of bits in the netmask. If y is omitted, it is calculated using assumptions from the older classful network numbering system, except it will be at least large enough to include all of the octets written in the input.

+
  • Example 1: Convert a value in the CIDR format to an IP address segment.

    For example, 10.0.0.0/8 is converted into a 32-bit binary address 00001010.00000000.00000000.00000000. /8 indicates an 8-bit network ID. The first eight bits of the 32-bit binary address are fixed. The corresponding network segment is 00001010.00000000.00000000.00000000-00001010.11111111.11111111.11111111. 10.0.0.0/8 indicates that the subnet mask is 255.0.0.0 and the corresponding network segment is 10.0.0.0-10.255.255.255.

    +
  • Example 2: Convert an IP address segment to the CIDR format.

    For the IP address segment 192.168.0.0–192.168.31.255, the last two segments can be converted into a binary address 00000000.00000000-00011111.11111111. The first 19 bits (8 x 2 + 3) are fixed. Therefore, the binary address is 192.168.0.0/19.

    +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 cidr type input examples

cidr Input

+

cidr Output

+

abbrev (cidr)

+

192.168.100.128/25

+

192.168.100.128/25

+

192.168.100.128/25

+

192.168/24

+

192.168.0.0/24

+

192.168.0/24

+

192.168/25

+

192.168.0.0/25

+

192.168.0.0/25

+

192.168.1

+

192.168.1.0/24

+

192.168.1/24

+

192.168

+

192.168.0.0/24

+

192.168.0/24

+

10.1.2

+

10.1.2.0/24

+

10.1.2/24

+

10.1

+

10.1.0.0/16

+

10.1/16

+

10

+

10.0.0.0/8

+

10/8

+

10.1.2.3/32

+

10.1.2.3/32

+

10.1.2.3/32

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba::/64

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128

+

2001:4f8:3:ba:2e0:81ff:fe22:d1f1

+

::ffff:1.2.3.0/120

+

::ffff:1.2.3.0/120

+

::ffff:1.2.3/120

+

::ffff:1.2.3.0/128

+

::ffff:1.2.3.0/128

+

::ffff:1.2.3.0/128

+
+
+
+

inet

The inet type holds an IPv4 or IPv6 host address, and optionally its subnet, all in one field. The subnet is represented by the number of network address bits present in the host address (the "netmask"). If the netmask is 32 and the address is IPv4, then the value does not indicate a subnet, only a single host. In IPv6, the address length is 128 bits, so 128 bits specify a unique host address.

+

The input format for this type is address/y where address is an IPv4 or IPv6 address and y is the number of bits in the netmask. If the /y portion is missing, the netmask is 32 for IPv4 and 128 for IPv6, so the value represents just a single host. On display, the /y portion is suppressed if the netmask specifies a single host.

+

The essential difference between the inet and cidr data types is that inet accepts values with nonzero bits to the right of the netmask, whereas cidr does not.

+
+

macaddr

The macaddr type stores MAC addresses, known for example from Ethernet card hardware addresses (although MAC addresses are used for other purposes as well). Input is accepted in the following formats:

+
'08:00:2b:01:02:03'
+'08-00-2b-01-02-03'
+'08002b:010203'
+'08002b-010203'
+'0800.2b01.0203'
+'08002b010203'
+

These examples would all specify the same address. Upper and lower cases are accepted for the digits a through f. Output is always in the first of the forms shown.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0017.html b/docs/dws/dev/dws_06_0017.html new file mode 100644 index 00000000..d49f635d --- /dev/null +++ b/docs/dws/dev/dws_06_0017.html @@ -0,0 +1,76 @@ + + +

Bit String Types

+

Bit strings are strings of 1's and 0's. They can be used to store bit masks.

+

GaussDB(DWS) supports two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.

+

The bit type data must match the length n exactly. It is an error to attempt to store shorter or longer bit strings. The bit varying data is of variable length up to the maximum length n; longer strings will be rejected. Writing bit without a length is equivalent to bit(1), while bit varying without a length specification means unlimited length.

+

If one explicitly casts a bit-string value to bit(n), it will be truncated or zero-padded on the right to be exactly n bits, without raising an error.

+

Similarly, if one explicitly casts a bit-string value to bit varying(n), it will be truncated on the right if it is more than n bits.

+
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
-- Create a table:
+CREATE TABLE bit_type_t1 
+(
+    BT_COL1 INTEGER,
+    BT_COL2 BIT(3),
+    BT_COL3 BIT VARYING(5)
+) DISTRIBUTE BY REPLICATION;
+
+--Insert data:
+INSERT INTO bit_type_t1 VALUES(1, B'101', B'00');
+
+-- Specify the type length. An error is reported if an inserted string exceeds this length.
+INSERT INTO bit_type_t1 VALUES(2, B'10', B'101');
+ERROR:  bit string length 2 does not match type bit(3)
+CONTEXT:  referenced column: bt_col2
+
+-- Specify the type length. Data is converted if it exceeds this length.
+INSERT INTO bit_type_t1 VALUES(2, B'10'::bit(3), B'101');
+
+-- View data:
+SELECT * FROM bit_type_t1;
+ bt_col1 | bt_col2 | bt_col3 
+---------+---------+---------
+       1 | 101     | 00
+       2 | 100     | 101
+(2 rows)
+
+-- Delete the tables:
+DROP TABLE bit_type_t1;
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0018.html b/docs/dws/dev/dws_06_0018.html new file mode 100644 index 00000000..0096325d --- /dev/null +++ b/docs/dws/dev/dws_06_0018.html @@ -0,0 +1,212 @@ + + +

Text Search Types

+

GaussDB(DWS) offers two data types that are designed to support full text search. The tsvector type represents a document in a form optimized for text search. The tsquery type similarly represents a text query.

+

tsvector

The tsvector type represents a retrieval unit, usually a textual column within a row of a database table, or a combination of such columns. A tsvector value is a sorted list of distinct lexemes, which are words that have been normalized to merge different variants of the same word. Sorting and deduplication are done automatically during input. The to_tsvector function is used to parse and normalize a document string. The to_tsvector function is used to parse and normalize a document string.

+

A tsvector value is a sorted list of distinct lexemes, which are words that have been formatted different entries. During segmentation, tsvector automatically performs duplicate-elimination to the entries for input in a certain order. For example:

+
1
+2
+3
+4
+5
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector;
+                      tsvector                      
+----------------------------------------------------
+ 'a' 'and' 'ate' 'cat' 'fat' 'mat' 'on' 'rat' 'sat'
+(1 row)
+
+ +
+

It can be seen from the preceding example that tsvector segments a string by spaces, and segmented lexemes are sorted based on their length and alphabetical order. To represent lexemes containing whitespace or punctuation, surround them with quotes:

+
1
+2
+3
+4
+5
SELECT $$the lexeme '    ' contains spaces$$::tsvector;
+                 tsvector                  
+-------------------------------------------
+ '    ' 'contains' 'lexeme' 'spaces' 'the'
+(1 row)
+
+ +
+

Use double dollar signs ($$) to mark entries containing single quotation marks (').

+
1
+2
+3
+4
+5
SELECT $$the lexeme 'Joe''s' contains a quote$$::tsvector;
+                    tsvector                    
+------------------------------------------------
+ 'Joe''s' 'a' 'contains' 'lexeme' 'quote' 'the'
+(1 row)
+
+ +
+

Optionally, integer positions can be attached to lexemes:

+
1
+2
+3
+4
+5
SELECT 'a:1 fat:2 cat:3 sat:4 on:5 a:6 mat:7 and:8 ate:9 a:10 fat:11 rat:12'::tsvector;
+                                   tsvector                                    
+-------------------------------------------------------------------------------
+ 'a':1,6,10 'and':8 'ate':9 'cat':3 'fat':2,11 'mat':7 'on':5 'rat':12 'sat':4
+(1 row)
+
+ +
+

A position normally indicates the source word's location in the document. Positional information can be used for proximity ranking. Position values range from 1 to 16383. The default maximum value is 16383. Duplicate positions for the same lexeme are discarded.

+

Lexemes that have positions can further be labeled with a weight, which can be A, B, C, or D. D is the default and hence is not shown on output:

+
1
+2
+3
+4
+5
SELECT 'a:1A fat:2B,4C cat:5D'::tsvector;
+          tsvector          
+----------------------------
+ 'a':1A 'cat':5 'fat':2B,4C
+(1 row)
+
+ +
+

Weights are typically used to reflect document structure, for example, by marking title words differently from body words. Text search ranking functions can assign different priorities to the different weight markers.

+

The following example is the standard usage of the tsvector type. For example:

+
1
+2
+3
+4
+5
SELECT 'The Fat Rats'::tsvector;
+      tsvector      
+--------------------
+ 'Fat' 'Rats' 'The'
+(1 row)
+
+ +
+

For most English-text-searching applications the above words would be considered non-normalized, which should usually be passed through to_tsvector to normalize the words appropriately for searching:

+
1
+2
+3
+4
+5
SELECT to_tsvector('english', 'The Fat Rats');
+   to_tsvector   
+-----------------
+ 'fat':2 'rat':3
+(1 row)
+
+ +
+
+

tsquery

The tsquery type represents a retrieval condition. A tsquery value stores lexemes that are to be searched for, and combines them honoring the Boolean operators & (AND), | (OR), and ! (NOT). Parentheses can be used to enforce grouping of the operators. The to_tsquery and plainto_tsquery functions will normalize lexemes before the lexemes are converted to the tsquery type.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
SELECT 'fat & rat'::tsquery;
+    tsquery    
+---------------
+ 'fat' & 'rat'
+(1 row)
+
+SELECT 'fat & (rat | cat)'::tsquery;
+          tsquery          
+---------------------------
+ 'fat' & ( 'rat' | 'cat' )
+(1 row)
+
+SELECT 'fat & rat & ! cat'::tsquery;
+        tsquery         
+------------------------
+ 'fat' & 'rat' & !'cat'
+(1 row)
+
+ +
+

In the absence of parentheses, ! (NOT) binds most tightly, and & (AND) binds more tightly than | (OR).

+

Lexemes in a tsquery can be labeled with one or more weight letters, which restrict them to match only tsvector lexemes with matching weights:

+
1
+2
+3
+4
+5
SELECT 'fat:ab & cat'::tsquery;
+     tsquery      
+------------------
+ 'fat':AB & 'cat'
+(1 row)
+
+ +
+

Also, lexemes in a tsquery can be labeled with * to specify prefix matching:

+
1
+2
+3
+4
+5
SELECT 'super:*'::tsquery;
+  tsquery  
+-----------
+ 'super':*
+(1 row)
+
+ +
+

This query will match any word in a tsvector that begins with "super".

+

Note that prefixes are first processed by text search configurations, which means the following example returns true:

+
1
+2
+3
+4
+5
SELECT to_tsvector( 'postgraduate' ) @@ to_tsquery( 'postgres:*' ) AS RESULT;
+  result  
+----------
+ t
+(1 row)
+
+ +
+

because postgres gets stemmed to postgr:

+
1
+2
+3
+4
+5
SELECT to_tsquery('postgres:*');
+ to_tsquery 
+------------
+ 'postgr':*
+(1 row)
+
+ +
+

which then matches postgraduate.

+

'Fat:ab & Cats' is normalized to the tsquery type as follows:

+
1
+2
+3
+4
+5
SELECT to_tsquery('Fat:ab & Cats');
+    to_tsquery    
+------------------
+ 'fat':AB & 'cat'
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0019.html b/docs/dws/dev/dws_06_0019.html new file mode 100644 index 00000000..cb4a20d9 --- /dev/null +++ b/docs/dws/dev/dws_06_0019.html @@ -0,0 +1,20 @@ + + +

UUID Type

+

The data type UUID stores Universally Unique Identifiers (UUID) as defined by RFC 4122, ISO/IEF 9834-8:2005, and related standards. This identifier is a 128-bit quantity that is generated by an algorithm chosen to make it very unlikely that the same identifier will be generated by anyone else in the known universe using the same algorithm.

+

Therefore, for distributed systems, these identifiers provide a better uniqueness guarantee than sequence generators, which are only unique within a single database.

+

A UUID is written as a sequence of lower-case hexadecimal digits, in several groups separated by hyphens, specifically a group of 8 digits followed by three groups of 4 digits followed by a group of 12 digits, for a total of 32 digits representing the 128 bits. An example of a UUID in this standard form is:

+
a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
+

GaussDB(DWS) also accepts the following alternative forms for input: use of upper-case letters and digits, the standard format surrounded by braces, omitting some or all hyphens, and adding a hyphen after any group of four digits. Examples

+
A0EEBC99-9C0B-4EF8-BB6D-6BB9BD380A11
+{a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11}
+a0eebc999c0b4ef8bb6d6bb9bd380a11
+a0ee-bc99-9c0b-4ef8-bb6d-6bb9-bd38-0a11
+

Output is always in the standard form.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0020.html b/docs/dws/dev/dws_06_0020.html new file mode 100644 index 00000000..8297aab4 --- /dev/null +++ b/docs/dws/dev/dws_06_0020.html @@ -0,0 +1,12 @@ + + +

JSON Types

+

JSON data types are for storing JavaScript Object Notation (JSON) data. Such data can also be stored as TEXT, but the JSON data type has the advantage of checking that each stored value is a valid JSON value.

+

For functions that support the JSON data type, see JSON Functions.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0021.html b/docs/dws/dev/dws_06_0021.html new file mode 100644 index 00000000..fffc972a --- /dev/null +++ b/docs/dws/dev/dws_06_0021.html @@ -0,0 +1,259 @@ + + +

HLL Data Types

+

HyperLoglog (HLL) is an approximation algorithm for efficiently counting the number of distinct values in a data set. It features faster computing and lower space usage. You only need to store HLL data structures, instead of data sets. When new data is added to a data set, make hash calculation on the data and insert the result to an HLL. Then, you can obtain the final result based on the HLL.

+

Table 1 compares HLL with other algorithms.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Comparison between HLL and other algorithms

Item

+

Sorting Algorithm

+

Hash Algorithm

+

HLL

+

Time complexity

+

O(nlogn)

+

O(n)

+

O(n)

+

Space complexity

+

O(n)

+

O(n)

+

1280 bytes

+

Error rate

+

0

+

0

+

≈2%

+

Storage space requirement

+

Size of raw data

+

Size of raw data

+

1280 bytes

+
+
+

HLL has advantages over others in the computing speed and storage space requirement. In terms of time complexity, the sorting algorithm needs O(nlogn) time for sorting, and the hash algorithm and HLL need O(n) time for full table scanning. In terms of storage space requirements, the sorting algorithm and hash algorithm need to store raw data before collecting statistics, whereas the HLL algorithm needs to store only the HLL data structures rather than the raw data, and thereby occupying a fixed space of only 1280 bytes.

+
  • In default specifications, the maximum number of distinct values is 1.6e plus 12, and the maximum error rate is only 2.3%. If a calculation result exceeds the maximum number, the error rate of the calculation result will increase, or the calculation will fail and an error will be reported.
  • When using this feature for the first time, you need to evaluate the distinct values of the service, properly select configuration parameters, and perform verification to ensure that the accuracy meets requirements.
    • When default parameter configuration is used, the calculated number of distinct values is 1.6e plus 12. If the calculated result is NaN, you need to adjust log2m and regwidth to accommodate more distinct values.
    • The hash algorithm has an extremely low probability of collision. However, you are still advised to select 2 or 3 hash seeds for verification when using the hash algorithm for the first time. If there is only a small difference between the distinct values, you can select any one of the seeds as the hash seed.
    +
+
+

Table 2 describes main HLL data structures.

+ +
+ + + + + + + +
Table 2 Main HLL data structures

Data Type

+

Description

+

hll

+

Its size is always 1280 bytes, which can be directly used to calculate the number of distinct values.

+
+
+

The following describes HLL application scenarios.

+
  • Scenario 1: "Hello World"

    The following example shows how to use the HLL data type:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    -- Create a table with the HLL data type:
    +create table helloworld (id integer, set hll);
    + 
    +-- Insert an empty HLL to the table:
    +insert into helloworld(id, set) values (1, hll_empty());
    + 
    +-- Add a hashed integer to the HLL:
    +update helloworld set set = hll_add(set, hll_hash_integer(12345)) where id = 1;
    +
    +-- Add a hashed string to the HLL:
    +update helloworld set set = hll_add(set, hll_hash_text('hello world')) where id = 1;
    + 
    +-- Obtain the number of distinct values of the HLL:
    +select hll_cardinality(set) from helloworld where id = 1;
    + hll_cardinality 
    +-----------------
    +               2
    +(1 row)
    +
    + +
    +
  • Scenario 2: Collect statistics about website visitors.

    The following example shows how an HLL collects statistics on the number of users visiting a website within a period of time:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    -- Create a raw data table to show that a user has visited the website at a certain time:
    +create table facts (
    +         date            date,
    +         user_id         integer
    +);
    + 
    +-- Construct data to show the users who have visited the website in a day:
    +insert into facts values ('2019-02-20', generate_series(1,100));
    +insert into facts values ('2019-02-21', generate_series(1,200));
    +insert into facts values ('2019-02-22', generate_series(1,300));
    +insert into facts values ('2019-02-23', generate_series(1,400));
    +insert into facts values ('2019-02-24', generate_series(1,500));
    +insert into facts values ('2019-02-25', generate_series(1,600));
    +insert into facts values ('2019-02-26', generate_series(1,700));
    +insert into facts values ('2019-02-27', generate_series(1,800));
    + 
    +-- Create another table and specify an HLL column:
    +create table daily_uniques (
    +    date            date UNIQUE,
    +    users           hll
    +);
    + 
    +-- Group data by date and insert the data into the HLL:
    +insert into daily_uniques(date, users)
    +    select date, hll_add_agg(hll_hash_integer(user_id))
    +    from facts
    +    group by 1;
    + 
    +-- Calculate the numbers of users visiting the website every day:
    +select date, hll_cardinality(users) from daily_uniques order by date;
    +        date         | hll_cardinality  
    +---------------------+------------------
    + 2019-02-20 00:00:00 |              100
    + 2019-02-21 00:00:00 | 203.813355588808
    + 2019-02-22 00:00:00 | 308.048239950384
    + 2019-02-23 00:00:00 | 410.529188080374
    + 2019-02-24 00:00:00 | 513.263875705319
    + 2019-02-25 00:00:00 | 609.271181107416
    + 2019-02-26 00:00:00 | 702.941844662509
    + 2019-02-27 00:00:00 | 792.249946595237
    +(8 rows)
    + 
    +-- Calculate the number of users who had visited the website in the week from February 20, 2019 to February 26, 2019:
    +select hll_cardinality(hll_union_agg(users)) from daily_uniques where date >= '2019-02-20'::date and date <= '2019-02-26'::date;
    + hll_cardinality  
    +------------------
    + 702.941844662509
    +(1 row)
    + 
    +-- Calculate the number of users who had visited the website yesterday but have not visited the website today:
    +SELECT date, (#hll_union_agg(users) OVER two_days) - #users AS lost_uniques FROM daily_uniques WINDOW two_days AS (ORDER BY date ASC ROWS 1 PRECEDING);                                                                                                             
    +        date         | lost_uniques 
    +---------------------+--------------
    + 2019-02-20 00:00:00 |            0
    + 2019-02-21 00:00:00 |            0
    + 2019-02-22 00:00:00 |            0
    + 2019-02-23 00:00:00 |            0
    + 2019-02-24 00:00:00 |            0
    + 2019-02-25 00:00:00 |            0
    + 2019-02-26 00:00:00 |            0
    + 2019-02-27 00:00:00 |            0
    +(8 rows)
    +
    + +
    +
  • Scenario 3: The data to be inserted does not meet the requirements of the HLL data structure.

    When inserting data into a column of the HLL type, ensure that the data meets the requirements of the HLL data structure. If the data does not meet the requirements after being parsed, an error will be reported. In the following example, E\\1234 to be inserted does not meet the requirements of the HLL data structure after being parsed. As a result, an error is reported.

    +
    1
    +2
    +3
    create table test(id integer, set hll);
    +insert into test values(1, 'E\\1234');
    +ERROR:  unknown schema version 4
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0022.html b/docs/dws/dev/dws_06_0022.html new file mode 100644 index 00000000..93aeac9f --- /dev/null +++ b/docs/dws/dev/dws_06_0022.html @@ -0,0 +1,236 @@ + + +

Object Identifier Types

+

Object identifiers (OIDs) are used internally by GaussDB(DWS) as primary keys for various system catalogs. OIDs are not added to user-created tables by the system. The OID type represents an object identifier.

+

The OID type is currently implemented as an unsigned four-byte integer. So, using a user-created table's OID column as a primary key is discouraged.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Object identifier types

Name

+

Reference

+

Description

+

Examples

+

OID

+

-

+

Numeric object identifier

+

564182

+

CID

+

-

+

A command identifier. This is the data type of the system columns cmin and cmax. Command identifiers are 32-bit quantities.

+

-

+

XID

+

-

+

A transaction identifier. This is the data type of the system columns xmin and xmax. Transaction identifiers are also 32-bit quantities.

+

-

+

TID

+

-

+

A row identifier. This is the data type of the system column ctid. A row ID is a pair (block number, tuple index within block) that identifies the physical location of the row within its table.

+

-

+

REGCONFIG

+

pg_ts_config

+

Text search configuration

+

english

+

REGDICTIONARY

+

pg_ts_dict

+

Text search dictionary

+

simple

+

REGOPER

+

pg_operator

+

Operator name

+

+

+

REGOPERATOR

+

pg_operator

+

Operator with argument types

+

*(integer,integer) or -(NONE,integer)

+

REGPROC

+

pg_proc

+

Indicates the name of the function.

+

sum

+

REGPROCEDURE

+

pg_proc

+

Function with argument types

+

sum(int4)

+

REGCLASS

+

pg_class

+

Relation name

+

pg_type

+

REGTYPE

+

pg_type

+

Data type name

+

integer

+
+
+

The OID type is used for a column in the database system catalog.

+

For example:

+
1
+2
+3
+4
+5
SELECT oid FROM pg_class WHERE relname = 'pg_type';
+ oid  
+------
+ 1247
+(1 row)
+
+ +
+

The alias type for OID is REGCLASS which allows simplified search for OID values.

+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
SELECT attrelid,attname,atttypid,attstattarget FROM pg_attribute WHERE attrelid = 'pg_type'::REGCLASS;
+ attrelid |  attname   | atttypid | attstattarget 
+----------+------------+----------+---------------
+     1247 | xc_node_id     |       23 |             0
+     1247 | tableoid       |       26 |             0
+     1247 | cmax           |       29 |             0
+     1247 | xmax           |       28 |             0
+     1247 | cmin           |       29 |             0
+     1247 | xmin           |       28 |             0
+     1247 | oid            |       26 |             0
+     1247 | ctid           |       27 |             0
+     1247 | typname        |       19 |            -1
+     1247 | typnamespace   |       26 |            -1
+     1247 | typowner       |       26 |            -1
+     1247 | typlen         |       21 |            -1
+     1247 | typbyval       |       16 |            -1
+     1247 | typtype        |       18 |            -1
+     1247 | typcategory    |       18 |            -1
+     1247 | typispreferred |       16 |            -1
+     1247 | typisdefined   |       16 |            -1
+     1247 | typdelim       |       18 |            -1
+     1247 | typrelid       |       26 |            -1
+     1247 | typelem        |       26 |            -1
+     1247 | typarray       |       26 |            -1
+     1247 | typinput       |       24 |            -1
+     1247 | typoutput      |       24 |            -1
+     1247 | typreceive     |       24 |            -1
+     1247 | typsend        |       24 |            -1
+     1247 | typmodin       |       24 |            -1
+     1247 | typmodout      |       24 |            -1
+     1247 | typanalyze     |       24 |            -1
+     1247 | typalign       |       18 |            -1
+     1247 | typstorage     |       18 |            -1
+     1247 | typnotnull     |       16 |            -1
+     1247 | typbasetype    |       26 |            -1
+     1247 | typtypmod      |       23 |            -1
+     1247 | typndims       |       23 |            -1
+     1247 | typcollation   |       26 |            -1
+     1247 | typdefaultbin  |      194 |            -1
+     1247 | typdefault     |       25 |            -1
+     1247 | typacl         |     1034 |            -1
+(38 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0023.html b/docs/dws/dev/dws_06_0023.html new file mode 100644 index 00000000..d30d72ec --- /dev/null +++ b/docs/dws/dev/dws_06_0023.html @@ -0,0 +1,127 @@ + + +

Pseudo-Types

+

GaussDB(DWS) has a number of special-purpose entries that are collectively called pseudo-types. A pseudo-type cannot be used as a column data type, but it can be used to declare a function's argument or result type.

+

Each of the available pseudo-types is useful in situations where a function's behavior does not correspond to simply taking or returning a value of a specific SQL data type. Table 1 lists all pseudo-types.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Pseudo-Types

Name

+

Description

+

any

+

Indicates that a function accepts any input data type.

+

anyelement

+

Indicates that a function accepts any data type.

+

anyarray

+

Indicates that a function accepts any array data type.

+

anynonarray

+

Indicates that a function accepts any non-array data type.

+

anyenum

+

Indicates that a function accepts any enum data type.

+

anyrange

+

Indicates that a function accepts any range data type.

+

cstring

+

Indicates that a function accepts or returns a null-terminated C string.

+

internal

+

Indicates that a function accepts or returns a server-internal data type.

+

language_handler

+

Indicates that a procedural language call handler is declared to return language_handler.

+

fdw_handler

+

Indicates that a foreign-data wrapper handler is declared to return fdw_handler.

+

record

+

Identifies a function returning an unspecified row type.

+

trigger

+

Indicates that a trigger function is declared to return trigger.

+

void

+

Indicates that a function returns no value.

+

opaque

+

Indicates an obsolete type name that formerly served all the above purposes.

+
+
+

Functions coded in C (whether built in or dynamically loaded) can be declared to accept or return any of these pseudo data types. It is up to the function author to ensure that the function will behave safely when a pseudo-type is used as an argument type.

+

Functions coded in procedural languages can use pseudo-types only as allowed by their implementation languages. At present the procedural languages all forbid use of a pseudo-type as argument type, and allow only void and record as a result type. Some also support polymorphic functions using the anyelement, anyarray, anynonarray, anyenum, and anyrange types.

+

The internal pseudo-type is used to declare functions that are meant only to be called internally by the database system, and not by direct call in an SQL query. If a function has at least one internal-type argument, it cannot be called from SQL. You are not advised to create any function that is declared to return internal unless the function has at least one internal argument.

+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
-- Create or replace the showall() function:
+CREATE OR REPLACE FUNCTION showall() RETURNS SETOF record
+AS $$ SELECT count(*) from tpcds.store_sales where ss_customer_sk = 9692; $$
+LANGUAGE SQL;
+
+-- Invoke the showall() function:
+SELECT showall();
+ showall 
+---------
+ (35)
+(1 row)
+
+-- Delete the function:
+DROP FUNCTION showall();
+
+ +
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0024.html b/docs/dws/dev/dws_06_0024.html new file mode 100644 index 00000000..a54bac2b --- /dev/null +++ b/docs/dws/dev/dws_06_0024.html @@ -0,0 +1,219 @@ + + +

Data Types Supported by Column-Store Tables

+

Table 1 lists the data types supported by column-store tables.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Data types supported by column-store tables

Category

+

Data Type

+

Length

+

Supported

+

Numeric types

+

smallint

+

2

+

Yes

+

integer

+

4

+

Yes

+

bigint

+

8

+

Yes

+

decimal

+

Variable length

+

Yes

+

numeric

+

Variable length

+

Yes

+

real

+

4

+

Yes

+

double precision

+

8

+

Yes

+

smallserial

+

2

+

Yes

+

serial

+

4

+

Yes

+

bigserial

+

8

+

Yes

+

Monetary types

+

money

+

8

+

Yes

+

Character types

+

character varying(n), varchar(n)

+

Variable length

+

Yes

+

character(n), char(n)

+

n

+

Yes

+

character, char

+

1

+

Yes

+

text

+

Variable length

+

Yes

+

nvarchar2

+

Variable length

+

Yes

+

name

+

64

+

No

+

Date/time types

+

timestamp with time zone

+

8

+

Yes

+

timestamp without time zone

+

8

+

Yes

+

date

+

4

+

Yes

+

time without time zone

+

8

+

Yes

+

time with time zone

+

12

+

Yes

+

interval

+

16

+

Yes

+

Large objects

+

clob

+

Variable length

+

Yes

+

blob

+

Variable length

+

No

+

Others

+

...

+

...

+

No

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0025.html b/docs/dws/dev/dws_06_0025.html new file mode 100644 index 00000000..98cbd1dc --- /dev/null +++ b/docs/dws/dev/dws_06_0025.html @@ -0,0 +1,78 @@ + + +

XML

+

XML data type stores Extensible Markup Language (XML) formatted data. Such data can also be stored as text, but the advantage of the XML data type is that it checks whether each stored value is a well-formed XML value. XML can store well-formed documents and content fragments defined by XML standards. A content fragment can have multiple top-level elements or character nodes.

+

For functions that support the XML data type, see XML Functions.

+

Configuring XML Parameters

The syntax is as follows:

+
1
+2
SET XML OPTION { DOCUMENT | CONTENT };
+SET xmloption TO { DOCUMENT | CONTENT };
+
+ +
+

If a string value is not converted to XML using the XMLPARSE or XMLSERIALIZE function, the XML OPTION session parameter determines the value, DOCUMENT or CONTENT.

+

The default value is CONTENT, indicating that all types of XML data are allowed.

+

Example:

+
1
+2
+3
+4
SET XML OPTION DOCUMENT;
+SET
+SET xmloption TO DOCUMENT;
+SET
+
+ +
+
+

Configuring Binary Data Encoding Format

Syntax:

+
+
1
SET xmlbinary TO { base64 | hex};
+
+ +
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
SET xmlbinary TO base64;
+SET
+
+SELECT xmlelement(name foo, bytea 'bar');
+xmlelement
+-----------------
+<foo>YmFy</foo>
+(1 row)
+
+SET xmlbinary TO hex;
+SET
+
+SELECT xmlelement(name foo, bytea 'bar');
+xmlelement
+-------------------
+<foo>626172</foo>
+(1 row)
+
+ +
+

Accessing XML Value

The XML data type is special, and it does not provide any comparison operators, because there is no general comparison algorithm for XML data, so you cannot retrieve data rows by comparing an XML value with a search value. An XML data entry is typically accompanied by an ID for retrieving. Alternatively, you can convert XML values into character strings. However, this is not widely applicable to common scenarios of XML value comparison.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0026.html b/docs/dws/dev/dws_06_0026.html new file mode 100644 index 00000000..daa0efaf --- /dev/null +++ b/docs/dws/dev/dws_06_0026.html @@ -0,0 +1,167 @@ + + +

Constant and Macro

+

Table 1 lists the constants and macros that can be used in GaussDB(DWS).

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Constants and macros

Parameter

+

Description

+

Examples

+

CURRENT_CATALOG

+

Specifies the current database.

+
1
+2
+3
+4
+5
SELECT CURRENT_CATALOG;
+current_database
+------------------
+gaussdb
+(1 row)
+
+ +
+

CURRENT_ROLE

+

Current role

+
1
+2
+3
+4
SELECT CURRENT_ROLE;
+current_user
+--------------
+(1 row)
+
+ +
+

CURRENT_SCHEMA

+

Current database model

+
1
+2
+3
+4
+5
SELECT CURRENT_SCHEMA;
+current_schema
+----------------
+public
+(1 row)
+
+ +
+

CURRENT_USER

+

Current user

+
1
+2
+3
+4
SELECT CURRENT_USER;
+current_user
+--------------
+(1 row)
+
+ +
+

LOCALTIMESTAMP

+

Current session time (without time zone)

+
1
+2
+3
+4
+5
SELECT LOCALTIMESTAMP;
+         timestamp
+----------------------------
+2015-10-10 15:37:30.968538
+(1 row)
+
+ +
+

NULL

+

This parameter is left blank.

+

-

+

+

SESSION_USER

+

Current system user

+
1
+2
+3
+4
SELECT SESSION_USER;
+session_user
+--------------
+(1 row)
+
+ +
+

SYSDATE

+

Current system date

+
1
+2
+3
+4
+5
SELECT SYSDATE;
+sysdate
+---------------------
+2015-10-10 15:48:53
+(1 row)
+
+ +
+

USER

+

Current user, also called CURRENT_USER

+
1
+2
+3
+4
SELECT USER;
+current_user
+--------------
+(1 row)
+
+ +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0027.html b/docs/dws/dev/dws_06_0027.html new file mode 100644 index 00000000..b3876486 --- /dev/null +++ b/docs/dws/dev/dws_06_0027.html @@ -0,0 +1,73 @@ + + +

Functions and Operators

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0028.html b/docs/dws/dev/dws_06_0028.html new file mode 100644 index 00000000..9ea45806 --- /dev/null +++ b/docs/dws/dev/dws_06_0028.html @@ -0,0 +1,96 @@ + + +

Logical Operators

+

The usual logical operators include AND, OR, and NOT. SQL uses a three-valued logical system with true, false, and null, which represents "unknown". Their priorities are NOT > AND > OR.

+

Table 1 lists operation rules, where a and b represent logical expressions.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Operation rules

a

+

b

+

a AND b Result

+

a OR b Result

+

NOT a Result

+

TRUE

+

TRUE

+

TRUE

+

TRUE

+

FALSE

+

TRUE

+

FALSE

+

FALSE

+

TRUE

+

FALSE

+

TRUE

+

NULL

+

NULL

+

TRUE

+

FALSE

+

FALSE

+

FALSE

+

FALSE

+

FALSE

+

TRUE

+

FALSE

+

NULL

+

FALSE

+

NULL

+

TRUE

+

NULL

+

NULL

+

NULL

+

NULL

+

NULL

+
+
+

The operators AND and OR are commutative, that is, you can switch the left and right operand without affecting the result.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0029.html b/docs/dws/dev/dws_06_0029.html new file mode 100644 index 00000000..7dcb5215 --- /dev/null +++ b/docs/dws/dev/dws_06_0029.html @@ -0,0 +1,54 @@ + + +

Comparison Operators

+

Comparison operators are available for all data types and return Boolean values.

+

All comparison operators are binary operators. Only data types that are the same or can be implicitly converted can be compared using comparison operators.

+

Table 1 describes comparison operators provided by GaussDB(DWS).

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Table 1 Comparison operators

Operators

+

Description

+

<

+

Less than

+

>

+

Greater than

+

<=

+

Less than or equal to

+

>=

+

Greater than or equal to

+

=

+

Equality

+

<> or !=

+

Inequality

+
+
+

Comparison operators are available for all relevant data types. All comparison operators are binary operators that returned values of Boolean type. Expressions like 1 < 2 < 3 are invalid. (Because there is no comparison operator to compare a Boolean value with 3.)

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0030.html b/docs/dws/dev/dws_06_0030.html new file mode 100644 index 00000000..bf898517 --- /dev/null +++ b/docs/dws/dev/dws_06_0030.html @@ -0,0 +1,1649 @@ + + +

Character Processing Functions and Operators

+

String functions and operators provided by GaussDB(DWS) are for concatenating strings with each other, concatenating strings with non-strings, and matching the patterns of strings.

+
  • bit_length(string)

    Description: Specifies the number of bits occupied by a string.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT bit_length('world');
    + bit_length
    +------------
    +         40
    +(1 row)
    +
    + +
    +
  • btrim(string text [, characters text])

    Description: Removes the longest string consisting only of characters in characters (a space by default) from the start and end of string.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT btrim('sring' , 'ing');
    + btrim
    +-------
    + sr
    +(1 row)
    +
    + +
    +
  • char_length(string) or character_length(string)

    Description: Number of characters in a string

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT char_length('hello');
    + char_length
    +-------------
    +           5
    +(1 row)
    +
    + +
    +
  • instr(text,text,int,int)

    Description: FROM int indicates the start position of the replacement in the first string. for int indicates the number of characters replaced in the first string.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT instr( 'abcdabcdabcd', 'bcd', 2, 2 );
    + instr
    +-------
    +     6
    +(1 row)
    +
    + +
    +
  • lengthb(text/bpchar)

    Description: Obtains the number of bytes of a specified string.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lengthb('hello');
    + lengthb
    +---------
    +       5
    +(1 row)
    +
    + +
    +
  • left(str text, n int)

    Description: Returns first n characters in the string.

    +
    • In the ORA- or TD-compatible mode, all but the last |n| characters are returned if n is negative.
    • In the MySQL-compatible mode, an empty string is returned if n is negative.
    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT left('abcde', 2);
    + left
    +------
    + ab
    +(1 row)
    +
    + +
    +
  • length(string bytea, encoding name )

    Description: Number of characters in string in the given encoding. The string must be valid in this encoding.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT length('jose', 'UTF8');
    + length
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • lpad(string text, length int [, fill text])

    Description: Fills up the string to the specified length by appending the characters fill (a space by default). If the string is already longer than length then it is truncated (on the right).

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lpad('hi', 5, 'xyza');
    + lpad  
    +-------
    + xyzhi
    +(1 row)
    +
    + +
    +
  • octet_length(string)

    Description: Number of bytes in a string

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT octet_length('jose');
    + octet_length
    +--------------
    +            4
    +(1 row)
    +
    + +
    +
  • overlay(string placing string FROM int [for int])

    Description: Replaces substring. FROM int indicates the start position of the replacement in the first string. for int indicates the number of characters replaced in the first string.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT overlay('hello' placing 'world' from 2 for 3 );
    + overlay 
    +---------
    + hworldo
    +(1 row)
    +
    + +
    +
  • position(substring in string)

    Description: Location of specified substring

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT position('ing' in 'string');
    + position
    +----------
    +        4
    +(1 row)
    +
    + +
    +
  • pg_client_encoding()

    Description: Current client encoding name

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_client_encoding();
    + pg_client_encoding
    +--------------------
    + UTF8
    +(1 row)
    +
    + +
    +
  • quote_ident(string text)

    Description: Returns the given string suitably quoted to be used as an identifier in an SQL statement string (quotation marks are used as required). Quotes are added only if necessary (that is, if the string contains non-identifier characters or would be case-folded). Embedded quotes are properly doubled.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_ident('hello world');
    + quote_ident
    +--------------
    + "hello world"
    +(1 row)
    +
    + +
    +
  • quote_literal(string text)

    Description: Returns the given string suitably quoted to be used as a string literal in an SQL statement string (quotation marks are used as required).

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal('hello');
    + quote_literal 
    +---------------
    + 'hello'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, text will be escaped.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal(E'O\'hello');
    + quote_literal
    +---------------
    + 'O''hello'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, backslash will be properly doubled.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal('O\hello');
    + quote_literal 
    +---------------
    + E'O\\hello'
    +(1 row)
    +
    + +
    +

    If the parameter is null, return NULL. If the parameter may be null, you are advised to use quote_nullable.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal(NULL);
    + quote_literal 
    +---------------
    +
    +(1 row)
    +
    + +
    +
  • quote_literal(value anyelement)

    Description: Coerces the given value to text and then quotes it as a literal.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal(42.5);
    + quote_literal 
    +---------------
    + '42.5'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, the given value will be escaped.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal(E'O\'42.5');
    + quote_literal
    +---------------
    + '0''42.5'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, backslash will be properly doubled.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_literal('O\42.5');
    + quote_literal 
    +---------------
    + E'O\\42.5'
    +(1 row)
    +
    + +
    +
  • quote_nullable(string text)

    Description: Returns the given string suitably quoted to be used as a string literal in an SQL statement string (quotation marks are used as required).

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable('hello');
    + quote_nullable 
    +----------------
    + 'hello'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, text will be escaped.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable(E'O\'hello');
    + quote_nullable
    +----------------
    + 'O''hello'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, backslash will be properly doubled.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable('O\hello');
    + quote_nullable
    +----------------
    + E'O\\hello'
    +(1 row)
    +
    + +
    +

    If the parameter is null, return NULL.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable(NULL);
    + quote_nullable
    +----------------
    + NULL
    +(1 row)
    +
    + +
    +
  • quote_nullable(value anyelement)

    Description: Converts the given value to text and then quotes it as a literal.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable(42.5);
    + quote_nullable
    +----------------
    + '42.5'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, the given value will be escaped.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable(E'O\'42.5');
    + quote_nullable 
    +----------------
    + 'O''42.5'
    +(1 row)
    +
    + +
    +

    If command similar to the following exists, backslash will be properly doubled.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable('O\42.5');
    + quote_nullable
    +----------------
    + E'O\\42.5'
    +(1 row)
    +
    + +
    +

    If the parameter is null, return NULL.

    +
    1
    +2
    +3
    +4
    +5
    SELECT quote_nullable(NULL);
    + quote_nullable
    +----------------
    + NULL
    +(1 row)
    +
    + +
    +
  • substring(string [from int] [for int])

    Description: Extracts a substring. from int indicates the start position of the truncation. for int indicates the number of characters truncated.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substring('Thomas' from 2 for 3);
    + substring
    +-----------
    + hom
    +(1 row)
    +
    + +
    +
  • substring(string from pattern)

    Description: Extracts substring matching POSIX regular expression. It returns the text that matches the pattern. If no match record is found, a null value is returned.

    +

    Return type: text

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    SELECT substring('Thomas' from '...$');
    + substring
    +-----------
    + mas
    +(1 row)
    +SELECT substring('foobar' from 'o(.)b');
    + result 
    +--------
    + o
    +(1 row)
    +SELECT substring('foobar' from '(o(.)b)');
    + result 
    +--------
    + oob
    +(1 row)
    +
    + +
    +

    If the POSIX pattern contains any parentheses, the portion of the text that matched the first parenthesized sub-expression (the one whose left parenthesis comes first) is returned. You can put parentheses around the whole expression if you want to use parentheses within it without triggering this exception.

    +
    +
  • substring(string from pattern for escape)

    Description: Extracts substring matching SQL regular expression. The specified pattern must match the entire data string, or else the function fails and returns null. To indicate the part of the pattern that should be returned on success, the pattern must contain two occurrences of the escape character followed by a double quote ("). The text matching the portion of the pattern between these markers is returned.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substring('Thomas' from '%#"o_a#"_' for '#');
    + substring
    +-----------
    + oma
    +(1 row)
    +
    + +
    +
  • rawcat(raw,raw)

    Description: Indicates the string concatenation functions.

    +

    Return type: raw

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rawcat('ab','cd');
    + rawcat
    +--------
    + ABCD
    +(1 row)
    +
    + +
    +
  • regexp_like(text,text,text)

    Description: Indicates the mode matching function of a regular expression.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_like('str','[ac]');
    + regexp_like
    +-------------
    + f
    +(1 row)
    +
    + +
    +
  • regexp_substr(text,text)

    Description: Extracts substrings from a regular expression. Its function is similar to substr. When a regular expression contains multiple parallel brackets, it also needs to be processed.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_substr('str','[ac]');
    + regexp_substr
    +---------------
    +
    +(1 row)
    +
    + +
    +
  • regexp_matches(string text, pattern text [, flags text])

    Description: Returns all captured substrings resulting from matching a POSIX regular expression against the string. If the pattern does not match, the function returns no rows. If the pattern contains no parenthesized sub-expressions, then each row returned is a single-element text array containing the substring matching the whole pattern. If the pattern contains parenthesized sub-expressions, the function returns a text array whose nth element is the substring matching the nth parenthesized sub-expression of the pattern.

    +

    The optional flags argument contains zero or multiple single-letter flags that change function behavior. i indicates that the matching is not related to uppercase and lowercase. g indicates that each matching substring is replaced, instead of replacing only the first one.

    +

    If the last parameter is provided but the parameter value is an empty string ('') and the SQL compatibility mode of the database is set to ORA, the returned result is an empty set. This is because the ORA compatible mode treats the empty string ('') as NULL. To resolve this problem, you can:

    +
    • Change the database SQL compatibility mode to TD.
    • Do not provide the last parameter or do not set the last parameter to an empty string.
    +
    +

    Return type: setof text[]

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    SELECT regexp_matches('foobarbequebaz', '(bar)(beque)');
    + regexp_matches
    +----------------
    + {bar,beque}
    +(1 row)
    +SELECT regexp_matches('foobarbequebaz', 'barbeque');
    + regexp_matches 
    +----------------
    + {barbeque}
    +(1 row)
    + SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g');
    +    result    
    +--------------
    + {bar,beque}
    + {bazil,barf}
    +(2 rows)
    +
    + +
    +
  • regexp_split_to_array(string text, pattern text [, flags text ])

    Description: Splits string using a POSIX regular expression as the delimiter. The regexp_split_to_array function behaves the same as regexp_split_to_table, except that regexp_split_to_array returns its result as an array of text.

    +

    Return type: text[]

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_split_to_array('hello world', E'\\s+');
    + regexp_split_to_array
    +-----------------------
    + {hello,world}
    +(1 row)
    +
    + +
    +
  • regexp_split_to_table(string text, pattern text [, flags text])

    Description: Splits string using a POSIX regular expression as the delimiter. If there is no match to the pattern, the function returns the string. If there is at least one match, for each match it returns the text from the end of the last match (or the beginning of the string) to the beginning of the match. When there are no more matches, it returns the text from the end of the last match to the end of the string.

    +

    The flags parameter is a text string containing zero or more single-letter flags that change the function's behavior. i indicates that the matching is not related to uppercase and lowercase. g indicates that each matching substring is replaced, instead of replacing only the first one.

    +

    Return type: setof text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT regexp_split_to_table('hello world', E'\\s+');
    + regexp_split_to_table
    +-----------------------
    + hello
    + world
    +(2 rows)
    +
    + +
    +
  • repeat(string text, number int )

    Description: text

    +

    Return type: string repeated for number times

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT repeat('Pg', 4);
    +  repeat
    +----------
    + PgPgPgPg
    +(1 row)
    +
    + +
    +
  • replace(string text, from text, to text)

    Description: Replaces all occurrences in string of substring from with substring to.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT replace('abcdefabcdef', 'cd', 'XXX');
    +    replace     
    +----------------
    + abXXXefabXXXef
    +(1 row)
    +
    + +
    +
+
  • reverse(str)

    Description: Returns reversed string.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT reverse('abcde');
    + reverse
    +---------
    + edcba
    +(1 row)
    +
    + +
    +
  • right(str text, n int)

    Description: Returns the last n characters in the string.

    +
    • In the ORA- or TD-compatible mode, all but the last |n| characters are returned if n is negative.
    • In the MySQL-compatible mode, an empty string is returned if n is negative.
    +

    Return type: text

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT right('abcde', 2);
    + right
    +-------
    + de
    +(1 row)
    +
    +SELECT right('abcde', -2);
    + right 
    +-------
    + cde
    +(1 row)
    +
    + +
    +
  • rpad(string text, length int [, fill text])

    Description: Fills up the string to length by appending the characters fill (a space by default). If the string is already longer than length then it is truncated.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rpad('hi', 5, 'xy');
    + rpad
    +-------
    + hixyx
    +(1 row)
    +
    + +
    +
  • rtrim(string text [, characters text])

    Description: Removes the longest string containing only characters from characters (a space by default) from the end of string.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rtrim('trimxxxx', 'x');
    + rtrim
    +-------
    + trim
    +(1 row)
    +
    + +
    +
  • sys_context ( 'namespace' , 'parameter')

    Description: Obtains and returns the parameter values of a specified namespace.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT SYS_CONTEXT ( 'postgres' , 'archive_mode');
    + sys_context
    +-------------
    +
    +(1 row)
    +
    + +
    +
  • substrb(text,int,int)

    Description: Extracts a substring. The first int indicates the start position of the subtraction. The second int indicates the number of characters subtracted.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substrb('string',2,3);
    + substrb
    +---------
    + tri
    +(1 row)
    +
    + +
    +
  • substrb(text,int)

    Description: Extracts a substring. int indicates the start position of the subtraction.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substrb('string',2);
    + substrb
    +---------
    + tring
    +(1 row)
    +
    + +
    +
  • string || string

    Description: Concatenates strings.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'MPP'||'DB' AS RESULT;
    + result 
    +--------
    + MPPDB
    +(1 row)
    +
    + +
    +
  • string || non-string or non-string || string

    Description: Concatenates strings and non-strings.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'Value: '||42 AS RESULT;
    +  result   
    +-----------
    + Value: 42
    +(1 row)
    +
    + +
    +
  • split_part(string text, delimiter text, field int)

    Description: Splits string on delimiter and returns the fieldth column (counting from text of the first appeared delimiter).

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT split_part('abc~@~def~@~ghi', '~@~', 2);
    + split_part
    +------------
    + def
    +(1 row)
    +
    + +
    +
  • strpos(string, substring)

    Description: Specifies the position of a substring. It is the same as position(substring in string). However, the parameter sequences of them are reversed.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT strpos('source', 'rc');
    + strpos
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • to_hex(number int or bigint)

    Description: Converts number to a hexadecimal expression.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_hex(2147483647);
    +  to_hex
    +----------
    + 7fffffff
    +(1 row)
    +
    + +
    +
  • translate(string text, from text, to text)

    Description: Any character in string that matches a character in the from set is replaced by the corresponding character in the to set. If from is longer than to, extra characters occurred in from are removed.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT translate('12345', '143', 'ax');
    + translate
    +-----------
    + a2x5
    +(1 row)
    +
    + +
    +
+
  • length(string)

    Description: Obtains the number of characters in a string.

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT length('abcd');
    + length 
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • lengthb(string)

    Description: Obtains the number of characters in a string. The value depends on character sets (GBK and UTF8).

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lengthb('hello');
    + lengthb 
    +---------
    +       5
    +(1 row)
    +
    + +
    +
  • substr(string,from)

    Description:

    +

    Extracts substrings from a string.

    +

    from indicates the start position of the extraction.

    +
    • If from starts at 0, the value 1 is used.
    • If the value of from is positive, all characters from from to the end are extracted.
    • If the value of from is negative, the last n characters in the string are extracted, in which n indicates the absolute value of from.
    +

    Return type: varchar

    +

    For example:

    +

    If the value of from is positive:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substr('ABCDEF',2);
    + substr
    +--------
    + BCDEF
    +(1 row)
    +
    + +
    +

    If the value of from is negative:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substr('ABCDEF',-2);
    + substr
    +--------
    + EF
    +(1 row)
    +
    + +
    +
  • substr(string,from,count)

    Description:

    +

    Extracts substrings from a string.

    +

    from indicates the start position of the extraction.

    +

    "count" indicates the length of the extracted substring.

    +
    • If from starts at 0, the value 1 is used.
    • If the value of from is positive, extract count characters starting from from.
    • If the value of from is negative, extract the last n count characters in the string, in which n indicates the absolute value of from.
    • If the value of "count" is smaller than 1, null is returned.
    +

    Return type: varchar

    +

    For example:

    +

    If the value of from is positive:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substr('ABCDEF',2,2);
    + substr 
    +--------
    + BC
    +(1 row)
    +
    + +
    +

    If the value of from is negative:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substr('ABCDEF',-3,2);
    + substr 
    +--------
    + DE
    +(1 row)
    +
    + +
    +
  • substrb(string,from)

    Description: The functionality of this function is the same as that of SUBSTR(string,from). However, the calculation unit is byte.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substrb('ABCDEF',-2);
    + substrb 
    +---------
    + EF
    +(1 row)
    +
    + +
    +
  • substrb(string,from,count)

    Description: The functionality of this function is the same as that of SUBSTR(string,from,count). However, the calculation unit is byte.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substrb('ABCDEF',2,2);
    + substrb 
    +---------
    + BC
    +(1 row)
    +
    + +
    +
  • trim([leading |trailing |both] [characters] from string)

    Description: Removes the longest string containing only the characters (a space by default) from the start/end/both ends of the string.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT trim(BOTH 'x' FROM 'xTomxx');
    + btrim
    +-------
    + Tom
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT trim(LEADING 'x' FROM 'xTomxx');
    + ltrim
    +-------
    + Tomxx
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT trim(TRAILING 'x' FROM 'xTomxx');
    + rtrim
    +-------
    + xTom
    +(1 row)
    +
    + +
    +
  • rtrim(string [, characters])

    Description: Removes the longest string containing only characters from characters (a space by default) from the end of string.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rtrim('TRIMxxxx','x');
    + rtrim
    +-------
    + TRIM
    +(1 row)
    +
    + +
    +
  • ltrim(string [, characters])

    Description: Removes the longest string containing only characters from characters (a space by default) from the start of string.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ltrim('xxxxTRIM','x');
    + ltrim
    +-------
    + TRIM
    +(1 row)
    +
    + +
    +
  • upper(string)

    Description: Converts the string into the uppercase.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT upper('tom');
    + upper
    +-------
    + TOM
    +(1 row)
    +
    + +
    +
  • lower(string)

    Description: Converts the string into the lowercase.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lower('TOM');
    + lower
    +-------
    + tom
    +(1 row)
    +
    + +
    +
  • rpad(string varchar, length int [, fill varchar])

    Description: Fills up the string to length by appending the characters fill (a space by default). If the string is already longer than length then it is truncated.

    +

    length in GaussDB(DWS) indicates the character length. One Chinese character is counted as one character.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rpad('hi',5,'xyza');
    + rpad
    +-------
    + hixyz
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT rpad('hi',5,'abcdefg');
    + rpad  
    +-------
    + hiabc
    +(1 row)
    +
    + +
    +
  • instr(string,substring[,position,occurrence])

    Description: Queries and returns the value of the substring position that occurs the occurrence (first by default) times from the position (1 by default) in the string.

    +
    • If the value of "position" is 0, 0 is returned.
    • If the value of position is negative, searches backwards from the last nth character in the string, in which n indicates the absolute value of position.
    +

    In this function, the calculation unit is character. One Chinese character is one character.

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT instr('corporate floor','or', 3);
    + instr 
    +-------
    +     5
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT instr('corporate floor','or',-3,2);
    + instr 
    +-------
    +     2
    +(1 row)
    +
    + +
    +
  • initcap(string)

    Description: The first letter of each word in the string is converted into the uppercase and the other letters are converted into the lowercase.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT initcap('hi THOMAS');
    +  initcap
    +-----------
    + Hi Thomas
    +(1 row)
    +
    + +
    +
  • ascii(string)

    Description: Indicates the ASCII code of the first character in the string.

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ascii('xyz');
    + ascii 
    +-------
    +   120
    +(1 row)
    +
    + +
    +
  • replace(string varchar, search_string varchar, replacement_string varchar)

    Description: Replaces all search-string in the string with replacement_string.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT replace('jack and jue','j','bl');
    +    replace     
    +----------------
    + black and blue
    +(1 row)
    +
    + +
    +
  • lpad(string varchar, length int[, repeat_string varchar])

    Description: Adds a series of repeat_string (a space by default) on the left of the string to generate a new string with the total length of n.

    +

    If the length of the string is longer than the specified length, the function truncates the string and returns the substrings with the specified length.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lpad('PAGE 1',15,'*.');
    +      lpad       
    +-----------------
    + *.*.*.*.*PAGE 1
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT lpad('hello world',5,'abcd');
    + lpad  
    +-------
    + hello
    +(1 row)
    +
    + +
    +
  • concat(str1,str2)

    Description: Connects str1 and str2 and returns the string.

    +
    • In the ORA- or TD-compatible mode, a combination of all the non-null strings is returned.
    • In the MySQL-compatible mode, NULL is returned if an input string is NULL.
    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT concat('Hello', ' World!');
    +    concat    
    +--------------
    + Hello World!
    +(1 row)
    +
    + +
    +
  • chr(integer)

    Description: Specifies the character of the ASCII code.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT chr(65);
    + chr
    +-----
    + A
    +(1 row)
    +
    + +
    +
  • regexp_substr(source_char, pattern)

    Description: Extracts substrings from a regular expression.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR";
    +  REGEXPR_SUBSTR   
    +-------------------
    + , Redwood Shores,
    +(1 row)
    +
    + +
    +
  • regexp_replace(string, pattern, replacement [,flags ])

    Description: Replaces substring matching POSIX regular expression. The source string is returned unchanged if there is no match to the pattern. If there is a match, the source string is returned with the replacement string substituted for the matching substring.

    +

    The replacement string can contain \n, where n is 1 through 9, to indicate that the source substring matching the nth parenthesized sub-expression of the pattern should be inserted, and it can contain \& to indicate that the substring matching the entire pattern should be inserted.

    +

    The optional flags argument contains zero or multiple single-letter flags that change function behavior. The following table lists the options of the flags argument.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Options of the flags argument

    Option

    +

    Description

    +

    g

    +

    Replace all the matched substrings. (By default, only the first matched substring is replaced.)

    +

    B

    +

    Preferentially use the boost regex regular expression library and its regular expression syntax. By default, the Henry Spencer's regular expression library and its regular expression syntax are used.

    +

    In the following cases, the Henry Spencer's regular expression library and its regular expression syntax will be used even if this option is specified:

    +
    • One or multiple characters of p, q, w, and x are specified for flags.
    • The string or pattern parameter contains multi-byte characters.
    +

    b

    +

    Use POSIX Basic Regular Expressions (BREs) for matching.

    +

    c

    +

    Case-sensitive matching

    +

    e

    +

    Use POSIX Extended Regular Expressions (EREs) for matching. If neither b nor e is specified and the Henry Spencer's regular expression library is used, Advanced Regular Expressions (AREs), similar to Perl Compatible Regular Expressions (PCREs), are used for matching; if neither b nor e is specified and the boost regex regular expression library is used, PCREs are used for matching.

    +

    i

    +

    Case-insensitive matching

    +

    m

    +

    Line feed-sensitive matching, which has the same meaning as option n

    +

    n

    +

    Line feed-sensitive matching. When this option takes effect, the line separator affects the matching of metacharacters (., ^, $, and [^).

    +

    p

    +

    Partial line feed-sensitive matching. When this option takes effect, the line separator affects the matching of metacharacters (. and [^).

    +

    q

    +

    Reset the regular expression to a text string enclosed in double quotation marks ("") and consisting of only common characters.

    +

    s

    +

    Non-line feed-sensitive matching

    +

    t

    +

    Compact syntax (default). When this option takes effect, all characters matter.

    +

    w

    +

    Reverse partial line feed-sensitive matching. When this option takes effect, the line separator affects the matching of metacharacters (^ and $).

    +

    x

    +

    Extended syntax In contrast to the compact syntax, whitespace characters in regular expressions are ignored in the extended syntax. Whitespace characters include spaces, horizontal tabs, new lines, and any other characters in the space character table.

    +
    +
    +

    Return type: varchar

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT regexp_replace('Thomas', '.[mN]a.', 'M');
    + regexp_replace
    +----------------
    + ThM
    +(1 row)
    +SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 'g') AS RESULT;                                                    
    +   result    
    +-------------
    + fooXarYXazY
    +(1 row)
    +
    + +
    +
  • concat_ws(sep text, str"any" [, str"any" [, ...] ])

    Description: The first parameter is used as the separator, which is associated with all following parameters.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT concat_ws(',', 'ABCDE', 2, NULL, 22);
    + concat_ws
    +------------
    + ABCDE,2,22
    +(1 row)
    +
    + +
    +
  • convert(string bytea, src_encoding name, dest_encoding name)

    Description: Converts the bytea string to dest_encoding. src_encoding specifies the source code encoding. The string must be valid in this encoding.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT convert('text_in_utf8', 'UTF8', 'GBK');
    +          convert        
    +----------------------------
    + \x746578745f696e5f75746638
    +(1 row)
    +
    + +
    +

    If the rule for converting between source to target encoding (for example, GBK and LATIN1) does not exist, the string is returned without conversion. See the pg_conversion system catalog for details.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    show server_encoding;
    + server_encoding 
    +-----------------
    + LATIN1
    +(1 row)
    +
    +SELECT convert_from('some text', 'GBK');
    + convert_from 
    +--------------
    + some text
    +(1 row)
    +
    +db_latin1=# SELECT convert_to('some text', 'GBK');
    +      convert_to      
    +----------------------
    + \x736f6d652074657874
    +(1 row)
    +
    +db_latin1=# SELECT convert('some text', 'GBK', 'LATIN1');
    +       convert        
    +----------------------
    + \x736f6d652074657874
    +(1 row)
    +
    + +
    +
    +
  • convert_from(string bytea, src_encoding name)

    Description: Converts the long bytea using the coding mode of the database.

    +

    src_encoding specifies the source code encoding. The string must be valid in this encoding.

    +

    Return type: text

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT convert_from('text_in_utf8', 'UTF8');
    + convert_from
    +--------------
    + text_in_utf8
    +(1 row)
    +SELECT convert_from('\x6461746162617365','gbk');
    + convert_from
    +--------------
    + database
    +(1 row)
    +
    + +
    +
  • convert_to(string text, dest_encoding name)

    Description: Converts string to dest_encoding.

    +

    Return type: bytea

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT convert_to('some text', 'UTF8');
    +      convert_to
    +----------------------
    + \x736f6d652074657874
    +(1 row)
    +SELECT convert_to('database', 'gbk');
    +     convert_to
    +--------------------
    + \x6461746162617365
    +(1 row)
    +
    + +
    +
  • string [NOT] LIKE pattern [ESCAPE escape-character]

    Description: Pattern matching function

    +

    If the pattern does not include a percentage sign (%) or an underscore (_), this mode represents itself only. In this case, the behavior of LIKE is the same as the equal operator. The underscore (_) in the pattern matches any single character while one percentage sign (%) matches no or multiple characters.

    +

    To match with underscores (_) or percent signs (%), corresponding characters in pattern must lead escape characters. The default escape character is a backward slash (\) and can be specified using the ESCAPE clause. To match with escape characters, enter two escape characters.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'AA_BBCC' LIKE '%A@_B%' ESCAPE '@' AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'AA_BBCC' LIKE '%A@_B%' AS RESULT;
    + result
    +--------
    + f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'AA@_BBCC' LIKE '%A@_B%' AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • REGEXP_LIKE(source_string, pattern [, match_parameter])

    Description: Indicates the mode matching function of a regular expression.

    +

    source_string indicates the source string and pattern indicates the matching pattern of the regular expression. match_parameter indicates the matching items and the values are as follows:

    +
    • "i": case-insensitive
    • "c": case-sensitive
    • "n": allowing the metacharacter "." in a regular expression to be matched with a linefeed.
    • "m": allows source_string to be regarded as multiple rows.
    +

    If match_parameter is ignored, case-sensitive is enabled by default, "." is not matched with a linefeed, and source_string is regarded as a single row.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_like('ABC', '[A-Z]');
    + regexp_like
    +-------------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_like('ABC', '[D-Z]');
    + regexp_like
    +-------------
    + f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_like('ABC', '[A-Z]','i');
    + regexp_like
    +-------------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT regexp_like('ABC', '[A-Z]');
    + regexp_like
    +-------------
    + t
    +(1 row)
    +
    + +
    +
  • format(formatstr text [, str"any" [, ...] ])

    Description: Formats a string.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT format('Hello %s, %1$s', 'World');
    +       format       
    +--------------------
    + Hello World, World
    +(1 row)
    +
    + +
    +
  • md5(string)

    Description: Encrypts a string in MD5 mode and returns a value in hexadecimal form.

    +

    MD5 is insecure and is not recommended.

    +
    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT md5('ABC');
    +               md5                
    +----------------------------------
    + 902fbdd2b1df0c4f70b4a5d23525e932
    +(1 row)
    +
    + +
    +
  • decode(string text, format text)

    Description: Decodes binary data from textual representation.

    +

    Return type: bytea

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT decode('ZGF0YWJhc2U=', 'base64');
    +    decode    
    +--------------
    + \x6461746162617365
    +(1 row)
    +
    +SELECT convert_from('\x6461746162617365','utf-8');
    + convert_from
    +--------------
    + database
    +(1 row)
    +
    + +
    +
  • encode(data bytea, format text)

    Description: Encodes binary data into a textual representation.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT encode('database', 'base64');
    +  encode  
    +----------
    + ZGF0YWJhc2U=
    +(1 row)
    +
    + +
    +
+
  • For a string containing newline characters, for example, a string consisting of a newline character and a space, the value of length and lengthb in GaussDB(DWS) is 2.
  • In GaussDB(DWS), n of the CHAR(n) type indicates the number of characters. Therefore, for multiple-octet coded character sets, the length returned by the LENGTHB function may be longer than n.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0031.html b/docs/dws/dev/dws_06_0031.html new file mode 100644 index 00000000..bd367d48 --- /dev/null +++ b/docs/dws/dev/dws_06_0031.html @@ -0,0 +1,179 @@ + + +

Binary String Functions and Operators

+

String operators

SQL defines some string functions that use keywords, rather than commas, to separate arguments.

+
  • octet_length(string)

    Description: Number of bytes in binary string

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT octet_length(E'jo\\000se'::bytea) AS RESULT;
    + result
    +--------
    +      5
    +(1 row)
    +
    + +
    +
  • overlay(string placing string from int [for int])

    Description: Replaces substring.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT overlay(E'Th\\000omas'::bytea placing E'\\002\\003'::bytea from 2 for 3) AS RESULT;
    +     result     
    +----------------
    + \x5402036d6173
    +(1 row)
    +
    + +
    +
  • position(substring in string)

    Description: Location of specified substring

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT position(E'\\000om'::bytea in E'Th\\000omas'::bytea) AS RESULT;
    + result
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • substring(string [from int] [for int])

    Description: Truncates substring.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT substring(E'Th\\000omas'::bytea from 2 for 3) AS RESULT; 
    +  result  
    +----------
    + \x68006f
    +(1 row)
    +
    + +
    +

    Truncate the time and obtain the number of hours.

    +
    1
    +2
    +3
    +4
    +5
    select substring('2022-07-18 24:38:15',12,2)AS RESULT;
    + result
    +-----------
    + 24
    +(1 row)
    +
    + +
    +
  • trim([both] bytes from string)

    Description: Removes the longest string containing only bytes from bytes from the start and end of string.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT trim(E'\\000'::bytea from E'\\000Tom\\000'::bytea) AS RESULT;
    +  result  
    +----------
    + \x546f6d
    +(1 row)
    +
    + +
    +
+
+

Other Binary String Functions

GaussDB(DWS) also provides the common syntax used for invoking functions.

+
  • btrim(string bytea,bytes bytea)

    Description: Removes the longest string containing only bytes from bytes from the start and end of string.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT btrim(E'\\000trim\\000'::bytea, E'\\000'::bytea) AS RESULT;
    +   result   
    +------------
    + \x7472696d
    +(1 row)
    +
    + +
    +
  • get_bit(string, offset)

    Description: Extracts bit from string.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT get_bit(E'Th\\000omas'::bytea, 45) AS RESULT; 
    + result
    +--------
    +      1
    +(1 row)
    +
    + +
    +
  • get_byte(string, offset)

    Description: Extracts byte from string.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT get_byte(E'Th\\000omas'::bytea, 4) AS RESULT; 
    + result
    +--------
    +    109
    +(1 row)
    +
    + +
    +
  • set_bit(string,offset, newvalue)

    Description: Sets bit in string.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT set_bit(E'Th\\000omas'::bytea, 45, 0) AS RESULT; 
    +      result      
    +------------------
    + \x5468006f6d4173
    +(1 row)
    +
    + +
    +
  • set_byte(string,offset, newvalue)

    Description: Sets byte in string.

    +

    Return type: bytea

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT set_byte(E'Th\\000omas'::bytea, 4, 64) AS RESULT; 
    +      result      
    +------------------
    + \x5468006f406173
    +(1 row)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0032.html b/docs/dws/dev/dws_06_0032.html new file mode 100644 index 00000000..6401ae89 --- /dev/null +++ b/docs/dws/dev/dws_06_0032.html @@ -0,0 +1,164 @@ + + +

Bit String Functions and Operators

+

Bit string operators

Aside from the usual comparison operators, the following operators can be used. Bit string operands of &, |, and # must be of equal length. When bit shifting, the original length of the string is preserved by zero padding (if necessary).

+
  • ||

    Description: Connects bit strings.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' || B'011' AS RESULT;
    +  result
    +----------
    + 10001011
    +(1 row)
    +
    + +
    +
  • &

    Description: AND operation between bit strings

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' & B'01101' AS RESULT;
    + result 
    +--------
    + 00001
    +(1 row)
    +
    + +
    +
  • |

    Description: OR operation between bit strings

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' | B'01101' AS RESULT;
    + result 
    +--------
    + 11101
    +(1 row)
    +
    + +
    +
  • #

    Description: OR operation between bit strings if they are inconsistent. If the same positions in the two bit strings are both 1 or 0, the position returns 0.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' # B'01101' AS RESULT;
    + result 
    +--------
    + 11100
    +(1 row)
    +
    + +
    +
  • ~

    Description: NOT operation between bit strings

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ~B'10001'AS RESULT;
    + result  
    +----------
    + 01110
    +(1 row)
    +
    + +
    +
  • <<

    Description: binary left shift

    +
    For example:
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' << 3 AS RESULT;
    + result  
    +----------
    + 01000
    +(1 row)
    +
    + +
    +
    +
  • >>

    Description: binary right shift

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT B'10001' >> 2 AS RESULT;
    + result  
    +----------
    + 00100
    +(1 row)
    +
    + +
    +
+
+

The following SQL-standard functions work on bit strings as well as character strings: length, bit_length, octet_length, position, substring, and overlay.

+

The following functions work on bit strings as well as binary strings: get_bit and set_bit. When working with a bit string, these functions number the first (leftmost) bit of the string as bit 0.

+
In addition, it is possible to convert between integral values and type bit. For example:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
SELECT 44::bit(10) AS RESULT;
+   result
+------------
+ 0000101100
+(1 row)
+
+SELECT 44::bit(3) AS RESULT;
+ result 
+--------
+ 100
+(1 row)
+
+SELECT cast(-44 as bit(12)) AS RESULT;
+    result    
+--------------
+ 111111010100
+(1 row)
+
+SELECT '1110'::bit(4)::integer AS RESULT;
+ result 
+--------
+     14
+(1 row)
+
+ +
+
+

Casting to just "bit" means casting to bit(1), and so will deliver only the least significant bit of the integer.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0033.html b/docs/dws/dev/dws_06_0033.html new file mode 100644 index 00000000..a7f21fdb --- /dev/null +++ b/docs/dws/dev/dws_06_0033.html @@ -0,0 +1,334 @@ + + +

Pattern Matching Operators

+

There are three separate approaches to pattern matching provided by the database: the traditional SQL LIKE operator, the more recent SIMILAR TO operator, and POSIX-style regular expressions. Besides these basic operators, functions can be used to extract or replace matching substrings and to split a string at matching locations.

+
  • LIKE

    Description: checks whether the string matches the mode string following LIKE. The LIKE expression returns true if the string matches the supplied pattern. (As expected, the NOT LIKE expression returns false if LIKE returns true, and vice versa.

    +
    Matching rule:
    1. This operator can succeed only when its pattern matches the entire string. If you want to match a sequence in any position within the string, the pattern must begin and end with a percent sign.
    2. The underscore (_) represents (matching) any single character. Percentage (%) indicates the wildcard character of any string.
    3. To match a literal underscore or percent sign without matching other characters, the respective character in pattern must be preceded by the escape character. The default escape character is the backslash but a different one can be selected by using the ESCAPE clause.
    4. To match the escape character itself, write two escape characters. For example: To write a pattern constant containing a backslash (\), you need to enter two backslashes in SQL statements.

      When standard_conforming_strings is set to off, any backslashes you write in literal string constants will need to be doubled. Therefore, writing a pattern matching a single backslash is actually going to write four backslashes in the statement. You can avoid this by selecting a different escape character by using ESCAPE, so that the backslash is no longer a special character of LIKE. But the backslash is still the special character of the character text analyzer, so you still need two backslashes.) You can also select no escape character by writing ESCAPE ''. This effectively disables the escape mechanism, which makes it impossible to turn off the special meaning of underscore and percent signs in the pattern.

      +
      +
    5. The keyword ILIKE can be used instead of LIKE to make the match case-insensitive.
    6. Operator ~~ is equivalent to LIKE, and operator ~~* corresponds to ILIKE.
    +
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' LIKE 'abc' AS RESULT;
    + result
    +-----------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' LIKE 'a%' AS RESULT;
    + result
    +-----------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' LIKE '_b_' AS RESULT;
    + result
    +-----------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' LIKE 'c' AS RESULT;
    + result
    +-----------
    + f
    +(1 row)
    +
    + +
    +
  • SIMILAR TO

    Description: The SIMILAR TO operator returns true or false depending on whether the pattern matches the given string. It is similar to LIKE, except that it interprets the pattern using the SQL standard's definition of a regular expression.

    +
    Matching rule:
    1. Like LIKE, this operator succeeds only when its pattern matches the entire string. If you want to match a sequence in any position within the string, the pattern must begin and end with a percent sign.
    2. The underscore (_) represents (matching) any single character. Percentage (%) indicates the wildcard character of any string.
    3. SIMILAR TO supports these pattern-matching metacharacters borrowed from POSIX regular expressions: +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

      Metacharacter

      +

      Description

      +

      |

      +

      Specifies alternation (either of two alternatives).

      +

      *

      +

      Specifies repetition of the previous item zero or more times.

      +

      +

      +

      Specifies repetition of the previous item one or more times.

      +

      ?

      +

      Specifies repetition of the previous item zero or one time.

      +

      {m}

      +

      Specifies repetition of the previous item exactly m times.

      +

      {m,}

      +

      Specifies repetition of the previous item m or more times.

      +

      {m,n}

      +

      Specifies repetition of the previous item at least m times and does not exceed n times.

      +

      ()

      +

      Specifies that parentheses () can be used to group items into a single logical item.

      +

      [...]

      +

      Specifies a character class, just as in POSIX regular expressions.

      +
      +
      +
    4. A preamble escape character disables the special meaning of any of these metacharacters. The rules for using escape characters are the same as those for LIKE.
    +
    +

    Regular expressions:

    +

    The substring function with three parameters, substring(string from pattern for escape), provides extraction of a substring that matches an SQL regular expression pattern.

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' SIMILAR TO 'abc' AS RESULT;
    + result
    +-----------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' SIMILAR TO 'a' AS RESULT;
    + result
    +-----------
    + f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' SIMILAR TO '%(b|d)%' AS RESULT;
    + result
    +-----------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' SIMILAR TO '(b|c)%'  AS RESULT;
    + result
    +-----------
    + f
    +(1 row)
    +
    + +
    +
  • POSIX regular expressions

    Description: A regular expression is a character sequence that is an abbreviated definition of a set of strings (a regular set). If a string is a member of a regular expression described by a regular expression, the string matches the regular expression. POSIX regular expressions provide a more powerful means for pattern matching than the LIKE and SIMILAR TO operators. Table 1 Regular expression match operators lists all available operators for pattern matching using POSIX regular expressions.

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Regular expression match operators

    Operator

    +

    Description

    +

    Example

    +

    ~

    +

    Matches regular expression, which is case-sensitive.

    +

    'thomas' ~ '.*thomas.*'

    +

    ~*

    +

    Matches regular expression, which is case-insensitive.

    +

    'thomas' ~* '.*Thomas.*'

    +

    ! ~

    +

    Does not match regular expression, which is case-sensitive.

    +

    'thomas' !~ '.*Thomas.*'

    +

    ! ~*

    +

    Does not match regular expression, which is case-insensitive.

    +

    'thomas' !~* '.*vadim.*'

    +
    +
    +
    Matching rule:
    1. Unlike LIKE patterns, a regular expression is allowed to match anywhere within a string, unless the regular expression is explicitly anchored to the beginning or end of the string.
    2. Besides the metacharacters mentioned above, POSIX regular expressions also support the following pattern matching metacharacters: +
      + + + + + + + + + + + + + +

      Metacharacter

      +

      Description

      +

      ^

      +

      Specifies the match starting with a string.

      +

      $

      +

      Specifies the match at the end of a string.

      +

      .

      +

      Matches any single character.

      +
      +
      +
    +
    +

    Regular expressions:

    +
    POSIX regular expressions support the following functions:
    • The substring(string from pattern) function provides a method for extracting a substring that matches the POSIX regular expression pattern.
    • The regexp_replace function provides the function of replacing the substring matching the POSIX regular expression pattern with the new text.
    • The regexp_matches function returns a text array consisting of all captured substrings that match a POSIX regular expression pattern.
    • The regexp_split_to_table function splits a string using a POSIX regular expression pattern as a delimiter.
    • The regexp_split_to_array function behaves the same as regexp_split_to_table, except that regexp_split_to_array returns its result as an array of text.

      The regular expression split functions ignore zero-length matches, which occur at the beginning or end of a string or after the previous match. This is contrary to the strict definition of regular expression matching. The latter is implemented by regexp_matches, but the former is usually the most commonly used behavior in practice.

      +
      +
    +
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     SELECT 'abc' ~ 'Abc' AS RESULT;
    +result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' ~* 'Abc' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' !~ 'Abc' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc'!~* 'Abc' AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' ~ '^a' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' ~ '(b|d)'AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 'abc' ~ '^(b|c)'AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +

    Although most regular expression searches can be executed quickly, the time and memory for regular expression processing can still be manually controlled. It is not recommended that you accept the regular expression search mode from the non-security mode source. If you must do this, you are advised to add the statement timeout limit. The search with the SIMILAR TO mode has the same security risks as the SIMILAR TO provides many capabilities that are the same as those of the POSIX- style regular expression. The LIKE search is much simpler than the other two options. Therefore, it is more secure to accept the non-secure mode source search.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0034.html b/docs/dws/dev/dws_06_0034.html new file mode 100644 index 00000000..6b658bcd --- /dev/null +++ b/docs/dws/dev/dws_06_0034.html @@ -0,0 +1,844 @@ + + +

Mathematical Functions and Operators

+

Numeric operators

  • +

    Description: Addition

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 2+3 AS RESULT;
    + result 
    +--------
    +      5
    +(1 row)
    +
    + +
    +
  • -

    Description: Subtraction

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 2-3 AS RESULT;
    + result 
    +--------
    +     -1
    +(1 row)
    +
    + +
    +
  • *

    Description: multiply

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 2*3 AS RESULT;
    + result 
    +--------
    +      6
    +(1 row)
    +
    + +
    +
  • /

    Description: Division (The result is not rounded.)

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 4/2 AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT 4/3 AS RESULT;
    +      result      
    +------------------
    + 1.33333333333333
    +(1 row)
    +
    + +
    +
  • +/-

    Description: Positive/negative

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT -2 AS RESULT;
    + result 
    +--------
    +     -2
    +(1 row)
    +
    + +
    +
  • %

    Description: Model (to obtain the remainder)

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 5%4 AS RESULT;
    + result 
    +--------
    +      1
    +(1 row)
    +
    + +
    +
  • @

    Description: Absolute value

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT @ -5.0 AS RESULT;
    + result 
    +--------
    +    5.0
    +(1 row)
    +
    + +
    +
  • ^

    Description: Power (exponent calculation)

    +

    In MySQL-compatible mode, this operator means exclusive or. For details, see operator # in Bit String Functions and Operators.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 2.0^3.0 AS RESULT;
    +       result       
    +--------------------
    + 8.0000000000000000
    +(1 row)
    +
    + +
    +
  • |/

    Description: Square root

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT |/ 25.0 AS RESULT;
    + result 
    +--------
    +      5
    +(1 row)
    +
    + +
    +
  • ||/

    Description: Cubic root

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ||/ 27.0 AS RESULT;
    + result 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • !

    Description: Factorial

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 5! AS RESULT;
    + result 
    +--------
    +    120
    +(1 row)
    +
    + +
    +
  • !!

    Description: Factorial (prefix operator)

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT !!5 AS RESULT;
    + result 
    +--------
    +    120
    +(1 row)
    +
    + +
    +
  • &

    Description: Binary AND

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 91&15  AS RESULT;
    + result 
    +--------
    +     11
    +(1 row)
    +
    + +
    +
  • |

    Description: Binary OR

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 32|3  AS RESULT;
    + result 
    +--------
    +     35
    +(1 row)
    +
    + +
    +
  • #

    Description: Binary XOR

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 17#5  AS RESULT;
    + result 
    +--------
    +     20
    +(1 row)
    +
    + +
    +
  • ~

    Description: Binary NOT

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ~1 AS RESULT;
    + result 
    +--------
    +     -2
    +(1 row)
    +
    + +
    +
  • <<

    Description: Binary shift left

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 1<<4 AS RESULT;
    + result 
    +--------
    +     16
    +(1 row)
    +
    + +
    +
  • >>

    Description: Binary shift right

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 8>>2 AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
+
+

Numeric operation functions

  • abs(x)

    Description: Absolute value

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT abs(-17.4);
    + abs
    +------
    + 17.4
    +(1 row)
    +
    + +
    +
  • acos(x)

    Description: Arc cosine

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT acos(-1);
    +       acos       
    +------------------
    + 3.14159265358979
    +(1 row)
    +
    + +
    +
  • asin(x)

    Description: Arc sine

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT asin(0.5);
    +       asin       
    +------------------
    + .523598775598299
    +(1 row)
    +
    + +
    +
  • atan(x)

    Description: Arc tangent

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT atan(1);
    +       atan       
    +------------------
    + .785398163397448
    +(1 row)
    +
    + +
    +
  • atan2(y, x)

    Description: Arc tangent of y/x

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT atan2(2, 1);
    +      atan2
    +------------------
    + 1.10714871779409
    +(1 row)
    +
    + +
    +
  • bitand(integer, integer)

    Description: Performs AND (&) operation on two integers.

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT bitand(127, 63);
    + bitand 
    +--------
    +     63
    +(1 row)
    +
    + +
    +
  • cbrt(dp)

    Description: Cubic root

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT cbrt(27.0);
    + cbrt
    +------
    +    3
    +(1 row)
    +
    + +
    +
  • ceil(x)

    Description: Minimum integer greater than or equal to the parameter

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ceil(-42.8);
    + ceil 
    +------
    +  -42
    +(1 row)
    +
    + +
    +
  • ceiling(dp or numeric)

    Description: Minimum integer (alias of ceil) greater than or equal to the parameter

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ceiling(-95.3);
    + ceiling
    +---------
    +     -95
    +(1 row)
    +
    + +
    +
  • cos(x)

    Description: Cosine

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT cos(-3.1415927);
    +        cos        
    +-------------------
    + -.999999999999999
    +(1 row)
    +
    + +
    +
  • cot(x)

    Description: Cotangent

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT cot(1);
    +       cot
    +------------------
    + .642092615934331
    +(1 row)
    +
    + +
    +
  • degrees(dp)

    Description: Converts radians to angles.

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT degrees(0.5);
    +     degrees
    +------------------
    + 28.6478897565412
    +(1 row)
    +
    + +
    +
  • div(y numeric, x numeric)

    Description: Integer part of y/x

    +

    Return type: numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT div(9,4);
    + div
    +-----
    +   2
    +(1 row)
    +
    + +
    +
  • exp(x)

    Description: Natural exponent

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT exp(1.0);
    +        exp         
    +--------------------
    + 2.7182818284590452
    +(1 row)
    +
    + +
    +
  • floor(x)

    Description: Not larger than the maximum integer of the parameter

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT floor(-42.8);
    + floor 
    +-------
    +   -43
    +(1 row)
    +
    + +
    +
  • radians(dp)

    Description: Converts angles to radians.

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT radians(45.0);
    +     radians
    +------------------
    + .785398163397448
    +(1 row)
    +
    + +
    +
  • random()

    Description: Random number between 0.0 and 1.0

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT random();
    +      random
    +------------------
    + .824823560658842
    +(1 row)
    +
    + +
    +
  • ln(x)

    Description: Natural logarithm

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ln(2.0);
    +        ln         
    +-------------------
    + .6931471805599453
    +(1 row)
    +
    + +
    +
  • log(x)

    Description: Logarithm with 10 as the base

    +
    • In the ORA- or TD-compatible mode, this operator means the logarithm with 10 as the base.
    • In the MySQL-compatible mode, this operator means the natural logarithm.
    +

    Return type: same as the input

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    -- ORA-compatible mode
    +SELECT log(100.0);
    +        log         
    +--------------------
    + 2.0000000000000000
    +(1 row)
    +-- TD-compatible mode
    +SELECT log(100.0);
    +        log
    +--------------------
    + 2.0000000000000000
    +(1 row)
    +-- MySQL-compatible mode
    +SELECT log(100.0);
    +        log
    +--------------------
    + 4.6051701859880914
    +(1 row)
    +
    + +
    +
  • log(b numeric, x numeric)

    Description: Logarithm with b as the base

    +

    Return type: numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT log(2.0, 64.0);
    +        log         
    +--------------------
    + 6.0000000000000000
    +(1 row)
    +
    + +
    +
  • mod(x,y)

    Description:

    +

    Remainder of x/y (model)

    +

    If x equals to 0, y is returned.

    +

    Return type: same as the parameter type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT mod(9,4);
    + mod 
    +-----
    +   1
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT mod(9,0);
    + mod 
    +-----
    +   9
    +(1 row)
    +
    + +
    +
  • pi()

    Description: π constant value

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pi();
    +        pi
    +------------------
    + 3.14159265358979
    +(1 row)
    +
    + +
    +
  • power(a double precision, b double precision)

    Description: b power of a

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT power(9.0, 3.0);
    +        power         
    +----------------------
    + 729.0000000000000000
    +(1 row)
    +
    + +
    +
  • round(x)

    Description: Integer closest to the input parameter

    +

    Return type: same as the input

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT round(42.4);
    + round 
    +-------
    +    42
    +(1 row)
    +
    +SELECT round(42.6);
    + round 
    +-------
    +    43
    +(1 row)
    +
    + +
    +

    When the round function is invoked, the numeric type is rounded to zero. While on most computers, the real number and the double-precision number are rounded to the nearest even number.

    +
    +
  • round(v numeric, s int)

    Description: s digits are kept after the decimal point.

    +

    Return type: numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT round(42.4382, 2);
    + round
    +-------
    + 42.44
    +(1 row)
    +
    + +
    +
  • setseed(dp)

    Description: Sets seed for the following random() invoking (between -1.0 and 1.0, inclusive).

    +

    Return type: void

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT setseed(0.54823);
    + setseed
    +---------
    +
    +(1 row)
    +
    + +
    +
  • sign(x)

    Description: returns symbols of this parameter.

    +

    The return value type:-1 indicates negative. 0 indicates 0, and 1 indicates a positive number.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sign(-8.4);
    + sign 
    +------
    +   -1
    +(1 row)
    +
    + +
    +
  • sin(x)

    Description: Sine

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sin(1.57079);
    +       sin        
    +------------------
    + .999999999979986
    +(1 row)
    +
    + +
    +
  • sqrt(x)

    Description: Square root

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sqrt(2.0);
    +       sqrt        
    +-------------------
    + 1.414213562373095
    +(1 row)
    +
    + +
    +
  • tan(x)

    Description: Tangent

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT tan(20);
    +       tan        
    +------------------
    + 2.23716094422474
    +(1 row)
    +
    + +
    +
  • trunc(x)

    Description: truncates (the integral part).

    +

    Return type: same as the input

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT trunc(42.8);
    + trunc 
    +-------
    +    42
    +(1 row)
    +
    + +
    +
  • trunc(v numeric, s int)

    Description: Truncates a number with s digits after the decimal point.

    +

    Return type: numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT trunc(42.4382, 2);
    + trunc
    +-------
    + 42.43
    +(1 row)
    +
    + +
    +
  • width_bucket(op numeric, b1 numeric, b2 numeric, count int)

    Description: Returns a bucket to which the operand will be assigned in an equidepth histogram with count buckets, ranging from b1 to b2.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT width_bucket(5.35, 0.024, 10.06, 5);
    + width_bucket
    +--------------
    +            3
    +(1 row)
    +
    + +
    +
  • width_bucket(op dp, b1 dp, b2 dp, count int)

    Description: Returns a bucket to which the operand will be assigned in an equidepth histogram with count buckets, ranging from b1 to b2.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT width_bucket(5.35, 0.024, 10.06, 5);
    + width_bucket
    +--------------
    +            3
    +(1 row)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0035.html b/docs/dws/dev/dws_06_0035.html new file mode 100644 index 00000000..5bcaba80 --- /dev/null +++ b/docs/dws/dev/dws_06_0035.html @@ -0,0 +1,1463 @@ + + +

Date and Time Processing Functions and Operators

+

Date and Time Operators

When the user uses date/time operators, explicit type prefixes are modified for corresponding operands to ensure that the operands parsed by the database are consistent with what the user expects, and no unexpected results occur.

+

For example, abnormal mistakes will occur in the following example without an explicit data type.

+
1
SELECT date '2001-10-01' - '7' AS RESULT;
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Time and date operators

Operators

+

Examples

+

+

+

Add a date with an integer to obtain the date after 7 days.

+
1
+2
+3
+4
+5
SELECT date '2001-09-28' + integer '7' AS RESULT;
+       result        
+---------------------
+ 2001-10-05 00:00:00
+(1 row)
+
+ +
+

Add a date with an interval to obtain the time after 1 hour.

+
1
+2
+3
+4
+5
SELECT date '2001-09-28' + interval '1 hour' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 01:00:00
+(1 row)
+
+ +
+

Add a date with a time to obtain a specific time.

+
1
+2
+3
+4
+5
SELECT date '2001-09-28' + time '03:00' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 03:00:00
+(1 row)
+
+ +
+

Add a date with an interval to obtain the time after one month.

+

If the sum or subtraction results fall beyond the date range of a month, the result will be rounded to the last day of the month.

+
1
+2
+3
+4
+5
SELECT date '2021-01-31' + interval '1 month' AS RESULT;
+       result
+---------------------
+ 2021-02-28 00:00:00
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT date '2021-02-28' + interval '1 month' AS RESULT;
+       result
+---------------------
+ 2021-03-28 00:00:00
+(1 row)
+
+ +
+

Add two intervals to obtain the sum.

+
1
+2
+3
+4
+5
SELECT interval '1 day' + interval '1 hour' AS RESULT;
+     result     
+----------------
+ 1 day 01:00:00
+(1 row)
+
+ +
+

Add a timestamp with an interval to obtain the time after 23 hours.

+
1
+2
+3
+4
+5
SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;
+       result        
+---------------------
+ 2001-09-29 00:00:00
+(1 row)
+
+ +
+

Add a time with an interval to obtain the time after three hours.

+
1
+2
+3
+4
+5
SELECT time '01:00' + interval '3 hours' AS RESULT;
+  result  
+----------
+ 04:00:00
+(1 row)
+
+ +
+

-

+

Subtract a date from another to obtain the difference.

+
1
+2
+3
+4
+5
SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;
+ result 
+--------
+ 3 days
+(1 row)
+
+ +
+

Subtract an integer from a date, the return is a timestamp type.

+
1
+2
+3
+4
+5
SELECT date '2001-10-01' - integer '7' AS RESULT;
+       result        
+---------------------
+ 2001-09-24 00:00:00
+(1 row)
+
+ +
+

Subtract an interval from a date to obtain the time difference.

+
1
+2
+3
+4
+5
SELECT date '2001-09-28' - interval '1 hour' AS RESULT;
+       result        
+---------------------
+ 2001-09-27 23:00:00
+(1 row)
+
+ +
+

Subtract a time from another time to obtain the time difference.

+
1
+2
+3
+4
+5
SELECT time '05:00' - time '03:00' AS RESULT;
+  result  
+----------
+ 02:00:00
+(1 row)
+
+ +
+

Subtract an interval from a time to obtain the time difference.

+
1
+2
+3
+4
+5
SELECT time '05:00' - interval '2 hours' AS RESULT;
+  result  
+----------
+ 03:00:00
+(1 row)
+
+ +
+

Subtract an interval from a timestamp to obtain the date difference.

+
1
+2
+3
+4
+5
SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;
+       result        
+---------------------
+ 2001-09-28 00:00:00
+(1 row)
+
+ +
+

Subtract an interval from another interval to obtain the time difference.

+
1
+2
+3
+4
+5
SELECT interval '1 day' - interval '1 hour' AS RESULT;
+  result  
+----------
+ 23:00:00
+(1 row)
+
+ +
+

Subtract a timestamp from another timestamp to obtain the time difference.

+
1
+2
+3
+4
+5
SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;
+     result     
+----------------
+ 1 day 15:00:00
+(1 row)
+
+ +
+

Obtain the time at the previous day.

+
1
+2
+3
+4
+5
select now() - interval '1 day'AS RESULT;
+           result
+-------------------------------
+ 2022-08-08 01:46:15.555406+00
+(1 row)
+
+ +
+

*

+

Multiply an interval by a quantity:

+
1
+2
+3
+4
+5
SELECT 900 * interval '1 second' AS RESULT;
+  result  
+----------
+ 00:15:00
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT 21 * interval '1 day' AS RESULT;
+ result  
+---------
+ 21 days
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT double precision '3.5' * interval '1 hour' AS RESULT;
+  result  
+----------
+ 03:30:00
+(1 row)
+
+ +
+

/

+

Divide an interval by a quantity to obtain a time segment.

+
1
+2
+3
+4
+5
SELECT interval '1 hour' / double precision '1.5' AS RESULT;
+  result  
+----------
+ 00:40:00
+(1 row)
+
+ +
+
+
+

Time/Date functions

  • age(timestamp, timestamp)

    Description: Subtracts arguments, producing a result in YYYY-MM-DD format. If the result is negative, the returned result is also negative.

    +

    Return type: interval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT age(timestamp '2001-04-10', timestamp '1957-06-13');
    +           age           
    +-------------------------
    + 43 years 9 mons 27 days
    +(1 row)
    +
    + +
    +
  • age(timestamp)

    Description: Subtracts from current_date

    +

    Return type: interval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT age(timestamp '1957-06-13');
    +           age           
    +-------------------------
    + 60 years 2 mons 18 days
    +(1 row)
    +
    + +
    +
  • timestampdiff(field, timestamp1, timestamp2)

    Description: Subtracts timestamp1 from timestamp2 and returns the difference in the unit of field. If the difference is negative, this function returns it normally. The field can be day, month, quarter, day, week, hour, minute, second, or microsecond.

    +

    Return type: bigint

    +

    For example:

    +
    SELECT timestampdiff(day, timestamp '2001-02-01', timestamp '2003-05-01 12:05:55');
    + timestampdiff 
    +---------------
    +      819
    +(1 row)
    +
  • clock_timestamp()

    Description: Specifies the current timestamp of the real-time clock.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT clock_timestamp();
    +        clock_timestamp        
    +-------------------------------
    + 2017-09-01 16:57:36.636205+08
    +(1 row)
    +
    + +
    +
  • current_date

    Description: Current date

    +

    Return type: date

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_date;
    +    date    
    +------------
    + 2017-09-01
    +(1 row)
    +
    + +
    +
  • current_time

    Description: Current time

    +

    Return type: time with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_time;
    +       timetz       
    +--------------------
    + 16:58:07.086215+08
    +(1 row)
    +
    + +
    +
  • current_timestamp

    Description: Specifies the current date and time.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_timestamp;
    +       pg_systimestamp        
    +------------------------------
    + 2017-09-01 16:58:19.22173+08
    +(1 row)
    +
    + +
    +
  • date_part(text, timestamp)

    Description:

    +

    Description: Obtains the hour.

    +

    Equivalent to extract(field from timestamp).

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT date_part('hour', timestamp '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +        20
    +(1 row)
    +
    + +
    +
  • date_part(text, interval)

    Description:

    +

    Obtains the month. If the value is greater than 12, obtain the remainder after it is divided by 12.

    +

    Equivalent to extract(field from timestamp).

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT date_part('month', interval '2 years 3 months');
    + date_part 
    +-----------
    +         3
    +(1 row)
    +
    + +
    +
  • date_trunc(text, timestamp)

    Description: Truncates to the precision specified by text.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT date_trunc('hour', timestamp  '2001-02-16 20:38:40');
    +     date_trunc      
    +---------------------
    + 2001-02-16 20:00:00
    +(1 row)
    +
    + +
    +
  • trunc(timestamp)

    Description: By default, the data is intercepted by day.

    +

    For example:

    +
    1
    +2
    +3
    +4
    SELECT trunc(timestamp  '2001-02-16 20:38:40');                                                                                                                                                                   trunc
    +---------------------
    +2001-02-16 00:00:00
    +(1 row)
    +
    + +
    +
  • extract(field from timestamp)

    Description: Obtains the hour.

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT extract(hour from timestamp '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +        20
    +(1 row)
    +
    + +
    +
  • extract(field from interval)

    Description: Obtains the month. If the value is greater than 12, obtain the remainder after it is divided by 12.

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT extract(month from interval '2 years 3 months');
    + date_part 
    +-----------
    +         3
    +(1 row)
    +
    + +
    +
  • isfinite(date)

    Description: Tests for valid date.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isfinite(date '2001-02-16');
    + isfinite 
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • isfinite(timestamp)

    Description: Tests for valid timestamp.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isfinite(timestamp '2001-02-16 21:28:30');
    + isfinite 
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • isfinite(interval)

    Description: Tests for valid interval.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isfinite(interval '4 hours');
    + isfinite 
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • justify_days(interval)

    Description: Adjusts interval to 30-day time periods are represented as months

    +

    Return type: interval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT justify_days(interval '35 days');
    + justify_days 
    +--------------
    + 1 mon 5 days
    +(1 row)
    +
    + +
    +
  • justify_hours(interval)

    Description: Adjusts interval to 24-hour time periods are represented as days

    +

    Return type: interval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS');
    + justify_hours  
    +----------------
    + 1 day 03:00:00
    +(1 row)
    +
    + +
    +
  • justify_interval(interval)

    Description: Adjusts interval using justify_days and justify_hours.

    +

    Return type: interval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR');
    + justify_interval 
    +------------------
    + 29 days 23:00:00
    +(1 row)
    +
    + +
    +
  • localtime

    Description: Current time

    +

    Return type: time

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT localtime AS RESULT;
    +     result
    +----------------
    + 16:05:55.664681
    +(1 row)
    +
    + +
    +
  • localtimestamp

    Description: Specifies the current date and time.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT localtimestamp;
    +         timestamp          
    +----------------------------
    + 2017-09-01 17:03:30.781902
    +(1 row)
    +
    + +
    +
  • now()

    Description: Timestamp indicating the start of the current transaction.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT now();
    +              now              
    +-------------------------------
    + 2017-09-01 17:03:42.549426+08
    +(1 row)
    +
    + +
    +
  • numtodsinterval(num, interval_unit)

    Description: Converts a number to the interval type. num is a numeric-typed number. interval_unit is a string in the following format: 'DAY' | 'HOUR' | 'MINUTE' | 'SECOND'

    +

    You can set the IntervalStyle parameter to oracle to be compatible with the interval output format of the function in the Oracle database.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    SELECT numtodsinterval(100, 'HOUR');
    + numtodsinterval 
    +-----------------
    + 100:00:00
    +(1 row)
    +
    +SET intervalstyle = oracle;
    +SET
    +SELECT numtodsinterval(100, 'HOUR');
    +        numtodsinterval
    +-------------------------------
    + +000000004 04:00:00.000000000
    +(1 row)
    +
    + +
    +
  • pg_sleep(seconds)

    Description: Specifies the delay time of the server thread in unit of second.

    +

    Return type: void

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_sleep(10);
    + pg_sleep 
    +----------
    +
    +(1 row)
    +
    + +
    +
  • statement_timestamp()

    Description: Specifies the current date and time.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT statement_timestamp();
    +      statement_timestamp      
    +-------------------------------
    + 2017-09-01 17:04:39.119267+08
    +(1 row)
    +
    + +
    +
  • sysdate

    Description: Specifies the current date and time.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sysdate;
    +       sysdate       
    +---------------------
    + 2017-09-01 17:04:49
    +(1 row)
    +
    + +
    +
  • timeofday()

    Description: Current date and time (like clock_timestamp, but returned as a text string)

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT timeofday();
    +              timeofday              
    +-------------------------------------
    + Fri Sep 01 17:05:01.167506 2017 CST
    +(1 row)
    +
    + +
    +
  • transaction_timestamp()

    Description: Current date and time (equivalent to current_timestamp)

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT transaction_timestamp();
    +     transaction_timestamp     
    +-------------------------------
    + 2017-09-01 17:05:13.534454+08
    +(1 row)
    +
    + +
    +
  • add_months(d,n)

    Description: Calculates the time point day and time of nth months.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM dual;
    +     add_months      
    +---------------------
    + 2018-04-29 00:00:00
    +(1 row)
    +
    + +
    +
  • last_day(d)

    Description: Calculates the time of the last day in the month.

    +
    • In the ORA- or TD-compatible mode, the return type is timestamp.
    • In the MySQL-compatible mode, the return type is date.
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result;
    +     cal_result      
    +---------------------
    + 2017-01-31 00:00:00
    +(1 row)
    +
    + +
    +
+
+
  • next_day(x,y)

    Description: Calculates the time of the next week y started from x

    +
    • In the ORA- or TD-compatible mode, the return type is timestamp.
    • In the MySQL-compatible mode, the return type is date.
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result;
    +     cal_result      
    +---------------------
    + 2017-05-28 00:00:00
    +(1 row)
    +
    + +
    +
  • to_days(timestamp)

    Description: Returns the number of days from the first day of year 0 to a specified date.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_days(timestamp '2008-10-07');
    + to_days
    +---------
    +  733687
    +(1 row)
    +
    + +
    +
+

EXTRACT

EXTRACT(field FROM source)

+

The extract function retrieves subcolumns such as year or hour from date/time values. source must be a value expression of type timestamp, time, or interval. (Expressions of type date are cast to timestamp and can therefore be used as well.) field is an identifier or string that selects what column to extract from the source value. The extract function returns values of type double precision. The following are valid field names:

+
  • century

    Century

    +

    The first century starts at 0001-01-01 00:00:00 AD. This definition applies to all Gregorian calendar countries. There is no century number 0. You go from -1 century to 1 century.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');
    + date_part 
    +-----------
    +        20
    +(1 row)
    +
    + +
    +
  • day
    • For timestamp values, the day (of the month) column (1–31)
      1
      +2
      +3
      +4
      +5
      SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
      + date_part 
      +-----------
      +        16
      +(1 row)
      +
      + +
      +
    • For interval values, the number of days
      1
      +2
      +3
      +4
      +5
      SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute');
      + date_part 
      +-----------
      +        40
      +(1 row)
      +
      + +
      +
    +
  • decade

    Year column divided by 10

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +       200
    +(1 row)
    +
    + +
    +
  • dow

    Day of the week as Sunday(0) to Saturday (6)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +         5
    +(1 row)
    +
    + +
    +
  • doy

    Day of the year (1–365 or 366)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +        47
    +(1 row)
    +
    + +
    +
  • epoch
    • For timestamp with time zone values, the number of seconds since 1970-01-01 00:00:00 UTC (can be negative);

      for date and timestamp values, the number of seconds since 1970-01-01 00:00:00 local time;

      +

      for interval values, the total number of seconds in the interval.

      +
      1
      +2
      +3
      +4
      +5
      SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08');
      +  date_part   
      +--------------
      + 982384720.12
      +(1 row)
      +
      + +
      +
      1
      +2
      +3
      +4
      +5
      SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours');
      + date_part 
      +-----------
      +    442800
      +(1 row)
      +
      + +
      +
    • Way to convert an epoch value back to a timestamp
      1
      +2
      +3
      +4
      +5
      SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT;
      +          result          
      +---------------------------
      + 2001-02-17 12:38:40.12+08
      +(1 row)
      +
      + +
      +
    +
  • hour

    Hour column (0–23)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +        20
    +(1 row)
    +
    + +
    +
  • isodow

    Day of the week (1–7)

    +

    Monday is 1 and Sunday is 7.

    +

    This is identical to dow except for Sunday.

    +
    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
    + date_part 
    +-----------
    +         7
    +(1 row)
    +
    + +
    +
  • isoyear

    The ISO 8601 year that the date falls in (not applicable to intervals).

    +

    Each ISO year begins with the Monday of the week containing the 4th of January, so in early January or late December the ISO year may be different from the Gregorian year. See the week column for more information.

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01');
    + date_part 
    +-----------
    +      2005
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02');
    + date_part 
    +-----------
    +      2006
    +(1 row)
    +
    + +
    +
  • microseconds

    The seconds column, including fractional parts, multiplied by 1,000,000

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
    + date_part 
    +-----------
    +  28500000
    +(1 row)
    +
    + +
    +
  • millennium

    Millennium

    +

    Years in the 1900s are in the second millennium. The third millennium started from January 1, 2001.

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +         3
    +(1 row)
    +
    + +
    +
  • milliseconds

    The seconds column, including fractional parts, multiplied by 1000. Note that this includes full seconds.

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
    + date_part 
    +-----------
    +     28500
    +(1 row)
    +
    + +
    +
  • minute

    Minutes column (0–59)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +        38
    +(1 row)
    +
    + +
    +
  • month

    For timestamp values, the number of the month within the year (1–12);

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +         2
    +(1 row)
    +
    + +
    +

    For interval values, the number of months, modulo 12 (0–11)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months');
    + date_part 
    +-----------
    +         1
    +(1 row)
    +
    + +
    +
  • quarter

    Quarter of the year (1–4) that the date is in

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +         1
    +(1 row)
    +
    + +
    +
  • second

    Seconds column, including fractional parts (0–59)

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(SECOND FROM TIME '17:12:28.5');
    + date_part 
    +-----------
    +      28.5
    +(1 row)
    +
    + +
    +
  • timezone

    The time zone offset from UTC, measured in seconds. Positive values correspond to time zones east of UTC, negative values to zones west of UTC.

    +
  • timezone_hour

    The hour component of the time zone offset

    +
  • timezone_minute

    The minute component of the time zone offset

    +
  • week

    The number of the week of the year that the day is in. By definition (ISO 8601), the first week of a year contains January 4 of that year. (The ISO-8601 week starts on Monday.) In other words, the first Thursday of a year is in week 1 of that year.

    +

    Because of this, it is possible for early January dates to be part of the 52nd or 53rd week of the previous year, and late December dates to be part of the 1st week of the next year. For example, 2005-01-01 is part of the 53rd week of year 2004, 2006-01-01 is part of the 52nd week of year 2005, and 2012-12-31 is part of the 1st week of year 2013. You are advised to use the columns isoyear and week together to ensure consistency.

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +         7
    +(1 row)
    +
    + +
    +
  • year

    Year column

    +
    1
    +2
    +3
    +4
    +5
    SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
    + date_part 
    +-----------
    +      2001
    +(1 row)
    +
    + +
    +
+
+

date_part

The date_part function is modeled on the traditional Ingres equivalent to the SQL-standard function extract:

+

date_part('field', source)

+

Note that the field must be a string, rather than a name. The valid field names are the same as those for extract. For details, see EXTRACT.

+

For example:

+
1
+2
+3
+4
+5
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
+ date_part 
+-----------
+        16
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
+ date_part 
+-----------
+         4
+(1 row)
+
+ +
+
+

date_format

date_format(timestamp, fmt)

+

Converts a date into a string in the format specified by fmt.

+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
SELECT date_format('2009-10-04 22:23:00', '%M %D %W');
+    date_format
+--------------------
+ October 4th Sunday
+(1 row)
+SELECT date_format('2021-02-20 08:30:45', '%Y-%m-%d %H:%i:%S');
+     date_format
+---------------------
+ 2021-02-20 08:30:45
+(1 row)
+SELECT date_format('2021-02-20 18:10:15', '%r-%T');
+     date_format
+----------------------
+ 06:10:15 PM-18:10:15
+(1 row)
+
+ +
+

The following table describes the patterns of date parameter values. They can be used for the date_format, time_format, str_to_date, str_to_time, and from_unixtime functions.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Output formats of date_format

Format

+

Description

+

Value

+

%a

+

Abbreviated week name

+

Sun...Sat

+

%b

+

Abbreviated month name

+

Jan...Dec

+

%c

+

Month

+

0...12

+

%D

+

Date with a suffix

+

0th, 1st, 2nd, 3rd, ...

+

%d

+

Day in a month (two digits)

+

00...31

+

%e

+

Day in a month

+

0...31

+

%f

+

Microsecond

+

000000...999999

+

%H

+

Hour, in 24-hour format

+

00...23

+

%h

+

Hour, in 12-hour format

+

01...12

+

%I

+

Hour, in 12-hour format, same as %h

+

01...12

+

%i

+

Minute

+

00...59

+

%j

+

Day in a year

+

001...366

+

%k

+

Hour, in 24-hour format, same as %H

+

0...23

+

%l

+

Hour, in 12-hour format, same as %h

+

1...12

+

%M

+

Month name

+

January...December

+

%m

+

Month (two digits)

+

00...12

+

%p

+

Morning and afternoon

+

AM PM

+

%r

+

Time, in 12-hour format

+

hh::mm::ss AM/PM

+

%S

+

Second

+

00...59

+

%s

+

Second, same as %S

+

00...59

+

%T

+

Time, in 24-hour format

+

hh::mm::ss

+

%U

+

Week (Sunday is the first day of a week)

+

00...53

+

%u

+

Week (Monday is the first day of a week)

+

00...53

+

%V

+

Week (Sunday is the first day of a week). It is used together with %X.

+

01...53

+

%v

+

Week (Monday is the first day of a week). It is used together with %x.

+

01...53

+

%W

+

Week name

+

Sunday...Saturday

+

%w

+

Day of a week. The value is 0 for Sunday.

+

0...6

+

%X

+

Year (four digits). It is used together with %V. Sunday is the first day of a week.

+

-

+

%x

+

Year (four digits). It is used together with %v. Monday is the first day of a week.

+

-

+

%Y

+

Year (four digits)

+

-

+

%y

+

Year (two digits)

+

-

+

%%

+

Character '%'

+

Character '%'

+

%x

+

'x': any character apart from the preceding ones

+

Character 'x'

+
+
+

In the preceding table, %U, %u, %V, %v, %X, and %x are not supported currently.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0036.html b/docs/dws/dev/dws_06_0036.html new file mode 100644 index 00000000..eff228f5 --- /dev/null +++ b/docs/dws/dev/dws_06_0036.html @@ -0,0 +1,846 @@ + + +

Type Conversion Functions

+

Type Conversion Functions

  • cast(x as y)

    Description: Converts x into the type specified by y.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT cast('22-oct-1997' as timestamp);
    +      timestamp      
    +---------------------
    + 1997-10-22 00:00:00
    +(1 row)
    +
    + +
    +
  • hextoraw(string)

    Description: Converts a string in hexadecimal format into binary format.

    +

    Return type: raw

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hextoraw('7D');
    + hextoraw 
    +----------
    + 7D
    +(1 row)
    +
    + +
    +
  • numtoday(numeric)

    Description: Converts values of the number type into the timestamp of the specified type.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numtoday(2);
    + numtoday
    +----------
    + 2 days
    +(1 row)
    +
    + +
    +
  • pg_systimestamp()

    Description: Obtains the system timestamp.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_systimestamp();
    +        pg_systimestamp
    +-------------------------------
    + 2015-10-14 11:21:28.317367+08
    +(1 row)
    +
    + +
    +
  • rawtohex(string)

    Description: Converts a string in binary format into hexadecimal format.

    +

    The result is the ACSII code of the input characters in hexadecimal format.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT rawtohex('1234567');
    +    rawtohex    
    +----------------
    + 31323334353637
    +(1 row)
    +
    + +
    +
  • to_char (datetime/interval [, fmt])

    Description: Converts a DATETIME or INTERVAL value of the DATE/TIMESTAMP/TIMESTAMP WITH TIME ZONE/TIMESTAMP WITH LOCAL TIME ZONE type into the VARCHAR type according to the format specified by fmt.

    +
    • The optional parameter fmt includes the following types: date, time, week, quarter, and century. Each type has a unique template. The templates can be combined together. Common templates include: HH, MM, SS, YYYY, MM, and DD. For details, see Table 2.
    • A template may have a modification word. FM is a common modification word and is used to suppress the preceding zero or the following blank spaces.
    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(current_timestamp,'HH12:MI:SS');
    + to_char  
    +----------
    + 10:19:26
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(current_timestamp,'FMHH12:FMMI:FMSS');
    + to_char  
    +----------
    + 10:19:46
    +(1 row)
    +
    + +
    +
  • to_char(double precision, text)

    Description: Converts the values of the double-precision type into the strings in the specified format.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(125.8::real, '999D99');
    + to_char 
    +---------
    +  125.80
    +(1 row)
    +
    + +
    +
  • to_char (integer/number[, fmt])

    Descriptions: Converts an integer or a value in floating point format into a string in specified format.

    +
    • The optional parameter fmt includes the following types: decimal characters, grouping characters, positive/negative sign and currency sign. Each type has a unique template. The templates can be combined together. Common templates include: 9, 0, millesimal sign (,), and decimal point (.). For details, see Table 1.
    • A template can have a modification word, similar to FM. However, FM does not suppress 0 which is output according to the template.
    • Use the template X or x to convert an integer value into a string in hexadecimal format.
    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(1485,'9,999');
    + to_char 
    +---------
    +  1,485
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char( 1148.5,'9,999.999');
    +  to_char   
    +------------
    +  1,148.500
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(148.5,'990999.909');
    +   to_char   
    +-------------
    +    0148.500
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(123,'XXX');
    + to_char 
    +---------
    +   7B
    +(1 row)
    +
    + +
    +
  • to_char(interval, text)

    Description: Converts the values of the time interval type into the strings in the specified format.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(interval '15h 2m 12s', 'HH24:MI:SS');
    + to_char
    +----------
    + 15:02:12
    +(1 row)
    +
    + +
    +
  • to_char(int, text)

    Description: Converts the values of the integer type into the strings in the specified format.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(125, '999');
    + to_char
    +---------
    +  125
    +(1 row)
    +
    + +
    +
  • to_char(numeric, text)

    Description: Converts the values of the numeric type into the strings in the specified format.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(-125.8, '999D99S');
    + to_char
    +---------
    + 125.80-
    +(1 row)
    +
    + +
    +
  • to_char (string)

    Description: Converts the CHAR/VARCHAR/VARCHAR2/CLOB type into the VARCHAR type.

    +

    If this function is used to convert data of the CLOB type, and the value to be converted exceeds the value range of the target type, an error is returned.

    +

    Return type: varchar

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char('01110');
    + to_char
    +---------
    + 01110
    +(1 row)
    +
    + +
    +
  • to_char(timestamp, text)

    Description: Converts the values of the timestamp type into the strings in the specified format.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_char(current_timestamp, 'HH12:MI:SS');
    + to_char
    +----------
    + 10:55:59
    +(1 row)
    +
    + +
    +
  • to_clob(char/nchar/varchar/nvarchar/varchar2/nvarchar2/text/raw)

    Description: Convert the RAW type or text character set type CHAR/NCHAR/VARCHAR/VARCHAR2/NVARCHAR2/TEXT into the CLOB type.

    +

    Return type: clob

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('ABCDEF'::RAW(10));
    + to_clob 
    +---------
    + ABCDEF
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('hello111'::CHAR(15));
    + to_clob  
    +----------
    + hello111
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('gauss123'::NCHAR(10));
    + to_clob  
    +----------
    + gauss123
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('gauss234'::VARCHAR(10));
    + to_clob  
    +----------
    + gauss234
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('gauss345'::VARCHAR2(10));
    + to_clob  
    +----------
    + gauss345
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('gauss456'::NVARCHAR2(10));
    + to_clob  
    +----------
    + gauss456
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_clob('World222!'::TEXT);
    +  to_clob  
    +-----------
    + World222!
    +(1 row)
    +
    + +
    +
  • to_date(text)

    Description: Converts values of the text type into the timestamp in the specified format.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_date('2015-08-14');
    +       to_date
    +---------------------
    + 2015-08-14 00:00:00
    +(1 row)
    +
    + +
    +
  • to_date(text, text)

    Description: Converts the values of the string type into the dates in the specified format.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_date('05 Dec 2000', 'DD Mon YYYY');
    +       to_date
    +---------------------
    + 2000-12-05 00:00:00
    +(1 row)
    +
    + +
    +
  • to_date(string, fmt)

    Description: Converts a string into a value of the DATE type according to the format specified by fmt. For details about the fmt format, see Table 2.

    +

    This function cannot support the CLOB type directly. However, a parameter of the CLOB type can be converted using implicit conversion.

    +

    Return type: date

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT TO_DATE('05 Dec 2010','DD Mon YYYY');
    +       to_date       
    +---------------------
    + 2010-12-05 00:00:00
    +(1 row)
    +
    + +
    +
  • to_number ( expr [, fmt])

    Description: Converts expr into a value of the NUMBER type according to the specified format.

    +

    For details about the type conversion formats, see Table 1.

    +

    If a hexadecimal string is converted into a decimal number, the hexadecimal string can include a maximum of 16 bytes if it is to be converted into a sign-free number.

    +

    During the conversion from a hexadecimal string to a decimal digit, the format string cannot have a character other than x or X. Otherwise, an error is reported.

    +

    Return type: number

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_number('12,454.8-', '99G999D9S');
    + to_number 
    +-----------
    +  -12454.8
    +(1 row)
    +
    + +
    +
  • to_number(text, text)

    Description: Converts the values of the string type into the numbers in the specified format.

    +

    Return type: numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_number('12,454.8-', '99G999D9S');
    + to_number
    +-----------
    +  -12454.8
    +(1 row)
    +
    + +
    +
  • to_timestamp(double precision)

    Description: Converts a UNIX century into a timestamp.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp(1284352323);
    +      to_timestamp      
    +------------------------
    + 2010-09-13 12:32:03+08
    +(1 row)
    +
    + +
    +
  • to_timestamp(string [,fmt])

    Description: Converts a string into a value of the timestamp type according to the format specified by fmt. When fmt is not specified, perform the conversion according to the format specified by nls_timestamp_format. For details about the fmt format, see Table 2.

    +

    In to_timestamp in GaussDB(DWS):

    +
    • If the input year YYYY is 0, an error will be reported.
    • If the input year YYYY<0 to specify SYYYY in fmt, the year with the value of n (an absolute value) BC is output correctly.
    +

    Characters in the fmt must match the schema for formatting the data and time. Otherwise, an error is reported.

    +

    Return type: timestamp without time zone

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SHOW nls_timestamp_format;
    +    nls_timestamp_format    
    +----------------------------
    + DD-Mon-YYYY HH:MI:SS.FF AM
    +(1 row)
    +
    +SELECT to_timestamp('12-sep-2014');
    +    to_timestamp     
    +---------------------
    + 2014-09-12 00:00:00
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp('12-Sep-10 14:10:10.123000','DD-Mon-YY HH24:MI:SS.FF');
    +      to_timestamp       
    +-------------------------
    + 2010-09-12 14:10:10.123
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp('-1','SYYYY');
    +      to_timestamp      
    +------------------------
    + 0001-01-01 00:00:00 BC
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp('98','RR');
    +    to_timestamp     
    +---------------------
    + 1998-01-01 00:00:00
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp('01','RR');
    +    to_timestamp     
    +---------------------
    + 2001-01-01 00:00:00
    +(1 row)
    +
    + +
    +
  • to_timestamp(text, text)

    Description: Converts values of the string type into the timestamp of the specified type.

    +

    Return type: timestamp

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_timestamp('05 Dec 2000', 'DD Mon YYYY');
    +    to_timestamp
    +---------------------
    + 2000-12-05 00:00:00
    +(1 row)
    +
    + +
    +
+

The following table describes the value formats of the to_number function.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Template patterns for numeric formatting

Schema

+

Description

+

9

+

Value with specified digits

+

0

+

Values with leading zeros

+

Period (.)

+

Decimal point

+

Comma (,)

+

Group (thousand) separator

+

PR

+

Negative values in angle brackets

+

S

+

Sign anchored to number (uses locale)

+

L

+

Currency symbol (uses locale)

+

D

+

Decimal point (uses locale)

+

G

+

Group separator (uses locale)

+

MI

+

Minus sign in the specified position (if the number is less than 0)

+

PL

+

Plus sign in the specified position (if the number is greater than 0)

+

SG

+

Plus or minus sign in the specified position

+

RN

+

Roman numerals (the input values are between 1 and 3999)

+

TH or th

+

Ordinal number suffix

+

V

+

Shifts specified number of digits (decimal)

+
+
+

The following table describes the patterns of date and time values. They can be used for the to_date, to_timestamp, and to_char functions, and the nls_timestamp_format parameter.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 2 Schemas for formatting date and time

Type

+

Schema

+

Description

+

Hour

+

HH

+

Number of hours in one day (01-12)

+

HH12

+

Number of hours in one day (01-12)

+

HH24

+

Number of hours in one day (00-23)

+

Minute

+

MI

+

Minute (00-59)

+

Second

+

SS

+

Second (00-59)

+

FF

+

Microsecond (000000-999999)

+

SSSSS

+

Second after midnight (0-86399)

+

Morning and afternoon

+

AM or A.M.

+

Morning identifier

+

PM or P.M.

+

Afternoon identifier

+

Year

+

+

+

Y,YYY

+

Year with comma (with four digits or more)

+

SYYYY

+

Year with four digits BC

+

YYYY

+

Year (with four digits or more)

+

YYY

+

Last three digits of a year

+

YY

+

Last two digits of a year

+

Y

+

Last one digit of a year

+

IYYY

+

ISO year (with four digits or more)

+

IYY

+

Last three digits of an ISO year

+

IY

+

Last two digits of an ISO year

+

I

+

Last one digit of an ISO year

+

RR

+

Last two digits of a year (A year of the 20th century can be stored in the 21st century.)

+

The password must comply with the following rules:

+
  • If the range of the input two-digit year is between 00 and 49:

    If the last two digits of the current year are between 00 and 49, the first two digits of the returned year are the same as the first two digits of the current year.

    +

    If the last two digits of the current year are between 50 and 99, the first two digits of the returned year equal to the first two digits of the current year plus 1.

    +
  • If the range of the input two-digit year is between 50 and 99:

    If the last two digits of the current year are between 00 and 49, the first two digits of the returned year equal to the first two digits of the current year minus 1.

    +

    If the last two digits of the current year are between 50 and 99, the first two digits of the returned year are the same as the first two digits of the current year.

    +
+

RRRR

+

Capable of receiving a year with four digits or two digits. If there are 2 digits, the value is the same as the returned value of RR. If there are 4 digits, the value is the same as YYYY.

+
  • BC or B.C.
  • AD or A.D.
+

Era indicator Before Christ (BC) and After Christ (AD)

+

Month

+

MONTH

+

Full spelling of a month in uppercase (9 characters are filled in if the value is empty.)

+

MON

+

Month in abbreviated format in uppercase (with three characters)

+

MM

+

Month (01-12)

+

RM

+

Month in Roman numerals (I-XII; I=JAN) and uppercase

+

Day

+

DAY

+

Full spelling of a date in uppercase (9 characters are filled in if the value is empty.)

+

DY

+

Day in abbreviated format in uppercase (with three characters)

+

DDD

+

Day in a year (001-366)

+

DD

+

Day in a month (01-31)

+

D

+

Day in a week (1-7).

+

Week

+

W

+

Week in a month (1-5) (The first week starts from the first day of the month.)

+

WW

+

Week in a year (1-53) (The first week starts from the first day of the year.)

+

IW

+

Week in an ISO year (The first Thursday is in the first week.)

+

Century

+

CC

+

Century (with two digits) (The 21st century starts from 2001-01-01.)

+

Julian date

+

J

+

Julian date (starting from January 1 of 4712 BC)

+

Quarter

+

Q

+

Quarter

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0037.html b/docs/dws/dev/dws_06_0037.html new file mode 100644 index 00000000..796d9f6a --- /dev/null +++ b/docs/dws/dev/dws_06_0037.html @@ -0,0 +1,919 @@ + + +

Geometric Functions and Operators

+

Geometric Operators

  • +

    Description: Translation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' + point '(2.0,0)' AS RESULT;
    +   result    
    +-------------
    + (3,1),(2,0)
    +(1 row)
    +
    + +
    +
  • -

    Description: Translation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' - point '(2.0,0)' AS RESULT;
    +    result     
    +---------------
    + (-1,1),(-2,0)
    +(1 row)
    +
    + +
    +
  • *

    Description: Scaling out/rotation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' * point '(2.0,0)' AS RESULT;
    +   result    
    +-------------
    + (2,2),(0,0)
    +(1 row)
    +
    + +
    +
  • /

    Description: Scaling in/rotation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(2,2))' / point '(2.0,0)' AS RESULT;
    +   result    
    +-------------
    + (1,1),(0,0)
    +(1 row)
    +
    + +
    +
  • #

    Description: Point or box of intersection

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box'((1,-1),(-1,1))' # box'((1,1),(-1,-1))' AS RESULT;
    + result 
    +--------
    +(1,1),(-1,-1)
    +(1 row)
    +
    + +
    +
  • #

    Description: Number of paths or polygon vertexs

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT # path'((1,0),(0,1),(-1,0))' AS RESULT;
    + result 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • @-@

    Description: Length or circumference

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT @-@ path '((0,0),(1,0))' AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
  • @@

    Description: Center of box

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT @@ circle '((0,0),10)' AS RESULT;
    + result 
    +--------
    + (0,0)
    +(1 row)
    +
    + +
    +
  • ##

    Description: Closest point to first figure on second figure.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point '(0,0)' ## box '((2,0),(0,2))' AS RESULT;
    + result 
    +--------
    + (0,0)
    +(1 row)
    +
    + +
    +
  • <->

    Description: Distance between the two figures.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle '((0,0),1)' <-> circle '((5,0),1)' AS RESULT;
    + result 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • &&

    Description: Overlaps? (One point in common makes this true.)

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' && box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <<

    Description: Is strictly left of (no common horizontal coordinate)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle '((0,0),1)' << circle '((5,0),1)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >>

    Description: Is strictly right of (no common horizontal coordinate)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle '((5,0),1)' >> circle '((0,0),1)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &<

    Description: Does not extend to the right of?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' &< box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &>

    Description: Does not extend to the left of?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(3,3))' &> box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <<|

    Description: Is strictly below (no common horizontal coordinate)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(3,3))' <<| box '((3,4),(5,5))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • |>>

    Description: Is strictly above (no common horizontal coordinate)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((3,4),(5,5))' |>> box '((0,0),(3,3))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &<|

    Description: Does not extend above?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(1,1))' &<| box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • |&>

    Description: Does not extend below?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(3,3))' |&> box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <^

    Description: Is below (allows touching)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(-3,-3))' <^ box '((0,0),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >^

    Description: Is above (allows touching)?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box '((0,0),(2,2))' >^ box '((0,0),(-3,-3))'  AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?#

    Description: Intersect?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lseg '((-1,0),(1,0))' ?# box '((-2,-2),(2,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?-

    Description: Is horizontal?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ?- lseg '((-1,0),(1,0))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?-

    Description: Are horizontally aligned?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point '(1,0)' ?- point '(0,0)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?|

    Description: Is vertical?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ?| lseg '((-1,0),(1,0))' AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • ?|

    Description: Are vertically aligned?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point '(0,1)' ?| point '(0,0)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?-|

    Description: Are perpendicular?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lseg '((0,0),(0,1))' ?-| lseg '((0,0),(1,0))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ?||

    Description: Are parallel?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lseg '((-1,0),(1,0))' ?|| lseg '((-1,2),(1,2))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • @>

    Description: Contains?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle '((0,0),2)' @> point '(1,1)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <@

    Description: Contained in or on?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point '(1,1)' <@ circle '((0,0),2)' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ~=

    Description: Same as?

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT polygon '((0,0),(1,1))' ~= polygon '((1,1),(0,0))' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
+
+

Geometric Functions

  • area(object)

    Description: Area calculation

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT area(box '((0,0),(1,1))') AS RESULT;
    + result 
    +--------
    +      1
    +(1 row)
    +
    + +
    +
  • center(object)

    Description: Figure center calculation

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT center(box '((0,0),(1,2))') AS RESULT;
    + result  
    +---------
    + (0.5,1)
    +(1 row)
    +
    + +
    +
  • diameter(circle)

    Description: Circle diameter calculation

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT diameter(circle '((0,0),2.0)') AS RESULT;
    + result 
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • height(box)

    Description: Vertical size of box

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT height(box '((0,0),(1,1))') AS RESULT;
    + result 
    +--------
    +      1
    +(1 row)
    +
    + +
    +
  • isclosed(path)

    Description: A closed path?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isclosed(path '((0,0),(1,1),(2,0))') AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • isopen(path)

    Description: An open path?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isopen(path '[(0,0),(1,1),(2,0)]') AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • length(object)

    Description: Length calculation

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT length(path '((-1,0),(1,0))') AS RESULT;
    + result 
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • npoints(path)

    Description: Number of points in path

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT npoints(path '[(0,0),(1,1),(2,0)]') AS RESULT;
    + result 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • npoints(polygon)

    Description: Number of points in polygon

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT npoints(polygon '((1,1),(0,0))') AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
  • pclose(path)

    Description: Converts path to closed.

    +

    Return type: path

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pclose(path '[(0,0),(1,1),(2,0)]') AS RESULT;
    +       result        
    +---------------------
    + ((0,0),(1,1),(2,0))
    +(1 row)
    +
    + +
    +
  • popen(path)

    Description: Converts path to open.

    +

    Return type: path

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT popen(path '((0,0),(1,1),(2,0))') AS RESULT;
    +       result        
    +---------------------
    + [(0,0),(1,1),(2,0)]
    +(1 row)
    +
    + +
    +
  • radius(circle)

    Description: Circle diameter calculation

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT radius(circle '((0,0),2.0)') AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
  • width(box)

    Description: Horizontal size of box

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT width(box '((0,0),(1,1))') AS RESULT;
    + result 
    +--------
    +      1
    +(1 row)
    +
    + +
    +
+
+

Geometric Type Conversion Functions

  • box(circle)

    Description: Circle to box

    +

    Return type: box

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box(circle '((0,0),2.0)') AS RESULT;
    +                                  result                                   
    +---------------------------------------------------------------------------
    + (1.41421356237309,1.41421356237309),(-1.41421356237309,-1.41421356237309)
    +(1 row)
    +
    + +
    +
  • box(point, point)

    Description: Points to box

    +

    Return type: box

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box(point '(0,0)', point '(1,1)') AS RESULT;
    +   result    
    +-------------
    + (1,1),(0,0)
    +(1 row)
    +
    + +
    +
  • box(polygon)

    Description: Polygon to box

    +

    Return type: box

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT box(polygon '((0,0),(1,1),(2,0))') AS RESULT;
    +   result    
    +-------------
    + (2,1),(0,0)
    +(1 row)
    +
    + +
    +
  • circle(box)

    Description: Box to circle

    +

    Return type: circle

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle(box '((0,0),(1,1))') AS RESULT;
    +            result             
    +-------------------------------
    + <(0.5,0.5),0.707106781186548>
    +(1 row)
    +
    + +
    +
  • circle(point, double precision)

    Description: Center and radius to circle

    +

    Return type: circle

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle(point '(0,0)', 2.0) AS RESULT;
    +  result   
    +-----------
    + <(0,0),2>
    +(1 row)
    +
    + +
    +
  • circle(polygon)

    Description: Polygon to circle

    +

    Return type: circle

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT circle(polygon '((0,0),(1,1),(2,0))') AS RESULT;
    +                  result                   
    +-------------------------------------------
    + <(1,0.333333333333333),0.924950591148529>
    +(1 row)
    +
    + +
    +
  • lseg(box)

    Description: Box diagonal to line segment

    +

    Return type: lseg

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lseg(box '((-1,0),(1,0))') AS RESULT;
    +     result     
    +----------------
    + [(1,0),(-1,0)]
    +(1 row)
    +
    + +
    +
  • lseg(point, point)

    Description: Points to line segment

    +

    Return type: lseg

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lseg(point '(-1,0)', point '(1,0)') AS RESULT;
    +     result     
    +----------------
    + [(-1,0),(1,0)]
    +(1 row)
    +
    + +
    +
  • path(polygon)

    Description: Polygon to path

    +

    Return type: path

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT path(polygon '((0,0),(1,1),(2,0))') AS RESULT;
    +       result        
    +---------------------
    + ((0,0),(1,1),(2,0))
    +(1 row)
    +
    + +
    +
  • point(double precision, double precision)

    Description: Points

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point(23.4, -44.5) AS RESULT;
    +    result    
    +--------------
    + (23.4,-44.5)
    +(1 row)
    +
    + +
    +
  • point(box)

    Description: Center of box

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point(box '((-1,0),(1,0))') AS RESULT;
    + result 
    +--------
    + (0,0)
    +(1 row)
    +
    + +
    +
  • point(circle)

    Description: Center of circle

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point(circle '((0,0),2.0)') AS RESULT;
    + result 
    +--------
    + (0,0)
    +(1 row)
    +
    + +
    +
  • point(lseg)

    Description: Center of line segment

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point(lseg '((-1,0),(1,0))') AS RESULT;
    + result 
    +--------
    + (0,0)
    +(1 row)
    +
    + +
    +
  • point(polygon)

    Description: Center of polygon

    +

    Return type: point

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT point(polygon '((0,0),(1,1),(2,0))') AS RESULT;
    +        result         
    +-----------------------
    + (1,0.333333333333333)
    +(1 row)
    +
    + +
    +
  • polygon(box)

    Description: Box to 4-point polygon

    +

    Return type: polygon

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT polygon(box '((0,0),(1,1))') AS RESULT;
    +          result           
    +---------------------------
    + ((0,0),(0,1),(1,1),(1,0))
    +(1 row)
    +
    + +
    +
  • polygon(circle)

    Description: Circle to 12-point polygon

    +

    Return type: polygon

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT polygon(circle '((0,0),2.0)') AS RESULT;
    +                                                                                                                                                result                                                                                      
    +
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    + ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1))
    +(1 row)
    +
    + +
    +
  • polygon(npts, circle)

    Description: Circle to npts-point polygon

    +

    Return type: polygon

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT polygon(12, circle '((0,0),2.0)') AS RESULT;
    +                                                                                                                                                result                                                                                      
    +
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    + ((-2,0),(-1.73205080756888,1),(-1,1.73205080756888),(-1.22464679914735e-16,2),(1,1.73205080756888),(1.73205080756888,1),(2,2.44929359829471e-16),(1.73205080756888,-0.999999999999999),(1,-1.73205080756888),(3.67394039744206e-16,-2),(-0.999999999999999,-1.73205080756888),(-1.73205080756888,-1))
    +(1 row)
    +
    + +
    +
  • polygon(path)

    Description: Path to polygon

    +

    Return type: polygon

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT polygon(path '((0,0),(1,1),(2,0))') AS RESULT;
    +       result        
    +---------------------
    + ((0,0),(1,1),(2,0))
    +(1 row)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0038.html b/docs/dws/dev/dws_06_0038.html new file mode 100644 index 00000000..f47ebdc3 --- /dev/null +++ b/docs/dws/dev/dws_06_0038.html @@ -0,0 +1,440 @@ + + +

Network Address Functions and Operators

+

cidr and inet Operators

The operators <<, <<=, >>, and >>= test for subnet inclusion. They consider only the network parts of the two addresses (ignoring any host part) and determine whether one network is identical to or a subnet of the other.

+
  • <

    Description: Is less than

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' < inet '192.168.1.6' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <=

    Description: Is less than or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' <= inet '192.168.1.5' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • =

    Description: Equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' = inet '192.168.1.5' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >=

    Description: Is greater than or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' >= inet '192.168.1.5' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >

    Description: Is greater than

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' > inet '192.168.1.4' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <>

    Description: Does not equal to

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' <> inet '192.168.1.4' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <<

    Description: Is contained in

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.5' << inet '192.168.1/24' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <<=

    Description: Is contained in or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1/24' <<= inet '192.168.1/24' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >>

    Description: Contains

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1/24' >> inet '192.168.1.5' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >>=

    Description: Contains or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1/24' >>= inet '192.168.1/24' AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ~

    Description: Bitwise NOT

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ~ inet '192.168.1.6' AS RESULT; 
    +    result     
    +---------------
    + 63.87.254.249
    +(1 row)
    +
    + +
    +
  • &

    Description: The AND operation is performed on each bit of the two network addresses.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.6' & inet '10.0.0.0' AS RESULT;
    + result  
    +---------
    + 0.0.0.0
    +(1 row)
    +
    + +
    +
  • |

    Description: The OR operation is performed on each bit of the two network addresses.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.6' | inet '10.0.0.0' AS RESULT;
    +   result    
    +-------------
    + 202.168.1.6
    +(1 row)
    +
    + +
    +
  • +

    Description: Addition

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.6' + 25 AS RESULT;
    +    result    
    +--------------
    + 192.168.1.31
    +(1 row)
    +
    + +
    +
  • -

    Description: Subtraction

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.43' - 36 AS RESULT;
    +   result    
    +-------------
    + 192.168.1.7
    +(1 row)
    +
    + +
    +
  • -

    Description: Subtraction

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet '192.168.1.43' - inet '192.168.1.19' AS RESULT;
    + result 
    +--------
    +     24
    +(1 row)
    +
    + +
    +
+
+

cidr and inet Functions

The abbrev, host, and text functions are primarily intended to offer alternative display formats.

+
  • abbrev(inet)

    Description: Abbreviated display format as text

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT abbrev(inet '10.1.0.0/16') AS RESULT;
    +   result    
    +-------------
    + 10.1.0.0/16
    +(1 row)
    +
    + +
    +
  • abbrev(cidr)

    Description: Abbreviated display format as text

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT abbrev(cidr '10.1.0.0/16') AS RESULT;
    + result  
    +---------
    + 10.1/16
    +(1 row)
    +
    + +
    +
  • broadcast(inet)

    Description: Broadcast address for network

    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT broadcast('192.168.1.5/24') AS RESULT;
    +      result      
    +------------------
    + 192.168.1.255/24
    +(1 row)
    +
    + +
    +
  • family(inet)

    Description: Extracts family of address; 4 for IPv4, 6 for IPv6

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT family('::1') AS RESULT;
    + result 
    +--------
    +      6
    +(1 row)
    +
    + +
    +
  • host(inet)

    Description: Extracts IP address as text.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT host('192.168.1.5/24') AS RESULT;
    +   result    
    +-------------
    + 192.168.1.5
    +(1 row)
    +
    + +
    +
  • hostmask(inet)

    Description: Constructs host mask for network.

    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hostmask('192.168.23.20/30') AS RESULT;
    + result  
    +---------
    + 0.0.0.3
    +(1 row)
    +
    + +
    +
  • masklen(inet)

    Description: Extracts subnet mask length.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT masklen('192.168.1.5/24') AS RESULT;
    + result 
    +--------
    +     24
    +(1 row)
    +
    + +
    +
  • netmask(inet)

    Description: Constructs a subnet mask for the network.

    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT netmask('192.168.1.5/24') AS RESULT;
    +    result     
    +---------------
    + 255.255.255.0
    +(1 row)
    +
    + +
    +
  • network(inet)

    Description: Extracts network part of address.

    +

    Return type: cidr

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT network('192.168.1.5/24') AS RESULT;
    +     result     
    +----------------
    + 192.168.1.0/24
    +(1 row)
    +
    + +
    +
  • set_masklen(inet, int)

    Description: Sets subnet mask length for inet value.

    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT set_masklen('192.168.1.5/24', 16) AS RESULT;
    +     result     
    +----------------
    + 192.168.1.5/16
    +(1 row)
    +
    + +
    +
  • set_masklen(cidr, int)

    Description: Sets subnet mask length for cidr value.

    +

    Return type: cidr

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT set_masklen('192.168.1.0/24'::cidr, 16) AS RESULT;
    +     result     
    +----------------
    + 192.168.0.0/16
    +(1 row)
    +
    + +
    +
  • text(inet)

    Description: Extracts IP address and subnet mask length as text.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT text(inet '192.168.1.5') AS RESULT;
    +     result     
    +----------------
    + 192.168.1.5/32
    +(1 row)
    +
    + +
    +
+
+

Any cidr value can be cast to inet implicitly or explicitly; therefore, the functions shown above as operating on inet also work on cidr values. An inet value can be cast to cidr. After the conversion, any bits to the right of the subnet mask are silently zeroed to create a valid cidr value. In addition, you can cast a text string to inet or cidr using normal casting syntax. For example, inet(expression) or colname::cidr.

+

macaddr Functions

The function trunc(macaddr) returns a MAC address with the last 3 bytes set to zero.

+

trunc(macaddr)

+

Description: Sets last 3 bytes to zero.

+

Return type: macaddr

+

For example:

+
1
+2
+3
+4
+5
SELECT trunc(macaddr '12:34:56:78:90:ab') AS RESULT;
+      result       
+-------------------
+ 12:34:56:00:00:00
+(1 row)
+
+ +
+
+

The macaddr type also supports the standard relational operators (such as > and <=) for lexicographical ordering, and the bitwise arithmetic operators (~, & and |) for NOT, AND and OR.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0039.html b/docs/dws/dev/dws_06_0039.html new file mode 100644 index 00000000..ab0ca9d0 --- /dev/null +++ b/docs/dws/dev/dws_06_0039.html @@ -0,0 +1,554 @@ + + +

Text Search Functions and Operators

+

Text Search Operators

  • @@

    Description: Specifies whether the tsvector-typed words match the tsquery-typed words.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_tsvector('fat cats ate rats') @@ to_tsquery('cat & rat') AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • @@@

    Description: Synonym for @@

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_tsvector('fat cats ate rats') @@@ to_tsquery('cat & rat') AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ||

    Description: Connects two tsvector-typed words.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'a:1 b:2'::tsvector || 'c:1 d:2 b:3'::tsvector AS RESULT;
    +          result           
    +---------------------------
    + 'a':1 'b':2,5 'c':3 'd':4
    +(1 row)
    +
    + +
    +
  • &&

    Description: Performs the AND operation on two tsquery-typed words.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'fat | rat'::tsquery && 'cat'::tsquery AS RESULT;
    +          result           
    +---------------------------
    + ( 'fat' | 'rat' ) & 'cat'
    +(1 row)
    +
    + +
    +
  • ||

    Description: Performs the OR operation on two tsquery-typed words.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'fat | rat'::tsquery || 'cat'::tsquery AS RESULT;
    +          result           
    +---------------------------
    + ( 'fat' | 'rat' ) | 'cat'
    +(1 row)
    +
    + +
    +
  • !!

    Description: NOT a tsquery

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT !! 'cat'::tsquery AS RESULT;
    + result 
    +--------
    + !'cat'
    +(1 row)
    +
    + +
    +
  • @>

    Description: Specifies whether a tsquery-typed word contains another tsquery-typed word.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'cat'::tsquery @> 'cat & rat'::tsquery AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • <@

    Description: Specifies whether a tsquery-typed word is contained in another tsquery-typed word.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 'cat'::tsquery <@ 'cat & rat'::tsquery AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
+
+

In addition to the preceding operators, the ordinary B-tree comparison operators (including = and <) are defined for types tsvector and tsquery.

+

Text search functions

  • get_current_ts_config()

    Description: Gets default text search configuration.

    +

    Return type: regconfig

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT get_current_ts_config();
    + get_current_ts_config 
    +-----------------------
    + english
    +(1 row)
    +
    + +
    +
  • length(tsvector)

    Description: Number of lexemes in a tsvector-typed word.

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT length('fat:2,4 cat:3 rat:5A'::tsvector);
    + length 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • numnode(tsquery)

    Description: Number of lexemes plus tsquery operators

    +

    Return type: integer

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numnode('(fat & rat) | cat'::tsquery);
    + numnode 
    +---------
    +       5
    +(1 row)
    +
    + +
    +
  • plainto_tsquery([ config regconfig , ] query text)

    Description: Generates tsquery lexemes without punctuation.

    +

    Return type: tsquery

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT plainto_tsquery('english', 'The Fat Rats');
    + plainto_tsquery 
    +-----------------
    + 'fat' & 'rat'
    +(1 row)
    +
    + +
    +
  • querytree(query tsquery)

    Description: Gets indexable part of a tsquery.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT querytree('foo & ! bar'::tsquery);
    + querytree 
    +-----------
    + 'foo'
    +(1 row)
    +
    + +
    +
  • setweight(tsvector, "char")

    Description: Assigns weight to each element of tsvector.

    +

    Return type: tsvector

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT setweight('fat:2,4 cat:3 rat:5B'::tsvector, 'A');
    +           setweight           
    +-------------------------------
    + 'cat':3A 'fat':2A,4A 'rat':5A
    +(1 row)
    +
    + +
    +
  • strip(tsvector)

    Description: Removes positions and weights from tsvector.

    +

    Return type: tsvector

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT strip('fat:2,4 cat:3 rat:5A'::tsvector);
    +       strip       
    +-------------------
    + 'cat' 'fat' 'rat'
    +(1 row)
    +
    + +
    +
  • to_tsquery([ config regconfig , ] query text)

    Description: Normalizes words and converts them to tsquery.

    +

    Return type: tsquery

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_tsquery('english', 'The & Fat & Rats');
    +  to_tsquery   
    +---------------
    + 'fat' & 'rat'
    +(1 row)
    +
    + +
    +
  • to_tsvector([ config regconfig , ] document text)

    Description: Reduces document text to tsvector.

    +

    Return type: tsvector

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT to_tsvector('english', 'The Fat Rats');
    +   to_tsvector   
    +-----------------
    + 'fat':2 'rat':3
    +(1 row)
    +
    + +
    +
  • ts_headline([ config regconfig, ] document text, query tsquery [, options text ])

    Description: Highlights a query match.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_headline('x y z', 'z'::tsquery);
    + ts_headline  
    +--------------
    + x y <b>z</b>
    +(1 row)
    +
    + +
    +
  • ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ])

    Description: Ranks document for query.

    +

    Return type: float4

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_rank('hello world'::tsvector, 'world'::tsquery);
    + ts_rank  
    +----------
    + .0607927
    +(1 row)
    +
    + +
    +
  • ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ])

    Description: Ranks document for query using cover density.

    +

    Return type: float4

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_rank_cd('hello world'::tsvector, 'world'::tsquery);
    + ts_rank_cd 
    +------------
    +          0
    +(1 row)
    +
    + +
    +
  • ts_rewrite(query tsquery, target tsquery, substitute tsquery)

    Description: Replaces tsquery-typed word.

    +

    Return type: tsquery

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'foo|bar'::tsquery);
    +       ts_rewrite        
    +-------------------------
    + 'b' & ( 'foo' | 'bar' )
    +(1 row)
    +
    + +
    +
  • ts_rewrite(query tsquery, select text)

    Description: Replaces tsquery data in the target with the result of a SELECT command.

    +

    Return type: tsquery

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_rewrite('world'::tsquery, 'select ''world''::tsquery, ''hello''::tsquery');
    + ts_rewrite 
    +------------
    + 'hello'
    +(1 row)
    +
    + +
    +
+
+

Text Search Debugging Functions

  • ts_debug([ config regconfig, ] document text, OUT alias text, OUT description text, OUT token text, OUT dictionaries regdictionary[], OUT dictionary regdictionary, OUT lexemes text[])

    Description: Tests a configuration.

    +

    Return type: setof record

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    SELECT ts_debug('english', 'The Brightest supernovaes');
    +                                     ts_debug                                      
    +-----------------------------------------------------------------------------------
    + (asciiword,"Word, all ASCII",The,{english_stem},english_stem,{})
    + (blank,"Space symbols"," ",{},,)
    + (asciiword,"Word, all ASCII",Brightest,{english_stem},english_stem,{brightest})
    + (blank,"Space symbols"," ",{},,)
    + (asciiword,"Word, all ASCII",supernovaes,{english_stem},english_stem,{supernova})
    +(5 rows)
    +
    + +
    +
  • ts_lexize(dict regdictionary, token text)

    Description: Tests a data dictionary.

    +

    Return type: text[]

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ts_lexize('english_stem', 'stars');
    + ts_lexize 
    +-----------
    + {star}
    +(1 row)
    +
    + +
    +
  • ts_parse(parser_name text, document text, OUT tokid integer, OUT token text)

    Description: Tests a parser.

    +

    Return type: setof record

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    SELECT ts_parse('default', 'foo - bar');
    + ts_parse  
    +-----------
    + (1,foo)
    + (12," ")
    + (12,"- ")
    + (1,bar)
    +(4 rows)
    +
    + +
    +
  • ts_parse(parser_oid oid, document text, OUT tokid integer, OUT token text)

    Description: Tests a parser.

    +

    Return type: setof record

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    SELECT ts_parse(3722, 'foo - bar');
    + ts_parse  
    +-----------
    + (1,foo)
    + (12," ")
    + (12,"- ")
    + (1,bar)
    +(4 rows)
    +
    + +
    +
  • ts_token_type(parser_name text, OUT tokid integer, OUT alias text, OUT description text)

    Description: Gets token types defined by parser.

    +

    Return type: setof record

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    SELECT ts_token_type('default');
    +                        ts_token_type                         
    +--------------------------------------------------------------
    + (1,asciiword,"Word, all ASCII")
    + (2,word,"Word, all letters")
    + (3,numword,"Word, letters and digits")
    + (4,email,"Email address")
    + (5,url,URL)
    + (6,host,Host)
    + (7,sfloat,"Scientific notation")
    + (8,version,"Version number")
    + (9,hword_numpart,"Hyphenated word part, letters and digits")
    + (10,hword_part,"Hyphenated word part, all letters")
    + (11,hword_asciipart,"Hyphenated word part, all ASCII")
    + (12,blank,"Space symbols")
    + (13,tag,"XML tag")
    + (14,protocol,"Protocol head")
    + (15,numhword,"Hyphenated word, letters and digits")
    + (16,asciihword,"Hyphenated word, all ASCII")
    + (17,hword,"Hyphenated word, all letters")
    + (18,url_path,"URL path")
    + (19,file,"File or path name")
    + (20,float,"Decimal notation")
    + (21,int,"Signed integer")
    + (22,uint,"Unsigned integer")
    + (23,entity,"XML entity")
    +(23 rows)
    +
    + +
    +
  • ts_token_type(parser_oid oid, OUT tokid integer, OUT alias text, OUT description text)

    Description: Gets token types defined by parser.

    +

    Return type: setof record

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    SELECT ts_token_type(3722);
    +                        ts_token_type                         
    +--------------------------------------------------------------
    + (1,asciiword,"Word, all ASCII")
    + (2,word,"Word, all letters")
    + (3,numword,"Word, letters and digits")
    + (4,email,"Email address")
    + (5,url,URL)
    + (6,host,Host)
    + (7,sfloat,"Scientific notation")
    + (8,version,"Version number")
    + (9,hword_numpart,"Hyphenated word part, letters and digits")
    + (10,hword_part,"Hyphenated word part, all letters")
    + (11,hword_asciipart,"Hyphenated word part, all ASCII")
    + (12,blank,"Space symbols")
    + (13,tag,"XML tag")
    + (14,protocol,"Protocol head")
    + (15,numhword,"Hyphenated word, letters and digits")
    + (16,asciihword,"Hyphenated word, all ASCII")
    + (17,hword,"Hyphenated word, all letters")
    + (18,url_path,"URL path")
    + (19,file,"File or path name")
    + (20,float,"Decimal notation")
    + (21,int,"Signed integer")
    + (22,uint,"Unsigned integer")
    + (23,entity,"XML entity")
    +(23 rows)
    +
    + +
    +
  • ts_stat(sqlquery text, [ weights text, ] OUT word text, OUT ndoc integer, OUT nentry integer)

    Description: Gets statistics of a tsvector column.

    +

    Return type: setof record

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT ts_stat('select ''hello world''::tsvector');
    +   ts_stat   
    +-------------
    + (world,1,1)
    + (hello,1,1)
    +(2 rows)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0040.html b/docs/dws/dev/dws_06_0040.html new file mode 100644 index 00000000..3d89f363 --- /dev/null +++ b/docs/dws/dev/dws_06_0040.html @@ -0,0 +1,46 @@ + + +

UUID Functions

+

UUID functions are used to generate UUID data (see UUID Type).

+
  • uuid_generate_v1()

    Description: Generates a UUID sequence number.

    +

    Return type: UUID

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT uuid_generate_v1();
    +           uuid_generate_v1           
    +--------------------------------------
    + c71ceaca-a175-11e9-a920-797ff7000001
    +(1 row)
    +
    + +
    +

    The uuid_generate_v1 function generates UUIDs based on the time information, cluster node ID, and thread ID that generates the sequence. Each UUID is globally unique in a cluster, but there is a low probability that a UUID is duplicated among multiple clusters.

    +
    +
  • sys_guid()

    Description: Generate a sequence number that is the same as the sequence number generated by the Oracle sys_guid method.

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sys_guid();
    +             sys_guid             
    +----------------------------------
    + 4EBD3C74A17A11E9A1BF797FF7000001
    +(1 row)
    +
    + +
    +

    The data generation principle of the sys_guid function is the same as that of the uuid_generate_v1 function.

    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0041.html b/docs/dws/dev/dws_06_0041.html new file mode 100644 index 00000000..44c2cb69 --- /dev/null +++ b/docs/dws/dev/dws_06_0041.html @@ -0,0 +1,42 @@ + + +

JSON Functions

+

JSON functions are used to generate JSON data (see JSON Types).

+
  • array_to_json(anyarray [, pretty_bool])

    Description: Returns the array as JSON. A multi-dimensional array becomes a JSON array of arrays. Line feeds will be added between dimension-1 elements if pretty_bool is true.

    +

    Return type: json

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_to_json('{{1,5},{99,100}}'::int[]);
    +array_to_json
    +------------------
    +[[1,5],[99,100]]
    +(1 row)
    +
    + +
    +
  • row_to_json(record [, pretty_bool])

    Description: Returns the row as JSON. Line feeds will be added between level-1 elements if pretty_bool is true.

    +

    Return type: json

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT row_to_json(row(1,'foo'));
    +     row_to_json     
    +---------------------
    + {"f1":1,"f2":"foo"}
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0042.html b/docs/dws/dev/dws_06_0042.html new file mode 100644 index 00000000..34f5a134 --- /dev/null +++ b/docs/dws/dev/dws_06_0042.html @@ -0,0 +1,907 @@ + + +

HLL Functions and Operators

+

Hash Functions

  • hll_hash_boolean(bool)

    Description: Hashes data of the bool type.

    +

    Return type: hll_hashval

    +
    For example:
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_boolean(FALSE);
    +  hll_hash_boolean   
    +---------------------
    + 5048724184180415669
    +(1 row)
    +
    + +
    +
    +
+
+
  • hll_hash_boolean(bool, int32)

    Description: Configures a hash seed (that is, change the hash policy) and hashes data of the bool type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_boolean(FALSE, 10);
    +  hll_hash_boolean  
    +--------------------
    + 391264977436098630
    +(1 row)
    +
    + +
    +
  • hll_hash_smallint(smallint)

    Description: Hashes data of the smallint type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_smallint(100::smallint);
    +  hll_hash_smallint  
    +---------------------
    + 4631120266694327276
    +(1 row)
    +
    + +
    +
+

If parameters with the same numeric value are hashed using different data types, the data will differ, because hash functions select different calculation policies for each type.

+
+
  • hll_hash_smallint(smallint, int32)

    Description: Configures a hash seed (that is, change the hash policy) and hashes data of the smallint type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_smallint(100::smallint, 10);
    +  hll_hash_smallint  
    +---------------------
    + 8349353095166695771
    +(1 row)
    +
    + +
    +
  • hll_hash_integer(integer)

    Description: Hashes data of the integer type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_integer(0);
    +   hll_hash_integer   
    +----------------------
    + -3485513579396041028
    +(1 row)
    +
    + +
    +
  • hll_hash_integer(integer, int32)

    Description: Hashes data of the integer type and configures a hash seed (that is, change the hash policy).

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     SELECT hll_hash_integer(0, 10);
    +  hll_hash_integer  
    +--------------------
    + 183371090322255134
    +(1 row)
    +
    + +
    +
  • hll_hash_bigint(bigint)

    Description: Hashes data of the bigint type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_bigint(100::bigint);
    +   hll_hash_bigint   
    +---------------------
    + 8349353095166695771
    +(1 row)
    +
    + +
    +
  • hll_hash_bigint(bigint, int32)

    Description: Hashes data of the bigint type and configures a hash seed (that is, change the hash policy).

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_bigint(100::bigint, 10);
    +   hll_hash_bigint   
    +---------------------
    + 4631120266694327276
    +(1 row)
    +
    + +
    +
  • hll_hash_bytea(bytea)

    Description: Hashes data of the bytea type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_bytea(E'\\x');
    + hll_hash_bytea 
    +----------------
    + 0
    +(1 row)
    +
    + +
    +
  • hll_hash_bytea(bytea, int32)

    Description: Hashes data of the bytea type and configures a hash seed (that is, change the hash policy).

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_bytea(E'\\x', 10);
    +   hll_hash_bytea    
    +---------------------
    + 6574525721897061910
    +(1 row)
    +
    + +
    +
  • hll_hash_text(text)

    Description: Hashes data of the text type.

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_text('AB');
    +    hll_hash_text    
    +---------------------
    + 5365230931951287672
    +(1 row)
    +
    + +
    +
  • hll_hash_text(text, int32)

    Description: Hashes data of the text type and configures a hash seed (that is, change the hash policy).

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT hll_hash_text('AB', 10);
    +hll_hash_text
    +---------------------
    +7680762839921155903
    +(1 row)
    +
    + +
    +
  • hll_hash_any(anytype)

    Description: Hashes data of any type.

    +

    Return type: hll_hashval

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    select hll_hash_any(1);
    +     hll_hash_any     
    +----------------------
    + -8604791237420463362
    +(1 row)
    +
    +select hll_hash_any('08:00:2b:01:02:03'::macaddr);
    +     hll_hash_any     
    +----------------------
    + -4883882473551067169
    +(1 row)
    +
    + +
    +
  • hll_hash_any(anytype, int32)

    Description: Hashes data of any type and configures a hash seed (that is, change the hash policy).

    +

    Return type: hll_hashval

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_hash_any(1, 10);
    +     hll_hash_any     
    +----------------------
    + -1478847531811254870
    +(1 row)
    +
    + +
    +
  • hll_hashval_eq(hll_hashval, hll_hashval)

    Description: Compares two pieces of data of the hll_hashval type to check whether they are the same.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_hashval_eq(hll_hash_integer(1), hll_hash_integer(1));
    + hll_hashval_eq 
    +----------------
    + t
    +(1 row)
    +
    + +
    +
  • hll_hashval_ne(hll_hashval, hll_hashval)

    Description: Compares two pieces of data of the hll_hashval type to check whether they are different.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1));
    + hll_hashval_ne 
    +----------------
    + f
    +(1 row)
    +
    + +
    +
+

Precision Functions

HLL supports explicit, sparse, and full modes. explicit and sparse excel when the data scale is small, and barely produce errors in calculation results. When the number of distinct values increases, full becomes more suitable, but produces some errors. The following functions are used to view precision parameters in HLLs.

+
+
  • hll_schema_version(hll)

    Description: Checks the schema version in the current HLL.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_schema_version(hll_empty());
    + hll_schema_version 
    +--------------------
    +           1
    +(1 row)
    +
    + +
    +
  • hll_type(hll)

    Description: Checks the type of the current HLL.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_type(hll_empty());
    + hll_type 
    +----------
    +        1
    +(1 row)
    +
    + +
    +
  • hll_log2m(hll)

    Description: Check the value of log2m of the current HLL. This value affects the error rate in calculating the number of distinct values by the HLL. The formula for calculating the error rate is as follows:

    +

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_log2m(hll_empty());
    + hll_log2m 
    +-----------
    +        11
    +(1 row)
    +
    + +
    +
  • hll_regwidth(hll)

    Description: Checks the number of bits of buckets in a hll data structure.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_regwidth(hll_empty());
    + hll_regwidth 
    +--------------
    +        5
    +(1 row)
    +
    + +
    +
  • hll_expthresh(hll)

    Description: Obtains the size of expthresh in the current HLL. An HLL usually switches from the explicit mode to the sparse mode and then to the full mode. This process is called the promotion hierarchy policy. You can change the value of expthresh to change the policy. For example, if expthresh is 0, an HILL will skip the explicit mode and directly enter the sparse mode. If the value of expthresh is explicitly set to a value ranging from 1 to 7, this function returns 2expthresh.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    select hll_expthresh(hll_empty());
    + hll_expthresh 
    +---------------
    + (-1,160)
    +(1 row)
    +
    +select hll_expthresh(hll_empty(11,5,3));
    + hll_expthresh 
    +---------------
    + (8,8)
    +(1 row)
    +
    + +
    +
  • hll_sparseon(hll)

    Description: Specifies whether to enable the sparse mode. 0 indicates off and 1 indicates on.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_sparseon(hll_empty());
    + hll_sparseon 
    +--------------
    +        1
    +(1 row)
    +
    + +
    +
+

Aggregation Functions

  • hll_add_agg(hll_hashval)

    Description: Groups hashed data into HLL.

    +

    Return type: hll

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    -- Prepare data:
    +create table t_id(id int);
    +insert into t_id values(generate_series(1,500));
    +create table t_data(a int, c text);
    +insert into t_data select mod(id,2), id from t_id;
    +
    +-- Create another table and specify an HLL column:
    +create table t_a_c_hll(a int, c hll);
    +
    +-- Use GROUP BY on column a to group data, and insert the data to the HLL:
    +insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a;
    +
    +-- Calculate the number of distinct values for each group in the HLL:
    +select a, #c as cardinality from t_a_c_hll order by a;
    + a |   cardinality    
    +---+------------------
    + 0 | 250.741759091658
    + 1 | 250.741759091658
    +(2 rows)
    +
    + +
    +
+
+
  • hll_add_agg(hll_hashval, int32 log2m)

    Description: Groups hashed data into HLL and sets the log2m parameter. The parameter value ranges from 10 to 16.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     Select hll_cardinality(hll_add_agg(hll_hash_text(c), 10)) from t_data;
    + hll_cardinality  
    +------------------
    + 503.932348927339
    +(1 row)
    +
    + +
    +
  • hll_add_agg(hll_hashval, int32 log2m, int32 regwidth)

    Description: Groups hashed data into HLL and sets the log2m and regwidth parameters in sequence. The value of regwidth ranges from 1 to 5.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data;
    + hll_cardinality  
    +------------------
    + 496.628982624022
    +(1 row)
    +
    + +
    +
  • hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh)

    Description: Groups hashed data into HLL and sets the parameters log2m, regwidth, and expthresh in sequence. The value of expthresh is an integer ranging from –1 to 7. expthresh is used to specify the threshold for switching from the explicit mode to the sparse mode. –1 indicates the auto mode; 0 indicates that the explicit mode is skipped; a value from 1 to 7 indicates that the mode is switched when the number of distinct values reaches 2expthresh.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4)) from t_data;
    + hll_cardinality  
    +------------------
    + 496.628982624022
    +(1 row)
    +
    + +
    +
  • hll_add_agg(hll_hashval, int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon)

    Description: Groups hashed data into HLL and sets the log2m, regwidth, expthresh, and sparseon parameters in sequence. The value of sparseon is 0 or 1.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     Select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1, 4, 0)) from t_data;
    + hll_cardinality  
    +------------------
    + 496.628982624022
    +(1 row)
    +
    + +
    +
  • hll_union_agg(hll)

    Description: Perform the UNION operation on multiple pieces of data of the hll type to obtain one HLL.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    -- Perform the UNION operation on data of the hll type in each group to obtain one HLL, and calculate the number of distinct values:
    +select #hll_union_agg(c) as cardinality from t_a_c_hll;
    +   cardinality    
    +------------------
    + 496.628982624022
    +(1 row)
    +
    + +
    +

    To perform UNION on data in multiple HLLs, ensure that the HLLs have the same precision. Otherwise, UNION cannot be performed. This restriction also applies to the hll_union(hll, hll) function.

    +
    +
+

Functional Functions

  • hll_print(hll)

    Description: Prints some debugging parameters of an HLL.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_print(hll_empty());
    +                         hll_print                         
    +-----------------------------------------------------------
    + EMPTY, nregs=2048, nbits=5, expthresh=-1(160), sparseon=1gongne
    +(1 row)
    +
    + +
    +
+
+
  • hll_empty()

    Description: Creates an empty HLL.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_empty();
    + hll_empty 
    +-----------
    + \x118b7f
    +(1 row)
    +
    + +
    +
  • hll_empty(int32 log2m)

    Description: Creates an empty HLL and sets the log2m parameter. The parameter value ranges from 10 to 16.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     select hll_empty(10);
    + hll_empty 
    +-----------
    + \x118a7f
    +(1 row)
    +
    + +
    +
  • hll_empty(int32 log2m, int32 regwidth)

    Description: Creates an empty HLL and sets the log2m and regwidth parameters in sequence. The value of regwidth ranges from 1 to 5.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_empty(10, 4);
    + hll_empty 
    +-----------
    + \x116a7f
    +(1 row)
    +
    + +
    +
  • hll_empty(int32 log2m, int32 regwidth, int64 expthresh)

    Description: Creates an empty HLL and sets the log2m, regwidth, and expthresh parameters. The value of expthresh is an integer ranging from –1 to 7. This parameter specifies the threshold for switching from the explicit mode to the sparse mode. –1 indicates the auto mode; 0 indicates that the explicit mode is skipped; a value from 1 to 7 indicates that the mode is switched when the number of distinct values reaches 2expthresh.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     select hll_empty(10, 4, 7);
    + hll_empty 
    +-----------
    + \x116a48
    +(1 row)
    +
    + +
    +
  • hll_empty(int32 log2m, int32 regwidth, int64 expthresh, int32 sparseon)

    Description: Creates an empty HLL and sets the log2m, regwidth, expthresh, and sparseon parameters. The value of sparseon is 0 or 1.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
     select hll_empty(10,4,7,0);
    + hll_empty 
    +-----------
    + \x116a08
    +(1 row)
    +
    + +
    +
  • hll_add(hll, hll_hashval)

    Description: Adds hll_hashval to an HLL.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_add(hll_empty(), hll_hash_integer(1));
    +         hll_add          
    +--------------------------
    + \x128b7f8895a3f5af28cafe
    +(1 row)
    +
    + +
    +
  • hll_add_rev(hll_hashval, hll)

    Description: Adds hll_hashval to an HLL. This function works the same as hll_add, except that the positions of parameters are switched.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_add_rev(hll_hash_integer(1), hll_empty());
    +       hll_add_rev        
    +--------------------------
    + \x128b7f8895a3f5af28cafe
    +(1 row)
    +
    + +
    +
  • hll_eq(hll, hll)

    Description: Compares two HLLs to check whether they are the same.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
    + hll_eq 
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • hll_ne(hll, hll)

    Description: Compares two HLLs to check whether they are different.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
    + hll_ne 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • hll_cardinality(hll)

    Description: Calculates the number of distinct values of an HLL.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_cardinality(hll_empty() || hll_hash_integer(1));
    + hll_cardinality 
    +-----------------
    +               1
    +(1 row)
    +
    + +
    +
  • hll_union(hll, hll)

    Description: Performs the UNION operation on two HLL data structures to obtain one HLL.

    +

    Return type: hll

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2)));
    +                hll_union                 
    +------------------------------------------
    + \x128b7f8895a3f5af28cafeda0ce907e4355b60
    +(1 row)
    +
    + +
    +
+

Built-in Functions

HLL has a series of built-in functions for internal data processing. Generally, users do not need to know how to use these functions. For details, see Table 1.

+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Built-in functions

Function

+

Description

+

hll_in

+

Receives hll data in string format.

+

hll_out

+

Sends hll data in string format.

+

hll_recv

+

Receives hll data in bytea format.

+

hll_send

+

Sends hll data in bytea format.

+

hll_trans_in

+

Receives hll_trans_type data in string format.

+

hll_trans_out

+

Sends hll_trans_type data in string format.

+

hll_trans_recv

+

Receives hll_trans_type data in bytea format.

+

hll_trans_send

+

Sends hll_trans_type data in bytea format.

+

hll_typmod_in

+

Receives typmod data.

+

hll_typmod_out

+

Sends typmod data.

+

hll_hashval_in

+

Receives hll_hashval data.

+

hll_hashval_out

+

Sends hll_hashval data.

+

hll_add_trans0

+

Works similar to hll_add, and is used on the first phase of DNs in distributed aggregation operations.

+

hll_union_trans

+

Works similar to hll_union, and is used on the first phase of DNs in distributed aggregation operations.

+

hll_union_collect

+

Works similar to hll_union, and is used on the second phase of CNs in distributed aggregation operations to summarize the results of each DN.

+

hll_pack

+

Is used on the third phase of CNs in distributed aggregation operations to convert a user-defined type hll_trans_type to the hll type.

+

hll

+

Converts a hll type to another hll type. Input parameters can be specified.

+

hll_hashval

+

Converts the bigint type to the hll_hashval type.

+

hll_hashval_int4

+

Converts the int4 type to the hll_hashval type.

+
+
+

Operators

  • =

    Description: Compares the values of hll and hll_hashval types to check whether they are the same.

    +

    Return type: bool

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    --hll
    +select (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1));
    +column 
    +----------
    + t
    +(1 row)
    +
    +--hll_hashval
    +select hll_hash_integer(1) = hll_hash_integer(1);
    + ?column? 
    +----------
    + t
    +(1 row)
    +
    + +
    +
+
+
  • <> or !=

    Description: Compares the values of hll and hll_hashval types to check whether they are different.

    +

    Return type: bool

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    --hll
    +select (hll_empty() || hll_hash_integer(1)) <> (hll_empty() || hll_hash_integer(2));
    + ?column? 
    +----------
    + t
    +(1 row)
    +
    +--hll_hashval
    +select hll_hash_integer(1) <> hll_hash_integer(2);
    + ?column? 
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • ||

    Description: Represents the functions of hll_add, hll_union, and hll_add_rev.

    +

    Return type: hll

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    --hll_add
    +select hll_empty() || hll_hash_integer(1);
    +         ?column?         
    +--------------------------
    + \x128b7f8895a3f5af28cafe
    +(1 row)
    + 
    +--hll_add_rev
    +select hll_hash_integer(1) || hll_empty();
    +         ?column?         
    +--------------------------
    + \x128b7f8895a3f5af28cafe
    +(1 row)
    + 
    +--hll_union
    +select (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2));
    +                 ?column?                 
    +------------------------------------------
    + \x128b7f8895a3f5af28cafeda0ce907e4355b60
    +(1 row)
    +
    + +
    +
  • #

    Description: Calculates the number of distinct values of an HLL. It works the same as the hll_cardinality function.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select #(hll_empty() || hll_hash_integer(1));
    + ?column? 
    +----------
    +        1
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0043.html b/docs/dws/dev/dws_06_0043.html new file mode 100644 index 00000000..bd9c9f50 --- /dev/null +++ b/docs/dws/dev/dws_06_0043.html @@ -0,0 +1,123 @@ + + +

SEQUENCE Functions

+

The sequence functions provide a simple method to ensure security of multiple users for users to obtain sequence values from sequence objects.

+
  • The hybrid data warehouse (standalone) does not support SEQUENCE and related functions.
+
+
  • nextval(regclass)

    Specifies an increasing sequence and returns a new value.

    +
    • To avoid blocking of concurrent transactions that obtain numbers from the same sequence, a nextval operation is never rolled back; that is, once a value has been fetched it is considered used, even if the transaction that did the nextval later aborts. This means that aborted transactions may leave unused "holes" in the sequence of assigned values. Therefore, sequences in GaussDB(DWS) cannot be used to obtain sequence without gaps.
    • If the nextval function is pushed to DNs, each DN will automatically connect to the GTM and requests the next value. For example, in the insert into t1 select xxx statement, a column in table t1 needs to invoke the nextval function. If maximum number of connections on the GTM is 8192, this type of pushed statements occupies too many GTM connections. Therefore, the number of concurrent connections for these statements is limited to 7000 divided by the number of cluster DNs. The other 1192 connections are reserved for other statements.
    +
    +

    Return type: bigint

    +

    The nextval function can be invoked in either of the following ways: (In example 2, the Oracle syntax is supported. Currently, the sequence name cannot contain a dot.)

    +

    Example 1:

    +
    1
    +2
    +3
    +4
    +5
    select nextval('seqDemo'); 
    + nextval
    +---------
    +       2
    +(1 row)
    +
    + +
    +

    Example 2:

    +
    1
    +2
    +3
    +4
    +5
    select seqDemo.nextval; 
    + nextval
    +---------
    +       2
    +(1 row)
    +
    + +
    +
  • currval(regclass)

    Returns the last value of nextval for a specified sequence in the current session. If nextval has not been invoked for the specified sequence in the current session, an error is reported when currval is invoked. By default, currval is disabled. To enable it, set enable_beta_features to true. After currval is enabled, nextval will not be pushed down.

    +

    Return type: bigint

    +

    The currval function can be invoked in either of the following ways: (In example 2, the Oracle syntax is supported. Currently, the sequence name cannot contain a dot.)

    +

    Example 1:

    +
    1
    +2
    +3
    +4
    +5
    select currval('seq1'); 
    + currval
    +---------
    +       2
    +(1 row)
    +
    + +
    +

    Example 2:

    +
    1
    +2
    +3
    +4
    +5
    select seq1.currval seq1; 
    + currval
    +---------
    +       2
    +(1 row)
    +
    + +
    +
  • lastval()

    Returns the last value of nextval in the current session. This function is equivalent to currval, but lastval does not have a parameter. If nextval has not been invoked in the current session, an error is reported when lastval is invoked.

    +

    By default, lastval is disabled. To enable it, set enable_beta_features or lastval_supported to true. After lastval is enabled, nextval will not be pushed down.

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select lastval(); 
    + lastval
    +---------
    +       2
    +(1 row)
    +
    + +
    +
  • setval(regclass, bigint)

    Sets the current value of a sequence.

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select setval('seqDemo',1);
    + setval
    +--------
    +      1
    +(1 row)
    +
    + +
    +
  • setval(regclass, bigint, boolean)

    Sets the current value of a sequence and the is_called sign.

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    select setval('seqDemo',1,true);
    + setval
    +--------
    +      1
    +(1 row)
    +
    + +
    +

    The current session and GTM will take effect immediately after setval is performed. If other sessions have buffered sequence values, setval will take effect only after the values are used up. Therefore, to prevent sequence value conflicts, you are advised to use setval with caution.

    +

    Because the sequence is non-transactional, changes made by setval will not be canceled when a transaction rolled back.

    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0044.html b/docs/dws/dev/dws_06_0044.html new file mode 100644 index 00000000..378fe924 --- /dev/null +++ b/docs/dws/dev/dws_06_0044.html @@ -0,0 +1,387 @@ + + +

Array Functions and Operators

+

Array Operators

  • =

    Description: Specifies whether two arrays are equal.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3] AS RESULT ;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <>

    Description: Specifies whether two arrays are not equal.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,2,3] <> ARRAY[1,2,4] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <

    Description: Specifies whether an array is less than another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,2,3] < ARRAY[1,2,4] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >

    Description: Specifies whether an array is greater than another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,4,3] > ARRAY[1,2,4] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <=

    Description: Specifies whether an array is less than another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,2,3] <= ARRAY[1,2,3] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >=

    Description: Specifies whether an array is greater than or equal to another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,4,3] >= ARRAY[1,4,3] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • @>

    Description: Specifies whether an array contains another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,4,3] @> ARRAY[3,1] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <@

    Description: Specifies whether an array is contained in another.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[2,7] <@ ARRAY[1,7,4,2,6] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &&

    Description: Specifies whether an array overlaps another (have common elements).

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,4,3] && ARRAY[2,1] AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • ||

    Description: Array-to-array concatenation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,2,3] || ARRAY[4,5,6] AS RESULT;
    +    result     
    +---------------
    + {1,2,3,4,5,6}
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]] AS RESULT;
    +          result           
    +---------------------------
    + {{1,2,3},{4,5,6},{7,8,9}}
    +(1 row)
    +
    + +
    +
  • ||

    Description: Element-to-array concatenation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 3 || ARRAY[4,5,6] AS RESULT;
    +  result   
    +-----------
    + {3,4,5,6}
    +(1 row)
    +
    + +
    +
  • ||

    Description: Array-to-element concatenation

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ARRAY[4,5,6] || 7 AS RESULT;
    +  result   
    +-----------
    + {4,5,6,7}
    +(1 row)
    +
    + +
    +
+
+

Array comparisons compare the array contents element-by-element, using the default B-tree comparison function for the element data type. In multidimensional arrays, the elements are accessed in row-major order. If the contents of two arrays are equal but the dimensionality is different, the first difference in the dimensionality information determines the sort order.

+

Array Functions

  • array_append(anyarray, anyelement)

    Description: Appends an element to the end of an array, and only supports dimension-1 arrays.

    +

    Return type: anyarray

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_append(ARRAY[1,2], 3) AS RESULT;
    + result  
    +---------
    + {1,2,3}
    +(1 row)
    +
    + +
    +
  • array_prepend(anyelement, anyarray)

    Description: Appends an element to the beginning of an array, and only supports dimension-1 arrays.

    +

    Return type: anyarray

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_prepend(1, ARRAY[2,3]) AS RESULT;
    + result  
    +---------
    + {1,2,3}
    +(1 row)
    +
    + +
    +
  • array_cat(anyarray, anyarray)

    Description: Concatenates two arrays, and supports multi-dimensional arrays.

    +

    Return type: anyarray

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT array_cat(ARRAY[1,2,3], ARRAY[4,5]) AS RESULT;
    +   result    
    +-------------
    + {1,2,3,4,5}
    +(1 row)
    +
    +SELECT array_cat(ARRAY[[1,2],[4,5]], ARRAY[6,7]) AS RESULT;
    +       result        
    +---------------------
    + {{1,2},{4,5},{6,7}}
    +(1 row)
    +
    + +
    +
  • array_ndims(anyarray)

    Description: Returns the number of dimensions of the array.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_ndims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;
    + result 
    +--------
    +      2
    +(1 row)
    +
    + +
    +
  • array_dims(anyarray)

    Description: Returns a text representation of array's dimensions.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_dims(ARRAY[[1,2,3], [4,5,6]]) AS RESULT;
    +   result   
    +------------
    + [1:2][1:3]
    +(1 row)
    +
    + +
    +
  • array_length(anyarray, int)

    Description: Returns the length of the requested array dimension.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_length(array[1,2,3], 1) AS RESULT;
    + result 
    +--------
    +      3
    +(1 row)
    +
    + +
    +
  • array_lower(anyarray, int)

    Description: Returns lower bound of the requested array dimension.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_lower('[0:2]={1,2,3}'::int[], 1) AS RESULT;
    + result 
    +--------
    +      0
    +(1 row)
    +
    + +
    +
  • array_upper(anyarray, int)

    Description: Returns upper bound of the requested array dimension.

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_upper(ARRAY[1,8,3,7], 1) AS RESULT;
    + result 
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • array_to_string(anyarray, text [, text])

    Description: Uses the first text as the new delimiter and the second text to replace NULL values.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_to_string(ARRAY[1, 2, 3, NULL, 5], ',', '*') AS RESULT;
    +  result   
    +-----------
    + 1,2,3,*,5
    +(1 row)
    +
    + +
    +
  • string_to_array(text, text [, text])

    Description: Uses the second text as the new delimiter and the third text as the substring to be replaced by NULL values. A substring can be replaced by NULL values only when it is the same as the third text.

    +

    Return type: text[]

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'yy') AS RESULT;
    +    result    
    +--------------
    + {xx,NULL,zz}
    +(1 row)
    +SELECT string_to_array('xx~^~yy~^~zz', '~^~', 'y') AS RESULT;
    +   result   
    +------------
    + {xx,yy,zz}
    +(1 row)
    +
    + +
    +
  • unnest(anyarray)

    Description: Expands an array to a set of rows.

    +

    Return type: setof anyelement

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT unnest(ARRAY[1,2]) AS RESULT;
    + result 
    +--------
    +      1
    +      2
    +(2 rows)
    +
    + +
    +
+
+

In string_to_array, if the delimiter parameter is NULL, each character in the input string will become a separate element in the resulting array. If the delimiter is an empty string, then the entire input string is returned as a one-element array. Otherwise the input string is split at each occurrence of the delimiter string.

+

In string_to_array, if the null-string parameter is omitted or NULL, none of the substrings of the input will be replaced by NULL.

+

In array_to_string, if the null-string parameter is omitted or NULL, any null elements in the array are simply skipped and not represented in the output string.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0045.html b/docs/dws/dev/dws_06_0045.html new file mode 100644 index 00000000..5fecd956 --- /dev/null +++ b/docs/dws/dev/dws_06_0045.html @@ -0,0 +1,389 @@ + + +

Range Functions and Operators

+

Range Operators

  • =

    Description: Equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int4range(1,5) = '[1,4]'::int4range AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <>

    Description: Does not equal to

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numrange(1.1,2.2) <> numrange(1.1,2.3) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <

    Description: Is less than

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int4range(1,10) < int4range(2,3) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >

    Description: Is greater than

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int4range(1,10) > int4range(1,5) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <=

    Description: Is less than or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numrange(1.1,2.2) <= numrange(1.1,2.2) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >=

    Description: Is greater than or equals

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numrange(1.1,2.2) >= numrange(1.1,2.0) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • @>

    Description: Contains range

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int4range(2,4) @> int4range(2,3) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • @>

    Description: Contains element

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT '[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <@

    Description: Range is contained by

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int4range(2,4) <@ int4range(1,7) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <@

    Description: Element is contained by

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT 42 <@ int4range(1,7) AS RESULT;
    + result
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • &&

    Description: Overlap (have points in common)

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(3,7) && int8range(4,12) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • <<

    Description: Strictly left of

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(1,10) << int8range(100,110) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • >>

    Description: Strictly right of

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(50,60) >> int8range(20,30) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &<

    Description: Does not extend to the right of

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(1,20) &< int8range(18,20) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • &>

    Description: Does not extend to the left of

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(7,20) &> int8range(5,10) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • -|-

    Description: Is adjacent to

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numrange(1.1,2.2) -|- numrange(2.2,3.3) AS RESULT;
    + result
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • +

    Description: Union

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT numrange(5,15) + numrange(10,20) AS RESULT;
    + result 
    +--------
    + [5,20)
    +(1 row)
    +
    + +
    +
  • *

    Description: Intersection

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(5,15) * int8range(10,20) AS RESULT;
    + result  
    +---------
    + [10,15)
    +(1 row)
    +
    + +
    +
  • -

    Description: Difference

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT int8range(5,15) - int8range(10,20) AS RESULT;
    + result 
    +--------
    + [5,10)
    +(1 row)
    +
    + +
    +
+
+

The simple comparison operators <, >, <=, and >= compare the lower bounds first, and only if those are equal, compare the upper bounds.

+

The <<, >>, and -|- operators always return false when an empty range is involved; that is, an empty range is not considered to be either before or after any other range.

+

The union and difference operators will fail if the resulting range would need to contain two disjoint sub-ranges.

+

Range Functions

  • lower(anyrange)

    Description: Lower bound of range

    +

    Return type: Range's element type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lower(numrange(1.1,2.2)) AS RESULT;
    + result 
    +--------
    +    1.1
    +(1 row)
    +
    + +
    +
  • upper(anyrange)

    Description: Upper bound of range

    +

    Return type: Range's element type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT upper(numrange(1.1,2.2)) AS RESULT;
    + result 
    +--------
    +    2.2
    +(1 row)
    +
    + +
    +
  • isempty(anyrange)

    Description: Is the range empty?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isempty(numrange(1.1,2.2)) AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • lower_inc(anyrange)

    Description: Is the lower bound inclusive?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lower_inc(numrange(1.1,2.2)) AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • upper_inc(anyrange)

    Description: Is the upper bound inclusive?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT upper_inc(numrange(1.1,2.2)) AS RESULT;
    + result 
    +--------
    + f
    +(1 row)
    +
    + +
    +
  • lower_inf(anyrange)

    Description: Is the lower bound infinite?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT lower_inf('(,)'::daterange) AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
  • upper_inf(anyrange)

    Description: Is the upper bound infinite?

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT upper_inf('(,)'::daterange) AS RESULT;
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +
+
+

The lower and upper functions return null if the range is empty or the requested bound is infinite. The lower_inc, upper_inc, lower_inf, and upper_inf functions all return false for an empty range.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0046.html b/docs/dws/dev/dws_06_0046.html new file mode 100644 index 00000000..e377790a --- /dev/null +++ b/docs/dws/dev/dws_06_0046.html @@ -0,0 +1,933 @@ + + +

Aggregate Functions

+
  • sum(expression)

    Description: Sum of expression across all input values

    +

    Return type:

    +

    Generally, same as the argument data type. In the following cases, type conversion occurs:

    +
    • BIGINT for SMALLINT or INT arguments
    • NUMBER for BIGINT arguments
    • DOUBLE PRECISION for floating-point arguments
    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT SUM(ss_ext_tax) FROM tpcds.STORE_SALES;
    +  sum      
    +--------------
    + 213267594.69
    +(1 row)
    +
    + +
    +
  • max(expression)

    Description: Specifies the maximum value of expression across all input values.

    +

    Argument types: any array, numeric, string, or date/time type

    +

    Return type: same as the argument type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT MAX(inv_quantity_on_hand) FROM tpcds.inventory;
    +   max   
    +---------
    + 1000000
    +(1 row)
    +
    + +
    +
  • min(expression)

    Description: Specifies the minimum value of expression across all input values.

    +

    Argument types: any array, numeric, string, or date/time type

    +

    Return type: same as the argument type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT MIN(inv_quantity_on_hand) FROM tpcds.inventory;
    + min 
    +-----
    +   0
    +(1 row)
    +
    + +
    +
  • avg(expression)

    Description: Average (arithmetic mean) of all input values

    +

    Return type:

    +

    NUMBER for any integer-type argument.

    +

    DOUBLE PRECISION for floating-point parameters.

    +

    otherwise the same as the argument data type.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT AVG(inv_quantity_on_hand) FROM tpcds.inventory;
    +         avg          
    +----------------------
    + 500.0387129084044604
    +(1 row)
    +
    + +
    +
  • median(expression)

    Description: Median of all input values Currently, only the numeric and interval types are supported. Null values are not used for calculation.

    +

    Return type: If all input values are integers, a median of the NUMERIC type is returned; otherwise, a median of the same type as the input values is returned.

    +

    In the Teradata-compatible mode, if the input values are integers, the returned median is rounded to the nearest integer.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT MEDIAN(inv_quantity_on_hand) FROM tpcds.inventory;
    + median 
    +--------
    +    500
    +(1 row)
    +
    + +
    +
  • percentile_cont(const) within group(order by expression)

    Description: returns a value corresponding to the specified percentile in the ordering, interpolating between adjacent input items if needed. Null values are not used for calculation.

    +

    Input: const indicates a number ranging from 0 to 1. Currently, only numeric and interval expressions are supported.

    +

    Return type: If all input values are integers, a median of the NUMERIC type is returned; otherwise, a median of the same type as the input values is returned.

    +

    In the Teradata-compatible mode, if the input values are integers, the returned median is rounded to the nearest integer.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    select percentile_cont(0.3) within group(order by x) from (select generate_series(1,5) as x) as t;
    +percentile_cont
    +-----------------
    +2.2
    +(1 row)
    +select percentile_cont(0.3) within group(order by x desc) from (select generate_series(1,5) as x) as t;
    +percentile_cont
    +-----------------
    +3.8
    +(1 row)
    +
    + +
    +
  • percentile_disc(const) within group(order by expression)

    Description: returns the first input value whose position in the ordering equals or exceeds the specified percentile.

    +

    Input: const indicates a number ranging from 0 to 1. Currently, only numeric and interval expressions are supported. Null values are not used for calculation.

    +

    Return type: If all input values are integers, a median of the NUMERIC type is returned; otherwise, a median of the same type as the input values is returned.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    select percentile_disc(0.3) within group(order by x) from (select generate_series(1,5) as x) as t;
    +percentile_disc
    +-----------------
    +2
    +(1 row)
    +select percentile_disc(0.3) within group(order by x desc) from (select generate_series(1,5) as x) as t;
    +percentile_disc
    +-----------------
    +4
    +(1 row)
    +
    + +
    +
  • count(expression)

    Description: Number of input rows for which the value of expression is not null

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT COUNT(inv_quantity_on_hand) FROM tpcds.inventory;
    +  count   
    +----------
    + 11158087
    +(1 row)
    +
    + +
    +
  • count(*)

    Description: Number of input rows

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT COUNT(*) FROM tpcds.inventory;
    +  count   
    +----------
    + 11745000
    +(1 row)
    +
    + +
    +
  • array_agg(expression)

    Description: Input values, including nulls, concatenated into an array

    +

    Return type: array of the argument type

    +

    For example:

    +

    Create the employeeinfo table and insert data into the table.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    CREATE TABLE employeeinfo (empno smallint, ename varchar(20), job varchar(20), hiredate date,deptno smallint);
    +INSERT INTO employeeinfo VALUES (7155, 'JACK', 'SALESMAN', '2018-12-01', 30);
    +INSERT INTO employeeinfo VALUES (7003, 'TOM', 'FINANCE', '2016-06-15', 20);
    +INSERT INTO employeeinfo VALUES (7357, 'MAX', 'SALESMAN', '2020-10-01', 30);
    +
    +SELECT * FROM employeeinfo;
    + empno | ename |   job    |      hiredate       | deptno
    +-------+-------+----------+---------------------+--------
    +  7155 | JACK  | SALESMAN | 2018-12-01 00:00:00 |     30
    +  7357 | MAX   | SALESMAN | 2020-10-01 00:00:00 |     30
    +  7003 | TOM   | FINANCE  | 2016-06-15 00:00:00 |     20
    +(3 rows)
    +
    + +
    +

    Query the names of all employees in the department whose ID is 30.

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_agg(ename) FROM employeeinfo where deptno = 30;
    + array_agg
    +------------
    + {JACK,MAX}
    +(1 row)
    +
    + +
    +

    Query all employees in the same department.

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT deptno, array_agg(ename) FROM employeeinfo group by deptno;
    + deptno | array_agg
    +--------+------------
    +     30 | {JACK,MAX}
    +     20 | {TOM}
    +(2 rows)
    +
    + +
    +

    Query all department IDs and deduplicate them.

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT array_agg(distinct deptno) FROM employeeinfo group by deptno;
    + array_agg
    +-----------
    + {20}
    + {30}
    +(2 rows)
    +
    + +
    +

    Sort the deduplicated department IDs in descending order.

    +
    1
    +2
    +3
    +4
    +5
    SELECT array_agg(distinct deptno order by deptno desc) FROM employeeinfo;
    + array_agg
    +-----------
    + {30,20}
    +(1 row)
    +
    + +
    +
  • string_agg(expression, delimiter)

    Description: Input values concatenated into a string, separated by delimiter

    +

    Return type: same as the argument type

    +

    For example:

    +

    Query all employees in the same department.

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT deptno, string_agg(ename,',') from employeeinfo group by deptno;
    + deptno | string_agg
    +--------+------------
    +     30 | JACK,MAX
    +     20 | TOM
    +(2 rows)
    +
    + +
    +

    Query employees whose work IDs are smaller than 7156.

    +
    1
    +2
    +3
    +4
    +5
    SELECT string_agg(ename,',') FROM employeeinfo where empno < 7156;
    + string_agg
    +------------
    + TOM,JACK
    +(1 row)
    +
    + +
    +
  • listagg(expression [, delimiter]) WITHIN GROUP(ORDER BY order-list)

    Description: Aggregation column data sorted according to the mode specified by WITHIN GROUP, and concatenated to a string using the specified delimiter

    +
    • expression: Mandatory. It specifies an aggregation column name or a column-based, valid expression. It does not support the DISTINCT keyword and the VARIADIC parameter.
    • delimiter: Optional. It specifies a delimiter, which can be a string constant or a deterministic expression based on a group of columns. The default value is empty.
    • order-list: Mandatory. It specifies the sorting mode in a group.
    +

    Return type: text

    +

    listagg is a column-to-row aggregation function, compatible with Oracle Database 11g Release 2. You can specify the OVER clause as a window function. When listagg is used as a window function, the OVER clause does not support the window sorting or framework of ORDER BY, so as to avoid ambiguity in listagg and ORDER BY of the WITHIN GROUP clause.

    +
    +

    For example:

    +

    The aggregation column is of the text character set type.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT deptno, listagg(ename, ',') WITHIN GROUP(ORDER BY ename) AS employees FROM emp GROUP BY deptno;
    + deptno |              employees               
    +--------+--------------------------------------
    +     10 | CLARK,KING,MILLER
    +     20 | ADAMS,FORD,JONES,SCOTT,SMITH
    +     30 | ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD
    +(3 rows)
    +
    + +
    +

    The aggregation column is of the integer type.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT deptno, listagg(mgrno, ',') WITHIN GROUP(ORDER BY mgrno NULLS FIRST) AS mgrnos FROM emp GROUP BY deptno;
    + deptno |            mgrnos             
    +--------+-------------------------------
    +     10 | 7782,7839
    +     20 | 7566,7566,7788,7839,7902
    +     30 | 7698,7698,7698,7698,7698,7839
    +(3 rows)
    +
    + +
    +

    The aggregation column is of the floating point type.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    SELECT job, listagg(bonus, '($); ') WITHIN GROUP(ORDER BY bonus DESC) || '($)' AS bonus FROM emp GROUP BY job;
    +    job     |                      bonus                      
    +------------+-------------------------------------------------
    + CLERK      | 10234.21($); 2000.80($); 1100.00($); 1000.22($)
    + PRESIDENT  | 23011.88($)
    + ANALYST    | 2002.12($); 1001.01($)
    + MANAGER    | 10000.01($); 2399.50($); 999.10($)
    + SALESMAN   | 1000.01($); 899.00($); 99.99($); 9.00($)
    +(5 rows)
    +
    + +
    +

    The aggregation column is of the time type.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT deptno, listagg(hiredate, ', ') WITHIN GROUP(ORDER BY hiredate DESC) AS hiredates FROM emp GROUP BY deptno;
    + deptno |                                                          hiredates                                                           
    +--------+------------------------------------------------------------------------------------------------------------------------------
    +     10 | 1982-01-23 00:00:00, 1981-11-17 00:00:00, 1981-06-09 00:00:00
    +     20 | 2001-04-02 00:00:00, 1999-12-17 00:00:00, 1987-05-23 00:00:00, 1987-04-19 00:00:00, 1981-12-03 00:00:00
    +     30 | 2015-02-20 00:00:00, 2010-02-22 00:00:00, 1997-09-28 00:00:00, 1981-12-03 00:00:00, 1981-09-08 00:00:00, 1981-05-01 00:00:00
    +(3 rows)
    +
    + +
    +

    The aggregation column is of the time interval type.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT deptno, listagg(vacationTime, '; ') WITHIN GROUP(ORDER BY vacationTime DESC) AS vacationTime FROM emp GROUP BY deptno;
    + deptno |                                    vacationtime                                    
    +--------+------------------------------------------------------------------------------------
    +     10 | 1 year 30 days; 40 days; 10 days
    +     20 | 70 days; 36 days; 9 days; 5 days
    +     30 | 1 year 1 mon; 2 mons 10 days; 30 days; 12 days 12:00:00; 4 days 06:00:00; 24:00:00
    +(3 rows)
    +
    + +
    +

    By default, the delimiter is empty.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT deptno, listagg(job) WITHIN GROUP(ORDER BY job) AS jobs FROM emp GROUP BY deptno;
    + deptno |                     jobs                     
    +--------+----------------------------------------------
    +     10 | CLERKMANAGERPRESIDENT
    +     20 | ANALYSTANALYSTCLERKCLERKMANAGER
    +     30 | CLERKMANAGERSALESMANSALESMANSALESMANSALESMAN
    +(3 rows)
    +
    + +
    +

    When listagg is used as a window function, the OVER clause does not support the window sorting of ORDER BY, and the listagg column is an ordered aggregation of the corresponding groups.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    SELECT deptno, mgrno, bonus, listagg(ename,'; ') WITHIN GROUP(ORDER BY hiredate) OVER(PARTITION BY deptno) AS employees FROM emp;
    + deptno | mgrno |  bonus   |                 employees                 
    +--------+-------+----------+-------------------------------------------
    +     10 |  7839 | 10000.01 | CLARK; KING; MILLER
    +     10 |       | 23011.88 | CLARK; KING; MILLER
    +     10 |  7782 | 10234.21 | CLARK; KING; MILLER
    +     20 |  7566 |  2002.12 | FORD; SCOTT; ADAMS; SMITH; JONES
    +     20 |  7566 |  1001.01 | FORD; SCOTT; ADAMS; SMITH; JONES
    +     20 |  7788 |  1100.00 | FORD; SCOTT; ADAMS; SMITH; JONES
    +     20 |  7902 |  2000.80 | FORD; SCOTT; ADAMS; SMITH; JONES
    +     20 |  7839 |   999.10 | FORD; SCOTT; ADAMS; SMITH; JONES
    +     30 |  7839 |  2399.50 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +     30 |  7698 |     9.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +     30 |  7698 |  1000.22 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +     30 |  7698 |    99.99 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +     30 |  7698 |  1000.01 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +     30 |  7698 |   899.00 | BLAKE; TURNER; JAMES; MARTIN; WARD; ALLEN
    +(14 rows)
    +
    + +
    +
  • covar_pop(Y, X)

    Description: Overall covariance

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT COVAR_POP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +    covar_pop     
    +------------------
    + 829.749627587403
    +(1 row)
    +
    + +
    +
  • covar_samp(Y, X)

    Description: Sample covariance

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT COVAR_SAMP(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +    covar_samp    
    +------------------
    + 830.052235037289
    +(1 row)
    +
    + +
    +
  • stddev_pop(expression)

    Description: Overall standard difference

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT STDDEV_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +    stddev_pop    
    +------------------
    + 289.224294957556
    +(1 row)
    +
    + +
    +
  • stddev_samp(expression)

    Description: Sample standard deviation of the input values

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT STDDEV_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +   stddev_samp    
    +------------------
    + 289.224359757315
    +(1 row)
    +
    + +
    +
  • var_pop(expression)

    Description: Population variance of the input values (square of the population standard deviation)

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT VAR_POP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +      var_pop       
    +--------------------
    + 83650.692793695475
    +(1 row)
    +
    + +
    +
  • var_samp(expression)

    Description: Sample variance of the input values (square of the sample standard deviation)

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT VAR_SAMP(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +      var_samp      
    +--------------------
    + 83650.730277028768
    +(1 row)
    +
    + +
    +
  • bit_and(expression)

    Description: The bitwise AND of all non-null input values, or null if none

    +

    Return type: same as the argument type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT BIT_AND(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    + bit_and 
    +---------
    +       0
    +(1 row)
    +
    + +
    +
  • bit_or(expression)

    Description: The bitwise OR of all non-null input values, or null if none

    +

    Return type: same as the argument type

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT BIT_OR(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    + bit_or 
    +--------
    +   1023
    +(1 row)
    +
    + +
    +
  • bool_and(expression)

    Description: Its value is true if all input values are true, otherwise false.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT bool_and(100 <2500);
    + bool_and
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • bool_or(expression)

    Description: Its value is true if at least one input value is true, otherwise false.

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT bool_or(100 <2500);
    + bool_or
    +----------
    + t
    +(1 row)
    +
    + +
    +
  • corr(Y, X)

    Description: Correlation coefficient

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT CORR(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +       corr        
    +-------------------
    + .0381383624904186
    +(1 row)
    +
    + +
    +
  • every(expression)

    Description: Equivalent to bool_and

    +

    Return type: bool

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT every(100 <2500);
    + every
    +-------
    + t
    +(1 row)
    +
    + +
    +
  • rank(expression)

    Description: The tuples in different groups are sorted non-consecutively by expression.

    +

    Return type: bigint

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2;
    +   d_moy | d_fy_week_seq | rank 
    +-------+---------------+------
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             1 |    1
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             2 |    8
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             3 |   15
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             4 |   22
    +     1 |             5 |   29
    +     1 |             5 |   29
    +     2 |             5 |    1
    +     2 |             5 |    1
    +     2 |             5 |    1
    +     2 |             5 |    1
    +     2 |             5 |    1
    +     2 |             6 |    6
    +     2 |             6 |    6
    +     2 |             6 |    6
    +     2 |             6 |    6
    +     2 |             6 |    6
    +     2 |             6 |    6
    +     2 |             6 |    6
    +(42 rows)
    +
    + +
    +
  • regr_avgx(Y, X)

    Description: Average of the independent variable (sum(X)/N)

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_AVGX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +    regr_avgx     
    +------------------
    + 578.606576740795
    +(1 row)
    +
    + +
    +
  • regr_avgy(Y, X)

    Description: Average of the dependent variable (sum(Y)/N)

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_AVGY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +    regr_avgy     
    +------------------
    + 50.0136711629602
    +(1 row)
    +
    + +
    +
  • regr_count(Y, X)

    Description: Number of input rows in which both expressions are non-null

    +

    Return type: bigint

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_COUNT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    + regr_count 
    +------------
    +       2743
    +(1 row)
    +
    + +
    +
  • regr_intercept(Y, X)

    Description: y-intercept of the least-squares-fit linear equation determined by the (X, Y) pairs

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_INTERCEPT(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +  regr_intercept  
    +------------------
    + 49.2040847848607
    +(1 row)
    +
    + +
    +
  • regr_r2(Y, X)

    Description: Square of the correlation coefficient

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_R2(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +      regr_r2       
    +--------------------
    + .00145453469345058
    +(1 row)
    +
    + +
    +
  • regr_slope(Y, X)

    Description: Slope of the least-squares-fit linear equation determined by the (X, Y) pairs

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_SLOPE(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +     regr_slope     
    +--------------------
    + .00139920009665259
    +(1 row)
    +
    + +
    +
  • regr_sxx(Y, X)

    Description: sum(X^2) - sum(X)^2/N (sum of squares of the independent variables)

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_SXX(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +     regr_sxx     
    +------------------
    + 1626645991.46135
    +(1 row)
    +
    + +
    +
  • regr_sxy(Y, X)

    Description: sum(X*Y) - sum(X) * sum(Y)/N ("sum of products" of independent times dependent variable)

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_SXY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +     regr_sxy     
    +------------------
    + 2276003.22847225
    +(1 row)
    +
    + +
    +
  • regr_syy(Y, X)

    Description: sum(Y^2) - sum(Y)^2/N ("sum of squares" of the dependent variable)

    +

    Return type: double precision

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT REGR_SYY(sr_fee, sr_net_loss) FROM tpcds.store_returns WHERE sr_customer_sk < 1000;
    +    regr_syy     
    +-----------------
    + 2189417.6547314
    +(1 row)
    +
    + +
    +
  • stddev(expression)

    Description: Alias of stddev_samp

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT STDDEV(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +      stddev      
    +------------------
    + 289.224359757315
    +(1 row)
    +
    + +
    +
  • variance(expexpression,ression)

    Description: Alias of var_samp

    +

    Return type: double precision for floating-point arguments, otherwise numeric

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT VARIANCE(inv_quantity_on_hand) FROM tpcds.inventory WHERE inv_warehouse_sk = 1;
    +      variance      
    +--------------------
    + 83650.730277028768
    +(1 row)
    +
    + +
    +
  • checksum(expression)

    Description: Returns the CHECKSUM value of all input values. This function can be used to check whether the data in the tables before and after GaussDB(DWS) data restoration or migration is the same. Other databases cannot be checked by using this function. Before and after database backup, database restoration, or data migration, you need to manually run SQL commands to obtain the execution results. Compare the obtained execution results to check whether the data in the tables before and after the backup or migration is the same.

    +
    • For large tables, the CHECKSUM function may take a long time.
    • If the CHECKSUM values of two tables are different, it indicates that the contents of the two tables are different. Using the hash function in the CHECKSUM function may incur conflicts. There is low possibility that two tables with different contents may have the same CHECKSUM value. The same problem may occur when CHECKSUM is used for columns.
    • If the time type is timestamp, timestamptz, or smalldatetime, ensure that the time zone settings are the same when calculating the CHECKSUM value.
    +
    +
    • If the CHECKSUM value of a column is calculated and the column type can be changed to TEXT by default, set expression to the column name.
    • If the CHECKSUM value of a column is calculated and the column type cannot be changed to TEXT by default, set expression to Column name::TEXT.
    • If the CHECKSUM value of all columns is calculated, set expression to Table name::TEXT.
    +

    The following types of data can be converted into TEXT types by default: char, name, int8, int2, int1, int4, raw, pg_node_tree, float4, float8, bpchar, varchar, nvarchar2, date, timestamp, timestamptz, numeric, and smalldatetime. Other types need to be forcibly converted to TEXT.

    +

    Return type: numeric

    +

    For example:

    +

    The following shows the CHECKSUM value of a column that can be converted to the TEXT type by default:

    +
    1
    +2
    +3
    +4
    +5
    SELECT CHECKSUM(inv_quantity_on_hand) FROM tpcds.inventory;
    +     checksum      
    +-------------------
    + 24417258945265247
    +(1 row)
    +
    + +
    +

    The following shows the CHECKSUM value of a column that cannot be converted to the TEXT type by default: The CHECKSUM parameter is set to Column name::TEXT.

    +
    1
    +2
    +3
    +4
    +5
    SELECT CHECKSUM(inv_quantity_on_hand::TEXT) FROM tpcds.inventory;
    +     checksum      
    +-------------------
    + 24417258945265247
    +(1 row)
    +
    + +
    +

    The following shows the CHECKSUM value of all columns in a table. Note that the CHECKSUM parameter is set to Table name::TEXT. The table name is not modified by its schema.

    +
    1
    +2
    +3
    +4
    +5
    SELECT CHECKSUM(inventory::TEXT) FROM tpcds.inventory;                    
    +     checksum      
    +-------------------
    + 25223696246875800
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0047.html b/docs/dws/dev/dws_06_0047.html new file mode 100644 index 00000000..9c713e7d --- /dev/null +++ b/docs/dws/dev/dws_06_0047.html @@ -0,0 +1,309 @@ + + +

Window Functions

+

Regular aggregate functions return a single value calculated from values in a row, or group all rows into a single output row. Window functions perform a calculation across a set of rows and return a value for each row.

+
  • A window function call represents the application of an aggregate-like function over some portion of the rows selected by a query. Therefore, aggregate functions (Aggregate Functions) can also be used as window functions. In addition, window functions are able to scan all the rows and divide the query rows into a partition by using the PARTITION BY clause.
  • Column-store tables support only the window functions rank (expression) and row_number (expression) and the aggregate functions sum, count, avg, min, and max. Row-store tables do not have such restrictions.
  • Invoking a window function requires special syntax using the OVER clause to specify a window. The OVER clause is used for grouping data and sorting the elements in a group. Window functions are used for generating sequence numbers for the values in the group.
  • order by in a window function must be followed by a column name. If it is followed by a number, the number is processed as a constant value and the target column is not ranked.
+

Syntax of a Window Function

1
function_name ([expression [, expression ... ]]) OVER ( window_definition ) function_name ([expression [, expression ... ]]) OVER window_namefunction_name ( * ) OVER ( window_definition ) function_name ( * ) OVER window_name
+
+ +
+

window_definition is defined as follows:

+
1
[ existing_window_name ] [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ]
+
+ +
+

frame_clause is defined as follows:

+
1
[ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end
+
+ +
+

You can use RANGE and ROWS to specify the window frame. ROWS specifies the window in physical units (rows). RANGE specifies the window as a logical offset.

+

In RANGE and ROWS, you can use BETWEEN frame_start AND frame_end to specify the window's first and last rows. If frame_end is left blank, it defaults to CURRENT ROW.

+

The value options of BETWEEN frame_start AND frame_end are as follows:

+
  • CURRENT ROW: The current row is used as the window frame's start or end point.
  • N PRECEDING: The window frame starts from the nth row to the current row.
  • UNBOUNDED PRECEDING: The window frame starts at the first row of the partition.
  • N FOLLOWING: The window frame starts from the current row to the nth row.
  • UNBOUNDED FOLLOWING: The window frame ends with the last row of the partition.
+

frame_start cannot be UNBOUNDED FOLLOWING, frame_end cannot be UNBOUNDED PRECEDING, and frame_end cannot be earlier than frame_start. For example, RANGE BETWEEN CURRENT ROW AND value PRECEDING is not allowed.

+
+

Window Functions

  • RANK()

    Description: The RANK function is used for generating non-consecutive sequence numbers for the values in each group. The same values have the same sequence number.

    +

    Return type: bigint

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, rank() OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | rank
    +-------+------------+------
    +     1 |          1 |    1
    +     1 |          1 |    1
    +     1 |          2 |    3
    +     1 |          2 |    3
    +     2 |          3 |    1
    +     2 |          3 |    1
    +(6 rows)
    +
    + +
    +
  • ROW_NUMBER()

    Description: The ROW_NUMBER function is used for generating consecutive sequence numbers for the values in each group. The same values have different sequence numbers.

    +

    Return type: bigint

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, Row_number() OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | row_number
    +-------+------------+------------
    +     1 |          1 |          1
    +     1 |          1 |          2
    +     1 |          2 |          3
    +     1 |          2 |          4
    +     2 |          3 |          1
    +     2 |          3 |          2
    +(6 rows)
    +
    + +
    +
  • DENSE_RANK()

    Description: The DENSE_RANK function is used for generating consecutive sequence numbers for the values in each group. The same values have the same sequence number.

    +

    Return type: bigint

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, dense_rank() OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | dense_rank
    +-------+------------+------------
    +     1 |          1 |          1
    +     1 |          1 |          1
    +     1 |          2 |          2
    +     1 |          2 |          2
    +     2 |          3 |          1
    +     2 |          3 |          1
    +(6 rows)
    +
    + +
    +
  • PERCENT_RANK()

    Description: The PERCENT_RANK function is used for generating corresponding sequence numbers for the values in each group. That is, the function calculates the value according to the formula Sequence number = (Rank – 1)/(Total rows – 1). Rank is the corresponding sequence number generated based on the RANK function for the value and Total rows is the total number of elements in a group.

    +

    Return type: double precision

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, percent_rank() OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq |   percent_rank
    +-------+------------+------------------
    +     1 |          1 |                0
    +     1 |          1 |                0
    +     1 |          2 | .666666666666667
    +     1 |          2 | .666666666666667
    +     2 |          3 |                0
    +     2 |          3 |                0
    +(6 rows)
    +
    + +
    +
  • CUME_DIST()

    Description: The CUME_DIST function is used for generating accumulative distribution sequence numbers for the values in each group. That is, the function calculates the value according to the following formula: Sequence number = Number of rows preceding or peer with current row/Total rows.

    +

    Return type: double precision

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, cume_dist() OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date e_dim WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | cume_dist
    +-------+------------+-----------
    +     1 |          1 |        .5
    +     1 |          1 |        .5
    +     1 |          2 |         1
    +     1 |          2 |         1
    +     2 |          3 |         1
    +     2 |          3 |         1
    +(6 rows)
    +
    + +
    +
  • NTILE(num_buckets integer)

    Description: The NTILE function is used for equally allocating sequential data sets to the buckets whose quantity is specified by num_buckets according to num_buckets integer and allocating the bucket number to each row. Divide the partition as equally as possible.

    +

    Return type: integer

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, ntile(3) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | ntile
    +-------+------------+-------
    +     1 |          1 |     1
    +     1 |          1 |     1
    +     1 |          2 |     2
    +     1 |          2 |     3
    +     2 |          3 |     1
    +     2 |          3 |     2
    +(6 rows)
    +
    + +
    +
  • LAG(value any [, offset integer [, default any ]])

    Description: The LAG function is used for generating lag values for the corresponding values in each group. That is, the value of the row obtained by moving forward the row corresponding to the current value by offset (integer) is the sequence number. If the row does not exist after the moving, the result value is the default value. If omitted, offset defaults to 1 and default to null.

    +

    Return type: same as the parameter type

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, lag(d_mon,3,null) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | lag
    +-------+------------+-----
    +     1 |          1 |
    +     1 |          1 |
    +     1 |          2 |
    +     1 |          2 |   1
    +     2 |          3 |
    +     2 |          3 |
    +(6 rows)
    +
    + +
    +
  • LEAD(value any [, offset integer [, default any ]])

    Description: The LEAD function is used for generating leading values for the corresponding values in each group. That is, the value of the row obtained by moving backward the row corresponding to the current value by offset (integer) is the sequence number. If the number of rows after the moving exceeds the total number for the current group, the result value is the default value. If omitted, offset defaults to 1 and default to null.

    +

    Return type: same as the parameter type

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, lead(d_week_seq,2) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM  reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | lead
    +-------+------------+------
    +     1 |          1 |    2
    +     1 |          1 |    2
    +     1 |          2 |
    +     1 |          2 |
    +     2 |          3 |
    +     2 |          3 |
    +(6 rows)
    +
    + +
    +
  • FIRST_VALUE(value any)

    Description: The FIRST_VALUE function is used for returning the first value of each group.

    +

    Return type: same as the parameter type

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, first_value(d_week_seq) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 7 ORDER BY 1,2;
    + d_mon | d_week_seq | first_value
    +-------+------------+-------------
    +     1 |          1 |           1
    +     1 |          1 |           1
    +     1 |          2 |           1
    +     1 |          2 |           1
    +     2 |          3 |           3
    +     2 |          3 |           3
    +(6 rows)
    +
    + +
    +
  • LAST_VALUE(value any)

    Description: Returns the last value of each group.

    +

    Return type: same as the parameter type

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, last_value(d_mon) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 6 ORDER BY 1,2;
    + d_mon | d_week_seq | last_value
    +-------+------------+------------
    +     1 |          1 |          1
    +     1 |          1 |          1
    +     1 |          2 |          1
    +     1 |          2 |          1
    +     2 |          3 |          2
    +     2 |          3 |          2
    +(6 rows)
    +
    + +
    +
  • NTH_VALUE(value any, nth integer)

    Description: The nth row for a group is the returned value. If the row does not exist, NULL is returned by default.

    +

    Return type: same as the parameter type

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT d_mon, d_week_seq, nth_value(d_week_seq,2) OVER(PARTITION BY d_mon ORDER BY d_week_seq) FROM reason_date WHERE d_mon < 4 AND d_week_seq < 6 ORDER BY 1,2;
    + d_mon | d_week_seq | nth_value
    +-------+------------+-----------
    +     1 |          1 |         1
    +     1 |          1 |         1
    +     1 |          2 |         1
    +     1 |          2 |         1
    +     2 |          3 |         3
    +     2 |          3 |         3
    +(6 rows)
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0048.html b/docs/dws/dev/dws_06_0048.html new file mode 100644 index 00000000..f5b9612d --- /dev/null +++ b/docs/dws/dev/dws_06_0048.html @@ -0,0 +1,584 @@ + + +

Security Functions

+
  • gs_password_deadline()

    Description: Indicates the number of remaining days before the password of the current user expires. After the password expires, the system prompts the user to change the password. This parameter is related to the GUC parameter password_effect_time.

    +

    Return type: interval

    +

    Examples:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_password_deadline();
    +  gs_password_deadline   
    +-------------------------
    + 83 days 17:44:32.196094
    +(1 row)
    +
    + +
    +
  • gs_password_expiration()

    Description: Indicates the number of remaining days before the password of the current user expires. After the password expires, the user cannot log in to the database. This parameter is related to the DDL statement PASSWORD EXPIRATION period used for creating a user.

    +

    Return type: interval

    +

    Examples:

    +
    1
    +2
    +3
    +4
    +5
    SELECT gs_password_expiration();
    +  gs_password_expiration   
    +-------------------------
    + 29 days 23:59:49.731482
    +(1 row)
    +
    + +
    +
  • login_audit_messages(flag boolean)

    Description: Queries login information about a login user.

    +

    Return type: tuple

    +

    Examples:

    +
    • Checks the date, time, and IP address successfully authenticated during the last login.
      1
      +2
      +3
      +4
      +5
      SELECT * FROM login_audit_messages(true);
      +  username  | database |       logintime        |     type      | result |  client_conninfo   
      +------------+----------+------------------------+---------------+--------+--------------------
      +     dbadmin    | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok     | gsql@[local]
      +(1 row)
      +
      + +
      +
    • Checks the date, time, and IP address that failed to be authenticated during the last login.
      1
      +2
      +3
      +4
      SELECT * FROM login_audit_messages(false) ORDER BY logintime desc limit 1;
      +  username  | database |       logintime        |     type     | result |     client_conninfo     
      +------------+----------+------------------------+--------------+--------+-------------------------
      +(0 rows)
      +
      + +
      +
    • Checks the number of failed attempts, date, and time since the previous successful authentication.
      1
      +2
      +3
      +4
      SELECT * FROM login_audit_messages(false);
      +  username  | database |       logintime        |     type     | result |     client_conninfo     
      +------------+----------+------------------------+--------------+--------+-------------------------
      +(0 rows)
      +
      + +
      +
    +
  • login_audit_messages_pid(flag boolean)

    Description: Queries login information about a login user. Different from login_audit_messages, this function queries login information based on backendid. Information about subsequent logins of the same user does not alter the query result of previous logins and cannot be found using this function.

    +

    Return type: tuple

    +

    Examples:

    +
    • Checks the date, time, and IP address successfully authenticated during the last login.
      1
      +2
      +3
      +4
      +5
      SELECT * FROM login_audit_messages_pid(true);
      +  username  | database |       logintime        |     type      | result |  client_conninfo | backendid
      +------------+----------+------------------------+---------------+--------+--------------------
      +     dbadmin    | gaussdb | 2017-06-02 15:28:34+08 | login_success | ok     | gsql@[local] | 140311900702464
      +(1 row)
      +
      + +
      +
    • Checks the date, time, and IP address that failed to be authenticated during the last login.
      1
      +2
      +3
      +4
      SELECT * FROM login_audit_messages_pid(false) ORDER BY logintime desc limit 1;
      +  username  | database |       logintime        |     type     | result |     client_conninfo   | backendid
      +------------+----------+------------------------+--------------+--------+-------------------------
      +(0 rows)
      +
      + +
      +
    • Checks the number of failed attempts, date, and time since the previous successful authentication.
      1
      +2
      +3
      +4
      SELECT * FROM login_audit_messages_pid(false);
      +  username  | database |       logintime        |     type     | result |     client_conninfo    | backendid
      +------------+----------+------------------------+--------------+--------+-------------------------
      +(0 rows)
      +
      + +
      +
    +
  • pg_query_audit()

    Description: Displays audit logs of the CN.

    +

    Return type: SETOF record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    begintime

    +

    timestamp with time zone

    +

    Operation start time

    +

    endtime

    +

    timestamp with time zone

    +

    Operation end time

    +

    operation_type

    +

    text

    +

    Operation type. For details, see Table 1.

    +

    audit_type

    +

    text

    +

    Audit type. For details, see Table 2.

    +

    result

    +

    text

    +

    Operation result

    +

    username

    +

    text

    +

    Name of the user who performs the operation

    +

    database

    +

    text

    +

    Database name

    +

    client_conninfo

    +

    text

    +

    Client connection information, that is, gsql, JDBC, or ODBC.

    +

    object_name

    +

    text

    +

    Object name

    +

    command_text

    +

    text

    +

    Command used to perform the operation. In versions earlier than 8.1.1, the audit content of this column is contained in detail_info.

    +

    detail_info

    +

    text

    +

    Operation details

    +

    transaction_xid

    +

    text

    +

    Transaction ID

    +

    query_id

    +

    text

    +

    Query ID

    +

    node_name

    +

    text

    +

    Node name

    +

    thread_id

    +

    text

    +

    Thread ID

    +

    local_port

    +

    text

    +

    Local port

    +

    remote_port

    +

    text

    +

    Remote port

    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Operation types

    Operation Type

    +

    Description

    +

    none

    +

    Indicates that no audit item is configured. If any audit item is configured, none becomes invalid.

    +

    all

    +

    Indicates that all operations are audited. This value overwrites the concurrent configuration of any other audit items. Note that even if this parameter is set to all, not all DDL operations are audited. You need to control the object level of DDL operations by referring to audit_system_object.

    +

    login

    +

    Indicates that user login operations are audited.

    +

    logout

    +

    Indicates that user logout operations are audited.

    +

    database_process

    +

    Indicates that database startup, stop, switchover, and recovery operations are audited.

    +

    user_lock

    +

    Indicates that user locking and unlocking operations are audited.

    +

    grant_revoke

    +

    Indicates that user permission granting and revoking operations are audited.

    +

    ddl

    +

    Indicates that DDL operations are audited. DDL operations are controlled at a fine granularity based on operation objects. Therefore, audit_system_object is used to control the objects whose DDL operations are to be audited. (The audit function takes effect as long as audit_system_object is configured, no matter whether ddl is set.)

    +

    select

    +

    Indicates that the SELECT operations are audited.

    +

    copy

    +

    Indicates that the COPY operations are audited.

    +

    user function

    +

    Indicates that operations related to user-defined functions, stored procedures, and anonymous blocks are audited.

    +

    set

    +

    Indicates that the SET operations are audited.

    +

    transaction

    +

    Indicates that transaction operations are audited.

    +

    vacuum

    +

    Indicates that the VACUUM operations are audited.

    +

    analyze

    +

    Indicates that the ANALYZE operations are audited.

    +

    explain

    +

    Indicates that the EXPLAIN operations are audited.

    +

    specialfunc

    +

    Indicates that special function invoking operations are audited. Special functions include pg_terminate_backend and pg_cancel_backend.

    +

    insert

    +

    Indicates that the INSERT operations are audited.

    +

    update

    +

    Indicates that the UPDATE operations are audited.

    +

    delete

    +

    Indicates that the DELETE operations are audited.

    +

    merge

    +

    Indicates that the MERGE operations are audited.

    +

    show

    +

    Indicates that the SHOW operations are audited.

    +

    checkpoint

    +

    Indicates that the CHECKPOINT operations are audited.

    +

    barrier

    +

    Indicates that the BARRIER operations are audited.

    +

    cluster

    +

    Indicates that the CLUSTER operations are audited.

    +

    comment

    +

    Indicates that the COMMENT operations are audited.

    +

    clean connection

    +

    Indicates that the CLEAN CONNECTION operations are audited.

    +

    prepare statement

    +

    Indicates that the PREPARE, EXECUTE, and DEALLOCATE operations are audited.

    +

    set constraints

    +

    Indicates that the CONSTRAINTS operations are audited.

    +

    cursor

    +

    Indicates that cursor operations are audited.

    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2 Audit types

    Audit type

    +

    Description

    +

    audit_switch

    +

    Enables and disables audit logs.

    +

    login_logout

    +

    Indicates that successful user logins and user log-outs are audited.

    +

    system

    +

    Indicates that system start and stop operations and instance switch operations are audited.

    +

    sql_parse

    +

    Parses SQL statements.

    +

    user_lock

    +

    Indicates that successful locking and unlocking operations are audited.

    +

    grant_revoke

    +

    Indicates that failed granting and reclaiming of a user's permission are audited.

    +

    violation

    +

    Indicates that user's access violation operations are audited.

    +

    ddl

    +

    Indicates that successful DDL operations are audited. DDL operations are controlled at a fine granularity based on operation objects. Therefore, audit_system_object is used to control the objects whose DDL operations are to be audited. (The audit function takes effect as long as audit_system_object is configured, no matter whether ddl is set.)

    +

    dml

    +

    Indicates that the INSERT, UPDATE, DELETE, and MERGE operations on a specific table are audited.

    +

    internal_event

    +

    Indicates that internal events are audited.

    +

    user_func

    +

    Indicates that operations related to user-defined functions, stored procedures, and anonymous blocks are audited.

    +

    special_func

    +

    Indicates that successful calls to special functions are audited. Special functions include pg_terminate_backend and pg_cancel_backend.

    +

    copy

    +

    Indicates that the COPY operations are audited.

    +

    set

    +

    Indicates that the SET operations are audited.

    +

    transaction

    +

    Indicates that transaction operations are audited.

    +

    vacuum

    +

    Indicates that the VACUUM operations are audited.

    +

    analyze

    +

    Indicates that the ANALYZE operations are audited.

    +

    cursor

    +

    Indicates that cursor operations are audited.

    +

    anonymous_block

    +

    Anonymous block. If anonymous block completed is displayed, the SQL statement is successfully executed.

    +

    explain

    +

    Indicates that the EXPLAIN operations are audited.

    +

    show

    +

    Indicates that the SHOW operations are audited.

    +

    lock_table

    +

    Indicates that table lock operations are audited.

    +

    comment

    +

    Indicates that the COMMENT operations are audited.

    +

    prepare

    +

    Indicates that the PREPARE, EXECUTE, and DEALLOCATE operations are audited.

    +

    cluster

    +

    Indicates that the CLUSTER operations are audited.

    +

    constraints

    +

    Indicates that the CONSTRAINTS operations are audited.

    +

    checkpoint

    +

    Indicates that the CHECKPOINT operations are audited.

    +

    barrier

    +

    Indicates that the BARRIER operations are audited.

    +

    cleanconn

    +

    Indicates that the CLEAN CONNECTION operations are audited.

    +

    seclabel

    +

    Indicates that security label operations are audited.

    +

    notify

    +

    Indicates that the notification operations are audited.

    +

    load

    +

    Indicates that the loading operations are audited.

    +
    +
    +
  • pgxc_query_audit()

    Description: Displays audit logs of all CNs.

    +

    Return type: record

    +

    The return fields of this function are the same as those of the pg_query_audit function.

    +
  • pg_delete_audit()

    Description: Deletes audit logs in a specified period.
    +Return type: void

    +

    For database security concerns, this function is unavailable. If you call it, the following message is displayed: "ERROR: For security purposes, it is not allowed to manually delete audit logs."

    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0049.html b/docs/dws/dev/dws_06_0049.html new file mode 100644 index 00000000..86c5c204 --- /dev/null +++ b/docs/dws/dev/dws_06_0049.html @@ -0,0 +1,178 @@ + + +

Set Returning Functions

+

Series Generating Functions

  • generate_series(start, stop)

    Description: Generates a series of values, from start to stop with a step size of one.

    +

    Parameter type: int, bigint, or numeric

    +

    Return type: setof int, setof bigint, or setof numeric (same as the argument type)

    +
  • generate_series(start, stop, step)

    Description: Generates a series of values, from start to stop with a step size of step.

    +

    Parameter type: int, bigint, or numeric

    +

    Return type: setof int, setof bigint, or setof numeric (same as the argument type)

    +
  • generate_series(start, stop, step interval)

    Description: Generates a series of values, from start to stop with a step size of step.

    +

    Parameter type: timestamp or timestamp with time zone

    +

    Return type: setof timestamp or setof timestamp with time zone (same as argument type)

    +
+
+

When step is positive, zero rows are returned if start is greater than stop. Conversely, when step is negative, zero rows are returned if start is less than stop. Zero rows are also returned for NULL inputs. It is an error for step to be zero.

+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
SELECT * FROM generate_series(2,4);
+ generate_series
+-----------------
+               2
+               3
+               4
+(3 rows)
+
+SELECT * FROM generate_series(5,1,-2);
+ generate_series
+-----------------
+               5
+               3
+               1
+(3 rows)
+
+SELECT * FROM generate_series(4,3);
+ generate_series
+-----------------
+(0 rows)
+
+-- this example relies on the date-plus-integer operator
+SELECT current_date + s.a AS dates FROM generate_series(0,14,7) AS s(a);
+   dates
+------------
+ 2017-06-02
+ 2017-06-09
+ 2017-06-16
+(3 rows)
+
+SELECT * FROM generate_series('2008-03-01 00:00'::timestamp, '2008-03-04 12:00', '10 hours');
+   generate_series   
+---------------------
+ 2008-03-01 00:00:00
+ 2008-03-01 10:00:00
+ 2008-03-01 20:00:00
+ 2008-03-02 06:00:00
+ 2008-03-02 16:00:00
+ 2008-03-03 02:00:00
+ 2008-03-03 12:00:00
+ 2008-03-03 22:00:00
+ 2008-03-04 08:00:00
+(9 rows)
+
+ +
+

Subscript Generating Functions

  • generate_subscripts(array anyarray, dim int)

    Description: Generates a series comprising the given array's subscripts.

    +

    Return type: setof int

    +
  • generate_subscripts(array anyarray, dim int, reverse boolean)

    Description: Generates a series comprising the given array's subscripts. When reverse is true, the series is returned in reverse order.

    +

    Return type: setof int

    +
+
+

generate_subscripts is a function that generates the set of valid subscripts for the specified dimension of the given array. Zero rows are returned for arrays that do not have the requested dimension, or for NULL arrays (but valid subscripts are returned for NULL array elements). For example:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
-- basic usage
+SELECT generate_subscripts('{NULL,1,NULL,2}'::int[], 1) AS s;
+ s 
+---
+ 1
+ 2
+ 3
+ 4
+(4 rows)
+
+ +
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
-- unnest a 2D array
+CREATE OR REPLACE FUNCTION unnest2(anyarray)
+RETURNS SETOF anyelement AS $$
+SELECT $1[i][j]
+   FROM generate_subscripts($1,1) g1(i),
+        generate_subscripts($1,2) g2(j);
+$$ LANGUAGE sql IMMUTABLE;
+
+SELECT * FROM unnest2(ARRAY[[1,2],[3,4]]);
+ unnest2 
+---------
+       1
+       2
+       3
+       4
+(4 rows)
+
+-- Delete the function:
+DROP FUNCTION unnest2;
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0050.html b/docs/dws/dev/dws_06_0050.html new file mode 100644 index 00000000..19b0fbc1 --- /dev/null +++ b/docs/dws/dev/dws_06_0050.html @@ -0,0 +1,241 @@ + + +

Conditional Expression Functions

+

Conditional Expression Functions

  • coalesce(expr1, expr2, ..., exprn)

    Description: Returns the first argument that is not NULL in the argument list.

    +

    COALESCE(expr1, expr2) is equivalent to CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT coalesce(NULL,'hello');
    + coalesce
    +----------
    + hello
    +(1 row)
    +
    + +
    +

    Note:

    +
    • NULL is returned only if all parameters are NULL.
    • This value is replaced by the default value when data is displayed.
    • Like a CASE expression, COALESCE only evaluates the parameters that are needed to determine the result. That is, parameters to the right of the first non-null parameter are not evaluated.
    +
  • decode(base_expr, compare1, value1, Compare2,value2, ... default)

    Description: Compares base_expr with each compare(n) and returns value(n) if they are matched. If base_expr does not match each compare(n), the default value is returned.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT decode('A','A',1,'B',2,0);
    + case
    +------
    + 1
    +(1 row)
    +
    + +
    +
  • if(bool_expr, expr1, expr2)

    Description: Returns expr1 or expr2. If the value of bool_expr is true, expr1 is returned. Otherwise, expr2 is returned.

    +

    This function is equivalent to CASE WHEN bool_expr = true THEN expr1 ELSE expr2 END.

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT if(1 < 2, 'yes', 'no');
    + if
    +-----
    + yes
    +(1 row)
    +
    + +
    +

    Note: expr1 and expr2 can be of any type. For details about the available types, see UNION, CASE, and Related Constructs.

    +
  • ifnull(expr1, expr2)

    Description: Returns expr1 or expr2. If expr1 is not NULL, expr1 is returned. Otherwise, expr2 is returned.

    +

    This function is logically equivalent to CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END.

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT ifnull(NULL,'hello');
    + ifnull
    +--------
    + hello
    +(1 row)
    +
    + +
    +

    Note: expr1 and expr2 can be of any type. For details about the available types, see UNION, CASE, and Related Constructs.

    +
  • isnull(expr)

    Description: Checks whether expr is NULL. If it is NULL, true is returned. Otherwise, false is returned.

    +

    This function is logically equivalent to expr IS NULL.

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT isnull(NULL), isnull('abc');
    + isnull | isnull
    +--------+--------
    + t      | f
    +(1 row)
    +
    + +
    +
  • nullif(expr1, expr2)

    Description: Returns NULL or expr1. If expr1 is equal to expr2, NULL is returned. Otherwise, expr1 is returned.

    +

    nullif(expr1, expr2) is equivalent to CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT nullif('hello','world');
    + nullif 
    +--------
    + hello
    +(1 row)
    +
    + +
    +

    Note:

    +

    Assume the two parameter data types are different:

    +
    • If implicit conversion exists between the two data types, implicitly convert the parameter of lower priority to this data type using the data type of higher priority. If the conversion succeeds, computation is performed. Otherwise, an error is returned. For example:
      1
      +2
      +3
      +4
      +5
      SELECT nullif('1234'::VARCHAR,123::INT4);
      + nullif 
      +--------
      +   1234
      +(1 row)
      +
      + +
      +
      1
      +2
      SELECT nullif('1234'::VARCHAR,'2012-12-24'::DATE);
      +ERROR:  invalid input syntax for type timestamp: "1234"
      +
      + +
      +
    • If implicit conversion is not applied between two data types, an error is displayed. For example:
      1
      +2
      +3
      +4
      +5
      SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE);
      +ERROR:  operator does not exist: boolean = timestamp without time zone
      +LINE 1: SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE) FROM DUAL;
      +^
      +HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
      +
      + +
      +
    +
  • nvl( expr1 , expr2 )

    Returns expr1 or expr2. If expr1 is NULL, expr2 is returned. Otherwise, expr1 is returned.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT nvl('hello','world');
    +  nvl  
    +-------
    + hello
    +(1 row)
    +
    + +
    +

    Parameters expr1 and expr2 can be of any data type. If expr1 and expr2 are of different data types, NVL checks whether expr2 can be implicitly converted to expr1. If it can, the expr1 data type is returned. If epr2 cannot be implicitly converted to expr1 but epr1 can be implicitly converted to expr2, the expr2 data type is returned. If no implicit type conversion exists between the two parameters and the parameters are different data types, an error is reported.

    +
  • sys_context( 'namespace' , 'parameter')

    Description: Obtains and returns the parameter values of a specified namespace.

    +

    Return type: VARCHAR

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT sys_context('USERENV', 'CURRENT_SCHEMA');
    + sys_context 
    +-------------
    + public
    +(1 row)
    +
    + +
    +

    The result varies according to the current actual schema.

    +

    Note: Currently, only the following formats are supported: SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') and SYS_CONTEXT('USERENV', 'CURRENT_USER').

    +
  • greatest(expr1 [, ...])

    Description: Selects the largest value from a list of any number of expressions.

    +

    Return type:

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT greatest(1*2,2-3,4-1);
    + greatest 
    +----------
    +        3
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT greatest('ABC', 'BCD', 'CDE');
    + greatest 
    +----------
    + CDE
    +(1 row)
    +
    + +
    +
  • least(expr1 [, ...])

    Description: Selects the smallest value from a list of any number of expressions.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT least(1*2,2-3,4-1);
    + least 
    +-------
    +    -1
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT least('ABC','BCD','CDE');
    + least  
    +--------
    + ABC
    +(1 row)
    +
    + +
    +
  • EMPTY_BLOB()

    Description: Initiates a BLOB variable in an INSERT or an UPDATE statement to a NULL value.

    +

    Return type: BLOB

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    -- Create a table:
    +CREATE TABLE blob_tb(b blob,id int) DISTRIBUTE BY REPLICATION;
    +-- Insert data:
    +INSERT INTO blob_tb VALUES (empty_blob(),1);
    +--Delete the table.
    +DROP TABLE blob_tb;
    +
    + +
    +

    Note: The length is 0 obtained using DBMS.GETLENGTH in a parallel mode.

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0051.html b/docs/dws/dev/dws_06_0051.html new file mode 100644 index 00000000..87b53b1c --- /dev/null +++ b/docs/dws/dev/dws_06_0051.html @@ -0,0 +1,802 @@ + + +

System Information Functions

+

Session Information Functions

  • current_catalog

    Description: Name of the current database (called "catalog" in the SQL standard)

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_catalog;
    + current_database
    +------------------
    + gaussdb
    +(1 row)
    +
    + +
    +
  • current_database()

    Description: Name of the current database

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_database();
    + current_database
    +------------------
    + gaussdb
    +(1 row)
    +
    + +
    +
  • current_query()

    Description: Text of the currently executing query, as submitted by the client (might contain more than one statement)

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_query();
    +      current_query
    +-------------------------
    + SELECT current_query();
    +(1 row)
    +
    + +
    +
  • current_schema[()]

    Description: Name of current schema

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_schema();
    + current_schema
    +----------------
    + public
    +(1 row)
    +
    + +
    +

    Remarks: current_schema returns the first valid schema name in the search path. (If the search path is empty or contains no valid schema name, NULL is returned.) This is the schema that will be used for any tables or other named objects that are created without specifying a target schema.

    +
  • current_schemas(boolean)

    Description: Names of schemas in search path

    +

    Return type: name[]

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_schemas(true);
    +   current_schemas
    +---------------------
    + {pg_catalog,public}
    +(1 row)
    +
    + +
    +

    Note:

    +

    current_schemas(boolean) returns an array of the names of all schemas presently in the search path. The Boolean option determines whether implicitly included system schemas such as pg_catalog are included in the returned search path.

    +

    The search path can be altered at run time. The command is:

    +
    1
    SET search_path TO schema [, schema, ...]
    +
    + +
    +
    +
  • current_user

    Description: User name of current execution context

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT current_user;
    + current_user
    +--------------
    + dbadmin
    +(1 row)
    +
    + +
    +

    Note: current_user is the user identifier that is applicable for permission checking. Normally it is equal to the session user, but it can be changed with SET ROLE. It also changes during the execution of functions with the attribute SECURITY DEFINER.

    +
  • inet_client_addr()

    Description: Displays the IP address of the currently connected client.

    +
    • It is available only in remote connection mode.
    • If the database is connected to the local PC, the value is empty.
    +
    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet_client_addr();
    + inet_client_addr
    +------------------
    + 10.10.0.50
    +(1 row)
    +
    + +
    +
  • inet_client_port()

    Description: Displays the port number of the currently connected client.

    +

    It is available only in remote connection mode.

    +
    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet_client_port();
    + inet_client_port
    +------------------
    +            33143
    +(1 row)
    +
    + +
    +
  • inet_server_addr()

    Description: Displays the IP address of the current server.

    +
    • It is available only in remote connection mode.
    • If the database is connected to the local PC, the value is empty.
    +
    +

    Return type: inet

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet_server_addr();
    + inet_server_addr
    +------------------
    + 10.10.0.13
    +(1 row)
    +
    + +
    +
  • inet_server_port()

    Description: Displays the port of the current server. All these functions return NULL if the current connection is via a Unix-domain socket.

    +

    It is available only in remote connection mode.

    +
    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT inet_server_port();
    + inet_server_port
    +------------------
    + 8000
    +(1 row)
    +
    + +
    +
  • pg_backend_pid()

    Description: Process ID of the server process attached to the current session

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_backend_pid();
    + pg_backend_pid
    +-----------------
    + 140229352617744
    +(1 row)
    +
    + +
    +
  • pg_conf_load_time()

    Description: Configures load time. pg_conf_load_time returns the timestamp with time zone when the server configuration files were last loaded.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_conf_load_time();
    +      pg_conf_load_time       
    +------------------------------
    + 2017-09-01 16:05:23.89868+08
    +(1 row)
    +
    + +
    +
  • pg_my_temp_schema()

    Description: OID of the temporary schema of a session. The value is 0 if the OID does not exist.

    +

    Return type: OID

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_my_temp_schema();
    + pg_my_temp_schema 
    +-------------------
    +                 0
    +(1 row)
    +
    + +
    +

    Note: pg_my_temp_schema returns the OID of the current session's temporary schema, or zero if it has none (because it has not created any temporary tables). pg_is_other_temp_schema returns true if the given OID is the OID of another session's temporary schema.

    +
  • pg_is_other_temp_schema(oid)

    Description: Whether the schema is the temporary schema of another session.

    +

    Return type: boolean

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_is_other_temp_schema(25356);
    + pg_is_other_temp_schema
    +-------------------------
    + f
    +(1 row)
    +
    + +
    +
  • pg_listening_channels()

    Description: Channel names that the session is currently listening on

    +

    Return type: setof text

    +

    For example:

    +
    1
    +2
    +3
    +4
    SELECT pg_listening_channels();
    + pg_listening_channels
    +-----------------------
    +(0 rows)
    +
    + +
    +

    Note: pg_listening_channels returns a set of names of channels that the current session is listening to.

    +
  • pg_postmaster_start_time()

    Description: Server start time pg_postmaster_start_time returns the timestamp with time zone when the server started.

    +

    Return type: timestamp with time zone

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_postmaster_start_time();
    +   pg_postmaster_start_time   
    +------------------------------
    + 2017-08-30 16:02:54.99854+08
    +(1 row)
    +
    + +
    +
  • pg_trigger_depth()

    Description: Current nesting level of triggers

    +

    Return type: int

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_trigger_depth();
    + pg_trigger_depth 
    +------------------
    +                0
    +(1 row)
    +
    + +
    +
  • pgxc_version()

    Description: Postgres-XC version information

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pgxc_version();
    +                                                pgxc_version                                                 
    +-------------------------------------------------------------------------------------------------------------
    + Postgres-XC 1.1 on x86_64-unknown-linux-gnu, based on PostgreSQL 9.2.4, compiled by g++ (GCC) 5.4.0, 64-bit
    +(1 row)
    +
    + +
    +
  • session_user

    Description: Session user name

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT session_user;
    + session_user
    +--------------
    + dbadmin
    +(1 row)
    +
    + +
    +

    Note: session_user is usually the user who initiated the current database connection, but administrators can change this setting with SET SESSION AUTHORIZATION.

    +
  • user

    Description: Is equivalent to current_user.

    +

    Return type: name

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT user;
    + current_user
    +--------------
    + dbadmin
    +(1 row)
    +
    + +
    +
  • version()

    Description: version information. version returns a string describing a server's version.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT version();
    +                                                                version                                                                
    +---------------------------------------------------------------------------------------------------------------------------------------
    + PostgreSQL 9.2.4 gsql ((GaussDB 8.1.1 build af002019) compiled at 2020-01-10 05:43:20 commit 6995 last mr 11566 ) on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 5.4.0, 64-bit
    +(1 row)
    +
    + +
    +
+
+

Access Privilege Inquiry Functions

  • has_any_column_privilege(user, table, privilege)

    Description: Queries whether a specified user has permission for any column of table.

    +

    Return type: boolean

    +
  • has_any_column_privilege(table, privilege)

    Description: Queries whether the current user has permission for any column of table.

    +

    Return type: boolean

    +

    has_any_column_privilege checks whether a user can access any column of a table in a particular way. Its parameter possibilities are analogous to has_table_privilege, except that the desired access permission type must be some combination of SELECT, INSERT, UPDATE, or REFERENCES.

    +

    Note that having any of these permissions at the table level implicitly grants it for each column of the table, so has_any_column_privilege will always return true if has_table_privilege does for the same parameters. But has_any_column_privilege also succeeds if there is a column-level grant of the permission for at least one column.

    +
    +
  • has_column_privilege(user, table, column, privilege)

    Description: Queries whether a specified user has permission for column.

    +

    Return type: boolean

    +
  • has_column_privilege(table, column, privilege)

    Description: Queries whether the current user has permission for column.

    +

    Return type: boolean

    +

    has_column_privilege checks whether a user can access a column in a particular way. Its argument possibilities are analogous to has_table_privilege, with the addition that the column can be specified either by name or attribute number. The desired access permission type must evaluate to some combination of SELECT, INSERT, UPDATE, or REFERENCES.

    +

    Note that having any of these permissions at the table level implicitly grants it for each column of the table.

    +
    +
  • has_database_privilege(user, database, privilege)

    Description: Queries whether a specified user has permission for database.

    +

    Return type: boolean

    +
  • has_database_privilege(database, privilege)

    Description: Queries whether the current user has permission for database.

    +

    Return type: boolean

    +

    Note: has_database_privilege checks whether a user can access a database in a particular way. Its argument possibilities are analogous to has_table_privilege. The desired access permission type must evaluate to some combination of CREATE, CONNECT, TEMPORARY, or TEMP (which is equivalent to TEMPORARY).

    +
  • has_foreign_data_wrapper_privilege(user, fdw, privilege)

    Description: Queries whether a specified user has permission for foreign-data wrapper.

    +

    The fdw parameter indicates the name or ID of the foreign data wrapper.

    +

    Return type: boolean

    +
  • has_foreign_data_wrapper_privilege(fdw, privilege)

    Description: Queries whether the current user has permission for foreign-data wrapper.

    +

    Return type: boolean

    +

    Note: has_foreign_data_wrapper_privilege checks whether a user can access a foreign-data wrapper in a particular way. Its argument possibilities are analogous to has_table_privilege. The desired access permission type must evaluate to USAGE.

    +
  • has_function_privilege(user, function, privilege)

    Description: Queries whether a specified user has permission for function.

    +

    Return type: boolean

    +
  • has_function_privilege(function, privilege)

    Description: Queries whether the current user has permission for function.

    +

    Return type: boolean

    +

    Note: has_function_privilege checks whether a user can access a function in a particular way. Its argument possibilities are analogous to has_table_privilege. When a function is specified by a text string rather than by OID, the allowed input is the same as that for the regprocedure data type (see Object Identifier Types). The desired access permission type must evaluate to EXECUTE.

    +
  • has_language_privilege(user, language, privilege)

    Description: Queries whether a specified user has permission for language.

    +

    Return type: boolean

    +
  • has_language_privilege(language, privilege)

    Description: Queries whether the current user has permission for language.

    +

    Return type: boolean

    +

    Note: has_language_privilege checks whether a user can access a procedural language in a particular way. Its argument possibilities are analogous to has_table_privilege. The desired access permission type must evaluate to USAGE.

    +
  • has_schema_privilege(user, schema, privilege)

    Description: Queries whether a specified user has permission for schema.

    +

    Return type: boolean

    +
  • has_schema_privilege(schema, privilege)

    Description: Queries whether the current user has permission for schema.

    +

    Return type: boolean

    +

    Note: has_schema_privilege checks whether a user can access a schema in a particular way. Its argument possibilities are analogous to has_table_privilege. The desired access permission type must evaluate to some combination of CREATE or USAGE.

    +
  • has_server_privilege(user, server, privilege)

    Description: Queries whether a specified user has permission for foreign server.

    +

    Return type: boolean

    +
  • has_server_privilege(server, privilege)

    Description: Queries whether the current user has permission for foreign server.

    +

    Return type: boolean

    +

    Note: has_server_privilege checks whether a user can access a foreign server in a particular way. Its argument possibilities are analogous to has_table_privilege. The desired access permission type must evaluate to USAGE.

    +
  • has_table_privilege(user, table, privilege)

    Description: Queries whether a specified user has permission for table.

    +

    Return type: boolean

    +
  • has_table_privilege(table, privilege)

    Description: Queries whether the current user has permission for table.

    +

    Return type: boolean

    +

    has_table_privilege checks whether a user can access a table in a particular way. The user can be specified by name, by OID (pg_authid.oid), public to indicate the PUBLIC pseudo-role, or if the argument is omitted current_user is assumed. The table can be specified by name or by OID. When specifying by name, the name can be schema-qualified if necessary. The desired access permission type is specified by a text string, which must be one of the values SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, or TRIGGER. Optionally, WITH GRANT OPTION can be added to a permission type to test whether the permission is held with grant option. Also, multiple permission types can be listed separated by commas, in which case the result will be true if any of the listed permissions is held.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT has_table_privilege('tpcds.web_site', 'select');
    + has_table_privilege  
    +--------------------- 
    + t 
    +(1 row)
    +
    +SELECT has_table_privilege('dbadmin', 'tpcds.web_site', 'select,INSERT WITH GRANT OPTION ');
    + has_table_privilege  
    +--------------------- 
    + t 
    +(1 row) 
    +
    + +
    +
  • pg_has_role(user, role, privilege)

    Description: Queries whether a specified user has permission for role.

    +

    Return type: boolean

    +
  • pg_has_role(role, privilege)

    Description: Specifies whether the current user has permission for role.

    +

    Return type: boolean

    +

    Note: pg_has_role checks whether a user can access a role in a particular way. Its argument possibilities are analogous to has_table_privilege, except that public is not allowed as a user name. The desired access permission type must evaluate to some combination of MEMBER or USAGE. MEMBER denotes direct or indirect membership in the role (that is, the right to do SET ROLE), while USAGE denotes the permissions of the role are available without doing SET ROLE.

    +
+
+

Schema Visibility Inquiry Functions

Each function performs the visibility check for one type of database object. For functions and operators, an object in the search path is visible if there is no object of the same name and argument data type(s) earlier in the path. For operator classes, both name and associated index access method are considered.

+

All these functions require OIDs to identify the objects to be checked. If you want to test an object by name, it is convenient to use the OID alias types (regclass, regtype, regprocedure, regoperator, regconfig, or regdictionary).

+

For example, a table is said to be visible if its containing schema is in the search path and no table of the same name appears earlier in the search path. This is equivalent to the statement that the table can be referenced by name without explicit schema qualification. For example, to list the names of all visible tables:

+
1
SELECT relname FROM pg_class WHERE pg_table_is_visible(oid);
+
+ +
+
  • pg_collation_is_visible(collation_oid)

    Description: Queries whether the collation is visible in search path.

    +

    Return type: boolean

    +
  • pg_conversion_is_visible(conversion_oid)

    Description: Queries whether the conversion is visible in search path.

    +

    Return type: boolean

    +
  • pg_function_is_visible(function_oid)

    Description: Queries whether the function is visible in search path.

    +

    Return type: boolean

    +
  • pg_opclass_is_visible(opclass_oid)

    Description: Queries whether the operator class is visible in search path.

    +

    Return type: boolean

    +
  • pg_operator_is_visible(operator_oid)

    Description: Queries whether the operator is visible in search path.

    +

    Return type: boolean

    +
  • pg_opfamily_is_visible(opclass_oid)

    Description: Queries whether the operator family is visible in search path.

    +

    Return type: boolean

    +
  • pg_table_is_visible(table_oid)

    Description: Queries whether the table is visible in search path.

    +

    Return type: boolean

    +
  • pg_ts_config_is_visible(config_oid)

    Description: Queries whether the text search configuration is visible in search path.

    +

    Return type: boolean

    +
  • pg_ts_dict_is_visible(dict_oid)

    Description: Queries whether the text search dictionary is visible in search path.

    +

    Return type: boolean

    +
  • pg_ts_parser_is_visible(parser_oid)

    Description: Queries whether the text search parser is visible in search path.

    +

    Return type: boolean

    +
  • pg_ts_template_is_visible(template_oid)

    Description: Queries whether the text search template is visible in search path.

    +

    Return type: boolean

    +
  • pg_type_is_visible(type_oid)

    Description: Queries whether the type (or domain) is visible in search path.

    +

    Return type: boolean

    +
+
+

System Catalog Information Functions

  • format_type(type_oid, typemod)

    Description: Gets SQL name of a data type.

    +

    Return type: text

    +

    Note:

    +

    format_type returns the SQL name of a data type that is identified by its type OID and possibly a type modifier. Pass NULL for the type modifier if no specific modifier is known. Certain type modifiers are passed for data types with length limitations. The SQL name returned from format_type contains the length of the data type, which can be calculated by taking sizeof(int32) from actual storage length [actual storage len - sizeof(int32)] in the unit of bytes. 32-bit space is required to store the customized length set by users. So the actual storage length contains 4 bytes more than the customized length. In the following example, the SQL name returned from format_type is character varying(6), indicating the length of varchar type is 6 bytes. So the actual storage length of varchar type is 10 bytes.

    +
    1
    +2
    +3
    +4
    +5
    SELECT format_type((SELECT oid FROM pg_type WHERE typname='varchar'), 10);
    +     format_type      
    +----------------------
    + character varying(6)
    +(1 row)
    +
    + +
    +
  • pg_check_authid(role_oid)

    Description: Checks whether a role name with given OID exists.

    +

    Return type: bool

    +
  • pg_describe_object(catalog_id, object_id, object_sub_id)

    Description: Gets description of a database object.

    +

    Return type: text

    +

    Note: pg_describe_object returns a description of a database object specified by catalog OID, object OID and a (possibly zero) sub-object ID. This is useful to determine the identity of an object as stored in the pg_depend catalog.

    +
  • pg_get_constraintdef(constraint_oid)

    Description: Gets definition of a constraint.

    +

    Return type: text

    +
  • pg_get_constraintdef(constraint_oid, pretty_bool)

    Description: Gets definition of a constraint.

    +

    Return type: text

    +

    Note: pg_get_constraintdef and pg_get_indexdef respectively reconstruct the creating command for a constraint and an index.

    +
  • pg_get_expr(pg_node_tree, relation_oid)

    Description: Decompiles internal form of an expression, assuming that any Vars in it refer to the relationship indicated by the second parameter.

    +

    Return type: text

    +
  • pg_get_expr(pg_node_tree, relation_oid, pretty_bool)

    Description: Decompiles internal form of an expression, assuming that any Vars in it refer to the relationship indicated by the second parameter.

    +

    Return type: text

    +

    Note: pg_get_expr decompiles the internal form of an individual expression, such as the default value for a column. It can be useful when examining the contents of system catalogs. If the expression might contain Vars, specify the OID of the relationship they refer to as the second parameter; if no Vars are expected, zero is sufficient.

    +
  • pg_get_functiondef(func_oid)

    Description: Gets definition of a function.

    +

    Return type: text

    +

    func_oid is the OID of the function, which can be queried in the PG_PROC system catalog.

    +

    Example: Query the OID and definition of the justify_days function.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    SELECT oid FROM pg_proc WHERE proname ='justify_days';
    + oid
    +------
    + 1295
    +(1 row)
    +
    +SELECT * FROM pg_get_functiondef(1295);
    + headerlines |                          definition
    +-------------+--------------------------------------------------------------
    +           4 | CREATE OR REPLACE FUNCTION pg_catalog.justify_days(interval)+
    +             |  RETURNS interval                                           +
    +             |  LANGUAGE internal                                          +
    +             |  IMMUTABLE STRICT NOT FENCED NOT SHIPPABLE                  +
    +             | AS $function$interval_justify_days$function$                +
    +             |
    +(1 row)
    +
    + +
    +
  • pg_get_function_arguments(func_oid)

    Description: Gets argument list of function's definition (with default values).

    +

    Return type: text

    +

    Note: pg_get_function_arguments returns the argument list of a function, in the form it would need to appear in within CREATE FUNCTION.

    +
  • pg_get_function_identity_arguments(func_oid)

    Description: Gets argument list to identify a function (without default values).

    +

    Return type: text

    +

    Note: pg_get_function_identity_arguments returns the argument list necessary to identify a function, in the form it would need to appear in within ALTER FUNCTION. This form omits default values.

    +
  • pg_get_function_result(func_oid)

    Description: Gets RETURNS clause for function.

    +

    Return type: text

    +

    Note: pg_get_function_result returns the appropriate RETURNS clause for the function.

    +
  • pg_get_indexdef(index_oid)

    Description: Gets CREATE INDEX command for index.

    +

    Return type: text

    +

    index_oid indicates the index OID, which can be queried in the PG_STATIO_ALL_INDEXES system view.

    +

    Example: Query the OID and CREATE INDEX command of index ds_ship_mode_t1_index1.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT indexrelid FROM PG_STATIO_ALL_INDEXES WHERE indexrelname = 'ds_ship_mode_t1_index1';
    + indexrelid
    +------------
    +     136035
    +(1 row)
    +SELECT * FROM pg_get_indexdef(136035);
    +                                                pg_get_indexdef
    +---------------------------------------------------------------------------------------------------------------
    + CREATE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1 USING psort (sm_ship_mode_sk) TABLESPACE pg_default
    +(1 row)
    +
    + +
    +
  • pg_get_indexdef(index_oid, column_no, pretty_bool)

    Description: Gets CREATE INDEX command for index, or definition of just one index column when column_no is not zero.

    +

    Return type: text

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    SELECT * FROM pg_get_indexdef(136035,0,false);
    +                                                pg_get_indexdef
    +---------------------------------------------------------------------------------------------------------------
    + CREATE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1 USING psort (sm_ship_mode_sk) TABLESPACE pg_default
    +(1 row)
    +SELECT * FROM pg_get_indexdef(136035,1,false);
    + pg_get_indexdef
    +-----------------
    + sm_ship_mode_sk
    +(1 row)
    +
    + +
    +
  • pg_get_keywords()

    Description: Gets list of SQL keywords and their categories.

    +

    Return type: setof record

    +

    Note: pg_get_keywords returns a set of records describing the SQL keywords recognized by the server. The word column contains the keyword. The catcode column contains a category code: U for unreserved, C for column name, T for type or function name, or R for reserved. The catdesc column contains a possibly-localized string describing the category.

    +
  • pg_get_ruledef(rule_oid)

    Description: Gets CREATE RULE command for a rule.

    +

    Return type: text

    +
  • pg_get_ruledef(rule_oid, pretty_bool)

    Description: Gets CREATE RULE command for a rule.

    +

    Return type: text

    +
  • pg_get_userbyid(role_oid)

    Description: Gets role name with given OID.

    +

    Return type: name

    +

    Note: pg_get_userbyid extracts a role's name given its OID.

    +
  • pg_get_viewdef(viewname text [, pretty bool [, fullflag bool]])

    Description: gets underlying SELECT command for views.

    +

    Return type: text

    +

    Note:

    +
    • pg_get_viewdef reconstructs the SELECT query that defines a view. If the value of pretty bool is set to true, the display format is suitable for printing and more readable. The default value of pretty bool is false, and the display format is not readable. Use the default format for dump purposes whenever possible. The pretty bool parameter can be applied only to valid views.
    • When fullflag bool is set to true, the complete definition of the view is displayed. The default value is false.
    +
  • pg_get_viewdef(viewoid oid [, pretty bool [, fullflag bool]])

    Description: gets underlying SELECT command for views.

    +

    Return type: text

    +
  • pg_get_viewdef(view_oid, wrap_column_int)

    Description: Gets underlying SELECT command for view, wrapping lines with columns as specified, printing is implied.

    +

    Return type: text

    +
  • pg_get_tabledef(table_oid)

    Description: Obtains a table definition based on table_oid.

    +

    Return type: text

    +

    Example: Obtain the OID of the table customer_t2 from the system catalog pg_class, and then use this function to query the definition of customer_t2 to obtain the table columns, storage mode (row-store or column-store), and table distribution mode configured for customer_t2 when it is created.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    select oid from pg_class where relname ='customer_t2';
    +  oid
    +-------
    + 17353
    +(1 row)
    +
    +select * from pg_get_tabledef(17353);
    +              pg_get_tabledef
    +--------------------------------------------
    + SET search_path = dbadmin;                +
    + CREATE  TABLE customer_t2 (               +
    +         state_id character(2),            +
    +         state_name character varying(40), +
    +         area_id numeric                   +
    + )                                         +
    + WITH (orientation=column, compression=low)+
    + DISTRIBUTE BY HASH(state_id)              +
    + TO GROUP group_version1;
    +(1 row)
    +
    + +
    +
  • pg_get_tabledef(table_name)

    Description: Obtains a table definition based on table_name.

    +

    Return type: text

    +

    Remarks: pg_get_tabledef reconstructs the CREATE statement of the table definition, including the table definition, index information, and comments. Users need to create the dependent objects of the table, such as groups, schemas, tablespaces, and servers. The table definition does not include the statements for creating these dependent objects.

    +
  • pg_options_to_table(reloptions)

    Description: Gets the set of storage option name/value pairs.

    +

    Return type: setof record

    +

    Note: pg_options_to_table returns the set of storage option name/value pairs (option_name/option_value) when passing pg_class.reloptions or pg_attribute.attoptions.

    +
  • pg_typeof(any)

    Description: Gets the data type of any value.

    +

    Return type: regtype

    +

    Note:

    +

    pg_typeof returns the OID of the data type of the value that is passed to it. This can be helpful for troubleshooting or dynamically constructing SQL queries. The function is declared as returning regtype, which is an OID alias type (see Object Identifier Types). This means that it is the same as an OID for comparison purposes but displays as a type name.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT pg_typeof(33);
    + pg_typeof 
    +-----------
    + integer
    +(1 row)
    +
    +SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
    + typlen 
    +--------
    +      4
    +(1 row)
    +
    + +
    +
  • collation for (any)

    Description: Gets the collation of the parameter.

    +

    Return type: text

    +

    Note:

    +

    The expression collation for returns the collation of the value that is passed to it. For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT collation for (description) FROM pg_description LIMIT 1;
    + pg_collation_for 
    +------------------
    + "default"
    +(1 row)
    +
    + +
    +

    The value might be quoted and schema-qualified. If no collation is derived for the argument expression, then a null value is returned. If the parameter is not of a collectable data type, then an error is thrown.

    +
  • getdistributekey(table_name)

    Description: Gets a distribution column for a hash table.

    +

    Return type: text

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT getdistributekey('item');
    + getdistributekey 
    +------------------
    + i_item_sk
    +(1 row)
    +
    + +
    +
+
+

Comment Information Functions

  • col_description(table_oid, column_number)

    Description: Gets comment for a table column.

    +

    Return type: text

    +

    Note: col_description returns the comment for a table column, which is specified by the OID of its table and its column number.

    +
  • obj_description(object_oid, catalog_name)

    Description: Gets comment for a database object.

    +

    Return type: text

    +

    Note: The two-parameter form of obj_description returns the comment for a database object specified by its OID and the name of the containing system catalog. For example, obj_description(123456,'pg_class') would retrieve the comment for the table with OID 123456. The one-parameter form of obj_description requires only the object OID.

    +

    obj_description cannot be used for table columns since columns do not have OIDs of their own.

    +
  • obj_description(object_oid)

    Description: Gets comment for a database object.

    +

    Return type: text

    +
  • shobj_description(object_oid, catalog_name)

    Description: Gets comment for a shared database object.

    +

    Return type: text

    +

    Note: shobj_description is used just like obj_description except the former is used for retrieving comments on shared objects. Some system catalogs are global to all databases within each cluster, and the comments for objects in them are stored globally as well.

    +
+
+

Transaction IDs and Snapshots

The following functions provide server transaction information in an exportable form. The main use of these functions is to determine which transactions were committed between two snapshots.

+
  • pgxc_is_committed(transaction_id)

    Description: Determines whether the given XID is committed or ignored. NULL indicates the unknown status (such as running, preparing, and freezing).

    +

    Return type: bool

    +
  • txid_current()

    Description: Gets current transaction ID.

    +

    Return type: bigint

    +
  • txid_current_snapshot()

    Description: Gets current snapshot.

    +

    Return type: txid_snapshot

    +
  • txid_snapshot_xip(txid_snapshot)

    Description: Gets in-progress transaction IDs in snapshot.

    +

    Return type: setof bigint

    +
  • txid_snapshot_xmax(txid_snapshot)

    Description: Gets xmax of snapshot.

    +

    Return type: bigint

    +
  • txid_snapshot_xmin(txid_snapshot)

    Description: Gets xmin of snapshot.

    +

    Return type: bigint

    +
  • txid_visible_in_snapshot(bigint, txid_snapshot)

    Description: Queries whether the transaction ID is visible in snapshot. (do not use with subtransaction ids)

    +

    Return type: boolean

    +
+

+

The internal transaction ID type (xid) is 32 bits wide and wraps around every 4 billion transactions. txid_snapshot, the data type used by these functions, stores information about transaction ID visibility at a particular moment in time. Table 1 describes its components.

+ +
+ + + + + + + + + + + + + +
Table 1 Snapshot components

Name

+

Description

+

xmin

+

Earliest transaction ID (txid) that is still active. All earlier transactions will either be committed and visible, or rolled back.

+

xmax

+

First as-yet-unassigned txid. All txids greater than or equal to this are not yet started as of the time of the snapshot, so they are invisible.

+

xip_list

+

Active txids at the time of the snapshot. The list includes only those active txids between xmin and xmax; there might be active txids higher than xmax. A txid that is xmin <= txid < xmax and not in this list was already completed at the time of the snapshot, and is either visible or dead according to its commit status. The list does not include txids of subtransactions.

+
+
+

txid_snapshot's textual representation is xmin:xmax:xip_list.

+

For example: 10:20:10,14,15 means xmin=10, xmax=20, xip_list=10, 14, 15.

+
+

Computing Node Group Function

pv_compute_pool_workload()

+

Description: Load status of a computing Node Group.

+

Return type: void

+

For example:

+
1
+2
+3
+4
+5
+6
SELECT * from pv_compute_pool_workload();
+ nodename  | rpinuse | maxrp | nodestate
+-----------+---------+-------+-----------
+ datanode1 |       0 |  1000 | normal
+ datanode2 |       0 |  1000 | normal
+(2 rows)
+
+ +
+
+

Lock Information Function

pgxc_get_lock_conflicts()

+

Description: Obtains information about conflicting locks in the cluster. When a lock is waiting for another lock or another lock is waiting for it, a lock conflict occurs.

+

Return type: setof record

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0052.html b/docs/dws/dev/dws_06_0052.html new file mode 100644 index 00000000..25de7144 --- /dev/null +++ b/docs/dws/dev/dws_06_0052.html @@ -0,0 +1,35 @@ + + +

System Administration Functions

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0053.html b/docs/dws/dev/dws_06_0053.html new file mode 100644 index 00000000..923ebf27 --- /dev/null +++ b/docs/dws/dev/dws_06_0053.html @@ -0,0 +1,46 @@ + + +

Configuration Settings Functions

+

Configuration setting functions are used for querying and modifying configuration parameters during running.

+
  • current_setting(setting_name)

    Description: Specifies the current setting.

    +

    Return type: text

    +

    Note: current_setting obtains the current setting of setting_name by query. It is equivalent to the SHOW statement. For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT current_setting('datestyle');
    +
    + current_setting
    +-----------------
    + ISO, MDY
    +(1 row)
    +
    + +
    +
  • set_config(setting_name, new_value, is_local)

    Description: Sets the parameter and returns a new value.

    +

    Return type: text

    +

    Note: set_config sets the parameter setting_name to new_value. If is_local is true, the new value will only apply to the current transaction. If you want the new value to apply for the current session, use false instead. The function corresponds to the SET statement. For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    SELECT set_config('log_statement_stats', 'off', false);
    +
    + set_config
    +------------
    + off
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0054.html b/docs/dws/dev/dws_06_0054.html new file mode 100644 index 00000000..6fa283de --- /dev/null +++ b/docs/dws/dev/dws_06_0054.html @@ -0,0 +1,170 @@ + + +

Universal File Access Functions

+

Universal file access functions provide local access interfaces for files on a database server. Only files in the database cluster directory and the log_directory directory can be accessed. Use a relative path for files in the cluster directory, and a path matching the log_directory configuration setting for log files. Only database system administrators can use these functions.

+
  • pg_ls_dir(dirname text)

    Description: Lists files in a directory.

    +

    Return type: setof text

    +

    Note: pg_ls_dir returns all the names in the specified directory, except the special entries "." and "..".

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    SELECT pg_ls_dir('./');
    +      pg_ls_dir       
    +----------------------
    + .postgresql.conf.swp
    + postgresql.conf
    + pg_tblspc
    + PG_VERSION
    + pg_ident.conf
    + core
    + server.crt
    + pg_serial
    + pg_twophase
    + postgresql.conf.lock
    + pg_stat_tmp
    + pg_notify
    + pg_subtrans
    + pg_ctl.lock
    + pg_xlog
    + pg_clog
    + base
    + pg_snapshots
    + postmaster.opts
    + postmaster.pid
    + server.key.rand
    + server.key.cipher
    + pg_multixact
    + pg_errorinfo
    + server.key
    + pg_hba.conf
    + pg_replslot
    + .pg_hba.conf.swp
    + cacert.pem
    + pg_hba.conf.lock
    + global
    + gaussdb.state
    +(32 rows)
    +
    + +
    +
  • pg_read_file(filename text, offset bigint, length bigint)

    Description: Returns the content of a text file.

    +

    Return type: text

    +

    Note: pg_read_file returns part of a text file. It can return a maximum of length bytes from offset. The actual size of fetched data is less than length if the end of the file is reached first. If offset is negative, it is the length rolled back from the file end. If offset and length are omitted, the entire file is returned.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT pg_read_file('postmaster.pid',0,100);
    +             pg_read_file              
    +---------------------------------------
    + 53078                                +
    + /srv/BigData/hadoop/data1/coordinator+
    + 1500022474                           +
    + 253088000                                +
    + /var/run/FusionInsight               +
    + localhost                            +
    +  2
    +(1 row)
    +
    + +
    +
  • pg_read_binary_file(filename text [, offset bigint, length bigint,missing_ok boolean])

    Description: Returns the content of a binary file.

    +

    Return type: bytea

    +

    Note: pg_read_binary_file is similar to pg_read_file, except that the result is a bytea value; accordingly, no encoding checks are performed. In combination with the convert_from function, this function can be used to read a file in a specified encoding:

    +
    1
    SELECT convert_from(pg_read_binary_file('filename'), 'UTF8');
    +
    + +
    +
  • pg_stat_file(filename text)

    Description: Returns status information about a file.

    +

    Return type: record

    +

    Note: pg_stat_file returns a record containing the file size, last access timestamp, last modification timestamp, last file status change timestamp, and a boolean value indicating if it is a directory. Typical use cases are as follows:

    +
    1
    SELECT * FROM pg_stat_file('filename');
    +
    + +
    +
    1
    SELECT (pg_stat_file('filename')).modification;
    +
    + +
    +

    Examples:

    +
    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    SELECT * FROM pg_stat_file('postmaster.pid');
    + 
    + size |         access         |      modification      |         change         
    +| creation | isdir 
    +------+------------------------+------------------------+------------------------
    ++----------+-------
    +  117 | 2017-06-05 11:06:34+08 | 2017-06-01 17:18:08+08 | 2017-06-01 17:18:08+08 
    +|          | f
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT (pg_stat_file('postmaster.pid')).modification;
    +      modification      
    +------------------------
    + 2017-06-01 17:18:08+08
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0055.html b/docs/dws/dev/dws_06_0055.html new file mode 100644 index 00000000..5844270d --- /dev/null +++ b/docs/dws/dev/dws_06_0055.html @@ -0,0 +1,65 @@ + + +

Server Signaling Functions

+

Server signaling functions send control signals to other server processes. Only system administrators can use these functions.

+
  • pg_cancel_backend(pid int)

    Description: Cancels the current query of a backend.

    +

    Return type: boolean

    +

    Note: pg_cancel_backend sends a query cancellation (SIGINT) signal to the backend process identified by pid. The PID of an active backend process can be found in the pid column of the pg_stat_activity view, or can be found by listing the database process using ps on the server.

    +
  • pg_reload_conf()

    Description: Causes all server processes to reload their configuration files.

    +

    Return type: boolean

    +

    Note: pg_reload_conf sends a SIGHUP signal to the server. As a result, all server processes reload their configuration files.

    +
  • pg_rotate_logfile()

    Description: Rotates the log files of the server.

    +

    Return type: boolean

    +

    Note: pg_rotate_logfile instructs the log file manager to immediately switch to a new output file. This function is valid only if the built-in log collector is running.

    +
  • pg_terminate_backend(pid int)

    Description: Terminates a backend thread.

    +

    Return type: boolean

    +

    Note: Each of these functions returns true if they are successful and false otherwise.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    SELECT pid from pg_stat_activity;
    +       pid       
    +-----------------
    + 140657876268816
    + 140433774061312
    + 140433587902208
    + 140433656592128
    + 140433723717376
    + 140433637189376
    + 140433552770816
    + 140433481983744
    + 140433349310208
    +(1 rows)
    +
    +SELECT pg_terminate_backend(140657876268816);
    + pg_terminate_backend 
    +----------------------
    + t
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0056.html b/docs/dws/dev/dws_06_0056.html new file mode 100644 index 00000000..3e8a829c --- /dev/null +++ b/docs/dws/dev/dws_06_0056.html @@ -0,0 +1,318 @@ + + +

Backup and Restoration Control Functions

+

Backup Control Functions

Backup control functions help online backup.

+
  • pg_create_restore_point(name text)

    Description: Creates a named point for performing the restore operation (restricted to system administrators).

    +

    Return type: text

    +

    Note: pg_create_restore_point creates a named transaction log record that can be used as a restoration target, and returns the corresponding transaction log location. The given name can then be used with recovery_target_name to specify the point up to which restoration will proceed. Avoid creating multiple restoration points with the same name, since restoration will stop at the first one whose name matches the restoration target.

    +
  • pg_current_xlog_location()

    Description: Obtains the write position of the current transaction log.

    +

    Return type: text

    +

    Note: pg_current_xlog_location displays the write position of the current transaction log in the same format as those of the previous functions. Read-only operations do not require rights of the system administrator.

    +
  • pg_current_xlog_insert_location()

    Description: Obtains the insert position of the current transaction log.

    +

    Return type: text

    +

    Note: pg_current_xlog_insert_location displays the insert position of the current transaction log. The insertion point is the logical end of the transaction log at any instant, while the write location is the end of what has been written out from the server's internal buffers. The write position is the end that can be detected externally from the server. This operation can be performed to archive only some of completed transaction log files. The insert position is mainly used for commissioning the server. Read-only operations do not require rights of the system administrator.

    +
  • pg_start_backup(label text [, fast boolean ])

    Description: Starts executing online backup (restricted to system administrators or replication roles).

    +

    Return type: text

    +

    Note: pg_start_backup receives a user-defined backup label (usually the name of the position where the backup dump file is stored). This function writes a backup label file to the data directory of the database cluster and then returns the starting position of backed up transaction logs in text mode.

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_start_backup('label_goes_here');
    + pg_start_backup
    +-----------------
    + 0/3000020
    +(1 row)
    +
    + +
    +
  • pg_stop_backup()

    Description: Completes online backup (restricted to system administrators or replication roles).

    +

    Return type: text

    +

    Note: pg_stop_backup deletes the label file created by pg_start_backup and creates a backup history file in the transaction log archive area. The history file includes the label given to pg_start_backup, the starting and ending transaction log locations for the backup, and the starting and ending times of the backup. The return value is the backup's ending transaction log location. After the ending position is calculated, the insert position of the current transaction log automatically goes ahead to the next transaction log file. This way, the ended transaction log file can be immediately archived so that backup is complete.

    +
  • pg_switch_xlog()

    Description: Switches to a new transaction log file (restricted to system administrators).

    +

    Return type: text

    +

    Note: pg_switch_xlog moves to the next transaction log file so that the current log file can be archived (if continuous archive is used). The return value is the ending transaction log location + 1 within the just-completed transaction log file. If there has been no transaction log activity since the last transaction log switchover, pg_switch_xlog will do nothing but return the start location of the transaction log file currently in use.

    +
  • pg_xlogfile_name(location text)

    Description: Converts the position string in a transaction log to a file name.

    +

    Return type: text

    +

    Note: pg_xlogfile_name extracts only the transaction log file name. If the given transaction log position is the transaction log file border, a transaction log file name will be returned for both the two functions. This is usually the desired behavior for managing transaction log archiving, since the preceding file is the last one that currently needs to be archived.

    +
  • pg_xlogfile_name_offset(location text)

    Description: Converts the position string in a transaction log to a file name and returns the byte offset in the file.

    +

    Return type: text, integer

    +

    Note: pg_xlogfile_name_offset can extract transaction log file names and byte offsets from the returned results of the preceding functions. For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT * FROM pg_xlogfile_name_offset(pg_stop_backup());
    +NOTICE:  pg_stop_backup cleanup done, waiting for required WAL segments to be archived
    +NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
    +        file_name         | file_offset 
    +--------------------------+-------------
    +000000010000000000000003  |         272
    +(1 row)
    +
    + +
    +
  • pg_xlog_location_diff(location text, location text)

    Description: pg_xlog_location_diff calculates the difference in bytes between two transaction log locations.

    +

    Return type: numeric

    +
  • pg_cbm_tracked_location()

    Description: Queries for the LSN location parsed by CBM.

    +

    Return type: text

    +
  • pg_cbm_get_merged_file(startLSNArg text, endLSNArg text)

    Description: Combines CBM files within the specified LSN range into one and returns the name of the combined file.

    +

    Return type: text

    +
  • pg_cbm_get_changed_block(startLSNArg text, endLSNArg text)

    Description: Combines CBM files within the specified LSN range into a table and return records of this table.

    +

    Return type: record

    +

    Note: The table columns include the start LSN, end LSN, tablespace OID, database OID, table relfilenode, table fork number, whether the table is deleted, whether the table is created, whether the table is truncated, number of pages in the truncated table, number of modified pages, and list of No. of modified pages.

    +
  • pg_cbm_recycle_file(slotName name, targetLSNArg text)

    Description: Deletes the CBM files that are no longer used and returns the first LSN after the deletion. If slotName is empty, targetLSNArg is used as the recycling point. During backup and DR, you need to specify a slot name due to parallelism. Record the targetLSNArg value of the task to the slot, traverse all backup slots, and find the smallest LSN as the recycling point.

    +

    Return type: text

    +
  • pg_cbm_force_track(targetLSNArg text,timeOut int)

    Description: Forcibly executes the CBM trace to the specified Xlog position and returns the Xlog position of the actual trace end point.

    +

    Return type: text

    +
  • pg_enable_delay_ddl_recycle()

    Description: Enables DDL delay and returns the Xlog position of the enabling point.

    +

    Return type: text

    +
  • pg_disable_delay_ddl_recycle(barrierLSNArg text, isForce bool)

    Description: Disables DDL delay and returns the Xlog range where DDL delay takes effect.

    +

    Return type: record

    +
  • pg_enable_delay_xlog_recycle()

    Description: Enables Xlog recycle delay.

    +

    Return type: void

    +
  • pg_disable_delay_xlog_recycle()

    Description: Disables Xlog recycle delay.

    +

    Return type: void

    +
+
+
  • pgxc_get_senders_catchup_time()

    Description: Displays the catchup information of the currently active primary/standby instance sending thread on all DNs.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 pgxc_get_senders_catchup_time() columns

    Name

    +

    Type

    +

    Description

    +

    node_name

    +

    text

    +

    Node name

    +

    lwpid

    +

    integer

    +

    Current sender lwpid

    +

    local_role

    +

    text

    +

    Local role

    +

    peer_role

    +

    text

    +

    Peer role

    +

    state

    +

    text

    +

    Current sender's replication status

    +

    sender

    +

    text

    +

    Current sender type

    +

    catchup_start

    +

    timestamp with time zone

    +

    Startup time of a catchup task

    +

    catchup_end

    +

    timestamp with time zone

    +

    End time of a catchup task

    +

    catchup_type

    +

    text

    +

    Catchup task type, full or incremental

    +

    catchup_bcm_filename

    +

    text

    +

    BCM file executed by the current catchup task

    +

    catchup_bcm_finished

    +

    integer

    +

    Number of BCM files completed by a catchup task

    +

    catchup_bcm_total

    +

    integer

    +

    Total number of BCM files to be operated by a catchup task

    +

    catchup_percent

    +

    text

    +

    Completion percentage of a catchup task

    +

    catchup_remaining_time

    +

    text

    +

    Estimated remaining time of a catchup task

    +
    +
    +
+

Restoration Control Functions

Restoration control functions provide information about the status of standby nodes. These functions may be executed both during restoration and in normal running.

+
  • pg_is_in_recovery()

    Description: Returns true if restoration is still in progress.

    +

    Return type: bool

    +
  • pg_last_xlog_receive_location()

    Description: Gets the last transaction log location received and synchronized to disk by streaming replication. While streaming replication is in progress, this will increase monotonically. If restoration has completed, then this value will remain static at the value of the last WAL record received and synchronized to disk during restoration. If streaming replication is disabled or if not yet started, the function return will return NULL.

    +

    Return type: text

    +
  • pg_last_xlog_replay_location()

    Description: Gets last transaction log location replayed during restoration. If restoration is still in progress, this will increase monotonically. If restoration has completed, then this value will remain static at the value of the last WAL record received during that restoration. When the server has been started normally without restoration, the function returns NULL.

    +

    Return type: text

    +
  • pg_last_xact_replay_timestamp()

    Description: Gets the timestamp of last transaction replayed during restoration. This is the time to commit a transaction or abort a WAL record on the primary node. If no transactions have been replayed during restoration, this function will return NULL. Otherwise, if restoration is still in progress, this will increase monotonically. If restoration has completed, then this value will remain static at the value of the last WAL record received during that restoration. If the server normally starts without manual intervention, this function will return NULL.

    +

    Return type: timestamp with time zone

    +
+

Restoration control functions control restoration processes. These functions may be executed only during restoration.

+
  • pg_is_xlog_replay_paused()

    Description: Returns true if restoration is paused.

    +

    Return type: bool

    +
  • pg_xlog_replay_pause()

    Description: Pauses restoration immediately.

    +

    Return type: void

    +
  • pg_xlog_replay_resume()

    Description: Restarts restoration if it was paused.

    +

    Return type: void

    +
+

While restoration is paused, no further database changes are applied. In hot standby mode, all new queries will see the same consistent snapshot of the database, and no further query conflicts will be generated until restoration is resumed.

+

If streaming replication is disabled, the paused state may continue indefinitely without problem. While streaming replication is in progress, WAL records will continue to be received, which will eventually fill available disk space. This progress depends on the duration of the pause, the rate of WAL generation, and available disk space.

+
  • pg_xlog_replay_completion()

    Description: Displays the progress of xlog redo on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Table 2 pg_xlog_replay_completion() columns

    Column

    +

    Type

    +

    Description

    +

    replay_start

    +

    integer

    +

    Start LSN of xlog redo

    +

    replay_current

    +

    integer

    +

    LSN of the current replay of xlog redo

    +

    replay_end

    +

    integer

    +

    Maximum LSN that requires xlog redo

    +

    replay_percent

    +

    integer

    +

    Completion percentage of xlog redo

    +
    +
    +
  • pg_data_sync_from_dummy_completion()

    Description: Displays the progress of data page file synchronization during the failover on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Table 3 pg_data_sync_from_dummy_completion() columns

    Column

    +

    Type

    +

    Description

    +

    start_index

    +

    integer

    +

    Start LSN of data page file synchronization

    +

    current_index

    +

    integer

    +

    Current LSN of data page file synchronization

    +

    total_index

    +

    integer

    +

    Maximum LSN of data page file synchronization

    +

    sync_percent

    +

    integer

    +

    Completion percentage of data page files

    +
    +
    +
  • gs_roach_stop_backup(backupid text)

    Description: Stops a backup started by the internal backup tool GaussRoach and returns the position where the current log is inserted. This function is similar to pg_stop_backup, but is more lightweight.

    +

    Return type: text

    +
  • gs_roach_enable_delay_ddl_recycle(backupid name)

    Description: Enables DDL delay and returns the log position of the enabling point. This function is similar to pg_enable_delay_ddl_recycle, but is more lightweight. In addition, this function allows you to enable DDL delay for multiple backups.

    +

    Return type: text

    +
  • gs_roach_disable_delay_ddl_recycle(backupid text)

    Description: Disables DDL delay, returns the logs for which DDL delay takes effect, and deletes the physical files of the column-store tables that have been deleted by the user. This function is similar to pg_enable_delay_ddl_recycle, but is more lightweight. In addition, this function allows you to disable DDL delay for multiple backups.

    +

    Return type: record

    +
  • gs_roach_switch_xlog(request_ckpt bool)

    Description: Switches the currently used log segment file and returns the position of the segment log. If the value of request_ckpt is true, a full check point is triggered.

    +

    Return type: text

    +
  • pg_resume_bkp_flag(backupid name)

    Description: Resumes the delay xlog flag from a specified backup and returns start_backup_flag boolean, to_delay boolean, ddl_delay_recycle_ptr text, and rewind_time text.

    +

    Return type: record

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0057.html b/docs/dws/dev/dws_06_0057.html new file mode 100644 index 00000000..4b53a5c5 --- /dev/null +++ b/docs/dws/dev/dws_06_0057.html @@ -0,0 +1,15 @@ + + +

Snapshot Synchronization Functions

+

Snapshot synchronization functions save the current snapshot and return its identifier.

+

pg_export_snapshot()

+

Description: Saves the current snapshot and returns its identifier.

+

Return type: text

+

Note: pg_export_snapshot saves the current snapshot and returns a text string identifying the snapshot. This string must be passed to clients that want to import the snapshot. A snapshot can be imported when the set transaction snapshot snapshot_id; command is executed. Doing so is possible only when the transaction is set to the REPEATABLE READ isolation level. The output of the function cannot be used as the input of set transaction snapshot.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0058.html b/docs/dws/dev/dws_06_0058.html new file mode 100644 index 00000000..033b01b5 --- /dev/null +++ b/docs/dws/dev/dws_06_0058.html @@ -0,0 +1,107 @@ + + +

Database Object Functions

+

Database Object Size Functions

Database object size functions calculate the actual disk space used by database objects.

+
  • pg_column_size(any)

    Description: Specifies the number of bytes used to store a particular value (possibly compressed).

    +

    Return type: int

    +

    Note: pg_column_size displays the space for storing an independent data value.

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_column_size(1);
    + pg_column_size 
    +----------------
    +              4
    +(1 row)
    +
    + +
    +
  • pg_database_size(oid)

    Description: Specifies the disk space used by the database with the specified OID.

    +

    Return type: bigint

    +
  • pg_database_size(name)

    Description: Specifies the disk space used by the database with the specified name.

    +

    Return type: bigint

    +

    Note: pg_database_size receives the OID or name of a database and returns the disk space used by the corresponding object.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_database_size('gaussdb');
    + pg_database_size 
    +------------------
    +         51590112
    +(1 row)
    +
    + +
    +
  • pg_relation_size(oid)

    Description: Specifies the disk space used by the table with a specified OID or index.

    +

    Return type: bigint

    +
  • get_db_source_datasize()

    Description: Estimates the total size of non-compressed data in the current database.

    +

    Return type: bigint

    +

    Note: (1) ANALYZE must be performed before this function is called. (2) Calculate the total size of non-compressed data by estimating the compression rate of column-store tables.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    analyze;
    +ANALYZE
    +select get_db_source_datasize();
    + get_db_source_datasize
    +------------------------
    +            35384925667
    +(1 row)
    +
    + +
    +
  • pg_relation_size(text)

    Description: Specifies the disk space used by the table with a specified name or index. The table name can be schema-qualified.

    +

    Return type: bigint

    +
  • pg_relation_size(relation regclass, fork text)

    Description: Specifies the disk space used by the specified bifurcating tree ('main', 'fsm', or 'vm') of a certain table or index.

    +

    Return type: bigint

    +
  • pg_relation_size(relation regclass)

    Description: Is an abbreviation of pg_relation_size(..., 'main').

    +

    Return type: bigint

    +

    Note: pg_relation_size receives the OID or name of a table, index, or compressed table, and returns the size.

    +
  • pg_partition_size(oid,oid)

    Description: Specifies the disk space used by the partition with a specified OID. The first oid is the OID of the table and the second oid is the OID of the partition.

    +

    Return type: bigint

    +
  • pg_partition_size(text, text)

    Description: Specifies the disk space used by the partition with a specified name. The first text is the table name and the second text is the partition name.

    +

    Return type: bigint

    +
  • pg_partition_indexes_size(oid,oid)

    Description: Specifies the disk space used by the index of the partition with a specified OID. The first oid is the OID of the table and the second oid is the OID of the partition.

    +

    Return type: bigint

    +
  • pg_partition_indexes_size(text,text)

    Description: Specifies the disk space used by the index of the partition with a specified name. The first text is the table name and the second text is the partition name.

    +

    Return type: bigint

    +
  • pg_indexes_size(regclass)

    Description: Specifies the total disk space used by the index appended to the specified table.

    +

    Return type: bigint

    +
  • pg_size_pretty(bigint)

    Description: Converts the calculated byte size into a size readable to human beings.

    +

    Return type: text

    +
  • pg_size_pretty(numeric)

    Description: Converts the calculated byte size indicated by a numeral into a size readable to human beings.

    +

    Return type: text

    +

    Note: pg_size_pretty formats the results of other functions into a human-readable format. KB/MB/GB/TB can be used.

    +
  • pg_table_size(regclass)

    Description: Specifies the disk space used by the specified table, excluding indexes (but including TOAST, free space mapping, and visibility mapping).

    +

    Return type: bigint

    +
  • pg_total_relation_size(oid)

    Description: Specifies the disk space used by the table with a specified OID, including the index and the compressed data.

    +

    Return type: bigint

    +
  • pg_total_relation_size(regclass)

    Description: Specifies the total disk space used by the specified table, including all indexes and TOAST data.

    +

    Return type: bigint

    +
  • pg_total_relation_size(text)

    Description: Specifies the disk space used by the table with a specified name, including the index and the compressed data. The table name can be schema-qualified.

    +

    Return type: bigint

    +

    Note: pg_total_relation_size receives the OID or name of a table or a compressed table, and returns the sizes of the data, related indexes, and the compressed table in bytes.

    +
+
+

Database Object Position Functions

  • pg_relation_filenode(relation regclass)

    Description: Specifies the ID of a filenode with the specified relationship.

    +

    Return type: oid

    +

    Description: pg_relation_filenode receives the OID or name of a table, index, sequence, or compressed table, and returns the filenode number allocated to it. The filenode is the basic component of the file name used by the relationship. For most tables, the result is the same as that of pg_class.relfilenode. For the specified system directory, relfilenode is 0 and this function must be used to obtain the correct value. If a relationship that is not stored is transmitted, such as a view, this function returns NULL.

    +
  • pg_relation_filepath(relation regclass)

    Description: Specifies the name of a file path with the specified relationship.

    +

    Return type: text

    +

    Description: pg_relation_filepath is similar to pg_relation_filenode, except that pg_relation_filepath returns the whole file path name for the relationship (relative to the data directory PGDATA of the database cluster).

    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0059.html b/docs/dws/dev/dws_06_0059.html new file mode 100644 index 00000000..85bc3314 --- /dev/null +++ b/docs/dws/dev/dws_06_0059.html @@ -0,0 +1,65 @@ + + +

Advisory Lock Functions

+

Advisory lock functions manage advisory locks. These functions are only for internal use currently.

+
  • pg_advisory_lock(key bigint)

    Description: Obtains an exclusive session-level advisory lock.

    +

    Return type: void

    +

    Note: pg_advisory_lock locks resources defined by an application. The resources can be identified using a 64-bit or two nonoverlapped 32-bit key values. If another session locks the resources, the function blocks the resources until they can be used. The lock is exclusive. Multiple locking requests are pushed into the stack. Therefore, if the same resource is locked three times, it must be unlocked three times so that it is released to another session.

    +
  • pg_advisory_lock(key1 int, key2 int)

    Description: Obtains an exclusive session-level advisory lock.

    +

    Return type: void

    +
  • pg_advisory_lock_shared(key bigint)

    Description: Obtains a shared session-level advisory lock.

    +

    Return type: void

    +
  • pg_advisory_lock_shared(key1 int, key2 int)

    Description: Obtains a shared session-level advisory lock.

    +

    Return type: void

    +

    Note: pg_advisory_lock_shared works in the same way as pg_advisory_lock, except the lock can be shared with other sessions requesting shared locks. Only would-be exclusive lockers are locked out.

    +
  • pg_advisory_unlock(key bigint)

    Description: Releases an exclusive session-level advisory lock.

    +

    Return type: boolean

    +
  • pg_advisory_unlock(key1 int, key2 int)

    Description: Releases an exclusive session-level advisory lock.

    +

    Return type: boolean

    +

    Note: pg_advisory_unlock releases the obtained exclusive advisory lock. If the release is successful, the function returns true. If the lock was not held, it will return false. In addition, a SQL warning will be reported by the server.

    +
  • pg_advisory_unlock_shared(key bigint)

    Description: Releases a shared session-level advisory lock.

    +

    Return type: boolean

    +
  • pg_advisory_unlock_shared(key1 int, key2 int)

    Description: Releases a shared session-level advisory lock.

    +

    Return type: boolean

    +

    Note: pg_advisory_unlock_shared works in the same way as pg_advisory_unlock, except it releases a shared session-level advisory lock.

    +
  • pg_advisory_unlock_all()

    Description: Releases all advisory locks owned by the current session.

    +

    Return type: void

    +

    Note: pg_advisory_unlock_all releases all advisory locks owned by the current session. The function is implicitly invoked when the session ends even if the client is abnormally disconnected.

    +
  • pg_advisory_xact_lock(key bigint)

    Description: Obtains an exclusive transaction-level advisory lock.

    +

    Return type: void

    +
  • pg_advisory_xact_lock(key1 int, key2 int)

    Description: Obtains an exclusive transaction-level advisory lock.

    +

    Return type: void

    +

    Note: pg_advisory_xact_lock works in the same way as pg_advisory_lock, except the lock is automatically released at the end of the current transaction and cannot be released explicitly.

    +
  • pg_advisory_xact_lock_shared(key bigint)

    Description: Obtains a shared transaction-level advisory lock.

    +

    Return type: void

    +
  • pg_advisory_xact_lock_shared(key1 int, key2 int)

    Description: Obtains a shared transaction-level advisory lock.

    +

    Return type: void

    +

    Note: pg_advisory_xact_lock_shared works in the same way as pg_advisory_lock_shared, except the lock is automatically released at the end of the current transaction and cannot be released explicitly.

    +
  • pg_try_advisory_lock(key bigint)

    Description: Obtains an exclusive session-level advisory lock if available.

    +

    Return type: boolean

    +

    Note: pg_try_advisory_lock is similar to pg_advisory_lock, except pg_try_advisory_lock does not block the resource until the resource is released. pg_try_advisory_lock either immediately obtains the lock and returns true or returns false, which indicates the lock cannot be performed currently.

    +
  • pg_try_advisory_lock(key1 int, key2 int)

    Description: Obtains an exclusive session-level advisory lock if available.

    +

    Return type: boolean

    +
  • pg_try_advisory_lock_shared(key bigint)

    Description: Obtains a shared session-level advisory lock if available.

    +

    Return type: boolean

    +
  • pg_try_advisory_lock_shared(key1 int, key2 int)

    Description: Obtains a shared session-level advisory lock if available.

    +

    Return type: boolean

    +

    Note: pg_try_advisory_lock_shared is similar to pg_try_advisory_lock, except pg_try_advisory_lock_shared attempts to obtain a shared lock instead of an exclusive lock.

    +
  • pg_try_advisory_xact_lock(key bigint)

    Description: Obtains an exclusive transaction-level advisory lock if available.

    +

    Return type: boolean

    +
  • pg_try_advisory_xact_lock(key1 int, key2 int)

    Description: Obtains an exclusive transaction-level advisory lock if available.

    +

    Return type: boolean

    +

    Note: pg_try_advisory_xact_lock works in the same way as pg_try_advisory_lock, except the lock, if acquired, is automatically released at the end of the current transaction and cannot be released explicitly.

    +
  • pg_try_advisory_xact_lock_shared(key bigint)

    Description: Obtains a shared transaction-level advisory lock if available.

    +

    Return type: boolean

    +
  • pg_try_advisory_xact_lock_shared(key1 int, key2 int)

    Description: Obtains a shared transaction-level advisory lock if available.

    +

    Return type: boolean

    +

    Note: pg_try_advisory_xact_lock_shared works in the same way as pg_try_advisory_lock_shared, except the lock, if acquired, is automatically released at the end of the current transaction and cannot be released explicitly.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0060.html b/docs/dws/dev/dws_06_0060.html new file mode 100644 index 00000000..d131600d --- /dev/null +++ b/docs/dws/dev/dws_06_0060.html @@ -0,0 +1,582 @@ + + +

Residual File Management Functions

+

Functions for Obtaining the Residual File List

  • pg_get_residualfiles()

    Description: Obtains all residual file records of the current node. This function is an instance-level function and is irrelevant to the current database. It can run on any instance.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    isverified

    +

    bool

    +

    Verified or not

    +

    isdeleted

    +

    bool

    +

    Deleted or not

    +

    dbname

    +

    text

    +

    Database name

    +

    residualfile

    +

    text

    +

    Data file path

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    select * from pg_get_residualfiles();
    + isverified | isdeleted | dbname |   residualfile    |         filepath          | notes 
    +------------+-----------+--------+-------------------+---------------------------+-------
    + f          | f         | db2    | base/49155/114691 | pgrf_20200908160211441546 | 
    + f          | f         | db2    | base/49155/114694 | pgrf_20200908160211441546 | 
    + f          | f         | db2    | base/49155/114696 | pgrf_20200908160211441546 | 
    +(3 rows)
    +
    + +
    +
+
  • pgxc_get_residualfiles()

    Description: Unified CN query function of pg_get_residualfiles() This function is a cluster-level function and is irrelevant to the current database. It runs on CNs.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    nodename

    +

    text

    +

    Node name

    +

    isverified

    +

    bool

    +

    Verified or not

    +

    isdeleted

    +

    bool

    +

    Deleted or not

    +

    dbname

    +

    text

    +

    Database name

    +

    residualfile

    +

    text

    +

    Data file path

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    select * from pgxc_get_residualfiles();
    +   nodename   | isverified | isdeleted |  dbname  |   residualfile    |         filepath          | notes 
    +--------------+------------+-----------+----------+-------------------+---------------------------+-------
    + cn_5001      | f          | f         | gaussdb | base/15092/32803  | pgrf_20200910170129360401 | 
    + dn_6001_6002 | f          | f         | db2      | base/49155/114691 | pgrf_20200908160211441546 | 
    + dn_6001_6002 | f          | f         | db2      | base/49155/114694 | pgrf_20200908160211441546 | 
    + dn_6001_6002 | f          | f         | db2      | base/49155/114696 | pgrf_20200908160211441546 | 
    +(4 rows)
    +
    + +
    +
+

+
+

Functions for Verifying Residual Files

  • pg_verify_residualfiles(filepath)

    Description: Verifies whether the file recorded in the parameter specified file is a residual file. This function is an instance-level function and is related to the current database. It can run on any instance.

    +

    Parameter type: text

    +

    Return type: bool

    +

    The following table describes return columns.

    + +
    + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    isverified

    +

    bool

    +

    Verification completed or not

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from pg_verify_residualfiles('pgrf_20200908160211441546');
    + isverified 
    +------------
    + t
    +(1 row)
    +
    + +
    +

    This function only verifies whether the recorded file is a residual file in the current database. If the recorded file is not in the current database, the verification is not applicable.

    +
    +
+
  • pg_verify_residualfiles()

    Description: Verifies whether recorded files on all residual file lists of the current instance are residual files. This function is an instance-level function and is related to the current database. It can run on any instance.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    result

    +

    bool

    +

    Verification completed or not

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from pg_verify_residualfiles();
    + result |         filepath          | notes 
    +--------+---------------------------+-------
    + t      | pgrf_20200908160211441546 | 
    +(1 row)
    +
    + +
    +

    This function only verifies whether the recorded file is a residual file in the current database. If the recorded file is not in the current database, the verification is not applicable.

    +
    +
+
  • pgxc_verify_residualfiles()

    Description: Unified CN query function of pg_verify_residualfiles() This function is a cluster-level function and is related to the current database. It runs on CNs.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    nodename

    +

    text

    +

    Node name

    +

    result

    +

    bool

    +

    Verification completed or not

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    select * from pgxc_verify_residualfiles();
    +   nodename   | result |         filepath          | notes 
    +--------------+--------+---------------------------+-------
    + cn_5001      | t      | pgrf_20200910170129360401 | 
    + dn_6001_6002 | t      | pgrf_20200908160211441546 | 
    +(2 rows)
    +
    + +
    +

    This function only verifies whether the recorded file is a residual file in the current database. If the recorded file is not in the current database, the verification is not applicable.

    +
    +
+
  • pg_is_residualfiles(residualfile)

    Description: Queries whether a specified relfilenode is a residual file in the current database. This function is an instance-level function and is related to the current database. It can run on any instance.

    +

    Parameter type: text

    +

    Return type: bool

    +

    The following table describes return columns.

    + +
    + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    result

    +

    bool

    +

    Residual file or not

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from pg_is_residualfiles('base/49155/114691');
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +

    This function only verifies whether the recorded file is a residual file in the current database. If the recorded file is not in the current database, it is verified as a residual file.

    +

    For example, the file base/15092/14790 is not regarded as a residual file in a gaussdb database, but it is regarded as a residual file in other databases.

    +

    select * from pg_is_residualfiles('base/15092/14790');

    +

    result

    +

    --------

    +

    f

    +

    (1 row)

    +

    +

    \c db2

    +

    db2=# select * from pg_is_residualfiles('base/15092/14790');

    +

    result

    +

    --------

    +

    t

    +

    (1 row)

    +
    +
+
+

Functions for Deleting Residual Files

  • pg_rm_residualfiles(filepath)

    Description: Deletes files from a specified residual file list on the current instance. This function is an instance-level function and is irrelevant to the current database. It can run on any instance.

    +

    Parameter type: text

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    result

    +

    bool

    +

    Deletion completed or not

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from pg_rm_residualfiles('pgrf_20200908160211441599');
    + result 
    +--------
    + t
    +(1 row)
    +
    + +
    +

    1. Residual files can be deleted only after verification using the pg_verify_residualfiles() function.

    +

    2. All verified files, regardless which database they are in, will be deleted.

    +

    3. If all files recorded in the specified file have been deleted, the specified file will be removed and backed up in the $PGDATA/pg_residualfile/backup directory.

    +
    +
+
  • pg_rm_residualfiles()

    Description: Deletes all files recorded on all residual file lists on the current instance. This function is an instance-level function and is irrelevant to the current database. It can run on any instance.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    result

    +

    bool

    +

    Deleted or not

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from pg_rm_residualfiles();
    + result |         filepath          | notes 
    +--------+---------------------------+-------
    + t      | pgrf_20200908160211441546 | 
    +(1 row)
    +
    + +
    +
    • Residual files can be deleted only after verification using the pg_verify_residualfiles() function.
    • All verified files, regardless which database they are in, will be deleted.
    • If all files recorded in the specified file have been deleted, the specified file will be removed and backed up in the $PGDATA/pg_residualfile/backup directory.
    +
    +
+
  • pgxc_rm_residualfiles()

    Description: Unified CN query function of pgxc_rm_residualfiles. This function is a cluster-level function and is irrelevant to the current database. It runs on CNs.

    +

    Parameter type: none

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    nodename

    +

    text

    +

    Node name

    +

    result

    +

    bool

    +

    Deletion completed or not

    +

    filepath

    +

    text

    +

    Residual file path

    +

    notes

    +

    text

    +

    Notes

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    select * from pgxc_rm_residualfiles();
    +   nodename   | result |         filepath          | notes 
    +--------------+--------+---------------------------+-------
    + cn_5001      | t      | pgrf_20200910170129360401 | 
    + dn_6001_6002 | t      | pgrf_20200908160211441546 | 
    +(2 rows)
    +
    + +
    +

    +
+
+

Using the Residual File Management Function:

Procedure:

+
  1. Call the pgxc_get_residualfiles() function to obtain the name of the database that has residual files.
  2. Go to the databases where residual files exist and call the pgxc_verify_residualfiles() function to verify the residual files recorded in the current database.
  3. Call the pgxc_rm_residualfiles() function to delete all the verified residual files.
+

The pgxc residual file management function only operates on the CN and the current primary DN, and does not verify or clear residual files on the standby DN. Therefore, after the primary DN is cleared, you need to clear residual files on the standby DN or build the standby DN in a timely manner. This prevents residual files on the standby DN from being copied back to the primary DN due to incremental build after a primary/standby switchover.

+
+

Example:

+

The following example uses two user-created databases, db1 and db2.

+

+
+
  1. Run the following command to obtain all residual file records of the cluster on the CNs:
    1
    db1=# select * from pgxc_get_residualfiles() order by 4, 6; -- order by is optional.
    +
    + +
    +

    +

    In the current cluster:

    +
    • Residual file records exist in the db1 and db2 databases on the dn_6001_6002 node (active node instance).
    • Residual files are displayed in the residualfile column.
    • The filepath column lists the files that record residual files. These files are stored in the pg_residualfiles directory under the instance data directory.
    +
  2. Call the pgxc_verify_residualfiles() function to verify the db1 database.
    1
    db1=# select * from pgxc_verify_residualfiles();
    +
    + +
    +

    +

    Verification functions are at the database level. Therefore, when a verification function is called in the db1 database, it only verifies residual files in db1.

    +

    You can call the get function again to check whether the verification is complete.

    +
    1
    db1=# select * from pgxc_get_residualfiles() order by 4, 6;
    +
    + +
    +

    +

    As shown in the preceding figure, the residual files in the db1 database have been verified, and the residual files in the db2 database are not verified.

    +
  3. Call the pgxc_rm_residualfiles() function to delete residual files.
    1
    db1=# select * from pgxc_rm_residualfiles();
    +
    + +
    +

    +
  4. Call the pgxc_get_residualfiles() function again to check the deletion result.

    +

    The result shows that the residual files in the db1 database are deleted (isdeleted is marked as t) and the residual files in the db2 database are not deleted.

    +

    In addition, nine query results are displayed. Compared with the previous query results, a record for the residual file ending with 9438 is missing. This is because the record file that records the residual file ending with 9438 contains only one record, which is deleted in step 3. If all residual files in a record file are deleted, the record file is also deleted. Deleted files are backed up in the pg_residualfiles/backup directory.

    +

    +
  5. To delete files from the db2 database, you need to call the verify function in the db2 database and then call the rm function.
    1. Go to the db2 database and call the verification function.

      +

      Query the verification result:

      +

      +
    2. Call the deletion function:

      +
    3. Query the deletion result:

      +

      All residual files recorded in the record file whose name ends with 8342 have been deleted, so the record file is deleted and backed up in the backup directory. As a result, no records are found.

      +

      +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0061.html b/docs/dws/dev/dws_06_0061.html new file mode 100644 index 00000000..b00964d3 --- /dev/null +++ b/docs/dws/dev/dws_06_0061.html @@ -0,0 +1,694 @@ + + +

Replication Functions

+

A replication function synchronizes logs and data between instances. It is a statistics or operation method provided by the system to implement HA.

+

Replication functions except statistics queries are internal functions. You are not advised to use them directly.

+
+
  • pg_create_logical_replication_slot('slot_name', 'plugin_name')

    Description: Creates a logical replication slot.

    +

    Parameter:

    +
    • slot_name

      Indicates the name of the streaming replication slot.

      +

      Value range: a string, supporting only letters, digits, and the following special characters: _?-.

      +
    • plugin_name

      Indicates the name of the plugin.

      +

      Value range: a string, supporting only mppdb_decoding

      +
    +

    Return type: name, text

    +

    Note: The first return value is the slot name, and the second is the start LSN position for decoding in the logical replication slot.

    +
  • pg_create_physical_replication_slot ('slot_name', isDummyStandby)

    Description: Creates a physical replication slot.

    +

    Parameter:

    +
    • slot_name

      Indicates the name of the streaming replication slot.

      +

      Value range: a string, supporting only letters, digits, and the following special characters: _?.-

      +
    • isDummyStandby

      Indicates whether the replication slot is the secondary one.

      +

      Value range: a boolean value, true or false

      +
    +

    Return type: name, text

    +

    Note: The first return value is the slot name, and the second is the start LSN position for decoding in the physical replication slot.

    +
  • pg_get_replication_slots()

    Description: Displays information about all replication slots on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 pg_get_replication_slots() fields

    Field

    +

    Type

    +

    Description

    +

    slot_name

    +

    text

    +

    Replication slot name

    +

    plugin

    +

    name

    +

    Name of the output plug-in of the logical replication slot

    +

    slot_type

    +

    text

    +

    Replication slot type

    +

    datoid

    +

    oid

    +

    Replication slot's database OID

    +

    active

    +

    boolean

    +

    Whether the replication slot is active

    +

    xmin

    +

    xid

    +

    Transaction ID of the replication slot

    +

    catalog_xmin

    +

    restart_lsn

    +

    dummy_standby

    +

    text

    +

    text

    +

    boolean

    +

    ID of the earliest-decoded transaction corresponding to the logical replication slot.

    +

    Xlog file information on the replication slot.

    +

    Indicates whether the replication slot is the secondary one.

    +
    +
    +
  • pg_drop_replication_slot('slot_name')

    Description: Deletes a streaming replication slot.

    +

    Parameter:

    +
    • slot_name

      Indicates the name of the streaming replication slot.

      +

      Value range: a string, supporting only letters, digits, and the following special characters: _?-.

      +
    +

    Return type: void

    +
  • pg_logical_slot_peek_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')

    Description: Performs decoding but does not go to the next streaming replication slot. (The decoding result will be returned again on future calls.)

    +

    Parameter:

    +
    • slot_name

      Indicates the name of the streaming replication slot.

      +

      Value range: a string, supporting only letters, digits, and the following special characters: _?-.

      +
    • LSN

      Indicates a target LSN. Decoding is performed only when an LSN is less than or equal to this value.

      +

      Value range: a string, in the format of xlogid/xrecoff, for example, '1/2AAFC60' (If this parameter is set to NULL, the target LSN indicating the end position of decoding is not specified.)

      +
    • upto_nchanges

      Indicates the number of decoded records (including the begin and commit timestamps). Assume that there are three transactions, which involve 3, 5, and 7 records, respectively. If upto_nchanges is 4, 8 records of the first two transactions will be decoded. Specifically, decoding is stopped when the number of decoded records exceeds 4 after decoding in the first two transactions is finished.

      +

      Value range: a non-negative integer

      +

      If any of the LSN and upto_nchanges values are reached, decoding ends.

      +
      +
    • options (optional)
      • include-xids

        Indicates whether the decoded data column contains XID information.

        +

        Valid value: 0 and 1. The default value is 1.

        +
        • 0: The decoded data column does not contain XID information.
        • 1: The decoded data column contains XID information.
        +
      • skip-empty-xacts

        Indicates whether to ignore empty transaction information during decoding.

        +

        Valid value: 0 and 1. The default value is 0.

        +
        • 0: The empty transaction information is not ignored during decoding.
        • 1: The empty transaction information is ignored during decoding.
        +
      • include-timestamp

        Indicates whether decoding information contains the commit timestamp.

        +

        Valid value: 0 and 1. The default value is 0.

        +
        • 0: The decoding information does not contain the commit timestamp.
        • 1: The decoding information contains the commit timestamp.
        +
      +
    +

    Return type: text, uint, text

    +

    Note: The function returns the decoding result. Each decoding result contains three columns, corresponding to the above return types and indicating the LSN position, XID, and decoded content, respectively.

    +
  • pg_logical_slot_get_changes('slot_name', 'LSN', upto_nchanges, 'options_name', 'options_value')

    Description: Performs decoding and goes to the next streaming replication slot.

    +

    Parameter: This function has the same parameters as pg_logical_slot_peek_changes. For details, see pg_logical_slot_peek_ch....

    +
  • pg_replication_slot_advance ('slot_name', 'LSN')

    Description: Directly goes to the streaming replication slot for a specified LSN, without outputting any decoding result.

    +

    Parameter:

    +
    • slot_name

      Indicates the name of the streaming replication slot.

      +

      Value range: a string, supporting only letters, digits, and the following special characters: _?-.

      +
    • LSN

      Indicates a target LSN. Next decoding will be performed only in transactions whose commission position is greater than this value. If an input LSN is smaller than the position recorded in the current streaming replication slot, the function directly returns. If the input LSN is greater than the LSN of the current physical log, the latter LSN will be directly used for decoding.

      +

      Value range: a string, in the format of xlogid/xrecoff

      +
    +

    Return type: name, text

    +

    Note: A return result contains the slot name and LSN that is actually used for decoding.

    +
  • pg_stat_get_data_senders()

    Description: Displays statistics about replication sending threads on all data page on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2 pg_stat_get_data_senders() fields

    Field

    +

    Type

    +

    Description

    +

    pid

    +

    bigint

    +

    Thread PID

    +

    sender_pid

    +

    integer

    +

    Current sender PID

    +

    local_role

    +

    text

    +

    Local role

    +

    peer_role

    +

    text

    +

    Peer role

    +

    state

    +

    text

    +

    Current sender's replication status

    +

    catchup_start

    +

    timestamp with time zone

    +

    Startup time of a catchup task

    +

    catchup_end

    +

    timestamp with time zone

    +

    End time of a catchup task

    +

    queue_size

    +

    text

    +

    Data queue size

    +

    queue_lower_tail

    +

    text

    +

    Position of data queue tail 1

    +

    queue_header

    +

    text

    +

    Position of data queue header

    +

    queue_upper_tail

    +

    text

    +

    Position of data queue tail 2

    +

    send_position

    +

    text

    +

    Sending position of the sender

    +

    receive_position

    +

    text

    +

    Receiving position of the receiver

    +

    catchup_type

    +

    text

    +

    Catchup task type, full or incremental

    +

    catchup_bcm_filename

    +

    text

    +

    BCM file executed by the current catchup task

    +

    catchup_bcm_finished

    +

    integer

    +

    Number of BCM files completed by a catchup task

    +

    catchup_bcm_total

    +

    integer

    +

    Total number of BCM files to be operated by a catchup task

    +

    catchup_percent

    +

    text

    +

    Completion percentage of a catchup task

    +

    catchup_remaining_time

    +

    text

    +

    Estimated remaining time of a catchup task

    +
    +
    +
  • pg_stat_get_wal_senders()

    Description: Displays statistics about replication sending threads on all WALs on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 3 pg_stat_get_wal_senders() fields

    Field

    +

    Type

    +

    Description

    +

    pid

    +

    bigint

    +

    Thread PID

    +

    sender_pid

    +

    integer

    +

    Current sender PID

    +

    local_role

    +

    text

    +

    Local role

    +

    peer_role

    +

    text

    +

    Peer role

    +

    peer_state

    +

    text

    +

    Peer status

    +

    state

    +

    text

    +

    Current sender's replication status

    +

    catchup_start

    +

    timestamp with time zone

    +

    Startup time of a catchup task

    +

    catchup_end

    +

    timestamp with time zone

    +

    End time of a catchup task

    +

    sender_sent_location

    +

    text

    +

    Location where the sender sends LSNs

    +

    sender_write_location

    +

    text

    +

    Location where the sender writes LSNs

    +

    sender_flush_location

    +

    text

    +

    Location where the sender flushes LSNs

    +

    sender_replay_location

    +

    text

    +

    Location where the sender replays LSNs

    +

    receiver_received_location

    +

    text

    +

    Location where the receiver receives LSNs

    +

    receiver_write_location

    +

    text

    +

    Location where the receiver writes LSNs

    +

    receiver_flush_location

    +

    text

    +

    Location where the receiver flushes LSNs

    +

    receiver_replay_location

    +

    text

    +

    Location where the receiver replays LSNs

    +

    sync_percent

    +

    text

    +

    Specifies the synchronization percentage.

    +

    sync_state

    +

    text

    +

    Synchronization state (asynchronous duplication, synchronous duplication, or potential synchronization)

    +

    sync_priority

    +

    integer

    +

    Priority of synchronous duplication (0 indicates asynchronization)

    +

    sync_most_available

    +

    text

    +

    Whether to block the active node when the synchronization on the standby node fails

    +

    channel

    +

    text

    +

    WALSender channel information

    +
    +
    +
  • pg_stat_get_wal_receiver()

    Description: Displays statistics about replication receiving threads on all WALs on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 4 pg_stat_get_wal_receiver()

    Field

    +

    Type

    +

    Description

    +

    receiver_pid

    +

    integer

    +

    Current receiver PID

    +

    local_role

    +

    text

    +

    Local role

    +

    peer_role

    +

    text

    +

    Peer role

    +

    peer_state

    +

    text

    +

    Peer status

    +

    state

    +

    text

    +

    Current receiver's replication status

    +

    sender_sent_location

    +

    text

    +

    Location where the sender sends LSNs

    +

    sender_write_location

    +

    text

    +

    Location where the sender writes LSNs

    +

    sender_flush_location

    +

    text

    +

    Location where the sender flushes LSNs

    +

    sender_replay_location

    +

    text

    +

    Location where the sender replays LSNs

    +

    receiver_received_location

    +

    text

    +

    Location where the receiver receives LSNs

    +

    receiver_write_location

    +

    text

    +

    Location where the receiver writes LSNs

    +

    receiver_flush_location

    +

    text

    +

    Location where the receiver flushes LSNs

    +

    receiver_replay_location

    +

    text

    +

    Location where the receiver replays LSNs

    +

    sync_percent

    +

    text

    +

    Specifies the synchronization percentage.

    +

    channel

    +

    text

    +

    WALReceiver channel information

    +
    +
    +
  • pg_stat_get_stream_replications()

    Description: Displays information about all replication statistics on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Table 5 pg_stat_get_stream_replications()

    Field

    +

    Type

    +

    Description

    +

    local_role

    +

    text

    +

    Local role

    +

    static_connections

    +

    integer

    +

    Connection statistics

    +

    db_state

    +

    text

    +

    Database status

    +

    detail_information

    +

    text

    +

    Detail information

    +
    +
    +
  • pg_stat_xlog_space()

    Description: Displays the Xlog space usage on the current DN.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + +
    Table 6 pg_stat_xlog_space()

    Column

    +

    Type

    +

    Description

    +

    xlog_files

    +

    bigint

    +

    Number of all identified xlog files in the pg_xlog directory, excluding the backup and archive_status subdirectories.

    +

    xlog_size

    +

    bigint

    +

    Total size (MB) of all identified xlog files in the pg_xlog directory, excluding the backup and archive_status subdirectories.

    +

    other_size

    +

    bigint

    +

    Total size (MB) of files in the backup and archive_status subdirectories of the pg_xlog directory.

    +
    +
    +
  • pgxc_stat_xlog_space()

    Description: Displays the Xlog space usage on all active DNs.

    +

    Return type: record

    +

    The following information is returned:

    + +
    + + + + + + + + + + + + + + + + + + + + + +
    Table 7 pgxc_stat_xlog_space()

    Column

    +

    Type

    +

    Description

    +

    node_name

    +

    name

    +

    Node name

    +

    xlog_files

    +

    bigint

    +

    Number of all identified xlog files in the pg_xlog directory, excluding the backup and archive_status subdirectories.

    +

    xlog_size

    +

    bigint

    +

    Total size (MB) of all identified xlog files in the pg_xlog directory, excluding the backup and archive_status subdirectories.

    +

    other_size

    +

    bigint

    +

    Total size (MB) of files in the backup and archive_status subdirectories of the pg_xlog directory.

    +
    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0062.html b/docs/dws/dev/dws_06_0062.html new file mode 100644 index 00000000..963bc86e --- /dev/null +++ b/docs/dws/dev/dws_06_0062.html @@ -0,0 +1,294 @@ + + +

Other Functions

+
  • pgxc_pool_check()

    Description: Checks whether the connection data buffered in the pool is consistent with pgxc_node.

    +

    Return type: boolean

    +
  • pgxc_pool_reload()

    Description: Updates the connection information buffered in the pool.

    +

    Return type: boolean

    +
  • pgxc_lock_for_backup()

    Description: Locks the cluster before backup. Backup is performed to restore data on new nodes.

    +

    Return type: boolean

    +

    pgxc_lock_for_backup locks a cluster before gs_dump or gs_dumpall is used to back up the cluster. After a cluster is locked, operations changing the system structure are not allowed. This function does not affect DML statements.

    +
    +
  • pg_pool_validate(clear boolean, co_node_name cstring)

    Description: Clears invalid backend threads on a CN. (These backend threads hold invalid pooler connections to standby DNs.)

    +

    Return type: record

    +
  • pg_nodes_memory()

    Description: queries the memory usage of all nodes.

    +

    Return type: record

    +
  • table_skewness(text)

    Description: queries the percentage of table data among all nodes.

    +

    Parameter: Indicates that the type of the name of the to-be-queried table is text.

    +

    Return type: record

    +
  • table_skewness(table_name text, column_name text[, row_num text])

    Description: Queries the proportion of column data distributed on each node based on the hash distribution rule. The results are sorted based on the data volumes of the nodes.

    +

    Parameters: table_name indicates a table name, column_name indicates a column name, and row_num indicates that all data in the current column is returned. The default value is 0. A value other than 0 indicates the number of data records whose statistics are sampled. (Records are randomly sampled.)

    +

    Return type: record

    +

    Example:

    +

    Distribute data by hash based on the a column in the tx table. Seven records are distributed on DN 1, two records on DN 2, and one record on DN 0.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    select table_skewness('tx','a');
    + table_skewness 
    +----------------
    + (1,7,70.000%)
    + (2,2,20.000%)
    + (0,1,10.000%)
    +(3 rows)
    +
    + +
    +
  • table_data_skewness(data_row record, locatorType "char")

    Description: Calculates the bucket distribution index for the records concatenated using the columns in a specified table.

    +

    Parameters: data_row indicates the record concatenated using columns in the specified table. locatorType indicates the distribution rule. You are advised to set locatorType to H, indicating hash distribution.

    +

    Return type: smallint

    +

    Example:

    +

    Calculates the bucket distribution index based on the hash distribution rule for the records combined concatenated using the columns in the tx table.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    select a, table_data_skewness(row(a), 'H') from tx;
    + a | table_data_skewness 
    +---+---------------------
    + 3 |                   0
    + 6 |                   2
    + 7 |                   2
    + 4 |                   1
    + 5 |                   1
    +(5 rows)
    +
    + +
    +
  • table_distribution(schemaname text, tablename text)

    Description: queries the storage space occupied by a specified table on each node.

    +

    Parameter: Indicates that the types of the schema name and table name for the table to be queried are both text.

    +

    Return type: record

    +
    • To query for the storage distribution of a specified table by using this function, you must have the SELECT permission for the table.
    • The performance of table_distribution is better than that of table_skewness. Especially in a large cluster with a large amount of data, table_distribution is recommended.
    • When you use table_distribution and want to view the space usage, you can use dnsize or (sum(dnsize) over ()) to view the percentage.
    +
    +
  • table_distribution(regclass)

    Description: queries the storage space occupied by a specified table on each node.

    +

    Parameter: indicates the name or OID of the table to be queried. The table name can be defined by the schema name. Parameter type: regclass

    +

    Return type: record

    +
    • To query for the storage distribution of a specified table by using this function, you must have the SELECT permission for the table.
    • The performance of table_distribution is better than that of table_skewness. Especially in a large cluster with a large amount of data, table_distribution is recommended.
    • When you use table_distribution and want to view the space usage, you can use dnsize or (sum(dnsize) over ()) to view the percentage.
    +
    +
  • table_distribution()

    Description: queries the storage distribution of all tables in the current database.

    +

    Return type: record

    +
    • This function involves the query for information about all tables in the database. To execute this function, you must have the administrator rights.
    • Based on the table_distribution() function, GaussDB(DWS) provides the PGXC_GET_TABLE_SKEWNESS view as an alternative way to query for data skew. You are advised to use this view when the number of tables in the database is less than 10000.
    +
    +
  • pgxc_get_stat_dirty_tables(int dirty_percent, int n_tuples)

    Description: Obtains information about insertion, update, and deletion operations on tables and the dirty page rate of tables. This function optimizes the performance of the PGXC_GET_STAT_ALL_TABLES view. It can quickly filter out tables whose dirty page rate is greater than dirty_percent and number of dead tuples is greater than n_tuples.

    +

    Return type: SETOF record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Name

    +

    Type

    +

    Description

    +

    relid

    +

    oid

    +

    Table OID

    +

    relname

    +

    name

    +

    Table name

    +

    schemaname

    +

    name

    +

    Schema name of the table

    +

    n_tup_ins

    +

    bigint

    +

    Number of inserted tuples

    +

    n_tup_upd

    +

    bigint

    +

    Number of updated tuples

    +

    n_tup_del

    +

    bigint

    +

    Number of deleted tuples

    +

    n_live_tup

    +

    bigint

    +

    Number of live tuples

    +

    n_dead_tup

    +

    bigint

    +

    Number of dead tuples

    +

    dirty_page_rate

    +

    numeric(5,2)

    +

    Dirty page rate (%) of a table

    +
    +
    +
  • pgxc_get_stat_dirty_tables(int dirty_percent, int n_tuples, text schema)

    Description: Obtains information about insertion, update, and deletion operations on tables and the dirty page rate of tables. This function can quickly filter out tables whose dirty page rate is greater than page_dirty_rate, number of dead tuples is greater than n_tuples, and schema name is schema.

    +

    Return type: SETOF record

    +

    The return columns of the function are the same as those of the pgxc_get_stat_dirty_tables(int dirty_percent, int n_tuples) function.

    +
  • plan_seed()

    Description: Obtains the seed value of the previous query statement (internal use).

    +

    Return type: int

    +
  • pg_stat_get_env()

    Description: Obtains the environment variable information about the current node.

    +

    Return type: record

    +
  • pg_stat_get_thread()

    Description: Provides information about the status of all threads under the current node.

    +

    Return type: record

    +
  • pgxc_get_os_threads()

    Description: Provides information about the status of threads under all normal nodes in a cluster.

    +

    Return type: record

    +
  • pg_stat_get_sql_count()

    Description: Provides statistics on the number of SELECT/UPDATE/INSERT/DELETE/MERGE INTO statements executed by all users on the current node, response time, and the number of DDL, DML, and DCL statements.

    +

    Return type: record

    +
  • pgxc_get_sql_count()

    Description: Provides statistics on the number of SELECT/UPDATE/INSERT/DELETE/MERGE INTO statements executed by all users on all nodes of the current cluster, response time, and the number of DDL, DML, and DCL statements.

    +

    Return type: record

    +
  • pgxc_get_workload_sql_count()

    Description: Provides statistics on the number of SELECT/UPDATE/INSERT/DELETE statements executed in all workload Cgroup on all CNs of the current cluster and the number of DDL, DML, and DCL statements.

    +

    Return type: record

    +
  • pgxc_get_workload_sql_elapse_time()

    Description: Provides statistics on response time of SELECT/UPDATE/INSERT/DELETE statements executed in all workload Cgroup on all CNs of the current cluster.

    +

    Return type: record

    +
  • get_instr_unique_sql()

    Description: Provides information about Unique SQL statistics collected on the current node. If the node is a CN, the system returns the complete information about the Unique SQL statistics collected on the CN. That is, the system collects and summarizes the information about the Unique SQL statistics on other CNs and DNs. If the node is a DN, the Unique SQL statistics on the DN is returned. For details, see GS_INSTR_UNIQUE_SQL.

    +

    Return type: record

    +
  • reset_instr_unique_sql(cstring, cstring, INT8)

    Description: Clears collected Unique SQL statistics. The input parameters are described as follows:

    +
    • GLOBAL/LOCAL: Data is cleared from all nodes or the current node.
    • ALL/BY_USERID/BY_CNID/BY_GUC: ALL indicates that all data is cleared. BY_USERID/BY_CNID indicates that data is cleared by USERID or CNID. BY_GUC indicates that the clearance operation is caused by the decrease of the value of the GUC parameter instr_unique_sql_count.
    • The third parameter corresponds to the second parameter. The parameter is invalid for ALL/BY_GUC.
    +

    Return type: bool

    +
  • pgxc_get_instr_unique_sql()

    Description: Provides complete information about Unique SQL statistics collected on all CNs in a cluster. This function can be executed only on CNs.

    +

    Return type: record

    +
  • get_instr_unique_sql_remote_cns()

    Description: Provides complete information about Unique SQL statements collected on all CNs in the cluster, except the CN on which the function is being executed. This function can be executed only on CNs.

    +

    Return type: record

    +
  • pgxc_get_node_env()

    Description: Provides the environment variable information about all nodes in a cluster.

    +

    Return type: record

    +
  • gs_switch_relfilenode()

    Description: Exchanges meta information of two tables or partitions. (This is only used for the redistribution tool. An error message is displayed when the function is directly used by users).

    +

    Return type: int

    +
  • copy_error_log_create()

    Description: Creates the error table (public.pgxc_copy_error_log) required for creating the COPY FROM error tolerance mechanism.

    +

    Return type: boolean

    +
    • This function attempts to create the public.pgxc_copy_error_log table. For details about the table, see Table 1.
    • Create the B-tree index on the relname column and execute REVOKE ALL on public.pgxc_copy_error_log FROM public to manage permissions for the error table (the permissions are the same as those of the COPY statement).
    • public.pgxc_copy_error_log is a row-store table. Therefore, this function can be executed and COPY FROM error tolerance is available only when row-store tables can be created in the cluster. After the GUC parameter enable_hadoop_env is enabled, row-based tables cannot be created in the cluster. The default value is off.
    • Same as the error table and the COPY statement, the function requires sysadmin or higher permissions.
    • If the public.pgxc_copy_error_log table or the copy_error_log_relname_idx index already exists before the function creates it, the function will report an error and roll back.
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Error table public.pgxc_copy_error_log

    Column

    +

    Type

    +

    Description

    +

    relname

    +

    varchar

    +

    Table name in the form of Schema name.Table name

    +

    begintime

    +

    timestamp with time zone

    +

    Time when a data format error was reported

    +

    filename

    +

    character varying

    +

    Name of the source data file where a data format error occurs

    +

    rownum

    +

    bigint

    +

    Number of the row where a data format error occurs in a source data file

    +

    rawrecord

    +

    text

    +

    Raw record of a data format error in the source data file To prevent a field from being too long, the length of the field cannot exceed 1024 bytes.

    +

    detail

    +

    text

    +

    Error details

    +
    +
    +
  • pv_compute_pool_workload()

    Description: Provides the current load information about computing Node Groups on cloud.

    +

    Return type: record

    +
  • pg_stat_get_status(tid, num_node_display)

    Description: Queries for the blocking and waiting status of the backend threads and auxiliary threads in the current instance. For details about the returned results, see the PG_THREAD_WAIT_STATUS view. The input parameters are described as follows:

    +
    • tid: thread ID, which is of the bigint type. If this parameter is null, the waiting statuses of all backend threads and auxiliary threads are returned. Otherwise, only the waiting statuses of threads with the specified IDs are returned.
    • num_node_display: integer type. Specifies the maximum number of waiting nodes displayed in the wait_status column for records whose waiting status is wait node.
      • If this parameter is left empty or set to a value less than or equal to 0, only one waiting node is displayed.
      • If the value is greater than 20, a maximum number of nodes can be displayed is 20.
      • If the value is greater than 0 and less than or equal to 20, the smaller value between num_node_display and the actual number of waiting nodes is displayed. Use the SELECT * from pg_stat_get_status(NULL, 10) query for example. If the number of waiting nodes is greater than 10, the names of only 10 nodes are displayed randomly. If the number of waiting nodes is less than or equal to 10, the names of all waiting nodes are displayed. If the number of waiting nodes is greater than the number of displayed nodes, the displayed node names are randomly selected.
      +
    +

    Return type: record

    +
  • pgxc_get_thread_wait_status(num_node_display)

    Description: Queries for the call hierarchy between threads generated by all SQL statements on each node in a cluster, as well as the block waiting status of each thread. For details about the returned results, see the PGXC_THREAD_WAIT_STATUS view. The type and meaning of the input parameter num_node_display are the same as those of the pg_stat_get_status function.

    +

    Return type: record

    +
  • pgxc_os_run_info()

    Description: Obtains the running status of the operating system on each node in a cluster. For details about the returned results, see "System Catalogs > System Views >PV_OS_RUN_INFO" in the Developer Guide.

    +

    Return type: record

    +
  • get_instr_wait_event()

    Description: Obtains the waiting status and events of the current instance. For details about the returned results, see "System Catalogs > System Views > GS_WAIT_EVENTS" in the Developer Guide. If the GUC parameter enable_track_wait_event is off, this function returns 0.

    +

    Return type: record

    +
  • pgxc_wait_events()

    Description: queries statistics about waiting status and events on each node in a cluster. For details about the returned results, see "System Catalogs > System Views > PGXC_WAIT_EVENTS" in the Developer Guide. If the GUC parameter enable_track_wait_event is off, this function returns 0.

    +

    Return type: record

    +
  • pgxc_stat_bgwriter()

    Description: queries statistics about backend write processes on each node in a cluster. For details about the returned results, see "System Catalogs > System Views > PG_STAT_BGWRITER" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_stat_replication()

    Description: queries information about the log synchronization status on each node in a cluster, such as the location where the logs are sent and received. For details about the returned results, see "System Catalogs > System Views > PG_STAT_REPLICATION" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_replication_slots()

    Description: queries the replication status on each DN in a cluster. For details about the returned results, see "System Catalogs > System Views > PG_REPLICATION_SLOTS" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_settings()

    Description: queries information about runtime parameters on each node in a cluster. For details about the returned results, see "System Catalogs > System Views > PG_SETTINGS" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_instance_time()

    Description: queries the running time statistics of each node in a cluster and the time consumed in each execution phase. For details about the returned results, see "System Catalogs > System Views > PV_INSTANCE_TIME" in the Developer Guide.

    +

    Return type: record

    +
  • pg_stat_get_redo_stat()

    Description: queries Xlog redo statistics on the current node. For details about the returned results, see "System Catalogs > System Views > PV_REDO_STAT" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_redo_stat()

    Description: queries the Xlog redo statistics of each node in a cluster. For details about the returned results, see "System Catalogs > System Views > PV_REDO_STAT" in the Developer Guide.

    +

    Return type: record

    +
  • get_local_rel_iostat()

    Description: Obtains the disk I/O statistics of the current instance. For details about the returned results, see "System Catalogs > System Views > GS_REL_IOSTAT" in the Developer Guide.

    +

    Return type: record

    +
  • pgxc_rel_iostat()

    Description: queries the disk I/O statistics on each node in a cluster. For details about the returned result, see "System Catalogs > System Views > GS_REL_IOSTAT" in the Developer Guide.

    +

    Return type: record

    +
  • get_node_stat_reset_time()

    Description: Obtains the time when statistics of the current instance were reset.

    +

    Return type: timestamptz

    +
  • pgxc_node_stat_reset_time()

    Description: queries the time when the statistics of each node in a cluster are reset. For details about the returned result, see "System Catalogs > System Views > GS_NODE_STAT_RESET_TIME" in the Developer Guide.

    +

    Return type: record

    +
    When an instance is running, its statistics keep rising. In the following cases, the statistical values in the memory will be reset to 0:
    • The instance is restarted or a cluster switchover occurs.
    • The database is deleted.
    • A reset operation is performed. For example, the statistics counter in the database is reset using the pgstat_recv_resetcounter function or the Unique SQL statements are cleared using the reset_instr_unique_sql function.
    +
    +

    If any of the preceding events occurs, GaussDB(DWS) will record the time when the statistics are reset. You can query the time using the get_node_stat_reset_time function.

    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0063.html b/docs/dws/dev/dws_06_0063.html new file mode 100644 index 00000000..470b3498 --- /dev/null +++ b/docs/dws/dev/dws_06_0063.html @@ -0,0 +1,821 @@ + + +

Resource Management Functions

+

This section describes the functions of the resource management module.

+
  • gs_wlm_readjust_user_space(oid)

    Description: This function calibrates the permanent storage space of a user. The input parameter is the user OID. If the input parameter is set to 0, the permanent storage space of all users is calibrated.

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select gs_wlm_readjust_user_space(0);
    +gs_wlm_readjust_user_space
    +----------------------------
    +Exec Success
    +(1 row)
    +
    + +
    +
+
  • pgxc_wlm_readjust_schema_space()

    Description: This function calibrates the permanent storage space of a schema.

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select pgxc_wlm_readjust_schema_space();
    +pgxc_wlm_readjust_schema_space
    +--------------------------------
    +Exec Success
    +(1 row)
    +
    + +
    +
+
  • pgxc_wlm_get_schema_space(cstring)

    Description: Obtains the schema space of each instance in a specified logical cluster on the CN.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    schemaname

    +

    text

    +

    Schema name

    +

    schemaid

    +

    oid

    +

    Schema OID

    +

    databasename

    +

    text

    +

    Database name

    +

    databaseid

    +

    oid

    +

    Database OID

    +

    nodename

    +

    text

    +

    Instance name

    +

    nodegroup

    +

    text

    +

    Name of the node group

    +

    usedspace

    +

    bigint

    +

    Size of the used space

    +

    permspace

    +

    bigint

    +

    Upper limit of the space

    +
    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    select * from pgxc_wlm_get_schema_space('group1');
    +     schemaname     | schemaid | databasename | databaseid |   nodename   |  nodegroup   | usedspace | permspace
    +--------------------+----------+--------------+------------+--------------+--------------+-----------+-----------
    + pg_catalog         |       11 | test1        |      16384 | datanode1    | installation |   9469952 |        -1
    + public             |     2200 | gaussdb     |      15253 | datanode1    | installation |  25280512 |        -1
    + pg_toast           |       99 | test1        |      16384 | datanode1    | installation |   1859584 |        -1
    + cstore             |      100 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + data_redis         |    18106 | gaussdb     |      15253 | datanode1    | installation |    655360 |        -1
    + data_redis         |    18116 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + public             |     2200 | test1        |      16384 | datanode1    | installation |     16384 |        -1
    + dbms_om            |     3987 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_job           |     3988 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_om            |     3987 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + dbms_job           |     3988 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + sys                |    11693 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + sys                |    11693 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + utl_file           |    14644 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + utl_raw            |    14669 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_sql           |    14674 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_output        |    14662 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_random        |    14666 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + dbms_lob           |    14701 | gaussdb     |      15253 | datanode1    | installation |         0 |        -1
    + information_schema |    14300 | gaussdb     |      15253 | datanode1    | installation |    294912 |        -1
    + information_schema |    14300 | test1        |      16384 | datanode1    | installation |    294912 |        -1
    + utl_file           |    14644 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + dbms_output        |    14662 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + dbms_random        |    14666 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + utl_raw            |    14669 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + dbms_sql           |    14674 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + dbms_lob           |    14701 | test1        |      16384 | datanode1    | installation |         0 |        -1
    + pg_catalog         |       11 | gaussdb     |      15253 | datanode1    | installation |  13049856 |        -1
    + redisuser          |    16387 | gaussdb     |      15253 | datanode1    | installation |    630784 |        -1
    + pg_toast           |       99 | gaussdb     |      15253 | datanode1    | installation |   3080192 |        -1
    + cstore             |      100 | gaussdb     |      15253 | datanode1    | installation |   2408448 |        -1
    + pg_catalog         |       11 | test1        |      16384 | datanode2    | installation |   9469952 |        -1
    + public             |     2200 | gaussdb     |      15253 | datanode2    | installation |  25214976 |        -1
    + pg_toast           |       99 | test1        |      16384 | datanode2    | installation |   1859584 |        -1
    + cstore             |      100 | test1        |      16384 | datanode2    | installation |         0 |        -1
    + data_redis         |    18106 | gaussdb     |      15253 | datanode2    | installation |    655360 |        -1
    + data_redis         |    18116 | test1        |      16384 | datanode2    | installation |         0 |        -1
    + public             |     2200 | test1        |      16384 | datanode2    | installation |     16384 |        -1
    + dbms_om            |     3987 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
    + dbms_job           |     3988 | gaussdb     |      15253 | datanode2    | installation |         0 |        -1
    + dbms_om            |     3987 | test1        |      16384 | datanode2    | installation |         0 |        -1
    + dbms_job           |     3988 | test1        |      16384 | datanode2    | installation |         0 |        -1
    +
    + +
    +
  • pgxc_wlm_analyze_schema_space(cstring)

    Description: Obtains the schema space of a specified logical cluster on the CN.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    schemaname

    +

    text

    +

    Schema name

    +

    databasename

    +

    text

    +

    Database name

    +

    nodegroup

    +

    text

    +

    Name of the node group

    +

    total_value

    +

    bigint

    +

    Total cluster space in the current schema

    +

    avg_value

    +

    bigint

    +

    Average space of instances in the current schema

    +

    skew_percent

    +

    integer

    +

    Skew ratio

    +

    extend_info

    +

    text

    +

    Extended information, including the maximum space of a single instance, minimum space of a single instance, and name of the instance with the maximum or minimum space

    +
    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    select * from pgxc_wlm_analyze_schema_space('group1');
    +     schemaname     | databasename |  nodegroup   | total_value | avg_value | skew_percent |                  extend_info
    +--------------------+--------------+--------------+-------------+-----------+--------------+-----------------------------------------------
    + pg_catalog         | test1        | installation |    56819712 |   9469952 |            0 | min:9469952 datanode1,max:9469952 datanode1
    + public             | gaussdb     | installation |   150495232 |  25082538 |            0 | min:24903680 datanode6,max:25280512 datanode1
    + pg_toast           | test1        | installation |    11157504 |   1859584 |            0 | min:1859584 datanode1,max:1859584 datanode1
    + cstore             | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + data_redis         | gaussdb     | installation |     1966080 |    327680 |           50 | min:0 datanode4,max:655360 datanode1
    + data_redis         | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + public             | test1        | installation |       98304 |     16384 |            0 | min:16384 datanode1,max:16384 datanode1
    + dbms_om            | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_job           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_om            | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_job           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + sys                | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + sys                | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + utl_file           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + utl_raw            | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_sql           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_output        | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_random        | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_lob           | gaussdb     | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + information_schema | gaussdb     | installation |     1769472 |    294912 |            0 | min:294912 datanode1,max:294912 datanode1
    + information_schema | test1        | installation |     1769472 |    294912 |            0 | min:294912 datanode1,max:294912 datanode1
    + utl_file           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_output        | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_random        | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + utl_raw            | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_sql           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + dbms_lob           | test1        | installation |           0 |         0 |            0 | min:0 datanode1,max:0 datanode1
    + pg_catalog         | gaussdb     | installation |    75431936 |  12571989 |            3 | min:12124160 datanode4,max:13049856 datanode1
    + redisuser          | gaussdb     | installation |     1884160 |    314026 |           50 | min:16384 datanode4,max:630784 datanode1
    + pg_toast           | gaussdb     | installation |    17154048 |   2859008 |            7 | min:2637824 datanode4,max:3080192 datanode1
    + cstore             | gaussdb     | installation |    15294464 |   2549077 |            5 | min:2408448 datanode1,max:2703360 datanode6
    +(31 rows)
    +
    + +
    +
  • gs_wlm_set_queryband_action(cstring,cstring,int4)

    Description: Sets the action and query order of query_band.

    +

    Return type: boolean

    +

    The following table describes the input parameters.

    + +
    + + + + + + + + + + + + + + + + + +

    Name

    +

    Type

    +

    Description

    +

    qband

    +

    cstring

    +

    Query band key-value pair. The maximum length is 63 characters.

    +

    action

    +

    cstring

    +

    Action associated to a query band

    +

    order

    +

    int4

    +

    Query band query order. The default value is -1.

    +
    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    select * from gs_wlm_set_queryband_action('a=1','respool=p1');
    + gs_wlm_set_queryband_action
    +-----------------------------
    + t
    +(1 row)
    +select * from gs_wlm_set_queryband_action('a=3','respool=p1;priority=rush',1);
    + gs_wlm_set_queryband_action
    +-----------------------------
    + t
    +(1 row)
    +
    + +
    +
  • gs_wlm_set_queryband_order(cstring,int4)

    Description: Sets the query_band query order.

    +

    Return type: boolean

    +

    The following table describes the input parameters.

    + +
    + + + + + + + + + + + + + +

    Name

    +

    Type

    +

    Description

    +

    qband

    +

    cstring

    +

    query_band key-value pairs

    +

    order

    +

    int4

    +

    query_band query order. The default value is -1.

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from gs_wlm_set_queryband_order('a=1',2);
    + gs_wlm_set_queryband_action
    +-----------------------------
    + t
    +(1 row)
    +
    + +
    +
  • gs_wlm_get_queryband_action(cstring)

    Description: Obtains the action and query order of query_band.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    qband

    +

    cstring

    +

    query_band key-value pairs

    +

    respool_id

    +

    Oid

    +

    OID of the resource pool associated with query_band

    +

    respool

    +

    text

    +

    Name of the resource pool associated with query_band

    +

    priority

    +

    text

    +

    Intra-queue priority associated with query_band

    +

    qborder

    +

    int4

    +

    query_band query order

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select * from gs_wlm_get_queryband_action('a=1');
    +qband | respool_id | respool | priority | qborder
    +-------+------------+---------+----------+---------
    + a=1   |      16388 | p1      | Medium   |      -1
    +(1 row)
    +
    + +
    +
  • gs_cgroup_reload_conf()

    Description: This function loads the Cgroup configuration file online on the current instance.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    node_name

    +

    text

    +

    Instance name

    +

    node_host

    +

    text

    +

    IP address of the node where the instance is located

    +

    result

    +

    text

    +

    Whether Cgroup online loading is successful

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    select * from gs_cgroup_reload_conf();
    + node_name |   node_host    | result
    +-----------+----------------+---------
    + cn_5001   | 192.168.178.35 | success
    +
    + +
    +
+
  • pgxc_cgroup_reload_conf()

    Description: This function loads the Cgroup configuration file online on all instances of the system.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    node_name

    +

    text

    +

    Instance name

    +

    node_host

    +

    text

    +

    IP address of the node where the instance is located

    +

    result

    +

    text

    +

    Whether Cgroup online loading is successful

    +
    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    select * from pgxc_cgroup_reload_conf();
    +  node_name   |    node_host    | result
    +--------------+-----------------+---------
    + dn_6025_6026 | 192.168.178.177 | success
    + dn_6049_6050 | 192.168.179.79  | success
    + dn_6051_6052 | 192.168.179.79  | success
    + dn_6055_6056 | 192.168.179.79  | success
    + dn_6067_6068 | 192.168.181.57  | success
    + dn_6023_6024 | 192.168.178.39  | success
    + dn_6009_6010 | 192.168.181.21  | success
    + dn_6011_6012 | 192.168.181.21  | success
    + dn_6015_6016 | 192.168.181.21  | success
    + dn_6029_6030 | 192.168.178.177 | success
    + dn_6031_6032 | 192.168.178.177 | success
    + dn_6045_6046 | 192.168.179.45  | success
    + cn_5001      | 192.168.178.35  | success
    + cn_5003      | 192.168.178.39  | success
    + dn_6061_6062 | 192.168.181.179 | success
    + cn_5006      | 192.168.179.45  | success
    + cn_5004      | 192.168.178.177 | success
    + cn_5002      | 192.168.181.21  | success
    + cn_5005      | 192.168.178.187 | success
    + dn_6019_6020 | 192.168.178.39  | success
    + dn_6007_6008 | 192.168.178.35  | success
    + dn_6071_6072 | 192.168.181.57  | success
    + dn_6003_6004 | 192.168.178.35  | success
    + dn_6013_6014 | 192.168.181.21  | success
    + dn_6035_6036 | 192.168.178.187 | success
    + dn_6037_6038 | 192.168.178.187 | success
    + dn_6001_6002 | 192.168.178.35  | success
    + dn_6063_6064 | 192.168.181.179 | success
    + dn_6005_6006 | 192.168.178.35  | success
    + dn_6057_6058 | 192.168.181.179 | success
    + dn_6069_6070 | 192.168.181.57  | success
    + dn_6027_6028 | 192.168.178.177 | success
    + dn_6059_6060 | 192.168.181.179 | success
    + dn_6041_6042 | 192.168.179.45  | success
    + dn_6043_6044 | 192.168.179.45  | success
    + dn_6047_6048 | 192.168.179.45  | success
    + dn_6033_6034 | 192.168.178.187 | success
    + dn_6065_6066 | 192.168.181.57  | success
    + dn_6021_6022 | 192.168.178.39  | success
    + dn_6017_6018 | 192.168.178.39  | success
    + dn_6039_6040 | 192.168.178.187 | success
    + dn_6053_6054 | 192.168.179.79  | success
    +(42 rows)
    +
    + +
    +
+
  • pgxc_cgroup_reload_conf(text)

    Description: This function loads the Cgroup configuration file online on a node. The input parameter is the IP address of the node.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    node_name

    +

    text

    +

    Instance name

    +

    node_host

    +

    text

    +

    IP address of the node where the instance is located

    +

    result

    +

    text

    +

    Whether Cgroup online loading is successful

    +
    +
    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    select * from pgxc_cgroup_reload_conf('192.168.178.35');
    +  node_name   |   node_host    | result
    +--------------+----------------+---------
    + cn_5001      | 192.168.178.35 | success
    + dn_6007_6008 | 192.168.178.35 | success
    + dn_6003_6004 | 192.168.178.35 | success
    + dn_6001_6002 | 192.168.178.35 | success
    + dn_6005_6006 | 192.168.178.35 | success
    +(5 rows)
    +
    + +
    +
  • pg_wlm_jump_queue(pid int)

    Description: Moves a task to the top of the CN queue.

    +

    Return type: Boolean

    +

    Note: Each of these functions returns true if they are successful and false otherwise.

    +
  • gs_wlm_switch_cgroup(pid int, cgroup text)

    Description: Moves a job to other Cgroup to improve the job priority.

    +

    Return type: Boolean

    +

    Note: Each of these functions returns true if they are successful and false otherwise.

    +
  • gs_wlm_node_recover(boolean isForce)

    Description: Updates and restores job information and counts on the CCN in dynamic resource management mode. This function can be executed only by administrators, and is usually used to restore a faulty CN after it was restarted. This function is called by the Cluster Manager (CM). Its usages are as follows:

    +
    • If this function is executed by CN, it instructs the CCN to clear job information and counts on the CN.
    • If this function is executed by CCN, it resets job counts and obtains the latest slow lane job information from the CN.
    +

    Return type: bool

    +
  • gs_wlm_node_clean(cstring nodename)

    Description: On the CCN in dynamic resource management mode, clears the job information and counts of a specified CN. This function can be executed only by administrators, and is usually used to restore a faulty CN after it was restarted. This function is called by the Cluster Manager (CM). Generally, users are not advised to call it.

    +

    Return type: bool

    +
  • pg_stat_get_wlm_node_resource_info(int4)

    Description: Displays the summary of all DN resources.

    +

    Return type: record

    +

    The following table describes return columns.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Column

    +

    Type

    +

    Description

    +

    min_mem_util

    +

    integer

    +

    Minimum memory usage of a DN

    +

    max_mem_util

    +

    integer

    +

    Maximum memory usage of a DN

    +

    min_cpu_util

    +

    integer

    +

    Minimum CPU usage of a DN

    +

    max_cpu_util

    +

    integer

    +

    Maximum CPU usage of a DN

    +

    min_io_util

    +

    integer

    +

    Minimum I/O usage of a DN

    +

    max_io_util

    +

    integer

    +

    Maximum I/O usage of a DN

    +

    phy_usemem_rate

    +

    integer

    +

    Maximum physical memory usage

    +
    +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0064.html b/docs/dws/dev/dws_06_0064.html new file mode 100644 index 00000000..74fe2eef --- /dev/null +++ b/docs/dws/dev/dws_06_0064.html @@ -0,0 +1,38 @@ + + +

Data Redaction Functions

+

Data redaction functions are used to mask and protect sensitive data. Generally, you are advised to bind these functions to the columns to be redacted based on the data redaction syntax, rather than use them directly on query statements.

+
  • mask_none(column_name)

    Description: Masks no data (for internal tests only).

    +

    Return type: same as column_name

    +
  • mask_full(column_name)

    Description: Replaces all data with a fixed value. The fixed value varies depending on the data type of the redacted column.

    +

    Return type: same as column_name

    +
  • mask_partial(column_name, mask_digital, mask_from[, mask_to])

    Description: Replaces the digits from the mask_from to mask_to position in a number with the digit specified by mask_digital. The default value of mask_to can be used, which indicates that the digits from the mask_from position to the end of the number are replaced. mask_digital can only be a digit from 0 to 9.

    +

    Return type: same as column_name

    +
  • mask_partial(column_name [, input_format, output_format], mask_char, mask_from[, mask_to])

    Description: Replaces the digits from the mask_from to mask_to position in a string with the character specified by mask_char based on the given input and output formats.

    +

    Parameter description:

    +
    • input_format

      The input format is a character string of V and F, whose length is the same as that of the data in the redacted column. Characters in positions corresponding to V may be masked, and characters in positions corresponding to F are skipped. The V character string specifies which characters are to be masked. The input and output formats apply to data with a fixed length, such as bank card numbers, ID card numbers, and phone numbers.

      +
    • output_format

      The output format is a character string of V and any other character, whose length is the same as that of the data in the redacted column. V characters correspond to those in the input_format, and other characters correspond to the F characters in the input_format.

      +

      For parameters input_format and output_format, you can use their default values or set them to "". In this case, there is no requirement for the input or output format, and the whole string will be masked.

      +
    • mask_char

      Masking character, which can be any one character, for example, an asterisk (*) or a number sign (#).

      +
    • mask_from

      First character in the string that will be masked. The value must be greater than 0.

      +
    • mask_to

      Last character in the string that will be masked. The default value can be used, which indicates that the character from the mask_from position to the last character of the string will be masked.

      +
    +

    Return type: same as column_name

    +
  • mask_partial(column_name, mask_field1, mask_value1, mask_field2, mask_value2, mask_field3, mask_value3)

    Description: Masks a date or time based on three specified fields. If mask_value is -1, the corresponding mask_field is not masked. mask_field can be month, day, year, hour, minute, or second. The value range of each field must be within that of the actual time unit.

    +

    Return type: same as column_name

    +
+

Redaction functions are recommended if you want to create redaction policies.

+

For details about how to use data redaction functions, see the examples in "Database Security Management > Managing Users and Their Permissions > Data Redaction" in the Developer Guide.

+
+

User-Defined Redaction Functions

You can use the PL/pgSQL language to customize redaction functions.

+
User-defined redaction functions must meet the following requirements:
  • The return type must be the same as the data type of the redacted column.
  • The functions can be pushed down.
  • In addition to the redaction format, only one column can be specified in the argument list for data redaction.
  • The functions only implement the formatting for specific data types and do not involve complex association operations with other table objects.
+
+

If either of the first two requirements is not met, an error will be reported when you create a redaction policy. If either of the last two requirements is not met, unexpected problems may occur in query execution results.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0065.html b/docs/dws/dev/dws_06_0065.html new file mode 100644 index 00000000..1d3ca2ae --- /dev/null +++ b/docs/dws/dev/dws_06_0065.html @@ -0,0 +1,519 @@ + + +

Statistics Information Functions

+

Statistics information functions are divided into the following two categories: functions that access databases, using the OID of each table or index in a database to mark the database for which statistics are generated; functions that access servers, identified by the server process ID, whose value ranges from 1 to the number of currently active servers.

+
  • pg_stat_get_db_numbackends(oid)

    Description: Obtains the number of active server threads of a specified database on the current instance.

    +

    Return type: integer

    +
  • pg_stat_get_db_total_numbackends(oid)

    Description: Obtains the total number of active server threads of a specified database on all CNs in a cluster (if this function is executed on a CN), or obtains the number of active server threads of a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: integer

    +
  • pg_stat_get_db_xact_commit(oid)

    Description: Obtains the number of committed transactions in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_xact_commit(oid)

    Description: Obtains the total number of committed transactions in a specified database on all CNs in a cluster (if this function is executed on a CN), or obtains the number of committed transactions in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_xact_rollback(oid)

    Description: Obtains the number of rollback transactions in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_xact_rollback(oid)

    Description: Obtains the total number of rollback transactions in a specified database on all CNs in a cluster (if this function is executed on a CN), or obtains the number of rollback transactions in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_blocks_fetched(oid)

    Description: Obtains the number of disk block fetch requests in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_blocks_fetched(oid)

    Description: Obtains the total number of disk block fetch requests in a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of disk block fetch requests in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_blocks_hit(oid)

    Description: Obtains the number of requested disk blocks found in the cache in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_blocks_hit(oid)

    Description: Obtains the total number of requested disk blocks found in the cache in a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of requested disk blocks found in the cache in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_tuples_returned(oid)

    Description: Obtains the number of tuples returned for a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_tuples_returned(oid)

    Description: Obtains the total number of tuples returned for a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of tuples returned for a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_tuples_fetched(oid)

    Description: Obtains the number of tuples read from a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_tuples_fetched(oid)

    Description: Obtains the total number of tuples read from a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of tuples read from a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_tuples_inserted(oid)

    Description: Obtains the number of tuples inserted into a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_tuples_inserted(oid)

    Description: Obtains the total number of tuples inserted into a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of tuples inserted into a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_tuples_updated(oid)

    Description: Obtains the number of updated tuples in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_tuples_updated(oid)

    Description: Obtains the total number of updated tuples in a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of updated tuples in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_tuples_deleted(oid)

    Description: Obtains the number of tuples deleted from a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_tuples_deleted(oid)

    Description: Obtains the total number of tuples deleted from a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of tuples deleted from a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_conflict_lock(oid)

    Description: Obtains the total number of conflicting locks in a specified database on all CNs and DNs in a cluster (if this function is executed on a CN), or obtains the number of conflicting locks in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_deadlocks(oid)

    Description: Obtains the number of deadlocks in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_deadlocks(oid)

    Description: Obtains the total number of deadlocks in a specified database on all CNs and DNs in a cluster (if this function is executed on a CN), or obtains the number of deadlocks in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_conflict_all(oid)

    Description: Obtains the number of conflict recoveries in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_conflict_all(oid)

    Description: Obtains the total number of conflict recoveries in a specified database on all CNs and DNs in a cluster (if this function is executed on a CN), or obtains the number of conflict recoveries in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_temp_files(oid)

    Description: Obtains the number of temporary files created in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_temp_files(oid)

    Description: Obtains the total number of temporary files created in a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of temporary files created in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_temp_bytes(oid)

    Description: Obtains the number of bytes of the temporary files created in a specified database on the current instance.

    +

    Return type: bigint

    +
  • pg_stat_get_db_total_temp_bytes(oid)

    Description: Obtains the total number of bytes of the temporary files created in a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the number of bytes of the temporary files created in a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: bigint

    +
  • pg_stat_get_db_blk_read_time(oid)

    Description: Obtains the time required for reading data blocks from a specified database on the current instance.

    +

    Return type: double

    +
  • pg_stat_get_db_total_blk_read_time(oid)

    Description: Obtains the total time required for reading data blocks from a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the time required for reading data blocks from a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: double

    +
  • pg_stat_get_db_blk_write_time(oid)

    Description: Obtains the time required for writing data blocks to a specified database on the current instance.

    +

    Return type: double

    +
  • pg_stat_get_db_total_blk_write_time(oid)

    Description: Obtains the total time required for writing data blocks to a specified database on all DNs in a cluster (if this function is executed on a CN), or obtains the time required for writing data blocks to a specified database on the current instance (if this function is executed on a DN).

    +

    Return type: double

    +
  • pg_stat_get_numscans(oid)

    Description: Number of sequential row scans done if parameters are in a table

    +

    or number of index scans done if parameters are in an index

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_returned(oid)

    Description: Number of sequential row scans done if parameters are in a table

    +

    or number of index entries returned if parameters are in an index

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_fetched(oid)

    Description: Number of table rows fetched by bitmap scans if parameters are in a table,

    +

    or table rows fetched by simple index scans using the index if parameters are in an index

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_inserted(oid)

    Description: Number of rows inserted into table

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_updated(oid)

    Description: Number of rows updated in table

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_deleted(oid)

    Description: Number of rows deleted from table

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_changed(oid)

    Description: Total number of inserted, updated, and deleted rows after the table was last analyzed or autoanalyzed

    +

    Return type: bigint

    +
  • pg_stat_get_tuples_hot_updated(oid)

    Description: Number of rows HOT-updated in table

    +

    Return type: bigint

    +
  • pg_stat_get_live_tuples(oid)

    Description: Number of live rows in table

    +

    Return type: bigint

    +
  • pg_stat_get_dead_tuples(oid)

    Description: Number of dead rows in table

    +

    Return type: bigint

    +
  • pg_stat_get_blocks_fetched(oid)

    Description: Number of disk block fetch requests for table or index

    +

    Return type: bigint

    +
  • pg_stat_get_blocks_hit(oid)

    Description: Number of disk block requests found in cache for table or index

    +

    Return type: bigint

    +
  • pg_stat_get_partition_tuples_inserted(oid)

    Description: Number of rows in the corresponding table partition

    +

    Return type: bigint

    +
  • pg_stat_get_partition_tuples_updated(oid)

    Description: Number of rows that have been updated in the corresponding table partition

    +

    Return type: bigint

    +
  • pg_stat_get_partition_tuples_deleted(oid)

    Description: Number of rows deleted from the corresponding table partition

    +

    Return type: bigint

    +
  • pg_stat_get_partition_tuples_changed(oid)

    Description: Total number of inserted, updated, and deleted rows after the table partition was last analyzed or autoanalyzed

    +

    Return type: bigint

    +
  • pg_stat_get_partition_live_tuples(oid)

    Description: Number of live rows in a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_partition_dead_tuples(oid)

    Description: Number of dead rows in a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_xact_tuples_inserted(oid)

    Description: Number of tuple inserted into the active subtransactions related to the table.

    +

    Return type: bigint

    +
  • pg_stat_get_xact_tuples_deleted(oid)

    Description: Number of deleted tuples in the active subtransactions related to a table

    +

    Return type: bigint

    +
  • pg_stat_get_xact_tuples_hot_updated(oid)

    Description: Number of hot updated tuples in the active subtransactions related to a table

    +

    Return type: bigint

    +
  • pg_stat_get_xact_tuples_updated(oid)

    Description: Number of updated tuples in the active subtransactions related to a table

    +

    Return type: bigint

    +
  • pg_stat_get_xact_partition_tuples_inserted(oid)

    Description: Number of inserted tuples in the active subtransactions related to a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_xact_partition_tuples_deleted(oid)

    Description: Number of deleted tuples in the active subtransactions related to a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_xact_partition_tuples_hot_updated(oid)

    Description: Number of hot updated tuples in the active subtransactions related to a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_xact_partition_tuples_updated(oid)

    Description: Number of updated tuples in the active subtransactions related to a table partition

    +

    Return type: bigint

    +
  • pg_stat_get_last_vacuum_time(oid)

    Description: Last time when the autovacuum thread is manually started to clear a table

    +

    Return type: timestamptz

    +
  • pg_stat_get_last_autovacuum_time(oid)

    Description: Time of the last vacuum initiated by the autovacuum daemon on this table

    +

    Return type: timestamptz

    +
  • pg_stat_get_vacuum_count(oid)

    Description: Number of times a table is manually cleared

    +

    Return type: bigint

    +
  • pg_stat_get_autovacuum_count(oid)

    Description: Number of times the autovacuum daemon is started to clear a table

    +

    Return type: bigint

    +
  • pg_stat_get_last_analyze_time(oid)

    Description: Last time when a table starts to be analyzed manually or by the autovacuum thread

    +

    Return type: timestamptz

    +
  • pg_stat_get_last_autoanalyze_time(oid)

    Description: Time of the last analysis initiated by the autovacuum daemon on this table

    +

    Return type: timestamptz

    +
  • pg_stat_get_analyze_count(oid)

    Description: Number of times a table is manually analyzed

    +

    Return type: bigint

    +
  • pg_stat_get_autoanalyze_count(oid)

    Description: Number of times the autovacuum daemon analyzes a table

    +

    Return type: bigint

    +
  • pg_total_autovac_tuples(bool)

    Description: Gets the tuple records related to total autovac, such as nodename, nspname, relname, and the IUD information of tuples.

    +

    Return type: SETOF record

    +
  • pg_autovac_status(oid)

    Description: Returns autovac information, such as nodename, nspname, relname, analyze, vacuum, thresholds of analyze and vacuum, and the number of analyzed or vacuumed tuples.

    +

    Return type: SETOF record

    +
  • pg_autovac_timeout(oid)

    Description: Returns the number of consecutive timeouts during the autovac operation on a table. If the table information is invalid or the node information is abnormal, NULL will be returned.

    +

    Return type: bigint

    +
  • pg_autovac_coordinator(oid)

    Description: Returns the name of the CN performing the autovac operation on a table. If the table information is invalid or the node information is abnormal, NULL will be returned.

    +

    Return type: text

    +
  • pgxc_get_wlm_session_info_bytime(text, timestamp without time zone, timestamp without time zone, int)

    Description: The query performance of the PGXC_WLM_SESSION_INFO view is poor if the view contains a large number of records. In this case, you are advised to use this function to filter the query. The input parameters are time column (start_time or finish_time), start time, end time, and maximum number of records returned for each CN. The return result is a subset of records in the GS_WLM_SESSION_HISTORY view.

    +

    Return type: SETOF record

    +
  • pgxc_get_wlm_current_instance_info(text, int default null)

    Description: Queries the current resource usage of each node in the cluster on the CN and reads the data that is not stored in the GS_WLM_INSTANCE_HISTORY system catalog in the memory. The input parameters are the node name (ALL, C, D, or instance name) and the maximum number of records returned by each node. The returned value is GS_WLM_INSTANCE_HISTORY.

    +

    Return type: SETOF record

    +
  • pgxc_get_wlm_history_instance_info(text, TIMESTAMP, TIMESTAMP, int default null)

    Description: Queries the historical resource usage of each cluster node on the CN node and reads data from the GS_WLM_INSTANCE_HISTORY system catalog. The input parameters are as follows: node name (ALL, C, D, or instance name), start time, end time, and maximum number of records returned for each instance. The returned value is GS_WLM_INSTANCE_HISTORY.

    +

    Return type: SETOF record

    +
  • pg_stat_get_last_data_changed_time(oid)

    Description: Returns the time when INSERT, UPDATE, DELETE, or EXCHANGE/TRUNCATE/DROP PARTITION was performed last time on a table. The data in the last_data_changed column of the PG_STAT_ALL_TABLES view is calculated by using this function. The performance of obtaining the last modification time by using the view is poor when the table has a large amount of data. In this case, you are advised to use the function.

    +

    Return type: timestamptz

    +
  • pg_stat_set_last_data_changed_time(oid)

    Description: Manually changes the time when INSERT, UPDATE, DELETE, or EXCHANGE/TRUNCATE/DROP PARTITION was performed last time.

    +

    Return type: void

    +
  • pv_session_time()

    Description: Collects statistics on the running time of each session thread on the current node and the time consumed in each execution phase.

    +

    Return type: record

    +
  • pv_instance_time()

    Description: Collects statistics on the running time of the current node and the time consumed in each execution phase.

    +

    Return type: record

    +
  • pg_stat_get_activity(integer)

    Description: Returns a record about the backend with the specified PID. A record for each active backend in the system is returned if NULL is specified. The return result is a subset of records (excluding the connection_info column) in the PG_STAT_ACTIVITY view.

    +

    Return type: SETOF record

    +
  • pg_stat_get_activity_with_conninfo(integer)

    Description: Returns a record about the backend with the specified PID. A record for each active backend in the system is returned if NULL is specified. The return result is a subset of records in the PG_STAT_ACTIVITY view.

    +

    Return type: SETOF record

    +
  • pg_user_iostat(text)

    Description: Displays the I/O load management information about the job currently executed by the user.

    +

    Return type: record

    +

    The following table describes return fields.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Name

    +

    Type

    +

    Description

    +

    userid

    +

    oid

    +

    User ID

    +

    min_curr_iops

    +

    int4

    +

    Minimum I/O of the current user across DNs. The IOPS is counted by ones for column storage and by thousands for row storage.

    +

    max_curr_iops

    +

    int4

    +

    Maximum I/O of the current user across DNs. The IOPS is counted by ones for column storage and by thousands for row storage.

    +

    min_peak_iops

    +

    int4

    +

    Minimum peak I/O of the current user across DNs. The IOPS is counted by ones for column storage and by thousands for row storage.

    +

    max_peak_iops

    +

    int4

    +

    Maximum peak I/O of the current user across DNs. The IOPS is counted by ones for column storage and by thousands for row storage.

    +

    io_limits

    +

    int4

    +

    io_limits set for the resource pool specified by the user. The IOPS is counted by ones for column storage and by thousands for row storage.

    +

    io_priority

    +

    text

    +

    io_priority set for the user. The IOPS is counted by ones for column storage and by thousands for row storage.

    +
    +
    +
  • pg_stat_get_function_calls(oid)

    Description: Number of times the function has been called

    +

    Return type: bigint

    +
  • pg_stat_get_function_total_time(oid)

    Description: Gets the total wall-clock time spent on a function, in microseconds. The time spent on calling this function is included.

    +

    Return type: double precision

    +
  • pg_stat_get_function_self_time(oid)

    Description: Gets the time spent only on this function in the current transaction. The time spent on calling this function is not included.

    +

    Return type: double precision

    +
  • pg_stat_get_backend_idset()

    Description: Set of currently active server process numbers (from 1 to the number of active server processes)

    +

    Return type: SETOF integer

    +
  • pg_stat_get_backend_pid(integer)

    Description: Thread ID of the given server thread

    +

    Return type: bigint

    +
    1
    +2
    +3
    +4
    +5
    SELECT pg_stat_get_backend_pid(1);
    + pg_stat_get_backend_pid 
    +-------------------------
    +         139706243217168
    +(1 row)
    +
    + +
    +
  • pg_stat_get_backend_dbid(integer)

    Description: ID of the database connected to the given server process

    +

    Return type: OID

    +
  • pg_stat_get_backend_userid(integer)

    Description: User ID of the given server process

    +

    Return type: OID

    +
  • pg_stat_get_backend_activity(integer)

    Description: Active command of the given server process, but only if the current user is a system administrator or the same user as that of the session being queried and track_activities is on

    +

    Return type: text

    +
  • pg_stat_get_backend_waiting(integer)

    Description: True if the given server process is waiting for a lock, but only if the current user is a system administrator or the same user as that of the session being queried and track_activities is on

    +

    Return type: boolean

    +
  • pg_stat_get_backend_activity_start(integer)

    Description: The time at which the given server process's currently executing query was started, but only if the current user is a system administrator or the same user as that of the session being queried and track_activities is on

    +

    Return type: timestamp with time zone

    +
  • pg_stat_get_backend_xact_start(integer)

    Description: The time at which the given server process's currently executing transaction was started, but only if the current user is a system administrator or the same user as that of the session being queried and track_activities is on

    +

    Return type: timestamp with time zone

    +
  • pg_stat_get_backend_start(integer)

    Description: The time at which the given server process was started, or NULL if the current user is neither a system administrator nor the same user as that of the session being queried

    +

    Return type: timestamp with time zone

    +
  • pg_stat_get_backend_client_addr(integer)

    Description: IP address of the client connected to the given server process.

    +

    If the connection is over a Unix domain socket, or if the current user is neither a system administrator nor the same user as that of the session being queried, NULL will be returned.

    +

    Return type: inet

    +

    Note: An IP address used as an input parameter of this function cannot contain periods (.). For example, 192.168.100.128 should be written as 192168100128.

    +
  • pg_stat_get_backend_client_port(integer)

    Description: TCP port number of the client connected to the given server process

    +

    If the connection is over a Unix domain socket, -1 will be returned. If the current user is neither a system administrator nor the same user as that of the session being queried, NULL will be returned.

    +

    Return type: integer

    +
  • pg_stat_get_bgwriter_timed_checkpoints()

    Description: The number of times the background writer has started timed checkpoints (because the checkpoint_timeout time has expired)

    +

    Return type: bigint

    +
  • pg_stat_get_bgwriter_requested_checkpoints()

    Description: The number of times the background writer has started checkpoints based on requests from the backend because checkpoint_segments has been exceeded or the CHECKPOINT command has been executed

    +

    Return type: bigint

    +
  • pg_stat_get_bgwriter_buf_written_checkpoints()

    Description: The number of buffers written by the background writer during checkpoints

    +

    Return type: bigint

    +
  • pg_stat_get_bgwriter_buf_written_clean()

    Description: The number of buffers written by the background writer for routine cleaning of dirty pages

    +

    Return type: bigint

    +
  • pg_stat_get_bgwriter_maxwritten_clean()

    Description: The number of times the background writer has stopped its cleaning scan because it has written more buffers than specified in the bgwriter_lru_maxpages parameter

    +

    Return type: bigint

    +
  • pg_stat_get_buf_written_backend()

    Description: The number of buffers written by the backend because they needed to allocate a new buffer

    +

    Return type: bigint

    +
  • pg_stat_get_buf_alloc()

    Description: The total number of buffer allocations

    +

    Return type: bigint

    +
  • pg_stat_clear_snapshot()

    Description: Discards the current statistics snapshot.

    +

    Return type: void

    +
  • pg_stat_reset()

    Description: Resets all statistics counters for the current database to zero (requires system administrator permissions).

    +

    Return type: void

    +
  • pg_stat_reset_shared(text)

    Description: Resets all statistics counters for the current database in each node in a shared cluster to zero (requires system administrator permissions).

    +

    Return type: void

    +
  • pg_stat_reset_single_table_counters(oid)

    Description: Resets statistics for a single table or index in the current database to zero (requires system administrator permissions).

    +

    Return type: void

    +
  • pg_stat_reset_single_function_counters(oid)

    Description: Resets statistics for a single function in the current database to zero (requires system administrator permissions).

    +

    Return type: void

    +
  • pg_stat_session_cu(int, int, int)

    Description: Obtains the compression unit (CU) hit statistics of sessions running on the current node.

    +

    Return type: record

    +
  • gs_get_stat_session_cu(text, int, int, int)

    Description: Obtains the CU hit statistics of all sessions running in a cluster.

    +

    Return type: record

    +
  • gs_get_stat_db_cu(text, text, int, int, int)

    Description: Obtains the CU hit statistics of a database in a cluster.

    +

    Return type: record

    +
  • pg_stat_get_cu_mem_hit(oid)

    Description: Obtains the number of CU memory hits of a column storage table in the current database of the current node.

    +

    Return type: bigint

    +
  • pg_stat_get_cu_hdd_sync(oid)

    Description: Obtains the times CU is synchronously read from a disk by a column storage table in the current database of the current node.

    +

    Return type: bigint

    +
  • pg_stat_get_cu_hdd_asyn(oid)

    Description: Obtains the times CU is asynchronously read from a disk by a column storage table in the current database of the current node.

    +

    Return type: bigint

    +
  • pg_stat_get_db_cu_mem_hit(oid)

    Description: Obtains the CU memory hit in a database of the current node.

    +

    Return type: bigint

    +
  • pg_stat_get_db_cu_hdd_sync(oid)

    Description: Obtains the times CU is synchronously read from a disk by a database of the current node.

    +

    Return type: bigint

    +
+
  • pg_stat_get_db_cu_hdd_asyn(oid)

    Description: Obtains the times CU is asynchronously read from a disk by a database of the current node.

    +

    Return type: bigint

    +
  • pgxc_fenced_udf_process()

    Description: Shows the number of UDF Master and Work processes.

    +

    Return type: record

    +
  • pgxc_terminate_all_fenced_udf_process()

    Description: Kills all UDF Work processes.

    +

    Return type: bool

    +
  • GS_ALL_NODEGROUP_CONTROL_GROUP_INFO(text)
    Description: Provides Cgroup information for all logical clusters. Before invoking this function, you need to specify the name of a logical cluster to be queried. For example, to query the Cgroup information for the installation logical cluster, run the following command:
    1
    SELECT * FROM GS_ALL_NODEGROUP_CONTROL_GROUP_INFO('installation')
    +
    + +
    +
    +

    Return type: record

    +

    The following table describes return fields.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Name

    +

    Type

    +

    Description

    +

    name

    +

    text

    +

    Name of a Cgroup

    +

    type

    +

    text

    +

    Type of the Cgroup

    +

    gid

    +

    bigint

    +

    Cgroup ID

    +

    classgid

    +

    bigint

    +

    ID of the Class Cgroup where a Workload Cgroup belongs

    +

    class

    +

    text

    +

    Class Cgroup

    +

    workload

    +

    text

    +

    Workload Cgroup

    +

    shares

    +

    bigint

    +

    CPU quota allocated to a Cgroup

    +

    limits

    +

    bigint

    +

    Limit of CPUs allocated to a Cgroup

    +

    wdlevel

    +

    bigint

    +

    Workload Cgroup level

    +

    cpucores

    +

    text

    +

    Usage of CPU cores in a Cgroup

    +
    +
    +
  • gs_get_nodegroup_tablecount(name)

    Description: Total number of user tables in all the databases in a logical cluster

    +

    Return type: integer

    +
+
  • pgxc_max_datanode_size(name)

    Description: Maximum disk space occupied by database files in all the DNs of a logical cluster. The unit is byte.

    +

    Return type: bigint

    +
+
  • gs_check_logic_cluster_consistency()

    Description: Checks whether the system information of all logical clusters in the system is consistent. If no record is returned, the information is consistent. Otherwise, the Node Group information on CNs and DNs in the logical cluster is inconsistent. This function cannot be invoked during redistribution in a scale-in or scale-out.

    +

    Return type: record

    +
+
  • gs_check_tables_distribution()

    Description: Checks whether the user table distribution in the system is consistent. If no record is returned, table distribution is consistent. This function cannot be invoked during redistribution in a scale-in or scale-out.

    +

    Return type: record

    +
  • pg_stat_bad_block(text, int, int, int, int, int, timestamp with time zone, timestamp with time zone)

    Description: Obtains damage information about pages or CUs after the current node is started.

    +

    Return type: record

    +
  • pgxc_stat_bad_block(text, int, int, int, int, int, timestamp with time zone, timestamp with time zone)

    Description: Obtains damage information about pages or CUs after all the nodes in the cluster are started.

    +

    Return type: record

    +
  • pg_stat_bad_block_clear()

    Description: Deletes the page and CU damage information that is read and recorded on the node. (System administrator rights are required.)

    +

    Return type: void

    +
  • pgxc_stat_bad_block_clear()

    Description: Deletes the page and CU damage information that is read and recorded on all the nodes in the cluster. (System administrator rights are required.)

    +

    Return type: void

    +
  • gs_respool_exception_info(pool text)

    Description: Queries for the query rule of a specified resource pool.

    +

    Return type: record

    +
  • gs_control_group_info(pool text)

    Description: Queries for information about Cgroups associated with a resource pool.

    +

    Return type: record

    +

    The following information is displayed:

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Attribute

    +

    Value

    +

    Description

    +

    name

    +

    class_a:workload_a1

    +

    Class name and workload name

    +

    class

    +

    class_a

    +

    Class Cgroup name

    +

    workload

    +

    workload_a1

    +

    Workload Cgroup name

    +

    type

    +

    DEFWD

    +

    Cgroup type (Top, CLASS, BAKWD, DEFWD, and TSWD)

    +

    gid

    +

    87

    +

    Cgroup ID

    +

    shares

    +

    30

    +

    Percentage of CPU resources to those on the parent node

    +

    limits

    +

    0

    +

    Percentage of CPU cores to those on the parent node

    +

    rate

    +

    0

    +

    Allocation ratio in Timeshare

    +

    cpucores

    +

    0-3

    +

    Number of CPU cores

    +
    +
    +
  • gs_wlm_user_resource_info(name text)

    Description: Queries for a user's resource quota and resource usage.

    +

    Return type: record

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0066.html b/docs/dws/dev/dws_06_0066.html new file mode 100644 index 00000000..4841a3ef --- /dev/null +++ b/docs/dws/dev/dws_06_0066.html @@ -0,0 +1,57 @@ + + +

Trigger Functions

+
  • pg_get_triggerdef(oid)

    Description: Obtains the definition information of a trigger.

    +

    Parameter: OID of the trigger to be queried

    +

    Return type: text

    +

    Example:

    +
    1
    +2
    +3
    +4
    +5
    select pg_get_triggerdef(oid) from pg_trigger;
    +                                                  pg_get_triggerdef
    +----------------------------------------------------------------------------------------------------------------------
    + CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func()
    +(1 row)
    +
    + +
    +
  • pg_get_triggerdef(oid, boolean)

    Description: Obtains the definition information of a trigger.

    +

    Parameter: OID of the trigger to be queried and whether it is displayed in pretty mode

    +

    Return type: text

    +

    The Boolean parameters take effect only when the WHEN condition is specified during trigger creation.

    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    select pg_get_triggerdef(oid,true)from pg_trigger;
    +                                                  pg_get_triggerdef
    +----------------------------------------------------------------------------------------------------------------------
    + CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func()
    +(1 row)
    +
    +select pg_get_triggerdef(oid,false)from pg_trigger;
    +                                                  pg_get_triggerdef
    +----------------------------------------------------------------------------------------------------------------------
    + CREATE TRIGGER insert_trigger BEFORE INSERT ON test_trigger_src_tbl FOR EACH ROW EXECUTE PROCEDURE tri_insert_func()
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0067.html b/docs/dws/dev/dws_06_0067.html new file mode 100644 index 00000000..ce3a241c --- /dev/null +++ b/docs/dws/dev/dws_06_0067.html @@ -0,0 +1,388 @@ + + +

XML Functions

+

Generating XML Content

  • XMLPARSE ( { DOCUMENT | CONTENT } value)
+

Description: Generates an XML value from character data.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlparse(document '<foo>bar</foo>');
+xmlparse
+----------------
+<foo>bar</foo>
+(1 row)
+
+ +
+
+
  • XMLSERIALIZE ( { DOCUMENT | CONTENT } value AS type
+

Description: Generates a string from XML values.

+

Return type: type, which can be character, character varying, or text (or its alias)

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlserialize(content 'good' AS CHAR(10));
+xmlserialize
+--------------
+good
+(1 row)
+
+ +
+
  • xmlcomment(text)
+

Description: Creates an XML note that uses the specified text as the content. The text cannot contain two consecutive hyphens (--) or end with a hyphen (-). If the parameter is null, the result is also null.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlcomment('hello');
+xmlcomment
+--------------
+<!--hello-->
+(1 row)
+
+ +
+
  • xmlconcat(xml[, ...])
+

Description: Concatenates a list of XML values into a single value. Null values are ignored. If all parameters are null, the result is also null.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlconcat('<abc/>', '<bar>foo</bar>');
+xmlconcat
+----------------------
+<abc/><bar>foo</bar>
+(1 row)
+
+ +
+

Note: If XML declarations exist and they are the same XML version, the result will use the version. Otherwise, the result does not use any version. If all XML values have the standalone attribute whose status is yes, the standalone attribute in the result is yes. If at least one XML value's standalone attribute is no, the standalone attribute in the result is no. Otherwise, the result does not contain the standalone attribute.

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlconcat('<?xml version="1.1"?><foo/>', '<?xml version="1.1" standalone="no"?><bar/>');
+xmlconcat
+-----------------------------------
+<?xml version="1.1"?><foo/><bar/>
+(1 row)
+
+ +
+
  • xmlelement(name name [, xmlattributes(value [AS attname] [, ... ])] [, content, ...])
+

Description: Generates an XML element with the given name, attribute, and content.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlelement(name foo, xmlattributes(current_date as bar), 'cont', 'ent');
+xmlelement
+-------------------------------------
+<foo bar="2020-08-15">content</foo>
+(1 row)
+
+ +
+
  • xmlforest(content [AS name] [, ...])
+

Description: Generates an XML forest (sequence) of an element with a given name and content.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlforest('abc' AS foo, 123 AS bar);
+xmlforest
+------------------------------
+<foo>abc</foo><bar>123</bar>
+(1 row)
+
+ +
+
  • xmlpi(name target [, content])
+

Description: Creates an XML processing instruction. The content cannot contain the character sequence of ?>.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlpi(name php, 'echo "hello world";');
+xmlpi
+-----------------------------
+<?php echo "hello world";?>
+(1 row)
+
+ +
+
  • xmlroot(xml, version text | no value [, standalone yes|no|no value])
+

Description: Modifies the attributes of the root node of an XML value. If a version is specified, it replaces the value in the version declaration of the root node. If a standalone value is specified, it replaces the standalone value in the root node.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlroot(xmlparse(document '<?xml version="1.0" standalone="no"?><content>abc</content>'), version '1.1', standalone yes);
+xmlroot
+--------------------------------------------------------------
+<?xml version="1.1" standalone="yes"?><content>abc</content>
+(1 row)
+
+ +
+
  • xmlagg(xml)
+

Description: The xmlagg function is an aggregate function that concatenates input values.

+

Return type: XML

+

Example:

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE TABLE test (y int, x xml);
+INSERT INTO test VALUES (1, '<foo>abc</foo>');
+INSERT INTO test VALUES (2, '<bar/>');
+SELECT xmlagg(x) FROM test;
+xmlagg
+----------------------
+<foo>abc</foo><bar/>
+(1 row)
+
+ +
+

To determine the concatenation sequence, you can add an ORDER BY clause for an aggregate call, for example:

+
1
+2
+3
+4
+5
SELECT xmlagg(x ORDER BY y DESC) FROM test;
+xmlagg
+----------------------
+<bar/><foo>abc</foo>
+(1 row)
+
+ +
+

XML Predicates

  • xml IS DOCUMENT
+

Description: IS DOCUMENT returns true if the XML value of the parameter is a correct XML document; if the XML document is incorrect, false is returned. If the parameter is null, a null value is returned.

+

Return type: bool

+
+
  • xml IS NOT DOCUMENT
+

Description: Returns true if the XML value of the parameter is not a correct XML document. If the XML document is correct, false is returned. If the parameter is null, a null value is returned.

+

Return type: bool

+
  • XMLEXISTS(text PASSING [BY REF] xml [BY REF])
+

Description: If the xpath expression in the first parameter returns any node, the XMLEXISTS function returns true. Otherwise, the function returns false. (If any parameter is null, the result is null.) The BY REF clause is invalid and is used to maintain SQL compatibility.

+

Return type: bool

+

Example:

+
1
+2
+3
+4
+5
SELECT xmlexists('//town[text() = ''Toronto'']' PASSING BY REF '<towns><town>Toronto</town><town>Ottawa</town></towns>');
+xmlexists
+-----------
+t
+(1 row)
+
+ +
+
  • xml_is_well_formed(text)
+

Description: Checks whether a text string is a well-formatted XML value and returns a Boolean result. If the xmloption parameter is set to DOCUMENT, the document is checked. If the xmloption parameter is set to CONTENT, the content is checked.

+

Return type: bool

+

Example:

+
1
+2
+3
+4
+5
SELECT xml_is_well_formed('<abc/>');
+xml_is_well_formed
+--------------------
+t
+(1 row)
+
+ +
+
  • xml_is_well_formed_document(text)
+

Description: Checks whether a text string is a well-formatted text and returns a Boolean result.

+

Return type: bool

+

Example:

+
1
+2
+3
+4
+5
SELECT xml_is_well_formed_document('<test:foo xmlns:test="http://test.com/test">bar</test:foo>');
+xml_is_well_formed_document
+-----------------------------
+t
+(1 row)
+
+ +
+
  • xml_is_well_formed_content(text)
+

Description: Checks whether a text string is a well-formatted content and returns a Boolean result.

+

Return type: bool

+

Example:

+
1
+2
+3
+4
+5
SELECT xml_is_well_formed_content('content');
+xml_is_well_formed_content
+----------------------------
+t
+(1 row)
+
+ +
+

Processing XML

  • xpath(xpath, xml [, nsarray])
+

Description: Returns an array of XML values corresponding to the set of nodes produced by the xpath expression. If the xpath expression returns a scalar value instead of a set of nodes, an array of individual elements is returned. The second parameter xml must be a complete XML document, which must have a root node element. The third parameter is an array map of a namespace. The array should be a two-dimensional text array, and the length of the second dimension should be 2. (It should be an array of arrays, each containing exactly two elements). The first element of each array item is the alias of the namespace name, and the second element is the namespace URI. The alias provided in this array does not have to be the same as the alias used in the XML document itself. In other words, in the context of both XML documents and xpath functions, aliases are local.

+

Return type: XML value array

+

Example:

+
1
+2
+3
+4
+5
SELECT xpath('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>', ARRAY[ARRAY['my', 'http://example.com']]);
+xpath
+--------
+{test}
+(1 row)
+
+ +
+
+
  • xpath_exists(xpath, xml [, nsarray])
+

Description: The xpath_exists function is a special form of the xpath function. This function does not return an XML value that satisfies the xpath function; it returns a Boolean value indicating whether the query is satisfied. This function is equivalent to the standard XMLEXISTS predicate, but it also provides support for a namespace mapping parameter.

+

Return type: bool

+

Example:

+
1
+2
+3
+4
+5
SELECT xpath_exists('/my:a/text()', '<my:a xmlns:my="http://example.com">test</my:a>', ARRAY[ARRAY['my', 'http://example.com']]);
+xpath_exists
+--------------
+t
+(1 row)
+
+ +
+
  • xmltable
+

Description: Generates a table based on the input XML data, XPath expression, and column definition. An xmltable is similar to a function in syntax, but it can appear only as a table in the FROM clause of a query.

+

Return value: setof record

+

Syntax:

+
1
+2
+3
+4
+5
+6
XMLTABLE ( [ XMLNAMESPACES ( namespace_uri AS namespace_name [,  ...] ), ]
+                row_expression PASSING [ BY  { REF | VALUE } ]
+document_expression [ BY  { REF | VALUE } ]
+COLUMNS name  { type  [ PATH column_expression  ] [ DEFAULT default_expression ] [ NOT NULL | NULL ] | FOR ORDINALITY }
+[, ...]
+)
+
+ +
+

Parameter:

+
  • The optional XMLNAMESPACES clause is a comma-separated list of namespace definitions, where each namespace_uri is a text-type expression and each namespace_name is a simple identifier. XMLNAMESPACES specifies the XML namespaces used in the document and their aliases. The default namespace declaration is not supported.
  • The mandatory parameter row_expression is an XPath 1.0 expression. This expression calculates the sequence of XML nodes based on the provided XML document document_expression. The sequence is the sequence of converting xmltable to output lines. If the document_expression value is NULL or an empty node set generated by row_expression, no line is returned.
  • The document_expression parameter is used to input an XML document. The input document must be in the XML format. XML fragment data or XML documents in incorrect format are not accepted. The BY REF and BY VALUE clauses do not take effect. They are used only to implement SQL standard compatibility.
  • The COLUMNS clause specifies the column list definition in the output table. The column name and column data type are mandatory, and the path, default value, and whether the clause is empty are optional.
    • column_expression of a column is an XPath 1.0 expression used to calculate the value of the column extracted from the current row based on row_expression. If column_expression is not specified, the field name is used as an implicit path.
    • A column can be marked as NOT NULL. If column_expression in the NOT NULL column does not return any data, and there is no DEFAULT clause or the calculation result of default_expression is NULL, an error is reported.
    • The columns marked as FOR ORDINALITY are filled with row numbers starting from 1. The sequence is the node sequence retrieved from the row_expression result set. A maximum of one column can be marked as FOR ORDINALITY.

      XPath 1.0 does not specify the order for nodes, so the order in which results are returned depends on the order in which data is obtained.

      +
      +
    +
+

Example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
SELECT * FROM XMLTABLE('/ROWS/ROW'
+PASSING '<ROWS><ROW id="1"><COUNTRY_ID>AU</COUNTRY_ID><COUNTRY_NAME>Australia</COUNTRY_NAME></ROW><ROW id="2"><COUNTRY_ID>FR</COUNTRY_ID><COUNTRY_NAME>France</COUNTRY_NAME></ROW><ROW id="3"><COUNTRY_ID>SG</COUNTRY_ID><COUNTRY_NAME>Singapore</COUNTRY_NAME></ROW></ROWS>'
+COLUMNS id INT PATH '@id',
+_id FOR ORDINALITY,
+country_id TEXT PATH 'COUNTRY_ID',
+country_name TEXT PATH 'COUNTRY_NAME' NOT NULL);
+id  |   _id  | country_id | country_name
+----+-----+---------------+--------------
+  1 |      1 | AU         | Australia
+  2 |      2 | FR         | France
+  3 |      3 | SG         | Singapore
+(3 rows)
+
+ +
+

Mapping a Table to XML

  • table_to_xml(tbl regclass, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps the contents of a table to XML values.

+

Return type: XML

+
+
  • table_to_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a relational table schema to an XML schema document.

+

Return type: XML

+
  • table_to_xml_and_xmlschema(tbl regclass, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a relational table to XML values and schema documents.

+

Return type: XML

+
  • query_to_xml(query text, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps the contents of an SQL query to XML values.

+

Return type: XML

+
  • query_to_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps an SQL query into an XML schema document.

+

Return type: XML

+
  • query_to_xml_and_xmlschema(query text, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps SQL queries to XML values and schema documents.

+

Return type: XML

+
  • cursor_to_xml(cursor refcursor, count int, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a cursor query to an XML value.

+

Return type: XML

+
  • cursor_to_xmlschema(cursor refcursor, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a cursor query to an XML schema document.

+

Return type: XML

+
  • schema_to_xml(schema name, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a table in a schema to an XML value.

+

Return type: XML

+
  • schema_to_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a table in a schema to an XML schema document.

+

Return type: XML

+
  • schema_to_xml_and_xmlschema(schema name, nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a table in a schema to an XML value and a schema document.

+

Return type: XML

+
  • database_to_xml(nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a database table to an XML value.

+

Return type: XML

+
  • database_to_xmlschema(nulls boolean, tableforest boolean, targetns text)
+

Description: Maps a database table to an XML schema document.

+

Return type: XML

+
  • database_to_xml_and_xmlschema(nulls boolean, tableforest boolean, targetns text)
+

Description: Maps database tables to XML values and schema documents.

+

Return type: XML

+

The parameters for mapping a table to an XML value are described as follows:

+
  • tbl: table name.
  • nulls: indicates whether the output contains null values. If the value is true, the null value in the column is <columnname xsi:nil="true"/>. If the value is false, the columns containing null values are omitted from the output.
  • tableforest: If this parameter is set to true, XML fragments are generated. If this parameter is set to false, XML files are generated.
  • targetns: specifies the XML namespace of the desired result. If this parameter is not specified, an empty string is passed.
  • query: SQL query statement
  • cursor: cursor name
  • count: amount of data obtained from the cursor
  • schema: schema name
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0068.html b/docs/dws/dev/dws_06_0068.html new file mode 100644 index 00000000..f04efcb4 --- /dev/null +++ b/docs/dws/dev/dws_06_0068.html @@ -0,0 +1,144 @@ + + +

Call Stack Recording Functions

+

The pv_memory_profiling(type int) and environment variable MALLOC_CONF are used by GaussDB(DWS) to control the enabling and disabling of the memory allocation call stack recording module and the output of the memory call stack. The following figure illustrates the process.

+

+

MALLOC_CONF

The environment variable MALLOC_CONF is used to enable the monitoring module. It is in the ${BIGDATA_HOME}/mppdb/.mppdbgs_profile file and is enabled by default. Note the following points:

+
  • Restart the database after modifying this environment variable.
  • If om_monitor is enabled in the cluster, restart the om_monitor process and then the database after setting this environment variable, so that the setting can take effect.
  • This environment variable can be set on all servers in the cluster or on some servers where the module needs to be enabled. For the GaussDB process, each process determines whether to enable the module based on the MALLOC_CONF environment variable.
+

Commands for enabling and disabling MALLOC_CONF:

+
  • Enabling the monitoring module:
    export MALLOC_CONF=prof:true
    +
  • Disabling the monitoring module:
    export MALLOC_CONF=prof:false
    +
+
+

pv_memory_profiling (type int)

Parameter description: Controls the backtrace recording and output of memory allocation functions such as malloc in the kernel.

+

Value range: a positive integer from 0 to 3.

+ +
+ + + + + + + + + + + + + + + + +
Table 1 Values and descriptions of pv_memory_profiling

pv_memory_profiling

+

Value

+

Description

+

0

+

Disables the memory trace function and does not record information of call stacks such as malloc.

+

1

+

Enables the memory trace function to record information of call stacks such as malloc.

+

2

+

Outputs trace logs of call stacks such as malloc.

+
  • Output path: /proc/pid/cwd directory. pid indicates the ID of the GaussDB process.
  • Output log name format: jeprof.<pid>.*.heap, where pid indicates the ID of the GaussDB process and * indicates the unique sequence number of the output trace log, for example, jeprof.195473.0.u0.heap.
+

3

+

Outputs memory statistics.

+
  • Output path: /proc/pid/cwd directory. pid indicates the ID of the GaussDB process.
  • Log name format: Node name + Process ID + Time + heap_stats + .out. You can use vim to open the file.
+
+
+

Return type: Boolean

+

Note:

+
  • If the function is called successfully, true is returned. Otherwise, false is returned.
  • If Memory profiling failed, check if $MALLOC_CONF contain 'prof:true'. is displayed, it indicates that the module is used when MALLOC_CONF=prof:true is not set. In this case, you need to set the environment variable.
  • If Type %d is not supported. The valid range is 0-3. is displayed, the parameter value is incorrect. The correct values are 0, 1, 2, and 3.
  • If Memory profiling failed, inputed type is %d, failed number is %d. is displayed, contact technical support for assistance.
+
+

Outputting Memory Call Stack Information

Procedure:

+
  1. Execute the following statement to output the memory call stack information and output the trace file in the directory where the GaussDB process is located:

    1
    select * from pv_memory_profiling(2);
    +
    + +
    +

  2. Use the jeprof tool provided by jemalloc to parse log information.

    Method 1: Output in text format.
    jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace file 1 >prof.txt
    +
    +

    Method 2: Export the report in PDF format.

    +
    jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace file 1 > prof.pdf
    +
    • To parse the memory call stack information, you need to use the GaussDB source code for analysis. You need to send the trace file to R&D engineers for analysis.
    • To analyze the trace file, you need to use the jeprof tool, which is generated by jemalloc. The Perl environment is required for using the tool. To generate PDF calling diagrams, you need to install the Graphviz tool that matches the OS.
    +
    +

+
+

Example

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
-- Log in as the system administrator, set environment variables, and start the database.
+export MALLOC_CONF=prof:true
+
+-- Disable the memory trace recording function when the database is running.
+select pv_memory_profiling(0);
+pv_memory_profiling
+----------------------------
+t
+(1 row)
+
+-- Enable the memory trace recording function when the database is running.
+select pv_memory_profiling(1);
+pv_memory_profiling
+----------------------------
+t
+(1 row)
+
+-- Output memory trace records.
+select pv_memory_profiling(2);
+pv_memory_profiling
+----------------------------
+t
+(1 row)
+
+-- Generate the trace file in text or PDF format in the directory where the GaussDB process is located.
+jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace file 1 >prof.txt
+jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace file 1 > prof.pdf
+
+-- Output memory statistics.
+Execute the following statement to generate the memory statistics file in the directory where the GaussDB process is located. The file can be directly read.
+select pv_memory_profiling(3);
+pv_memory_profiling
+----------------------------
+t
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0069.html b/docs/dws/dev/dws_06_0069.html new file mode 100644 index 00000000..de09035e --- /dev/null +++ b/docs/dws/dev/dws_06_0069.html @@ -0,0 +1,23 @@ + + +

Expressions

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0070.html b/docs/dws/dev/dws_06_0070.html new file mode 100644 index 00000000..56640f68 --- /dev/null +++ b/docs/dws/dev/dws_06_0070.html @@ -0,0 +1,146 @@ + + +

Simple Expressions

+

Logical Expressions

Logical Operators lists the operators and calculation rules of logical expressions.

+
+

Comparative Expressions

Comparison Operators lists the common comparative operators.

+

In addition to comparative operators, you can also use the following sentence structure:

+
  • BETWEEN operator

    a BETWEEN x AND y is equivalent to a >= x AND a <= y.

    +

    a NOT BETWEEN x AND y is equivalent to a < x OR a > y.

    +
  • To check whether a value is null, use:

    expression IS NULL

    +

    expression IS NOT NULL

    +

    or an equivalent (non-standard) sentence structure:

    +

    expression ISNULL

    +

    expression NOTNULL

    +

    Do not write expression=NULL or expression<>(!=)NULL, because NULL represents an unknown value, and these expressions cannot determine whether two unknown values are equal.

    +
    +
+
+

Examples

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
SELECT 2 BETWEEN 1 AND 3 AS RESULT;
+ result 
+----------
+ t
+(1 row)
+
+SELECT 2 >= 1 AND 2 <= 3 AS RESULT;
+ result 
+----------
+ t
+(1 row)
+
+SELECT 2 NOT BETWEEN 1 AND 3 AS RESULT;
+ result 
+----------
+ f
+(1 row)
+
+SELECT 2 < 1 OR 2 > 3 AS RESULT;
+ result 
+----------
+ f
+(1 row)
+
+SELECT 2+2 IS NULL AS RESULT;
+ result 
+----------
+ f
+(1 row)
+
+SELECT 2+2 IS NOT NULL AS RESULT;
+ result 
+----------
+ t
+(1 row)
+
+SELECT 2+2 ISNULL AS RESULT;
+ result 
+----------
+ f
+(1 row)
+
+SELECT 2+2 NOTNULL AS RESULT;
+ result 
+----------
+ t
+(1 row)
+
+SELECT 2+2 IS DISTINCT FROM NULL AS RESULT;
+ result 
+----------
+ t
+(1 row)
+
+SELECT 2+2 IS NOT DISTINCT FROM NULL AS RESULT;
+ result  
+----------
+ f
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0071.html b/docs/dws/dev/dws_06_0071.html new file mode 100644 index 00000000..279bd658 --- /dev/null +++ b/docs/dws/dev/dws_06_0071.html @@ -0,0 +1,252 @@ + + +

Conditional Expressions

+

Data that meets the requirements specified by conditional expressions are filtered during SQL statement execution.

+

Conditional expressions include the following types:

+
  • CASE

    CASE expressions are similar to the CASE statements in other coding languages.

    +

    Figure 1 shows the syntax of a CASE expression.

    +
    Figure 1 case::=
    +

    A CASE clause can be used in a valid expression. condition is an expression that returns a value of Boolean type.

    +
    • If the result is true, the result of the CASE expression is the required result.
    • If the result is false, the following WHEN or ELSE clauses are processed in the same way.
    • If every WHEN condition is false, the result of the expression is the result of the ELSE clause. If the ELSE clause is omitted and has no match condition, the result is NULL.
    +

    Examples:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    CREATE TABLE tpcds.case_when_t1(CW_COL1 INT)  DISTRIBUTE BY HASH (CW_COL1);
    +
    +INSERT INTO tpcds.case_when_t1 VALUES (1), (2), (3);
    +
    +SELECT * FROM tpcds.case_when_t1;
    + a 
    +---
    + 1
    + 2
    + 3
    +(3 rows)
    +
    +SELECT CW_COL1, CASE WHEN CW_COL1=1 THEN 'one' WHEN CW_COL1=2 THEN 'two' ELSE 'other' END FROM tpcds.case_when_t1;
    + a | case  
    +---+-------
    + 3 | other
    + 1 | one
    + 2 | two
    +(3 rows)
    +
    +DROP TABLE tpcds.case_when_t1;
    +
    + +
    +
  • DECODE

    Figure 2 shows the syntax of a DECODE expression.

    +
    Figure 2 decode::=
    +

    Compare each following compare(n) with base_expr, value(n) is returned if a compare(n) matches the base_expr expression. If base_expr does not match each compare(n), the default value is returned.

    +

    Conditional Expression Functions describes the examples.

    +
    1
    +2
    +3
    +4
    +5
    SELECT DECODE('A','A',1,'B',2,0);
    + case 
    +------
    +    1
    +(1 row)
    +
    + +
    +
  • COALESCE

    Figure 3 shows the syntax of a COALESCE expression.

    +
    Figure 3 coalesce::=
    +

    COALESCE returns its first non-NULL value. If all the arguments are NULL, return NULL. This value is replaced by the default value when data is displayed. Like a CASE expression, COALESCE only evaluates the parameters that are needed to determine the result. That is, parameters to the right of the first non-null parameter are not evaluated.

    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    CREATE TABLE tpcds.c_tabl(description varchar(10), short_description varchar(10), last_value varchar(10)) 
    +DISTRIBUTE BY HASH (last_value);
    +
    +INSERT INTO tpcds.c_tabl VALUES('abc', 'efg', '123');
    +INSERT INTO tpcds.c_tabl VALUES(NULL, 'efg', '123');
    +
    +INSERT INTO tpcds.c_tabl VALUES(NULL, NULL, '123');
    +
    +SELECT description, short_description, last_value, COALESCE(description, short_description, last_value) FROM tpcds.c_tabl ORDER BY 1, 2, 3, 4;
    + description | short_description | last_value | coalesce
    +-------------+-------------------+------------+----------
    + abc         | efg               | 123        | abc
    +             | efg               | 123        | efg
    +             |                   | 123        | 123
    +(3 rows)
    +
    +DROP TABLE tpcds.c_tabl;
    +
    + +
    +

    If description is not NULL, the value of description is returned. Otherwise, parameter short_description is calculated. If short_description is not NULL, the value of short_description is returned. Otherwise, parameter last_value is calculated. If last_value is not NULL, the value of last_value is returned. Otherwise, none is returned.

    +
    1
    +2
    +3
    +4
    +5
    SELECT COALESCE(NULL,'Hello World');
    +   coalesce    
    +---------------
    + Hello World
    +(1 row)
    +
    + +
    +
  • NULLIF

    Figure 4 shows the syntax of a NULLIF expression.

    +
    Figure 4 nullif::=
    +

    Only if value1 is equal to value2 can NULLIF return the NULL value. Otherwise, value1 is returned.

    +

    Examples

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    CREATE TABLE tpcds.null_if_t1 (
    +    NI_VALUE1 VARCHAR(10),
    +    NI_VALUE2 VARCHAR(10)
    +)  DISTRIBUTE BY HASH (NI_VALUE1);
    +
    +INSERT INTO tpcds.null_if_t1 VALUES('abc', 'abc');
    +INSERT INTO tpcds.null_if_t1 VALUES('abc', 'efg');
    +
    +SELECT NI_VALUE1, NI_VALUE2, NULLIF(NI_VALUE1, NI_VALUE2) FROM tpcds.null_if_t1 ORDER BY 1, 2, 3;
    +
    + ni_value1 | ni_value2 | nullif 
    +-----------+-----------+--------
    + abc       | abc       | 
    + abc       | efg       | abc
    +(2 rows)
    +DROP TABLE tpcds.null_if_t1;
    +
    + +
    +

    If value1 is equal to value2, NULL is returned. Otherwise, value1 is returned.

    +
    1
    +2
    +3
    +4
    +5
    SELECT NULLIF('Hello','Hello World');
    + nullif 
    +--------
    + Hello
    +(1 row)
    +
    + +
    +
  • GREATEST (maximum value) and LEAST (minimum value)

    Figure 5 shows the syntax of a GREATEST expression.

    +
    Figure 5 greatest::=
    +

    You can select the maximum value from any numerical expression list.

    +
    1
    +2
    +3
    +4
    +5
    SELECT greatest(9000,155555,2.01);
    + greatest 
    +----------
    +   155555
    +(1 row)
    +
    + +
    +

    Figure 6 shows the syntax of a LEAST expression.

    +
    Figure 6 least::=
    +

    You can select the minimum value from any numerical expression list.

    +

    Each of the preceding numeric expressions can be converted into a common data type, which will be the data type of the result.

    +

    The NULL values in the list will be ignored. The result is NULL only if the results of all expressions are NULL.

    +
    1
    +2
    +3
    +4
    +5
    SELECT least(9000,2);
    + least 
    +-------
    +     2
    +(1 row)
    +
    + +
    +

    Conditional Expression Functions describes the examples.

    +
  • NVL

    Figure 7 shows the syntax of an NVL expression.

    +
    Figure 7 nvl::=
    +

    If the value of value1 is NULL, value2 is returned. Otherwise, value1 is returned.

    +

    For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT nvl(null,1);
    +NVL 
    +-----
    + 1
    +(1 row)
    +
    + +
    +
    1
    +2
    +3
    +4
    +5
    SELECT nvl ('Hello World' ,1);
    +      nvl      
    +---------------
    + Hello World
    +(1 row)
    +
    + +
    +
  • IF

    Figure 8 shows the syntax of an IF expression.

    +
    Figure 8 if::=
    +

    If the value of bool_expr is true, expr1 is returned. Otherwise, expr2 is returned.

    +

    Conditional Expression Functions describes the examples.

    +
  • IFNULL

    Figure 9 shows the syntax of a NULLIF expression.

    +
    Figure 9 ifnull::=
    +

    Only if value1 is equal to value2 can NULLIF return the NULL value. Otherwise, value1 is returned.

    +

    Conditional Expression Functions describes the examples.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0072.html b/docs/dws/dev/dws_06_0072.html new file mode 100644 index 00000000..41294038 --- /dev/null +++ b/docs/dws/dev/dws_06_0072.html @@ -0,0 +1,176 @@ + + +

Subquery Expressions

+

Subquery expressions include the following types:

+
  • EXISTS/NOT EXISTS

    Figure 1 shows the syntax of an EXISTS/NOT EXISTS expression.

    +
    Figure 1 EXISTS/NOT EXISTS::=
    +

    The parameter of an EXISTS expression is an arbitrary SELECT statement, or subquery. The subquery is evaluated to determine whether it returns any rows. If it returns at least one row, the result of EXISTS is "true". If the subquery returns no rows, the result of EXISTS is "false".

    +

    The subquery will generally only be executed long enough to determine whether at least one row is returned, not all the way to completion.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    SELECT sr_reason_sk,sr_customer_sk FROM tpcds.store_returns WHERE EXISTS (SELECT d_dom FROM tpcds.date_dim WHERE d_dom = store_returns.sr_reason_sk and sr_customer_sk <10);
    +sr_reason_sk | sr_customer_sk 
    +--------------+----------------
    +           13 |              2
    +           22 |              5
    +           17 |              7
    +           25 |              7
    +            3 |              7
    +           31 |              5
    +            7 |              7
    +           14 |              6
    +           20 |              4
    +            5 |              6
    +           10 |              3
    +            1 |              5
    +           15 |              2
    +            4 |              1
    +           26 |              3
    +(15 rows)
    +
    + +
    +
  • IN/NOT IN

    Figure 2 shows the syntax of an IN/NOT IN expression.

    +
    Figure 2 IN/NOT IN::=
    +

    The right-hand side is a parenthesized subquery, which must return exactly one column. The left-hand expression is evaluated and compared to each row of the subquery result. The result of IN is "true" if any equal subquery row is found. The result is "false" if no equal row is found (including the case where the subquery returns no rows).

    +

    This is in accordance with SQL's normal rules for Boolean combinations of null values. If the columns corresponding to two rows equal and are not empty, the two rows are equal to each other. If any columns corresponding to the two rows do not equal and are not empty, the two rows are not equal to each other. Otherwise, the result is NULL. If there are no equal right-hand values and at least one right-hand row yields null, the result of IN will be null, not false.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
     SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk IN (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10);
    +sr_reason_sk | sr_customer_sk 
    +--------------+----------------
    +           10 |              3
    +           26 |              3
    +           22 |              5
    +           31 |              5
    +            1 |              5
    +           32 |              5
    +           32 |              5
    +            4 |              1
    +           15 |              2
    +           13 |              2
    +           33 |              4
    +           20 |              4
    +           33 |              8
    +            5 |              6
    +           14 |              6
    +           17 |              7
    +            3 |              7
    +           25 |              7
    +            7 |              7
    +(19 rows)
    +
    + +
    +
  • ANY/SOME

    Figure 3 shows the syntax of an ANY/SOME expression.

    +
    Figure 3 any/some::=
    +

    The right-hand side is a parenthesized subquery, which must return exactly one column. The left-hand expression is evaluated and compared to each row of the subquery result using the given operator, which must yield a Boolean result. The result of ANY is "true" if any true result is obtained. The result is "false" if no true result is found (including the case where the subquery returns no rows). SOME is a synonym of ANY. IN can be equivalently replaced with ANY.

    +

    For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk < ANY (SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10);
    +sr_reason_sk | sr_customer_sk 
    +--------------+----------------
    +           26 |              3
    +           17 |              7
    +           32 |              5
    +           32 |              5
    +           13 |              2
    +           31 |              5
    +           25 |              7
    +            5 |              6
    +            7 |              7
    +           10 |              3
    +            1 |              5
    +           14 |              6
    +            4 |              1
    +            3 |              7
    +           22 |              5
    +           33 |              4
    +           20 |              4
    +           33 |              8
    +           15 |              2
    +(19 rows)
    +
    + +
    +
  • ALL

    Figure 4 shows the syntax of an ALL expression.

    +
    Figure 4 all::=
    +

    The right-hand side is a parenthesized subquery, which must return exactly one column. The left-hand expression is evaluated and compared to each row of the subquery result using the given operator, which must yield a Boolean result. The result of ALL is "true" if all rows yield true (including the case where the subquery returns no rows). The result is "false" if any false result is found.

    +

    Example:

    +
    1
    +2
    +3
    +4
    SELECT sr_reason_sk,sr_customer_sk  FROM tpcds.store_returns WHERE sr_customer_sk < all(SELECT d_dom FROM tpcds.date_dim WHERE d_dom < 10);
    + sr_reason_sk | sr_customer_sk 
    +--------------+----------------
    +(0 rows)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0073.html b/docs/dws/dev/dws_06_0073.html new file mode 100644 index 00000000..36195349 --- /dev/null +++ b/docs/dws/dev/dws_06_0073.html @@ -0,0 +1,96 @@ + + +

Array Expressions

+

IN

expression IN (value [, ...])

+

The parentheses on the right contain an expression list. The expression result on the left is compared with the content in the expression list. If the content in the list meets the expression result on the left, the result of IN is true. If no result meets the requirements, the result of IN is false.

+

Example:

+
1
+2
+3
+4
+5
SELECT 8000+500 IN (10000, 9000) AS RESULT;
+  result 
+----------
+ f
+(1 row)
+
+ +
+
+

If the expression result is null or the expression list does not meet the expression conditions and at least one empty value is returned for the expression list on the right, the result of IN is null rather than false. This method is consistent with the Boolean rules used when SQL statements return empty values.

+
+

NOT IN

expression NOT IN (value [, ...])

+

The parentheses on the right contain an expression list. The expression result on the left is compared with the content in the expression list. If the content in the list does not meet the expression result on the left, the result of NOT IN is true. If any content meets the expression result, the result of NOT IN is false.

+

Example:

+
1
+2
+3
+4
+5
SELECT 8000+500 NOT IN (10000, 9000) AS RESULT;
+  result 
+----------
+ t
+(1 row)
+
+ +
+

If the query statement result is null or the expression list does not meet the expression conditions and at least one empty value is returned for the expression list on the right, the result of NOT IN is null rather than false. This method is consistent with the Boolean rules used when SQL statements return empty values.

+
+

In all situations, X NOT IN Y equals to NOT(X IN Y).

+
+

ANY/SOME (array)

expression operator ANY (array expression)

+

expression operator SOME (array expression)

+
1
+2
+3
+4
+5
SELECT 8000+500 < SOME (array[10000,9000]) AS RESULT;
+  result 
+----------
+ t
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT 8000+500 < ANY (array[10000,9000]) AS RESULT;
+  result 
+----------
+ t
+(1 row)
+
+ +
+

The parentheses on the right contain an array expression, which must generate an array value. The result of the expression on the left uses operators to compute and compare the results in each row of the array expression. The comparison result must be a Boolean value.

+
  • If at least one comparison result is true, the result of ANY is true.
  • If no comparison result is true, the result of ANY is false.
+

If no comparison result is true and the array expression generates at least one null value, the value of ANY is NULL, rather than false. This method is consistent with the Boolean rules used when SQL statements return empty values.

+
+

SOME is a synonym of ANY.

+
+

ALL (array)

expression operator ALL (array expression)

+

The parentheses on the right contain an array expression, which must generate an array value. The result of the expression on the left uses operators to compute and compare the results in each row of the array expression. The comparison result must be a Boolean value.

+
  • The result of ALL is "true" if all comparisons yield true (including the case where the array has zero elements).
  • The result is false if any false result is found.
+

If the array expression yields a null array, the result of ALL will be null. If the left-hand expression yields null, the result of ALL is ordinarily null (though a non-strict comparison operator could possibly yield a different result). Also, if the right-hand array contains any null elements and no false comparison result is obtained, the result of ALL will be null, not true (again, assuming a strict comparison operator). This method is consistent with the Boolean rules used when SQL statements return empty values.

+
1
+2
+3
+4
+5
SELECT 8000+500 < ALL (array[10000,9000]) AS RESULT;
+  result
+----------
+ t
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0074.html b/docs/dws/dev/dws_06_0074.html new file mode 100644 index 00000000..7c83ecdb --- /dev/null +++ b/docs/dws/dev/dws_06_0074.html @@ -0,0 +1,28 @@ + + +

Row Expressions

+

Syntax:

+

row_constructor operator row_constructor

+

Both sides of the row expression are row constructors. The values of both rows must have the same number of fields and they are compared with each other. The row comparison allows operators including =, <>, <, <=, and >= or a similar operator.

+

The use of operators =<> is slightly different from other operators. If all fields of two rows are not empty and equal, the two rows are equal. If any field in two rows is not empty and not equal, the two rows are not equal. Otherwise, the comparison result is null.

+

For operators <, <=, >, and > =, the fields in rows are compared from left to right until a pair of fields that are not equal or are empty are detected. If the pair of fields contains at least one null value, the comparison result is null. Otherwise, the comparison result of this pair of fields is the final result.

+

For example:

+
1
+2
+3
+4
+5
SELECT ROW(1,2,NULL) < ROW(1,3,0) AS RESULT;
+  result
+----------
+ t
+(1 row)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0075.html b/docs/dws/dev/dws_06_0075.html new file mode 100644 index 00000000..7963fd78 --- /dev/null +++ b/docs/dws/dev/dws_06_0075.html @@ -0,0 +1,23 @@ + + +

Type Conversion

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0076.html b/docs/dws/dev/dws_06_0076.html new file mode 100644 index 00000000..c5bb738f --- /dev/null +++ b/docs/dws/dev/dws_06_0076.html @@ -0,0 +1,66 @@ + + +

Overview

+

Context

SQL is a typed language. That is, every data item has an associated data type which determines its behavior and allowed usage. GaussDB(DWS) has an extensible type system that is more general and flexible than other SQL implementations. Hence, most type conversion behavior in GaussDB(DWS) is governed by general rules. This allows the use of mixed-type expressions.

+

The GaussDB(DWS) scanner/parser divides lexical elements into five fundamental categories: integers, floating-point numbers, strings, identifiers, and keywords. Constants of most non-numeric types are first classified as strings. The SQL language definition allows specifying type names with constant strings. For example, the query:

+
1
+2
+3
+4
+5
SELECT text 'Origin' AS "label", point '(0,0)' AS "value";
+ label  | value
+--------+-------
+ Origin | (0,0)
+(1 row)
+
+ +
+

has two literal constants, of type text and point. If a type is not specified for a string literal, then the placeholder type unknown is assigned initially.

+

There are four fundamental SQL constructs requiring distinct type conversion rules in the GaussDB(DWS) parser:

+
  • Function calls

    Much of the SQL type system is built around a rich set of functions. Functions can have one or more arguments. Since SQL permits function overloading, the function name alone does not uniquely identify the function to be called. The parser must select the right function based on the data types of the supplied arguments.

    +
  • Operators

    SQL allows expressions with prefix and postfix unary (one-argument) operators, as well as binary (two-argument) operators. Like functions, operators can be overloaded, so the same problem of selecting the right operator exists.

    +
  • Value Storage

    SQL INSERT and UPDATE statements place the results of expressions into a table. The expressions in the statement must be matched up with, and perhaps converted to, the types of the target columns.

    +
  • UNION, CASE, and related constructs

    Since all query results from a unionized SELECT statement must appear in a single set of columns, the types of the results of each SELECT clause must be matched up and converted to a uniform set. Similarly, the result expressions of a CASE construct must be converted to a common type so that the CASE expression as a whole has a known output type. The same holds for ARRAY constructs, and for the GREATEST and LEAST functions.

    +
+

The system catalog pg_cast stores information about which conversions, or casts, exist between which data types, and how to perform those conversions. For details, see PG_CAST.

+

The return type and conversion behavior of an expression are determined during semantic analysis. Data types are divided into several basic type categories, including boolean, numeric, string, bitstring, datetime, timespan, geometric, and network. Within each category there can be one or more preferred types, which are preferred when there is a choice of possible types. With careful selection of preferred types and available implicit casts, it is possible to ensure that ambiguous expressions (those with multiple candidate parsing solutions) can be resolved in a useful way.

+

All type conversion rules are designed based on the following principles:

+
  • Implicit conversions should never have surprising or unpredictable outcomes.
  • There should be no extra overhead in the parser or executor if a query does not need implicit type conversion. That is, if a query is well-formed and the types already match, then the query should execute without spending extra time in the parser and without introducing unnecessary implicit conversion calls in the query.
  • Additionally, if a query usually requires an implicit conversion for a function, and if then the user defines a new function with the correct argument types, the parser should use this new function.
+
+

Converting Empty Strings to Numeric Values in TD-Compatible Mode

  • Different from the Oracle database, which processes an empty string as NULL, Teradata database converts an empty string to 0 by default. Therefore, when an empty string is queried, value 0 is found. Similarly, in TD-compatible mode, the empty string is converted to 0 of the corresponding numeric type by default. In addition, '-', '+', and ' ' are converted to 0 by default in TD-compatible mode, but an error is reported for a decimal point string. Example:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    create table t1(no int,col varchar);
    +insert into t1 values(1,'');
    +insert into t1 values(2,null);
    +select * from t1 where col is null;
    + no | col
    +----+-----
    +  2 |
    +(1 row)
    +select * from t1 where col='';
    + no | col
    +----+-----
    + 1 |
    +(1 row)
    +
    + +
    +
  • The method of converting an empty string into a numeric value in MySQL-compatible mode is the same as that in TD-compatible mode.
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0077.html b/docs/dws/dev/dws_06_0077.html new file mode 100644 index 00000000..107367f4 --- /dev/null +++ b/docs/dws/dev/dws_06_0077.html @@ -0,0 +1,97 @@ + + +

Operators

+

Operator Type Resolution

  1. Select the operators to be considered from the pg_operator system catalog. Considered operators are those with the matching name and argument count. If the search path finds multiple available operators, only the most suitable one is considered.
  2. Look for the best match.
    1. Discard candidate operators for which the input types do not match and cannot be converted (using an implicit conversion) to match. unknown literals are assumed to be convertible to anything for this purpose. If only one candidate remains, use it; else continue to the next step.

      +
    2. Run through all candidates and keep those with the most exact matches on input types. Domains are considered the same as their base type for this purpose. Keep all candidates if there are no exact matches. If only one candidate remains, use it; else continue to the next step.

      +
    3. Run through all candidates and keep those that accept preferred types (of the input data type's type category) at the most positions where type conversion will be required. Keep all candidates if none accepts preferred types. If only one candidate remains, use it; else continue to the next step.

      +
    4. If any input arguments are of unknown types, check the type categories accepted at those argument positions by the remaining candidates. At each position, select the string category if any candidate accepts that category. (This bias towards string is appropriate since an unknown-type literal looks like a string.) Otherwise, if all the remaining candidates accept the same type category, select that category; otherwise fail because the correct choice cannot be deduced without more clues. Now discard candidates that do not accept the selected type category. Furthermore, if any candidate accepts a preferred type in that category, discard candidates that accept non-preferred types for that argument. Keep all candidates if none survives these tests. If only one candidate remains, use it; else continue to the next step.

      +
    5. If there are both unknown and known-type arguments, and all the known-type arguments have the same type, assume that the unknown arguments are also of that type, and check which candidates can accept that type at the unknown-argument positions. If exactly one candidate passes this test, use it. Otherwise, an error is reported.

      +
    +
+
+

Examples

Example 1: factorial operator type resolution. There is only one factorial operator (postfix !) defined in the system catalog, and it takes an argument of type bigint. The scanner assigns an initial type of bigint to the argument in this query expression:

+
1
+2
+3
+4
+5
+6
SELECT 40 ! AS "40 factorial";
+
+                   40 factorial
+--------------------------------------------------
+ 815915283247897734345611269596115894272000000000
+(1 row)
+
+ +
+

So the parser does a type conversion on the operand and the query is equivalent to:

+
1
SELECT CAST(40 AS bigint) ! AS "40 factorial";
+
+ +
+

Example 2: string concatenation operator type resolution. A string-like syntax is used for working with string types and for working with complex extension types. Strings with unspecified type are matched with likely operator candidates. An example with one unspecified argument:

+
1
+2
+3
+4
+5
SELECT text 'abc' || 'def' AS "text and unknown";
+ text and unknown
+------------------
+ abcdef
+(1 row)
+
+ +
+

In this example, the parser looks for an operator whose parameters are of the text type. Such an operator is found.

+

Here is a concatenation of two values of unspecified types:

+
1
+2
+3
+4
+5
SELECT 'abc' || 'def' AS "unspecified";
+ unspecified
+-------------
+ abcdef
+(1 row)
+
+ +
+

In this case there is no initial hint for which type to use, since no types are specified in the query. So, the parser looks for all candidate operators and finds that there are candidates accepting both string-category and bit-string-category inputs. Since string category is preferred when available, that category is selected, and then the preferred type for strings, text, is used as the specific type to resolve the unknown-type literals.

+
+

Example 3: absolute-value and negation operator type resolution. The GaussDB(DWS) operator catalog has several entries for the prefix operator @. All the entries implement absolute-value operations for various numeric data types. One of these entries is for type float8, which is the preferred type in the numeric category. Therefore, GaussDB(DWS) will use that entry when faced with an unknown input:

+
1
+2
+3
+4
+5
SELECT @ '-4.5' AS "abs";
+ abs
+-----
+ 4.5
+(1 row)
+
+ +
+

Here the system has implicitly resolved the unknown-type literal as type float8 before applying the chosen operator.

+

Example 4: array inclusion operator type resolution. The following is an example of resolving an operator with one known and one unknown input:

+
1
+2
+3
+4
+5
SELECT array[1,2] <@ '{1,2,3}' as "is subset";
+ is subset
+-----------
+ t
+(1 row)
+
+ +
+

In the pg_operator table of GaussDB(DWS), several entries correspond to the infix operator <@, but the only two that may accept an integer array on the left-hand side are array inclusion (anyarray <@ anyarray) and range inclusion (anyelement <@ anyrange). Because none of these polymorphic pseudo-types (see Pseudo-Types) is considered preferred, the parser cannot resolve the ambiguity on that basis. However, 2.e tells it to assume that the unknown-type literal is of the same type as the other input, that is, integer array. Now only one of the two operators can match, so array inclusion is selected. (If you select range inclusion, an error will be reported because the string does not have the right format to be a range literal.)

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0078.html b/docs/dws/dev/dws_06_0078.html new file mode 100644 index 00000000..73907024 --- /dev/null +++ b/docs/dws/dev/dws_06_0078.html @@ -0,0 +1,97 @@ + + +

Functions

+

Function Type Resolution

  1. Select the functions to be considered from the pg_proc system catalog. If a non-schema-qualified function name was used, the functions in the current search path are considered. If a qualified function name was given, only functions in the specified schema are considered.

    If the search path finds multiple functions of different argument types, a proper function in the path is considered.

    +
  2. Check for a function accepting exactly the input argument types. If the function exists, use it. Cases involving unknown will never find a match at this step.
  3. If no exact match is found, see if the function call appears to be a special type conversion request.
  4. Look for the best match.
    1. Discard candidate functions for which the input types do not match and cannot be converted (using an implicit conversion) to match. unknown literals are assumed to be convertible to anything for this purpose. If only one candidate remains, use it; else continue to the next step.
    2. Run through all candidates and keep those with the most exact matches on input types. Domains are considered the same as their base type for this purpose. Keep all candidates if none has exact matches. If only one candidate remains, use it; else continue to the next step.
    3. Run through all candidates and keep those that accept preferred types at the most positions where type conversion will be required. Keep all candidates if none accepts preferred types. If only one candidate remains, use it; else continue to the next step.
    4. If any input arguments are of unknown types, check the type categories accepted at those argument positions by the remaining candidates. At each position, select the string category if any candidate accepts that category. (This bias towards string is appropriate since an unknown-type literal looks like a string.) Otherwise, if all the remaining candidates accept the same type category, select that category; otherwise fail because the correct choice cannot be deduced without more clues. Now discard candidates that do not accept the selected type category. Furthermore, if any candidate accepts a preferred type in that category, discard candidates that accept non-preferred types for that argument. Keep all candidates if none survives these tests. If only one candidate remains, use it; else continue to the next step.
    5. If there are both unknown and known-type arguments, and all the known-type arguments have the same type, assume that the unknown arguments are also of that type, and check which candidates can accept that type at the unknown-argument positions. If exactly one candidate passes this test, use it. Otherwise, fail.
    +
+
+

Examples

Example 1: Use the rounding function argument type resolution as the first example. There is only one round function that takes two arguments; it takes a first argument of type numeric and a second argument of type integer. So the following query automatically converts the first argument of type integer to numeric:

+
1
+2
+3
+4
+5
SELECT round(4, 4);
+ round
+--------
+ 4.0000
+(1 row)
+
+ +
+

That query is converted by the parser to:

+
1
SELECT round(CAST (4 AS numeric), 4);
+
+ +
+

Since numeric constants with decimal points are initially assigned the type numeric, the following query will require no type conversion and therefore might be slightly more efficient:

+
1
SELECT round(4.0, 4);
+
+ +
+

Example 2: Use the substring function type resolution as the second example. There are several substr functions, one of which takes types text and integer. If called with a string constant of unspecified type, the system chooses the candidate function that accepts an argument of the preferred category string (namely of type text).

+
1
+2
+3
+4
+5
SELECT substr('1234', 3);
+ substr
+--------
+     34
+(1 row)
+
+ +
+

If the string is declared to be of type varchar, as might be the case if it comes from a table, then the parser will try to convert it to become text:

+
1
+2
+3
+4
+5
SELECT substr(varchar '1234', 3);
+ substr
+--------
+     34
+(1 row)
+
+ +
+

This is transformed by the parser to effectively become:

+
1
SELECT substr(CAST (varchar '1234' AS text), 3);
+
+ +
+

The parser learns from the pg_cast catalog that text and varchar are binary-compatible, meaning that one can be passed to a function that accepts the other without doing any physical conversion. Therefore, no type conversion is inserted in this case.

+
+

And, if the function is called with an argument of type integer, the parser will try to convert that to text:

+
1
+2
+3
+4
+5
SELECT substr(1234, 3);
+substr
+--------
+ 34
+(1 row)
+
+ +
+

This is transformed by the parser to effectively become:

+
1
+2
+3
+4
+5
SELECT substr(CAST (1234 AS text), 3);
+ substr
+--------
+     34
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0079.html b/docs/dws/dev/dws_06_0079.html new file mode 100644 index 00000000..390fd158 --- /dev/null +++ b/docs/dws/dev/dws_06_0079.html @@ -0,0 +1,54 @@ + + +

Value Storage

+

Value Storage Type Resolution

  1. Search for an exact match with the target column.
  2. Try to convert the expression to the target type. This will succeed if there is a registered cast between the two types. If the expression is an unknown-type literal, the content of the literal string will be fed to the input conversion routine for the target type.
  3. Check to see if there is a sizing cast for the target type. A sizing cast is a cast from that type to itself. If one is found in the pg_cast catalog, apply it to the expression before storing into the destination column. The implementation function for such a cast always takes an extra parameter of type integer. The parameter receives the destination column's atttypmod value (typically its declared length, although the interpretation of atttypmod varies for different data types), and may take a third boolean parameter that says whether the cast is explicit or implicit. The cast function is responsible for applying any length-dependent semantics such as size checking or truncation.
+
+

Examples

Use the character storage type conversion as an example. For a target column declared as character(20) the following statement shows that the stored value is sized correctly:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE x1
+(
+    customer_sk             integer,
+    customer_id             char(20),
+    first_name              char(6),
+    last_name               char(8)
+)
+with (orientation = column,compression=middle)
+distribute by hash (last_name);
+
+INSERT INTO x1(customer_sk, customer_id, first_name) VALUES (3769, 'abcdef', 'Grace');
+
+SELECT customer_id, octet_length(customer_id) FROM x1;
+     customer_id      | octet_length 
+----------------------+--------------
+ abcdef               |           20
+(1 row)
+DROP TABLE x1;
+
+ +
+
+

What has really happened here is that the two unknown literals are resolved to text by default, allowing the || operator to be resolved as text concatenation. Then the text result of the operator is converted to bpchar ("blank-padded char", the internal name of the character data type) to match the target column type. Since the conversion from text to bpchar is binary-coercible, this conversion does not insert any real function call. Finally, the sizing function bpchar(bpchar, integer, boolean) is found in the system catalog and used for the operator's result and the stored column length. This type-specific function performs the required length check and addition of padding spaces.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0080.html b/docs/dws/dev/dws_06_0080.html new file mode 100644 index 00000000..9577293b --- /dev/null +++ b/docs/dws/dev/dws_06_0080.html @@ -0,0 +1,169 @@ + + +

UNION, CASE, and Related Constructs

+

SQL UNION constructs must match up possibly dissimilar types to become a single result set. Since all query results from a SELECT UNION statement must appear in a single set of columns, the types of the results of each SELECT clause must be matched up and converted to a uniform set. Similarly, the result expressions of a CASE construct must be converted to a common type so that the CASE expression as a whole has a known output type. The same holds for ARRAY constructs, and for the GREATEST and LEAST functions.

+

Type Resolution for UNION, CASE, and Related Constructs

  • If all inputs are of the same type, and it is not unknown, resolve as that type.
  • If all inputs are of type unknown, resolve as type text (the preferred type of the string category). Otherwise, unknown inputs are ignored.
  • If the non-unknown inputs are not all of the same type category, fail. (Type unknown is not included.)
  • If the non-unknown inputs are all of the same type category, choose the first non-unknown input type which is a preferred type in that category, if there is one. (Exception: The UNION operation regards the type of the first branch as the selected type.)

    typcategory in the pg_type system catalog indicates the data type category. typispreferred indicates whether a type is preferred in typcategory.

    +
    +
  • All the input is converted to the selected type. (The original length of a string is retained). Fail if there is not an implicit conversion from a given input to the selected type.
  • If the input contains the json, txid_snapshot, sys_refcursor, or geometry type, UNION cannot be performed.
+
+

Type Resolution for CASE, COALESCE, IF, and IFNULL in TD-Compatible Mode

  • If all inputs are of the same type, and it is not unknown, resolve as that type.
  • If all inputs are of type unknown, resolve as type text.
  • If inputs are of string type (including unknown which is resolved as type text) and digit type, resolve as the string type. If the inputs are not of the two types, fail.
  • If the non-unknown inputs are all of the same type category, choose the input type which is a preferred type in that category, if there is one.
  • Convert all inputs to the selected type. Fail if there is not an implicit conversion from a given input to the selected type.
+
+

Type Resolution for CASE, COALESCE, IF, and IFNULL in MySQL-Compatible Mode

  • If all inputs are of the same type, and it is not unknown, resolve as that type.
  • If all inputs are of type unknown, resolve as type text.
  • If some inputs are of type unknown and the others are of a non-unknown type, resolve as that non-unknown type.
  • If the inputs are of different non-unknown types, treat type enum as type text for comparison.
  • If the non-unknown inputs are all of the same type, choose a preferred type, if there is one. If the inputs are of different types, resolve as type text.
  • Convert all inputs to the selected type. Fail if there is not an implicit conversion from a given input to the selected type.
+
+

Examples

Example 1: Use type resolution with unknown types in a union as the first example. Here, the unknown-type literal 'b' will be resolved to type text.

+
1
+2
+3
+4
+5
+6
SELECT text 'a' AS "text" UNION SELECT 'b';
+ text
+------
+ a
+ b
+(2 rows)
+
+ +
+

Example 2: Use type resolution in a simple union as the second example. The literal 1.2 is of type numeric, and the integer value 1 can be cast implicitly to numeric, so that type is used.

+
1
+2
+3
+4
+5
+6
SELECT 1.2 AS "numeric" UNION SELECT 1;
+ numeric
+---------
+       1
+     1.2
+(2 rows)
+
+ +
+

Example 3: Use type resolution in a transposed union as the third example. Here, since type real cannot be implicitly cast to integer, but integer can be implicitly cast to real, the union result type is resolved as real.

+
1
+2
+3
+4
+5
+6
SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);
+ real
+------
+    1
+  2.2
+(2 rows)
+
+ +
+

Example 4: Use type resolution in the COALESCE function with input values of types int and varchar as the fourth example. Type resolution fails in ORA-compatible mode. The types are resolved as type varchar in TD-compatible mode, and as type text in MySQL-compatible mode.

+

Create the ora_db, td_db, and mysql_db databases by setting dbcompatibility to ORA, TD, and MySQL, respectively.

+
1
+2
+3
CREATE DATABASE ora_db dbcompatibility = 'ORA';
+CREATE DATABASE td_db dbcompatibility = 'TD';
+CREATE DATABASE mysql_db dbcompatibility = 'MySQL';
+
+ +
+
  • Switch to the ora_db database.
    1
    gaussdb=# \c ora_db
    +
    + +
    +

    Create table t1. Show the execution plan of a statement for querying the types int and varchar of input parameters for COALESCE.

    +
    1
    +2
    +3
    +4
    ora_db=# CREATE TABLE t1(a int, b varchar(10));      
    +ora_db=# EXPLAIN SELECT coalesce(a, b) FROM t1;
    +ERROR:  COALESCE types integer and character varying cannot be matched
    +CONTEXT:  referenced column: coalesce
    +
    + +
    +
  • Switch to the td_db database.
    1
    ora_db=# \c td_db
    +
    + +
    +

    Create table t2. Show the execution plan of a statement for querying the types int and varchar of input parameters for COALESCE.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    td_db=# CREATE TABLE t2(a int, b varchar(10));
    +td_db=# EXPLAIN VERBOSE select coalesce(a, b) from t2;
    +                                          QUERY PLAN
    +-----------------------------------------------------------------------------------------------
    +  id |                  operation                   | E-rows | E-distinct | E-width | E-costs
    + ----+----------------------------------------------+--------+------------+---------+---------
    +   1 | ->  Data Node Scan on "__REMOTE_FQS_QUERY__" |      0 |            |       0 | 0.00
    +
    +                       Targetlist Information (identified by plan id)
    + -------------------------------------------------------------------------------------------
    +   1 --Data Node Scan on "__REMOTE_FQS_QUERY__"
    +         Output: (COALESCE((t2.a)::character varying, t2.b))
    +         Node/s: All datanodes
    +         Remote query: SELECT COALESCE(a::character varying, b) AS "coalesce" FROM public.t2
    +(10 rows)
    +
    + +
    +
  • Switch to the mysql_db database.
    1
    td_db=# \c mysql_db
    +
    + +
    +

    Create table t3. Show the execution plan of a statement for querying the types int and varchar of input parameters for COALESCE.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    mysql_db=# CREATE TABLE t3(a int, b varchar(10));
    +mysql_db=# EXPLAIN VERBOSE select coalesce(a, b) from t3;
    +                                          QUERY PLAN
    +-----------------------------------------------------------------------------------------------
    +  id |                  operation                   | E-rows | E-distinct | E-width | E-costs
    + ----+----------------------------------------------+--------+------------+---------+---------
    +   1 | ->  Data Node Scan on "__REMOTE_FQS_QUERY__" |      0 |            |       0 | 0.00
    +
    +                    Targetlist Information (identified by plan id)
    + ------------------------------------------------------------------------------------
    +   1 --Data Node Scan on "__REMOTE_FQS_QUERY__"
    +         Output: (COALESCE((t3.a)::text, (t3.b)::text))
    +         Node/s: All datanodes
    +         Remote query: SELECT COALESCE(a::text, b::text) AS "coalesce" FROM public.t3
    +(10 rows)
    +
    + +
    +
  • Switch to the gaussdb database.
    1
    mysql_db=# \c gaussdb
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0081.html b/docs/dws/dev/dws_06_0081.html new file mode 100644 index 00000000..592d5a37 --- /dev/null +++ b/docs/dws/dev/dws_06_0081.html @@ -0,0 +1,31 @@ + + +

Full Text Search

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0082.html b/docs/dws/dev/dws_06_0082.html new file mode 100644 index 00000000..3ec84e65 --- /dev/null +++ b/docs/dws/dev/dws_06_0082.html @@ -0,0 +1,21 @@ + + +

Introduction

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0083.html b/docs/dws/dev/dws_06_0083.html new file mode 100644 index 00000000..f4af52f3 --- /dev/null +++ b/docs/dws/dev/dws_06_0083.html @@ -0,0 +1,27 @@ + + +

Full-Text Retrieval

+

Textual search operators have been used in databases for years. GaussDB(DWS) has ~, ~*, LIKE, and ILIKE operators for textual data types, but they lack many essential properties required by modern information systems. They can be supplemented by indexes and dictionaries.

+

The hybrid data warehouse (standalone) does not support full-text search.

+
+
Text search lacks the following essential properties required by information systems:
  • There is no linguistic support, even for English.

    Regular expressions are not sufficient because they cannot easily handle derived words. For example, you might miss documents that contain satisfies, although you probably would like to find them when searching for satisfy. It is possible to use OR to search for multiple derived forms, but this is tedious and error-prone, because some words can have several thousand derivatives.

    +
+
  • They provide no ordering (ranking) of search results, which makes them ineffective when thousands of matching documents are found.
+
  • They tend to be slow because there is no index support, so they must process all documents for every search.
+
+
Full text indexing allows documents to be preprocessed and an index is saved for later rapid searching. Preprocessing includes:
  • Parsing documents into tokens

    It is useful to identify various classes of tokens, for example, numbers, words, complex words, and email addresses, so that they can be processed differently. In principle, token classes depend on the specific application, but for most purposes it is adequate to use a predefined set of classes.

    +
  • Converting tokens into lexemes

    A lexeme is a string, just like a token, but it has been normalized so that different forms of the same word are made alike. For example, normalization almost always includes folding upper-case letters to lower-case, and often involves removal of suffixes (such as s or es in English) This allows searches to find variant forms of the same word, without tediously entering all the possible variants. Also, this step typically eliminates stop words, which are words that are so common that they are useless for searching. (In short, tokens are raw fragments of the document text, while lexemes are words that are believed useful for indexing and searching.) GaussDB(DWS) uses dictionaries to perform this step and provides various standard dictionaries.

    +
+
  • Storing preprocessed documents optimized for searching

    For example, each document can be represented as a sorted array of normalized lexemes. Along with the lexemes, it is often desirable to store positional information for proximity ranking. Therefore, a document that contains a more "dense" region of query words is assigned with a higher rank than the one with scattered query words.

    +
+
+

Dictionaries allow fine-grained control over how tokens are normalized. With appropriate dictionaries, you can define stop words that should not be indexed.

+

A data type tsvector is provided for storing preprocessed documents, along with a type tsquery for storing query conditions. For details, see Text Search Types. For details about the functions and operators available for these data types, see Text Search Functions and Operators. The match operator @@, which is the most important among those functions and operators, is introduced in Basic Text Matching.

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0084.html b/docs/dws/dev/dws_06_0084.html new file mode 100644 index 00000000..102c22d8 --- /dev/null +++ b/docs/dws/dev/dws_06_0084.html @@ -0,0 +1,40 @@ + + +

What Is a Document?

+

A document is the unit of searching in a full text search system; for example, a magazine article or email message. The text search engine must be able to parse documents and store associations of lexemes (keywords) with their parent document. Later, these associations are used to search for documents that contain query words.

+

For searches within GaussDB(DWS), a document is normally a textual column within a row of a database table, or possibly a combination (concatenation) of such columns, perhaps stored in several tables or obtained dynamically. In other words, a document can be constructed from different parts for indexing and it might not be stored anywhere as a whole. For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
SELECT d_dow || '-' || d_dom || '-' || d_fy_week_seq  AS identify_serials FROM tpcds.date_dim WHERE d_fy_week_seq = 1;
+identify_serials 
+------------------
+ 5-6-1
+ 0-8-1
+ 2-3-1
+ 3-4-1
+ 4-5-1
+ 1-2-1
+ 6-7-1
+(7 rows) 
+
+ +
+

Actually, in these example queries, coalesce should be used to prevent a single NULL attribute from causing a NULL result for the whole document.

+
+

Another possibility is to store the documents as simple text files in the file system. In this case, the database can be used to store the full text index and to execute searches, and some unique identifier can be used to retrieve the document from the file system. However, retrieving files from outside the database requires system administrator permissions or special function support, so this is less convenient than keeping all the data inside the database. Also, keeping everything inside the database allows easy access to document metadata to assist in indexing and display.

+

For text search purposes, each document must be reduced to the preprocessed tsvector format. Searching and relevance-based ranking are performed entirely on the tsvector representation of a document. The original text is retrieved only when the document has been selected for display to a user. We therefore often speak of the tsvector as being the document, but it is only a compact representation of the full document.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0085.html b/docs/dws/dev/dws_06_0085.html new file mode 100644 index 00000000..53346915 --- /dev/null +++ b/docs/dws/dev/dws_06_0085.html @@ -0,0 +1,74 @@ + + +

Basic Text Matching

+

Full text search in GaussDB(DWS) is based on the match operator @@, which returns true if a tsvector (document) matches a tsquery (query). It does not matter which data type is written first:

+
1
+2
+3
+4
+5
SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery AS RESULT;
+ result
+----------
+ t
+(1 row)
+
+ +
+
1
+2
+3
+4
+5
SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector AS RESULT;
+ result
+----------
+ f
+(1 row) 
+
+ +
+

As the above example suggests, a tsquery is not raw text, any more than a tsvector is. A tsquery contains search terms, which must be already-normalized lexemes, and may combine multiple terms using AND, OR, and NOT operators. For details, see Text Search Types. There are functions to_tsquery and plainto_tsquery that are helpful in converting user-written text into a proper tsquery, for example by normalizing words appearing in the text. Similarly, to_tsvector is used to parse and normalize a document string. So in practice a text search match would look more like this:

+
1
+2
+3
+4
+5
SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat') AS RESULT;
+result
+----------
+ t
+(1 row)
+
+ +
+

Observe that this match would not succeed if written as follows:

+
1
+2
+3
+4
+5
SELECT 'fat cats ate fat rats'::tsvector @@ to_tsquery('fat & rat')AS RESULT;
+result
+----------
+ f
+(1 row)
+
+ +
+

In the preceding match, no normalization of the word rats will occur. Therefore, rats does not match rat.

+

The @@ operator also supports text input, allowing explicit conversion of a text string to tsvector or tsquery to be skipped in simple cases. The variants available are:

+
1
+2
+3
+4
tsvector @@ tsquery
+tsquery  @@ tsvector
+text @@ tsquery
+text @@ text
+
+ +
+

We already saw the first two of these. The form text @@ tsquery is equivalent to to_tsvector(text) @@ tsquery. The form text @@ text is equivalent to to_tsvector(text) @@ plainto_tsquery(text).

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0086.html b/docs/dws/dev/dws_06_0086.html new file mode 100644 index 00000000..c633594f --- /dev/null +++ b/docs/dws/dev/dws_06_0086.html @@ -0,0 +1,15 @@ + + +

Configurations

+

Full text search functionality includes the ability to do many more things: skip indexing certain words (stop words), process synonyms, and use sophisticated parsing, for example, parse based on more than just white space. This functionality is controlled by text search configurations. GaussDB(DWS) comes with predefined configurations for many languages, and you can easily create your own configurations. (The \dF command of gsql shows all available configurations.)

+

During installation an appropriate configuration is selected and default_text_search_config is set accordingly in postgresql.conf. If you are using the same text search configuration for the entire cluster you can use the value in postgresql.conf. To use different configurations throughout the cluster but the same configuration within any one database, use ALTER DATABASE ... SET. Otherwise, you can set default_text_search_config in each session.

+

Each text search function that depends on a configuration has an optional argument, so that the configuration to use can be specified explicitly. default_text_search_config is used only when this argument is omitted.

+

To make it easier to build custom text search configurations, a configuration is built up from simpler database objects. GaussDB(DWS)'s text search facility provides the following types of configuration-related database objects:

+
  • Text search parsers break documents into tokens and classify each token (for example, as words or numbers).
  • Text search dictionaries convert tokens to normalized form and reject stop words.
  • Text search templates provide the functions underlying dictionaries. (A dictionary simply specifies a template and a set of parameters for the template.)
  • Text search configurations select a parser and a set of dictionaries to use to normalize the tokens produced by the parser.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0087.html b/docs/dws/dev/dws_06_0087.html new file mode 100644 index 00000000..253aa20d --- /dev/null +++ b/docs/dws/dev/dws_06_0087.html @@ -0,0 +1,19 @@ + + +

Table and index

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0088.html b/docs/dws/dev/dws_06_0088.html new file mode 100644 index 00000000..c15ccbe2 --- /dev/null +++ b/docs/dws/dev/dws_06_0088.html @@ -0,0 +1,132 @@ + + +

Searching a Table

+

It is possible to do a full text search without an index.

+
  • A simple query to print each row that contains the word science in its body column is as follows:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    DROP SCHEMA IF EXISTS tsearch CASCADE;
    +
    +CREATE SCHEMA tsearch;
    +
    +CREATE TABLE tsearch.pgweb(id int, body text, title text, last_mod_date date);
    +
    +INSERT INTO tsearch.pgweb VALUES(1, 'Philology is the study of words, especially the history and development of the words in a particular language or group of languages.', 'Philology', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(2, 'Mathematics is the science that deals with the logic of shape, quantity and arrangement.', 'Mathematics', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(3, 'Computer science is the study of processes that interact with data and that can be represented as data in the form of programs.', 'Computer science', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(4, 'Chemistry is the scientific discipline involved with elements and compounds composed of atoms, molecules and ions.', 'Chemistry', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(5, 'Geography is a field of science devoted to the study of the lands, features, inhabitants, and phenomena of the Earth and planets.', 'Geography', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(6, 'History is a subject studied in schools, colleges, and universities that deals with events that have happened in the past.', 'History', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(7, 'Medical science is the science of dealing with the maintenance of health and the prevention and treatment of disease.', 'Medical science', '2010-1-1');
    +
    +INSERT INTO tsearch.pgweb VALUES(8, 'Physics is one of the most fundamental scientific disciplines, and its main goal is to understand how the universe behaves.', 'Physics', '2010-1-1');
    +
    +
    +SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector('english', body) @@ to_tsquery('english', 'science');
    + id |                                                          body                                                           |  title  
    +----+-------------------------------------------------------------------------------------------------------------------------+---------
    +  
    + 2 | Mathematics is the science that deals with the logic of shape, quantity and arrangement.                                        | Mathematics
    + 3 | Computer science is the study of processes that interact with data and that can be represented as data in the form of programs. | Computer science
    + 5 | Geography is a field of science devoted to the study of the lands, features, inhabitants, and phenomena of the Earth and planets.   | Geography
    + 7 | Medical science is the science of dealing with the maintenance of health and the prevention and treatment of disease.           | Medical science
    +(4 rows)
    +
    + +
    +

    This will also find related words, such as science, since all these are reduced to the same normalized lexeme.

    +

    The query above specifies that the english configuration is to be used to parse and normalize the strings. Alternatively we could omit the configuration parameters, and use the configuration set by default_text_search_config.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    SHOW default_text_search_config;
    + default_text_search_config 
    +----------------------------
    + pg_catalog.english
    +(1 row)
    +
    +SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector(body) @@ to_tsquery('science');
    + id |                                                          body                                                           |  title  
    +----+-------------------------------------------------------------------------------------------------------------------------+---------
    + 
    + 2 | Mathematics is the science that deals with the logic of shape, quantity and arrangement.                                        | Mathematics
    + 3 | Computer science is the study of processes that interact with data and that can be represented as data in the form of programs. | Computer science
    + 5 | Geography is a field of science devoted to the study of the lands, features, inhabitants, and phenomena of the Earth and planets.   | Geography
    + 7 | Medical science is the science of dealing with the maintenance of health and the prevention and treatment of disease.           | Medical science
    +
    +(4 rows)
    +
    + +
    +
  • A more complex example to select the ten most recent documents that contain treatment and science in the title or body column is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT title FROM tsearch.pgweb WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('treatment & science') ORDER BY last_mod_date DESC LIMIT 10;
    + title  
    +--------
    + 
    +Medical science
    +
    +(1 rows)
    +
    + +
    +

    For clarity we omitted the coalesce function calls which would be needed to find rows that contain NULL in one of the two columns.

    +

    The preceding examples show queries without using indexes. Most applications will find this approach too slow. Therefore, practical use of text searching usually requires creating an index, except perhaps for occasional ad-hoc searches.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0089.html b/docs/dws/dev/dws_06_0089.html new file mode 100644 index 00000000..897b3403 --- /dev/null +++ b/docs/dws/dev/dws_06_0089.html @@ -0,0 +1,70 @@ + + +

Creating an Index

+

You can create a GIN index to speed up text searches:

+
1
CREATE INDEX pgweb_idx_1 ON tsearch.pgweb USING gin(to_tsvector('english', body));
+
+ +
+

The to_tsvector() function accepts one or two augments.

+

If the one-augment version of the index is used, the system will use the configuration specified by default_text_search_config by default.

+

To create an index, the two-augment version must be used, or the index content may be inconsistent. Only the text search functions that specify a configuration name can be used in expression indexes. Index content is not affected by default_text_search_config, because different entries could contain tsvectors that were created with different text search configurations, and there would be no way to guess which was which. It would be impossible to dump and restore such an index correctly.

+

Because the two-argument version of to_tsvector was used in the index above, only a query reference that uses the two-argument version of to_tsvector with the same configuration name will use that index. That is, WHERE to_tsvector('english', body) @@ 'a & b' can use the index, but WHERE to_tsvector(body) @@ 'a & b' cannot. This ensures that an index will be used only with the same configuration used to create the index entries.

+

More complex expression indexes can be set up when the configuration name of the index is specified by another column. For example:

+
1
CREATE INDEX pgweb_idx_2 ON tsearch.pgweb USING gin(to_tsvector('zhparser', body));
+
+ +
+

In this example, zhparser supports only the UTF-8 or GBK database encoding format. If the SQL_ASCII encoding is used, an error will be reported.

+
+

body is a column in the pgweb table. This allows mixed configurations in the same index while recording which configuration was used for each index entry. This would be useful, for example, if the document collection contained documents in different languages. Again, queries that are meant to use the index must be phrased to match, for example, WHERE to_tsvector(config_name, body) @@ 'a & b' must match to_tsvector in the index.

+

Indexes can even concatenate columns:

+
1
CREATE INDEX pgweb_idx_3 ON tsearch.pgweb USING gin(to_tsvector('english', title || ' ' || body));
+
+ +
+

Another approach is to create a separate tsvector column to hold the output of to_tsvector. This example is a concatenation of title and body, using coalesce to ensure that one column will still be indexed when the other is NULL:

+
1
+2
ALTER TABLE tsearch.pgweb ADD COLUMN textsearchable_index_col tsvector;
+UPDATE tsearch.pgweb SET textsearchable_index_col = to_tsvector('english', coalesce(title,'') || ' ' || coalesce(body,''));
+
+ +
+

Then, create a GIN index to speed up the search:

+
1
CREATE INDEX textsearch_idx_4 ON tsearch.pgweb USING gin(textsearchable_index_col);
+
+ +
+

Now you are ready to perform a fast full text search:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
SELECT title 
+FROM tsearch.pgweb 
+WHERE textsearchable_index_col @@ to_tsquery('science & Computer') 
+ORDER BY last_mod_date DESC 
+LIMIT 10; 
+
+ title  
+--------
+ Computer science
+
+(1 rows)
+
+ +
+

One advantage of the separate-column approach over an expression index is that it is unnecessary to explicitly specify the text search configuration in queries in order to use the index. As shown in the preceding example, the query can depend on default_text_search_config. Another advantage is that searches will be faster, since it will not be necessary to redo the to_tsvector calls to verify index matches. The expression-index approach is simpler to set up, however, and it requires less disk space since the tsvector representation is not stored explicitly.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0090.html b/docs/dws/dev/dws_06_0090.html new file mode 100644 index 00000000..54f849d2 --- /dev/null +++ b/docs/dws/dev/dws_06_0090.html @@ -0,0 +1,46 @@ + + +

Constraints on Index Use

+

The following is an example of using an index. Run the following statements in a database that uses the UTF-8 or GBK encoding:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
create table table1 (c_int int,c_bigint bigint,c_varchar varchar,c_text text) with(orientation=row);
+
+create text search configuration ts_conf_1(parser=POUND);
+create text search configuration ts_conf_2(parser=POUND) with(split_flag='%');
+
+set default_text_search_config='ts_conf_1';
+create index idx1 on table1 using gin(to_tsvector(c_text));
+
+set default_text_search_config='ts_conf_2';
+create index idx2 on table1 using gin(to_tsvector(c_text));
+
+select c_varchar,to_tsvector(c_varchar) from table1 where to_tsvector(c_text) @@ plainto_tsquery('¥#@……&**') and to_tsvector(c_text) @@ 
+plainto_tsquery('Company') and c_varchar is not null order by 1 desc limit 3;
+
+ +
+

In this example, table1 has two GIN indexes created on the same column c_text, idx1 and idx2, but these two indexes are created under different settings of default_text_search_config. Differences between this example and the scenario where one table has common indexes created on the same column are as follows:

+
  • GIN indexes use different parsers (that is, different delimiters). In this case, the index data of idx1 is different from that of idx2.
  • In the specified scenario, the index data of multiple common indexes created on the same column is the same.
+

As a result, using idx1 and idx2 for the same query returns different results.

+

Constraints

In the preceding example, when:

+
+
  • Multiple GIN indexes are created on the same column of the same table.
  • The GIN indexes use different parsers (that is, different delimiters).
  • The column is used in a query, and an index scan is used in the execution plan.

    To avoid different query results caused by different GIN indexes, ensure that only one GIN index is available on a column of the physical table.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0091.html b/docs/dws/dev/dws_06_0091.html new file mode 100644 index 00000000..6ed698ab --- /dev/null +++ b/docs/dws/dev/dws_06_0091.html @@ -0,0 +1,21 @@ + + +

Controlling Text Search

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0092.html b/docs/dws/dev/dws_06_0092.html new file mode 100644 index 00000000..e6bd989c --- /dev/null +++ b/docs/dws/dev/dws_06_0092.html @@ -0,0 +1,55 @@ + + +

Parsing Documents

+

GaussDB(DWS) provides function to_tsvector for converting a document to the tsvector data type.

+
1
to_tsvector([ config regconfig, ] document text) returns tsvector
+
+ +
+

to_tsvector parses a textual document into tokens, reduces the tokens to lexemes, and returns a tsvector, which lists the lexemes together with their positions in the document. The document is processed according to the specified or default text search configuration. Here is a simple example:

+
1
+2
+3
+4
SELECT to_tsvector('english', 'a fat  cat sat on a mat - it ate a fat rats');
+                  to_tsvector
+-----------------------------------------------------
+ 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4
+
+ +
+

In the preceding example we see that the resulting tsvector does not contain the words a, on, or it, the word rats became rat, and the punctuation sign (-) was ignored.

+

The to_tsvector function internally calls a parser which breaks the document text into tokens and assigns a type to each token. For each token, a list of dictionaries is consulted. where the list can vary depending on the token type. The first dictionary that recognizes the token emits one or more normalized lexemes to represent the token. For example:

+
  • rats became rat because one of the dictionaries recognized that the word rats is a plural form of rat.
  • Some words are recognized as stop words (see Stop Words), which causes them to be ignored since they occur too frequently to be useful in searching. In our example these are a, on, and it.
  • If no dictionary in the list recognizes the token then it is also ignored. In this example that happened to the punctuation sign (-) because there are in fact no dictionaries assigned for its token type (Space symbols), meaning space tokens will never be indexed.
+

The choices of parser, dictionaries and which types of tokens to index are determined by the selected text search configuration. It is possible to have many different configurations in the same database, and predefined configurations are available for various languages. In our example we used the default configuration english for the English language.

+

The function setweight can be used to label the entries of a tsvector with a given weight, where a weight is one of the letters A, B, C, or D. This is typically used to mark entries coming from different parts of a document, such as title versus body. Later, this information can be used for ranking of search results.

+

Because to_tsvector(NULL) will return NULL, you are advised to use coalesce whenever a column might be NULL. Here is the recommended method for creating a tsvector from a structured document:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
CREATE TABLE tsearch.tt (id int, title text, keyword text, abstract text, body text, ti tsvector);
+
+INSERT INTO tsearch.tt(id, title, keyword, abstract, body) VALUES (1, 'book', 'literature', 'Ancient poetry','Tang poem Song jambic verse');
+
+UPDATE tsearch.tt SET ti =
+    setweight(to_tsvector(coalesce(title,'')), 'A')    ||
+    setweight(to_tsvector(coalesce(keyword,'')), 'B')  ||
+    setweight(to_tsvector(coalesce(abstract,'')), 'C') ||
+    setweight(to_tsvector(coalesce(body,'')), 'D');
+DROP TABLE tsearch.tt;
+
+ +
+

Here we have used setweight to label the source of each lexeme in the finished tsvector, and then merged the labeled tsvector values using the tsvector concatenation operator ||. For details about these operations, see Manipulating tsvector.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0093.html b/docs/dws/dev/dws_06_0093.html new file mode 100644 index 00000000..24306c5f --- /dev/null +++ b/docs/dws/dev/dws_06_0093.html @@ -0,0 +1,81 @@ + + +

Parsing Queries

+

GaussDB(DWS) provides functions to_tsquery and plainto_tsquery for converting a query to the tsquery data type. to_tsquery offers access to more features than plainto_tsquery, but is less forgiving about its input.

+
to_tsquery([ config regconfig, ] querytext text) returns tsquery
+

to_tsquery creates a tsquery value from querytext, which must consist of single tokens separated by the Boolean operators & (AND), | (OR), and ! (NOT). These operators can be grouped using parentheses. In other words, the input to to_tsquery must already follow the general rules for tsquery input, as described in Text Search Types. The difference is that while basic tsquery input takes the tokens at face value, to_tsquery normalizes each token to a lexeme using the specified or default configuration, and discards any tokens that are stop words according to the configuration. For example:

+
1
+2
+3
+4
+5
SELECT to_tsquery('english', 'The & Fat & Rats');
+   to_tsquery   
+---------------
+ 'fat' & 'rat'
+(1 row)
+
+ +
+

As in basic tsquery input, weight(s) can be attached to each lexeme to restrict it to match only tsvector lexemes of those weight(s). For example:

+
1
+2
+3
+4
+5
SELECT to_tsquery('english', 'Fat | Rats:AB');
+    to_tsquery    
+------------------
+ 'fat' | 'rat':AB
+(1 row)
+
+ +
+

Also, the asterisk (*) can be attached to a lexeme to specify prefix matching:

+
1
+2
+3
+4
+5
SELECT to_tsquery('supern:*A & star:A*B');
+        to_tsquery        
+--------------------------
+ 'supern':*A & 'star':*AB
+(1 row)
+
+ +
+

Such a lexeme will match any word having the specified string and weight in a tsquery.

+
plainto_tsquery([ config regconfig, ] querytext text) returns tsquery
+

plainto_tsquery transforms unformatted text querytext to tsquery. The text is parsed and normalized much as for to_tsvector, then the & (AND) Boolean operator is inserted between surviving words.

+

For example:

+
1
+2
+3
+4
+5
SELECT plainto_tsquery('english', 'The Fat Rats');
+ plainto_tsquery 
+-----------------
+ 'fat' & 'rat'
+(1 row)
+
+ +
+

Note that plainto_tsquery cannot recognize Boolean operators, weight labels, or prefix-match labels in its input:

+
1
+2
+3
+4
+5
SELECT plainto_tsquery('english', 'The Fat & Rats:C');
+   plainto_tsquery   
+---------------------
+ 'fat' & 'rat' & 'c'
+(1 row)
+
+ +
+

Here, all the input punctuation was discarded as being space symbols.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0094.html b/docs/dws/dev/dws_06_0094.html new file mode 100644 index 00000000..50ae0738 --- /dev/null +++ b/docs/dws/dev/dws_06_0094.html @@ -0,0 +1,126 @@ + + +

Ranking Search Results

+

Ranking attempts to measure how relevant documents are to a particular query, so that when there are many matches the most relevant ones can be shown first. GaussDB(DWS) provides two predefined ranking functions. which take into account lexical, proximity, and structural information; that is, they consider how often the query terms appear in the document, how close together the terms are in the document, and how important is the part of the document where they occur. However, the concept of relevancy is vague and application-specific. Different applications might require additional information for ranking, for example, document modification time. The built-in ranking functions are only examples. You can write your own ranking functions and/or combine their results with additional factors to fit your specific needs.

+

The two ranking functions currently available are:

+
1
ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4
+
+ +
+

Ranks vectors based on the frequency of their matching lexemes.

+
1
ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4
+
+ +
+

This function requires positional information in its input. Therefore, it will not work on "stripped" tsvector values. It will always return zero.

+

For both these functions, the optional weights argument offers the ability to weigh word instances more or less heavily depending on how they are labeled. The weight arrays specify how heavily to weigh each category of word, in the order:

+
{D-weight, C-weight, B-weight, A-weight}
+

If no weights are provided, then these defaults are used: {0.1, 0.2, 0.4, 1.0}

+

Typically weights are used to mark words from special areas of the document, like the title or an initial abstract, so they can be treated with more or less importance than words in the document body.

+

Since a longer document has a greater chance of containing a query term it is reasonable to take into account document size. For example, a hundred-word document with five instances of a search word is probably more relevant than a thousand-word document with five instances. Both ranking functions take an integer normalization option that specifies whether and how a document's length should impact its rank. The integer option controls several behaviors, so it is a bit mask: you can specify one or more behaviors using a vertical bar (|) (for example, 2|4).

+
  • 0 (the default) ignores the document length
  • 1 divides the rank by (1 + Logarithm of the document length)
  • 2 divides the rank by the document length
  • 4 divides the rank by the mean harmonic distance between extents (this is implemented only by ts_rank_cd)
  • 8 divides the rank by the number of unique words in document
  • 16 divides the rank by (1 + Logarithm of the number of unique words in document)
  • 32 divides the rank by (itself + 1)
+

If more than one flag bit is specified, the transformations are applied in the order listed.

+

It is important to note that the ranking functions do not use any global information, so it is impossible to produce a fair normalization to 1% or 100% as sometimes desired. Normalization option 32 (rank/(rank+1)) can be applied to scale all ranks into the range zero to one, but of course this is just a cosmetic change; it will not affect the ordering of the search results.

+

The following example selects the top 10 matches. Run the following statements in a database that uses the UTF-8 or GBK encoding:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
SELECT id, title, ts_rank_cd(to_tsvector(body), query) AS rank 
+FROM tsearch.pgweb, to_tsquery('science') query 
+WHERE query @@ to_tsvector(body) 
+ORDER BY rank DESC 
+LIMIT 10;
+ id |  title  | rank 
+----+---------+------
+ 11 | Philology  |   .2
+  2 | Mathematics |   .1
+ 12 | Geography  |   .1
+ 13 | Computer science  |   .1
+(4 rows)
+
+ +
+

This is the same example using normalized ranking:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
SELECT id, title, ts_rank_cd(to_tsvector(body), query, 32 /* rank/(rank+1) */ ) AS rank 
+FROM tsearch.pgweb, to_tsquery('science') query 
+WHERE  query @@ to_tsvector(body) 
+ORDER BY rank DESC 
+LIMIT 10;
+ id |  title  |   rank   
+----+---------+----------
+ 11 | Philology  |  .166667
+  2 | Mathematics | .0909091
+ 12 | Geography  | .0909091
+ 13 | Computer science  | .0909091
+(4 rows)
+
+ +
+

The following example sorts query by Chinese word segmentation:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
CREATE TABLE tsearch.ts_zhparser(id int, body text);
+INSERT INTO tsearch.ts_zhparser VALUES (1, 'sort');
+INSERT INTO tsearch.ts_zhparser VALUES(2, 'sort query');
+INSERT INTO tsearch.ts_zhparser VALUES(3, 'query sort');
+-- Accurate match
+SELECT id, body, ts_rank_cd (to_tsvector ('zhparser', body), query) AS rank FROM tsearch.ts_zhparser, to_tsquery ('sort') query WHERE query @@ to_tsvector (body);
+ id | body | rank 
+----+------+------
+  1 | sort |   .1
+(1 row)
+
+-- Fuzzy match
+SELECT id, body, ts_rank_cd (to_tsvector ('zhparser', body), query) AS rank FROM tsearch.ts_zhparser, to_tsquery ('sort') query WHERE query @@ to_tsvector ('zhparser',body);
+ id |   body   | rank 
+----+----------+------
+  3 | query sort |   .1
+  1 | sort     |   .1
+  2 | sort query |   .1
+(3 rows)
+
+ +
+

Ranking can be expensive since it requires consulting the tsvector of each matching document, which can be I/O bound and therefore slow. Unfortunately, it is almost impossible to avoid since practical queries often result in large numbers of matches.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0095.html b/docs/dws/dev/dws_06_0095.html new file mode 100644 index 00000000..1052f228 --- /dev/null +++ b/docs/dws/dev/dws_06_0095.html @@ -0,0 +1,87 @@ + + +

Highlighting Results

+

To present search results it is ideal to show a part of each document and how it is related to the query. Usually, search engines show fragments of the document with marked search terms. GaussDB(DWS) provides function ts_headline that implements this functionality.

+
1
ts_headline([ config regconfig, ] document text, query tsquery [, options text ]) returns text
+
+ +
+

ts_headline accepts a document along with a query, and returns an excerpt from the document in which terms from the query are highlighted. The configuration to be used to parse the document can be specified by config. If config is omitted, the default_text_search_config configuration is used.

+

If an options string is specified it must consist of a comma-separated list of one or more option=value pairs. The available options are:

+
  • StartSel, StopSel: The strings with which to delimit query words appearing in the document, to distinguish them from other excerpted words. You must double-quote these strings if they contain spaces or commas.
  • MaxWords, MinWords: These numbers determine the longest and shortest headlines to output.
+
  • ShortWord: Words of this length or less will be dropped at the start and end of a headline. The default value of three eliminates common English articles.
+
  • HighlightAll: Boolean flag. If true the whole document will be used as the headline, ignoring the preceding three parameters.
+
  • MaxFragments: Maximum number of text excerpts or fragments to display. The default value of zero selects a non-fragment-oriented headline generation method. A value greater than zero selects fragment-based headline generation. This method finds text fragments with as many query words as possible and stretches those fragments around the query words. As a result query words are close to the middle of each fragment and have words on each side. Each fragment will be of at most MaxWords and words of length ShortWord or less are dropped at the start and end of each fragment. If not all query words are found in the document, then a single fragment of the first MinWords in the document will be displayed.
+
  • FragmentDelimiter: When more than one fragment is displayed, the fragments will be separated by this string.
+

Any unspecified options receive these defaults:

+
1
+2
+3
StartSel=<b>, StopSel=</b>,
+MaxWords=35, MinWords=15, ShortWord=3, HighlightAll=FALSE,
+MaxFragments=0, FragmentDelimiter=" ... "
+
+ +
+

For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
SELECT ts_headline('english',
+'The most common type of search
+is to find all documents containing given query terms
+and return them in order of their similarity to the
+query.',
+to_tsquery('english', 'query & similarity'));
+                        ts_headline                         
+------------------------------------------------------------
+ containing given <b>query</b> terms
+ and return them in order of their <b>similarity</b> to the
+ <b>query</b>.
+(1 row)
+
+SELECT ts_headline('english',
+'The most common type of search
+is to find all documents containing given query terms
+and return them in order of their similarity to the
+query.',
+to_tsquery('english', 'query & similarity'),
+'StartSel = <, StopSel = >');
+                      ts_headline                      
+-------------------------------------------------------
+ containing given <query> terms
+ and return them in order of their <similarity> to the
+ <query>.
+(1 row)
+
+ +
+

ts_headline uses the original document, not a tsvector summary, so it can be slow and should be used with care.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0096.html b/docs/dws/dev/dws_06_0096.html new file mode 100644 index 00000000..3dbf8119 --- /dev/null +++ b/docs/dws/dev/dws_06_0096.html @@ -0,0 +1,21 @@ + + +

Additional Features

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0097.html b/docs/dws/dev/dws_06_0097.html new file mode 100644 index 00000000..5894132e --- /dev/null +++ b/docs/dws/dev/dws_06_0097.html @@ -0,0 +1,19 @@ + + +

Manipulating tsvector

+

GaussDB(DWS) provides functions and operators that can be used to manipulate documents that are already in tsvector type.

+
  • tsvector || tsvector

    The tsvector concatenation operator returns a new tsvector which combines the lexemes and positional information of the two tsvectors given as arguments. Positions and weight labels are retained during the concatenation. Positions appearing in the right-hand tsvector are offset by the largest position mentioned in the left-hand tsvector, so that the result is nearly equivalent to the result of performing to_tsvector on the concatenation of the two original document strings. (The equivalence is not exact, because any stop-words removed from the end of the left-hand argument will not affect the result, whereas they would have affected the positions of the lexemes in the right-hand argument if textual concatenation were used.)

    +

    One advantage of using concatenation in the tsvector form, rather than concatenating text before applying to_tsvector, is that you can use different configurations to parse different sections of the document. Also, because the setweight function marks all lexemes of the given tsvector the same way, it is necessary to parse the text and do setweight before concatenating if you want to label different parts of the document with different weights.

    +
  • setweight(vector tsvector, weight "char") returns tsvector

    setweight returns a copy of the input tsvector in which every position has been labeled with the given weight, either A, B, C, or D. (D is the default for new tsvectors and as such is not displayed on output.) These labels are retained when tsvectors are concatenated, allowing words from different parts of a document to be weighted differently by ranking functions.

    +

    Note that weight labels apply to positions, not lexemes. If the input tsvector has been stripped of positions then setweight does nothing.

    +
    +
  • length(vector tsvector) returns integer

    Returns the number of lexemes stored in the vector.

    +
  • strip(vector tsvector) returns tsvector

    Returns a tsvector which lists the same lexemes as the given tsvector, but which lacks any position or weight information. While the returned tsvector is much less useful than an unstripped tsvector for relevance ranking, it will usually be much smaller.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0098.html b/docs/dws/dev/dws_06_0098.html new file mode 100644 index 00000000..d2b9c70c --- /dev/null +++ b/docs/dws/dev/dws_06_0098.html @@ -0,0 +1,57 @@ + + +

Manipulating Queries

+

GaussDB(DWS) provides functions and operators that can be used to manipulate queries that are already in tsquery type.

+
  • tsquery && tsquery

    Returns the AND-combination of the two given tsqueries.

    +
+
  • tsquery || tsquery

    Returns the OR-combination of the two given tsqueries.

    +
+
  • !! tsquery

    Returns the negation (NOT) of the given tsquery.

    +
+
  • numnode(query tsquery) returns integer

    Returns the number of nodes (lexemes plus operators) in a tsquery. This function is useful to determine if the query is meaningful (returns > 0), or contains only stop words (returns 0). For example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT numnode(plainto_tsquery('the any'));
    +NOTICE:  text-search query contains only stop words or doesn't contain lexemes, ignored
    +CONTEXT:  referenced column: numnode
    + numnode 
    +---------
    +       0
    +
    +SELECT numnode('foo & bar'::tsquery);
    + numnode
    +---------
    +       3
    +
    + +
    +
+
  • querytree(query tsquery) returns text

    Returns the portion of a tsquery that can be used for searching an index. This function is useful for detecting unindexable queries, for example those containing only stop words or only negated terms. For example:

    +
    1
    +2
    +3
    +4
    +5
    SELECT querytree(to_tsquery('!defined'));
    + querytree 
    +-----------
    + T
    +(1 row)
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0099.html b/docs/dws/dev/dws_06_0099.html new file mode 100644 index 00000000..7e6d8f59 --- /dev/null +++ b/docs/dws/dev/dws_06_0099.html @@ -0,0 +1,85 @@ + + +

Rewriting Queries

+

The ts_rewrite family of functions searches a given tsquery for occurrences of a target subquery, and replace each occurrence with a substitute subquery. In essence this operation is a tsquery specific version of substring replacement. A target and substitute combination can be thought of as a query rewrite rule. A collection of such rewrite rules can be a powerful search aid. For example, you can expand the search using synonyms (that is, new york, big apple, nyc, gotham) or narrow the search to direct the user to some hot topic.

+
  • ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns tsquery

    This form of ts_rewrite simply applies a single rewrite rule: target is replaced by substitute wherever it appears in query. For example:

    +
    1
    +2
    +3
    +4
    SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
    + ts_rewrite
    +------------
    + 'b' & 'c'
    +
    + +
    +
  • ts_rewrite (query tsquery, select text) returns tsquery

    This form of ts_rewrite accepts a starting query and a SQL select command, which is given as a text string. The select must yield two columns of tsquery type. For each row of the select result, occurrences of the first column value (the target) are replaced by the second column value (the substitute) within the current query value.

    +

    Note that when multiple rewrite rules are applied in this way, the order of application can be important; so in practice you will want the source query to ORDER BY some ordering key.

    +
    +

    Consider a real-life astronomical example. We will expand query supernovae using table-driven rewriting rules:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    CREATE TABLE tsearch.aliases (id int, t tsquery, s tsquery);
    +
    +INSERT INTO tsearch.aliases VALUES(1, to_tsquery('supernovae'), to_tsquery('supernovae|sn'));
    +
    +SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM tsearch.aliases');
    +
    +           ts_rewrite            
    +---------------------------------
    + 'crab' & ( 'supernova' | 'sn' )
    +
    + +
    +

    We can change the rewriting rules just by updating the table:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    UPDATE tsearch.aliases
    +SET s = to_tsquery('supernovae|sn & !nebulae')
    +WHERE t = to_tsquery('supernovae');
    +
    +SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM tsearch.aliases');
    +
    +                 ts_rewrite                  
    +---------------------------------------------
    + 'crab' & ( 'supernova' | 'sn' & !'nebula' )
    +
    + +
    +

    Rewriting can be slow when there are many rewriting rules, since it checks every rule for a possible match. To filter out obvious non-candidate rules we can use the containment operators for the tsquery type. In the example below, we select only those rules which might match the original query:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM tsearch.aliases WHERE ''a & b''::tsquery @> t');
    +
    + ts_rewrite 
    +------------
    + 'b' & 'a'
    +(1 row)
    +DROP TABLE ts_rewrite;
    +
    + +
    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0100.html b/docs/dws/dev/dws_06_0100.html new file mode 100644 index 00000000..fb1d6b5e --- /dev/null +++ b/docs/dws/dev/dws_06_0100.html @@ -0,0 +1,63 @@ + + +

Gathering Document Statistics

+

The function ts_stat is useful for checking your configuration and for finding stop-word candidates.

+
1
+2
+3
ts_stat(sqlquery text, [ weights text, ]
+        OUT word text, OUT ndoc integer,
+        OUT nentry integer) returns setof record
+
+ +
+

sqlquery is a text value containing an SQL query which must return a single tsvector column. ts_stat executes the query and returns statistics about each distinct lexeme (word) contained in the tsvector data. The columns returned are

+
  • word text: the value of a lexeme
  • ndoc integer: number of documents (tsvectors) the word occurred in
  • nentry integer: total number of occurrences of the word
+

If weights are supplied, only occurrences having one of those weights are counted. For example, to find the ten most frequent words in a document collection:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
SELECT * FROM ts_stat('SELECT to_tsvector(''english'', sr_reason_sk) FROM tpcds.store_returns WHERE sr_customer_sk < 10') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10;;
+   word | ndoc | nentry 
+------+------+--------
+ 32   |    2 |      2
+ 33   |    2 |      2
+ 1    |    1 |      1
+ 10   |    1 |      1
+ 13   |    1 |      1
+ 14   |    1 |      1
+ 15   |    1 |      1
+ 17   |    1 |      1
+ 20   |    1 |      1
+ 22   |    1 |      1
+(10 rows)
+
+ +
+

The same, but counting only word occurrences with weight A or B:

+
1
+2
+3
+4
SELECT * FROM ts_stat('SELECT to_tsvector(''english'', sr_reason_sk) FROM tpcds.store_returns WHERE sr_customer_sk < 10', 'a') ORDER BY nentry DESC, ndoc DESC, word LIMIT 10;
+ word | ndoc | nentry 
+------+------+--------
+(0 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0101.html b/docs/dws/dev/dws_06_0101.html new file mode 100644 index 00000000..3353f926 --- /dev/null +++ b/docs/dws/dev/dws_06_0101.html @@ -0,0 +1,484 @@ + + +

Parsers

+

Text search parsers are responsible for splitting raw document text into tokens and identifying each token's type, where the set of types is defined by the parser itself. Note that a parser does not modify the text at all — it simply identifies plausible word boundaries. Because of this limited scope, there is less need for application-specific custom parsers than there is for custom dictionaries.

+

Currently, GaussDB(DWS) provides the following built-in parsers: pg_catalog.default for English configuration, and pg_catalog.ngram, pg_catalog.zhparser, and pg_catalog.pound for full text search in texts containing Chinese, or both Chinese and English.

+

The built-in parser is named pg_catalog.default. It recognizes 23 token types, shown in Table 1.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Default parser's token types

Alias

+

Description

+

Examples

+

asciiword

+

Word, all ASCII letters

+

elephant

+

word

+

Word, all letters

+

mañana

+

numword

+

Word, letters and digits

+

beta1

+

asciihword

+

Hyphenated word, all ASCII

+

up-to-date

+

hword

+

Hyphenated word, all letters

+

lógico-matemática

+

numhword

+

Hyphenated word, letters and digits

+

postgresql-beta1

+

hword_asciipart

+

Hyphenated word part, all ASCII

+

postgresql in the context postgresql-beta1

+

hword_part

+

Hyphenated word part, all letters

+

lógico or matemática in the context lógico-matemática

+

hword_numpart

+

Hyphenated word part, letters and digits

+

beta1 in the context postgresql-beta1

+

email

+

Email address

+

foo@example.com

+

protocol

+

Protocol head

+

http://

+

url

+

URL

+

example.com/stuff/index.html

+

host

+

Host

+

example.com

+

url_path

+

URL path

+

/stuff/index.html, in the context of a URL

+

file

+

File or path name

+

/usr/local/foo.txt, if not within a URL

+

sfloat

+

Scientific notation

+

-1.23E+56

+

float

+

Decimal notation

+

-1.234

+

int

+

Signed integer

+

-1234

+

uint

+

Unsigned integer

+

1234

+

version

+

Version number

+

8.3.0

+

tag

+

XML tag

+

<a href="dictionaries.html">

+

entity

+

XML entity

+

&amp;

+

blank

+

Space symbols

+

(any whitespace or punctuation not otherwise recognized)

+
+
+

Note: The parser's notion of a "letter" is determined by the database's locale setting, specifically lc_ctype. Words containing only the basic ASCII letters are reported as a separate token type, since it is sometimes useful to distinguish them. In most European languages, token types word and asciiword should be treated alike.

+

email does not support all valid email characters as defined by RFC 5322. Specifically, the only non-alphanumeric characters supported for email user names are period, dash, and underscore.

+

It is possible for the parser to identify overlapping tokens in the same piece of text. As an example, a hyphenated word will be reported both as the entire word and as each component:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT alias, description, token FROM ts_debug('english','foo-bar-beta1');
+      alias      |               description                |     token     
+-----------------+------------------------------------------+---------------
+ numhword        | Hyphenated word, letters and digits      | foo-bar-beta1
+ hword_asciipart | Hyphenated word part, all ASCII          | foo
+ blank           | Space symbols                            | -
+ hword_asciipart | Hyphenated word part, all ASCII          | bar
+ blank           | Space symbols                            | -
+ hword_numpart   | Hyphenated word part, letters and digits | beta1
+
+ +
+

This behavior is desirable since it allows searches to work for both the whole compound word and for components. Here is another instructive example:

+
1
+2
+3
+4
+5
+6
+7
SELECT alias, description, token FROM ts_debug('english','http://example.com/stuff/index.html');
+  alias   |  description  |            token             
+----------+---------------+------------------------------
+ protocol | Protocol head | http://
+ url      | URL           | example.com/stuff/index.html
+ host     | Host          | example.com
+ url_path | URL path      | /stuff/index.html
+
+ +
+

N-gram is a mechanical word segmentation method, and applies to no semantic Chinese segmentation scenarios. The N-gram segmentation method ensures the completeness of the segmentation. However, to cover all the possibilities, it but adds unnecessary words to the index, resulting in a large number of index items. N-gram supports Chinese coding, including GBK and UTF-8. Six built-in token types are shown in Table 2.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Table 2 Token types

Alias

+

Description

+

zh_words

+

chinese words

+

en_word

+

english word

+

numeric

+

numeric data

+

alnum

+

alnum string

+

grapsymbol

+

graphic symbol

+

multisymbol

+

multiple symbol

+
+
+

Zhparser is a dictionary-based semantic word segmentation method. The bottom-layer calls the Simple Chinese Word Segmentation (SCWS) algorithm (https://github.com/hightman/scws), which applies to Chinese segmentation scenarios. SCWS is a term frequency and dictionary-based mechanical Chinese words engine. It can split a whole paragraph Chinese text into words. The two Chinese coding formats, GBK and UTF-8, are supported. The 26 built-in token types are shown in Table 3.

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 3 Token types

Alias

+

Description

+

A

+

Adjective

+

B

+

Differentiation

+

C

+

Conjunction

+

D

+

Adverb

+

E

+

Exclamation

+

F

+

Position

+

G

+

Lexeme

+

H

+

Preceding element

+

I

+

Idiom

+

J

+

Acronyms and abbreviations

+

K

+

Subsequent element

+

L

+

Common words

+

M

+

Numeral

+

N

+

Noun

+

O

+

Onomatopoeia

+

P

+

Preposition

+

Q

+

Quantifiers

+

R

+

Pronoun

+

S

+

Space

+

T

+

Time

+

U

+

Auxiliary word

+

V

+

Verb

+

W

+

Punctuation

+

X

+

Unknown

+

Y

+

Interjection

+

Z

+

Status words

+
+
+

Pound segments words in a fixed format. It is used to segment to-be-parsed nonsense Chinese and English words that are separated by fixed separators. It supports Chinese encoding (including GBK and UTF8) and English encoding (including ASCII). Pound has six pre-configured token types (as listed in Table 4) and supports five separators (as listed in Table 5). The default, the separator is #. Pound The maximum length of a token is 256 characters.

+ +
+ + + + + + + + + + + + + + + + + + + + + + +
Table 4 Token types

Alias

+

Description

+

zh_words

+

chinese words

+

en_word

+

english word

+

numeric

+

numeric data

+

alnum

+

alnum string

+

grapsymbol

+

graphic symbol

+

multisymbol

+

multiple symbol

+
+
+ +
+ + + + + + + + + + + + + + + + + + + +
Table 5 Separator types

Delimiter

+

Description

+

@

+

Special character

+

#

+

Special character

+

$

+

Special character

+

%

+

Special character

+

/

+

Special character

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0102.html b/docs/dws/dev/dws_06_0102.html new file mode 100644 index 00000000..a2a6f4a5 --- /dev/null +++ b/docs/dws/dev/dws_06_0102.html @@ -0,0 +1,28 @@ + + +

Dictionaries

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0103.html b/docs/dws/dev/dws_06_0103.html new file mode 100644 index 00000000..535543ab --- /dev/null +++ b/docs/dws/dev/dws_06_0103.html @@ -0,0 +1,28 @@ + + +

Overview

+

A dictionary is used to define stop words, that is, words to be ignored in full-text retrieval.

+

A dictionary can also be used to normalize words so that different derived forms of the same word will match. A normalized word is called a lexeme.

+

In addition to improving retrieval quality, normalization and removal of stop words can reduce the size of the tsvector representation of a document, thereby improving performance. Normalization and removal of stop words do not always have linguistic meaning. Users can define normalization and removal rules in dictionary definition files based on application environments.

+

A dictionary is a program that receives a token as input and returns:

+
  • An array of lexemes if the input token is known to the dictionary (note that one token can produce more than one lexeme).

    +
  • A single lexeme to replace the original token with a new token to be passed to subsequent dictionaries (a dictionary that does this is called a filtering dictionary).
  • An empty array if the input token is known to the dictionary but is a stop word.

    +
  • NULL if the dictionary does not recognize the token.

    +
+

GaussDB(DWS) provides predefined dictionaries for many languages and also provides five predefined dictionary templates, Simple, Synonym, Thesaurus, Ispell, and Snowball. These templates can be used to create new dictionaries with custom parameters.

+

When using full-text retrieval, you are advised to:

+
  • In the text search configuration, configure a parser together with a set of dictionaries to process the parser's output tokens. For each token type that the parser can return, a separate list of dictionaries is specified by the configuration. When a token of that type is found by the parser, each dictionary in the list is consulted in turn, until a dictionary recognizes it as a known word. If it is identified as a stop word, or no dictionary recognizes the token, it will be discarded and not indexed or searched for. Generally, the first dictionary that returns a non-NULL output determines the result, and any remaining dictionaries are not consulted. However, a filtering dictionary can replace the input token with a modified one, which is then passed to subsequent dictionaries.
  • The general rule for configuring a list of dictionaries is to place first the most narrow, most specific dictionary, then the more general dictionaries, finishing with a very general dictionary, like a Snowball stemmer dictionary or a Simple dictionary, which recognizes everything. In the following example, for an astronomy-specific search (astro_en configuration), you can configure the token type asciiword (ASCII word) with a Synonym dictionary of astronomical terms, a general English Ispell dictionary, and a Snowball English stemmer dictionary:
    1
    +2
    ALTER TEXT SEARCH CONFIGURATION astro_en
    +  ADD MAPPING FOR asciiword WITH astro_syn, english_ispell, english_stem;
    +
    + +
    +

    A filtering dictionary can be placed anywhere in the list, except at the end where it would be useless. Filtering dictionaries are useful to partially normalize words to simplify the task of later dictionaries.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0104.html b/docs/dws/dev/dws_06_0104.html new file mode 100644 index 00000000..c6a05bbe --- /dev/null +++ b/docs/dws/dev/dws_06_0104.html @@ -0,0 +1,43 @@ + + +

Stop Words

+

Stop words are words that are very common, appear in almost every document, and have no discrimination value. Therefore, they can be ignored in the context of full text searching. Each type of dictionaries treats stop words in different ways. For example, Ispell dictionaries first normalize words and then check the list of stop words, while Snowball dictionaries first check the list of stop words.

+

For example, every English text contains words like a and the, so it is useless to store them in an index. However, stop words affect the positions in tsvector, which in turn affect ranking.

+
1
+2
+3
+4
SELECT to_tsvector('english','in the list of stop words');
+        to_tsvector
+----------------------------
+ 'list':3 'stop':5 'word':6
+
+ +
+

The missing positions 1, 2, and 4 are because of stop words. Ranks calculated for documents with and without stop words are quite different:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT ts_rank_cd (to_tsvector('english','in the list of stop words'), to_tsquery('list & stop'));
+ ts_rank_cd
+------------
+        .05
+
+SELECT ts_rank_cd (to_tsvector('english','list stop words'), to_tsquery('list & stop'));
+ ts_rank_cd
+------------
+         .1
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0105.html b/docs/dws/dev/dws_06_0105.html new file mode 100644 index 00000000..c6678d71 --- /dev/null +++ b/docs/dws/dev/dws_06_0105.html @@ -0,0 +1,77 @@ + + +

Simple Dictionary

+

A Simple dictionary operates by converting the input token to lower case and checking it against a list of stop words. If the token is found in the list, an empty array will be returned, causing the token to be discarded. If it is not found, the lower-cased form of the word is returned as the normalized lexeme. In addition, you can set Accept to false for Simple dictionaries (default: true) to report non-stop-words as unrecognized, allowing them to be passed on to the next dictionary in the list.

+

Precautions

  • Most types of dictionaries rely on dictionary configuration files. The name of a configuration file can only be lowercase letters, digits, and underscores (_).
  • A dictionary cannot be created in pg_temp mode.
  • Dictionary configuration files must be stored in UTF-8 encoding. They will be translated to the actual database encoding, if that is different, when they are read into the server.
  • Generally, a session will read a dictionary configuration file only once, when it is first used within the session. To modify a configuration file, run the ALTER TEXT SEARCH DICTIONARY statement to update and reload the file.
+
+

Procedure

  1. Create a Simple dictionary.

    1
    +2
    +3
    +4
    CREATE TEXT SEARCH DICTIONARY public.simple_dict (
    +     TEMPLATE = pg_catalog.simple,
    +     STOPWORDS = english
    +);
    +
    + +
    +

    english.stop is the full name of a file of stop words. For details about the syntax and parameters for creating a Simple dictionary, see CREATE TEXT SEARCH DICTIONARY.

    +

  2. Use the Simple dictionary.

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT ts_lexize('public.simple_dict','YeS');
    + ts_lexize 
    +-----------
    + {yes}
    +(1 row)
    +
    +SELECT ts_lexize('public.simple_dict','The');
    + ts_lexize 
    +-----------
    + {}
    +(1 row)
    +
    + +
    +

  3. Set Accept=false so that the Simple dictionary returns NULL instead of a lower-cased non-stop word.

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    ALTER TEXT SEARCH DICTIONARY public.simple_dict ( Accept = false );
    +SELECT ts_lexize('public.simple_dict','YeS');
    + ts_lexize 
    +-----------
    +
    +(1 row)
    +
    +SELECT ts_lexize('public.simple_dict','The');
    + ts_lexize 
    +-----------
    + {}
    +(1 row)
    +
    + +
    +

+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0106.html b/docs/dws/dev/dws_06_0106.html new file mode 100644 index 00000000..2f74ece7 --- /dev/null +++ b/docs/dws/dev/dws_06_0106.html @@ -0,0 +1,191 @@ + + +

Synonym Dictionary

+

A synonym dictionary is used to define, identify, and convert synonyms of tokens. Phrases are not supported (use the thesaurus dictionary in Thesaurus Dictionary).

+

Examples

  • A synonym dictionary can be used to overcome linguistic problems, for example, to prevent an English stemmer dictionary from reducing the word "Paris" to "pari". It is enough to have a Paris paris line in the synonym dictionary and put it before the english_stem dictionary.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    SELECT * FROM ts_debug('english', 'Paris');
    +   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes 
    +-----------+-----------------+-------+----------------+--------------+---------
    + asciiword | Word, all ASCII | Paris | {english_stem} | english_stem | {pari}
    +(1 row)
    +
    +CREATE TEXT SEARCH DICTIONARY my_synonym (
    +    TEMPLATE = synonym,
    +    SYNONYMS = my_synonyms,
    +    FILEPATH =  'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'
    +);
    +
    +ALTER TEXT SEARCH CONFIGURATION english
    +    ALTER MAPPING FOR asciiword
    +    WITH my_synonym, english_stem;
    +
    +SELECT * FROM ts_debug('english', 'Paris');
    +   alias   |   description   | token |       dictionaries        | dictionary | lexemes 
    +-----------+-----------------+-------+---------------------------+------------+---------
    + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}
    +(1 row)
    +
    +SELECT * FROM ts_debug('english', 'paris');
    +   alias   |   description   | token |       dictionaries        | dictionary | lexemes 
    +-----------+-----------------+-------+---------------------------+------------+---------
    + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}
    +(1 row)
    +
    +ALTER TEXT SEARCH DICTIONARY my_synonym ( CASESENSITIVE=true);
    +
    +SELECT * FROM ts_debug('english', 'Paris');
    +   alias   |   description   | token |       dictionaries        | dictionary | lexemes 
    +-----------+-----------------+-------+---------------------------+------------+---------
    + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {paris}
    +(1 row)
    +
    +SELECT * FROM ts_debug('english', 'paris');
    +   alias   |   description   | token |       dictionaries        | dictionary | lexemes 
    +-----------+-----------------+-------+---------------------------+------------+---------
    + asciiword | Word, all ASCII | Paris | {my_synonym,english_stem} | my_synonym | {pari}
    +(1 row)
    +
    + +
    +

    The full name of the synonym dictionary file is my_synonyms.syn, and the dictionary is stored in 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'. For details about the syntax and parameters for creating a synonym dictionary, see CREATE TEXT SEARCH DICTIONARY.

    +
  • An asterisk (*) can be placed at the end of a synonym in the configuration file. This indicates that the synonym is a prefix. The asterisk is ignored when the entry is used in to_tsvector(), but when it is used in to_tsquery(), the result will be a query item with the prefix match marker (see Manipulating Queries).

    Assume that the content in the dictionary file synonym_sample.syn is as follows:

    +
    1
    +2
    +3
    +4
    +5
    postgres        pgsql
    +postgresql      pgsql 
    +postgre pgsql 
    +gogle   googl 
    +indices index*
    +
    + +
    +

    Create and use a dictionary.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    CREATE TEXT SEARCH DICTIONARY syn (
    +    TEMPLATE = synonym,
    +    SYNONYMS = synonym_sample
    +);
    +
    +SELECT ts_lexize('syn','indices');
    + ts_lexize 
    +-----------
    + {index}
    +(1 row)
    +
    +CREATE TEXT SEARCH CONFIGURATION tst (copy=simple);
    +
    +ALTER TEXT SEARCH CONFIGURATION tst ALTER MAPPING FOR asciiword WITH syn;
    +
    +SELECT to_tsvector('tst','indices');
    + to_tsvector 
    +-------------
    + 'index':1
    +(1 row)
    +
    +SELECT to_tsquery('tst','indices');
    + to_tsquery 
    +------------
    + 'index':*
    +(1 row)
    +
    +SELECT 'indexes are very useful'::tsvector;
    +            tsvector             
    +---------------------------------
    + 'are' 'indexes' 'useful' 'very'
    +(1 row)
    +
    +SELECT 'indexes are very useful'::tsvector @@ to_tsquery('tst','indices');
    + ?column? 
    +----------
    + t
    +(1 row)
    +
    + +
    +
+
+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0107.html b/docs/dws/dev/dws_06_0107.html new file mode 100644 index 00000000..4417f109 --- /dev/null +++ b/docs/dws/dev/dws_06_0107.html @@ -0,0 +1,109 @@ + + +

Thesaurus Dictionary

+

A thesaurus dictionary (sometimes abbreviated as TZ) is a collection of words that include relationships between words and phrases, such as broader terms (BT), narrower terms (NT), preferred terms, non-preferred terms, and related terms. A thesaurus dictionary replaces all non-preferred terms by one preferred term and, optionally, preserves the original terms for indexing as well. A thesaurus dictionary is an extension of the synonym dictionary with added phrase support.

+

Precautions

  • A thesaurus dictionary has the capability to recognize phrases. Therefore, it must remember its state and interact with the parser to check whether it should handle the next token or stop accumulation. The thesaurus dictionary must be configured carefully. For example, if the thesaurus dictionary is assigned to handle only the asciiword token, then a thesaurus dictionary definition like one 7 will not work because token type uint is not assigned to the thesaurus dictionary.
  • Thesauruses are used during indexing. Any change in the thesaurus dictionary's parameters requires reindexing. For most other dictionary types, small changes such as adding or removing stop words does not force reindexing.
+
+

Procedure

  1. Create a TZ named thesaurus_astro.

    thesaurus_astro is a simple astronomical TZ that defines two astronomical word combinations (word+synonym).
    1
    +2
    supernovae stars : sn 
    +crab nebulae : crab
    +
    + +
    +
    +

    Run the following statement to create the TZ:

    +
    1
    +2
    +3
    +4
    +5
    +6
    CREATE TEXT SEARCH DICTIONARY thesaurus_astro (
    +    TEMPLATE = thesaurus,
    +    DictFile = thesaurus_astro,
    +    Dictionary = pg_catalog.english_stem,
    +    FILEPATH =  'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'
    +);
    +
    + +
    +

    The full name of the dictionary file is thesaurus_astro.ths, and the dictionary is stored in 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'. pg_catalog.english_stem is the subdictionary (a Snowball English stemmer) used for input normalization. The subdictionary has its own configuration (for example, stop words), which is not shown here. For details about the syntax and parameters for creating a TZ, see CREATE TEXT SEARCH DICTIONARY.

    +

  2. Bind the TZ to the desired token types in the text search configuration.

    1
    +2
    +3
    ALTER TEXT SEARCH CONFIGURATION english
    +    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart
    +    WITH thesaurus_astro, english_stem;
    +
    + +
    +

  3. Use the TZ.

    • Test the TZ.
      The ts_lexize function is not very useful for testing the TZ because the function processes its input as a single token. Instead, you can use the plainto_tsquery, to_tsvector, or to_tsquery function which will break their input strings into multiple tokens.
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      +15
      +16
      +17
      SELECT plainto_tsquery('english','supernova star');
      + plainto_tsquery 
      +-----------------
      + 'sn'
      +(1 row)
      +
      +SELECT to_tsvector('english','supernova star');
      + to_tsvector 
      +-------------
      + 'sn':1
      +(1 row)
      +
      +SELECT to_tsquery('english','''supernova star''');
      + to_tsquery 
      +------------
      + 'sn'
      +(1 row)
      +
      + +
      +
      +

      supernova star matches supernovae stars in thesaurus_astro because the english_stem stemmer is specified in the thesaurus_astro definition. The stemmer removed e and s.

      +
    • To index the original phrase, include it in the right-hand part of the definition.
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      supernovae stars : sn supernovae stars
      +
      +ALTER TEXT SEARCH DICTIONARY thesaurus_astro (
      +    DictFile = thesaurus_astro,
      +    FILEPATH = 'file:///home/dicts/');
      +
      +SELECT plainto_tsquery('english','supernova star');
      +       plainto_tsquery       
      +-----------------------------
      + 'sn' & 'supernova' & 'star'
      +(1 row)
      +
      + +
      +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0108.html b/docs/dws/dev/dws_06_0108.html new file mode 100644 index 00000000..85fe5d94 --- /dev/null +++ b/docs/dws/dev/dws_06_0108.html @@ -0,0 +1,49 @@ + + +

Ispell Dictionary

+

The Ispell dictionary template supports morphological dictionaries, which can normalize many different linguistic forms of a word into the same lexeme. For example, an English Ispell dictionary can match all declensions and conjugations of the search term bank, such as banking, banked, banks, banks', and bank's.

+

GaussDB(DWS) does not provide any predefined Ispell dictionaries or dictionary files. The .dict files and .affix files support multiple open-source dictionary formats, including Ispell, MySpell, and Hunspell.

+

Procedure

  1. Obtain the dictionary definition file (.dict) and affix file (.affix).

    You can use an open-source dictionary. The name extensions of the open-source dictionary may be .aff and .dic. In this case, you need to change them to .affix and .dict. In addition, for some dictionary files (for example, Norwegian dictionary files), you need to run the following commands to convert the character encoding to UTF-8:

    +
    1
    +2
    iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff 
    +iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic
    +
    + +
    +

  2. Create an Ispell dictionary.

    1
    +2
    +3
    +4
    +5
    +6
    CREATE TEXT SEARCH DICTIONARY norwegian_ispell (
    +    TEMPLATE = ispell,
    +    DictFile = nn_no,
    +    AffFile = nn_no,
    +    FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg'
    +);
    +
    + +
    +

    The full name of the Ispell dictionary file is nn_no.dict and nn_no.affix, and the dictionary is stored in the 'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'. For details about the syntax and parameters for creating an Ispell dictionary, see CREATE TEXT SEARCH DICTIONARY.

    +

  3. Use the Ispell dictionary to split compound words.

    1
    +2
    +3
    +4
    +5
    SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk');
    +      ts_lexize      
    +---------------------
    + {sjokolade,fabrikk}
    +(1 row)
    +
    + +
    +

    MySpell does not support compound words. Hunspell supports compound words. GaussDB(DWS) supports only the basic compound word operations of Hunspell. Generally, an Ispell dictionary recognizes a limited set of words, so they should be followed by another broader dictionary, for example, a Snowball dictionary, which recognizes everything.

    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0109.html b/docs/dws/dev/dws_06_0109.html new file mode 100644 index 00000000..ca4fd4dc --- /dev/null +++ b/docs/dws/dev/dws_06_0109.html @@ -0,0 +1,14 @@ + + +

Snowball Dictionary

+

A Snowball dictionary is based on a project by Martin Porter and is used for stem analysis, providing stemming algorithms for many languages. GaussDB(DWS) provides predefined Snowball dictionaries of many languages. You can query the PG_TS_DICT system catalog to view the predefined Snowball dictionaries and supported stemming algorithms.

+

A Snowball dictionary recognizes everything, no matter whether it is able to simplify the word. Therefore, it should be placed at the end of the dictionary list. It is useless to place it before any other dictionary because a token will never pass it through to the next dictionary.

+

For details about the syntax of Snowball dictionaries, see CREATE TEXT SEARCH DICTIONARY.

+

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0110.html b/docs/dws/dev/dws_06_0110.html new file mode 100644 index 00000000..2c15731a --- /dev/null +++ b/docs/dws/dev/dws_06_0110.html @@ -0,0 +1,144 @@ + + +

Configuration Examples

+

Text search configuration specifies the following components required for converting a document into a tsvector:

+
  • A parser, decomposes a text into tokens.
  • Dictionary list, converts each token into a lexeme.
+

Each time when the to_tsvector or to_tsquery function is invoked, a text search configuration is required to specify a processing procedure. The GUC parameter default_text_search_config specifies the default text search configuration, which will be used if the text search function does not explicitly specify a text search configuration.

+

GaussDB(DWS) provides some predefined text search configurations. You can also create user-defined text search configurations. In addition, to facilitate the management of text search objects, multiple gsql meta-commands are provided to display related information. For details, see "Meta-Command Reference" in the Tool Guide.

+

Procedure

  1. Create a text search configuration ts_conf by copying the predefined text search configuration english.

    1
    +2
    CREATE TEXT SEARCH CONFIGURATION ts_conf ( COPY = pg_catalog.english );
    +CREATE TEXT SEARCH CONFIGURATION
    +
    + +
    +

  2. Create a Synonym dictionary.

    Assume that the definition file pg_dict.syn of the Synonym dictionary contains the following contents:
    1
    +2
    +3
    postgres    pg 
    +pgsql       pg 
    +postgresql  pg
    +
    + +
    +
    +

    Run the following statement to create the Synonym dictionary:

    +
    1
    +2
    +3
    +4
    +5
    CREATE TEXT SEARCH DICTIONARY pg_dict (
    +     TEMPLATE = synonym,
    +     SYNONYMS = pg_dict,
    +     FILEPATH =  'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'
    + );
    +
    + +
    +

  3. Create an Ispell dictionary english_ispell (the dictionary definition file is from the open source dictionary).

    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE TEXT SEARCH DICTIONARY english_ispell (
    +    TEMPLATE = ispell,
    +    DictFile = english,
    +    AffFile = english,
    +    StopWords = english,
    +    FILEPATH =   'obs://bucket01/obs.xxx.xxx.com accesskey=xxxxx secretkey=xxxxx region=xx-xx-xx'
    +);
    +
    + +
    +

  4. Modify the text search configuration ts_conf and change the dictionary list for tokens of certain types. For details about token types, see Parsers.

    1
    +2
    +3
    +4
    ALTER TEXT SEARCH CONFIGURATION ts_conf
    +    ALTER MAPPING FOR asciiword, asciihword, hword_asciipart,
    +                      word, hword, hword_part
    +    WITH pg_dict, english_ispell, english_stem;
    +
    + +
    +

  5. In the text search configuration, set non-index or set the search for tokens of certain types.

    1
    +2
    ALTER TEXT SEARCH CONFIGURATION ts_conf
    +    DROP MAPPING FOR email, url, url_path, sfloat, float;
    +
    + +
    +

  6. Use the text retrieval commissioning function ts_debug() to test the text search configuration ts_conf.

    1
    +2
    +3
    +4
    +5
    SELECT * FROM ts_debug('ts_conf', '
    +PostgreSQL, the highly scalable, SQL compliant, open source object-relational
    +database management system, is now undergoing beta testing of the next
    +version of our software.
    +');
    +
    + +
    +

  7. You can set the default text search configuration of the current session to ts_conf. This setting is valid only for the current session.

     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    \dF+ ts_conf
    +      Text search configuration "public.ts_conf"
    +Parser: "pg_catalog.default"
    +      Token      |            Dictionaries             
    +-----------------+-------------------------------------
    + asciihword      | pg_dict,english_ispell,english_stem
    + asciiword       | pg_dict,english_ispell,english_stem
    + file            | simple
    + host            | simple
    + hword           | pg_dict,english_ispell,english_stem
    + hword_asciipart | pg_dict,english_ispell,english_stem
    + hword_numpart   | simple
    + hword_part      | pg_dict,english_ispell,english_stem
    + int             | simple
    + numhword        | simple
    + numword         | simple
    + uint            | simple
    + version         | simple
    + word            | pg_dict,english_ispell,english_stem
    +
    +SET default_text_search_config = 'public.ts_conf';
    +SET
    +SHOW default_text_search_config;
    + default_text_search_config 
    +----------------------------
    + public.ts_conf
    +(1 row)
    +
    + +
    +

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0111.html b/docs/dws/dev/dws_06_0111.html new file mode 100644 index 00000000..c0f48dcc --- /dev/null +++ b/docs/dws/dev/dws_06_0111.html @@ -0,0 +1,19 @@ + + +

Testing and Debugging Text Search

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0112.html b/docs/dws/dev/dws_06_0112.html new file mode 100644 index 00000000..090ec70b --- /dev/null +++ b/docs/dws/dev/dws_06_0112.html @@ -0,0 +1,91 @@ + + +

Testing a Configuration

+

The function ts_debug allows easy testing of a text search configuration.

+
1
+2
+3
+4
+5
+6
+7
+8
ts_debug([ config regconfig, ] document text,
+         OUT alias text,
+         OUT description text,
+         OUT token text,
+         OUT dictionaries regdictionary[],
+         OUT dictionary regdictionary,
+         OUT lexemes text[])
+         returns setof record
+
+ +
+

ts_debug displays information about every token of document as produced by the parser and processed by the configured dictionaries. It uses the configuration specified by config, or default_text_search_config if that argument is omitted.

+

ts_debug returns one row for each token identified in the text by the parser. The columns returned are:

+
  • alias text — short name of the token type
  • description text — description of the token type
  • token text — text of the token
  • dictionaries regdictionary[] — the dictionaries selected by the configuration for this token type
  • dictionary regdictionary: the dictionary that recognized the token, or NULL if none did
  • lexemes text[]: the lexeme(s) produced by the dictionary that recognized the token, or NULL if none did; an empty array ({}) means the token was recognized as a stop word
+

Here is a simple example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
SELECT * FROM ts_debug('english','a fat  cat sat on a mat - it ate a fat rats');
+   alias   |   description   | token |  dictionaries  |  dictionary  | lexemes 
+-----------+-----------------+-------+----------------+--------------+---------
+ asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | cat   | {english_stem} | english_stem | {cat}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | sat   | {english_stem} | english_stem | {sat}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | on    | {english_stem} | english_stem | {}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | mat   | {english_stem} | english_stem | {mat}
+ blank     | Space symbols   |       | {}             |              | 
+ blank     | Space symbols   | -     | {}             |              | 
+ asciiword | Word, all ASCII | it    | {english_stem} | english_stem | {}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | ate   | {english_stem} | english_stem | {ate}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | a     | {english_stem} | english_stem | {}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | fat   | {english_stem} | english_stem | {fat}
+ blank     | Space symbols   |       | {}             |              | 
+ asciiword | Word, all ASCII | rats  | {english_stem} | english_stem | {rat}
+(24 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0113.html b/docs/dws/dev/dws_06_0113.html new file mode 100644 index 00000000..05e558db --- /dev/null +++ b/docs/dws/dev/dws_06_0113.html @@ -0,0 +1,103 @@ + + +

Testing a Parser

+

The ts_parse function allows direct testing of a text search parser.

+
1
+2
ts_parse(parser_name text, document text,
+         OUT tokid integer, OUT token text) returns setof record
+
+ +
+

ts_parse parses the given document and returns a series of records, one for each token produced by parsing. Each record includes a tokid showing the assigned token type and a token which is the text of the token. For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
SELECT * FROM ts_parse('default', '123 - a number');
+ tokid | token
+-------+--------
+    22 | 123
+    12 |
+    12 | -
+     1 | a
+    12 |
+     1 | number
+(6 rows)
+
+ +
+
1
+2
ts_token_type(parser_name text, OUT tokid integer,
+              OUT alias text, OUT description text) returns setof record
+
+ +
+

ts_token_type returns a table which describes each type of token the specified parser can recognize. For each token type, the table gives the integer tokid that the parser uses to label a token of that type, the alias that names the token type in configuration commands, and a short description. For example:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
SELECT * FROM ts_token_type('default');
+ tokid |      alias      |               description                
+-------+-----------------+------------------------------------------
+     1 | asciiword       | Word, all ASCII
+     2 | word            | Word, all letters
+     3 | numword         | Word, letters and digits
+     4 | email           | Email address
+     5 | url             | URL
+     6 | host            | Host
+     7 | sfloat          | Scientific notation
+     8 | version         | Version number
+     9 | hword_numpart   | Hyphenated word part, letters and digits
+    10 | hword_part      | Hyphenated word part, all letters
+    11 | hword_asciipart | Hyphenated word part, all ASCII
+    12 | blank           | Space symbols
+    13 | tag             | XML tag
+    14 | protocol        | Protocol head
+    15 | numhword        | Hyphenated word, letters and digits
+    16 | asciihword      | Hyphenated word, all ASCII
+    17 | hword           | Hyphenated word, all letters
+    18 | url_path        | URL path
+    19 | file            | File or path name
+    20 | float           | Decimal notation
+    21 | int             | Signed integer
+    22 | uint            | Unsigned integer
+    23 | entity          | XML entity
+(23 rows)
+
+ +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0114.html b/docs/dws/dev/dws_06_0114.html new file mode 100644 index 00000000..f6f49ce5 --- /dev/null +++ b/docs/dws/dev/dws_06_0114.html @@ -0,0 +1,35 @@ + + +

Testing a Dictionary

+

The ts_lexize function facilitates dictionary testing.

+

ts_lexize(dict regdictionary, token text) returns text[] ts_lexize returns an array of lexemes if the input token is known to the dictionary, or an empty array if the token is known to the dictionary but it is a stop word, or NULL if it is an unknown word.

+

For example:

+
1
+2
+3
+4
+5
+6
+7
+8
+9
SELECT ts_lexize('english_stem', 'stars');
+ ts_lexize
+-----------
+ {star}
+
+SELECT ts_lexize('english_stem', 'a');
+ ts_lexize
+-----------
+ {}
+
+ +
+

The ts_lexize function expects a single token, not text.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0115.html b/docs/dws/dev/dws_06_0115.html new file mode 100644 index 00000000..33179218 --- /dev/null +++ b/docs/dws/dev/dws_06_0115.html @@ -0,0 +1,12 @@ + + +

Limitations

+

The current limitations of GaussDB(DWS)'s full text search are:

+
  • The length of each lexeme must be less than 2 KB.
  • The length of a tsvector (lexemes + positions) must be less than 1 megabyte.
  • Position values in tsvector must be greater than 0 and no more than 16383.
  • No more than 256 positions per lexeme. Excessive positions, if any, will be discarded.
  • The number of nodes (lexemes + operators) in a tsquery must be less than 32768.
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0116.html b/docs/dws/dev/dws_06_0116.html new file mode 100644 index 00000000..eed863fe --- /dev/null +++ b/docs/dws/dev/dws_06_0116.html @@ -0,0 +1,23 @@ + + +

System Operation

+

GaussDB(DWS) runs SQL statements to perform different system operations, such as setting variables, displaying the execution plan, and collecting garbage data.

+

Setting Variables

For details about how to set various parameters for a session or transaction, see SET.

+
+

Displaying the Execution Plan

For details about how to display the execution plan that GaussDB(DWS) makes for SQL statements, see EXPLAIN.

+
+

Specifying a Checkpoint in Transaction Logs

By default, WALs periodically specify checkpoints in a transaction log. CHECKPOINT forces an immediate checkpoint when the related command is issued, without waiting for a regular checkpoint scheduled by the system. For details, see CHECKPOINT.

+
+

Collecting Unnecessary Data

For details about how to collect garbage data and analyze a database as required, For details, see VACUUM.

+
+

Collecting statistics

For details about how to collect statistics on tables in databases, For details, see ANALYZE | ANALYSE.

+
+

Setting the Constraint Check Mode for the Current Transaction

For details about how to set the constraint check mode for the current transaction, For details, see SET CONSTRAINTS.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0117.html b/docs/dws/dev/dws_06_0117.html new file mode 100644 index 00000000..7cd2b33f --- /dev/null +++ b/docs/dws/dev/dws_06_0117.html @@ -0,0 +1,21 @@ + + +

Controlling Transactions

+

A transaction is a user-defined sequence of database operations, which form an integral unit of work.

+

Starting Transactions

GaussDB(DWS) starts a transaction using START TRANSACTION and BEGIN. For details, see START TRANSACTION and BEGIN.

+
+

Setting Transactions

GaussDB(DWS) sets a transaction using SET TRANSACTION or SET LOCAL TRANSACTION. For details, see SET TRANSACTION.

+
+

Submitting Transactions

GaussDB(DWS) commits all operations of a transaction using COMMIT or END. For details, see COMMIT | END.

+
+

Rolling Back Transactions

If a fault occurs during a transaction and the transaction cannot proceed, the system performs rollback to cancel all the completed database operations related to the transaction. For details, see ROLLBACK.

+

If an execution request (not in a transaction block) received in the database contains multiple statements, the statements will be packed into a transaction. If one of the statements fails, the entire request will be rolled back.

+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0118.html b/docs/dws/dev/dws_06_0118.html new file mode 100644 index 00000000..21ab420c --- /dev/null +++ b/docs/dws/dev/dws_06_0118.html @@ -0,0 +1,197 @@ + + + +

DDL Syntax

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0119.html b/docs/dws/dev/dws_06_0119.html new file mode 100644 index 00000000..abe9fadc --- /dev/null +++ b/docs/dws/dev/dws_06_0119.html @@ -0,0 +1,509 @@ + + +

DDL Syntax Overview

+

Data definition language (DDL) is used to define or modify an object in a database, such as a table, index, or view.

+

GaussDB(DWS) does not support DDL if its CN is unavailable. For example, if a CN in the cluster is faulty, creating a database or table will fail.

+
+

Defining a Database

A database is the warehouse for organizing, storing, and managing data. Defining a database includes: creating a database, altering the database attributes, and dropping the database. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 1 SQL statements for defining a database

Function

+

SQL Statement

+

Create a database

+

CREATE DATABASE

+

Alter database attributes

+

ALTER DATABASE

+

Delete a database

+

DROP DATABASE

+
+
+
+

Defining a Schema

A schema is the set of a group of database objects and is used to control the access to the database objects. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 2 SQL statements for defining a schema

Function

+

SQL Statement

+

Create a schema

+

CREATE SCHEMA

+

Alter schema attributes

+

ALTER SCHEMA

+

Delete a schema

+

DROP SCHEMA

+
+
+
+

Defining a Table

A table is a special data structure in a database and is used to store data objects and the relationship between data objects. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + + + + +
Table 3 SQL statements for defining a table

Function

+

SQL Statement

+

Create a table

+

CREATE TABLE

+

Alter table attributes

+

ALTER TABLE

+

Delete a table

+

DROP TABLE

+

Delete all the data from a table

+

TRUNCATE

+
+
+
+

Defining a Partitioned Table

A partitioned table is a special data structure in a database and is used to store data objects and the relationship between data objects. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + + + + + + + +
Table 4 SQL statements for defining a partitioned table

Function

+

SQL Statement

+

Create a partitioned table

+

CREATE TABLE PARTITION

+

Create a partition

+

ALTER TABLE PARTITION

+

Alter partitioned table attributes

+

ALTER TABLE PARTITION

+

Delete a partition

+

ALTER TABLE PARTITION

+

Delete a partitioned table

+

DROP TABLE

+
+
+
+

Defining an Index

An index indicates the sequence of values in one or more columns in the database table. The database index is a data structure that improves the speed of data access to specific information in a database table. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + + + + +
Table 5 SQL statements for defining an index

Function

+

SQL Statement

+

Create an index

+

CREATE INDEX

+

Alter index attributes

+

ALTER INDEX

+

Delete an index

+

DROP INDEX

+

Rebuild an index

+

REINDEX

+
+
+
+

Defining a Role

A role is used to manage rights. For database security, all management and operation rights can be assigned to different roles. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 6 SQL statements for defining a role

Function

+

SQL Statement

+

Create a role

+

CREATE ROLE

+

Alter role attributes

+

ALTER ROLE

+

Delete a role

+

DROP ROLE

+
+
+
+

Defining a User

A user is used to log in to a database. Different rights can be assigned to users for managing data accesses and operations of users. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 7 SQL statements for defining a user

Function

+

SQL Statement

+

Create a user

+

CREATE USER

+

Alter user attributes

+

ALTER USER

+

Delete a user

+

DROP USER

+
+
+
+

Defining a Redaction Policy

Data redaction is to protect sensitive data by masking or changing data. You can create a data redaction policy for a specific table object and specify the effective scope of the policy. You can also add, modify, and delete redaction columns. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 8 SQL statements for managing redaction policies

Function

+

SQL Statement

+

Create a data redaction policy

+

CREATE REDACTION POLICY

+

Modify a data redaction policy applied to a specified table

+

ALTER REDACTION POLICY

+

Delete a data redaction policy applied to a specified table

+

DROP REDACTION POLICY

+
+
+
+

Defining Row-Level Access Control

Row-level access control policies control the visibility of rows in database tables. In this way, the same SQL query may return different results for different users. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 9 SQL statements for row-level access control

Function

+

SQL Statement

+

Create a row-level access control policy

+

CREATE ROW LEVEL SECURITY POLICY

+

Modify an existing row-level access control policy

+

ALTER ROW LEVEL SECURITY POLICY

+

Delete a row-level access control policy from a table

+

DROP ROW LEVEL SECURITY POLICY

+
+
+
+

Defining a Stored Procedure

A stored procedure is a set of SQL statements for achieving specific functions and is stored in the database after compiling. Users can specify a name and provide parameters (if necessary) to execute the stored procedure. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + +
Table 10 SQL statements for defining a stored procedure

Function

+

SQL Statement

+

Create a stored procedure

+

CREATE PROCEDURE

+

Delete a stored procedure

+

DROP PROCEDURE

+
+
+
+

Defining a Function

In GaussDB(DWS), a function is similar to a stored procedure, which is a set of SQL statements. The function and stored procedure are used the same. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 11 SQL statements for defining a function

Function

+

SQL Statement

+

Create a function

+

CREATE FUNCTION

+

Alter function attributes

+

ALTER FUNCTION

+

Delete a function

+

DROP FUNCTION

+
+
+
+

Defining a View

A view is a virtual table exported from one or several basic tables. The view is used to control data accesses for users. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + +
Table 12 SQL statements for defining a view

Function

+

SQL Statement

+

Create a view

+

CREATE VIEW

+

Delete a view

+

DROP VIEW

+
+
+
+

Defining a Cursor

To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers to context regions. With a cursor, the stored procedure can control alterations in context areas.

+ +
+ + + + + + + + + + + + + + + + +
Table 13 SQL statements for defining a cursor

Function

+

SQL Statement

+

Create a cursor

+

CURSOR

+

Move a cursor

+

MOVE

+

Extract data from a cursor

+

FETCH

+

Close a cursor

+

CLOSE

+
+
+
+

Altering or Ending a Session

A session is a connection established between the user and the database. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + +
Table 14 SQL statements related to sessions

Function

+

SQL Statement

+

Alter a session

+

ALTER SESSION

+

End a session

+

ALTER SYSTEM KILL SESSION

+
+
+
+

Defining a Resource Pool

A resource pool is a system catalog used by the resource load management module to specify attributes related to resource management, such as Cgroups. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 15 SQL statements for defining a resource pool

Function

+

SQL Statement

+

Create a resource pool

+

CREATE RESOURCE POOL

+

Change resource attributes

+

ALTER RESOURCE POOL

+

Delete a resource pool

+

DROP RESOURCE POOL

+
+
+
+

Defining Synonyms

A synonym is a special database object compatible with Oracle. It is used to store the mapping between a database object and another. Currently, only synonyms can be used to associate the following database objects: tables, views, functions, and stored procedures. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 16 SQL statements for managing synonyms

Function

+

SQL Statement

+

Creating a synonym

+

CREATE SYNONYM

+

Modifying a synonym

+

ALTER SYNONYM

+

Deleting a synonym

+

DROP SYNONYM

+
+
+
+

Defining Text Search Configuration

A text search configuration specifies a text search parser that can divide a string into tokens, plus dictionaries that can be used to determine which tokens are of interest for searching. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 17 SQL statements for configuring text search

Function

+

SQL Statement

+

Create a text search configuration

+

CREATE TEXT SEARCH CONFIGURATION

+

Modify a text search configuration

+

ALTER TEXT SEARCH CONFIGURATION

+

Delete a text search configuration

+

DROP TEXT SEARCH CONFIGURATION

+
+
+
+

Defining a Full-text Retrieval Dictionary

A dictionary is used to identify and process specific words during full-text retrieval. Dictionaries are created by using predefined templates (defined in the PG_TS_TEMPLATE system catalog). Dictionaries of the Simple, Ispell, Synonym, Thesaurus, and Snowball types can be created. The following table lists the related SQL statements.

+ +
+ + + + + + + + + + + + + +
Table 18 SQL statements for a full-text search dictionary

Function

+

SQL Statement

+

Create a full-text retrieval dictionary

+

CREATE TEXT SEARCH DICTIONARY

+

Modify a full-text retrieval dictionary

+

ALTER TEXT SEARCH DICTIONARY

+

Delete a full-text retrieval dictionary

+

DROP TEXT SEARCH DICTIONARY

+
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0120.html b/docs/dws/dev/dws_06_0120.html new file mode 100644 index 00000000..afad4f60 --- /dev/null +++ b/docs/dws/dev/dws_06_0120.html @@ -0,0 +1,116 @@ + + +

ALTER DATABASE

+

Function

This command is used to modify the attributes of a database, including the database name, owner, maximum number of connections, and object isolation attribute.

+
+

Important Notes

  • Only the owner of a database or a system administrator has the permission to run the ALTER DATABASE statement. Users other than system administrators may have the following permission constraints depending on the attributes to be modified:
    • To modify the database name, you must have the CREATEDB permission.
    • To modify a database owner, you must be a database owner and a member of the new owner, and have the CREATEDB permission.
    • To change the default tablespace, you must be a database owner or a system administrator, and must have the CREATE permission on the new tablespace. This statement physically migrates tables and indexes in a default tablespace to a new tablespace. Note that tables and indexes outside the default tablespace are not affected.
    • Only a database owner or a system administrator can modify GUC parameters for the database.
    • Only database owners and system administrators can modify the object isolation attribute of a database.
    +
  • You are not allowed to rename a database in use. To rename it, connect to another database.
  • Database compatibility cannot be modified, it can only be specified during database creation. For details, see the section "CREATE DATABASE" in SQL Syntax Reference
+
+

Syntax

  • Modify the maximum number of connections of the database.
    1
    +2
    ALTER DATABASE database_name
    +    [ [ WITH ] CONNECTION LIMIT connlimit ];
    +
    + +
    +
  • Rename the database.
    1
    +2
    ALTER DATABASE database_name
    +    RENAME TO new_name;
    +
    + +
    +

    If the database contains OBS hot or cold tables, the database name cannot be changed.

    +
    +
  • Change the database owner.
    1
    +2
    ALTER DATABASE database_name
    +    OWNER TO new_owner;
    +
    + +
    +
  • Change the default tablespace of the database.
    1
    +2
    ALTER DATABASE database_name
    +    SET TABLESPACE new_tablespace;
    +
    + +
    +

    The current tablespaces cannot be changed to OBS tablespaces.

    +
    +
  • Modify the session parameter value of the database.
    1
    +2
    ALTER DATABASE database_name
    +    SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT };
    +
    + +
    +
  • Reset the database configuration parameter.
    1
    +2
    ALTER DATABASE database_name RESET
    +    { configuration_parameter | ALL };
    +
    + +
    +
+
+
  • Modify the object isolation attribute of a database.
    1
    ALTER DATABASE database_name [ WITH ] { ENABLE | DISABLE } PRIVATE OBJECT;
    +
    + +
    +
    • To modify the object isolation attribute of a database, the database must be connected. Otherwise, the modification will fail.
    • For a new database, the object isolation attribute is disabled by default. After this attribute is enabled, common users can view only the objects (such as tables, functions, views, and columns) that they have the permission to access. This attribute does not take effect for administrators. After this attribute is enabled, administrators can still view all database objects.
    +
    +
+

Parameter Description

  • database_name

    Specifies the name of the database whose attributes are to be modified.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • connlimit

    Specifies the maximum number of concurrent connections that can be made to this database (excluding administrators' connections).

    +

    Value range: The value must be an integer, preferably between 1 and 50. The default value -1 indicates no restrictions.

    +
  • new_name

    Specifies the new name of a database.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • new_owner

    Specifies the new owner of a database.

    +

    Value range: a string indicating a valid user name

    +
  • configuration_parameter

    value

    +

    Sets a specified database session parameter. If the value is DEFAULT or RESET, the default setting is used in the new session. OFF closes the setting.

    +

    Value range: a string. It can be set to:

    +
    • DEFAULT
    • OFF
    • RESET
    +
  • FROM CURRENT

    Sets the value based on the database connected to the current session.

    +
  • RESET configuration_parameter

    Resets the specified database session parameter.

    +
  • RESET ALL

    Resets all database session parameters.

    +
+
  • Modifies the default tablespace of a database by moving all the tables or indexes from the old tablespace to the new one. This operation does not affect the tables or indexes in other non-default tablespaces.
  • The modified database session parameter values will take effect in the next session.
+
+
+

Examples

Modify the number of connections of the music database.

+
1
ALTER DATABASE music CONNECTION LIMIT= 10;
+
+ +
+

Change the name of the music database to music1.

+
1
ALTER DATABASE music RENAME TO music1;
+
+ +
+

Change the owner of the music1 database.

+
1
ALTER DATABASE music1 OWNER TO tom;
+
+ +
+

Modify the tablespace of the music1 database.

+
1
ALTER DATABASE music1 SET TABLESPACE PG_DEFAULT;
+
+ +
+

Disable the default index scan on the music1 database.

+
1
ALTER DATABASE music1 SET enable_indexscan TO off;
+
+ +
+

Reset the enable_indexscan parameter of the music1 database.

+
1
ALTER DATABASE music1 RESET enable_indexscan;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0123.html b/docs/dws/dev/dws_06_0123.html new file mode 100644 index 00000000..039968eb --- /dev/null +++ b/docs/dws/dev/dws_06_0123.html @@ -0,0 +1,43 @@ + + +

ALTER FOREIGN TABLE (for GDS)

+

Function

ALTER FOREIGN TABLE modifies a foreign table.

+
+

Precautions

None

+
+

Syntax

  • Set the attributes of a foreign table.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ]  table_name
    +    OPTIONS ( {[ ADD | SET | DROP ] option ['value']}[, ... ]);
    +
    + +
    +
  • Set a new owner.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ] tablename
    +    OWNER TO new_owner;
    +
    + +
    +
+
+

Parameter Description

  • table_name

    Specifies the name of an existing foreign table to be modified.

    +

    Value range: an existing foreign table name.

    +
  • option

    Name of the option to be modified.

    +

    Value range: See Parameter Description in CREATE FOREIGN TABLE.

    +
  • value

    Specifies the new value of option.

    +
+
+

Examples

Modify the customer_ft attribute of the foreign table. Delete the mode option.

+
1
ALTER FOREIGN TABLE customer_ft options(drop mode);
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0124.html b/docs/dws/dev/dws_06_0124.html new file mode 100644 index 00000000..195e6dca --- /dev/null +++ b/docs/dws/dev/dws_06_0124.html @@ -0,0 +1,103 @@ + + +

ALTER FOREIGN TABLE (for HDFS or OBS)

+

Function

ALTER FOREIGN TABLE modifies an HDFS or OBS foreign table.

+
+

Precautions

None

+
+

Syntax

  • Set a foreign table's attributes.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ]  table_name
    +    OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ]);
    +
    + +
    +
  • Set the owner of the foreign table.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
    +    OWNER TO new_owner;
    +
    + +
    +
+
  • Update a foreign table column.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ] table_name
    +    MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] );
    +
    + +
    +
  • Modify the column of the foreign table.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
    +    action [, ... ];
    +
    + +
    +
    The action syntax is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type
    +   | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
    +   | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer
    +   | ALTER [ COLUMN ] column_name OPTIONS ( {[ ADD | SET | DROP ] option ['value'] } [, ... ])
    +   | MODIFY column_name data_type
    +   | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]
    +   | MODIFY column_name [ CONSTRAINT constraint_name ] NULL
    +
    + +
    +
    +

    For details, see ALTER TABLE.

    +
+
+
  • Add a foreign table informational constraint.
    1
    +2
    +3
    +4
    ALTER FOREIGN TABLE [ IF EXISTS ] tablename
    +    ADD [ CONSTRAINT constraint_name ]
    +    { PRIMARY KEY | UNIQUE } ( column_name )
    +    [ NOT ENFORCED [ ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION ] | ENFORCED ];
    +
    + +
    +

    For parameters about adding an informational constraint to a foreign table, see Parameter Description in CREATE FOREIGN TABLE (For HDFS).

    +
  • Remove a foreign table informational constraint.
    1
    +2
    ALTER FOREIGN TABLE [ IF EXISTS ] tablename 
    +    DROP CONSTRAINT constraint_name ;
    +
    + +
    +
+

Parameter Description

  • IF EXISTS

    Sends a notification instead of an error if no tables have identical names. The notification prompts that the table you are querying does not exist.

    +
  • tablename

    Specifies the name of an existing foreign table to be modified.

    +

    Value range: an existing foreign table name

    +
  • new_owner

    Specifies the new owner of the foreign table.

    +

    Value range: A string indicating a valid user name.

    +
  • data_type

    Specifies the new type for an existing column.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • constraint_name

    Specifies the name of a constraint to add or delete.

    +
  • column_name

    Specifies the name of an existing column.

    +

    Value range: a string. It must comply with the naming convention.

    +
+

For details on how to modify other parameters in the foreign table, such as IF EXISTS, see Parameter Description in ALTER TABLE.

+
+

Examples

Change the type of the r_name column to text in the ft_region foreign table.

+
1
ALTER FOREIGN TABLE ft_region ALTER r_name TYPE TEXT;
+
+ +
+
Run the following command to mark the r_name column of the ft_region foreign table as not null:
1
ALTER FOREIGN TABLE ft_region ALTER r_name SET NOT NULL;
+
+ +
+
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0126.html b/docs/dws/dev/dws_06_0126.html new file mode 100644 index 00000000..dfd270c4 --- /dev/null +++ b/docs/dws/dev/dws_06_0126.html @@ -0,0 +1,128 @@ + + +

ALTER FUNCTION

+

Function

ALTER FUNCTION modifies the attributes of a customized function.

+
+

Precautions

Only the owner of a function or a system administrator can run this statement. If a function involves operations on temporary tables, the ALTER FUNCTION cannot be used.

+
+

Syntax

  • Modify the additional parameter of the customized function.
    1
    +2
    ALTER FUNCTION function_name ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
    +    action [ ... ] [ RESTRICT ];
    +
    + +
    +

    The syntax of the action clause is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT}
    + | {IMMUTABLE | STABLE | VOLATILE}
    + | {SHIPPABLE | NOT SHIPPABLE}
    + | {NOT FENCED | FENCED}
    + | [ NOT ] LEAKPROOF
    + | { [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER }
    + | AUTHID { DEFINER | CURRENT_USER }
    + | COST execution_cost
    + | ROWS result_rows
    + | SET configuration_parameter { { TO | = } { value | DEFAULT }| FROM CURRENT}
    + | RESET {configuration_parameter | ALL}
    +
    + +
    +
  • Modify the name of the customized function.
    1
    +2
    ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
    +    RENAME TO new_name;
    +
    + +
    +
  • Modify the owner of the customized function.
    1
    +2
    ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
    +    OWNER TO new_owner;
    +
    + +
    +
  • Modify the schema of the customized function.
    1
    +2
    ALTER FUNCTION funname ( [ { [ argmode ] [ argname ] argtype} [, ...] ] )
    +    SET SCHEMA new_schema;
    +
    + +
    +
+
+

Parameter Description

  • function_name

    Specifies the function name to be modified.

    +

    Value range: An existing function name.

    +
  • argmode

    Specifies whether a parameter is an input or output parameter.

    +

    Value range: IN, OUT, IN OUT

    +
  • argname

    Indicates the parameter name.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • argtype

    Specifies the parameter type.

    +

    Value range: A valid type. For details, see Data Types.

    +
  • CALLED ON NULL INPUT

    Declares that some parameters of the function can be invoked in normal mode if the parameter values are NULL. By default, the usage is the same as specifying the parameters.

    +
  • RETURNS NULL ON NULL INPUT

    STRICT

    +

    Indicates that the function always returns NULL whenever any of its arguments are NULL. If this parameter is specified, the function is not executed when there are null arguments; instead a null result is assumed automatically.

    +

    The usage of RETURNS NULL ON NULL INPUT is the same as that of STRICT.

    +
  • IMMUTABLE

    Indicates that the function always returns the same result if the parameter values are the same.

    +
  • STABLE

    Indicates that the function cannot modify the database, and that within a single table scan it will consistently return the same result for the same parameter values, but that its result varies by SQL statements.

    +
  • VOLATILE

    Indicates that the function value can change in one table scanning and no optimization is performed.

    +
  • SHIPPABLE
  • NOT SHIPPABLE

    Indicates whether the function can be pushed down to DNs for execution.

    +

    Functions of the IMMUTABLE type can always be pushed down to the DNs.

    +

    Functions of the STABLE or VOLATILE type can be pushed down to DNs only if their attribute is SHIPPABLE.

    +
  • LEAKPROOF

    Indicates that the function has no side effect and specifies that the parameter includes only the returned value. LEAKPROOF can be set only by the system administrator.

    +
  • EXTERNAL

    (Optional) The objective is to be compatible with SQL. This feature applies to all functions, including external functions.

    +
  • SECURITY INVOKER

    AUTHID CURREN_USER

    +

    Declares that the function will be executed according to the permission of the user that invokes it. By default, the usage is the same as specifying the parameters.

    +

    SECURITY INVOKER and AUTHID CURREN_USER have the same functions.

    +
  • SECURITY DEFINER

    AUTHID DEFINER

    +

    Specifies that the function is to be executed with the permissions of the user that created it.

    +

    The usage of AUTHID DEFINER is the same as that of SECURITY DEFINER.

    +
  • COST execution_cost

    A positive number giving the estimated execution cost for the function.

    +

    The unit of execution_cost is cpu_operator_cost.

    +

    Value range: A positive number.

    +
  • ROWS result_rows

    Estimates the number of rows returned by the function. This is only allowed when the function is declared to return a set.

    +

    Value range: A positive number. The default is 1000 rows.

    +
  • configuration_parameter
    • value

      Sets a specified database session parameter to a specified value. If the value is DEFAULT or RESET, the default setting is used in the new session. OFF closes the setting.

      +

      Value range: a string

      +
      • DEFAULT
      • OFF
      • RESET
      +

      Specifies the default value.

      +
    • from current

      Uses the value of configuration_parameter of the current session.

      +
    +
  • new_name

    Specifies the new name of a function. To change a function's schema, you must also have the CREATE permission on the new schema.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • new_owner

    Specifies the new owner of a function. To alter the owner, the new owner must also be a direct or indirect member of the new owning role, and that role must have CREATE permission on the function's schema.

    +

    Value range: Existing user roles.

    +
  • new_schema

    Specifies the new schema of a function.

    +

    Value range: Existing schemas.

    +
+
+

Examples

Alter the execution rule of the func_add_sql function to IMMUTABLE (that is, the same result is returned if the parameter remains unchanged):

+
1
ALTER FUNCTION func_add_sql(INTEGER, INTEGER) IMMUTABLE;
+
+ +
+

Change the name of the func_add_sql function to add_two_number.

+
1
ALTER FUNCTION func_add_sql(INTEGER, INTEGER) RENAME TO add_two_number;
+
+ +
+

Change the owner of the func_add_sql function to dbadmin.

+
1
ALTER FUNCTION add_two_number(INTEGER, INTEGER) OWNER TO dbadmin;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0127.html b/docs/dws/dev/dws_06_0127.html new file mode 100644 index 00000000..ef4f892c --- /dev/null +++ b/docs/dws/dev/dws_06_0127.html @@ -0,0 +1,39 @@ + + +

ALTER GROUP

+

Function

ALTER GROUP modifies the attributes of a user group.

+
+

Precautions

ALTER GROUP is an alias for ALTER ROLE, and it is not a standard SQL command and not recommended. Users can use ALTER ROLE directly.

+
+

Syntax

  • Add users to a group.
    1
    +2
    ALTER GROUP group_name 
    +    ADD USER user_name [, ... ];
    +
    + +
    +
+
  • Remove users from a group.
    1
    +2
    ALTER GROUP group_name 
    +    DROP USER user_name [, ... ];
    +
    + +
    +
  • Change the name of the group.
    1
    +2
    ALTER GROUP group_name 
    +    RENAME TO new_name;
    +
    + +
    +
+
+

Parameter Description

See the Example in ALTER ROLE.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0128.html b/docs/dws/dev/dws_06_0128.html new file mode 100644 index 00000000..e88935a5 --- /dev/null +++ b/docs/dws/dev/dws_06_0128.html @@ -0,0 +1,102 @@ + + +

ALTER INDEX

+

Function

ALTER INDEX modifies the definition of an existing index.

+

There are several sub-forms:

+
  • IF EXISTS

    If the specified index does not exist, a notice instead of an error is sent.

    +
  • RENAME TO

    Changes only the name of the index. There is no effect on the stored data.

    +
  • SET ( { STORAGE_PARAMETER = value } [, ...] )

    Change one or more index-method-specific storage parameters. Note that the index contents will not be modified immediately by this command. You might need to rebuild the index with REINDEX to get the desired effects depending on parameters.

    +
  • RESET ( { storage_parameter } [, ...] )

    Reset one or more index-method-specific storage parameters to the default value. Similar to the SET statement, REINDEX may be used to completely update the index.

    +
  • [ MODIFY PARTITION index_partition_name ] UNUSABLE

    Sets the index on a table or index partition to be unavailable.

    +
  • REBUILD [ PARTITION index_partition_name ]

    Recreates the index on a table or index partition.

    +
  • RENAME PARTITION

    Renames an index partition.

    +
+
+

Precautions

  • Only the owner of an index or a system administrator can run this statement.
+
+

Syntax

  • Rename a table index.
    1
    +2
    ALTER INDEX [ IF EXISTS ] index_name 
    +    RENAME TO new_name;
    +
    + +
    +
+
  • Modify the storage parameter of a table index.
    1
    +2
    ALTER INDEX [ IF EXISTS ] index_name 
    +    SET ( {storage_parameter = value} [, ... ] );
    +
    + +
    +
+
  • Reset the storage parameter of a table index.
    1
    +2
    ALTER INDEX [ IF EXISTS ] index_name 
    +    RESET ( storage_parameter [, ... ] ) ;
    +
    + +
    +
+
  • Set a table index or an index partition to be unavailable.
    1
    +2
    ALTER INDEX [ IF EXISTS ] index_name 
    +    [ MODIFY PARTITION index_partition_name ] UNUSABLE;
    +
    + +
    +

    The syntax cannot be used for column-store tables.

    +
    +
+
  • Rebuild a table index or index partition.
    1
    +2
    ALTER INDEX index_name 
    +    REBUILD [ PARTITION index_partition_name ];
    +
    + +
    +
+
  • Rename an index partition.
    1
    +2
    ALTER INDEX [ IF EXISTS ] index_name 
    +    RENAME PARTITION index_partition_name TO new_index_partition_name;
    +
    + +
    +

    PG_OBJECT does not support the record of the syntax when the last modification time of the index is recorded.

    +
    +
+
+

Parameter Description

  • index_name

    Specifies the index name to be modified.

    +
  • new_name

    Specifies the new name for the index.

    +

    Value range: a string that must comply with the identifier naming rules.

    +
  • storage_parameter

    Specifies the name of an index-method-specific parameter.

    +
  • value

    Specifies the new value for an index-method-specific storage parameter. This might be a number or a word depending on the parameter.

    +
  • new_index_partition_name

    Specifies the new name of the index partition.

    +
  • index_partition_name

    Specifies the name of the index partition.

    +
+
+

Examples

Rename the ds_ship_mode_t1_index1 index to ds_ship_mode_t1_index5.

+
1
ALTER INDEX tpcds.ds_ship_mode_t1_index1 RENAME TO ds_ship_mode_t1_index5;
+
+ +
+

Set the ds_ship_mode_t1_index2 index as unusable.

+
1
ALTER INDEX tpcds.ds_ship_mode_t1_index2 UNUSABLE;
+
+ +
+

Rebuild the ds_ship_mode_t1_index2 index.

+
1
ALTER INDEX tpcds.ds_ship_mode_t1_index2 REBUILD;
+
+ +
+

Rename a partitioned table index.

+
1
ALTER INDEX tpcds.ds_customer_address_p1_index2 RENAME PARTITION CA_ADDRESS_SK_index1 TO CA_ADDRESS_SK_index4;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0129.html b/docs/dws/dev/dws_06_0129.html new file mode 100644 index 00000000..bdf8b3c1 --- /dev/null +++ b/docs/dws/dev/dws_06_0129.html @@ -0,0 +1,29 @@ + + +

ALTER LARGE OBJECT

+

Function

ALTER LARGE OBJECT modifies the definition of a large object. It can only assign a new owner to a large object.

+
+

Precautions

Only the administrator or the owner of the to-be-modified large object can run ALTER LARGE OBJECT.

+
+

Syntax

1
+2
ALTER LARGE OBJECT large_object_oid 
+    OWNER TO new_owner;
+
+ +
+
+

Parameter Description

  • large_object_oid

    OID of a large object.

    +

    Value range: an existing large object name

    +
  • OWNER TO new_owner

    New owner of a large object

    +

    Value range: an existing user name/role

    +
+
+

Examples

None.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0132.html b/docs/dws/dev/dws_06_0132.html new file mode 100644 index 00000000..ecb67a13 --- /dev/null +++ b/docs/dws/dev/dws_06_0132.html @@ -0,0 +1,98 @@ + + +

ALTER REDACTION POLICY

+

Function

ALTER REDACTION POLICY modifies a data redaction policy applied to a specified table.

+
+

Precautions

Only the owner of the table to which the redaction policy is applied has the permission to modify the redaction policy.

+
+

Syntax

  • Modify the expression used for a redaction policy to take effect.
    1
    ALTER REDACTION POLICY policy_name ON table_name WHEN (new_when_expression);
    +
    + +
    +
+
+
  • Enable or disable a redaction policy.
    1
    ALTER REDACTION POLICY policy_name ON table_name ENABLE | DISABLE;
    +
    + +
    +
  • Rename a redaction policy.
    1
    ALTER REDACTION POLICY policy_name ON table_name RENAME TO new_policy_name;
    +
    + +
    +
  • Add, modify, or delete a column on which the redaction policy is used.
    1
    +2
    ALTER REDACTION POLICY policy_name ON table_name 
    +    action;
    +
    + +
    +

    There are several clauses of action:

    +
    1
    +2
    +3
    ADD COLUMN column_name WITH function_name ( arguments )
    +  | MODIFY COLUMN column_name WITH function_name ( arguments )
    +  | DROP COLUMN column_name
    +
    + +
    +
+

Parameter Description

  • policy_name

    Specifies the name of the redaction policy to be modified.

    +
  • table_name

    Specifies the name of the table to which the redaction policy is applied.

    +
  • new_when_expression

    Specifies the new expression used for the redaction policy to take effect.

    +
  • ENABLE | DISABLE

    Specifies whether to enable or disable the current redaction policy.

    +
    • ENABLE

      Enables the redaction policy that was previously disabled for the table.

      +
    • DISABLE

      Disables the redaction policy currently applied to the table.

      +
    +
  • new_policy_name

    Specifies the new name of the redaction policy.

    +
  • column_name

    Specifies the name of the table column to which the redaction policy is applied.

    +

    To add a column, use a column name that has not been bound to any redaction functions.

    +

    To modify a column, use the name of an existing column.

    +

    To delete a column, use the name of an existing column.

    +
  • function_name

    Specifies the name of a redaction function.

    +
  • arguments

    Specifies the list of arguments of the redaction function.

    +
+
+

Examples

Modify the expression for the data redaction policy to take effect for all users.

+
1
ALTER REDACTION POLICY mask_emp ON emp WHEN (1=1);
+
+ +
+

Disable the redaction policy.

+
1
ALTER REDACTION POLICY mask_emp ON emp DISABLE;
+
+ +
+

Enable the redaction policy again.

+
1
ALTER REDACTION POLICY mask_emp ON emp ENABLE;
+
+ +
+

Change the redaction policy name to mask_emp_new.

+
1
ALTER REDACTION POLICY mask_emp ON emp RENAME TO mask_emp_new;
+
+ +
+

Add a column with the redaction policy used.

+
1
ALTER REDACTION POLICY mask_emp_new ON emp ADD COLUMN name WITH mask_partial(name, '*', 1, length(name));
+
+ +
+

Modify the redaction policy for the name column. Use the MASK_FULL function to redact all data in the name column.

+
1
ALTER REDACTION POLICY mask_emp_new ON emp MODIFY COLUMN name WITH mask_full(name);
+
+ +
+

Delete an existing column where the redaction policy is used.

+
1
ALTER REDACTION POLICY mask_emp_new ON emp DROP COLUMN name;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0133.html b/docs/dws/dev/dws_06_0133.html new file mode 100644 index 00000000..29cbb368 --- /dev/null +++ b/docs/dws/dev/dws_06_0133.html @@ -0,0 +1,53 @@ + + +

ALTER RESOURCE POOL

+

Function

ALTER RESOURCE POOL changes the Cgroup of a resource pool.

+
+

Precautions

Users having the ALTER permission can modify resource pools.

+
+

Syntax

1
+2
ALTER RESOURCE POOL pool_name
+    WITH ({MEM_PERCENT= pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='io_priority'}[, ... ]);
+
+ +
+
+

Parameter Description

  • pool_name

    Specifies the name of the resource pool.

    +

    The name of the resource pool is the name of an existing resource pool.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • group_name

    Specifies the name of a Cgroup.

    +
    • You can use either double quotation marks ("") or single quotation mark ('') in the syntax when setting the name of a Cgroup.
    • The value of group_name is case-sensitive.
    • When group_name is not specified, the default value "Medium" is used. It is the "Medium" Timeshare Cgroup

      of the DefaultClass Cgroup.

      +
    • If a database user specifies the Timeshare string (Rush, High, Medium, or Low) in the syntax, for example, if control_group is set to High, the resource pool will be associated with the High Timeshare Cgroup under DefaultClass.
    +
    +

    Value range: an existing control group.

    +
  • stmt

    Specifies the maximum number of statements that can be concurrently executed in a resource pool.

    +

    Value range: Numeric data ranging from -1 to INT_MAX.

    +
  • dop

    This is a reserved parameter.

    +

    Value range: Numeric data ranging from -1 to INT_MAX.

    +
  • memory_size

    Specifies the maximum storage for a resource pool.

    +

    Value range: a string, from 1KB to 2047GB.

    +
  • mem_percent

    Specifies the proportion of available resource pool memory to the total memory or group user memory.

    +

    The value of mem_percent for a common user is an integer ranging from 0 to 100. The default value is 0.

    +
  • io_limits

    Specifies the upper limit of IOPS in a resource pool.

    +

    The IOPS is counted by ones for column storage and by 10 thousands for row storage.

    +
  • io_priority

    Specifies the I/O priority for jobs that consume many I/O resources. It takes effect when the I/O usage reaches 90%.

    +

    There are three priorities: Low, Medium, and High. If you do not want to control I/O resources, set this parameter to None, which is the default value.

    +
+

The settings of io_limits and io_priority are valid only for complex jobs, such as batch import (using INSERT INTO SELECT, COPY FROM, or CREATE TABLE AS), complex queries involving over 500 MB data on each DN, and VACUUM FULL.

+
+
+

Examples

Specify "High" Timeshare Workload under "DefaultClass" as the Cgroup for a resource pool.

+
+
1
ALTER RESOURCE POOL pool1 WITH (CONTROL_GROUP="High");
+
+ +
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0134.html b/docs/dws/dev/dws_06_0134.html new file mode 100644 index 00000000..a0368934 --- /dev/null +++ b/docs/dws/dev/dws_06_0134.html @@ -0,0 +1,129 @@ + + +

ALTER ROLE

+

Function

ALTER ROLE changes the attributes of a role.

+
+

Important Notes

None

+
+

Syntax

  • Modifying the Rights of a Role
    1
    ALTER ROLE role_name [ [ WITH ] option [ ... ] ];
    +
    + +
    +

    The option clause for granting rights is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    {CREATEDB | NOCREATEDB}
    +    | {CREATEROLE | NOCREATEROLE}
    +    | {INHERIT | NOINHERIT}
    +    | {AUDITADMIN | NOAUDITADMIN}
    +    | {SYSADMIN | NOSYSADMIN}
    +    | {USEFT | NOUSEFT}
    +    | {LOGIN | NOLOGIN}
    +    | {REPLICATION | NOREPLICATION}
    +    | {INDEPENDENT | NOINDEPENDENT}
    +    | {VCADMIN | NOVCADMIN}
    +    | CONNECTION LIMIT connlimit
    +    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    +    | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY 'password' [ REPLACE 'old_password' ]
    +    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' | DISABLE }
    +    | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' ] | DISABLE }
    +    | VALID BEGIN 'timestamp'
    +    | VALID UNTIL 'timestamp'
    +    | RESOURCE POOL 'respool'
    +    | USER GROUP 'groupuser'
    +    | PERM SPACE 'spacelimit'
    +    | NODE GROUP logic_cluster_name
    +    | ACCOUNT { LOCK | UNLOCK }
    +    | PGUSER
    +    | AUTHINFO 'authinfo'
    +    | PASSWORD EXPIRATOIN period
    +
    + +
    +
  • Rename a role.
    1
    +2
    ALTER ROLE role_name 
    +    RENAME TO new_name;
    +
    + +
    +
  • Set parameters for a role.
    1
    +2
    ALTER ROLE role_name [ IN DATABASE database_name ]
    +    SET configuration_parameter {{ TO | = } { value | DEFAULT } | FROM CURRENT};
    +
    + +
    +
  • Reset parameters for a role.
    1
    +2
    ALTER ROLE role_name
    +    [ IN DATABASE database_name ] RESET {configuration_parameter|ALL};
    +
    + +
    +
+
+

Parameters

  • role_name

    Indicates a role name.

    +

    Value range: an existing user name

    +
  • IN DATABASE database_name

    Modifies the parameters of a role on a specified database.

    +
  • SET configuration_parameter

    Sets parameters for a role. The session parameters modified using the ALTER ROLE command is only for a specific role and is valid in the next session triggered by the role.

    +

    Valid value:

    +

    Values of configuration_parameter and value are listed in SET.

    +

    DEFAULT clears the value of configuration_parameter. The value of the configuration_parameter parameter will inherit the default value of the new session generated for the role.

    +

    FROM CURRENT uses the value of configuration_parameter of the current session.

    +
  • RESET configuration_parameter/ALL

    The effect of clearing the configuration_parameter value is the same as setting it to DEFAULT.

    +

    Value range: ALL indicates that all parameter values are cleared.

    +
  • ACCOUNT LOCK | ACCOUNT UNLOCK
    • ACCOUNT LOCK: locks an account to forbid login to databases.
    • ACCOUNT UNLOCK: unlocks an account to allow login to databases.
    +
  • PGUSER

    PGUSER of a role cannot be modified in the current version.

    +
+

For details about other parameters, see Parameter Description in CREATE ROLE.

+
+

Example

Change the password of role manager.

+
1
ALTER ROLE manager IDENTIFIED BY '{password}' REPLACE '{old_password}';
+
+ +
+

Alter role manager to a system administrator.

+
1
ALTER ROLE manager SYSADMIN;
+
+ +
+

Modify the fulluser information of the LDAP authentication role.

+
1
ALTER ROLE role2 WITH LOGIN AUTHINFO 'ldapcn=role2,cn=user2,dc=func,dc=com' PASSWORD DISABLE;
+
+ +
+

Change the validity period of the login password of the role to 90 days.

+
1
ALTER ROLE role3 PASSWORD EXPIRATION 90;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0135.html b/docs/dws/dev/dws_06_0135.html new file mode 100644 index 00000000..e588ac33 --- /dev/null +++ b/docs/dws/dev/dws_06_0135.html @@ -0,0 +1,52 @@ + + +

ALTER ROW LEVEL SECURITY POLICY

+

Function

ALTER ROW LEVEL SECURITY POLICY modifies an existing row-level access control policy, including the policy name and the users and expressions affected by the policy.

+
+

Precautions

Only the table owner or administrators can perform this operation.

+
+

Syntax

1
+2
+3
+4
+5
ALTER [ ROW LEVEL SECURITY ] POLICY [ IF EXISTS ] policy_name ON table_name RENAME TO new_policy_name
+
+ALTER [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
+    [ TO { role_name | PUBLIC } [, ...] ]
+    [ USING ( using_expression ) ]
+
+ +
+
+

Parameter Description

  • policy_name

    Specifies the name of a row-level access control policy to be modified.

    +
  • table_name

    Specifies the name of a table to which a row-level access control policy is applied.

    +
  • new_policy_name

    Specifies the new name of a row-level access control policy.

    +
  • role_name

    Specifies names of users affected by a row-level access control policy will be applied. PUBLIC indicates that the row-level access control policy will affect all users.

    +
  • using_expression

    Specifies an expression defined for a row-level access control policy. The return value is of the boolean type.

    +
+
+

Examples

Change the name of the all_data_rls policy.

+
1
ALTER ROW LEVEL SECURITY POLICY all_data_rls ON all_data RENAME TO all_data_new_rls;
+
+ +
+

Change the users affected by the row-level access control policy.

+
1
ALTER ROW LEVEL SECURITY POLICY all_data_new_rls ON all_data TO alice, bob;
+
+ +
+

Modify the expression defined for the access control policy.

+
1
ALTER ROW LEVEL SECURITY POLICY all_data_new_rls ON all_data USING (id > 100 AND role = current_user);
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0136.html b/docs/dws/dev/dws_06_0136.html new file mode 100644 index 00000000..2822f71b --- /dev/null +++ b/docs/dws/dev/dws_06_0136.html @@ -0,0 +1,61 @@ + + +

ALTER SCHEMA

+

Function

ALTER SCHEMA changes the attributes of a schema.

+
+

Precautions

Only the owner of an index or a system administrator can run this statement.

+
+

Syntax

  • Rename a schema.
    1
    +2
    ALTER SCHEMA schema_name 
    +    RENAME TO new_name;
    +
    + +
    +
  • Changes the owner of a schema.
    1
    +2
    ALTER SCHEMA schema_name 
    +    OWNER TO new_owner;
    +
    + +
    +
+
+
  • Changes the storage space limit of the permanent table in the schema.
    1
    +2
    ALTER SCHEMA schema_name 
    +    WITH PERM SPACE 'space_limit';
    +
    + +
    +
+

Parameter Description

  • schema_name

    Indicates the name of the current schema.

    +

    Value range: An existing schema name.

    +
  • RENAME TO new_name

    Renames a schema.

    +

    new_name: new name of the schema

    +

    Value range: A string. It must comply with the naming convention.

    +
  • OWNER TO new_owner

    Changes the owner of a schema. To do this as a non-administrator, you must be a direct or indirect member of the new owning role, and that role must have CREATE permission in the database.

    +

    new_owner: new owner of a schema

    +

    Value range: An existing user name/role.

    +
  • WITH PERM SPACE

    Changes the storage upper limit of the permanent table in the schema. If a non-administrator user wants to change the storage upper limit, the user must be a direct or indirect member of all new roles, and the member must have the CREATE permission on the database.

    +

    new_owner: new owner of a schema

    +

    Value range: A string consists of an integer and unit. The unit can be K/M/G/T/P currently. The unit of parsed value is K and cannot exceed the range that can be expressed in 64 bits, which is 1 KB to 9007199254740991 KB.

    +
+
+

Examples

Rename the ds schema to ds_new.

+
1
ALTER SCHEMA ds RENAME TO ds_new;
+
+ +
+

Change the owner of ds_new to jack.

+
1
ALTER SCHEMA ds_new OWNER TO jack;
+
+ +
+
+

Helpful Links

CREATE SCHEMA, DROP SCHEMA

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0137.html b/docs/dws/dev/dws_06_0137.html new file mode 100644 index 00000000..8de70a57 --- /dev/null +++ b/docs/dws/dev/dws_06_0137.html @@ -0,0 +1,58 @@ + + +

ALTER SEQUENCE

+

Function

ALTER SEQUENCE modifies the parameters of an existing sequence.

+
+

Precautions

  • You must be the owner of the sequence to use ALTER SEQUENCE.
  • In the current version, you can modify only the owner, home column, and the maximum value. To modify other parameters, delete the sequence and create it again. Then, use the Setval function to restore original parameter values.
  • ALTER SEQUENCE MAXVALUE cannot be used in transactions, functions, and stored procedures.
  • After the maximum value of a sequence is changed, the cache of the sequence in all sessions is cleared.
  • ALTER SEQUENCE blocks the invocation of nextval, setval, currval, and lastval.
+
+

Syntax

Change the maximum value or home column of the sequence.

+
1
+2
+3
ALTER SEQUENCE [ IF EXISTS ] name 
+    [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE ]
+    [ OWNED BY { table_name.column_name | NONE } ] ;
+
+ +
+

Change the owner of a sequence.

+
1
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO new_owner;
+
+ +
+
+

Parameter Description

  • name

    Specifies the sequence name to be changed.

    +
  • IF EXISTS

    Sends a notification instead of an error when you are modifying a non-existing sequence.

    +
  • MAXVALUE maxvalue | NO MAXVALUE

    Maximum value of a sequence. If NO MAXVALUE is declared, the default value of the ascending sequence is 263-1, and that of the descending sequence is -1. NOMAXVALUE is equivalent to NO MAXVALUE.

    +
  • OWNED BY

    Associates a sequence with a specified column included in a table. In this way, the sequence will be deleted when you delete its associated field or the table where the field belongs.

    +

    If the sequence has been associated with another table before you use this parameter, the new association will overwrite the old one.

    +

    The associated table and sequence must be owned by the same user and in the same schema.

    +

    If OWNED BY NONE is used, existing associations will be deleted.

    +
  • new_owner

    Specifies the user name of the new owner. To change the owner, you must also be a direct or indirect member of the new role, and this role must have CREATE permission on the sequence's schema.

    +
+
+

Examples

Modify the maximum value of serial to 200.

+
1
ALTER SEQUENCE serial MAXVALUE 200;
+
+ +
+

Create a table, and specify default values for the sequence.

+
1
CREATE TABLE T1(C1 bigint default nextval('serial'));
+
+ +
+

Change the owning column of the serial sequence to T1.C1.

+
1
ALTER SEQUENCE serial OWNED BY T1.C1;
+
+ +
+

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0138.html b/docs/dws/dev/dws_06_0138.html new file mode 100644 index 00000000..158faff8 --- /dev/null +++ b/docs/dws/dev/dws_06_0138.html @@ -0,0 +1,79 @@ + + +

ALTER SERVER

+

Function

ALTER SERVER adds, modifies, or deletes the parameters of an existing server. You can query existing servers from the pg_foreign_server system catalog.

+
+

Precautions

Only the owner of a server or a system administrator can run this statement.

+
+

Syntax

  • Change the parameters of an external server.
+
1
+2
ALTER SERVER server_name [ VERSION 'new_version' ]
+    [ OPTIONS ( {[ ADD | SET | DROP ] option ['value']} [, ... ] ) ];
+
+ +
+

In OPTIONS, ADD, SET, and DROP are operations to be executed. If these operations are not specified, the ADD operation will be performed by default. option and value are corresponding operation parameters.

+

Currently, only SET is supported on an HDFS server. ADD and DROP are not supported. The syntax for SET and DROP operations is retained for later use.

+
  • Change the owner of an external server.
+
1
+2
ALTER SERVER server_name 
+    OWNER TO new_owner;
+
+ +
+
  • Change the name of an external server.
+
1
+2
ALTER SERVER server_name 
+    RENAME TO new_name;
+
+ +
+
  • Refresh the HDFS configuration file. Only 8.0.0.10 and later versions (except 8.1.0) support this function.
+
1
ALTER SERVER server_name REFRESH OPTIONS;
+
+ +
+
+

Parameter Description

The server parameters to be modified are as follows:

+
  • server_name

    Specifies the name of the server to be modified.

    +
  • new_version

    Specifies the new version of the server.

    +
  • The server parameters in OPTIONS are as follows:
    • address

      Specifies the endpoint of the OBS service.

      +

      Specifies the IP address and port number of the primary and standby nodes of the HDFS cluster.

      +
      • address is mandatory for HDFS servers. Therefore, ADD and DROP operations are not supported.
      • address only supports IPv4 addresses in dot-decimal notation, and an address string cannot contain spaces. Groups of addresses are separated by commas (,). An IP address and a port number are separated by a colon (:). You are advised to configure two IP address and port pairs in an HDFS cluster. One is used as the socket address of the primary HDFS NameNode and the other is used as that of the secondary HDFS NameNode.
      • If the server type is DLI, the address is the OBS address stored on DLI.
      +
      +
    • hdfscfgpath

      Specifies the HDFS cluster configuration file.

      +
      • If HDFS is in security mode, hdfscfgpath is mandatory.
      • If you set hdfscfgpath, you can only set one value for path.
      +
      +
    • encrypt

      Specifies whether data is encrypted. This parameter is available only when type is OBS. The default value is off.

      +

      Value range:

      +
      • on indicates that data is encrypted.
      • off indicates that data is not encrypted.
      +
    • access_key

      Indicates the access key (AK) (obtained by users from the OBS page) used for the OBS access protocol. When you create a foreign table, its AK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is OBS.

      +
    • secret_access_key

      Indicates the secret access key (SK) (obtained by users from the OBS page) used for the OBS access protocol. When you create a foreign table, its SK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is OBS.

      +
    • dli_address

      Specifies the endpoint of the DLI service. This parameter is available only when type is DLI.

      +
    • dli_access_key

      Specifies the AK (obtained by users from the DLI page) used for the DLI access protocol. When you create a foreign table, its AK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is DLI.

      +
    • dli_secret_access_key

      Specifies the SK (obtained by users from the DLI page) used for the DLI access protocol. When you create a foreign table, its SK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is DLI.

      +
    • region

      Indicates the IP address or domain name of the OBS server. This parameter is available only when type is OBS.

      +
    • dbname

      Specifies the database name of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +
    • username

      Specifies the username of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +
    • password

      Specifies the user password of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +
    +
  • new_owner

    Specifies the new owner of the server. To change the owner, you must be the owner of the foreign server and a direct or indirect member of the new owner role, and must have the USAGE permission on the encapsulator of the external server.

    +
  • new_name

    Specifies the new name of the server.

    +
  • REFRESH OPTIONS

    Refreshes the HDFS configuration file. This command is executed when the configuration file is modified. If this command is not executed, an access error may be reported.

    +
+
+

Examples

Change the current name to the IP address of the hdfs_server server.

+
ALTER SERVER hdfs_server OPTIONS ( SET address '10.10.0.110:25000,10.10.0.120:25000');
+

Change the current name to hdfscfgpath of the hdfs_server server.

+
ALTER SERVER hdfs_server OPTIONS ( SET hdfscfgpath '/opt/bigdata/hadoop');
+

+
+

Helpful Links

CREATE SERVER DROP SERVER

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0139.html b/docs/dws/dev/dws_06_0139.html new file mode 100644 index 00000000..847051a4 --- /dev/null +++ b/docs/dws/dev/dws_06_0139.html @@ -0,0 +1,71 @@ + + +

ALTER SESSION

+

Function

ALTER SESSION defines or modifies the conditions or parameters that affect the current session. Modified session parameters are kept until the current session is disconnected.

+
+

Precautions

  • If the START TRANSACTION command is not executed before the SET TRANSACTION command, the transaction is ended instantly and the command does not take effect.
  • You can use the transaction_mode(s) method declared in the START TRANSACTION command to avoid using the SET TRANSACTION command.
+
+

Syntax

  • Set transaction parameters of a session.
    1
    +2
    ALTER SESSION SET [ SESSION CHARACTERISTICS AS ] TRANSACTION
    +    { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED } | { READ ONLY  | READ WRITE } } [, ...] ;
    +
    + +
    +
  • Set other running parameters of a session.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    ALTER SESSION SET 
    +    {{config_parameter { { TO  | =  }  { value | DEFAULT }
    +      | FROM CURRENT }} | CURRENT_SCHEMA [ TO | = ] { schema | DEFAULT }
    +      | TIME ZONE time_zone
    +      | SCHEMA schema
    +      | NAMES encoding_name
    +      | ROLE role_name PASSWORD 'password'
    +      | SESSION AUTHORIZATION { role_name PASSWORD 'password' | DEFAULT }
    +      | XML OPTION { DOCUMENT | CONTENT }
    +    } ;
    +
    + +
    +
+
+

Parameter Description

To modify the description of parameters related to the session, see Parameter Description of the SET syntax.

+
+

Examples

Create the ds schema.

+
CREATE SCHEMA ds;
+

Set the search path of the schema.

+
SET SEARCH_PATH TO ds, public;
+

Set the time/date type to the traditional postgres format (date before month).

+
SET DATESTYLE TO postgres, dmy;
+

Set the character code of the current session to UTF8.

+
ALTER SESSION SET NAMES 'UTF8';
+

Set the time zone to Berkeley of California.

+
SET TIME ZONE 'PST8PDT';
+

Set the time zone to Italy.

+
SET TIME ZONE 'Europe/Rome';
+

Set the current schema.

+
ALTER SESSION SET CURRENT_SCHEMA TO tpcds;
+

Set XML OPTION to DOCUMENT.

+
ALTER SESSION SET XML OPTION DOCUMENT;
+

Create the role joe, and set the session role to joe.

+
CREATE ROLE joe WITH PASSWORD '{password}';
+ALTER SESSION SET SESSION AUTHORIZATION joe PASSWORD '{password}';
+

Switch to the default user.

+
ALTER SESSION SET SESSION AUTHORIZATION default;
+

+
+

Helpful Links

SET

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0140.html b/docs/dws/dev/dws_06_0140.html new file mode 100644 index 00000000..2616235d --- /dev/null +++ b/docs/dws/dev/dws_06_0140.html @@ -0,0 +1,47 @@ + + +

ALTER SYNONYM

+

Function

ALTER SYNONYM is used to modify the attribute of a synonym.

+
+

Precautions

  • Only the synonym owner can be changed.
  • Only the system administrator and the synonym owner has the permission to modify the synonym owner information.
  • The modifier must be a direct or indirect member of the new owner, and the new owner must have the CREATE permission on the schema to which the synonym belongs.
+
+

Syntax

1
+2
ALTER SYNONYM synonym_name
+    OWNER TO new_owner;
+
+ +
+
+

Parameter Description

  • synonym

    Name of a synonym to be modified (optionally with schema names)

    +

    Value range: A string compliant with the identifier naming rules

    +
+
  • new_owner

    New owner of a synonym object

    +

    Value range: A string. It must be a valid username.

    +
+
+

Examples

Create synonym t1.

+
1
CREATE OR REPLACE SYNONYM t1 FOR ot.t1;
+
+ +
+

Create user u1.

+
1
CREATE USER u1 PASSWORD '{password}';
+
+ +
+

Change the owner of the synonym t1 to u1.

+
1
ALTER SYNONYM t1 OWNER TO u1;
+
+ +
+

+
+

Helpful Links

CREATE SYNONYM and DROP SYNONYM

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0141.html b/docs/dws/dev/dws_06_0141.html new file mode 100644 index 00000000..9a439214 --- /dev/null +++ b/docs/dws/dev/dws_06_0141.html @@ -0,0 +1,41 @@ + + +

ALTER SYSTEM KILL SESSION

+

Function

ALTER SYSTEM KILL SESSION ends a session.

+
+

Precautions

None

+
+

Syntax

1
ALTER SYSTEM KILL SESSION 'session_sid, serial' [ IMMEDIATE ];
+
+ +
+
+

Parameter Description

  • session_sid, serial

    Specifies SID and SERIAL of a session (see examples for format).

    +

    Value range: The SIDs and SERIALs of all sessions that can be queried from the system catalog V$SESSION.

    +
  • IMMEDIATE

    Indicates that a session will be ended instantly after the command is executed.

    +
+
+

Examples

Query session information.

+
SELECT sid,serial#,username FROM V$SESSION;
+
+       sid       | serial# | username 
+-----------------+---------+----------
+ 140131075880720 |       0 | 
+ 140131025549072 |       0 | 
+ 140131073779472 |       0 | 
+ 140131071678224 |       0 | 
+ 140131125774096 |       0 | 
+ 140131127875344 |       0 | 
+ 140131113629456 |       0 | 
+ 140131094742800 |       0 | 
+(8 rows)
+

End the session whose SID is 140131075880720.

+
ALTER SYSTEM KILL SESSION '140131075880720,0' IMMEDIATE;
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0142.html b/docs/dws/dev/dws_06_0142.html new file mode 100644 index 00000000..177566cc --- /dev/null +++ b/docs/dws/dev/dws_06_0142.html @@ -0,0 +1,412 @@ + + +

ALTER TABLE

+

Function

ALTER TABLE is used to modify tables, including modifying table definitions, renaming tables, renaming specified columns in tables, renaming table constraints, setting table schemas, enabling or disabling row-level access control, and adding or updating multiple columns.

+
+

Important Notes

  • You must own the table to use ALTER TABLE. A system administrator has the permission by default.
  • The storage parameter ORIENTATION cannot be modified.
  • Currently, SET SCHEMA can only be used to set a schema to a user schema, not to a system internal schema.
  • Column-store tables support PARTIAL CLUSTER KEY but do not support table-level foreign key constraints. In 8.1.1 or later, column-store tables support the PRIMARY KEY constraint and table-level UNIQUE constraint.
  • In a column-store table, you can perform ADD COLUMN, ALTER TYPE, SET STATISTICS, DROP COLUMN operations. The types of new and modified columns should be the Data Types supported by column storage. The USING option of ALTER TYPE only supports constant expression and expression involved in the column.
  • The column constraints supported by column-store tables include NULL, NOT NULL, and DEFAULT constant values. Only the DEFAULT value can be modified (SET DEFAULT and DROP DEFAULT), and only the NOT NULL constraint can be deleted. Currently, NULL and NOT NULL constraints cannot be modified.
  • When you modify the COLVERSION or enable_delta parameter of a column-store table, other ALTER operations cannot be performed.
+
+
  • Auto-increment columns cannot be added, or a column in which the DEFAULT value contains the nextval() expression cannot be added either.
  • Row-level access control cannot be enabled for HDFS tables, foreign tables, and temporary tables.
  • If you delete the PRIMARY KEY constraint by specifying the constraint name, the NOT NULL constraint is not deleted. You can manually delete the NOT NULL constraint as needed.
  • The cold_tablespace and storage_policy parameters of ALTER RESET cannot be used in OBS hot or cold tables, and COLVERSION cannot be changed to 1.0 for such tables.
  • You can change a column-store table whose COLVERSION parameter is 2.0 to an OBS hot or cold table. The COLD_TABLESPACE and STORAGE_POLICY parameters must be added.
  • You can use ALTER TABLE to change the values of STORAGE_POLICY for RELOPTIONS. After the cold/hot switchover policy is changed, the cold/hot attribute of the existing cold data will not change. The new policy takes effect for the next cold/hot switchover.
+

Syntax

  • ALTER TABLE modifies the definition of a table.
    1
    +2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) }
    +    action [, ... ];
    +
    + +
    +
    There are several clauses of action:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    column_clause
    +    | ADD table_constraint [ NOT VALID ]
    +    | ADD table_constraint_using_index
    +    | VALIDATE CONSTRAINT constraint_name
    +    | DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
    +    | CLUSTER ON index_name
    +    | SET WITHOUT CLUSTER
    +    | SET ( {storage_parameter = value} [, ... ] )
    +    | RESET ( storage_parameter [, ... ] )
    +    | OWNER TO new_owner
    +    | SET TABLESPACE new_tablespace
    +    | SET {COMPRESS|NOCOMPRESS}
    +    | DISTRIBUTE BY { REPLICATION | { HASH ( column_name [,...] ) } }
    +    | TO { GROUP groupname | NODE ( nodename [, ... ] ) }
    +    | ADD NODE ( nodename [, ... ] )
    +    | DELETE NODE ( nodename [, ... ] )
    +    | DISABLE TRIGGER [ trigger_name | ALL | USER ]
    +    | ENABLE TRIGGER [ trigger_name | ALL | USER ]
    +    | ENABLE REPLICA TRIGGER trigger_name
    +    | ENABLE ALWAYS TRIGGER trigger_name
    +    | DISABLE ROW LEVEL SECURITY
    +    | ENABLE ROW LEVEL SECURITY
    +    | FORCE ROW LEVEL SECURITY
    +    | NO FORCE ROW LEVEL SECURITY
    +    | REFRESH STORAGE
    +
    + +
    +
    • ADD table_constraint [ NOT VALID ]

      Adds a new table constraint.

      +
    • ADD table_constraint_using_index

      Adds primary key constraint or unique constraint based on the unique index.

      +
    • VALIDATE CONSTRAINT constraint_name

      Validates a foreign key or check constraint that was previously created as NOT VALID, by scanning the table to ensure there are no rows for which the constraint is not satisfied. Nothing happens if the constraint is already marked valid.

      +
    • DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]

      Drops a table constraint.

      +
    • CLUSTER ON index_name

      Selects the default index for future CLUSTER operations. It does not actually re-cluster the table.

      +
    • SET WITHOUT CLUSTER

      Removes the most recently used CLUSTER index specification from the table. This operation affects future cluster operations that do not specify an index.

      +
    • SET ( {storage_parameter = value} [, ... ] )

      Changes one or more storage parameters for the table.

      +
    • RESET ( storage_parameter [, ... ] )

      Resets one or more storage parameters to their defaults. As with SET, a table rewrite might be needed to update the table entirely.

      +
    • OWNER TO new_owner

      Changes the owner of the table, sequence, or view to the specified user.

      +
    • SET {COMPRESS|NOCOMPRESS}

      Sets the compression feature of a table. The table compression feature affects only the storage mode of data inserted in a batch subsequently and does not affect storage of existing data. Setting the table compression feature will result in the fact that there are both compressed and uncompressed data in the table.

      +
    • DISTRIBUTE BY { REPLICATION | { HASH ( column_name [,...] ) } }

      Changing a table's distribution mode will physically redistribute the table data based on the new distribution mode. After the distribution mode is changed, you are advised to manually run the ANALYZE statement to collect new statistics about the table.

      +
      • This operation is a major change operation, involving table distribution information modification and physical data redistribution. During the modification, services are blocked. After the modification, the original execution plan of services will change. Perform this operation according to the standard change process.
      • This operation is a resource-intensive operation. If you need to modify the distribution mode of large tables, perform the operation when the computing and storage resources are sufficient. Ensure that the remaining space of the entire cluster and the tablespace where the original table is located is sufficient to store a table that has the same size as the original table and is distributed in the new distribution mode.
      +
      +
    • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

      The syntax is only available in extended mode (when GUC parameter support_extended_features is on). Exercise caution when enabling the mode. It is used for tools like internal dilatation tools. Common users should not use the mode.

      +
    • ADD NODE ( nodename [, ... ] )

      It is only available for tools like internal dilatation. General users should not use the mode.

      +
    • DELETE NODE ( nodename [, ... ] )

      It is only available for internal scale-in tools. Common users should not use the syntax.

      +
    • DISABLE TRIGGER [ trigger_name | ALL | USER ]

      Disables a single trigger specified by trigger_name, disables all triggers, or disables only user triggers (excluding internally generated constraint triggers, for example, deferrable unique constraint triggers and exclusion constraints triggers).

      +

      Exercise caution when using this function because data integrity cannot be ensured as expected if the triggers are not executed.

      +
      +
    • | ENABLE TRIGGER [ trigger_name | ALL | USER ]

      Enables a single trigger specified by trigger_name, enables all triggers, or enables only user triggers.

      +
    • | ENABLE REPLICA TRIGGER trigger_name

      Determines that the trigger firing mechanism is affected by the configuration variable session_replication_role. When the replication role is origin (default value) or local, a simple trigger is fired.

      +

      When ENABLE REPLICA is configured for a trigger, it is fired only when the session is in replica mode.

      +
    • | ENABLE ALWAYS TRIGGER trigger_name

      Determines that all triggers are fired regardless of the current replication mode.

      +
    • | DISABLE/ENABLE ROW LEVEL SECURITY

      Enables or disables row-level access control for a table.

      +

      If row-level access control is enabled for a data table but no row-level access control policy is defined, the row-level access to the data table is not affected. If row-level access control for a table is disabled, the row-level access to the table is not affected even if a row-level access control policy has been defined. For details, see CREATE ROW LEVEL SECURITY POLICY.

      +
    • | NO FORCE/FORCE ROW LEVEL SECURITY

      Forcibly enables or disables row-level access control for a table.

      +

      By default, the table owner is not affected by the row-level access control feature. However, if row-level access control is forcibly enabled, the table owner (excluding system administrators) will be affected. System administrators are not affected by any row-level access control policies.

      +
    • | REFRESH STORAGE

      Changes the local hot partitions that meet the criteria defined by the rules specified in the storage_policy parameter of an OBS hot or cold table to the cold partitions stored in the OBS.

      +

      For example, if storage_policy is set to 'LMT:10' for an OBS hot or cold table when it is created, the partitions that are not updated within the last 10 days are switched to cold partitions in the OBS.

      +
    +
    +
    +
    • There are several clauses of column_clause:
       1
      + 2
      + 3
      + 4
      + 5
      + 6
      + 7
      + 8
      + 9
      +10
      +11
      +12
      +13
      +14
      ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]    
      +| MODIFY column_name data_type
      +| MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]
      +| MODIFY column_name [ CONSTRAINT constraint_name ] NULL    
      +| DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]    
      +| ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]    
      +| ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }    
      +| ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL    
      +| ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer    
      +| ADD STATISTICS (( column_1_name, column_2_name [, ...] ))    
      +| DELETE STATISTICS (( column_1_name, column_2_name [, ...] ))    
      +| ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )    
      +| ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )    
      +| ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
      +
      + +
      +
      • ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]

        Adds a column to a table. If a column is added with ADD COLUMN, all existing rows in the table are initialized with the column's default value (NULL if no DEFAULT clause is specified).

        +
      • ADD ( { column_name data_type [ compress_mode ] } [, ...] )

        Adds columns in the table.

        +
      • MODIFY column_name data_type

        Change the data type of an existing field in the table. Only the type conversion of the same category (between values, character strings, and time) is allowed.

        +
      • MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ]

        Adds a NOT NULL constraint to a column of a table. Currently, this clause is unavailable to column-store tables.

        +
      • MODIFY column_name [ CONSTRAINT constraint_name ] NULL

        Deletes the NOT NULL constraint to a certain column in the table.

        +
      • DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]

        Drops a column from a table. Index and constraint related to the column are automatically dropped. If an object not belonging to the table depends on the column, CASCADE must be specified, such as foreign key reference and view.

        +

        The DROP COLUMN form does not physically remove the column, but simply makes it invisible to SQL operations. Subsequent insert and update operations in the table will store a NULL value for the column. Therefore, column deletion takes a short period of time but does not immediately release the table space on the disks, because the space occupied by the deleted column is not reclaimed. The space will be reclaimed when VACUUM is executed.

        +
      • ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]

        To change the data type of a table column (data in the distribution column is not allowed to change types), only the type conversion of the same category (between values, strings, and time) is allowed. Indexes and simple table constraints on the column will automatically use the new data type by reparsing the originally supplied expression.

        +

        ALTER TYPE requires an entire table be rewritten. This is an advantage sometimes, because it frees up unnecessary space from a table. For example, to reclaim the space occupied by a deleted column, the fastest method is to use the command.

        +
        1
        ALTER TABLE table ALTER COLUMN anycol TYPE anytype;
        +
        + +
        +

        In this command, anycol indicates any column existing in the table and anytype indicates the type of the prototype of the column. ALTER TYPE does not change the table except that the table is forcibly rewritten. In this way, the data that is no longer used is deleted.

        +
      • ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }

        Sets or removes the default value for a column. The default values only apply to subsequent INSERT commands; they do not cause rows already in the table to change. Defaults can also be created for views, in which case they are inserted into INSERT statements on the view before the view's ON INSERT rule is applied.

        +
      • ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL

        Changes whether a column is marked to allow NULL values or to reject NULL values. You can only use SET NOT NULL when the column contains no NULL values.

        +
      • ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer

        Specifies the per-column statistics-gathering target for subsequent ANALYZE operations. The value ranges from 0 to 10000. Set it to -1 to revert to using the default system statistics target.

        +
      • {ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ...]))

        Adds or deletes the declaration of collecting multi-column statistics to collect multi-column statistics as needed when ANALYZE is performed for a table or a database. The statistics about a maximum of 32 columns can be collected at a time. You are not allowed to add or delete the declaration for system tables or foreign tables

        +
      • ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )

        ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )

        +

        Sets or resets per-attribute options.

        +

        Currently, the only defined per-attribute options are n_distinct and n_distinct_inherited. n_distinct affects statistics of table, while n_distinct_inherited affects the statistics of table and its subtables. Currently, only SET/RESET n_distinct is supported, and SET/RESET n_distinct_inherited is forbidden.

        +
      • ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }

        Sets the storage mode for a column. This clause specifies whether this column is held inline or in a secondary TOAST table, and whether the data should be compressed. This statement can only be used for row-based tables. SET STORAGE only sets the strategy to be used for future table operations.

        +
      +
      +
      +
      • column_constraint is as follows:
        1
        +2
        +3
        +4
        +5
        +6
        +7
        +8
        [ CONSTRAINT constraint_name ]
        +    { NOT NULL |
        +      NULL |
        +      CHECK ( expression ) |
        +      DEFAULT default_expr  |
        +      UNIQUE index_parameters |
        +      PRIMARY KEY index_parameters }
        +    [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
        +
        + +
        +
      • compress_mode of a column is as follows:
        1
        [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ]
        +
        + +
        +
      +
    +
    • table_constraint_using_index used to add the primary key constraint or unique constraint based on the unique index is as follows:
      1
      +2
      +3
      [ CONSTRAINT constraint_name ]
      +    { UNIQUE | PRIMARY KEY } USING INDEX index_name
      +    [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
      +
      + +
      +
    +
    • table_constraint is as follows:
      1
      +2
      +3
      +4
      +5
      +6
      [ CONSTRAINT constraint_name ]
      +    { CHECK ( expression ) |
      +      UNIQUE ( column_name [, ... ] ) index_parameters |
      +      PRIMARY KEY ( column_name [, ... ] ) index_parameters }
      +     
      +    [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
      +
      + +
      +
      index_parameters is as follows:
      1
      +2
      [ WITH ( {storage_parameter = value} [, ... ] ) ]
      +    [ USING INDEX TABLESPACE tablespace_name ]
      +
      + +
      +
      +
    +
+
+
  • Rename the table. The renaming does not affect stored data. The new table name cannot be prefixed with the schema name of the original table.
    1
    +2
    ALTER TABLE [ IF EXISTS ] table_name 
    +    RENAME TO new_table_name;
    +
    + +
    +
  • Rename the specified column in the table.
    1
    +2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )}
    +    RENAME [ COLUMN ] column_name TO new_column_name;
    +
    + +
    +
  • Rename the constraint of the table.
    1
    +2
    ALTER TABLE { table_name [*] | ONLY table_name | ONLY ( table_name ) }
    +    RENAME CONSTRAINT constraint_name TO new_constraint_name;
    +
    + +
    +
  • Set the schema of the table.
    1
    +2
    ALTER TABLE [ IF EXISTS ] table_name 
    +    SET SCHEMA new_schema;
    +
    + +
    +
    • The schema setting moves the table into another schema. Associated indexes and constraints owned by table columns are migrated as well. Currently, the schema for sequences cannot be changed. If the table has sequences, delete the sequences, and create them again or delete the ownership between the table and sequences. In this way, the table schema can be changed.
    • To change the schema of a table, you must also have CREATE privilege on the new schema. To add the table as a new child of a parent table, you must own the parent table as well. To alter the owner, you must also be a direct or indirect member of the new owning role, and that role must have CREATE permission on the table's schema. These restrictions enforce that altering the owner does not do anything you could not do by dropping and recreating the table. However, a system administrator can alter ownership of any table anyway.
    • All the actions except for RENAME and SET SCHEMA can be combined into a list of multiple alterations to apply in parallel. For example, it is possible to add several columns or alter the type of several columns in a single command. This is useful with large tables, since only one pass over the table need be made.
    • Adding a CHECK or NOT NULL constraint requires scanning the table to verify that existing rows meet the constraint.
    • Adding a column with a non-null default or changing the type of an existing column will require the entire table to be rewritten. Table rebuilding may take a significant amount of time for a large table; and will temporarily require as much as double the disk space.
    +
    +
  • Add columns.
    1
    +2
    ALTER TABLE [ IF EXISTS ] table_name
    +    ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]} [, ...] );
    +
    + +
    +
  • Update columns.
    1
    +2
    ALTER TABLE [ IF EXISTS ] table_name 
    +    MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] );
    +
    + +
    +
+

Parameter Description

  • IF EXISTS

    Sends a notification instead of an error if no tables have identical names. The notification prompts that the table you are querying does not exist.

    +
  • table_name [*] | ONLY table_name | ONLY ( table_name )

    table_name is the name of table that you need to modify.

    +

    If ONLY is specified, only the table is modified. If ONLY is not specified, the table and all subtables will be modified. You can add the asterisk (*) option following the table name to specify that all subtables are scanned, which is the default operation.

    +
  • constraint_name

    Specifies the name of an existing constraint to drop.

    +
  • index_name

    Specifies the name of this index.

    +
  • storage_parameter

    Specifies the name of a storage parameter.

    +
  • new_owner

    Specifies the name of the new table owner.

    +
  • new_tablespace

    Specifies the new name of the tablespace to which the table belongs.

    +
  • column_name, column_1_name, column_2_name

    Specifies the name of a new or an existing column.

    +
  • data_type

    Specifies the type of a new column or a new type of an existing column.

    +
  • compress_mode

    Specifies the compress options of the table, only available for row-based tables. The clause specifies the algorithm preferentially used by the column.

    +
  • collation

    Specifies the collation rule name of a column. The optional COLLATE clause specifies a collation for the new column; if omitted, the collation is the default for the new column.

    +
  • USING expression

    A USING clause specifies how to compute the new column value from the old; if omitted, the default conversion is an assignment cast from old data type to new. A USING clause must be provided if there is no implicit or assignment cast from the old to new type.

    +

    USING in ALTER TYPE can specify any expression involving the old values of the row; that is, it can refer to any columns other than the one being converted. This allows very general conversions to be done with the ALTER TYPE syntax. Because of this flexibility, the USING expression is not applied to the column's default value (if any); the result might not be a constant expression as required for a default. This means that when there is no implicit or assignment cast from old to new type, ALTER TYPE might fail to convert the default even though a USING clause is supplied. In such cases, drop the default with DROP DEFAULT, perform the ALTER TYPE, and then use SET DEFAULT to add a suitable new default. Similar considerations apply to indexes and constraints involving the column.

    +
    +
  • NOT NULL | NULL

    Sets whether the column allows null values.

    +
  • integer

    Specifies the constant value of an integer with a sign. If PERCENT is used, the range of integer is from 0 to 100.

    +
  • attribute_option

    Specifies an attribute option.

    +
  • PLAIN | EXTERNAL | EXTENDED | MAIN

    Specifies a column storage mode.

    +
    • PLAIN must be used for fixed-length values (such as integers). It must be inline and uncompressed.
    • MAIN is for inline, compressible data.
    • EXTERNAL is for external, uncompressed data. Use of EXTERNAL will make substring operations on text and bytea values run faster, at the penalty of increased storage space.
    • EXTENDED is for external, compressed data. EXTENDED is the default for most data types that support non-PLAIN storage.
    +
  • CHECK ( expression )

    New or updated rows must satisfy for an insert or update operation to succeed. Expressions evaluating to TRUE succeed. If any row of an insert or update operation produces a FALSE result, an error exception is raised and the insert or update does not alter the database.

    +

    A check constraint specified as a column constraint should reference only the column's values, while an expression appearing in a table constraint can reference multiple columns.

    +

    Currently, CHECK expression does not include subqueries and cannot use variables apart from the current column.

    +
  • DEFAULT default_expr

    Assigns a default data value for a column.

    +

    The data type of the default expression must match the data type of the column.

    +

    The default expression will be used in any insert operation that does not specify a value for the column. If there is no default value for a column, then the default value is NULL.

    +
  • UNIQUE index_parameters

    UNIQUE ( column_name [, ... ] ) index_parameters

    +

    The UNIQUE constraint specifies that a group of one or more columns of a table can contain only unique values.

    +
  • PRIMARY KEY index_parameters

    PRIMARY KEY ( column_name [, ... ] ) index_parameters

    +

    The primary key constraint specifies that one or more columns of a table must contain unique (non-duplicate) and non-null values. This parameter is valid only for columns with the NOT NULL constraint.

    +
  • DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE

    Sets whether the constraint is deferrable. This option is unavailable to column-store tables.

    +
    • DEFERRABLE: deferrable can be postponed until the end of the transaction using the SET CONSTRAINTS command.
    • NOT DEFERRABLE: checks immediately after the execution of each command.
    • INITIALLY IMMEDIATE: checks immediately after the execution of each statement.
    • INITIALLY DEFERRED: checks when the transaction ends.
    +
  • WITH ( {storage_parameter = value} [, ... ] )

    Specifies an optional storage parameter for a table or an index.

    +
  • COMPRESS|NOCOMPRESS
    • NOCOMPRESS: If the NOCOMPRESS keyword is specified, the existing compression feature of the table is not changed.
    • COMPRESS: If the COMPRESS keyword is specified, the table compression feature is triggered if tuples are inserted in a batch.
    +
  • new_table_name

    Specifies the new table name.

    +
  • new_column_name

    Specifies the new name of a specific column in a table.

    +
  • new_constraint_name

    Specifies the new name of a table constraint.

    +
  • new_schema

    Specifies the new schema name.

    +
  • CASCADE

    Automatically drops objects that depend on the dropped column or constraint (for example, views referencing the column).

    +
  • RESTRICT

    Refuses to drop the column or constraint if there are any dependent objects. This is the default behavior.

    +
  • schema_name

    Specifies the schema name of a table.

    +
+
+

Example 1: Operations on Tables

Move a table to another schema.

+
1
ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe;
+
+ +
+

When renaming an existing table, the new table name cannot be prefixed with the schema name of the original table.

+
1
ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23;
+
+ +
+

Change the distribution mode of the tpcds.warehouse_t22 table to REPLICATION.

+
1
ALTER TABLE tpcds.warehouse_t22 DISTRIBUTE BY REPLICATION;
+
+ +
+

Change the distribution column of the tpcds.warehouse_t22 table to W_WAREHOUSE_SK.

+
1
ALTER TABLE tpcds.warehouse_t22 DISTRIBUTE BY HASH(W_WAREHOUSE_SK);
+
+ +
+

Switch the storage format of a column-store table.

+
1
ALTER TABLE tpcds.warehouse_t18 SET (COLVERSION = 1.0);
+
+ +
+

Disable the delta table function of the column-store table.

+
1
ALTER TABLE tpcds.warehouse_t21 SET (ENABLE_DELTA = OFF);
+
+ +
+

Disable the SKIP_FPI_HINT function of the table.

+
1
ALTER TABLE tpcds.warehouse_t22 SET (SKIP_FPI_HINT = FALSE);
+
+ +
+

Change the data temperature for a single table.

+
1
ALTER TABLE tpcds.warehouse_t23 REFRESH STORAGE;
+
+ +
+

Change the data temperature for multiple tables in batches.

+
SELECT pg_refresh_storage();
+
+

Example 2: Operations on Table Constraints

Create an index ds_warehouse_t1_index1 for the table tpcds.warehouse_t1. Then add primary key constraints, and rename the created index.

+
1
+2
CREATE UNIQUE INDEX ds_warehouse_t1_index1 ON tpcds.warehouse_t1(W_WAREHOUSE_SK);
+ALTER TABLE tpcds.warehouse_t1 ADD CONSTRAINT ds_warehouse_t1_index2 PRIMARY KEY USING INDEX ds_warehouse_t1_index1;
+
+ +
+

Delete the primary key ds_warehouse_t1_index2 from the table tpcds.warehouse_t1.

+
1
ALTER TABLE tpcds.warehouse_t1 DROP CONSTRAINT ds_warehouse_t1_index2;
+
+ +
+

If no partial clusters have been specified in a column-store table, add a partial cluster to the table.

+
1
ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK);
+
+ +
+

Delete a partial cluster column from the column-store table.

+
1
ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster;
+
+ +
+

Add a Not-Null constraint to an existing column.

+
1
ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL;
+
+ +
+

Remove Not-Null constraints from an existing column.

+
1
ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL;
+
+ +
+

Add a check constraint to the tpcds.warehouse_t19 table.

+
1
ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE <> '');
+
+ +
+
+

Example 3: Operations on Columns

Add a primary key to the tpcds.warehouse_t1 table.

+
1
ALTER TABLE tpcds.warehouse_t1 ADD PRIMARY KEY(W_WAREHOUSE_SK);
+
+ +
+

Add a varchar column to the tpcds.warehouse_t19 table.

+
1
ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30);
+
+ +
+

Use one statement to alter the types of two existing columns.

+
1
+2
+3
ALTER TABLE tpcds.warehouse_t19
+ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80),
+ALTER COLUMN W_STREET_NAME TYPE varchar(100);
+
+ +
+

This statement is equivalent to the preceding statement.

+
1
ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60));
+
+ +
+

Delete a column from the tpcds.warehouse_t23 table.

+
1
ALTER TABLE tpcds.warehouse_t23 DROP COLUMN W_STREET_NAME;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0143.html b/docs/dws/dev/dws_06_0143.html new file mode 100644 index 00000000..5ebc74e1 --- /dev/null +++ b/docs/dws/dev/dws_06_0143.html @@ -0,0 +1,243 @@ + + +

ALTER TABLE PARTITION

+

Function

ALTER TABLE PARTITION modifies table partitioning, including adding, deleting, splitting, merging partitions, and modifying partition attributes.

+
+

Precautions

  • The name of the added partition must be different from names of existing partitions in the partitioned table.
  • The partition key of the added partition must be the same type as that of the partitioned table. The key value of the added partition must exceed the upper limit of the last partition range.
  • If the number of partitions in the target partitioned table has reached the maximum (32767), partitions cannot be added.
+
  • If a partitioned table has only one partition, the partition cannot be deleted.
  • Use PARTITION FOR() to choose partitions. The number of specified values in the brackets should be the same as the column number in customized partition, and they must be consistent.
  • The Value partitioned table does not support the Alter Partition operation.
  • For OBS cold and hot tables:
    • The tablespace of a partitioned table cannot be set to an OBS tablespace during the MOVE, EXCHANGE, MERGE, and SPLIT operations.
    • When an ALTER statement is executed, the cold and hot data attributes in the partitions cannot be changed, that is, data in the cold partition should still be put in the cold partition after a data operation, and hot partition data should be put in the hot partition. Therefore, cold partition data cannot be migrated to the local tablespace.
    • Only the default tablespace is supported for cold partitions.
    • Cold and hot partitions cannot be merged.
    • Cold partition switching is not supported for the EXCHANGE operation.
    +
+
+

Syntax

  • Modify the syntax of the table partition.
    1
    +2
    ALTER TABLE [ IF EXISTS ] { table_name  [*] | ONLY table_name | ONLY ( table_name  )}
    +    action [, ... ];
    +
    + +
    +
    action indicates the following clauses for maintaining partitions. For the partition continuity when multiple clauses are used for partition maintenance, GaussDB(DWS) does DROP PARTITION and then ADD PARTITION, and finally runs the rest clauses in sequence.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    move_clause  |
    +    exchange_clause  |
    +    row_clause  |
    +    merge_clause  |
    +    modify_clause  |
    +    split_clause  |
    +    add_clause  |
    +    drop_clause
    +
    + +
    +
    • The move_clause syntax is used to move the partition to a new tablespace.
      1
      MOVE PARTITION { partition_name | FOR ( partition_value [, ...] ) } TABLESPACE tablespacename
      +
      + +
      +
    • The exchange_clause syntax is used to move the data from a general table to a specified partition.
      1
      +2
      +3
      EXCHANGE PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } 
      +    WITH TABLE {[ ONLY ] ordinary_table_name | ordinary_table_name * | ONLY ( ordinary_table_name )} 
      +    [ { WITH | WITHOUT } VALIDATION ] [ VERBOSE ]
      +
      + +
      +

      The ordinary table and the partitioned table whose data is to be exchanged must meet the following requirements:

      +
      • The number of columns of the ordinary table is the same as that of the partitioned table, and their information should be consistent, including the column name, data type, constraint, collation, storage parameter, compression, and data type of a deleted column.
      • The compression information of the ordinary table and partitioned table should be consistent.
      • The distribution column information of the ordinary table and the partitioned table should be consistent.
      • The number and information of indexes of the ordinary table and the partitioned table should be consistent.
      • The number and information of constraints of the ordinary table and the partitioned table should be consistent.
      • The ordinary table cannot be a temporary table or unlogged table.
      • The ordinary table and the partitioned table must be in the same logical cluster or node group.
      • If other columns following the last valid column in the partitioned table are deleted and the deleted columns are not considered, the partitioned table can be exchanged with the ordinary table as long as the columns of the two tables are the same.
      • The table-level parameter colversion of a column-store ordinary table must be the same as that of a column-store partitioned table. Partition swap between colversion2.0 and colversion1.0 is not allowed.
      +

      When the execution is complete, the data and tablespace of the ordinary table and the partitioned table are exchanged. In this case, statistics about the ordinary table and the partitioned table become unreliable. Both tables should be analyzed again.

      +
    • The syntax of row_clause is used to set the row movement switch of a partitioned table.
      1
      { ENABLE | DISABLE } ROW MOVEMENT
      +
      + +
      +
    +
    • The merge_clause syntax is used to merge partitions into one.
      1
      +2
      MERGE PARTITIONS { partition_name } [, ...] INTO PARTITION partition_name 
      +    
      +
      + +
      +
    +
    • The syntax of modify_clause is used to set whether a partition index is usable.
      1
      MODIFY PARTITION partition_name { UNUSABLE LOCAL INDEXES | REBUILD UNUSABLE LOCAL INDEXES }
      +
      + +
      +
    +
    • The split_clause syntax is used to split one partition into partitions.
      1
      SPLIT PARTITION { partition_name | FOR ( partition_value [, ...] ) } { split_point_clause | no_split_point_clause }
      +
      + +
      +
      • The syntax of specified split_point_clause is as follows:
        1
        AT ( partition_value ) INTO ( PARTITION partition_name  , PARTITION partition_name  )
        +
        + +
        +

        The size of split point should be in the range of splitting partition key. The split point can only split one partition into two.

        +
        +
      • The syntax of no_split_point_clause is as follows:
        1
        INTO { ( partition_less_than_item [, ...] ) | ( partition_start_end_item [, ...] ) }
        +
        + +
        +
        • The first new partition key specified by partition_less_than_item must be larger than that of the former partition (if any), and the last partition key specified by partition_less_than_item must be equal to that of the splitting partition.
        • The start point (if any) of the first new partition specified by partition_start_end_item must be equal to the partition key (if any) of the previous partition. The end point (if any) of the last partition specified by partition_start_end_item must be equal to the partition key of the splitting partition.
        • partition_less_than_item supports a maximum of four partition keys and partition_start_end_item supports only one partition key. For details about the supported data types, see Partition Key.
        +
        +
      +
      • The syntax of partition_less_than_item is as follows:
        1
        +2
        PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE }  [, ...] ) 
        +    [ TABLESPACE tablespacename ]
        +
        + +
        +
      • The syntax of partition_start_end_item is as follows. For details about the constraints, see partition_start_end_item syntax.
        1
        +2
        +3
        +4
        +5
        +6
        PARTITION partition_name {
        +        {START(partition_value) END (partition_value) EVERY (interval_value)} |
        +        {START(partition_value) END ({partition_value | MAXVALUE})} |
        +        {START(partition_value)} |
        +        {END({partition_value | MAXVALUE})}
        +} [TABLESPACE tablespace_name]
        +
        + +
        +
      +
    +
    • The syntax of add_clause is used to add a partition to one or more specified partitioned tables.
      1
      ADD {partition_less_than_item | partition_start_end_item}
      +
      + +
      +
    +
    • The syntax of drop_clause is used to remove a specified partition from a partitioned table.
      1
      DROP PARTITION  { partition_name | FOR (  partition_value [, ...] )  } 
      +
      + +
      +
    +
    +
  • The syntax of modifying a table partition name is as follows:
    1
    +2
    ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name  )}
    +    RENAME PARTITION { partition_name | FOR ( partition_value [, ...] ) } TO partition_new_name;
    +
    + +
    +
+
+

Parameter Description

  • table_name

    Specifies the name of a partitioned table.

    +

    Value range: an existing partitioned table name

    +
  • partition_name

    Specifies the name of a partition.

    +

    Value range: an existing partition name

    +
  • partition_value

    Specifies the key value of a partition.

    +

    The value specified by PARTITION FOR ( partition_value [, ...] ) can uniquely identify a partition.

    +

    Value range: value range of the partition key for the partition to be renamed

    +
  • UNUSABLE LOCAL INDEXES

    Sets all the indexes unusable in the partition.

    +
  • REBUILD UNUSABLE LOCAL INDEXES

    Rebuilds all the indexes in the partition.

    +
  • ENABLE/DISABLE ROW MOVEMENT

    Specifies the row movement switch.

    +

    If the tuple value is updated on the partition key during the UPDATE action, the partition where the tuple is located is altered. Setting of this parameter enables error messages to be reported or movement of the tuple between partitions.

    +

    Valid value:

    +
    • ENABLE: The row movement switch is enabled.
    • DISABLE: The row movement switch is disabled.
    +

    The switch is disabled by default.

    +
  • ordinary_table_name

    Specifies the name of the ordinary table whose data is to be migrated.

    +

    Value range: an existing ordinary table name

    +
  • { WITH | WITHOUT } VALIDATION

    Checks whether the ordinary table data meets the specified partition key range of the partition to be migrated.

    +

    Valid value:

    +
    • WITH: checks whether the common table data meets the partition key range of the partition to be exchanged. If any data does not meet the required range, an error is reported.
    • WITHOUT: does not check whether the common table data meets the partition key range of the partition to be exchanged.
    +

    The default value is WITH.

    +

    The check is time consuming, especially when the data volume is large. Therefore, use WITHOUT when you are sure that the current common table data meets the partition key range of the partition to be exchanged.

    +
  • VERBOSE

    When VALIDATION is WITH, if the ordinary table contains data that is out of the partition key range, insert the data to the correct partition. If there is no correct partition where the data can be route to, an error is reported.

    +

    Only when VALIDATION is WITH, VERBOSE can be specified.

    +
    +
  • partition_new_name

    Specifies the new name of a partition.

    +

    Value range: a string. It must comply with the naming convention.

    +
+
+

Example

Delete partition P8.

+
1
ALTER TABLE tpcds.web_returns_p1 DROP PARTITION P8;
+
+ +
+

Add a partition WR_RETURNED_DATE_SK with values ranging from 2453005 to 2453105.

+
1
ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P8 VALUES LESS THAN (2453105);
+
+ +
+

Add a partition WR_RETURNED_DATE_SK with values ranging from 2453105 to MAXVALUE.

+
1
ALTER TABLE tpcds.web_returns_p1 ADD PARTITION P9 VALUES LESS THAN (MAXVALUE);
+
+ +
+

Rename the P7 partition as P10.

+
1
ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION P7 TO P10;
+
+ +
+

Rename the P6 partition as P11.

+
1
ALTER TABLE tpcds.web_returns_p1 RENAME PARTITION FOR (2452639) TO P11;
+
+ +
+

Query rows in the P10 partition.

+
1
+2
+3
+4
+5
SELECT count(*) FROM tpcds.web_returns_p1 PARTITION (P10);
+ count  
+--------
+ 9362
+(1 row)
+
+ +
+
+

Split the P8 partition at 2453010.

+
1
+2
+3
+4
+5
ALTER TABLE tpcds.web_returns_p2 SPLIT PARTITION P8 AT (2453010) INTO
+(
+        PARTITION P9,
+        PARTITION P10
+); 
+
+ +
+

Merge the P6 and P7 partitions into one.

+
1
ALTER TABLE tpcds.web_returns_p2 MERGE PARTITIONS P6, P7 INTO PARTITION P8;
+
+ +
+

Modify the migration attribute of a partitioned table.

+
1
ALTER TABLE tpcds.web_returns_p2 DISABLE ROW MOVEMENT;
+
+ +
+
+

Add partitions [5000, 5300), [5300, 5600), [5600, 5900), and [5900, 6000).

+
1
ALTER TABLE tpcds.startend_pt ADD PARTITION p6 START(5000) END(6000) EVERY(300);
+
+ +
+

Add the partition p7, specified by MAXVALUE.

+
1
ALTER TABLE tpcds.startend_pt ADD PARTITION p7 END(MAXVALUE);
+
+ +
+

Rename the partition where 5950 is located to p71.

+
1
ALTER TABLE tpcds.startend_pt RENAME PARTITION FOR(5950) TO p71;
+
+ +
+

Split the partition [4000, 5000) where 4500 is located.

+
1
ALTER TABLE tpcds.startend_pt SPLIT PARTITION FOR(4500) INTO(PARTITION q1 START(4000) END(5000) EVERY;
+
+ +
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0145.html b/docs/dws/dev/dws_06_0145.html new file mode 100644 index 00000000..49b8006d --- /dev/null +++ b/docs/dws/dev/dws_06_0145.html @@ -0,0 +1,153 @@ + + +

ALTER TEXT SEARCH CONFIGURATION

+

Function

ALTER TEXT SEARCH CONFIGURATION modifies the definition of a text search configuration. You can modify its mappings from token types to dictionaries, change the configuration's name or owner, or modify the parameters.

+

The ADD MAPPING FOR form installs a list of dictionaries to be consulted for the specified token types; an error will be generated if there is already a mapping for any of the token types.

+

The ALTER MAPPING FOR form removes existing mapping for those token types and then adds specified mappings.

+

ALTER MAPPING REPLACE ... WITH ... and ALTER MAPPING FOR... REPLACE ... WITH ... options replace old_dictionary with new_dictionary. Note that only when pg_ts_config_map has tuples corresponding to maptokentype and old_dictionary, the update will succeed. If the update fails, no messages are returned.

+

The DROP MAPPING FOR form deletes all dictionaries for the specified token types in the text search configuration. If IF EXISTS is not specified and the string type mapping specified by DROP MAPPING FOR does not exist in text search configuration, an error will occur in database.

+
+

Important Notes

  • If a search configuration is referenced (to create an index), users are not allowed to modify it.
  • To use ALTER TEXT SEARCH CONFIGURATION, you must be the owner of the configuration.
+
+

Syntax

  • Add text search configuration string mapping.
+
1
+2
ALTER TEXT SEARCH CONFIGURATION name 
+    ADD MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ];
+
+ +
+
  • Modify the text search configuration dictionary syntax.
+
1
+2
ALTER TEXT SEARCH CONFIGURATION name 
+    ALTER MAPPING FOR token_type [, ... ] REPLACE old_dictionary WITH new_dictionary;
+
+ +
+
  • Modify the text search configuration string.
+
1
+2
ALTER TEXT SEARCH CONFIGURATION name
+    ALTER MAPPING FOR token_type [, ... ] WITH dictionary_name [, ... ];
+
+ +
+
  • Change the text search configuration dictionary.
+
1
+2
ALTER TEXT SEARCH CONFIGURATION name
+    ALTER MAPPING REPLACE old_dictionary WITH new_dictionary;
+
+ +
+
  • Remove text search configuration string mapping.
+
1
+2
ALTER TEXT SEARCH CONFIGURATION name
+    DROP MAPPING [ IF EXISTS ] FOR token_type [, ... ];
+
+ +
+
  • Rename the owner of text search configuration.
+
1
ALTER TEXT SEARCH CONFIGURATION name OWNER TO new_owner;
+
+ +
+
  • Rename the name of text search configuration.
+
1
ALTER TEXT SEARCH CONFIGURATION name RENAME TO new_name;
+
+ +
+
  • Rename the namespace of text search configuration.
+
1
ALTER TEXT SEARCH CONFIGURATION name SET SCHEMA new_schema;
+
+ +
+
  • Modify the attributes of text search configuration.
+
1
ALTER TEXT SEARCH CONFIGURATION name SET ( { configuration_option = value } [, ...] );
+
+ +
+
  • Reset the attributes of text search configuration.
+
1
ALTER TEXT SEARCH CONFIGURATION name RESET ( {configuration_option} [, ...] );
+
+ +
+
+

Parameter description

  • name

    Specifies the name (optionally schema-qualified) of an existing text search configuration.

    +
  • token_type

    Specifies the name of a token type that is emitted by the configuration's parser. For details, see Parsers.

    +
  • dictionary_name

    Specifies the name of a text search dictionary to be consulted for the specified token types. If multiple dictionaries are listed, they are consulted in the specified order.

    +
  • old_dictionary

    Specifies the name of a text search dictionary to be replaced in the mapping.

    +
  • new_dictionary

    Specifies the name of a text search dictionary to be substituted for old_dictionary.

    +
  • new_owner

    Specifies the new owner of the text search configuration.

    +
  • new_name

    Specifies the new name of the text search configuration.

    +
  • new_schema

    Specifies the new schema for the text search configuration.

    +
  • configuration_option

    Text search configuration option. For details, see CREATE TEXT SEARCH CONFIGURATION.

    +
  • value

    Specifies the value of text search configuration option.

    +
+
+

Examples

Add a type mapping for the text search type ngram1.

+
1
ALTER TEXT SEARCH CONFIGURATION ngram1 ADD MAPPING FOR multisymbol WITH simple;
+
+ +
+

Change the owner of text search configuration.

+
1
ALTER TEXT SEARCH CONFIGURATION ngram1 OWNER TO joe;
+
+ +
+

Modify the schema of text search configuration.

+
1
ALTER TEXT SEARCH CONFIGURATION ngram1 SET SCHEMA joe;
+
+ +
+

Rename a text search configuration.

+
1
ALTER TEXT SEARCH CONFIGURATION joe.ngram1 RENAME TO ngram_1;
+
+ +
+

Delete type mapping.

+
1
ALTER TEXT SEARCH CONFIGURATION joe.ngram_1 DROP MAPPING IF EXISTS FOR multisymbol;
+
+ +
+

Add text search configuration string mapping.

+
1
ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR word WITH simple,english_stem;
+
+ +
+

Add text search configuration string mapping.

+
1
ALTER TEXT SEARCH CONFIGURATION english_1 ADD MAPPING FOR email WITH english_stem, french_stem;
+
+ +
+

Modify text search configuration string mapping.

+
1
ALTER TEXT SEARCH CONFIGURATION english_1 ALTER MAPPING REPLACE french_stem with german_stem;
+
+ +
+

Query information about the text search configuration.

+
1
+2
+3
+4
+5
+6
+7
+8
SELECT b.cfgname,a.maptokentype,a.mapseqno,a.mapdict,c.dictname FROM pg_ts_config_map a,pg_ts_config b, pg_ts_dict c WHERE a.mapcfg=b.oid AND a.mapdict=c.oid AND b.cfgname='english_1' ORDER BY 1,2,3,4,5;
+  cfgname  | maptokentype | mapseqno | mapdict |   dictname   
+-----------+--------------+----------+---------+--------------
+ english_1 |            2 |        1 |    3765 | simple
+ english_1 |            2 |        2 |   12960 | english_stem
+ english_1 |            4 |        1 |   12960 | english_stem
+ english_1 |            4 |        2 |   12966 | german_stem
+(4 rows)
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0146.html b/docs/dws/dev/dws_06_0146.html new file mode 100644 index 00000000..d2cb4d07 --- /dev/null +++ b/docs/dws/dev/dws_06_0146.html @@ -0,0 +1,70 @@ + + +

ALTER TEXT SEARCH DICTIONARY

+

Function

ALTER TEXT SEARCH DICTIONARY modifies the definition of a full-text retrieval dictionary, including its parameters, name, owner, and schema.

+
+

Precautions

  • ALTER is not supported by predefined dictionaries.
  • Only the owner of a dictionary can do ALTER to the dictionary. System administrators have this permission by default.
  • After a dictionary is created or modified, any modification to the user-defined dictionary definition file in the directory specified by FilePath will not affect the dictionary in the database. To make such modifications take effect in the dictionary in the database, run the ALTER TEXT SEARCH DICTIONARY statement to update the definition file of the dictionary.
+
+

Syntax

  • Modify the dictionary definition.
    1
    +2
    +3
    ALTER TEXT SEARCH DICTIONARY name (
    +    option [ = value ] [, ... ]
    +);
    +
    + +
    +
+
  • Rename a dictionary.
    1
    ALTER TEXT SEARCH DICTIONARY name RENAME TO new_name;
    +
    + +
    +
  • Set the schema of a dictionary.
    1
    ALTER TEXT SEARCH DICTIONARY name SET SCHEMA new_schema;
    +
    + +
    +
  • Change the owner of a dictionary.
    1
    ALTER TEXT SEARCH DICTIONARY name OWNER TO new_owner;
    +
    + +
    +
+
+

Parameter Description

  • name

    Specifies the name of an existing dictionary. (If you do not specify a schema name, the dictionary in the current schema will be used.)

    +

    Value range: name of an existing dictionary

    +
  • option

    Specifies the name of a parameter to be modified. Each type of dictionaries has a template containing their custom parameters. Parameters function in a way irrelevant to their setting sequence. For details about parameters, see option.

    +
    • The TEMPLATE parameter in a dictionary cannot be modified.
    • To specify a dictionary, specify both the dictionary definition file path (FILEPATH) and the file name (the parameter varies based on dictionary types).
    • The name of a dictionary definition file can contain only lowercase letters, digits, and underscores (_).
    +
    +
  • value

    Specifies the new value of a parameter. If = and value are omitted, the previous settings of the parameter will be deleted and the default value will be used.

    +

    Value range: valid values defined for the parameter

    +
  • new_name

    Specifies the new name of a dictionary.

    +

    Value range: a string, which complies with the identifier naming convention. A value can contain a maximum of 63 characters.

    +
  • new_owner

    Specifies the new owner of a dictionary.

    +

    Value range: an existing user name

    +
  • new_schema

    Specifies the new schema of a dictionary.

    +

    Value range: an existing schema name

    +
+
+

Examples

Modify the definition of stop words in Snowball dictionaries. Retain the values of other parameters.

+
1
ALTER TEXT SEARCH DICTIONARY my_dict ( StopWords = newrussian, FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' );
+
+ +
+

Modify the Language parameter in Snowball dictionaries and delete the definition of stop words.

+
1
ALTER TEXT SEARCH DICTIONARY my_dict ( Language = dutch, StopWords );
+
+ +
+

Update the dictionary definition and do not change any other content.

+
1
ALTER TEXT SEARCH DICTIONARY my_dict ( dummy );
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0147.html b/docs/dws/dev/dws_06_0147.html new file mode 100644 index 00000000..b5ff0fec --- /dev/null +++ b/docs/dws/dev/dws_06_0147.html @@ -0,0 +1,45 @@ + + +

ALTER TRIGGER

+

Function

ALTER TRIGGER modifies the definition of a trigger.

+
+

Precautions

Only the owner of a table where a trigger is created and system administrators can run the ALTER TRIGGER statement.

+
+

Syntax

1
ALTER TRIGGER trigger_name ON table_name RENAME TO new_name;
+
+ +
+
+

Parameter Description

  • trigger_name

    Specifies the name of the trigger to be modified.

    +

    Value range: an existing trigger

    +
  • table_name

    Specifies the name of the table where the trigger to be modified is located.

    +

    Value range: an existing table having a trigger

    +
  • new_name

    Specifies the new name after modification.

    +

    Value range: a string that complies with the identifier naming convention. A value contains a maximum of 63 characters and cannot be the same as other triggers on the same table.

    +
+
+

Examples

Modified the trigger delete_trigger.

+
1
ALTER TRIGGER delete_trigger ON test_trigger_src_tbl RENAME TO delete_trigger_renamed;
+
+ +
+

Disable the trigger insert_trigger.

+
1
ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER insert_trigger;  
+
+ +
+

Disable all triggers on the test_trigger_src_tbl table.

+
1
ALTER TABLE test_trigger_src_tbl DISABLE TRIGGER ALL; 
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0148.html b/docs/dws/dev/dws_06_0148.html new file mode 100644 index 00000000..777611e4 --- /dev/null +++ b/docs/dws/dev/dws_06_0148.html @@ -0,0 +1,137 @@ + + +

ALTER TYPE

+

Function

ALTER TYPE modifies the definition of a type.

+
+

Syntax

  • Modify a type.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    ALTER TYPE name action [, ... ]
    +ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    +ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
    +ALTER TYPE name RENAME TO new_name
    +ALTER TYPE name SET SCHEMA new_schema
    +ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ] 
    +ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
    +
    +where action is one of:
    +    ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    +    DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
    +    ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    +
    + +
    +
  • Add a new attribute to a composite type.
    1
    ALTER TYPE name ADD ATTRIBUTE attribute_name data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    +
    + +
    +
+
+
  • Delete an attribute from a composite type.
    1
    ALTER TYPE name DROP ATTRIBUTE [ IF EXISTS ] attribute_name [ CASCADE | RESTRICT ]
    +
    + +
    +
+
  • Change the type of an attribute in a composite type.
    1
    ALTER TYPE name ALTER ATTRIBUTE attribute_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ CASCADE | RESTRICT ]
    +
    + +
    +
+
  • Change the owner of a type.
    1
    ALTER TYPE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
    +
    + +
    +
+
  • Change the name of a type or the name of an attribute in a composite type.
    1
    +2
    ALTER TYPE name RENAME TO new_name
    +ALTER TYPE name RENAME ATTRIBUTE attribute_name TO new_attribute_name [ CASCADE | RESTRICT ]
    +
    + +
    +
+
  • Move a type to a new schema.
    1
    ALTER TYPE name SET SCHEMA new_schema
    +
    + +
    +
+
  • Add a new value to an enumerated type.
    1
    ALTER TYPE name ADD VALUE [ IF NOT EXISTS ] new_enum_value [ { BEFORE | AFTER } neighbor_enum_value ]
    +
    + +
    +
+
  • Change an enumerated value in the value list.
    1
    ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
    +
    + +
    +
+

Parameter Description

  • name

    Specifies the name of an existing type that needs to be modified (schema-qualified).

    +
+
  • new_name

    Specifies the new name of the type.

    +
+
  • new_owner

    Specifies the new owner of the type.

    +
+
  • new_schema

    Specifies the new schema of the type.

    +
+
  • attribute_name

    Specifies the name of the attribute to be added, modified, or deleted.

    +
+
  • new_attribute_name

    Specifies the new name of the attribute to be renamed.

    +
+
  • data_type

    Specifies the data type of the attribute to be added, or the new type of the attribute to be modified.

    +
  • new_enum_value

    Specifies a new enumerated value. It is a non-empty string with a maximum length of 64 bytes.

    +
  • neighbor_enum_value

    Specifies an existing enumerated value before or after which a new enumerated value will be added.

    +
  • existing_enum_value

    Specifies an enumerated value to be changed. It is a non-empty string with a maximum length of 64 bytes.

    +
+
  • CASCADE

    Determines that the type to be modified, its associated records, and subtables that inherit the type will all be updated.

    +
  • RESTRICT

    Refuses to update the association record of the modified type. This is the default.

    +
    • ADD ATTRIBUTE, DROP ATTRIBUTE, and ALTER ATTRIBUTE can be combined for processing. For example, it is possible to add several attributes or change the types of several attributes at the same time in one command.
    • Only type owners can run ALTER TYPE. To modify the schema of a type, you must also have the CREATE permission for the new schema. To modify the owner of a type, you must be a direct or indirect member of the new owner and have the CREATE permission for the schema of this type. (These restrictions force modification owners not to do anything that cannot be done by deleting and rebuilding types. However, system administrators can modify the ownership of any type in any way.) To add an attribute or modify the type of an attribute, you must also have the USAGE permission for this type.
    +
    +
+
+

Examples

Rename the data type.

+
1
ALTER TYPE compfoo RENAME TO compfoo1;
+
+ +
+

Change the owner of the user-defined type compfoo1 to usr1.

+
1
ALTER TYPE compfoo1 OWNER TO usr1;
+
+ +
+

Change the schema of the user-defined type compfoo1 to usr1.

+
1
ALTER TYPE compfoo1 SET SCHEMA usr1;
+
+ +
+

Add the f3 attribute to the compfoo1 data type.

+
1
ALTER TYPE compfoo1 ADD ATTRIBUTE f3 int;
+
+ +
+

Add a tag value to the enumeration type bugstatus.

+
1
ALTER TYPE bugstatus ADD VALUE IF NOT EXISTS 'regress' BEFORE 'closed';
+
+ +
+

Rename a tag value of the enumeration type bugstatus.

+
1
ALTER TYPE bugstatus RENAME VALUE 'create' TO 'new';
+
+ +
+
+

Helpful Links

CREATE TYPE, DROP TYPE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0149.html b/docs/dws/dev/dws_06_0149.html new file mode 100644 index 00000000..a50659b5 --- /dev/null +++ b/docs/dws/dev/dws_06_0149.html @@ -0,0 +1,131 @@ + + +

ALTER USER

+

Function

ALTER USER modifies the attributes of a database user.

+
+

Precautions

Session parameters modified by ALTER USER apply to a specified user and take effect in the next session.

+
+

Syntax

  • Modify user rights or other information.
    1
    ALTER USER user_name [ [ WITH ] option [ ... ] ];
    +
    + +
    +

    The option clause is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    { CREATEDB | NOCREATEDB }
    +    | { CREATEROLE | NOCREATEROLE }
    +    | { INHERIT | NOINHERIT }
    +    | { AUDITADMIN | NOAUDITADMIN }
    +    | { SYSADMIN | NOSYSADMIN }
    +    | { USEFT | NOUSEFT }
    +    | { LOGIN | NOLOGIN }
    +    | { REPLICATION | NOREPLICATION }
    +    | {INDEPENDENT | NOINDEPENDENT}
    +    | {VCADMIN | NOVCADMIN}
    +    | CONNECTION LIMIT connlimit
    +    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD { 'password' | DISABLE }
    +    | [ ENCRYPTED | UNENCRYPTED ] IDENTIFIED BY { 'password' [ REPLACE 'old_password' ] | DISABLE }
    +    | VALID BEGIN 'timestamp'
    +    | VALID UNTIL 'timestamp'
    +    | RESOURCE POOL 'respool'
    +    | USER GROUP 'groupuser'
    +    | PERM SPACE 'spacelimit'
    +    | TEMP SPACE 'tmpspacelimit'
    +    | SPILL SPACE 'spillspacelimit'
    +    | NODE GROUP logic_cluster_name
    +    | ACCOUNT { LOCK | UNLOCK }
    +    | PGUSER
    +    | AUTHINFO 'authinfo'
    +    | PASSWORD EXPIRATOIN period
    +
    + +
    +
  • Change the user name.
    1
    +2
    ALTER USER user_name 
    +    RENAME TO new_name;
    +
    + +
    +
  • Change the value of a specified parameter associated with the user.
    1
    +2
    ALTER USER user_name 
    +    SET configuration_parameter { { TO | = } { value | DEFAULT } | FROM CURRENT };
    +
    + +
    +
  • Reset the value of a specified parameter associated with the user.
    1
    +2
    ALTER USER user_name 
    +    RESET { configuration_parameter | ALL };
    +
    + +
    +
+
+

Parameters

  • user_name

    Specifies the current user name.

    +

    Value range: an existing user name

    +
  • new_password

    Indicates a new password.

    +

    A password must:

    +
    • Differ from the old password.
    • Contain at least eight characters. This is the default length.
    • Differ from the user name or the user name spelled backwards.
    • Contains at least three of the following four character types: uppercase letters, lowercase letters, digits, and special characters, including: ~!@#$%^&*()-_=+\|[{}];:,<.>/?. If you use characters other than the four types, a warning is displayed, but you can still create the password.
    +

    Value range: a string

    +
  • old_password

    Indicates the old password.

    +
  • ACCOUNT LOCK | ACCOUNT UNLOCK
    • ACCOUNT LOCK: locks an account to forbid login to databases.
    • ACCOUNT UNLOCK: unlocks an account to allow login to databases.
    +
  • PGUSER

    PGUSER of a user cannot be modified in the current version.

    +
+

For details about other parameters, see "Parameter Description" in CREATE ROLE and ALTER ROLE.

+
+

Example

Change the login password of user jim.

+
1
ALTER USER jim IDENTIFIED BY '{password}' REPLACE '{old_password}';
+
+ +
+

Add the CREATEROLE permission to user jim.

+
1
ALTER USER jim CREATEROLE;
+
+ +
+

Set enable_seqscan to on (the setting will take effect in the next session).

+
1
ALTER USER jim SET enable_seqscan TO on;
+
+ +
+

Reset the enable_seqscan parameter for user jim.

+
1
ALTER USER jim RESET enable_seqscan;
+
+ +
+

Lock the jim account.

+
1
ALTER USER jim ACCOUNT LOCK;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0150.html b/docs/dws/dev/dws_06_0150.html new file mode 100644 index 00000000..4f52369a --- /dev/null +++ b/docs/dws/dev/dws_06_0150.html @@ -0,0 +1,112 @@ + + +

ALTER VIEW

+

Function

ALTER VIEW modifies all auxiliary attributes of a view. (To modify the query definition of a view, use CREATE OR REPLACE VIEW.)

+
+

Precautions

  • Only the view owner can modify a view by running ALTER VIEW.
  • To change a view's schema, you must also have the CREATE permission on the new schema.
  • To alter the owner, you must also be a direct or indirect member of the new owning role, and that role must have CREATE privilege on the view's schema.
  • An administrator can change the owner relationship of any view.
+
+

Syntax

  • Set the default value of the view column.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name
    +    ALTER [ COLUMN ] column_name SET DEFAULT expression;
    +
    + +
    +
  • Remove the default value of the view column.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name
    +    ALTER [ COLUMN ] column_name DROP DEFAULT;
    +
    + +
    +
  • Change the owner of a view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name 
    +    OWNER TO new_owner;
    +
    + +
    +
  • Rename a view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name 
    +    RENAME TO new_name;
    +
    + +
    +
  • Set the schema of the view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name 
    +    SET SCHEMA new_schema;
    +
    + +
    +
  • Set the options of the view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name
    +    SET ( { view_option_name [ = view_option_value ] } [, ... ] );
    +
    + +
    +
  • Reset the options of the view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name
    +    RESET ( view_option_name [, ... ] );
    +
    + +
    +
+
+
  • Rebuild a view.
    1
    +2
    ALTER VIEW [ IF EXISTS ] view_name
    +    REBUILD;
    +
    + +
    +
+
  • Rebuild a dependent view.
    1
    +2
    ALTER VIEW ONLY [ IF EXISTS ] view_name
    +    REBUILD;
    +
    + +
    +
+

Parameter Description

  • IF EXISTS

    If this option is specified, no error is reported if the view does not exist. Only a message is displayed.

    +
  • view_name

    Specifies the view name, which can be schema-qualified.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Indicates an optional list of names to be used for columns of the view. If not given, the column names are deduced from the query.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • SET/DROP DEFAULT

    Sets or deletes the default value of a column. Currently, this parameter does not take effect.

    +
  • new_owner

    Specifies the new owner of a view.

    +
  • new_name

    Specifies the new view name.

    +
  • new_schema

    Specifies the new schema of the view.

    +
  • view_option_name [ = view_option_value ]

    This clause specifies optional parameters for a view.

    +

    Currently, the only parameter supported by view_option_name is security_barrier, which should be enabled when a view is intended to provide row-level security.

    +

    Value range: boolean type. It can be TRUE or FALSE.

    +
  • REBUILD
    This clause is used for view decoupling. You can use the saved original statement to rebuild views and restore the dependencies. Note the following:
    • View rebuilding starts from the current view and updates all associated backward views. If the forward views on which the current view depends are also unavailable, automatic rebuilding is triggered.
    • The temporary tables and views that have dependency relationships cannot be decoupled and dropped. However, you can perform the REBUILD operation on temporary views that do not have dependency relationships.
    • View schema names and view names can be modified. The names of rebuilt view schemas or views are re-created based on the latest name, but the query operation retains the original definition.
    • Only fields of the character, number, and time types in the base table can be modified.
    • Invalid views are exported as comments during backup. You need to manually restore the invalid views.
    • Views can be automatically rebuilt when VIEW_INDEPENDENT is set to on.
    +
    +
  • ONLY

    Only views and their dependent views are rebuilt. This function is available only if view_independent is set to on.

    +
+
+

Examples

Rename a view.

+
1
ALTER VIEW tpcds.customer_details_view_v1 RENAME TO customer_details_view_v2;
+
+ +
+

Change the schema of a view.

+
1
ALTER VIEW tpcds.customer_details_view_v2 SET schema public;
+
+ +
+

Rebuild a view.

+
1
ALTER VIEW public.customer_details_view_v2 REBUILD;
+
+ +
+

Rebuild a dependent view.

+
1
ALTER VIEW ONLY public.customer_details_view_v2 REBUILD;
+
+ +
+
+

Helpful Links

CREATE VIEW, DROP VIEW

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0151.html b/docs/dws/dev/dws_06_0151.html new file mode 100644 index 00000000..d0fe3a89 --- /dev/null +++ b/docs/dws/dev/dws_06_0151.html @@ -0,0 +1,54 @@ + + +

CLEAN CONNECTION

+

Function

CLEAN CONNECTION clears database connections when a database is abnormal. You may use this statement to delete a specific user's connections to a specified database.

+
+

Precautions

None

+
+

Syntax

1
+2
+3
+4
CLEAN CONNECTION 
+    TO { COORDINATOR ( nodename [, ... ] ) | NODE ( nodename [, ... ] )| ALL [ CHECK ] [ FORCE ] }
+    [ FOR DATABASE dbname ] 
+    [ TO USER username ];
+
+ +
+
+

Parameter Description

  • CHECK

    This parameter can be specified only when the node list is specified as TO ALL. Setting this parameter will check whether a database is accessed by other sessions before its connections are cleared. If any sessions are detected before DROP DATABASE is executed, an error will be reported and the database will not be deleted.

    +
  • FORCE

    This parameter can be specified only when the node list is specified as TO ALL. Setting this parameter will send SIGTERM signals to all the threads related to the specified dbname and username and forcibly shut them down.

    +
  • COORDINATOR ( nodename ,nodename ... } ) | NODE ( nodename , nodename ... ) | ALL

    Deletes connections on a specified node. There are three scenarios:

    +
    • Deletes connections to a specified CN.
    • Deletes connections to a specified DN.
    • Deletes connections to all CNs and DNs.
    +

    Value range: nodename is an existing node name.

    +
  • dbname

    Deletes connections to a specific database. If this parameter is not specified, connections to all databases will be deleted.

    +

    Value range: an existing database name

    +
  • username

    Deletes connections of a specific user. If this parameter is not specified, connections of all users will be deleted.

    +

    Value range: an existing user name

    +

    Either dbname or username must be specified.

    +
    +
+
+

Examples

Clean connections to nodes dn1 and dn2 for the template1 database.

+
1
CLEAN CONNECTION TO NODE (dn1,dn2) FOR DATABASE template1;
+
+ +
+

Clean user jack's connections to dn1.

+
1
CLEAN CONNECTION TO NODE (dn1) TO USER jack;
+
+ +
+

Delete all connections to the gaussdb database.

+
1
CLEAN CONNECTION TO ALL FORCE FOR DATABASE gaussdb;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0152.html b/docs/dws/dev/dws_06_0152.html new file mode 100644 index 00000000..d2ade484 --- /dev/null +++ b/docs/dws/dev/dws_06_0152.html @@ -0,0 +1,31 @@ + + +

CLOSE

+

Function

CLOSE frees the resources associated with an open cursor.

+
+

Precautions

  • After a cursor is closed, no subsequent operations are allowed on it.
  • A cursor should be closed when it is no longer needed.
  • Every non-holdable open cursor is implicitly closed when a transaction is terminated by COMMIT or ROLLBACK.
  • A holdable cursor is implicitly closed if the transaction that created it aborts via ROLLBACK.
  • If the creating transaction successfully commits, the holdable cursor remains open until an explicit CLOSE is executed, or the client disconnects.
  • GaussDB(DWS) does not have an explicit OPEN cursor statement. A cursor is considered open when it is declared. You can see all available cursors by querying the pg_cursors system view.
+
+

Syntax

1
CLOSE { cursor_name | ALL } ;
+
+ +
+
+

Parameter Description

  • cursor_name

    Specifies the name of a cursor to be closed.

    +
  • ALL

    Closes all open cursors.

    +
+
+

Example

Close a cursor.

+
1
CLOSE cursor1;
+
+ +
+
+

Links

FETCH, MOVE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0153.html b/docs/dws/dev/dws_06_0153.html new file mode 100644 index 00000000..e5767300 --- /dev/null +++ b/docs/dws/dev/dws_06_0153.html @@ -0,0 +1,107 @@ + + +

CLUSTER

+

Function

Cluster a table according to an index.

+

CLUSTER instructs GaussDB(DWS) to cluster the table specified by table_name based on the index specified by index_name. The index must have been defined on table_name.

+

When a table is clustered, it is physically reordered based on the index information. Clustering is a one-time operation: when the table is subsequently updated, the changes are not clustered. That is, no attempt is made to store new or updated rows according to their index order.

+

When a table is clustered, GaussDB(DWS) records which index the table was clustered by. The form CLUSTER table_name reclusters the table using the same index as before. You can also use the CLUSTER or SET WITHOUT CLUSTER forms of ALTER TABLE to set the index to be used for future cluster operations, or to clear any previous setting.

+

CLUSTER without any parameter reclusters all the previously-clustered tables in the current database that the calling user owns, or all such tables if called by an administrator.

+

When a table is being clustered, an ACCESS EXCLUSIVE lock is acquired on it. This prevents any other database operations (both reads and writes) from operating on the table until the CLUSTER is finished.

+
+

Precautions

Only row-store B-tree indexes support CLUSTER.

+

In cases where you are accessing single rows randomly within a table, the actual order of the data in the table is unimportant. However, if you tend to access some data more than others, and there is an index that groups them together, you will benefit from using CLUSTER. If you are requesting a range of indexed values from a table, or a single indexed value that has multiple rows that match, CLUSTER will help because once the index identifies the table page for the first row that matches, all other rows that match are probably already on the same table page, and so you save disk accesses and speed up the query.

+

When an index scan is used, a temporary copy of the table is created that contains the table data in the index order. Temporary copies of each index on the table are created as well. Therefore, you need free space on disk at least equal to the sum of the table size and the index sizes.

+

Because CLUSTER remembers which indexes are clustered, one can cluster the tables manually the first time, then set up a time like VACUUM without any parameters, so that the desired tables are periodically reclustered.

+

Because the optimizer records statistics about the ordering of tables, it is advisable to run ANALYZE on the newly clustered table. Otherwise, the optimizer might make poor choices of query plans.

+

CLUSTER cannot be executed in transactions.

+
+

Syntax

  • Cluster a table.
    1
    CLUSTER [ VERBOSE ] table_name [ USING index_name ];
    +
    + +
    +
  • Cluster a partition.
    1
    CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ];
    +
    + +
    +
  • Cluster the table that has previously been clustered.
    1
    CLUSTER [ VERBOSE ];
    +
    + +
    +
+
+

Parameter Description

  • VERBOSE

    Enables the display of progress messages.

    +
  • table_name

    Specifies the name of the table.

    +

    Value range: an existing table name

    +
  • index_name

    Name of this index

    +

    Value range: An existing index name.

    +
  • partition_name

    Specifies the partition name.

    +

    Value range: An existing partition name.

    +
+
+

Examples

Create a partitioned table.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.inventory_p1
+(
+    INV_DATE_SK               INTEGER               NOT NULL,
+    INV_ITEM_SK               INTEGER               NOT NULL,
+    INV_WAREHOUSE_SK          INTEGER               NOT NULL,
+    INV_QUANTITY_ON_HAND      INTEGER
+)
+DISTRIBUTE BY HASH(INV_ITEM_SK)
+PARTITION BY RANGE(INV_DATE_SK)
+(
+        PARTITION P1 VALUES LESS THAN(2451179),
+        PARTITION P2 VALUES LESS THAN(2451544),
+        PARTITION P3 VALUES LESS THAN(2451910),
+        PARTITION P4 VALUES LESS THAN(2452275),
+        PARTITION P5 VALUES LESS THAN(2452640),
+        PARTITION P6 VALUES LESS THAN(2453005),
+        PARTITION P7 VALUES LESS THAN(MAXVALUE)
+);
+
+ +
+

Create an index named ds_inventory_p1_index1.

+
1
CREATE INDEX ds_inventory_p1_index1 ON tpcds.inventory_p1 (INV_ITEM_SK) LOCAL;
+
+ +
+

Cluster the tpcds.inventory_p1 table.

+
1
CLUSTER tpcds.inventory_p1 USING ds_inventory_p1_index1;
+
+ +
+

Cluster the p3 partition.

+
1
CLUSTER tpcds.inventory_p1 PARTITION (p3) USING ds_inventory_p1_index1;
+
+ +
+

Cluster the tables that can be clustered in the database.

+
1
CLUSTER;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0154.html b/docs/dws/dev/dws_06_0154.html new file mode 100644 index 00000000..679b3181 --- /dev/null +++ b/docs/dws/dev/dws_06_0154.html @@ -0,0 +1,118 @@ + + +

COMMENT

+

Function

COMMENT defines or changes the comment of an object.

+
+

Precautions

  • Only one comment string is stored for each object. To modify a comment, issue a new COMMENT command for the same object. To remove a comment, write NULL in place of the text string. Comments are automatically deleted when their objects are deleted.
  • Currently, there is no security protection for viewing comments. Any user connected to a database can view all the comments for objects in the database. For shared objects such as databases, roles, and tablespaces, comments are stored globally so any user connected to any database in the cluster can see all the comments for shared objects. Therefore, do not put security-critical information in comments.
  • For most kinds of objects, only the owner of objects can set the comment. Roles do not have owners, so the rule for COMMENT ON ROLE is that you must be administrator to comment on an administrator role, or have the CREATEROLE permission to comment on non-administrator roles. An administrator can comment on anything.
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
COMMENT ON
+{
+  AGGREGATE agg_name (agg_type [, ...] ) |
+  CAST (source_type AS target_type) |
+  COLLATION object_name |
+  COLUMN { table_name.column_name | view_name.column_name } |
+  CONSTRAINT constraint_name ON table_name |
+  CONVERSION object_name |
+  DATABASE object_name |
+  DOMAIN object_name |
+  EXTENSION object_name |
+  FOREIGN DATA WRAPPER object_name |
+  FOREIGN TABLE object_name |
+  FUNCTION function_name ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) |
+  INDEX object_name |
+  LARGE OBJECT large_object_oid |
+  OPERATOR operator_name (left_type, right_type) |
+  OPERATOR CLASS object_name USING index_method |
+  OPERATOR FAMILY object_name USING index_method |
+  [ PROCEDURAL ] LANGUAGE object_name |
+  ROLE object_name |
+  RULE rule_name ON table_name |
+  SCHEMA object_name |
+  SERVER object_name |
+  TABLE object_name |
+  TABLESPACE object_name |
+  TEXT SEARCH CONFIGURATION object_name |
+  TEXT SEARCH DICTIONARY object_name |
+  TEXT SEARCH PARSER object_name |
+  TEXT SEARCH TEMPLATE object_name |
+  TYPE object_name |
+  VIEW object_name
+}
+   IS 'text';
+
+ +
+
+

Parameter Description

  • agg_name

    Specifies the new name of an aggregation function.

    +
  • agg_type

    Specifies the data types of the aggregation function parameters.

    +
  • source_type

    Specifies the name of the source data type of the cast.

    +
  • target_type

    Specifies the name of the target data type of the cast.

    +
  • object_name

    Specifies the name of the object to be commented.

    +
  • table_name.column_name

    view_name.column_name

    +

    Specifies the column whose comment is defined or modified. You can add the table name or view name as the prefix.

    +
  • constraint_name

    Specifies the table constraints whose comment is defined or modified.

    +
  • table_name

    Specifies the table name.

    +
  • function_name

    Specifies the function whose comment is defined or modified.

    +
  • argmode,argname,argtype

    Specifies the schema, name, and type of the function parameters.

    +
  • large_object_oid

    Specifies the OID of the large object whose comment is defined or modified.

    +
  • operator_name

    Specifies the name of the operator.

    +
  • left_type,right_type

    The data type(s) of the operator's arguments (optionally schema-qualified). Write NONE for the missing argument of a prefix or postfix operator.

    +
  • text

    Specifies the new comment, written as a string literal; or NULL to drop the comment.

    +
+
+

Examples

Add a comment to the customer.c_customer_sk column.

+
1
COMMENT ON COLUMN customer.c_customer_sk IS 'Primary key of customer demographics table.';
+
+ +
+

Add a comment to the tpcds.customer_details_view_v2 view.

+
1
COMMENT ON VIEW tpcds.customer_details_view_v2 IS 'View of customer detail';
+
+ +
+

Add comments to the customer table.

+
1
COMMENT ON TABLE customer IS 'This is my table';
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0155.html b/docs/dws/dev/dws_06_0155.html new file mode 100644 index 00000000..5142ddba --- /dev/null +++ b/docs/dws/dev/dws_06_0155.html @@ -0,0 +1,34 @@ + + +

CREATE BARRIER

+

Function

Creates a barrier for cluster nodes. The barrier can be used for data restoration.

+
+

Precautions

Before creating a barrier, ensure that gtm_backup_barrier and enable_cbm_tracking are set to on for CNs and DNs in the cluster.

+
+

Syntax

1
CREATE BARRIER [ barrier_name  ] ;
+
+ +
+
+

Parameter Description

barrier_name

+

(Optional) Indicates the name of a barrier.

+

Value range: a string. It must comply with the naming convention.

+
+

Examples

Create a barrier without specifying its name.

+
1
CREATE BARRIER;
+
+ +
+

Create a barrier named barrier1.

+
1
CREATE BARRIER 'barrier1';
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0156.html b/docs/dws/dev/dws_06_0156.html new file mode 100644 index 00000000..222101c3 --- /dev/null +++ b/docs/dws/dev/dws_06_0156.html @@ -0,0 +1,91 @@ + + +

CREATE DATABASE

+

Function

CREATE DATABASE creates a database. By default, the new database will be created by cloning the standard system database template1. A different template can be specified using TEMPLATE template name.

+
+

Precautions

  • A user that has the CREATEDB permission or a sysadmin can create a database.
  • CREATE DATABASE cannot be executed inside a transaction block.
  • Errors along the line of "could not initialize database directory" are most likely related to insufficient permissions on the data directory, a full disk, or other file system problems.
+
+

Syntax

1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE DATABASE database_name
+    [ [ WITH ] { [ OWNER [=] user_name ] |
+               [ TEMPLATE [=] template ] |
+               [ ENCODING [=] encoding ] |
+               [ LC_COLLATE [=] lc_collate ] |
+               [ LC_CTYPE [=] lc_ctype ] |
+               [ DBCOMPATIBILITY [=] compatibilty_type ] |
+               
+               [ CONNECTION LIMIT [=] connlimit ]}[...] ];
+
+ +
+
+

Parameter Description

  • database_name

    Indicates the database name.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • OWNER [ = ] user_name

    Indicates the owner of the new database. By default, the owner of the database is the current user.

    +

    Value range: an existing user name

    +
  • TEMPLATE [ = ] template

    Indicates the template name, that is, the name of the template to be used to create the database. GaussDB(DWS) creates a database by coping a database template. GaussDB(DWS) has two default template databases template0 and template1 and a default user database gaussdb.

    +

    Value range: An existing database name. If this it is not specified, the system copies template1 by default. Its value cannot be gaussdb.

    +

    Currently, database templates cannot contain sequences. If a database template contains sequences, database creation using this template will fail.

    +
    +
  • ENCODING [ = ] encoding

    Specifies the encoding format used by the new database. The value can be a string (for example, SQL_ASCII) or an integer.

    +

    By default, the encoding format of the template database is used. The encoding formats of the template databases template0 and template1 vary based on OS environments by default. The template1 database does not allow encoding customization. To specify encoding for a database when creating it, use template0. To specify encoding, set template to template0.

    +

    Common values: GBK, UTF8, and Latin1

    +
    • To view the character encoding of the current database, run the show server_encoding; command .
    • To make your database compatible with most characters, you are advised to use the UTF8 encoding when creating a database.
    +
    • The character encoding set of the new database must be compatible with the local settings (LC_COLLATE and LC_CTYPE).
    • When the specified character encoding set is GBK, some uncommon Chinese characters cannot be used as object names. This is because when the encoding range of the second byte of GBK is between 0x40 and 0x7E, the byte encoding overlaps with the ASCII character @A-Z[\]^_`a-z{|}. @[\]^_?{|} are operators in the database. If it is directly used as an object name, a syntax error will be reported. For example, the GBK hexadecimal code of an uncommon character is 0x8240, and the second byte is 0x40, which is the same as the ASCII character @. Therefore, the character cannot be used as an object name. If you really want to use it, you can avoid this problem by adding double quotation marks when creating and accessing objects.
    • In the current version, the GBK character set supports the character , which is represented as 0x80 in hexadecimal code. You can use the character in the GBK library, and the GBK character set of GaussDB(DWS) is compatible with the CP936 character set. Note that the GBK character set is approximately equal to the CP936 character set, but the GBK character set does not contain the definition of the character .
    +
    +
  • LC_COLLATE [ = ] lc_collate

    Specifies the collation order to use in the new database. For example, this parameter can be set using lc_collate = 'zh_CN.gbk'.

    +

    The use of this parameter affects the sort order applied to strings, for example, in queries with ORDER BY, as well as the order used in indexes on text columns. The default is to use the collation order of the template database.

    +

    Value range: A valid order type.

    +
  • LC_CTYPE [ = ] lc_ctype

    Specifies the character classification to use in the new database. For example, this parameter can be set using lc_ctype = 'zh_CN.gbk'. The use of this parameter affects the categorization of characters, for example, lower, upper and digit. The default is to use the character classification of the template database.

    +

    Value range: A valid character type.

    +
  • DBCOMPATIBILITY [ = ] compatibilty_type

    Specifies the compatible database type.

    +

    Value range: ORA, TD, and MySQL, representing the Oracle-, Teradata-, and MySQL-compatible modes, respectively. If this parameter is not specified, the default value ORA is used.

    +
  • TABLESPACE [ = ] tablespace_name

    Specifies the name of the tablespace that will be associated with the new database.

    +

    Value range: An existing tablespace name.

    +

    The specified tablespace cannot be the OBS tablespace.

    +
    +
  • CONNECTION LIMIT [ = ] connlimit

    Indicates the maximum number of concurrent connections that can be made to the new database.

    +

    Value range: An integer greater than or equal to -1. The default value -1 means no limit.

    +
    • This limit does not apply to sysadmin.
    • To ensure the proper running of a cluster, the minimum value of CONNECTION LIMIT is the number of CNs in the cluster, because when a cluster runs ANALYZE on a CN, other CNs will connect to the running CN for metadata synchronization. For example, if there are three CNs in the cluster, set CONNECTION LIMIT to 3 or a greater value.
    +
    +
+

The following are limitations on character encoding:

+
  • If the locale is C (or equivalently POSIX), then all encoding modes are allowed, but for other locale settings only the encoding consistent with that of the locale will work properly.
  • The encoding and locale settings must match those of the template database, except when template0 is used as template. This is because other databases might contain data that does not match the specified encoding, or might contain indexes whose sort ordering is affected by LC_COLLATE and LC_CTYPE. Copying such data would result in a database that is corrupt according to the new settings. template0, however, is known to not contain any data or indexes that would be affected.
  • Supported encoding depends on the environment. If the message "invalid locale name" is displayed, run the locale -a command to check the encoding set supported by the environment.
+
+

Examples

Create database music using GBK (the local encoding type is also GBK).

+
1
CREATE DATABASE music ENCODING 'GBK' template = template0;
+
+ +
+

Create database music2 and specify jim as its owner.

+
1
CREATE DATABASE music2 OWNER jim;
+
+ +
+

Create database music3 using template template0 and specify jim as its owner.

+
1
CREATE DATABASE music3 OWNER jim TEMPLATE template0;
+
+ +
+

Create a compatible Oracle database ora_compatible_db.

+
1
CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0159.html b/docs/dws/dev/dws_06_0159.html new file mode 100644 index 00000000..d3ac866f --- /dev/null +++ b/docs/dws/dev/dws_06_0159.html @@ -0,0 +1,315 @@ + + +

CREATE FOREIGN TABLE (for GDS Import and Export)

+

CREATE FOREIGN TABLE creates a GDS foreign table.

+

Function

CREATE FOREIGN TABLE creates a GDS foreign table in the current database for concurrent data import and export. The GDS foreign table can be read-only or write-only, used for concurrent data import and export, respectively. The OBS foreign table is read-only by default.

+
+

Precautions

  • The foreign table is owned by the user who runs the command.
  • The distribution mode of a GDS foreign table does not need to be explicitly specified. The default is ROUNDROBIN.
  • All constraints (including column and row constraints) are invalid to the GDS foreign table.
+
+

Syntax

1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE FOREIGN TABLE [ IF NOT EXISTS  ] table_name 
+    ( [  { column_name type_name POSITION(offset,length) | LIKE source_table } [, ...]  ] ) 
+    SERVER gsmpp_server 
+    OPTIONS (  { option_name ' value '  }  [, ...] ) 
+    [  { WRITE ONLY  |  READ ONLY  }] 
+    [ WITH error_table_name | LOG INTO error_table_name] 
+    [REMOTE LOG 'name'] 
+    [PER NODE REJECT LIMIT 'value']
+    [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];
+
+ +
+
+

Parameter Overview

CREATE FOREIGN TABLE provides multiple parameters, which are classified as follows:

+ +
+

Parameter Description

  • IF NOT EXISTS

    Does not throw an error if a table with the same name already exists. A notice is issued in this case.

    +
  • table_name

    Specifies the name of the foreign table to be created.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Specifies the name of a column in the foreign table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • type_name

    Specifies the data type of the column.

    +
  • POSITION(offset,length)

    Defining the location of each column in the data file in fixed length mode.

    +

    offset is the start of the column in the source file, and length is the length of the column.

    +
    +

    Value range: offset must be greater than 0 bytes, and its unit is byte.

    +

    The length of each record must be less than 1 GB. By default, columns not in the file are replaced with null.

    +
  • SERVER gsmpp_server

    Specifies the server name of the foreign table. For the GDS foreign table, its server is created by initial database, which is gsmpp_server.

    +
  • OPTIONS ( { option_name ' value ' } [, ...] )

    Specifies all types of parameters of foreign table data.

    +
    • location

      Specifies the data source location of the foreign table, which can be expressed through URLs. Separate URLs with vertical bars (|).

      +

      Currently, GDS can automatically create a directory defined by a foreign table during data export. For example, when the foreign table location defines that gsfs:// 192.168.0.91:5000/2019/09 executes an export task, if the 2019/09 subdirectory in the GDS data directory does not exist, the subdirectory is automatically created. You do not need to manually create the directory specified in the foreign table.

      +
      • For a read-only foreign table imported by GDS from a remote server in parallel, its URL must end with its corresponding schema or file name. (Read-only is the default file attribute.)

        For example: gsfs://192.168.0.90:5000/* or file:///data/data.txt or gsfs:// 192.168.0.90:5000/* | gsfs:// 192.168.0.91:5000/*.

        +
      • For a writable foreign table used for GDS to export data to a remote server in parallel, file names are not required in URLs. If the data source location is a remote URL, for example, gsfs:// 192.168.0.90:5000/, multiple data sources can be specified. If the number of exported data file locations is less than or equal to the number of DNs, when you use the foreign table for export, data is evenly distributed to each data source location. If the number of exported data file locations is greater than the number of DNs, when you export data, the data is evenly distributed to data source locations corresponding to the DNs. Blank data files are created on the excess data source locations.
      • For a foreign table used for GDS to import data from a remote server in parallel, the number of URLs must be less than the number of DNs, and URLs containing the same location cannot be used.
      • If the URL begins with gsfss://, data is imported and exported in encryption mode, and DOP cannot exceed 10.
      • During GDS export, the 2019/09 subdirectory in THE gsfs://127.0.0.1:7789/2019/09/ directory specified by the location table is automatically created when the export task is executed.
      • If file_type is set to pipe, GDS determines whether the target file to be imported or exported is a pipe file or a directory based on whether the last character in the URL is a slash (/). Example:
        • In gsfs://192.168.0.90:5000/a/b, GDS identifies b as a pipe file.
        • In gsfs://192.168.0.90:5000/a/b/, GDS identifies b as a directory and creates a pipe file in the directory.
        +
      +
      +
    • format

      Specifies the format of the data source file in a foreign table.

      +

      Value range: CSV, TEXT. The default value is TEXT.

      +
      • In CSV files, escape sequences are processed as common strings. Therefore, linefeeds are processed as data.
      • In TEXT files, escape sequences are processed as they are. Therefore, linefeeds are not processed as data.
      +
      • An escape sequence is a string starting with a backslash (\), including \b (backspace), \f (formfeed page break), \n (new line), \r (carriage return), \t (horizontal tab), \v (vertical tab), \number (octal number), and \xnumber (hexadecimal number). In TEXT files, strings are processed as they are. In files of other formats, strings are processed as data.
      +
      +
    • header

      Specifies whether a data file contains a table header. header is available only for CSV and FIXED files.

      +

      When data is imported, if header is on, the first row of the data file will be identified as title row and ignored. If header is off, the first row is identified as data.

      +

      When data is exported, if header is on, fileheader must be specified. fileheader is used to specify the export header file format. If header is off, the exported file does not include a title row.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
    • fileheader

      Specifies a file that defines the content in the header for exported data. The file contains one row of data description of each column.

      +

      For example, to add a header in a file containing product information, define the file as follows:

      +

      The information of products.\n

      +
      • This parameter is available only when header is on or true. The file must be prepared in advance.
      • In Remote mode, the definition file must be put to the working directory of GDS (the -d directory specified when starting the GDS).
      • The definition file can contain only one row of title information, and end with a newline character. Excess rows will be discarded. (Title information cannot contain newline character).
      • The length of the definition file including the newline character cannot exceed 1 MB.
      +
      +
    • out_filename_prefix

      Specifies the name prefix of the exported data file exported using GDS from a write-only foreign table.

      +

      If file_type is set to pipe, the pipe file dbName_schemaName_foreignTableName.pipe is generated.

      +

      If both out_filename_prefix and location specify a pipe name, the pipe name specified in location is used.

      +
      • The prefix of the specified file name must be valid and compliant with the restrictions of the file system in the physical environment where the GDS is deployed. Otherwise, the file will fail to be created.
        • The file name prefix can contain only lowercase letters, uppercase letters, digits, and underscores (_).
        • The prefix of the specified export file name cannot contain feature fields reserved for the Windows and Linux OS, including but not limited to:

          "con","aux","nul","prn","com0","com1","com2","com3","com4","com5","com6","com7","com8","com9","lpt0","lpt1","lpt2","lpt3","lpt4","lpt5","lpt6","lpt7","lpt8","lpt9"

          +
        • The total length of the absolute path consisting of the exported file prefix, the path specified by GDS –d, .dat, or .pipe should be as required by the file system where GDS is deployed.
        • It is required that the prefix can be correctly parsed and identified by the receiver (including but not limited to the original database where it was exported) of the data file. Identify and modify the option that causes the file name resolution problem (if any).
        +
      • To concurrently perform export jobs, do not use the same file name prefix for them. Otherwise, the exported files may overwrite each other or be lost in the OS or file system.
      +
      +
    • delimiter

      Specifies the column delimiter of data, and uses the default delimiter if it is not set. The default delimiter of TEXT is a tab and that of CSV is a comma (,). No delimiter is used in FIXED format.

      +
      • A delimiter cannot be \r or \n.
      • A delimiter cannot be the same as the null value. The delimiter of CSV cannot be same as the quote value.
      • The delimiter for the TEXT format data cannot contain any of the following characters: \.abcdefghijklmnopqrstuvwxyz0123456789.
      • The data length of a single row should be less than 1 GB. If the delimiters are too long and there are too many rows, the length of valid data will be affected.
      • You are advised to use a multi-character, such as the combination of the dollar sign ($), caret (^), the ampersand (&), or invisible characters, such as 0x07, 0x08, and 0x1b as the delimiter.
      • For a multi-character delimiter, do not use the same characters, for example, ---.
      +
      +

      Valid value:

      +

      The value of delimiter can be a multi-character delimiter whose length is less than or equal to 10 bytes.

      +
    • quote

      Specifies which characters in a CSV source data file will be identified as quotation marks. The default value is a double quotation mark (").

      +
      • The quote parameter cannot be the same as the delimiter or null parameter.
      • The quote parameter must be a single-byte character.
      • Invisible characters are recommended as quote values, such as 0x07, 0x08, and 0x1b.
      +
      +
    • escape

      Specifies which characters in a CSV source data file are escape characters. Escape characters can only be single-byte characters.

      +

      Default value: the same as the value of QUOTE

      +
    • null
      Specifies the string that represents a null value.
      • The null value cannot be \r or \n. The maximum length is 100 characters.
      • The null value cannot be the same as the delimiter or quote parameter.
      +
      +
      +

      Valid value:

      +
      • The default value is \n for the TEXT format.
      • The default value for the CSV format is an empty string without quotation marks.
      +
    • noescaping

      Specifies in TEXT format, whether to escape the backslash (\) and its following characters.

      +

      noescaping is available only for the TEXT format.

      +
      +

      Value range: true, on, false, and off. The default value is false or off.

      +
    • encoding

      Specifies the encoding of a data file, that is, the encoding used to parse, check, and generate a data file. Its default value is the default client_encoding value of the current database.

      +

      Before you import foreign tables, it is recommended that you set client_encoding to the file encoding format, or a format matching the character set of the file. Otherwise, unnecessary parsing and check errors may occur, leading to import errors, rollback, or even invalid data import. Before you import foreign tables, you are also advised to specify this parameter, because the export result using the default character set may not be what you expected.

      +

      If this parameter is not specified when you create a foreign table, a warning message will be displayed on the client.

      +

      Currently, GDS cannot parse or write in a file using multiple encoding formats during foreign table import or export.

      +
      +
    • fill_missing_fields

      Specifies whether to generate an error message when the last column in a row in the source file is lost during data import.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the last column of a data row in a data source file is lost, the column will be replaced with NULL and no error message will be generated.
      • If this parameter is set to false or off and the last column is missing, the following error information will be displayed:
        missing data for column "tt"
        +
      +
    • ignore_extra_data

      Specifies whether to ignore excessive columns when the number of data source files exceeds the number of foreign table columns. This parameter is available during data import.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the number of data source files exceeds the number of foreign table columns, excessive columns will be ignored.
      • If this parameter is set to false or off and the number of data source files exceeds the number of foreign table columns, the following error information will be displayed:
        extra data after last expected column
        +
      +

      If the newline character at the end of the row is lost, setting the parameter to true will ignore data in the next row.

      +
      +
    • reject_limit

      Specifies the maximum number of data format errors allowed during a data import task. If the number of errors does not reach the maximum number, the data import task can still be executed.

      +

      You are advised to replace this syntax with PER NODE REJECT LIMIT 'value'.

      +

      Examples of data format errors include the following: a column is lost, an extra column exists, a data type is incorrect, and encoding is incorrect. Once a non-data format error occurs, the whole data import process is stopped.

      +
      +

      Value range: a positive integer or unlimited

      +

      The default value is 0, indicating that error information is returned immediately.

      +

      Enclose positive integer values with single quotation marks ('').

      +
      +
    • mode

      Specifies the data import policy during a specific data import process. GaussDB(DWS) supports only the Normal mode.

      +

      Valid value:

      +
      • Normal (default): supports all file types (CSV, TEXT, FIXED). Enabling Gauss data service to help data import.
      +
    • eol

      Specifies the newline character style of the imported or exported data file.

      +

      Value range: multi-character newline characters within 10 bytes. Common newline characters include \r (0x0D), \n (0x0A), and \r\n (0x0D0A). Special newline characters include $ and #.

      +
      • The eol parameter supports only the TEXT format for data import and export and does not support the CSV or FIXED format for data import. For forward compatibility, the eol parameter can be set to 0x0D or 0x0D0A for data export in the CSV and FIXED formats.
      • The value of the eol parameter cannot be the same as that of DELIMITER or NULL.
      • The eol parameter value cannot contain lowercase letters, digits, or dot (.).
      +
      +
    • conflict_delimiter

      This parameter is generally used with the compatible_illegal_chars parameter. If a data file contains a truncated Chinese character, the truncated character and a delimiter will be encoded into another Chinese character due to inconsistent encoding between the foreign table and the database. As a result, the delimiter is masked and an error will be reported, indicating that there are missing fields.

      +

      This parameter is used to avoid encoding a truncated character and a delimiter into another character.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If the parameter is set to true or on, encoding a truncated character and a delimiter into another character is allowed.
      • If the parameter is set to false or off, encoding a truncated character and a delimiter into another character is not allowed.
      +

      This parameter is disabled by default. It is recommended that you disable this parameter, because encoding a truncated character and a delimiter into another character is rarely required. If the parameter is enabled, the scenario may be incorrectly identified and thereby causing incorrect information imported to the table.

      +
      +
    • file_type

      Specifies the type of the file to be imported or exported.

      +

      Value options: normal, pipe. normal is the default value.

      +
      • If this parameter is set to normal, the file to be imported or exported is a common file.
      • If this parameter is set to pipe, the file to be imported or exported is a named pipe.
      +
    • auto_create_pipe

      This parameter specifies whether the GDS process automatically creates a named pipe.

      +

      Value options: true, on, false, and off. The default value is true/on.

      +
      • If this parameter is set to true or on, the GDS process is allowed to automatically create a named pipe.
      • If this parameter is set to false or off, you need to manually create a named pipe.
      +
      • When setting auto_create_pipe, set file_type to pipe. Otherwise, the foreign table cannot be created.
      • If auto_create_pipe is set to false and no pipe is specified during data import and export, the database name_schema name_foreign table name.pipe file will be opened. If a pipe has been specified, the specified pipe in the location will be opened. If the named pipe is not written by other programs or is not opened in write mode within the period specified by the pipe-timeout parameter, an error message is displayed indicating that the import or export task times out. If the file is not a pipe, an error is reported when the import or export task is executed.
      • If auto_create_pipe is set to true and no pipe file is specified during data import and export, the database name_schema name_foreign table name.pipe file will be opened. If the file is a common file, an error is reported when the file is imported or exported. If the file is a pipe, the system automatically deletes the file and re-creates the named pipe.
      • You can use the location parameter to specify the pipe when exporting data, for example, location'gsfs://127.0.0.1:7789/aa.pipe. When auto_create_pipe is set to true, GDS automatically creates the aa.pipe file in the data directory.
      +
      +
    • fix

      Specifies the length of fixed format data. The unit is byte. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: Less than 1 GB, and greater than or equal to the total length specified by POSITION (The total length is the sum of offset and length in the last column of the table definition.)

      +
    • out_fix_alignment

      Specifies how the columns of the types BYTEAOID, CHAROID, NAMEOID, TEXTOID, BPCHAROID, VARCHAROID, NVARCHAR2OID, and CSTRINGOID are aligned during fixed-length export.

      +

      Value range: align_left, align_right

      +

      Default value: align_right

      +

      The bytea data type must be in hexadecimal format (for example, \XXXX) or octal format (for example, \XXX\XXX\XXX). The data to be imported must be left-aligned (that is, the column data starts with either of the two formats instead of spaces). Therefore, if the exported file needs to be imported using a GDS foreign table and the file data length is less than that specified by the foreign table formatter, the exported file must be left aligned. Otherwise, an error is reported during the import.

      +
      +
    • date_format

      Imports data of the DATE type. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid DATE value. For details, see Date and Time Processing Functions and Operators.

      +

      If ORACLE is specified as the compatible database, the DATE format is TIMESTAMP. For details, see timestamp_format below.

      +
      +
    • time_format

      Imports data of the TIME type. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid TIME value. Time zones cannot be used. For details, see Date and Time Processing Functions and Operators.

      +
    • timestamp_format

      Imports data of the TIMESTAMP type. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid TIMESTAMP value. Time zones are not supported. For details, see Date and Time Processing Functions and Operators.

      +
    • smalldatetime_format

      Imports data of the SMALLDATETIME type. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid SMALLDATETIME value. For details, see Date and Time Processing Functions and Operators.

      +
    • compatible_illegal_chars

      Enables or disables fault tolerance on invalid characters during data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on, invalid characters are tolerated and imported to the database after conversion.
      • If this parameter is set to false or off and an error occurs when there are invalid characters, the import will be interrupted.
      +

      The rule of error tolerance when you import invalid characters is as follows:

      +

      (1) \0 is converted to a space.

      +

      (2) Other invalid characters are converted to question marks.

      +

      (3) If compatible_illegal_chars is set to true or on, invalid characters are tolerated. If NULL, DELIMITER, QUOTE, and ESCAPE are set to a spaces or question marks. Errors like "illegal chars conversion may confuse COPY escape 0x20" will be displayed to prompt user to modify parameter values that cause confusion, preventing import errors.

      +
      +
    +
  • READ ONLY

    Specifies whether a foreign table is read-only. This parameter is available only for data import.

    +
  • WRITE ONLY

    Specifies whether a foreign table is write-only. This parameter is available only for data import.

    +
  • WITH error_table_name

    Specifies the table where data format errors generated during parallel data import are recorded. You can query the error information table after data is imported to obtain error details. This parameter is available only after reject_limit is set.

    +

    To be compatible with PostgreSQL open source interfaces, you are advised to replace this syntax with LOG INTO.

    +
    +

    Value range: a string. It must comply with the naming convention.

    +
  • LOG INTO error_table_name

    Specifies the table where data format errors generated during parallel data import are recorded. You can query the error information table after data is imported to obtain error details.

    +

    This parameter is available only after PER NODE REJECT LIMIT is set.

    +
    +

    Value range: a string. It must comply with the naming convention.

    +
  • file_sequence

    Concurrently imports data in parallel through GDS foreign tables, to improve single-file import performance. This parameter is only used for data import.

    +

    The parameter format is file_sequence'total number of shards-current shard'. Example:

    +

    file_sequence '3-1' indicates that the imported file is logically split into three shards and the data currently imported by the foreign table is the data on the first shard.

    +

    file_sequence '3-2' indicates that the imported file is logically split into three shards and the data currently imported by the foreign table is the data on the second shard.

    +

    file_sequence '3-3' indicates that the imported file is logically split into three shards and the data currently imported by the foreign table is the data on the third shard.

    +

    This parameter has the following constraints:

    +
    • A file can be split to a maximum of 8 shards.
    • The number of currently imported shard should be less than or equal to the total number of split shards.
    • Only CSV and TXT files can be imported.
    +

    When data is imported in parallel in CSV format, some shards fail to be imported in the following scenario because the CSV rules conflict with the GDS splitting logic:

    +

    Scenario: A CSV file contains a newline character that is not escaped, the newline character is contained in the character specified by quote, and the data of this line is in the first row of the logical shard.

    +

    For example, if you import the big.csv file in parallel, the following information is displayed:

    +
    --id, username, address
    +10001,"customer1 name","Rose District"
    +10002,"customer2 name","
    +23 Road Rose 
    +District NewCity"
    +10003,"customer3 name","NewCity"
    +

    After the file is split into two shards, the content of the first shard is as follows:

    +
    10001,"customer1 name","Rose District"
    +10002,"customer2 name","
    +23
    +

    The content of the second shard is as follows:

    +
    Road Rose 
    +District NewCity"
    +10003,"customer3 name","NewCity"
    +

    The newline character after 23 Road Rose in the first line of the second shard is contained between double quotation marks. As a result, GDS cannot determine whether the newline character is a newline character in the field or a separator in the line. Therefore, two data records on the first shard are successfully imported, but the second shard fails to be imported.

    +
    +
  • REMOTE LOG 'name'

    The data format error information is saved as files in GDS. name is the prefix of the error data file.

    +
  • PER NODE REJECT LIMIT 'value'

    This parameter specifies the allowed number of data format errors on each DN during data import. If the number of errors exceeds the specified value on any DN, data import fails, an error is reported, and the system exits data import.

    +

    This syntax specifies the error tolerance of a single node.

    +

    Examples of data format errors include the following: a column is lost, an extra column exists, a data type is incorrect, and encoding is incorrect. When a non-data format error occurs, the whole data import process stops.

    +
    +

    Value range: integer, unlimited. The default value is 0, indicating that error information is returned immediately.

    +
  • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

    Currently, TO GROUP cannot be used. TO NODE is used for internal scale-out tools.

    +
+
+

Examples

Create a foreign tablecustomer_ft to import data from GDS server 10.10.123.234 in TEXT format.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
CREATE FOREIGN TABLE customer_ft
+(
+    c_customer_sk             integer               ,
+    c_customer_id             char(16)              ,
+    c_current_cdemo_sk        integer               ,
+    c_current_hdemo_sk        integer               ,
+    c_current_addr_sk         integer               ,
+    c_first_shipto_date_sk    integer               ,
+    c_first_sales_date_sk     integer               ,
+    c_salutation              char(10)              ,
+    c_first_name              char(20)              ,
+    c_last_name               char(30)              ,
+    c_preferred_cust_flag     char(1)               ,
+    c_birth_day               integer               ,
+    c_birth_month             integer               ,
+    c_birth_year              integer                       ,
+    c_birth_country           varchar(20)                   ,
+    c_login                   char(13)                      ,
+    c_email_address           char(50)                      ,
+    c_last_review_date        char(10)
+)
+    SERVER gsmpp_server
+    OPTIONS
+(
+    location 'gsfs://10.10.123.234:5000/customer1*.dat',
+    FORMAT 'TEXT' ,
+    DELIMITER '|',
+    encoding 'utf8',
+    mode 'Normal')
+READ ONLY;
+
+ +
+

Create a foreign table to import data from GDS servers 192.168.0.90 and 192.168.0.91 in TEXT format. Record errors that occur during data import in foreign_HR_staffS_ft. A maximum of two data format errors are allowed during the data import.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
CREATE FOREIGN TABLE foreign_HR_staffS_ft
+(
+  staff_ID       NUMBER(6) ,
+  FIRST_NAME     VARCHAR2(20),
+  LAST_NAME      VARCHAR2(25),
+  EMAIL          VARCHAR2(25),
+  PHONE_NUMBER   VARCHAR2(20),
+  HIRE_DATE      DATE,
+  employment_ID  VARCHAR2(10),
+  SALARY         NUMBER(8,2),
+  COMMISSION_PCT NUMBER(2,2),
+  MANAGER_ID     NUMBER(6),
+  section_ID  NUMBER(4)
+) SERVER gsmpp_server OPTIONS (location 'gsfs://192.168.0.90:5000/* | gsfs://192.168.0.91:5000/*', format 'TEXT', delimiter E'\x08',  null '',reject_limit '2') WITH err_HR_staffS_ft;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0160.html b/docs/dws/dev/dws_06_0160.html new file mode 100644 index 00000000..f214cecd --- /dev/null +++ b/docs/dws/dev/dws_06_0160.html @@ -0,0 +1,281 @@ + + +

CREATE FOREIGN TABLE (for OBS Import and Export)

+

Function

CREATE FOREIGN TABLE creates a foreign table in the current database for parallel data import and export of OBS data. The server used is gsmpp_server, which is created by the database by default.

+

The hybrid data warehouse (standalone) does not support OBS foreign table import and export.

+
+
+

Precautions

  • Only the data in text and CSV formats is supported, and the OBS connection should be configured. ORC and CarbonData data on OBS is not applicable. For details, see CREATE FOREIGN TABLE (SQL on OBS or Hadoop).
  • An OBS foreign table can be set to READ ONLY or WRITE ONLY. The default value is READ ONLY. To import data to the cluster, use READ ONLY for the foreign table. To export data, use WRITE ONLY.
  • The foreign table is owned by the user who runs the command.
  • The distribution mode of an OBS foreign table does not need to be explicitly specified. The default mode is ROUNDROBIN.
  • Only constraints in Informational Constraint take effect for an OBS foreign table.
  • Ensure no Chinese characters are contained in paths used for importing data to or exporting data from OBS.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Read and write formats supported by OBS foreign tables

Data Type

+

User-built Server

+

gsmpp_server

+

-

+

READ ONLY

+

WRITE ONLY

+

READ ONLY

+

WRITE ONLY

+

ORC

+

+

+

×

+

×

+

CARBONDATA

+

+

×

+

×

+

×

+

TEXT

+

+

×

+

+

+

CSV

+

+

×

+

+

+

JSON

+

+

×

+

×

+

×

+
+
+
+

Syntax

CREATE FOREIGN TABLE [ IF NOT EXISTS  ] table_name 
+( { column_name type_name [column_constraint ]
+    | LIKE source_table | table_constraint [, ...]} [, ...] ) 
+SERVER gsmpp_server 
+OPTIONS (  { option_name ' value '  }  [, ...] ) 
+[  { WRITE ONLY  |  READ ONLY  }] 
+[ WITH error_table_name | LOG INTO error_table_name] 
+[PER NODE REJECT LIMIT 'value']  ;
+
+
  • column_constraint is as follows:
    [CONSTRAINT constraint_name]
    +{PRIMARY KEY | UNIQUE}
    +[NOT ENFORCED [ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION] | ENFORCED]
    +
  • table_constraint is as follows:
    [CONSTRAINT constraint_name]
    +{PRIMARY KEY | UNIQUE} (column_name)
    +[NOT ENFORCED [ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION] | ENFORCED]
    +
+

Parameter Overview

CREATE FOREIGN TABLE provides multiple parameters, which are classified as follows: +
+
+

Parameter Description

  • IF NOT EXISTS

    Does not throw an error if a table with the same name exists. A notice is issued in this case.

    +
  • table_name

    Specifies the name of the foreign table to be created.

    +

    Value range: a string compliant with the naming convention.

    +
  • column_name

    Specifies the name of a column in the foreign table.

    +

    Value range: a string compliant with the naming convention.

    +
  • type_name

    Specifies the data type of the column.

    +
  • SERVER gsmpp_server

    Specifies the server name of the foreign table. In the OBS foreign table, its server gsmpp_server is created by the initial database.

    +
  • OPTIONS ( { option_name ' value ' } [, ...] )

    Specifies parameters of foreign table data.

    +
    • encrypt

      Specifies whether HTTPS is enabled for data transfer. on enables HTTPS and off disables it (in this case, HTTP is used). The default value is off.

      +
    • access_key

      Indicates the access key (AK, obtained from the user information on the console) used for the OBS access protocol. When you create a foreign table, its AK value is encrypted and saved to the metadata table of the database.

      +
    • secret_access_key:

      Indicates the secret access key (SK, obtained from the user information on the console) used for the OBS access protocol. When you create a foreign table, its SK value is encrypted and saved to the metadata table of the database.

      +
    • chunksize

      Specifies the cache read by each OBS thread on a DN. Its value range is 8 to 512 in the unit of MB. Its default value is 64.

      +
    • location

      Specifies the data source location of a foreign table. Currently, only URLs are allowed. Multiple URLs are separated using vertical bars (|).

      +
      • The URL of a read-only foreign table (the default permission is read-only) can end with the path prefix or the full path of the target object in the format of obs://Bucket/Prefix. Prefix indicates the prefix of an object path, for example, obs://mybucket/tpch/nation/.
      • If the region parameter is explicitly specified in obs://Bucket/Prefix, the value of region will be read. If the region parameter is not specified, the value of defaultRegion will be read.
      • The URL of a writable foreign table does not need to contain a file name. You can specify only one data source location for a foreign table. The directory corresponding to the location must be created before you specify the location.
      • URLs specified for a read-only foreign table must be different.
      • Specify location when inserting data to a foreign table.
      • The location parameter supports prefixes gsobs and obs, which are identified as OBS information. location should be followed by gsobs, OBS URL, and Bucket, or by obs and Bucket.
      +
      +

      When importing and exporting data, you are advised to use the location parameter as follows:

      +
      • You are advised to specify a file name for location during data import. If you only specify an OBS bucket or directory, all text files in it will be imported. An error message will be reported if the data format is incorrect. If you set fault tolerance, a large amount of data may be imported to the fault-tolerant table.
      • Multiple files in an OBS bucket can be imported at the same time. The matched files are imported based on the file name prefix.
        For example, you can identify and import the following two files after specifying the prefix mybucket/input_data/product_info in location:
        mybucket/input_data/product_info.0
        +mybucket/input_data/product_info.1
        +
        +
      • If you specify a file name, for example, 1.csv, then other files (like 1.csv1 or 1.csv22) starting with 1.csv in the bucket or directory where 1.csv resides will be automatically imported. That is, files, such as 1.csv1 and 1.csv22, are automatically imported.
      • To specify multiple URLs in OBS mode, separate URLs by using vertical bars (|). In gsobs mode, only one URL can be specified.
      • During data export, a directory is generated for location by default. If you specify only a file name, the system automatically creates a directory whose name starts with the file name and then generates the file that stores the exported data. The file name is automatically generated by GaussDB(DWS).
      • You can specify one path for location only during data export.
      +
    • region

      (Optional) Specifies the value of regionCode, which indicates the region information on the cloud.

      +

      If the region parameter is explicitly specified, the value of region will be read. If the region parameter is not specified, the value of defaultRegion will be read.

      +

      Note the following when setting parameters for importing or exporting OBS foreign tables in TEXT or CSV format:

      +
      • The location parameter is mandatory. The prefixes gsobs and obs indicate file locations on OBS. The gsobs prefix should be followed by obs url, bucket, and prefix. The obs prefix should be followed by bucket or prefix.
      • The data sources of multiple buckets are separated by vertical bars (|), for example, LOCATION 'obs://bucket1/folder/ | obs://bucket2/'. The database scans all objects in the specified folders.
      +
      +
    • format

      Specifies the format of the source data file in a foreign table.

      +

      Valid value: CSV and TEXT. The default value is TEXT. GaussDB(DWS) only supports CSV and TEXT formats.

      +
      • CSV (comma-separated format):
        • The CSV file can process linefeeds efficiently, but cannot process certain special characters very well.
        • A CSV file is composed of records that are separated as columns by delimiters. Each record shares the same column sequence.
        +
      • TEXT (text format):
        • Records are separated as columns by linefeed. The TEXT file can process special characters efficiently, but cannot process linefeeds well.
        +
      +
    • header

      Specifies whether a file contains a header with the names of each column in the file.

      +

      When OBS exports data, this parameter cannot be set to true. Use the default value false, indicating that the first row of the exported data file is not the header.

      +

      When data is imported, if header is on, the first row of the data file will be identified as the header and ignored. If header is off, the first row will be identified as a data row.

      +

      Valid value: true, on, false, and off. The default value is false or off.

      +
    • delimiter

      Specifies the column delimiter of data. Use the default delimiter if it is not set. The default delimiter of TEXT is a tab and that of CSV is a comma (,).

      +
      • The delimiter of TEXT cannot be \r or \n.
      • A delimiter cannot be the same as the null value. The delimiter for the CSV format cannot be same as the quote value.
      • The delimiter for the TEXT format data cannot contain backslash (\), lowercase letters, digits, or dot (.).
      • The data length of a single row should be less than 1 GB. A row that has many columns using long delimiters cannot contain much valid data.
      • You are advised to use a multi-character string, such as the combination of the dollar sign ($), caret (^), and ampersand (&), or invisible characters, such as 0x07, 0x08, and 0x1b as the delimiter.
      +
      +

      Value range:

      +

      The value of delimiter can be a multi-character delimiter whose length is less than or equal to 10 bytes.

      +
    • quote

      Specifies the quotation mark for the CSV format. The default value is a double quotation mark (").

      +
      • The quote value cannot be the same as the delimiter or null value.
      • The quote value must be a single-byte character.
      • Invisible characters are recommended as quote values, such as 0x07, 0x08, and 0x1b.
      +
      +
    • escape

      Specifies an escape character for a CSV file. The value must be a single-byte character.

      +

      The default value is a double quotation mark ("). If the value is the same as the quote value, it will be replaced with \0.

      +
    • null
      Specifies the string that represents a null value.
      • The null value cannot be \r or \n. The maximum length is 100 characters.
      • The null value cannot be the same as the delimiter or quote value.
      +
      +
      +

      Value range:

      +
      • The default value is \N for the TEXT format.
      • The default value for the CSV format is an empty string without quotation marks.
      +
    • noescaping

      Specifies whether to escape the backslash (\) and its following characters in the TEXT format.

      +

      noescaping is available only for the TEXT format.

      +
      +

      Valid value: true, on, false, and off. The default value is false or off.

      +
    • encoding

      Specifies the encoding of a data file, that is, the encoding used to parse, check, and generate a data file. Its default value is the default client_encoding value of the current database.

      +

      Before you import foreign tables, it is recommended that you set client_encoding to the file encoding format, or a format matching the character set of the file. Otherwise, unnecessary parsing and check errors may occur, leading to import errors, rollback, or even invalid data import. Before exporting foreign tables, you are also advised to specify this parameter, because the export result using the default character set may not be what you expect.

      +

      If this parameter is not specified when you create a foreign table, a warning message will be displayed on the client.

      +

      Currently, OBS cannot parse a file using multiple character sets during foreign table import.

      +

      Currently, OBS cannot write a file using multiple character sets during foreign table export.

      +
      +
    • fill_missing_fields

      Specifies how to handle the problem that the last column of a row in the source file is lost during data import.

      +

      Valid value: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the last column of a data row in a source data file is lost, the column will be replaced with null and no error message will be generated.
      • If this parameter is set to false or off and the last column of a data row in a source data file is lost, the following error information will be displayed:
        missing data for column "tt"
        +
      +
    • ignore_extra_data

      Specifies whether to ignore excessive columns when the number of columns in a source data file exceeds that defined in the foreign table. This parameter is available only for data import.

      +

      Valid value: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the number of source data files exceeds the number of foreign table columns, excessive columns will be ignored.
      • If this parameter is set to false or off and the number of source data files exceeds the number of foreign table columns, the following error information will be displayed:
        extra data after last expected column
        +
      +

      If the linefeed at the end of a row is lost and this parameter is set to true, data in the next row will be ignored.

      +
      +
    • reject_limit

      Specifies the maximum number of data format errors allowed during a data import task. If the number of errors does not reach the maximum number, the data import task can still be executed.

      +

      You are advised to replace this syntax with PER NODE REJECT LIMIT 'value'.

      +

      Examples of data format errors include the following: a column is lost, an extra column exists, a data type is incorrect, and encoding is incorrect. When a non-data format error occurs, the whole data import process is stopped.

      +
      +

      Value range: an integer and unlimited.

      +

      The default value is 0, indicating that error information is returned immediately.

      +
    • eol

      Specifies the newline character style of the imported or exported data file.

      +

      Value range: multi-character newline characters within 10 bytes. Common newline characters include \r (0x0D), \n (0x0A), and \r\n (0x0D0A). Special newline characters include $ and #.

      +
      • The eol parameter supports only the TEXT format for data import.
      • The value of the eol parameter cannot be the same as that of delimiter or null.
      • The value of the eol parameter cannot contain digits, letters, or periods (.).
      +
      +
    • date_format

      Specifies the DATE format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: a valid DATE value. For details, see Date and Time Processing Functions and Operators.

      +

      If Oracle is specified as the compatible database, the DATE format is TIMESTAMP. For details, see timestamp_format below.

      +
      +
    • time_format

      Specifies the TIME format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid TIME value. Time zones cannot be used.

      +
    • timestamp_format

      Specifies the TIMESTAMP format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid TIMESTAMP value. Time zones cannot be used.

      +
    • smalldatetime_format

      Specifies the SMALLDATETIME format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: a valid SMALLDATETIME value.

      +
    • compatible_illegal_chars

      Specifies whether to enable fault tolerance on invalid characters during data import. This syntax is available only for READ ONLY foreign tables.

      +

      Valid value: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on, invalid characters are tolerated and imported to the database after conversion.
      • If this parameter is set to false or off and an error occurs when there are invalid characters, the import will be interrupted.
      +

      On a Windows platform, if OBS reads data files using the TEXT format, 0x1A will be treated as an EOF symbol and a parsing error will occur. It is the implementation constraint of the Windows platform. Since OBS on a Windows platform does not support BINARY read, the data can be read by OBS on a Linux platform.

      +
      +

      The rule of error tolerance for invalid characters imported is as follows:

      +

      (1) \0 is converted to a space.

      +

      (2) Other invalid characters are converted to question marks.

      +

      (3) If compatible_illegal_chars is set to true or on, invalid characters are tolerated. If null, delimiter, quote, and escape are set to a spaces or question marks, errors like "illegal chars conversion may confuse COPY escape 0x20" will be displayed to prompt users to change parameter values that cause confusion, preventing import errors.

      +
      +
    +
  • READ ONLY

    Specifies whether a foreign table is read-only. This parameter is available only for data import.

    +
  • WRITE ONLY

    Specifies whether a foreign table is write-only. This parameter is available only for data import.

    +
  • WITH error_table_name

    Specifies the table where data format errors generated during parallel data import are recorded. You can query the error information table after data is imported to obtain error details. This parameter is available only after reject_limit is set.

    +

    To be compatible with postgres open source interfaces, you are advised to replace this syntax with LOG INTO. When this parameter is specified, an error table is automatically created.

    +
    +

    Value range: a string compliant with the naming convention.

    +
  • LOG INTO error_table_name

    Specifies the table where data format errors generated during parallel data import are recorded. You can query the error information table after data is imported to obtain error details.

    +
    • This parameter is available only after PER NODE REJECT LIMIT is set.
    • When this parameter is specified, an error table is automatically created.
    +
    +

    Value range: a string compliant with the naming convention.

    +
  • PER NODE REJECT LIMIT 'value'

    Specifies the maximum number of data format errors on each DN during data import. If the number of errors exceeds the specified value on any DN, data import fails, an error is reported, and the system exits data import.

    +

    This syntax specifies the error tolerance of a single node.

    +

    Examples of data format errors include the following: a column is lost, an extra column exists, a data type is incorrect, and encoding is incorrect. When a non-data format error occurs, the whole data scanning process is stopped.

    +
    +

    Valid value: an integer and unlimited. The default value is 0, indicating that error information is returned immediately.

    +
  • NOT ENFORCED

    Specifies the constraint to be an informational constraint. This constraint is guaranteed by the user instead of the database.

    +
  • ENFORCED

    The default value is ENFORCED. ENFORCED is a reserved parameter and is currently not supported.

    +
  • PRIMARY KEY (column_name)

    Specifies the informational constraint on column_name.

    +

    Value range: a string. It must comply with the naming convention, and the value of column_name must exist.

    +
  • ENABLE QUERY OPTIMIZATION

    Optimizes the query plan using an informational constraint.

    +
  • DISABLE QUERY OPTIMIZATION

    Disables the optimization of the query plan using an informational constraint.

    +
+
+

Examples

Create a foreign table to import data in the .txt format from OBS to the OBS_ft table.
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
DROP FOREIGN TABLE IF EXISTS OBS_ft;
+NOTICE:  foreign table "obs_ft" does not exist, skipping
+DROP FOREIGN TABLE
+
+CREATE FOREIGN TABLE OBS_ft( a int, b int)SERVER gsmpp_server OPTIONS (location 'obs://gaussdbcheck/obs_ddl/test_case_data/txt_obs_informatonal_test001',format 'text',encoding 'utf8',chunksize '32', encrypt 'on',ACCESS_KEY 'access_key_value_to_be_replaced',SECRET_ACCESS_KEY 'secret_access_key_value_to_be_replaced',delimiter E'\x08') read only;
+CREATE FOREIGN TABLE
+
+DROP TABLE row_tbl;
+DROP TABLE
+
+CREATE TABLE row_tbl( a int, b int);
+NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default.
+HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
+CREATE TABLE
+
+INSERT INTO row_tbl SELECT * FROM OBS_ft;
+INSERT 0 3
+
+ +
+
+

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0161.html b/docs/dws/dev/dws_06_0161.html new file mode 100644 index 00000000..af6ecced --- /dev/null +++ b/docs/dws/dev/dws_06_0161.html @@ -0,0 +1,1220 @@ + + +

CREATE FOREIGN TABLE (SQL on OBS or Hadoop)

+

Function

CREATE FOREIGN TABLE creates an HDFS or OBS foreign table in the current database to access or export structured data stored on HDFS or OBS. You can also export data in ORC format to HDFS or OBS.

+

The hybrid data warehouse (standalone) does not support OBS and HDFS foreign table import and export.

+
+
+

Precautions

  • HDFS foreign tables and OBS foreign tables are classified into read-only and write-only foreign tables. Read-only foreign tables are used for query, and write-only foreign tables can be used to export data from GaussDB(DWS) to a distributed file system.
  • In this mode, you can import and query data in ORC, CarbonData, Text, or CSV format and export data in ORC format.
  • In this mode, you need to manually create a foreign server. For details, see CREATE SERVER.
  • If the foreign data wrapper is set to HDFS_FDW or DFS_FDW when you manually create a server, you need to specify the distribution mode in the DISTRIBUTE BY clause when creating a read-only foreign table.
+
+

Syntax

Create an HDFS foreign table.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name 
+( [ { column_name type_name 
+    [ { [CONSTRAINT constraint_name] NULL |
+    [CONSTRAINT constraint_name] NOT NULL |
+      column_constraint [...]} ] |
+      table_constraint [, ...]} [, ...] ] ) 
+    SERVER server_name 
+    OPTIONS ( { option_name ' value ' } [, ...] ) 
+    [ {WRITE ONLY | READ ONLY}]
+    DISTRIBUTE BY {ROUNDROBIN | REPLICATION}
+   
+    [ PARTITION BY ( column_name ) [ AUTOMAPPED ] ] ;
+
+ +
+
  • column_constraint is as follows:
    1
    +2
    +3
    [CONSTRAINT constraint_name]
    +{PRIMARY KEY | UNIQUE}
    +[NOT ENFORCED [ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION] | ENFORCED]
    +
    + +
    +
  • table_constraint is as follows:
    1
    +2
    +3
    [CONSTRAINT constraint_name]
    +{PRIMARY KEY | UNIQUE} (column_name)
    +[NOT ENFORCED [ENABLE QUERY OPTIMIZATION | DISABLE QUERY OPTIMIZATION] | ENFORCED]
    +
    + +
    +
+
+

Parameter Description

  • IF NOT EXISTS

    Does not throw an error if a table with the same name exists. A notice is issued in this case.

    +
  • table_name

    Specifies the name of the foreign table to be created.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Specifies the name of a column in the foreign table. Columns are separated by commas (,).

    +

    Value range: a string. It must comply with the naming convention.

    +
  • type_name

    Specifies the data type of the column.

    +

    Data types supported by ORC tables.

    +

    The data types supported by TXT table are the same as those in row-store tables.

    +
  • constraint_name

    Specifies the name of a constraint for the foreign table.

    +
  • { NULL | NOT NULL }

    Specifies whether the column allows NULL.

    +

    When you create a table, whether the data in HDFS is NULL or NOT NULL cannot be guaranteed. The consistency of data is guaranteed by users. Users must decide whether the column is NULL or NOT NULL. (The optimizer optimizes the NULL/NOT NULL and generates a better plan.)

    +
  • SERVER server_name

    Specifies the server name of the foreign table. Users can customize its name.

    +

    Value range: a string indicating an existing server. It must comply with the naming convention.

    +
  • OPTIONS ( { option_name ' value ' } [, ...] )
    Specifies the following parameters for a foreign table:
    • header

      Specifies whether a data file contains a table header. header is available only for CSV files.

      +

      If header is on, the first row of the data file will be identified as the header and ignored during export. If header is off, the first row will be identified as a data row.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
    • quote

      Specifies the quotation mark for the CSV format. The default value is a double quotation mark (").

      +

      The quote value cannot be the same as the delimiter or null value.

      +

      The quote value must be a single-byte character.

      +

      Invisible characters are recommended as quote values, such as 0x07, 0x08, and 0x1b.

      +
      +
    • escape

      Specifies an escape character for a CSV file. The value must be a single-byte character.

      +

      The default value is a double quotation mark ("). If the value is the same as the quote value, it will be replaced with \0.

      +
    • location

      Specifies the file path on OBS. This is an OBS foreign table parameter. The data sources of multiple buckets are separated by vertical bars (|), for example, LOCATION 'obs://bucket1/folder/ | obs://bucket2/'. The database scans all objects in the specified folders.

      +

      When accessing a DLI multi-version table, you do not need to specify the location parameter.

      +
    • format: format of the data source file in the foreign table.
      • HDFS read-only foreign tables support ORC, TEXT, CSV, and Parquet file formats, while the write-only foreign tables support only the ORC file format.
      • OBS read-only foreign tables support ORC, TEXT, CSV, and CarbonData file formats, while the write-only foreign tables support only the ORC file format.
      +
    • foldername: The directory of the data source file in the foreign table, that is, the corresponding file directory in HDFS or on OBS. This parameter is mandatory for the write-only foreign table and optional for the read-only foreign table.

      When accessing a DLI multi-version table, you do not need to specify the foldername parameter.

      +
    • encoding: encoding of data source files in foreign tables. The default value is utf8. This parameter is optional.
    • totalrows: (Optional) estimated number of rows in a table. This parameter is used only for OBS foreign tables. Because OBS may store many files, it is slow to analyze data. This parameter allows you to set an estimated value so that the optimizer can estimate the table size according to the value. Generally, query efficiency is high when the estimated value is close to the actual value.
    • filenames: data source files specified in the foreign table. Multiple files are separated by commas (,).
      • You are advised to use the foldername parameter to specify the location of the data source. For a read-only foreign table, either filenames or foldername must be specified. For a write-only foreign table, only foldername can be specified.
      • If foldername is an absolute directory, it should be enclosed by slashes (/). Multiple paths are separated by commas (,).
      • When you query a partitioned table, data is pruned based on partition information, and data files that meet the requirement are queried. Pruning involves scanning HDFS directory contents many times. Therefore, do not use columns with low repetition as partition column.
      • An OBS read-only foreign table is not supported.
      +
      +
    • delimiter

      Specifies the column delimiter of data, and uses the default delimiter if it is not set. The default delimiter of TEXT is a tab.

      +
      • A delimiter cannot be \r or \n.
      • A delimiter cannot be the same as the null parameter.
      • A delimiter cannot contain the following characters: \.abcdefghijklmnopqrstuvwxyz0123456789
      • The data length of a single row should be less than 1 GB. A row that has many columns using long delimiters cannot contain much valid data.
      • You are advised to use a multi-character, such as the combination of the dollar sign ($), caret (^), ampersand (&), or invisible characters, such as 0x07, 0x08, and 0x1b as the delimiter.
      • delimiter is available only for TEXT and CSV source data files.
      +
      +

      Valid value:

      +

      The value of delimiter can be a multi-character delimiter whose length is less than or equal to 10 bytes.

      +
    • eol

      Specifies the newline character style of the imported data file.

      +

      Value range: multi-character newline characters within 10 bytes. Common newline characters include \r (0x0D), \n (0x0A), and \r\n (0x0D0A). Special newline characters include $ and #.

      +
      • The eol parameter applies only to TEXT files.
      • The value of the eol parameter cannot be the same as that of delimiter or null.
      • The value of the eol parameter cannot contain digits, letters, or periods (.).
      +
      +
    • null
      Specifies the string that represents a null value.
      • The null value cannot be \r or \n. The maximum length is 100 characters.
      • The null parameter cannot be the same as the delimiter.
      • null is available only for TEXT and CSV source data files.
      +
      +
      +

      Valid value:

      +

      The default value is \N for the TEXT format.

      +
    • noescaping

      Specifies whether to escape the backslash (\) and its following characters in .txt format.

      +

      noescaping is available only for TEXT source data files.

      +
      +

      Value range: true, on, false, and off. The default value is false or off.

      +
    • fill_missing_fields

      Specifies whether to generate an error message when the last column in a row in the source file is lost during data loading.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the last column of a data row in a data source file is lost, the column is replaced with NULL and no error message will be generated.
      • If this parameter is set to false or off and the last column is missing, the following error information will be displayed:
        missing data for column "tt"
        +
      +
      • Because SELECT COUNT(*) does not parse columns in .txt format, it does not report missing columns.
      • fill_missing_fields is available only for TXT and CSV source data files.
      +
      +
    • ignore_extra_data

      Specifies whether to ignore excessive columns when the number of data source files exceeds the number of foreign table columns. This parameter is available during data import.

      +

      Value range: true, on, false, and off. The default value is false or off.

      +
      • If this parameter is set to true or on and the number of data source files exceeds the number of foreign table columns, excessive columns will be ignored.
      • If this parameter is set to false or off and the number of data source files exceeds the number of foreign table columns, the following error information will be displayed:
        extra data after last expected column
        +
      +
      • If the newline character at the end of the row is lost, setting the parameter to true will ignore data in the next row.
      • Because SELECT COUNT(*) does not parse columns in .txt format, it does not report missing columns.
      • ignore_extra_data is available only for TXT and CSV source data files.
      +
      +
    • date_format

      Specifies the DATE format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid DATE value. For details, see Date and Time Processing Functions and Operators.

      +
      • If ORACLE is specified as the compatible database, the DATE format is TIMESTAMP. For details, see timestamp_format below.
      • date_format is available only for TEXT and CSV source data files.
      +
      +
    • time_format

      Specifies the TIME format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: a valid TIME value. Time zones cannot be used. For details, see Date and Time Processing Functions and Operators.

      +

      time_format is available only for TEXT and CSV source data files.

      +
      +
    • timestamp_format

      Specifies the TIMESTAMP format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: any valid TIMESTAMP value. Time zones are not supported. For details, see Date and Time Processing Functions and Operators.

      +

      timestamp_format is available only for TEXT and CSV source data files.

      +
      +
    • smalldatetime_format

      Specifies the SMALLDATETIME format for data import. This syntax is available only for READ ONLY foreign tables.

      +

      Value range: a valid SMALLDATETIME value. For details, see Date and Time Processing Functions and Operators.

      +

      smalldatetime_format is available only for TEXT and CSV source data files.

      +
      +
    • dataencoding

      This parameter specifies the data code of the data table to be exported when the database code is different from the data code of the data table. For example, the database code is Latin-1, but the data in the exported data table is in UTF-8 format. This parameter is optional. If this parameter is not specified, the database encoding format is used by default. This syntax is valid only for the write-only HDFS foreign table.

      +

      Value range: data code types supported by the database encoding

      +

      The dataencoding parameter is valid only for the ORC-formatted write-only HDFS foreign table.

      +
      +
    • filesize

      Specifies the file size of a write-only foreign table. This parameter is optional. If this parameter is not specified, the file size in the distributed file system configuration is used by default. This syntax is available only for the write-only foreign table.

      +

      Value range: an integer ranging from 1 to 1024

      +

      The filesize parameter is valid only for the ORC-formatted write-only HDFS foreign table.

      +
      +
    • compression

      Specifies the compression mode of ORC files. This parameter is optional. This syntax is available only for the write-only foreign table.

      +

      Value range: zlib, snappy, and lz4 The default value is snappy.

      +
    • version

      Specifies the ORC version number. This parameter is optional. This syntax is available only for the write-only foreign table.

      +

      Value range: Only 0.12 is supported. The default value is 0.12.

      +
    • dli_project_id

      Specifies the project ID corresponding to DLI. You can obtain the project ID from the management console. This parameter is available only when the server type is DLI. This feature is supported only in 8.1.1 or later.

      +
    • dli_database_name

      Specifies the name of the database where the DLI multi-version table to be accessed is located. This parameter is available only when the server type is DLI. This feature is supported only in 8.1.1 or later.

      +
    • dli_table_name

      Specifies the name of the DLI multi-version table to be accessed. This parameter is available only when the server type is DLI. This feature is supported only in 8.1.1 or later.

      +
    • checkencoding

      Specifies whether to check the character encoding.

      +
      Value range: low, high The default value is low.

      In TEXT format, the rule of error tolerance for invalid characters imported is as follows:

      +
      • \0 is converted to a space.
      • Other invalid characters are converted to question marks.
      • Setting checkencoding to low enables invalid characters toleration. If NULL and DELIMITER are set to spaces or question marks (?), errors like "illegal chars conversion may confuse null 0x20" will be displayed, prompting you to modify parameters that may cause confusion and preventing importing errors.
      +

      In ORC format, the rule of error tolerance for invalid characters imported is as follows:

      +
      • If checkencoding is low, an imported field containing invalid characters will be replaced with a quotation mark string of the same length.
      • If checkencoding is high, data import stops when an invalid character is detected.
      +
      +
      +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Support for TEXT, CSV, ORC, CarbonData, and Parquet formats

    Parameter

    +

    OBS

    +

    HDFS

    +

    -

    +

    +

    TEXT

    +

    CSV

    +

    ORC

    +

    CARBONDATA

    +

    TEXT

    +

    CSV

    +

    ORC

    +

    PARQUET

    +

    READ ONLY

    +

    READ ONLY

    +

    READ ONLY

    +

    WRITE ONLY

    +

    READ ONLY

    +

    READ ONLY

    +

    READ ONLY

    +

    READ ONLY

    +

    WRITE ONLY

    +

    READ ONLY

    +

    location

    +

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    format

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    header

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    delimiter

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    quote

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    escape

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    null

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    noescaping

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    encoding

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    fill_missing_fields

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ignore_extra_data

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    date_format

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    time_format

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    timestamp_format

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    smalldatetime_format

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    chunksize

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    filenames

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    +

    +

    +

    ×

    +

    +

    foldername

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    +

    dataencoding

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    filesize

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    compression

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    version

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    +

    ×

    +

    checkencoding

    +

    +

    +

    +

    ×

    +

    +

    +

    +

    +

    +

    +

    totalrows

    +

    +

    +

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +

    ×

    +
    +
    +
  • WRITE ONLY | READ ONLY

    WRITE ONLY creates a write-only HDFS/OBS foreign table.

    +

    READ ONLY creates a read-only HDFS/OBS foreign table.

    +

    If the foreign table type is not specified, a read-only foreign table is created by default.

    +
  • DISTRIBUTE BY ROUNDROBIN

    Specifies ROUNDROBIN as the distribution mode for the HDFS/OBS foreign table.

    +
  • DISTRIBUTE BY REPLICATION

    Specifies REPLICATION as the distribution mode for the HDFS/OBS foreign table.

    +
  • PARTITION BY ( column_name ) AUTOMAPPED

    column_name specifies the partition column. AUTOMAPPED means the partition column specified by the HDFS partitioned foreign table is automatically mapped with the partition directory information in HDFS. The prerequisite is that the sequences of partition columns specified in the HDFS foreign table and in the directory are the same. This function is applicable only to read-only foreign tables.

    +
    • HDFS read-only and write-only foreign tables support partitioned tables. However, write-only foreign tables support only primary partitions and do not support multi-level partitions.
    • Partitioned tables can be used as read-only foreign tables for OBS.
    +
    +
  • CONSTRAINT constraint_name

    Specifies the name of informational constraint of the foreign table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • PRIMARY KEY

    The primary key constraint specifies that one or more columns of a table must contain unique (non-duplicate) and non-null values. Only one primary key can be specified for a table.

    +
  • UNIQUE

    Specifies that a group of one or more columns of a table must contain unique values. For the purpose of a unique constraint, NULL is not considered equal.

    +
  • NOT ENFORCED

    Specifies the constraint to be an informational constraint. This constraint is guaranteed by the user instead of the database.

    +
  • ENFORCED

    The default value is ENFORCED. ENFORCED is a reserved parameter and is currently not supported.

    +
  • PRIMARY KEY (column_name)

    Specifies the informational constraint on column_name.

    +

    Value range: a string. It must comply with the naming convention, and the value of column_name must exist.

    +
  • ENABLE QUERY OPTIMIZATION

    Optimizes an execution plan using an informational constraint.

    +
  • DISABLE QUERY OPTIMIZATION

    Disables the optimization of an execution plan using an informational constraint.

    +
+
+

Informational Constraint

In GaussDB(DWS), the use of data constraints depend on users. If users can make data sources strictly comply with certain constraints, the query on data with such constraints can be accelerated. Foreign tables do not support Index. Informational constraint is used for optimizing query plans.

+

The constraints of creating informational constraints for a foreign table are as follows:

+
  • You can create an informational constraint only if the values in a NOT NULL column in your table are unique. Otherwise, the query result will be different from expected.
  • Currently, the informational constraint of GaussDB(DWS) supports only PRIMARY KEY and UNIQUE constraints.
  • The informational constraints of GaussDB(DWS) support the NOT ENFORCED attribute.
  • UNIQUE informational constraints can be created for multiple columns in a table, but only one PRIMARY KEY constraint can be created in a table.
  • Multiple informational constraints can be established in a column of a table (because the function that establishing a column or multiple constraints in a column is the same.) Therefore, you are not advised to set up multiple informational constraints in a column, and only one Primary Key type can be set up.
  • Multi-column combination constraints are not supported.
  • Different CNs in the same cluster cannot concurrently export data to the same write-only ORC foreign table.
  • The catalog of a write-only foreign table in ORC format can only be used as the export catalog of a single foreign table of GaussDB(DWS). It cannot be used for multiple foreign tables, and other components cannot write other files to this catalog.
+
+

Example 1

Example 1: In HDFS, import the TPC-H benchmark test tables part and region using Hive. The path of the part table is /user/hive/warehouse/partition.db/part_4, and that of the region table is /user/hive/warehouse/mppdb.db/region_orc11_64stripe/.

+
  1. Establish HDFS_Server, with HDFS_FDW or DFS_FDW as the foreign data wrapper.
    1
    CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (address '10.10.0.100:25000,10.10.0.101:25000',hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop',type'HDFS');
    +
    + +
    +

    The IP addresses and port numbers of HDFS NameNodes are specified in OPTIONS. 10.10.0.100:25000,10.10.0.101:25000 indicates the IP addresses and port numbers of the primary and standby HDFS NameNodes. It is the recommended format. Two groups of parameter values are separated by commas (,). Take '10.10.0.100:25000' as an example. In this example, the IP address is 10.10.0.100, and the port number is 25000.

    +
    +
  1. Create an HDFS foreign table. The HDFS server associated with the table is hdfs_server, the corresponding file format of the ft_region table on the HDFS server is 'orc', and the file directory in the HDFS file system is '/user/hive/warehouse/mppdb. db/region_orc11_64stripe/'.
+
  • Create an HDFS foreign table without partition keys.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    CREATE FOREIGN TABLE ft_region
    +(
    +    R_REGIONKEY INT4,
    +    R_NAME TEXT,
    +    R_COMMENT TEXT
    +)
    +SERVER
    +    hdfs_server
    +OPTIONS
    +(
    +    FORMAT 'orc',
    +    encoding 'utf8',
    +    FOLDERNAME '/user/hive/warehouse/mppdb.db/region_orc11_64stripe/'
    +)
    +DISTRIBUTE BY 
    +     roundrobin;
    +
    + +
    +
  • Create an HDFS foreign table with partition keys.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    CREATE FOREIGN TABLE ft_part 
    +(
    +     p_partkey int, 
    +     p_name text, 
    +     p_mfgr text, 
    +     p_brand text, 
    +     p_type text, 
    +     p_size int, 
    +     p_container text, 
    +     p_retailprice float8, 
    +     p_comment text
    +)
    +SERVER
    +     hdfs_server
    +OPTIONS
    +(
    +     FORMAT 'orc',
    +     encoding 'utf8',
    +     FOLDERNAME '/user/hive/warehouse/partition.db/part_4'
    +)
    +DISTRIBUTE BY 
    +     roundrobin
    +PARTITION BY 
    +     (p_mfgr) AUTOMAPPED;
    +
    + +
    +

    GaussDB(DWS) allows you to specify files using the keyword filenames or foldername. The latter is recommended. The key word distribute specifies the storage distribution mode of the region table.

    +
    +
+
  1. View the created server and foreign table.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT * FROM pg_foreign_table WHERE ftrelid='ft_region'::regclass;
    + ftrelid | ftserver | ftwriteonly |                                  ftoptions
    +---------+----------+-------------+------------------------------------------------------------------------------
    +   16510 |    16509 | f           | {format=orc,foldername=/user/hive/warehouse/mppdb.db/region_orc11_64stripe/}
    +(1 row)
    +
    +select * from pg_foreign_table where ftrelid='ft_part'::regclass;
    + ftrelid | ftserver | ftwriteonly |                            ftoptions
    +---------+----------+-------------+------------------------------------------------------------------
    +   16513 |    16509 | f           | {format=orc,foldername=/user/hive/warehouse/partition.db/part_4}
    +(1 row)
    +
    + +
    +
+
+

Example 2

Export data from the TPC-H benchmark test table region table to the /user/hive/warehouse/mppdb.db/regin_orc/ directory of the HDFS file system through the HDFS write-only foreign table.

+
  1. Create an HDFS foreign table. The corresponding foreign data wrapper is HDFS_FDW or DFS_FDW, which is the same as that in Example 1.
  2. Create a write-only HDFS foreign table.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    CREATE FOREIGN TABLE ft_wo_region
    +(
    +    R_REGIONKEY INT4,
    +    R_NAME TEXT,
    +    R_COMMENT TEXT
    +)
    +SERVER
    +    hdfs_server
    +OPTIONS
    +(
    +    FORMAT 'orc',
    +    encoding 'utf8',
    +    FOLDERNAME '/user/hive/warehouse/mppdb.db/regin_orc/'
    +)
    +WRITE ONLY;
    +
    + +
    +
  3. Writes data to the HDFS file system through a write-only foreign table.
    1
    INSERT INTO ft_wo_regin SELECT * FROM region;
    +
    + +
    +
+
+

Example 3

Perform operations on an HDFS foreign table that includes informational constraints.

+
  • Create an HDFS foreign table with informational constraints.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    CREATE FOREIGN TABLE ft_region  (
    + R_REGIONKEY  int,
    + R_NAME TEXT,
    + R_COMMENT TEXT
    +  , primary key (R_REGIONKEY) not enforced)
    +SERVER hdfs_server
    +OPTIONS(format 'orc',
    +    encoding 'utf8',
    + foldername '/user/hive/warehouse/mppdb.db/region_orc11_64stripe')
    +DISTRIBUTE BY roundrobin;
    +
    + +
    +
  • Check whether the region table has an informational constraint index.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    SELECT relname,relhasindex FROM pg_class WHERE oid='ft_region'::regclass;
    +        relname         | relhasindex 
    +------------------------+-------------
    +        ft_region          | f
    +(1 row)
    +
    +SELECT conname, contype, consoft, conopt, conindid, conkey FROM pg_constraint WHERE conname ='region_pkey';
    +   conname   | contype | consoft | conopt | conindid | conkey
    +-------------+---------+---------+--------+----------+--------
    + region_pkey | p       | t       | t      |        0 | {1}
    +(1 row)
    +
    + +
    +
  • Delete the informational constraint.
    1
    +2
    +3
    +4
    +5
    +6
    ALTER FOREIGN TABLE ft_region DROP CONSTRAINT region_pkey RESTRICT;
    +
    +SELECT conname, contype, consoft, conindid, conkey FROM pg_constraint WHERE conname ='region_pkey';
    + conname | contype | consoft | conindid | conkey 
    +---------+---------+---------+----------+--------
    +(0 rows)
    +
    + +
    +
  • Add a unique informational constraint for the foreign table.
    1
    ALTER FOREIGN TABLE ft_region ADD CONSTRAINT constr_unique UNIQUE(R_REGIONKEY) NOT ENFORCED;
    +
    + +
    +
    Delete the informational constraint.
    1
    +2
    +3
    +4
    +5
    +6
    ALTER FOREIGN TABLE ft_region DROP CONSTRAINT constr_unique RESTRICT;
    +
    +SELECT conname, contype, consoft, conindid, conkey FROM pg_constraint WHERE conname ='constr_unique';
    + conname | contype | consoft | conindid | conkey 
    +---------+---------+---------+----------+--------
    +(0 rows)
    +
    + +
    +
    +
  • Add a unique informational constraint for the foreign table.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    ALTER FOREIGN TABLE ft_region ADD CONSTRAINT constr_unique UNIQUE(R_REGIONKEY) NOT ENFORCED disable query optimization;
    +
    +SELECT relname,relhasindex FROM pg_class WHERE oid='ft_region'::regclass;
    +        relname         | relhasindex 
    +------------------------+-------------
    +        ft_region          | f
    +(1 row)
    +
    + +
    +
    Delete the informational constraint.
    1
    ALTER FOREIGN TABLE ft_region DROP CONSTRAINT constr_unique CASCADE;
    +
    + +
    +
    +
+
+

Example 4

Read data stored in OBS using a foreign table.

+
  1. Create obs_server, with DFS_FDW as the foreign data wrapper.
    1
    +2
    +3
    +4
    +5
    +6
    CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
    +  ADDRESS 'obs.xxx.xxx.com', 
    +   ACCESS_KEY 'xxxxxxxxx', 
    +  SECRET_ACCESS_KEY 'yyyyyyyyyyyyy', 
    +  TYPE 'OBS'
    +);
    +
    + +
    +
    • ADDRESS is the endpoint of OBS. Replace it with the actual endpoint. You can find the domain name by searching for the value of regionCode in the region_map file.
    • ACCESS_KEY and SECRET_ACCESS_KEY are access keys for the cloud account system. Replace the values as needed.
    • TYPE indicates the server type. Retain the value OBS.
    +
    +
  2. Create an OBS foreign table named customer_address, which does not contain partition columns and is associated with an OBS server named obs_server. Files on obs_server are in ORC format and stored in /user/hive/warehouse/mppdb.db/region_orc11_64stripe1/.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    CREATE FOREIGN TABLE customer_address
    +(
    +    ca_address_sk             integer               not null,
    +    ca_address_id             char(16)              not null,
    +    ca_street_number          char(10)                      ,   
    +    ca_street_name            varchar(60)                   ,   
    +    ca_street_type            char(15)                      ,   
    +    ca_suite_number           char(10)                      ,   
    +    ca_city                   varchar(60)                   ,   
    +    ca_county                 varchar(30)                   ,   
    +    ca_state                  char(2)                       ,   
    +    ca_zip                    char(10)                      ,   
    +    ca_country                varchar(20)                   ,   
    +    ca_gmt_offset             decimal(36,33)                  ,   
    +    ca_location_type          char(20)    
    +) 
    +SERVER obs_server OPTIONS (
    +    FOLDERNAME '/user/hive/warehouse/mppdb.db/region_orc11_64stripe1/',
    +    FORMAT 'ORC',
    +    ENCODING 'utf8',
    +    TOTALROWS  '20'
    +)
    +DISTRIBUTE BY roundrobin;
    +
    + +
    +
  3. Query data stored in OBS using a foreign table.
    1
    +2
    +3
    +4
    +5
    SELECT COUNT(*) FROM customer_address;
    + count 
    +-------
    +    20
    +(1 row)
    +
    + +
    +
+
+

Example 5

Read a DLI multi-version foreign table using a foreign table. Only DLI 8.1.1 and later support the multi-version foreign table example.

+
  1. Create dli_server, with DFS_FDW as the foreign data wrapper.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
    +  ADDRESS 'obs.xxx.xxx.com', 
    +  ACCESS_KEY 'xxxxxxxxx', 
    +  SECRET_ACCESS_KEY 'yyyyyyyyyyyyy', 
    +  TYPE 'DLI',
    +  DLI_ADDRESS 'dli.xxx.xxx.com',
    +  DLI_ACCESS_KEY 'xxxxxxxxx',
    +  DLI_SECRET_ACCESS_KEY 'yyyyyyyyyyyyy'
    +);
    +
    + +
    +
    • ADDRESS is the endpoint of OBS. DLI_ADDRESS is the endpoint of DLI. Replace it with the actual endpoint.
    • ACCESS_KEY and SECRET_ACCESS_KEY are access keys for the cloud account system to access OBS. Use the actual value.
    • DLI_ACCESS_KEY and DLI_SECRET_ACCESS_KEY are access keys for the cloud account system to access DLI. Use the actual value.
    • TYPE indicates the server type. Retain the value DLI.
    +
    +
  1. Create the OBS foreign table customer_address for accessing DLI. The table does not contain partition columns, and the DLI server associated with the table is dli_server. In the preceding command, dli_project_id is xxxxxxxxxxxxxxx, dli_database_name is database123, and dli_table_name is table456. Set their values based on site requirements.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    CREATE FOREIGN TABLE customer_address
    +(
    +    ca_address_sk             integer               not null,
    +    ca_address_id             char(16)              not null,
    +    ca_street_number          char(10)                      ,   
    +    ca_street_name            varchar(60)                   ,   
    +    ca_street_type            char(15)                      ,   
    +    ca_suite_number           char(10)                      ,   
    +    ca_city                   varchar(60)                   ,   
    +    ca_county                 varchar(30)                   ,   
    +    ca_state                  char(2)                       ,   
    +    ca_zip                    char(10)                      ,   
    +    ca_country                varchar(20)                   ,   
    +    ca_gmt_offset             decimal(36,33)                  ,   
    +    ca_location_type          char(20)    
    +) 
    +SERVER dli_server OPTIONS (
    +    FORMAT 'ORC',
    +    ENCODING 'utf8',
    +    DLI_PROJECT_ID 'xxxxxxxxxxxxxxx',
    +    DLI_DATABASE_NAME 'database123',
    +    DLI_TABLE_NAME 'table456'
    +)
    +DISTRIBUTE BY roundrobin;
    +
    + +
    +
  2. Query data in a DLI multi-version table using a foreign table.
    1
    +2
    +3
    +4
    +5
    SELECT COUNT(*) FROM customer_address;
    + count 
    +-------
    +    20
    +(1 row)
    +
    + +
    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0163.html b/docs/dws/dev/dws_06_0163.html new file mode 100644 index 00000000..3656128c --- /dev/null +++ b/docs/dws/dev/dws_06_0163.html @@ -0,0 +1,306 @@ + + +

CREATE FUNCTION

+

Function

CREATE FUNCTION creates a function.

+
+

Precautions

  • The precision values (if any) of the parameters or return values of a function are not checked.
  • When creating a function, you are advised to explicitly specify the schemas of tables in the function definition. Otherwise, the function may fail to be executed.
  • current_schema and search_path specified by SET during function creation are invalid. search_path and current_schema before and after function execution should be the same.
  • If a function has output parameters, the SELECT statement uses the default values of the output parameters when calling the function. When the CALL statement calls the function, it requires that the output parameter values are adapted to Oracle. When the CALL statement calls an overloaded PACKAGE function, it can use the default values of the output parameters. For details, see examples in CALL.
  • Only the functions compatible with PostgreSQL or those with the PACKAGE attribute can be overloaded. After REPLACE is specified, a new function is created instead of replacing a function if the number of parameters, parameter type, or return value is different.
  • You can use the SELECT statement to specify different parameters using identical functions, but cannot use the CALL statement to call identical functions without the PACKAGE attribute because CALL aligns with Oracle syntax.
  • When you create a function, you cannot insert other agg functions out of the avg function or other functions.
  • In non-logical cluster mode, return values, parameters, and variables cannot be set to the tables of the Node Groups that are not installed in the system by default. The internal statements of SQL functions cannot be executed on such tables.
  • In logical cluster mode, if return values and parameters of the function are user tables, all the tables must be in the same logical cluster. If the function body involves operations on multiple logical cluster tables, the function cannot be set to IMMUTABLE or SHIPPABLE, preventing the function from being pushed down to a DN.
  • In logical cluster mode, the parameters and return values of the function cannot use the %type to reference a table column type. Otherwise, the function will fail to be created.
  • By default, the permissions to execute new functions are granted to PUBLIC. For details, see GRANT. You can revoke the default execution permissions from PUBLIC and grant them to other users as needed. To avoid the time window during which new functions can be accessed by all users, create functions in transactions and set function execution permissions.
+
+

Syntax

  • Syntax (compatible with PostgreSQL) for creating a user-defined function:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    CREATE [ OR REPLACE  ] FUNCTION function_name 
    +    ( [  { argname [ argmode  ] argtype [  { DEFAULT  | :=  | =  } expression  ]}  [, ...]  ] )
    +    [ RETURNS rettype [ DETERMINISTIC  ]  | RETURNS TABLE (  { column_name column_type  }  [, ...] )]
    +    LANGUAGE lang_name 
    +    [ 
    +       {IMMUTABLE  | STABLE  | VOLATILE }
    +        | {SHIPPABLE | NOT SHIPPABLE}
    +        | WINDOW
    +        | [ NOT  ] LEAKPROOF  
    +        | {CALLED ON NULL INPUT  | RETURNS NULL ON NULL INPUT | STRICT } 
    +        | {[ EXTERNAL  ] SECURITY INVOKER | [ EXTERNAL  ] SECURITY DEFINER | AUTHID DEFINER  | AUTHID CURRENT_USER} 
    +        | {fenced | not fenced}
    +        | {PACKAGE}
    +
    +        | COST execution_cost
    +        | ROWS result_rows
    +        | SET configuration_parameter { {TO | =} value | FROM CURRENT }}
    +     ][...]
    +    {
    +        AS 'definition'
    +        | AS 'obj_file', 'link_symbol'
    +    }
    +
    + +
    +
  • Oracle syntax of creating a customized function:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    CREATE [ OR REPLACE  ] FUNCTION function_name 
    +    ( [  { argname [ argmode  ] argtype [  { DEFAULT | := | =  } expression  ] }  [, ...]  ] )
    +    RETURN rettype [ DETERMINISTIC  ]
    +    [ 
    +        {IMMUTABLE  | STABLE  | VOLATILE } 
    +        | {SHIPPABLE | NOT SHIPPABLE}
    +        | {PACKAGE}
    +        | {FENCED | NOT FENCED}
    +        | [ NOT  ] LEAKPROOF  
    +        | {CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT } 
    +        | {[ EXTERNAL  ] SECURITY INVOKER  | [ EXTERNAL  ] SECURITY DEFINER |
    +AUTHID DEFINER | AUTHID CURRENT_USER
    +} 
    +        | COST execution_cost  
    +        | ROWS result_rows  
    +        | SET configuration_parameter { {TO | =} value  | FROM CURRENT
    +
    +    ][...] 
    +
    +    { 
    +      IS  | AS
    +} plsql_body
    +/
    +
    + +
    +
+
+

Parameter Description

  • function_name

    Indicates the name of the function to create (optionally schema-qualified).

    +

    Value range: a string. It must comply with the naming convention.

    +
  • argname

    Indicates the name of a function parameter.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • argmode

    Indicates the mode of a parameter.

    +

    Value range: IN, OUT, IN OUT, INOUT, and VARIADIC. The default value is IN. Only the parameter of OUT mode can be followed by VARIADIC. The parameters of OUT and INOUT cannot be used in function definition of RETURNS TABLE.

    +

    VARIADIC specifies parameters of array types.

    +
    +
  • argtype

    Indicates the data types of the function's parameters.

    +
  • expression

    Indicates the default expression of a parameter.

    +
  • rettype

    Indicates the return data type.

    +

    When there is OUT or IN OUT parameter, the RETURNS clause can be omitted. If the clause exists, it must be the same as the result type indicated by the output parameter. If there are multiple output parameters, the value is RECORD. Otherwise, the value is the same as the type of a single output parameter.

    +

    The SETOF modifier indicates that the function will return a set of items, rather than a single item.

    +
  • DETERMINISTIC

    The adaptation oracle SQL syntax. You are not advised to use it.

    +
  • column_name

    Specifies the column name.

    +
  • column_type

    Specifies the column type.

    +
  • definition

    Specifies a string constant defining the function; the meaning depends on the language. It can be an internal function name, a path pointing to a target file, a SQL query, or text in a procedural language.

    +
  • LANGUAGE lang_name

    Indicates the name of the language that is used to implement the function. It can be SQL, internal, or the name of user-defined process language. To ensure downward compatibility, the name can use single quotation marks. Contents in single quotation marks must be capitalized.

    +
  • WINDOW

    Indicates that the function is a window function. The WINDOW attribute cannot be changed when the function definition is replaced.

    +

    For a user-defined window function, the value of LANGUAGE can only be internal, and the referenced internal function must be a window function.

    +
    +
  • IMMUTABLE

    Indicates that the function always returns the same result if the parameter values are the same.

    +

    If the input argument of the function is a constant, the function value is calculated at the optimizer stage. The advantage is that the expression value can be obtained as early as possible, so the cost estimation is more accurate and the execution plan generated is better.

    +

    A user-defined IMMUTABLE function is automatically pushed down to DNs for execution, which may cause potential risks. If a function is defined as IMMUTABLE but the function execution process is in fact not IMMUTABLE, serious problems such as result errors may occur. Therefore, exercise caution when defining the IMMUTABLE attribute for a function.

    +

    Examples:

    +
    1. If a user-defined function references objects such as tables and views, the function cannot be defined as IMMUTABLE, because the function may return different results when the data in a referenced table changes.
    2. If a user-defined function references a STABLE or VOLATILE function, the function cannot be defined as IMMUTABLE.
    3. If a user-defined function contains factors that cannot be pushed down, the function cannot be defined as IMMUTABLE, because the IMMUTABLE attribute conflicts with factors that cannot be pushed down. Typical scenarios include functions and syntax that cannot be pushed down.
    4. If a user-defined function contains an aggregation operation that will generate STREAM plans to complete the operation (meaning that DNs and CNs are involved for results calculation, such as the LISTAGG function), the function cannot be defined as IMMUTABLE.
    +

    To prevent possible problems, you can set behavior_compat_options to check_function_conflicts in the database to check definition conflicts. This method can identify the 1 and 2 scenarios described above.

    +
  • STABLE

    Indicates that the function cannot modify the database, and that within a single table scan it will consistently return the same result for the same parameter values, but that its result varies by SQL statements.

    +
  • VOLATILE

    Indicates that the function value can change even within a single table scan, so no optimizations can be made.

    +
  • SHIPPABLE

    NOT SHIPPABLE

    +

    Indicates whether the function can be pushed down to DNs for execution.

    +
    • Functions of the IMMUTABLE type can always be pushed down to the DNs.
    • Functions of the STABLE or VOLATILE type can be pushed down to DNs only if their attribute is SHIPPABLE.

      Exercise caution when defining the SHIPPABLE attribute for a function. SHIPPABLE means that the entire function will be pushed down to DNs for execution. If the attribute is incorrectly set, serious problems such as result errors may occur.

      +

      Similar to the IMMUTABLE attribute, the SHIPPABLE attribute has use restrictions. The function cannot contain factors that do not allow the function to be pushed down for execution. If a function is pushed down to a single DN for execution, the function's calculation logic will depend only on the data set of the DN.

      +

      Examples:

      +
      1. If a function references a hash table, you cannot define the function as SHIPPABLE.
      2. If a function contains factors, functions, or syntax that cannot be pushed down, the function cannot be defined as SHIPPABLE. For details, see Optimizing Statement Pushdown.
      3. If a function's calculation process involves data across DNs, the function cannot be defined as SHIPPABLE. For example, some aggregation operations involve data across DNs.
      +
    +
  • PACKAGE
    Indicates whether the function can be overloaded. PostgreSQL-style functions can be overloaded, and this parameter is designed for Oracle-style functions.
    • All PACKAGE and non-PACKAGE functions cannot be overloaded or replaced.
    • PACKAGE functions do not support parameters of the VARIADIC type.
    • The PACKAGE attribute of functions cannot be modified.
    +
    +
  • LEAKPROOF

    Indicates that the function has no side effects. LEAKPROOF can be set only by the system administrator.

    +
  • CALLED ON NULL INPUT

    Declares that some parameters of the function can be invoked in normal mode if the parameter values are NULL. This parameter can be omitted.

    +
  • RETURNS NULL ON NULL INPUT

    STRICT

    +

    Indicates that the function always returns NULL whenever any of its parameters are NULL. If this parameter is specified, the function is not executed when there are NULL parameters; instead a NULL result is returned automatically.

    +

    The usage of RETURNS NULL ON NULL INPUT is the same as that of STRICT.

    +
  • EXTERNAL

    The keyword EXTERNAL is allowed for SQL conformance, but it is optional since, unlike in SQL, this feature applies to all functions not only external ones.

    +
  • SECURITY INVOKER

    AUTHID CURRENT_USER

    +

    Indicates that the function is to be executed with the permissions of the user that calls it. This parameter can be omitted.

    +

    SECURITY INVOKER and AUTHID CURRENT_USER have the same functions.

    +
  • SECURITY DEFINER

    AUTHID DEFINER

    +

    Specifies that the function is to be executed with the permissions of the user that created it.

    +

    The usage of AUTHID DEFINER is the same as that of SECURITY DEFINER.

    +
  • FENCED

    NOT FENCED

    +

    (Effective only for C functions) Specifies whether functions are executed in fenced mode. In NOT FENCED mode, a function is executed in a CN or DN process. In FENCED mode, a function is executed in a new fork process, which does not affect CN or DN processes.

    +

    Application scenarios:

    +
    • Develop or debug a function in FENCED mode and execute it in NOT FENCED mode. This reduces the cost of the fork process and communication.
    • Perform complex OS operations, such as open a file, process signals and threads, in FENCED mode so that GaussDB(DWS) running is not affected.
    • The default value is FENCED.
    +
  • COST execution_cost

    A positive number giving the estimated execution cost for the function.

    +

    The unit of execution_cost is cpu_operator_cost.

    +

    Value range: A positive number.

    +
  • ROWS result_rows

    Estimates the number of rows returned by the function. This is only allowed when the function is declared to return a set.

    +

    Value range: A positive number. The default is 1000 rows.

    +
  • configuration_parameter
    • value

      Sets a specified database session parameter to a specified value. If the value is DEFAULT or RESET, the default setting is used in the new session. OFF closes the setting.

      +

      Value range: a string

      +
      • DEFAULT
      • OFF
      • RESET
      +

      Specifies the default value.

      +
    • from current

      Uses the value of configuration_parameter of the current session.

      +
    +
  • obj_file, link_symbol

    (Used for C functions) Specifies the absolute path of the dynamic library using obj_file and the link symbol (function name in C programming language) of the function using link_symbol.

    +
  • plsql_body

    Indicates the PL/SQL stored procedure body.

    +

    When the function is creating users, the log will record unencrypted passwords. You are not advised to do it.

    +
    +
+
+

Examples

Define the function as SQL query.

+
1
+2
+3
+4
+5
CREATE FUNCTION func_add_sql(integer, integer) RETURNS integer
+    AS 'select $1 + $2;'
+    LANGUAGE SQL
+    IMMUTABLE
+    RETURNS NULL ON NULL INPUT;
+
+ +
+

Add an integer by parameter name using PL/pgSQL.

+
1
+2
+3
+4
+5
CREATE OR REPLACE FUNCTION func_increment_plsql(i integer) RETURNS integer AS $$
+        BEGIN
+                RETURN i + 1;
+        END;
+$$ LANGUAGE plpgsql;
+
+ +
+

Return the RECORD type.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE OR REPLACE FUNCTION compute(i int, out result_1 bigint, out result_2 bigint)
+returns SETOF RECORD
+as $$
+begin
+    result_1 = i + 1;
+    result_2 = i * 10;
+return next;
+end;
+$$language plpgsql;
+
+ +
+

Get a record containing multiple output parameters.

+
1
+2
+3
+4
CREATE FUNCTION func_dup_sql(in int, out f1 int, out f2 text)
+    AS $$ SELECT $1, CAST($1 AS text) || ' is text' $$
+    LANGUAGE SQL;
+SELECT * FROM func_dup_sql(42);
+
+ +
+

Calculate the sum of two integers and get the result. If the input is null, null will be returned.

+
1
+2
+3
+4
+5
+6
CREATE FUNCTION func_add_sql2(num1 integer, num2 integer) RETURN integer
+AS
+BEGIN 
+RETURN num1 + num2;
+END;
+/
+
+ +
+

Create an overloaded function with the PACKAGE attribute.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
CREATE OR REPLACE FUNCTION package_func_overload(col int, col2  int)
+return integer package
+as
+declare
+    col_type text;
+begin
+     col := 122;
+         dbms_output.put_line('two int parameters ' || col2);
+         return 0;
+end;
+/
+
+CREATE OR REPLACE FUNCTION package_func_overload(col int, col2 smallint)
+return integer package
+as
+declare
+    col_type text;
+begin
+     col := 122;
+         dbms_output.put_line('two smallint parameters ' || col2);
+         return 0;
+end;
+/
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0164.html b/docs/dws/dev/dws_06_0164.html new file mode 100644 index 00000000..db61b7e6 --- /dev/null +++ b/docs/dws/dev/dws_06_0164.html @@ -0,0 +1,84 @@ + + +

CREATE GROUP

+

Function

CREATE GROUP creates a user group.

+
+

Precautions

CREATE GROUP is an alias for CREATE ROLE, and it is not a standard SQL command and not recommended. Users can use CREATE ROLE directly.

+
+

Syntax

1
+2
CREATE GROUP group_name [ [ WITH ] option [ ... ] ] 
+    [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE };
+
+ +
+

The syntax of optional action clause is as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
where option can be:
+{SYSADMIN | NOSYSADMIN}
+    | {AUDITADMIN | NOAUDITADMIN}
+    | {CREATEDB | NOCREATEDB}
+    | {USEFT | NOUSEFT}
+    | {CREATEROLE | NOCREATEROLE}
+    | {INHERIT | NOINHERIT}
+    | {LOGIN | NOLOGIN}
+    | {REPLICATION | NOREPLICATION}
+    | {INDEPENDENT | NOINDEPENDENT}
+    | {VCADMIN | NOVCADMIN}
+    | CONNECTION LIMIT connlimit
+    | VALID BEGIN 'timestamp'
+    | VALID UNTIL 'timestamp'
+    | RESOURCE POOL 'respool'
+    | USER GROUP 'groupuser'
+    | PERM SPACE 'spacelimit'
+    | NODE GROUP logic_group_name
+    | IN ROLE role_name [, ...]
+    | IN GROUP role_name [, ...]
+    | ROLE role_name [, ...]
+    | ADMIN role_name [, ...]
+    | USER role_name [, ...]
+    | SYSID uid
+    | DEFAULT TABLESPACE tablespace_name
+    | PROFILE DEFAULT
+    | PROFILE profile_name
+    | PGUSER
+
+ +
+
+

Parameter Description

See Parameter Description in CREATE ROLE.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0165.html b/docs/dws/dev/dws_06_0165.html new file mode 100644 index 00000000..3012162e --- /dev/null +++ b/docs/dws/dev/dws_06_0165.html @@ -0,0 +1,199 @@ + + +

CREATE INDEX

+

Function

CREATE INDEX-bak defines a new index.

+

Indexes are primarily used to enhance database performance (though inappropriate use can result in slower database performance). You are advised to create indexes on:

+
  • Columns that are often queried
  • Join conditions. For a query on joined columns, you are advised to create a composite index on the columns, for example, select * from t1 join t2 on t1.a=t2.a and t1.b=t2.b. You can create a composite index on the a and b columns of table t1.
  • Columns having filter criteria (especially scope criteria) of a where clause
  • Columns that appear after order by, group by, and distinct.
+

The partitioned table does not support concurrent index creation, partial index creation, and NULL FIRST.

+
+

Precautions

  • Indexes consume storage and computing resources. Creating too many indexes has negative impact on database performance (especially the performance of data import. Therefore, you are advised to import the data before creating indexes). Create indexes only when they are necessary.
  • All functions and operators used in an index definition must be immutable, that is, their results must depend only on their arguments and never on any outside influence (such as the contents of another table or the current time). This restriction ensures that the behavior of the index is well-defined. To use a user-defined function in an index expression or WHERE clause, remember to mark the function immutable when you create it.
  • A unique index created on a partitioned table must include a partition column and all the partition keys.
  • GaussDB(DWS) can only create local indexes on partitioned tables.
  • Column-store tables and HDFS tables support B-tree indexes. If the B-tree indexes are used, you cannot create expression and partial indexes.
  • Column-store tables support creating unique indexes using B-tree indexes.
  • Column-store and HDFS tables support psort indexes. If the psort indexes are used, you cannot create expression, partial, and unique indexes.
  • Column-store tables support GIN indexes, rather than partial indexes and unique indexes. If GIN indexes are used, you can create expression indexes. However, an expression in this situation cannot contain empty splitters, empty columns, or multiple columns.
+
+

Syntax

  • Create an index on a table.
    1
    +2
    +3
    +4
    +5
    CREATE [ UNIQUE ] INDEX [ [ schema_name. ] index_name ] ON table_name [ USING method ]
    +    ({ { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] }[, ...] )
    +    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    +    [ TABLESPACE tablespace_name ]
    +    [ WHERE predicate ];
    +
    + +
    +
  • Create an index for a partitioned table.
    1
    +2
    +3
    +4
    +5
    CREATE [ UNIQUE ] INDEX [ [ schema_name. ] index_name ] ON table_name [ USING method ]
    +    ( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] )
    +    LOCAL [ ( { PARTITION index_partition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ]
    +    [ WITH ( { storage_parameter = value } [, ...] ) ]
    +    [ TABLESPACE tablespace_name ];
    +
    + +
    +
+
+

Parameters

  • UNIQUE

    Causes the system to check for duplicate values in the table when the index is created (if data exists) and each time data is added. Attempts to insert or update data which would result in duplicate entries will generate an error.

    +

    Currently, only B-tree indexes of row-store tables and column-store tables support unique indexes.

    +
  • schema_name

    Name of the schema where the index to be created is located. The specified schema name must be the same as the schema of the table.

    +
  • index_name

    Specifies the name of the index to be created. The schema of the index is the same as that of the table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • table_name

    Specifies the name of the table to be indexed (optionally schema-qualified).

    +

    Value range: an existing table name

    +
  • USING method

    Specifies the name of the index method to be used.

    +

    Valid value:

    +
    • btree: The B-tree index uses a structure that is similar to the B+ tree structure to store data key values, facilitating index search. btree supports comparison queries with ranges specified.
    • gin: GIN indexes are reverse indexes and can process values that contain multiple keys (for example, arrays).
    • gist: GiST indexes are suitable for the set data type and multidimensional data types, such as geometric and geographic data types.
    • Psort: psort index. It is used to perform partial sort on column-store tables.
    +

    Row-based tables support the following index types: btree (default), gin, and gist. Column-based tables support the following index types: Psort (default), btree, and gin.

    +
  • column_name

    Specifies the name of a column of the table.

    +

    Multiple columns can be specified if the index method supports multi-column indexes. A maximum of 32 columns can be specified.

    +
  • expression

    Specifies an expression based on one or more columns of the table. The expression usually must be written with surrounding parentheses, as shown in the syntax. However, the parentheses can be omitted if the expression has the form of a function call.

    +

    Expression can be used to obtain fast access to data based on some transformation of the basic data. For example, an index computed on upper(col) would allow the clause WHERE upper(col) = 'JIM' to use an index.

    +

    If an expression contains IS NULL, the index for this expression is invalid. In this case, you are advised to create a partial index.

    +
  • COLLATE collation

    Assigns a collation to the column (which must be of a collatable data type). If no collation is specified, the default collation is used.

    +
  • opclass

    Specifies the name of an operator class. Specifies an operator class for each column of an index. The operator class identifies the operators to be used by the index for that column. For example, a B-tree index on the type int4 would use the int4_ops class; this operator class includes comparison functions for values of type int4. In practice, the default operator class for the column's data type is sufficient. The operator class applies to data with multiple sorts. For example, we might want to sort a complex-number data type either by absolute value or by real part. We could do this by defining two operator classes for the data type and then selecting the proper class when making an index.

    +
  • ASC

    Indicates ascending sort order (default). This option is supported only by row storage.

    +
  • DESC

    Indicates descending sort order. This option is supported only by row storage.

    +
  • NULLS FIRST

    Specifies that nulls sort before not-null values. This is the default when DESC is specified.

    +
  • NULLS LAST

    Specifies that nulls sort after not-null values. This is the default when DESC is not specified.

    +
  • WITH ( {storage_parameter = value} [, ... ] )

    Specifies the name of an index-method-specific storage parameter.

    +

    Valid value:

    +
    Only the GIN index supports the FASTUPDATE and GIN_PENDING_LIST_LIMIT parameters. The indexes other than GIN and psort support the FILLFACTOR parameter.
    • FILLFACTOR

      The fillfactor for an index is a percentage between 10 and 100.

      +

      Value range: 10–100

      +
    • FASTUPDATE

      Specifies whether fast update is enabled for the GIN index.

      +

      Valid value: ON and OFF

      +

      Default: ON

      +
    • GIN_PENDING_LIST_LIMIT

      Specifies the maximum capacity of the pending list of the GIN index when fast update is enabled for the GIN index.

      +

      Value range: 64–INT_MAX. The unit is KB.

      +

      Default value: The default value of gin_pending_list_limit depends on gin_pending_list_limit specified in GUC parameters. By default, the value is 4 MB.

      +
    +
    +
  • WHERE predicate

    Creates a partial index. A partial index is an index that contains entries for only a portion of a table, usually a portion that is more useful for indexing than the rest of the table. For example, if you have a table that contains both billed and unbilled orders where the unbilled orders take up a small fraction of the total table and yet that is an often used section, you can improve performance by creating an index on just that portion. Another possible application is to use WHERE with UNIQUE to enforce uniqueness over a subset of a table.

    +

    Value range: predicate expression can refer only to columns of the underlying table, but it can use all columns, not just the ones being indexed. Presently, subquery and aggregate expressions are also forbidden in WHERE.

    +
  • PARTITION index_partition_name

    Specifies the name of the index partition.

    +

    Value range: a string. It must comply with the naming convention.

    +
+
+

Examples

  • Create a sample table named tpcds.ship_mode_t1.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    CREATE TABLE tpcds.ship_mode_t1
    +(
    +    SM_SHIP_MODE_SK           INTEGER               NOT NULL,
    +    SM_SHIP_MODE_ID           CHAR(16)              NOT NULL,
    +    SM_TYPE                   CHAR(30)                      ,
    +    SM_CODE                   CHAR(10)                      ,
    +    SM_CARRIER                CHAR(20)                      ,
    +    SM_CONTRACT               CHAR(20)
    +) 
    +DISTRIBUTE BY HASH(SM_SHIP_MODE_SK);
    +
    + +
    +

    -- Create a common index on the SM_SHIP_MODE_SK column in the tpcds.ship_mode_t1 table:

    +
    1
    CREATE UNIQUE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK);
    +
    + +
    +

    Create a B-tree index on the SM_SHIP_MODE_SK column in the tpcds.ship_mode_t1 table.

    +
    1
    CREATE INDEX ds_ship_mode_t1_index4 ON tpcds.ship_mode_t1 USING btree(SM_SHIP_MODE_SK);
    +
    + +
    +

    Create an expression index on the SM_CODE column in the tpcds.ship_mode_t1 table.

    +
    1
    CREATE INDEX ds_ship_mode_t1_index2 ON tpcds.ship_mode_t1(SUBSTR(SM_CODE,1 ,4));
    +
    + +
    +

    Create a partial index on the SM_SHIP_MODE_SK column where SM_SHIP_MODE_SK is greater than 10 in the tpcds.ship_mode_t1 table.

    +
    CREATE UNIQUE INDEX ds_ship_mode_t1_index3 ON tpcds.ship_mode_t1(SM_SHIP_MODE_SK) WHERE SM_SHIP_MODE_SK>10;
    +
+
  • Create a sample table named tpcds.customer_address_p1.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    CREATE TABLE tpcds.customer_address_p1
    +(
    +    CA_ADDRESS_SK             INTEGER               NOT NULL,
    +    CA_ADDRESS_ID             CHAR(16)              NOT NULL,
    +    CA_STREET_NUMBER          CHAR(10)                      ,
    +    CA_STREET_NAME            VARCHAR(60)                   ,
    +    CA_STREET_TYPE            CHAR(15)                      ,
    +    CA_SUITE_NUMBER           CHAR(10)                      ,
    +    CA_CITY                   VARCHAR(60)                   ,
    +    CA_COUNTY                 VARCHAR(30)                   ,
    +    CA_STATE                  CHAR(2)                       ,
    +    CA_ZIP                    CHAR(10)                      ,
    +    CA_COUNTRY                VARCHAR(20)                   ,
    +    CA_GMT_OFFSET             DECIMAL(5,2)                  ,
    +    CA_LOCATION_TYPE          CHAR(20)
    +)
    +DISTRIBUTE BY HASH(CA_ADDRESS_SK)
    +PARTITION BY RANGE(CA_ADDRESS_SK)
    +( 
    +   PARTITION p1 VALUES LESS THAN (3000),
    +   PARTITION p2 VALUES LESS THAN (5000) ,
    +   PARTITION p3 VALUES LESS THAN (MAXVALUE) 
    +)
    +ENABLE ROW MOVEMENT;
    +
    + +
    +

    Create the partitioned table index ds_customer_address_p1_index1 with the name of the index partition not specified.

    +
    1
    CREATE INDEX ds_customer_address_p1_index1 ON tpcds.customer_address_p1(CA_ADDRESS_SK) LOCAL; 
    +
    + +
    +

    Create the partitioned table index ds_customer_address_p1_index2 with the name of the index partition specified.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    CREATE INDEX ds_customer_address_p1_index2 ON tpcds.customer_address_p1(CA_ADDRESS_SK) LOCAL
    +(
    +    PARTITION CA_ADDRESS_SK_index1,
    +    PARTITION CA_ADDRESS_SK_index2,
    +    PARTITION CA_ADDRESS_SK_index3 
    +) 
    +;
    +
    + +
    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0168.html b/docs/dws/dev/dws_06_0168.html new file mode 100644 index 00000000..d8d03a67 --- /dev/null +++ b/docs/dws/dev/dws_06_0168.html @@ -0,0 +1,69 @@ + + +

CREATE REDACTION POLICY

+

Function

CREATE REDACTION POLICY creates a data redaction policy for a table.

+
+

Precautions

  • Only the table owner has the permission to create a data redaction policy.
  • You can create data redaction policies only for ordinary tables. Redaction policies are unavailable to system catalogs, HDFS tables, foreign tables, temporary tables, UNLOGGED tables, views, and functions.
  • Synonyms cannot be used to create redaction policies for ordinary table objects.
  • Table objects and redaction policies have a one-to-one mapping relationship. A redaction policy is a collection of data redaction functions that can be applied to multiple columns in a table. You can set different redaction functions for different columns.
  • A redaction policy is enabled by default upon its creation, that is, the enable parameter of the policy is true by default.
  • Redaction policies do not take effect on users with the sysadmin permission. Data in the redacted columns is always visible to such users.
+
+

Syntax

1
+2
+3
CREATE REDACTION POLICY policy_name ON table_name
+    [ WHEN (when_expression) ]
+    [ ADD COLUMN column_name WITH redaction_function_name ( [ argument [, ...] ] )] [, ... ];
+
+ +
+
+

Parameter Description

  • policy_name

    Specifies the name of a redaction policy.

    +
  • table_name

    Specifies the name of the table to which the redaction policy is applied.

    +
  • WHEN ( when_expression )

    Specifies the expression used for the redaction policy to take effect. The redaction policy takes effect only when this expression is true.

    +

    When a query statement is querying a table where a redaction policy is enabled, the redacted data is invisible in the query only if the WHEN expression for the redaction policy is true. Generally, the WHEN clause is used to specify the users for which the redaction policy takes effect.

    +

    The WHEN clause must comply with the following rules:

    +
    1. The expression can be a combination of multiple subexpressions connected by AND and/or OR.
    2. Each subexpression supports only the =, <>, !=, >=, >, <=, and < operators. The left and right operand values can only be constant values or one of the following system constant values: SESSION_USER, CURRENT_USER, USER, CURRENT_ROLE, and CURRENT_SCHEMA system constants or the SYS_CONTEXT system function.
    3. Each subexpression can be an IN or NOT IN expression. The value for the left operand can be any of the system constant values listed in rule 2, and each element in the array of the right operand must be a constant value.
    4. If you want a redaction policy to be valid in all conditions, that is, you want it to take effect on all users (including the table owner), you are advised to use the (1=1) expression to create this policy.
    5. If the WHEN clause is not specified, the redaction policy is disabled by default. You need to manually specify a WHEN expression for the policy to take effect.
    +
    +
  • column_name

    Specifies the name of the table column to which the redaction policy is applied.

    +
  • function_name

    Specifies the redaction function applied to the specified table column.

    +
  • arguments

    Specifies the list of arguments of the redaction function.

    +

    The system provides three built-in redaction functions: MASK_NONE, MASK_FULL, and MASK_PARTIAL. For details about the function specifications, see Data Redaction Functions. You can also define your own redaction functions, which must comply with the following rules:

    +
    1. In addition to the redaction format, only one column can be specified in the argument list for data redaction.
    2. The return type must be the same as the data type of the redacted column.
    3. The functions can be pushed down.
    4. The functions only implement the formatting for specific data types and do not involve complex association operations with other table objects.
    +

    Built-in redaction functions can cover common redaction scenarios of sensitive information. Therefore, you are advised to use built-in redaction functions to create redaction policies.

    +
    +
+
+

Examples

Create a table object emp as user alice, and insert data into the table.

+
1
+2
CREATE TABLE emp(id int, name varchar(20), salary NUMERIC(10,2));
+INSERT INTO emp VALUES(1, 'July', 1230.10), (2, 'David', 999.99);
+
+ +
+

Create a redaction policy mask_emp for the emp table as user alice to make the salary column invisible to user matu.

+
1
CREATE REDACTION POLICY mask_emp ON emp WHEN(current_user = 'matu') ADD COLUMN salary WITH mask_full(salary);
+
+ +
+

Grant the SELECT permission on the emp table to user matu as user alice.

+
1
GRANT SELECT ON emp TO matu;
+
+ +
+

Switch to user matu.

+
1
SET ROLE matu PASSWORD '{password}';
+
+ +
+

Query the emp table. Data in the salary column has been redacted.

+
1
SELECT * FROM emp;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0169.html b/docs/dws/dev/dws_06_0169.html new file mode 100644 index 00000000..d930d821 --- /dev/null +++ b/docs/dws/dev/dws_06_0169.html @@ -0,0 +1,185 @@ + + +

CREATE ROW LEVEL SECURITY POLICY

+

Function

CREATE ROW LEVEL SECURITY POLICY creates a row-level access control policy for a table.

+

The policy takes effect only after row-level access control is enabled (by running ALTER TABLE... ENABLE ROW LEVEL SECURITY).

+

Currently, row-level access control affects the read (SELECT, UPDATE, DELETE) of data tables and does not affect the write (INSERT and MERGE INTO) of data tables. The table owner or system administrators can create an expression in the USING clause. When the client reads the data table, the database server combines the expressions that meet the condition and applies it to the execution plan in the statement rewriting phase of a query. For each tuple in a data table, if the expression returns TRUE, the tuple is visible to the current user; if the expression returns FALSE or NULL, the tuple is invisible to the current user.

+

A row-level access control policy name is specific to a table. A data table cannot have row-level access control policies with the same name. Different data tables can have the same row-level access control policy.

+

Row-level access control policies can be applied to specified operations (SELECT, UPDATE, DELETE, and ALL). ALL indicates that SELECT, UPDATE, and DELETE will be affected. For a new row-level access control policy, the default value ALL will be used if you do not specify the operations that will be affected.

+

Row-level access control policies can be applied to a specified user (role) or to all users (PUBLIC). For a new row-level access control policy, the default value PUBLIC will be used if you do not specify the user that will be affected.

+
+

Precautions

  • Row-level access control policies can be defined for row-store tables, row-store partitioned tables, column-store tables, column-store partitioned tables, replication tables, unlogged tables, and hash tables.
  • Row-level access control policies cannot be defined for HDFS tables, foreign tables, and temporary tables.
  • Row-level access control policies cannot be defined for views.
  • A maximum of 100 row-level access control policies cannot be defined for a table.
  • System administrators are not affected by row-level access control policies and can view all data in a table.
  • Tables queried by using SQL statements, views, functions, and stored procedures are affected by row-level access control policies.
  • The type of a column that a row-level access control policy depends on cannot be changed. For example, the following modifications are not supported:
    1
    ALTER TABLE public.all_data ALTER COLUMN role TYPE text;
    +
    + +
    +
+
+

Syntax

1
+2
+3
+4
+5
CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name
+    [ AS { PERMISSIVE | RESTRICTIVE } ]
+    [ FOR { ALL | SELECT | UPDATE | DELETE } ]
+    [ TO { role_name | PUBLIC } [, ...] ]
+    USING ( using_expression )
+
+ +
+
+

Parameter Description

  • policy_name

    Specifies the name of a row-level access control policy to be created. The names of row-level access control policies for a table must be unique.

    +
  • table_name

    Specifies the name of a table to which a row-level access control policy is applied.

    +
  • PERMISSIVE

    Specifies that the row-level access control policy is to be created as a permissive policy. For a given query, all applicable permissive policies are combined using the OR operator. Row-level access control policies are permissive by default.

    +
  • RESTRICTIVE

    Specifies that the row-level access control policy is to be created as a restrictive policy. For a given query, all applicable restrictive policies are combined using the AND operator.

    +

    At least one permissive policy is required to grant access to data records. If only restrictive policies are used, no records will be accessible. When both permissive and restrictive policies are used, a record is accessible only when it passes at least one permissive policy and all restrictive policies.

    +
    +
  • command

    Specifies the SQL operations affected by a row-level access control policy, including ALL, SELECT, UPDATE, and DELETE. If this parameter is not specified, the default value ALL will be used, covering SELECT, UPDATE, and DELETE.

    +

    If command is set to SELECT, only tuple data that meets the condition (the return value of using_expression is TRUE) can be queried. The operations that are affected include SELECT, UPDATE.... RETURNING, and DELETE... RETURNING.

    +

    If command is set to UPDATE, only tuple data that meets the condition (the return value of using_expression is TRUE) can be updated. The operations that are affected include UPDATE, UPDATE ... RETURNING, and SELECT ... FOR UPDATE/SHARE.

    +

    If command is set to DELETE, only tuple data that meets the condition (the return value of using_expression is TRUE) can be deleted. The operations that are affected include DELETE and DELETE ... RETURNING.

    +

    The following table describes the relationship between row-level access control policies and SQL statements.

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Relationship between row-level security policies and SQL statements

    Command

    +

    SELECT/ALL Policy

    +

    UPDATE/ALL Policy

    +

    DELETE/ALL Policy

    +

    SELECT

    +

    Existing row

    +

    No

    +

    No

    +

    SELECT FOR UPDATE/SHARE

    +

    Existing row

    +

    Existing row

    +

    No

    +

    UPDATE

    +

    No

    +

    Existing row

    +

    No

    +

    UPDATE RETURNING

    +

    Existing row

    +

    Existing row

    +

    No

    +

    DELETE

    +

    No

    +

    No

    +

    Existing row

    +

    DELETE RETURNING

    +

    Existing row

    +

    No

    +

    Existing row

    +
    +
    +
  • role_name

    Specifies database users affected by a row-level access control policy.

    +

    If this parameter is not specified, the default value PUBLIC will be used, indicating that all database users will be affected. You can specify multiple affected database users.

    +

    System administrators are not affected by row access control.

    +
    +
+
+
  • using_expression

    Specifies an expression defined for a row-level access control policy (return type: boolean).

    +

    The expression cannot contain aggregate functions and window functions. In the statement rewriting phase of a query, if row-level access control for a data table is enabled, the expressions that meet the specified conditions will be added to the plan tree. The expression is calculated for each tuple in the data table. For SELECT, UPDATE, and DELETE, row data is visible to the current user only when the return value of the expression is TRUE. If the expression returns FALSE, the tuple is invisible to the current user. In this case, the user cannot view the tuple through the SELECT statement, update the tuple through the UPDATE statement, or delete the tuple through the DELETE statement.

    +
+

Example 1: Create a row-level access control policy that the current user can only view its own data.

  1. Create users alice and bob.
    CREATE ROLE alice PASSWORD '{password1}'
    +CREATE ROLE bob PASSWORD '{password2}';
    +
  2. Create the data table public.all_data.
    CREATE TABLE public.all_data(id int, role varchar(100), data varchar(100));
    +
  3. Insert data into the table.
    INSERT INTO all_data VALUES(1, 'alice', 'alice data');
    +INSERT INTO all_data VALUES(2, 'bob', 'bob data');
    +INSERT INTO all_data VALUES(3, 'peter', 'peter data');
    +
  4. Grant the read permission for the all_data table to users alice and bob.
    GRANT SELECT ON all_data TO alice, bob;
    +
  5. Enable row-level access control.
    1
    ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;
    +
    + +
    +
  6. Create a row-level access control policy to specify that the current user can view only its own data.
    CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role = CURRENT_USER);
    +
  7. View information about the all_data table.
    \d+ all_data
    +                               Table "public.all_data"
    + Column |          Type          | Modifiers | Storage  | Stats target | Description
    +--------+------------------------+-----------+----------+--------------+-------------
    + id     | integer                |           | plain    |              |
    + role   | character varying(100) |           | extended |              |
    + data   | character varying(100) |           | extended |              |
    +Row Level Security Policies:
    +    POLICY "all_data_rls"
    +      USING (((role)::name = "current_user"()))
    +Has OIDs: no
    +Distribute By: HASH(id)
    +Location Nodes: ALL DATANODES
    +Options: orientation=row, compression=no, enable_rowsecurity=true
    +
  8. Run SELECT.
    SELECT * FROM all_data;
    + id | role  |    data
    +----+-------+------------
    +  1 | alice | alice data
    +  2 | bob   | bob data
    +  3 | peter | peter data
    +(3 rows)
    +
    +EXPLAIN(COSTS OFF) SELECT * FROM all_data;
    +         QUERY PLAN
    +----------------------------
    + Streaming (type: GATHER)
    +   Node/s: All datanodes
    +   ->  Seq Scan on all_data
    +(3 rows)
    +
  9. Switch to the alice user.
    set role alice password '{password1}';
    +
  10. Perform the SELECT operation.
    SELECT * FROM all_data;
    + id | role  |    data
    +----+-------+------------
    +  1 | alice | alice data
    +(1 row)
    +
    +EXPLAIN(COSTS OFF) SELECT * FROM all_data;
    +                           QUERY PLAN
    +----------------------------------------------------------------
    + Streaming (type: GATHER)
    +   Node/s: All datanodes
    +   ->  Seq Scan on all_data
    +         Filter: ((role)::name = 'alice'::name)
    + Notice: This query is influenced by row level security feature
    +(5 rows)
    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0170.html b/docs/dws/dev/dws_06_0170.html new file mode 100644 index 00000000..161ae862 --- /dev/null +++ b/docs/dws/dev/dws_06_0170.html @@ -0,0 +1,145 @@ + + +

CREATE PROCEDURE

+

Function

CREATE PROCEDURE creates a stored procedure.

+
+

Precautions

  • The precision values (if any) of the parameters or return values of a stored procedure are not checked.
  • When creating a stored procedure, you are advised to display the specified schema for the operations on the table objects in the stored procedure definition. Otherwise, the stored procedure may fail to be executed.
  • current_schema and search_path specified by SET during stored procedure creation are invalid. search_path and current_schema before and after function execution should be the same.
  • If a stored procedure has output parameters, the SELECT statement uses the default values of the output parameters when calling the procedure. When the CALL statement calls the stored procedure, it requires that the output parameter values are adapted to Oracle. When the CALL statement calls a non-overloaded function, output parameters must be specified. When the CALL statement calls an overloaded PACKAGE function, it can use the default values of the output parameters. For details, see examples in CALL.
  • A stored procedure with the PACKAGE attribute can use overloaded functions.
  • When you create a procedure, you cannot insert aggregate functions or other functions out of the average function.
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
CREATE [ OR REPLACE ] PROCEDURE procedure_name
+    [ ( {[ argmode ] [ argname ] argtype [ { DEFAULT | := | = } expression ]}[,...]) ]
+    [
+       { IMMUTABLE | STABLE | VOLATILE }
+       | { SHIPPABLE | NOT SHIPPABLE }
+       | {PACKAGE}
+       | [ NOT ] LEAKPROOF
+       | { CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
+       | {[ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | AUTHID DEFINER | AUTHID CURRENT_USER}
+       | COST execution_cost
+       | ROWS result_rows
+       | SET configuration_parameter { [ TO | = ] value | FROM CURRENT }
+    ][ ... ]
+ { IS | AS } 
+plsql_body 
+/
+
+ +
+
+

Parameter Description

  • OR REPLACE

    Replaces the original definition when two stored procedures are with the same name.

    +
  • procedure_name

    Specifies the name of the stored procedure that is created (optionally with schema names).

    +

    Value range: a string. It must comply with the naming convention.

    +
  • argmode

    Specifies the mode of an argument.

    +

    VARIADIC specifies arguments of array types.

    +
    +

    Value range: IN, OUT, IN OUT, INOUT, and VARIADIC. The default value is IN. Only the argument of OUT mode can be followed by VARIADIC. The parameters of OUT and INOUT cannot be used in procedure definition of RETURNS TABLE.

    +
  • argname

    Specifies the name of an argument.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • argtype

    Specifies the type of a parameter.

    +

    Value range: A valid data type.

    +
  • IMMUTABLE, STABLE, ...

    Specifies a constraint. Parameters here are similar to those of CREATE FUNCTION. For details, see 5.18.17.13-CREATE FUNCTION.

    +
  • plsql_body

    Indicates the PL/SQL stored procedure body.

    +

    When you create a user, or perform other operations requiring password input in a stored procedure, the system catalog and csv log records the unencrypted password. Therefore, you are advised not to perform such operations in the stored procedure.

    +
    +
+

No specific order is applied to argument_name and argmode. The following order is advised: argument_name, argmode, and argument_type.

+
+
+

Examples

Create a stored procedure.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE OR REPLACE PROCEDURE prc_add
+(
+    param1    IN   INTEGER,
+    param2    IN OUT  INTEGER
+)
+AS
+BEGIN
+   param2:= param1 + param2;
+   dbms_output.put_line('result is: '||to_char(param2));
+END;
+/
+
+ +
+

Call the stored procedure.

+
1
SELECT prc_add(2,3);
+
+ +
+

Create a stored procedure whose parameter type is VARIADIC.

+
1
+2
+3
+4
+5
+6
CREATE OR REPLACE PROCEDURE pro_variadic (var1 VARCHAR2(10) DEFAULT 'hello!',var4 VARIADIC int4[])
+AS
+BEGIN
+    dbms_output.put_line(var1);
+END;
+/
+
+ +
+

Execute the stored procedure.

+
1
SELECT pro_variadic(var1=>'hello', VARIADIC var4=> array[1,2,3,4]);
+
+ +
+

Create a stored procedure with the PACKAGE attribute.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
create or replace procedure package_func_overload(col int, col2 out varchar)
+package
+as
+declare
+    col_type text;
+begin
+     col2 := '122';
+         dbms_output.put_line('two varchar parameters ' || col2);
+end;
+/
+
+ +
+

+
+

Helpful Links

DROP PROCEDURE, CALL

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0171.html b/docs/dws/dev/dws_06_0171.html new file mode 100644 index 00000000..206fff16 --- /dev/null +++ b/docs/dws/dev/dws_06_0171.html @@ -0,0 +1,82 @@ + + +

CREATE RESOURCE POOL

+

Function

CREATE RESOURCE POOL creates a resource pool and specifies the Cgroup for the resource pool.

+
+

Precautions

As long as the current user has CREATE permission, it can create a resource pool.

+
+

Syntax

1
+2
CREATE RESOURCE POOL pool_name
+    [WITH ({MEM_PERCENT=pct | CONTROL_GROUP="group_name" | ACTIVE_STATEMENTS=stmt | MAX_DOP = dop | MEMORY_LIMIT='memory_size' | io_limits=io_limits | io_priority='io_priority' | nodegroup="nodegroupname" | is_foreign=boolean }[, ... ])];
+
+ +
+
+

Parameter Description

  • pool_name

    Specifies the name of a resource pool.

    +

    The name of a resource pool cannot be same as that of an existing resource pool.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • group_name

    Specifies the name of a Cgroup.

    +
    • You can use either double quotation marks ("") or single quotation mark ('') in the syntax when setting the name of a Cgroup.
    • The value of group_name is case-sensitive.
    • If group_name is not specified, the string "Medium" will be used by default in the syntax, indicating the Medium Timeshare Cgroup under DefaultClass.
    • If an administrator specifies a Workload Cgroup under Class, for example, control_group set to class1:workload1, the resource pool will be associated with the workload1 Cgroup under class1. The level of Workload can also be specified. For example, control_group is set to class1:workload1:1.
    • If a database user specifies the Timeshare string (Rush, High, Medium, or Low) in the syntax, for example, if control_group is set to High, the resource pool will be associated with the High Timeshare Cgroup under DefaultClass.
    • In multi-tenant scenarios, the Cgroup associated with a group resource pool is a Class Cgroup, and that associated with a service resource pool is a Workload Cgroup. Additionally, switching Cgroups between different resource pools is not allowed.
    +
    +

    Value range: a string. It must comply with the rule in the description, specifying an existing Cgroup.

    +
  • stmt

    Specifies the maximum number of statements that can be concurrently executed in a resource pool.

    +

    Value range: Numeric data ranging from -1 to INT_MAX.

    +
  • dop

    This is a reserved parameter.

    +

    Value range: Numeric data ranging from 1 to INT_MAX.

    +
  • memory_size

    Specifies the maximum storage for a resource pool.

    +

    Value range: a string, from 1KB to 2047GB.

    +
  • mem_percent

    Specifies the proportion of available resource pool memory to the total memory or group user memory.

    +

    In multi-tenant scenarios, mem_percent of group users or service users ranges from 1 to 100. The default value is 20.

    +

    In common scenarios, mem_percent of common users ranges from 0 to 100. The default value is 0.

    +

    When both of mem_percent and memory_limit are specified, only mem_percent takes effect.

    +
    +
  • io_limits

    Specifies the upper limit of IOPS in a resource pool.

    +

    The IOPS is counted by ones for column storage and by 10 thousands for row storage.

    +
  • io_priority

    Specifies the I/O priority for jobs that consume many I/O resources. It takes effect when the I/O usage reaches 90%.

    +

    There are three priorities: Low, Medium, and High. If you do not want to control I/O resources, use the default value None.

    +

    The settings of io_limits and io_priority are valid only for complex jobs, such as batch import (using INSERT INTO SELECT, COPY FROM, or CREATE TABLE AS), complex queries involving over 500 MB data on each DN, and VACUUM FULL.

    +
    +
  • nodegroup

    Specifies the name of a logical cluster where the resource pool is. The logical cluster must already exist.

    +

    If the logical cluster name contains uppercase letters or special characters or begins with a digit, enclose the name with double quotation marks in SQL statements.

    +
  • is_foreign

    In logical cluster mode, lets the current resource pool to control the resources of common users that are not associated with the logical cluster specified by nodegroup.

    +
    • nodegroup must specify an existing logical cluster, and cannot be elastic_group or the default Node Group (group_version1), which is generated during cluster installation.
    • If is_foreign is set to true, the resource pool cannot be associated with users. That is, CREATE USER... RESOURCE POOL cannot be used to configure resource pools for users. The resource pool automatically checks whether the users are associated with its logical cluster. If they are not, they will be controlled by the resource pool when performing operations on DNs in the logical cluster.
    +
    +
+
+

Examples

This example assumes that Cgroups have been created by users in advance.

+

Create a default resource pool, and associate it with the Medium Timeshare Cgroup under Workload under DefaultClass.

+
1
CREATE RESOURCE POOL pool1;
+
+ +
+

Create a resource pool, and associate it with the High Timeshare Cgroup under Workload under DefaultClass.

+
1
CREATE RESOURCE POOL pool2 WITH (CONTROL_GROUP="High");
+
+ +
+

Create a resource pool, and associate it with the Low Timeshare Cgroup under Workload under class1.

+
1
CREATE RESOURCE POOL pool3 WITH (CONTROL_GROUP="class1:Low");
+
+ +
+

Create a resource pool, and associate it with the wg1 Workload Cgroup under class1.

+
1
CREATE RESOURCE POOL pool4 WITH (CONTROL_GROUP="class1:wg1");
+
+ +
+

Create a resource pool, and associate it with the wg2 Workload Cgroup under class1.

+
1
CREATE RESOURCE POOL pool5 WITH (CONTROL_GROUP="class1:wg2:3");
+
+ +
+

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0172.html b/docs/dws/dev/dws_06_0172.html new file mode 100644 index 00000000..b51cb462 --- /dev/null +++ b/docs/dws/dev/dws_06_0172.html @@ -0,0 +1,191 @@ + + +

CREATE ROLE

+

Function

Create a role.

+

A role is an entity that has own database objects and permissions. In different environments, a role can be considered a user, a group, or both.

+
+

Important Notes

  • CREATE ROLE adds a role to a database. The role does not have the login permission.
  • Only the user who has the CREATE ROLE permission or a system administrator is allowed to create roles.
+
+

Syntax

1
CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE };
+
+ +
+
The syntax of role information configuration clause option is as follows:
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
{SYSADMIN | NOSYSADMIN}
+    | {AUDITADMIN | NOAUDITADMIN}
+    | {CREATEDB | NOCREATEDB}
+    | {USEFT | NOUSEFT}
+    | {CREATEROLE | NOCREATEROLE}
+    | {INHERIT | NOINHERIT}
+    | {LOGIN | NOLOGIN}
+    | {REPLICATION | NOREPLICATION}
+    | {INDEPENDENT | NOINDEPENDENT}
+    | {VCADMIN | NOVCADMIN}
+    | CONNECTION LIMIT connlimit
+    | VALID BEGIN 'timestamp'
+    | VALID UNTIL 'timestamp'
+    | RESOURCE POOL 'respool'
+    | USER GROUP 'groupuser'
+    | PERM SPACE 'spacelimit'
+    | TEMP SPACE 'tmpspacelimit'
+    | SPILL SPACE 'spillspacelimit'
+    | NODE GROUP logic_cluster_name
+    | IN ROLE role_name [, ...]
+    | IN GROUP role_name [, ...]
+    | ROLE role_name [, ...]
+    | ADMIN rol e_name [, ...]
+    | USER role_name [, ...]
+    | SYSID uid
+    | DEFAULT TABLESPACE tablespace_name
+    | PROFILE DEFAULT
+    | PROFILE profile_name
+    | PGUSER
+    | AUTHINFO 'authinfo'
+    | PASSWORD EXPIRATOIN period
+
+ +
+
+
+

Parameter Description

  • role_name

    Role name

    +

    Value range: a string. It must comply with the naming convention. and can contain a maximum of 63 characters.

    +
  • password

    Specifies the login password.

    +

    A password must:

    +
    • Contain at least eight characters. This is the default length.
    • Differ from the user name or the user name spelled backwards.
    • Contains at least three of the following four character types: uppercase letters, lowercase letters, digits, and special characters, including: ~!@#$%^&*()-_=+\|[{}];:,<.>/?. If you use characters other than the four types, a warning is displayed, but you can still create the password.
    +

    Value range: a string

    +
  • DISABLE

    By default, you can change your password unless it is disabled. Use this parameter to disable the password of a user. After the password of a user is disabled, the password will be deleted from the system. The user can connect to the database only through external authentication, for example, IAM authentication, Kerberos authentication, or LDAP authentication. Only administrators can enable or disable a password. Common users cannot disable the password of an initial user. To enable a password, run ALTER USER and specify the password.

    +
  • ENCRYPTED | UNENCRYPTED

    Determines the password stored in the system is encrypted or unencrypted. (If neither is specified, the password status is determined by password_encryption_type.) According to product security requirements, the password must be stored encrypted. Therefore, UNENCRYPTED is forbidden in GaussDB(DWS). If the presented password string is already in SHA256-encrypted format, then it is stored encrypted as-is, regardless of whether ENCRYPTED or UNENCRYPTED is specified (since the system cannot decrypt the specified encrypted password string). This allows reloading of encrypted passwords during dump/restore.

    +
  • SYSADMIN | NOSYSADMIN

    Determines whether a new role is a system administrator. Roles having the SYSADMIN attribute have the highest permission.

    +

    Value range: If not specified, NOSYSADMIN is the default.

    +
  • AUDITADMIN | NOAUDITADMIN

    Determines whether a role has the audit and management attributes.

    +

    If not specified, NOAUDITADMIN is the default.

    +
  • CREATEDB | NOCREATEDB

    Defines a role's ability to create databases.

    +

    A new role does not have the permission to create databases.

    +

    Value range: If not specified, NOCREATEDB is the default.

    +
  • USEFT | NOUSEFT

    Determines whether a new role can perform operations on foreign tables, such as creating, deleting, modifying, and reading/witting foreign tables.

    +

    A new role does not have permissions for these operations.

    +

    The default value is NOUSEFT.

    +
  • CREATEROLE | NOCREATEROLE

    Determines whether a role will be permitted to create new roles (that is, execute CREATE ROLE and CREATE USER). A role with the CREATEROLE permission can also modify and delete other roles.

    +

    Value range: If not specified, NOCREATEROLE is the default.

    +
  • INHERIT | NOINHERIT

    Determines whether a role "inherits" the permissions of roles it is a member of. You are not advised to execute them.

    +
  • LOGIN | NOLOGIN

    Determines whether a role is allowed to log in to a database. A role having the LOGIN attribute can be thought of as a user.

    +

    Value range: If not specified, NOLOGIN is the default.

    +
  • REPLICATION | NOREPLICATION

    Determines whether a role is allowed to initiate streaming replication or put the system in and out of backup mode. A role having the REPLICATION attribute is a highly privileged role, and should only be used on roles used for replication.

    +

    If not specified, NOREPLICATION is the default.

    +
  • INDEPENDENT | NOINDEPENDENT

    Defines private, independent roles. For a role with the INDEPENDENT attribute, administrators' rights to control and access this role are separated. Specific rules are as follows:

    +
    • Administrators have no rights to add, delete, query, modify, copy, or authorize the corresponding table objects without the authorization from the INDEPENDENT role.
    • Administrators have no rights to modify the inheritance relationship of the INDEPENDENT role without the authorization from this role.
    • Administrators have no rights to modify the owner of the table objects for the INDEPENDENT role.
    • Administrators have no rights to delete the INDEPENDENT attribute of the INDEPENDENT role.
    • Administrators have no rights to change the database password of the INDEPENDENT role. The INDEPENDENT role must manage its own password, which cannot be reset if lost.
    • The SYSADMIN attribute of a user cannot be changed to the INDEPENDENT attribute.
    +
  • VCADMIN | NOVCADMIN

    Defines the role of a logical cluster administrator. A logical cluster administrator has the following more permissions than common users:

    +
    • Create, modify, and delete resource pools in the associated logical cluster.
    • Grant the access permission for the associated logical cluster to other users or roles, or reclaim the access permission from those users or roles.
    +
  • CONNECTION LIMIT

    Indicates how many concurrent connections the role can make.

    +

    Value range: Integer, >=-1. The default value is -1, which means unlimited.

    +

    To ensure the proper running of a cluster, the minimum value of CONNECTION LIMIT is the number of CNs in the cluster, because when a cluster runs ANALYZE on a CN, other CNs will connect to the running CN for metadata synchronization. For example, if there are three CNs in the cluster, set CONNECTION LIMIT to 3 or a greater value.

    +
    +
  • VALID BEGIN

    Sets a date and time when the role's password becomes valid. If this clause is omitted, the password will be valid for all time.

    +
  • VALID UNTIL

    Sets a date and time after which the role's password is no longer valid. If this clause is omitted, the password will be valid for all time.

    +
  • RESOURCE POOL

    Sets the name of resource pool used by the role, and the name belongs to the system catalog: pg_resource_pool.

    +
  • USER GROUP 'groupuser'

    Creates a sub-user. For details, see "Resource Load Management > Tenant Management > User Level Management" in the Developer Guide.

    +
  • PERM SPACE

    Sets the storage space of the user permanent table.

    +
  • TEMP SPACE

    Sets the storage space of the user temporary table.

    +
  • SPILL SPACE

    Sets the operator disk flushing space of the user.

    +
  • NODE GROUP

    Specifies the name of the logical cluster associated with a user. If the name contains uppercase characters or special characters, enclose the name with double quotation marks.

    +
  • IN ROLE

    Lists one or more existing roles whose permissions will be inherited by a new role. You are not advised to execute them.

    +
  • IN GROUP

    Indicates an obsolete spelling of IN ROLE. You are not advised to execute them.

    +
  • ROLE

    Lists one or more existing roles which are automatically added as members of the new role.

    +
  • ADMIN

    Is similar to ROLE. However, the roles after ADMIN can grant rights of new roles to other roles.

    +
  • USER

    Indicates an obsolete spelling of the ROLE clause.

    +
  • SYSID

    The SYSID clause is ignored.

    +
  • DEFAULT TABLESPACE

    The DEFAULT TABLESPACE clause is ignored.

    +
  • PROFILE

    The PROFILE clause is ignored.

    +
  • PGUSER

    This attribute is used to be compatible with open-source Postgres communication. An open-source Postgres client interface (Postgres 9.2.19 is recommended) can use a database user having this attribute to connect to the database.

    +

    This attribute only ensures compatibility with the connection process. Incompatibility caused by kernel differences between this product and Postgres cannot be solved using this attribute.

    +

    Users having the PGUSER attribute are authenticated in a way different from other users. Error information reported by the open-source client may cause the attribute to be enumerated. Therefore, you are advised to use a client of this product. Example:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    # normaluser is a user that does not have the PGUSER attribute. psql is the Postgres client tool.
    +pg@MPPDB04:~> psql -d postgres -p 8000 -h 10.11.12.13 -U normaluser
    +psql: authentication method 10 not supported
    +
    +# pguser is a user having the PGUSER attribute.
    +pg@MPPDB04:~> psql -d postgres -p 8000 -h 10.11.12.13 -U pguser
    +Password for user pguser:
    +
    + +
    +
    +
+
+
  • AUTHINFO 'authinfo'

    This attribute is used to specify the role authentication type. authinfo is the description character string, which is case sensitive. Only the LDAP type is supported. Its description character string is ldap. LDAP authentication is an external authentication mode. Therefore, PASSWORD DISABLE must be specified.

    +
    • Additional information about LDAP authentication can be added to authinfo, for example, fulluser in LDAP authentication, which is equivalent to ldapprefix+username+ldapsuffix. If the content of authinfo is ldap, the role authentication type is LDAP. In this case, the ldapprefix and ldapsuffix information is provided by the corresponding record in the pg_hba.conf file.
    • When executing the ALTER ROLE command, users are not allowed to change the authentication type. Only LDAP users are allowed to modify LDAP attributes.
    +
    +
+
  • PASSWORD EXPIRATOIN period

    Number of days before the login password of the role expires. The user needs to change the password in time before the login password expires. If the login password expires, the user cannot log in to the system. In this case, the user needs to ask the administrator to set a new login password.

    +

    Value range: an integer greater than or equal to -1. The default value is -1, indicating that the password does not expire. The value 0 indicates that the password expires immediately.

    +
+

Examples

Create a role manager.

+
1
CREATE ROLE manager IDENTIFIED BY '{password}';
+
+ +
+

Create a role with a validity from January 1, 2015 to January 1, 2026.

+
1
CREATE ROLE miriam WITH LOGIN PASSWORD '{password}' VALID BEGIN '2015-01-01' VALID UNTIL '2026-01-01';
+
+ +
+

Create a role. The authentication type is LDAP. Other LDAP authentication information is provided by pg_hba.conf.

+
1
CREATE ROLE role1 WITH LOGIN AUTHINFO 'ldap' PASSWORD DISABLE;
+
+ +
+

Create a role. The authentication type is LDAP. The fulluser information for LDAP authentication is specified during the role creation. In this case, LDAP is case sensitive and must be enclosed in single quotation marks.

+
1
CREATE ROLE role2 WITH LOGIN AUTHINFO 'ldapcn=role2,cn=user,dc=lework,dc=com' PASSWORD DISABLE;
+
+ +
+

Create a role and set the validity period of the login password to 30 days.

+
1
CREATE ROLE role3 WITH LOGIN PASSWORD '{password}' PASSWORD EXPIRATION 30;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0173.html b/docs/dws/dev/dws_06_0173.html new file mode 100644 index 00000000..0af43de1 --- /dev/null +++ b/docs/dws/dev/dws_06_0173.html @@ -0,0 +1,51 @@ + + +

CREATE SCHEMA

+

Function

CREATE SCHEMA creates a schema.

+

Named objects are accessed either by "qualifying" their names with the schema name as a prefix, or by setting a search path that includes the desired schema(s). When creating named objects, you can also use the schema name as a prefix.

+

Optionally, CREATE SCHEMA can include sub-commands to create objects within the new schema. The sub-commands are treated essentially the same as separate commands issued after creating the schema, If the AUTHORIZATION clause is used, all the created objects are owned by this user.

+
+

Precautions

  • As long as the current user has the CREATE permission, the user can create a schema.
  • The owner of an object created by a system administrator in a schema with the same name as a common user is the common user, not the system administrator.
+
+

Syntax

  • Create a schema based on a specified name.
    1
    +2
    CREATE SCHEMA schema_name 
    +    [ AUTHORIZATION user_name ] [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ];
    +
    + +
    +
  • Create a schema based on a user name.
    1
    CREATE SCHEMA AUTHORIZATION user_name [ WITH PERM SPACE 'space_limit'] [ schema_element [ ... ] ];
    +
    + +
    +
+
+

Parameter Description

  • schema_name

    Indicates the name of the schema to be created.

    +

    The name must be unique,

    +

    and cannot start with pg_.

    +
    +

    Value range: a string. It must comply with the naming convention rule.

    +
  • AUTHORIZATION user_name

    Indicates the name of the user who will own this schema. If schema_name is not specified, user_name will be used as the schema name. In this case, user_name can only be a role name.

    +

    Value range: An existing user name/role.

    +
  • WITH PERM SPACE 'space_limit'

    Indicates the storage upper limit of the permanent table in the specified schema. If space_limit is not specified, the space is not limited.

    +

    Value range: A string consists of an integer and unit. The unit can be K/M/G/T/P currently. The unit of parsed value is K and cannot exceed the range that can be expressed in 64 bits, which is 1 KB to 9007199254740991 KB.

    +
  • schema_element

    Indicates an SQL statement defining an object to be created within the schema. Currently, only CREATE TABLE, CREATE VIEW, CREATE INDEX, CREATE PARTITION, and GRANT are accepted as clauses within CREATE SCHEMA.

    +

    Objects created by sub-commands are owned by the user specified by AUTHORIZATION.

    +
+

If objects in the schema on the current search path are with the same name, specify the schemas different objects are in. You can run the SHOW SEARCH_PATH command to check the schemas on the current search path.

+
+
+

Examples

Create a schema named role1 for the role1 role. The owner of the films and winners tables created by the clause is role1.

+
CREATE SCHEMA AUTHORIZATION role1
+CREATE TABLE films (title text, release date, awards text[])      
+CREATE VIEW winners AS         
+SELECT title, release FROM films WHERE awards IS NOT NULL;
+
+

Helpful Links

ALTER SCHEMA, DROP SCHEMA

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0174.html b/docs/dws/dev/dws_06_0174.html new file mode 100644 index 00000000..73ce3400 --- /dev/null +++ b/docs/dws/dev/dws_06_0174.html @@ -0,0 +1,147 @@ + + +

CREATE SEQUENCE

+

Function

CREATE SEQUENCE adds a sequence to the current database. The owner of a sequence is the user who creates the sequence.

+
+

Precautions

  • A sequence is a special table that stores arithmetic sequence. Such a table is controlled by DBMS. It has no actual meaning and is usually used to generate unique identifiers for rows or tables.
  • If a schema name is given, the sequence is created in the specified schema; otherwise, it is created in the current schema. The sequence name must be different from the names of other sequences, tables, indexes, views in the same schema.
  • After the sequence is created, functions NEXTVAL() and generate_series(1,N) insert data to the table. Make sure that the number of times for invoking NEXTVAL is greater than or equal to N+1. Otherwise, errors will be reported because the number of times for invoking the function generate_series() is N+1.
  • A sequence cannot be created in the template1 database.
+
+

Syntax

1
+2
+3
+4
CREATE SEQUENCE name [ INCREMENT [ BY ] increment ]
+    [ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE] 
+    [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ] 
+    [ OWNED BY { table_name.column_name | NONE } ];
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of a sequence to be created.

    +

    Value range: The value can contain only lowercase letters, uppercase letters, special characters #_$, and digits.

    +
  • increment

    Specifies the step for a sequence. A positive generates an ascending sequence, and a negative generates a decreasing sequence.

    +

    The default value is 1.

    +
  • MINVALUE minvalue | NO MINVALUE| NOMINVALUE

    Specifies the minimum value of a sequence. If MINVALUE is not declared, or NO MINVALUE is declared, the default value of the ascending sequence is 1, and that of the descending sequence is -263-1. NOMINVALUE is equivalent to NO MINVALUE.

    +
  • MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE

    Specifies the maximum value of a sequence. If MAXVALUE is not declared or NO MAXVALUE is declared, the default value of the ascending sequence is 263-1, and that of the descending sequence is -1. NOMAXVALUE is equivalent to NO MAXVALUE.

    +
  • start

    Specifies the start value of the sequence. The default value for ascending sequences is minvalue and for descending sequences maxvalue.

    +
  • cache

    Specifies the number of sequence numbers stored in the memory for quick access. Within a cache period, the CN does not request a sequence number from the GTM. Instead, the CN uses the sequence number that is locally applied for in advance.

    +

    Default value 1 indicates that one value can be generated each time.

    +
    • It is not recommended that cache and maxvalue or minvalue be defined at the same time. The continuity of sequences cannot be ensured after cache is defined because unacknowledged sequences may be generated, causing waste of sequence number segments.
    • You are advised not to set a large value for cache (less than 100000000). Otherwise, it takes a long time to cache the sequence number (the first NEXTVAL in each cache period). Set a proper value for cache based on services to ensure quick access without wasting sequence numbers.
    +
    +
  • CYCLE

    Used to ensure that sequences can recycle after the number of sequences reaches maxvalue or minvalue.

    +

    If you declare NO CYCLE, any invocation of nextval would return an error after the sequence reaches its maximum value.

    +

    NOCYCLE is equivalent to NO CYCLE.

    +

    The default value is NO CYCLE.

    +

    If the sequence is defined as CYCLE, the sequence uniqueness cannot be ensured.

    +
  • OWNED BY-

    Associates a sequence with a specified column included in a table. In this way, the sequence will be deleted when you delete its associated field or the table where the field belongs. The associated table and sequence must be owned by the same user and in the same schema. OWNED BY only establishes the association between a table column and the sequence. The sequence is not created for this column.

    +

    If the default value is OWNED BY NONE, indicating that such association does not exist.

    +

    You are not advised to use the sequence created using OWNED BY in other tables. If multiple tables need to share a sequence, the sequence must not belong to a specific table.

    +
    +
+
+

Examples

Create an ascending sequence named serial, which starts from 101:

+
1
+2
+3
CREATE SEQUENCE serial
+ START 101
+ CACHE 20;
+
+ +
+

Select the next number from the sequence:

+
1
+2
+3
+4
SELECT nextval('serial');
+ nextval 
+ ---------
+      101
+
+ +
+

Select the next number from the sequence:

+
1
+2
+3
+4
SELECT nextval('serial');
+ nextval 
+ ---------
+      102
+
+ +
+

Create a sequence associated with the table:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
CREATE TABLE customer_address
+(
+    ca_address_sk             integer               not null,
+    ca_address_id             char(16)              not null,
+    ca_street_number          char(10)                      ,
+    ca_street_name            varchar(60)                   ,
+    ca_street_type            char(15)                      ,
+    ca_suite_number           char(10)                      ,
+    ca_city                   varchar(60)                   ,
+    ca_county                 varchar(30)                   ,
+    ca_state                  char(2)                       ,
+    ca_zip                    char(10)                      ,
+    ca_country                varchar(20)                   ,
+    ca_gmt_offset             decimal(5,2)                  ,
+    ca_location_type          char(20)                     
+) ;
+
+CREATE SEQUENCE serial1
+ START 101
+ CACHE 20
+OWNED BY customer_address.ca_address_sk;
+
+ +
+

Use SERIAL to create a serial table serial_table for primary key auto-increment.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE TABLE serial_table(a int, b serial);
+INSERT INTO serial_table (a) VALUES (1),(2),(3);
+SELECT * FROM serial_table ORDER BY b;
+ a | b
+---+---
+ 1 | 1
+ 2 | 2
+ 3 | 3
+(3 rows)
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0175.html b/docs/dws/dev/dws_06_0175.html new file mode 100644 index 00000000..5473099f --- /dev/null +++ b/docs/dws/dev/dws_06_0175.html @@ -0,0 +1,130 @@ + + +

CREATE SERVER

+

Function

CREATE SERVER creates an external server.

+

An external server stores information of HDFS clusters, OBS servers, DLI connections, or other homogeneous clusters.

+
+

Precautions

By default, only the system administrator can create a foreign server. Otherwise, creating a server requires permissions on the foreign data wrapper being used. Use the following syntax to grant permissions:

+
1
GRANT USAGE ON FOREIGN DATA WRAPPER fdw_name TO username;
+
+ +
+

fdw_name is the name of the foreign data wrapper, and username is the username of creating SERVER.

+
+

Syntax

1
+2
+3
CREATE SERVER server_name 
+    FOREIGN DATA WRAPPER fdw_name
+    OPTIONS ( { option_name ' value ' } [, ...] ) ;
+
+ +
+
+

Parameter Description

  • server_name

    Name of the foreign server to be created. The server name must be unique in a database.

    +

    Value range: The length must be less than or equal to 63.

    +
  • FOREIGN DATA WRAPPER fdw_name

    Specifies the name of the foreign data wrapper.

    +

    Value range: fdw_name indicates the data wrapper created by the system in the initial phase of the database. Currently, fdw_name can be hdfs_fdw or dfs_fdw for the HDFS cluster, and can be gc_fdw for other homogeneous clusters.

    +
  • OPTIONS ( { option_name ' value ' } [, ...] )

    Specifies the parameters for the server. The detailed parameter description is as follows:

    +
    • address

      Specifies the IP address of the OBS service endpoint or HDFS cluster.

      +

      OBS: address is the endpoint of OBS.

      +

      HDFS: Specifies the IP address and port number of a NameNode (metadata node) in the HDFS cluster, or the IP address and port number of a CN in other homogeneous clusters.

      +

      HDFS NameNodes are deployed in primary/secondary mode for HA. Add the addresses of the primary and secondary NameNodes to address. When accessing HDFS, GaussDB(DWS) dynamically searches for the active NameNode.

      +

      address option must exist.

      +

      If the server type is DLI, the address is the OBS address stored on DLI.

      +
      +
    • hdfscfgpath

      This parameter is available only when type is HDFS.

      +

      You can set the hdfscfgpath parameter to specify the HDFS configuration file path. GaussDB(DWS) accesses the HDFS cluster based on the connection configuration mode and security mode specified in the HDFS configuration file stored in that path. If the HDFS cluster is connected in non-secure mode, data transmission encryption is not supported.

      +

      If the address option is not specified, the address specified by hdfscfgpath in the configuration file is used by default.

      +
    • encrypt

      Specifies whether data is encrypted. This parameter is available only when type is OBS. The default value is off.

      +

      Value range:

      +
      • on indicates that data is encrypted.
      • off indicates that data is not encrypted.
      +
    • access_key

      Specifies the access key (AK) (obtained by users from the OBS console) used for the OBS access protocol. When you create a foreign table, its AK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is OBS.

      +
    • secret_access_key

      Specifies the secret access key (SK) (obtained by users from the OBS console) used for the OBS access protocol. When you create a foreign table, its SK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is OBS.

      +
    • type

      Specifies the dfs_fdw connection type.

      +

      Value range:

      +
      • OBS indicates that OBS is connected.
      • HDFS indicates that HDFS is connected.
      • DLI indicates that DLI is connected.
      +
    • dli_address

      Specifies the endpoint of the DLI service. This parameter is available only when type is DLI.

      +
    • dli_access_key

      Specifies the access key (AK) (obtained by users from the DLI console) used for the DLI access protocol. When you create a foreign table, its AK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is DLI.

      +
    • dli_secret_access_key

      Specifies the secret access key (SK) (obtained by users from the DLI console) used for the DLI access protocol. When you create a foreign table, its SK value is encrypted and saved to the metadata table of the database. This parameter is available only when type is DLI.

      +
    • dbname

      Specifies the database name of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +
    • username

      Specifies the username of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +
    • password

      Specifies the user password of a remote cluster to be connected. This parameter is used for collaborative analysis.

      +

      When an on-premises cluster is migrated to the cloud, the password in the server configuration exported from the on-premises cluster is in ciphertext. The encryption and decryption keys of the on-premises cluster are different from those of the cloud cluster. Therefore, if CREATE SERVER is executed on the cloud cluster, the execution fails and a decryption failure error is reported. In this case, you need to manually change the password in CREATE SERVER to a plaintext password.

      +
      +
    +
+
+

Examples

Create the hdfs_server server, in which hdfs_fdw is the built-in foreign data wrapper.

+
1
+2
+3
+4
+5
CREATE SERVER hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS 
+   (address '10.10.0.100:25000,10.10.0.101:25000',
+    hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop', 
+    type 'HDFS'
+) ;
+
+ +
+

Create the obs_server server, in which dfs_fdw is the built-in foreign data wrapper.

+
1
+2
+3
+4
+5
+6
CREATE SERVER obs_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
+  address 'obs.xxx.xxx.com', 
+   access_key 'xxxxxxxxx', 
+  secret_access_key 'yyyyyyyyyyyyy', 
+  type 'obs'
+);
+
+ +
+

Create the dli_server server, in which dfs_fdw is the built-in foreign data wrapper.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE SERVER dli_server FOREIGN DATA WRAPPER DFS_FDW OPTIONS ( 
+  address 'obs.xxx.xxx.com', 
+  access_key 'xxxxxxxxx', 
+  secret_access_key 'yyyyyyyyyyyyy', 
+  type 'dli',
+  dli_address 'dli.xxx.xxx.com',
+  dli_access_key 'xxxxxxxxx',
+  dli_secret_access_key 'yyyyyyyyyyyyy'
+);
+
+ +
+

Create another server in the homogeneous cluster, where gc_fdw is the foreign data wrapper in the database.

+
1
+2
+3
+4
+5
+6
CREATE SERVER server_remote FOREIGN DATA WRAPPER GC_FDW OPTIONS 
+   (address '10.10.0.100:25000,10.10.0.101:25000',
+  dbname 'test', 
+  username 'test', 
+  password 'xxxxxxxx'
+);
+
+ +
+

Helpful Links

+

ALTER SERVER DROP SERVER

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0176.html b/docs/dws/dev/dws_06_0176.html new file mode 100644 index 00000000..c481ec4d --- /dev/null +++ b/docs/dws/dev/dws_06_0176.html @@ -0,0 +1,127 @@ + + +

CREATE SYNONYM

+

Function

CREATE SYNONYM is used to create a synonym object. A synonym is an alias of a database object and is used to record the mapping between database object names. You can use synonyms to access associated database objects.

+
+

Precautions

  • The user of a synonym should be its owner.
  • If the schema name is specified, create a synonym in the specified schema. Otherwise create a synonym in the current schema.
  • Database objects that can be accessed using synonyms include tables, views, functions, and stored procedures.
  • To use synonyms, you must have the required permissions on associated objects.
  • The following DML statements support synonyms: SELECT, INSERT, UPDATE, DELETE, EXPLAIN, and CALL.
  • The CREATE SYNONYM statement of an associated function or stored procedure cannot be used in a stored procedure. You are advised to use synonyms existing in the pg_synonym system catalog in the stored procedure.
+
+

Syntax

1
+2
CREATE [ OR REPLACE ] SYNONYM synonym_name 
+    FOR object_name;
+
+ +
+
+

Parameter Description

  • synonym

    Name of a synonym which is created (optionally with schema names)

    +

    Value range: a string. It must comply with the identifier naming rules.

    +
  • object_name

    Name of an object that is associated (optionally with schema names)

    +

    Value range: a string. It must comply with the identifier naming rules.

    +

    object_name can be the name of an object that does not exist.

    +
    +
+
+

Examples

Create schema ot.

+
1
CREATE SCHEMA ot;
+
+ +
+

Create table ot.t1 and its synonym t1.

+
1
+2
CREATE TABLE ot.t1(id int, name varchar2(10)) DISTRIBUTE BY hash(id);
+CREATE OR REPLACE SYNONYM t1 FOR ot.t1;
+
+ +
+

Use synonym t1.

+
1
+2
+3
SELECT * FROM t1;
+INSERT INTO t1 VALUES (1, 'ada'), (2, 'bob');
+UPDATE t1 SET t1.name = 'cici' WHERE t1.id = 2;
+
+ +
+

Create synonym v1 and its associated view ot.v_t1.

+
1
+2
CREATE SYNONYM v1 FOR ot.v_t1;
+CREATE VIEW ot.v_t1 AS SELECT * FROM ot.t1;
+
+ +
+

Use synonym v1.

+
1
SELECT * FROM v1;
+
+ +
+

Create overloaded function ot.add and its synonym add.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
CREATE OR REPLACE FUNCTION ot.add(a integer, b integer) RETURNS integer AS
+$$
+SELECT $1 + $2
+$$
+LANGUAGE sql;
+
+CREATE OR REPLACE FUNCTION ot.add(a decimal(5,2), b decimal(5,2)) RETURNS decimal(5,2) AS
+$$
+SELECT $1 + $2
+$$
+LANGUAGE sql;
+
+CREATE OR REPLACE SYNONYM add FOR ot.add;
+
+ +
+

Use synonym add.

+
1
+2
SELECT add(1,2);
+SELECT add(1.2,2.3);
+
+ +
+

Create stored procedure ot.register and its synonym register.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE PROCEDURE ot.register(n_id integer, n_name varchar2(10))
+SECURITY INVOKER
+AS
+BEGIN
+    INSERT INTO ot.t1 VALUES(n_id, n_name);
+END;
+/
+
+CREATE OR REPLACE SYNONYM register FOR ot.register;
+
+ +
+

Use synonym register to invoke the stored procedure.

+
1
CALL register(3,'mia');
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0177.html b/docs/dws/dev/dws_06_0177.html new file mode 100644 index 00000000..f93e0cae --- /dev/null +++ b/docs/dws/dev/dws_06_0177.html @@ -0,0 +1,1284 @@ + + +

CREATE TABLE

+

Function

CREATE TABLE creates a table in the current database. The table will be owned by the user who created it.

+
+

Precautions

  • For details about the data types supported by column-store tables, see Data Types Supported by Column-Store Tables.
  • It is recommended that the number of column-store and HDFS partitioned tables do not exceed 1000.
  • The primary key constraint and unique constraint in the table must contain a distribution column.
  • If an error occurs during table creation, after it is fixed, the system may fail to delete the empty disk files created before the last automatic clearance. This problem seldom occurs.
  • Column-store tables support the PARTIAL CLUSTER KEY and table-level primary key and unique constraints, but do not support table-level foreign key constraints.
  • Only the NULL, NOT NULL, and DEFAULT constant values can be used as column-store table column constraints.
  • Whether column-store tables support a delta table is specified by the enable_delta parameter. The threshold for storing data into a delta table is specified by the deltarow_threshold parameter.
  • Hot and cold tables support only partitioned column-store tables and depend on available OBS tablespaces.
  • Only the table-level and partition-level tablespaces of a hot or cold table can be set to general tablespaces.
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name 
+    ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
+        | table_constraint
+        | LIKE source_table [ like_option [...] ] }
+        [, ... ])
+    [ WITH ( {storage_parameter = value} [, ... ] ) ]
+    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
+    [ COMPRESS | NOCOMPRESS ]
+    
+    [ DISTRIBUTE BY { REPLICATION | { HASH ( column_name [,...] ) } } ]
+    [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ];
+
+ +
+
  • column_constraint is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    [ CONSTRAINT constraint_name ]
    +{ NOT NULL |
    +  NULL |
    +  CHECK ( expression ) |
    +  DEFAULT default_expr |
    +  UNIQUE index_parameters |
    +  PRIMARY KEY index_parameters }
    +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    +
    + +
    +
+
  • compress_mode of a column is as follows:
    1
    { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS }
    +
    + +
    +
  • table_constraint is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    [ CONSTRAINT constraint_name ]
    +{ CHECK ( expression ) |
    +  UNIQUE ( column_name [, ... ] ) index_parameters |
    +  PRIMARY KEY ( column_name [, ... ] ) index_parameters |
    +  PARTIAL CLUSTER KEY ( column_name [, ... ] ) }
    +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    +
    + +
    +
+
  • like_option is as follows:
    1
    { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | DROPCOLUMNS | ALL }
    +
    + +
    +
  • index_parameters is as follows:
    1
    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    +
    + +
    +
+
+

Parameter Description

  • UNLOGGED

    If this key word is specified, the created table is not a log table. Data written to unlogged tables is not written to the write-ahead log, which makes them considerably faster than ordinary tables. However, an unlogged table is automatically truncated after a crash or unclean shutdown, incurring data loss risks. The contents of an unlogged table are also not replicated to standby servers. Any indexes created on an unlogged table are not automatically logged as well.

    +

    Usage scenario: Unlogged tables do not ensure safe data. Users can back up data before using unlogged tables; for example, users should back up the data before a system upgrade.

    +

    Troubleshooting: If data is missing in the indexes of unlogged tables due to some unexpected operations such as an unclean shutdown, users should re-create the indexes with errors.

    +
  • GLOBAL | LOCAL

    When creating a temporary table, you can specify the GLOBAL or LOCAL keyword before TEMP or TEMPORARY. Currently, the two keywords are used to be compatible with the SQL standard. GaussDB(DWS) will create a local temporary table regardless of whether GLOBAL or LOCAL is specified.

    +
  • TEMPORARY | TEMP

    If TEMP or TEMPORARY is specified, the created table is a temporary table. Temporary tables are automatically dropped at the end of a session, or optionally at the end of the current transaction. Therefore, apart from CN and other CN errors connected by the current session, you can still create and use temporary table in the current session. Temporary tables are created only in the current session. If a DDL statement involves operations on temporary tables, a DDL error will be generated. Therefore, you are not advised to perform operations on temporary tables in DDL statements. TEMP is equivalent to TEMPORARY.

    +
    • Temporary tables are visible to the current session through schema of the pg_temp start. Users should not delete schema started with pg_temp, pg_toast_temp.
    • If TEMPORARY or TEMP is not specified when you create a table and the schema of the specified table starts with pg_temp_, the table is created as a temporary table.
    +
    +
  • IF NOT EXISTS

    If IF NOT EXISTS is specified, a table will be created if there is no table using the specified name. If there is already a table using the specified name, no error will be reported. A message will be displayed indicating that the table already exists, and the database will skip table creation.

    +
  • table_name

    Specifies the name of the table to be created.

    +

    The table name can contain a maximum of 63 characters, including letters, digits, underscores (_), dollar signs ($), and number signs (#). It must start with a letter or underscore (_).

    +
  • column_name

    Specifies the name of a column to be created in the new table.

    +

    The column name can contain a maximum of 63 characters, including letters, digits, underscores (_), dollar signs ($), and number signs (#). It must start with a letter or underscore (_).

    +
  • data_type

    Specifies the data type of the column.

    +
  • compress_mode

    Specifies the compress option of the table, only available for row-store table. The option specifies the algorithm preferentially used by table columns.

    +

    Value range: DELTA, PREFIX, DICTIONARY, NUMSTR, NOCOMPRESS

    +
  • COLLATE collation

    Assigns a collation to the column (which must be of a collatable data type). If no collation is specified, the default collation is used.

    +
  • LIKE source_table [ like_option ... ]

    Specifies a table from which the new table automatically copies all column names, their data types, and their not-null constraints.

    +

    The new table and the source table are decoupled after creation is complete. Changes to the source table will not be applied to the new table, and it is not possible to include data of the new table in scans of the source table.

    +

    Columns and constraints copied by LIKE are not merged with the same name. If the same name is specified explicitly or in another LIKE clause, an error is reported.

    +
    • The default expressions are copied from the source table to the new table only if INCLUDING DEFAULTS is specified. The default behavior is to exclude default expressions, resulting in the copied columns in the new table having default values NULL.
    • The CHECK constraints are copied from the source table to the new table only when INCLUDING CONSTRAINTS is specified. Other types of constraints are never copied to the new table. NOT NULL constraints are always copied to the new table. These rules also apply to column constraints and table constraints.
    • Any indexes on the source table will not be created on the new table, unless the INCLUDING INDEXES clause is specified.
    • STORAGE settings for the copied column definitions are copied only if INCLUDING STORAGE is specified. The default behavior is to exclude STORAGE settings.
    • If INCLUDING COMMENTS is specified, comments for the copied columns, constraints, and indexes are copied. The default behavior is to exclude comments.
    • If INCLUDING PARTITION is specified, the partition definitions of the source table are copied to the new table, and the new table no longer uses the PARTITION BY clause. The default behavior is to exclude partition definition of the source table.
    • If INCLUDING RELOPTIONS is specified, the storage parameter (WITH clause of the source table) of the source table is copied to the new table. The default behavior is to exclude partition definition of the storage parameter of the source table.
    • If INCLUDING DISTRIBUTION is specified, the distribution information of the source table is copied to the new table, including distribution type and column, and the new table no longer use the DISTRIBUTE BY clause. The default behavior is to exclude distribution information of the source table.
    • If INCLUDING DROPCOLUMNS is specified, the deleted column information in the source table is copied to the new table. By default, the deleted column information of the source table is not copied.
    • INCLUDING ALL contains the meaning of INCLUDING DEFAULTS, INCLUDING CONSTRAINTS, INCLUDING INDEXES, INCLUDING STORAGE, INCLUDING COMMENTS, INCLUDING PARTITION, INCLUDING RELOPTIONS, INCLUDING DISTRIBUTION, and INCLUDING DROPCOLUMNS.
    • If EXCLUDING is specified, the specified parameters are not included.
    • For an OBS hot or cold table, all partitions of the new table are local hot partitions after INCLUDING PARTITION is specified.
    +
    • If the source table contains a sequence with the SERIAL, BIGSERIAL, or SMALLSERIAL data type, or a column in the source table is a sequence by default and the sequence is created for this table by using CREATE SEQUENCE... OWNED BY, these sequences will not be copied to the new table, and another sequence specific to the new table will be created. This is different from earlier versions. To share a sequence between the source table and new table, create a shared sequence (do not use OWNED BY) and set a column in the source table to this sequence.
    • You are not advised to set a column in the source table to the sequence specific to another table especially when the table is distributed in specific Node Groups, because doing so may result in CREATE TABLE ... LIKE execution failures. In addition, doing so may cause the sequence to become invalid in the source sequence because the sequence will also be deleted from the source table when it is deleted from the table that the sequence is specific to. To share a sequence among multiple tables, you are advised to create a shared sequence for them.
    +
    +
  • WITH ( { storage_parameter = value } [, ... ] )

    Specifies an optional storage parameter for a table or an index.

    +

    Using Numeric of any precision to define column, specifies precision p and scale s. When precision and scale are not specified, the input will be displayed.

    +
    +

    The description of parameters is as follows:

    +
    • FILLFACTOR

      The fillfactor of a table is a percentage between 10 and 100. 100 (complete packing) is the default value. When a smaller fillfactor is specified, INSERT operations pack table pages only to the indicated percentage. The remaining space on each page is reserved for updating rows on that page. This gives UPDATE a chance to place the updated copy of a row on the same page, which is more efficient than placing it on a different page. For a table whose records are never updated, setting the fillfactor to 100 (complete packing) is the appropriate choice, but in heavily updated tables smaller fillfactors are appropriate. The parameter has no meaning for column-based tables.

      +

      Value range: 10–100

      +
    • ORIENTATION

      Specifies the storage mode (row-store, column-store) for table data. This parameter cannot be modified once it is set.

      +

      Valid value:

      +
      • ROW indicates that table data is stored in rows.

        ROW applies to OLTP service, which has many interactive transactions. An interaction involves many columns in the table. Using ROW can improve the efficiency.

        +
      • COLUMN indicates that the data is stored in columns.

        COLUMN applies to the data warehouse service, which has a large amount of aggregation computing, and involves a few column operations.

        +
      +

      Default value:

      +

      If an ordinary tablespace is specified, the default is ROW.

      +
    • COMPRESSION

      Specifies the compression level of the table data. It determines the compression ratio and time. Generally, the higher the level of compression, the higher the ratio, the longer the time, and the lower the level of compression, the lower the ratio, the shorter the time. The actual compression ratio depends on the distribution characteristics of loading table data.

      +

      Valid value:

      +
      • The valid values for column-store tables are YES/NO and LOW/MIDDLE/HIGH, and the default is LOW.
      • The valid values for row-store tables are YES and NO, and the default is NO.
        • The row-store table compression function is not put into commercial use. To use this function, contact technical support.
        +
        +
      +

      GaussDB(DWS) provides the following compression algorithms:

      + +
      + + + + + + + + + + + + + + + + + + + + + +
      Table 1 Compression algorithms for column-based storage

      COMPRESSION

      +

      NUMERIC

      +

      STRING

      +

      INT

      +

      LOW

      +

      Delta compression + RLE compression

      +

      LZ4 compression

      +

      Delta compression (RLE is optional.)

      +

      MIDDLE

      +

      Delta compression + RLE compression + LZ4 compression

      +

      dict compression or LZ4 compression

      +

      Delta compression or LZ4 compression (RLE is optional)

      +

      HIGH

      +

      Delta compression + RLE compression + zlib compression

      +

      dict compression or zlib compression

      +

      Delta compression or zlib compression (RLE is optional)

      +
      +
      +
    • COMPRESSLEVEL

      Specifies the compression level of the table data. It determines the compression ratio and time. This divides a compression level into sublevels, providing you with more choices for compression rate and duration. As the value becomes greater, the compression rate becomes higher and duration longer at the same compression level. The parameter is only valid for column-store table.

      +

      Value range: 0 to 3. The default value is 0.

      +
    • MAX_BATCHROW

      Specifies the maximum of a storage unit during data loading process. The parameter is only valid for column-store table.

      +

      Value range: 10000 to 60000

      +

      Default value: 60000

      +

      When a column-store table is imported, the following error is reported: cu.cpp: 249: The parameter destMax is equal to zero or larger than the macro: SECUREC_STRING_MAX_LEN.

      +

      If the error persists after the statement or sorting is adjusted, change the maximum number of records in a storage unit from 60,000 to 30,000 by setting MAX_BATCHROW.

      +
      +
    • PARTIAL_CLUSTER_ROWS

      Specifies the number of records to be partial cluster stored during data loading process. The parameter is only valid for column-store table.

      +

      Value range: 600000 to 2147483647

      +
    • enable_delta

      Specifies whether to enable delta tables in column-store tables. The parameter is only valid for column-store tables.

      +

      Default value: off

      +
    • DELTAROW_THRESHOLD

      Specifies the upper limit of to-be-imported rows for triggering the data import to a delta table when data is to be imported to a column-store table. This parameter takes effect only if the enable_delta table parameter is set to on. The parameter is only valid for column-store table.

      +

      The value ranges from 0 to 60000. The default value is 6000.

      +
    • COLVERSION

      Specifies the version of the column-store format. You can switch between different storage formats.

      +

      Valid value:

      +

      1.0: Each column in a column-store table is stored in a separate file. The file name is relfilenode.C1.0, relfilenode.C2.0, relfilenode.C3.0, or similar.

      +

      2.0: All columns of a column-store table are combined and stored in a file. The file is named relfilenode.C1.0.

      +

      Default value: 2.0

      +

      The value of COLVERSION can only be set to 2.0 for OBS hot and cold tables.

      +
      • For clusters of version 8.1.0, the default value of this parameter is 1.0. For clusters of version 8.1.1 or later, the default value of this parameter is 2.0. If the cluster version is upgraded from 8.1.0 to 8.1.1 or later, the default value of this parameter changes from 1.0 to 2.0.
      • When creating a column-store table, set COLVERSION to 2.0. Compared with the 1.0 storage format, the performance is significantly improved:
        1. The time required for creating a column-store wide table is significantly reduced.
        2. In the Roach data backup scenario, the backup time is significantly reduced.
        3. The build and catch up time is greatly reduced.
        4. The occupied disk space decreases significantly.
        +
      +
      +
    • COLD_TABLESPACE

      Specifies the OBS tablespace for the cold partitions in a hot or cold table. This parameter is available only to partitioned column-store tables and cannot be modified. It must be used together with storage_policy.

      +

      Valid value: a valid OBS tablespace name

      +
    • STORAGE_POLICY

      Specifies the hot and cold partition switching policy. This parameter is supported only by hot and cold tables. This parameter must be used together with cold_tablespace.

      +

      Value range: Cold and hot switchover policy name:Cold and hot switchover threshold. Currently, only LMT and HPN policies are supported. LMT indicates that the switchover is performed based on the last update time of partitions. HPN indicates the switchover is performed based on a fixed number of reserved hot partitions.

      +
      • LMT:[day]: Switch the hot partition data that is not updated in the last [day] days to the OBS tablespace as cold partition data. [day] is an integer ranging from 0 to 36500, in days.
      • HPN:[hot_partition_num]: [hot_partition_num] indicates the number of hot partitions (with data) to be retained. The rule is to find the maximum sequence ID of the partitions with data. The partitions without data whose sequence ID is greater than the maximum sequence ID are hot partitions, and [hot_partition_num] partitions are retained as hot partitions in descending order according to the sequence ID. A partition whose sequence ID is smaller than the minimum sequence ID of the retained hot partition is a cold partition. During hot and cold partition switchover, data needs to be migrated to the OBS tablespace. [hot_partition_num] is an integer ranging from 0 to 1600.
      +

      The hybrid data warehouse (standalone) does not support cold and hot partition switchover.

      +
      +
    • SKIP_FPI_HINT

      Indicates whether to skip the hint bits operation when the full-page writes (FPW) log needs to be written during sequential scanning.

      +
      Default value: false

      If SKIP_FPI_HINT is set to true and the checkpoint operation is performed on a table, no Xlog will be generated when the table is sequentially scanned. This applies to intermediate tables that are queried less frequently, reducing the size of Xlogs and improving query performance.

      +
      +
      +
    +
  • ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }

    ON COMMIT determines what to do when you commit a temporary table creation operation. The three options are as follows. Currently, only PRESERVE ROWS and DELETE ROWS can be used.

    +
    • PRESERVE ROWS (Default): No special action is taken at the ends of transactions. The temporary table and its table data are unchanged.
    • DELETE ROWS: All rows in the temporary table will be deleted at the end of each transaction block.
    • DROP: The temporary table will be dropped at the end of the current transaction block.
    +
  • COMPRESS | NOCOMPRESS

    If you specify COMPRESS in the CREATE TABLE statement, the compression feature is triggered in the case of a bulk INSERT operation. If this feature is enabled, a scan is performed for all tuple data within the page to generate a dictionary and then the tuple data is compressed and stored. If NOCOMPRESS is specified, the table is not compressed.

    +

    Default value: NOCOMPRESS, tuple data is not compressed before storage.

    +
  • DISTRIBUTE BY

    Specifies how the table is distributed or replicated between DNs.

    +

    Valid value:

    +
    • REPLICATION: Each row in the table exists on all DNs, that is, each DN has complete table data.
    • HASH (column_name): Each row of the table will be placed into all the DNs based on the hash value of the specified column.
      • When DISTRIBUTE BY HASH (column_name) is specified, the primary key and its unique index must contain the column_name column.
      • When DISTRIBUTE BY HASH (column_name) in a referenced table is specified, the foreign key of the reference table must contain the column_name column.
      • The hybrid data warehouse (standalone) has only one DN. Therefore, the distribution rule is ignored and cannot be modified.
      +
      +
    +

    Default value: HASH(column_name), the key column of column_name (if any) or the column of distribution column supported by first data type.

    +

    column_name supports the following data types:

    +
    • Integer types: TINYINT, SMALLINT, INT, BIGINT, and NUMERIC/DECIMAL
    • Character types: CHAR, BPCHAR, VARCHAR, VARCHAR2, NVARCHAR2, and TEXT
    • Date/time types: DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, INTERVAL, and SMALLDATETIME
    +

    When you create a table, the choices of distribution keys and partition keys have major impact on SQL query performance. Therefore, choosing proper distribution column and partition key with strategies.

    +
    • Selecting an Appropriate Distribution Column
      In the data distributed table using Hash, an appropriate distributed array should be used to distribute and store data on multiple DNs evenly, preventing data skew (uneven data distribution across several DNs). Determine the proper distribution column based on the following principles:
      1. Determine whether data is skewed.

        Connect to the database and run the following statements to check the number of tuples on each DN: Replace tablename with the actual name of the table to be analyzed.

        +
        SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM tablename GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count DESC;
        +

        If tuple numbers vary greatly (several times or tenfold) in each DN, a data skew occurs. Change the data distribution key based on the following principles:

        +
      2. Run the ALTER TABLE statement to adjust the distribution column. The rules for selecting a distribution column are as follows:

        The column value of the distribution column should be discrete so that data can be evenly distributed on each DN. For example, you are advised to select the primary key of a table as the distribution column, and the ID card number as the distribution column in a personnel information table.

        +

        With the above principles met, you can select join conditions as distribution keys so that join tasks can be pushed down to DNs, reducing the amount of data transferred between the DNs.

        +
      +
      +
    • Selecting appropriate partition keys

      In range partitioning, the table is partitioned into ranges defined by a key column or set of columns, with no overlap between the ranges of values assigned to different partitions. Each range has a dedicated partition for data storage.

      +

      Modify partition keys to make the query result stored in the same or least partitions (partition pruning). Obtaining consecutive I/O to improve the query performance.

      +

      In actual services, time is used to filter query objects. Therefore, you can use time as a partition key, and change the key value based on the total data volume and single data query volume.

      +
    +
    +
  • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

    TO GROUP specifies the Node Group in which the table is created. Currently, it cannot be used for HDFS tables. TO NODE is used for internal scale-out tools.

    +
  • CONSTRAINT constraint_name

    Specifies a name for a column or table constraint. The optional constraint clauses specify constraints that new or updated rows must satisfy for an insert or update operation to succeed.

    +

    There are two ways to define constraints:

    +
    • A column constraint is defined as part of a column definition, and it is bound to a particular column.
    • A table constraint is not bound to any particular columns but can apply to more than one column.
    +
  • NOT NULL

    Indicates that the column is not allowed to contain NULL values.

    +
  • NULL

    The column is allowed to contain NULL values. This is the default setting.

    +

    This clause is only provided for compatibility with non-standard SQL databases. You are advised not to use this clause.

    +
  • CHECK ( expression )

    Specifies an expression producing a Boolean result which new or updated rows must satisfy for an insert or update operation to succeed. Expressions evaluating to TRUE or UNKNOWN succeed. If any row of an insert or update operation produces a FALSE result, an error exception is raised and the insert or update does not alter the database.

    +

    A check constraint specified as a column constraint should reference only the column's values, while an expression appearing in a table constraint can reference multiple columns.

    +

    <>NULL and !=NULL are invalid in an expression. Change them to IS NOT NULL.

    +
    +
  • DEFAULT default_expr

    Assigns a default data value for a column. The value can be any variable-free expressions (Subqueries and cross-references to other columns in the current table are not allowed). The data type of the default expression must match the data type of the column.

    +

    The default expression will be used in any insert operation that does not specify a value for the column. If there is no default value for a column, then the default value is NULL.

    +
  • UNIQUE index_parameters

    UNIQUE ( column_name [, ... ] ) index_parameters

    +

    Specifies that a group of one or more columns of a table can contain only unique values.

    +

    For the purpose of a unique constraint, NULL is not considered equal.

    +

    If DISTRIBUTE BY REPLICATION is not specified, the column table that contains only unique values must contain distribution columns.

    +
    +
  • PRIMARY KEY index_parameters

    PRIMARY KEY ( column_name [, ... ] ) index_parameters

    +

    Specifies the primary key constraint specifies that a column or columns of a table can contain only unique (non-duplicate) and non-null values.

    +

    Only one primary key can be specified for a table.

    +

    If DISTRIBUTE BY REPLICATION is not specified, the column set with a primary key constraint must contain distributed columns.

    +
    +
  • DEFERRABLE | NOT DEFERRABLE

    Controls whether the constraint can be deferred. A constraint that is not deferrable will be checked immediately after every command. Checking of constraints that are deferrable can be postponed until the end of the transaction using the SET CONSTRAINTS command. NOT DEFERRABLE is the default value. Currently, only UNIQUE and PRIMARY KEY constraints of row-store tables accept this clause. All the other constraints are not deferrable.

    +
  • PARTIAL CLUSTER KEY

    Specifies a partial cluster key for storage. When importing data to a column-store table, you can perform local data sorting by specified columns (single or multiple).

    +
  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    If a constraint is deferrable, this clause specifies the default time to check the constraint.

    +
    • If the constraint is INITIALLY IMMEDIATE (default value), it is checked after each statement.
    • If the constraint is INITIALLY DEFERRED, it is checked only at the end of the transaction.
    +

    The constraint check time can be altered using the SET CONSTRAINTS command.

    +
+
+

Using the LIKE Clause to Declare a Table

The new table films_bk automatically inherits all column names, data types, and non-null constraints from the source table films.

+
1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE TABLE films (
+code        char(5) PRIMARY KEY,
+title       varchar(40) NOT NULL,
+did         integer NOT NULL,
+date_prod   date,
+kind        varchar(10),
+len         interval hour to minute
+);
+CREATE TABLE films_bk LIKE films;
+
+ +
+
+

Creating a Table with Default Columns

Specify that the default value of the W_STATE column to GA. At the end of the transaction, check for duplicate values in the W_WAREHOUSE_NAME column.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t2
+(
+    W_WAREHOUSE_SK            INTEGER                NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)   UNIQUE DEFERRABLE,
+    W_WAREHOUSE_SQ_FT         INTEGER                        ,
+    W_STREET_NUMBER           CHAR(10)                       ,
+    W_STREET_NAME             VARCHAR(60)                    ,
+    W_STREET_TYPE             CHAR(15)                       ,
+    W_SUITE_NUMBER            CHAR(10)                       ,
+    W_CITY                    VARCHAR(60)                    ,
+    W_COUNTY                  VARCHAR(30)                    ,
+    W_STATE                   CHAR(2)            DEFAULT 'GA',
+    W_ZIP                     CHAR(10)                       ,
+    W_COUNTRY                 VARCHAR(20)                    ,
+    W_GMT_OFFSET              DECIMAL(5,2) 
+);
+
+ +
+
+

Creating a Table with a Filler Factor

Set the fill factor to 70%.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t3
+(
+    W_WAREHOUSE_SK            INTEGER                NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                    ,
+    W_WAREHOUSE_SQ_FT         INTEGER                        ,
+    W_STREET_NUMBER           CHAR(10)                       ,
+    W_STREET_NAME             VARCHAR(60)                    ,
+    W_STREET_TYPE             CHAR(15)                       ,
+    W_SUITE_NUMBER            CHAR(10)                       ,
+    W_CITY                    VARCHAR(60)                    ,
+    W_COUNTY                  VARCHAR(30)                    ,
+    W_STATE                   CHAR(2)                        ,
+    W_ZIP                     CHAR(10)                       ,
+    W_COUNTRY                 VARCHAR(20)                    ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70)
+);
+
+ +
+

Alternatively, use the following syntax to create a table with its fillfactor set to 70%:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t4
+(
+    W_WAREHOUSE_SK            INTEGER                NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)              UNIQUE,
+    W_WAREHOUSE_SQ_FT         INTEGER                        ,
+    W_STREET_NUMBER           CHAR(10)                       ,
+    W_STREET_NAME             VARCHAR(60)                    ,
+    W_STREET_TYPE             CHAR(15)                       ,
+    W_SUITE_NUMBER            CHAR(10)                       ,
+    W_CITY                    VARCHAR(60)                    ,
+    W_COUNTY                  VARCHAR(30)                    ,
+    W_STATE                   CHAR(2)                        ,
+    W_ZIP                     CHAR(10)                       ,
+    W_COUNTRY                 VARCHAR(20)                    ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH(fillfactor=70);
+
+ +
+
+

Creating a Table Whose Data Is Not Written to WALs

Use UNLOGGED to specify that table data is not written to write-ahead logs (WALs).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE UNLOGGED TABLE tpcds.warehouse_t5
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+);
+
+ +
+
+

Creating a Table Without Reporting Errors for Duplicate Tables (If Any)

If IF NOT EXISTS is specified, a table will be created if there is no table using the specified name. If there is already a table using the specified name, no error will be reported. A message will be displayed indicating that the table already exists, and the database will skip table creation.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE IF NOT EXISTS tpcds.warehouse_t6
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+);
+
+ +
+
+

Creating a Table with a Primary Key Constraint

Use PRIMARY KEY to declare the primary key.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t7
+(
+    W_WAREHOUSE_SK            INTEGER            PRIMARY KEY,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+);
+
+ +
+

Alternatively, use the following syntax to create a table with a primary key constraint:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t8
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    PRIMARY KEY(W_WAREHOUSE_SK)
+);
+
+ +
+

Or use the following statement to specify the name of the constraint:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t9
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    CONSTRAINT W_CSTR_KEY1 PRIMARY KEY(W_WAREHOUSE_SK)
+);
+
+ +
+
+

Creating a Table with a Compound Primary Key Constraint

Use PRIMARY KEY to declare two primary keys at the same time.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t10
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID)
+);
+
+ +
+
+

Creating a Column-store Table

Use ORIENTATION to specify the storage mode of table data.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t11
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = COLUMN);
+
+ +
+
+

Creating a Column-store Table Using Partial Clustered Storage

When data is imported to a column-store table, perform partial sorting based on the one or more columns specified by PARTIAL CLUSTER KEY.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t12
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID)
+) WITH (ORIENTATION = COLUMN)
+
+ +
+
+

Defining a Column-store Table with Compression Enabled

Use the with clause to declare the compression level.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t17
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH);
+
+ +
+
+

Defining a Table with Compression Enabled

When creating a table, specify the keyword COMPRESS.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t13
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) COMPRESS;
+
+ +
+
+

Creating a Table that Checks Column Constraints

Use CONSTRAINT to declare a constraint.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t19
+(
+    W_WAREHOUSE_SK            INTEGER               PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0),
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)           CHECK (W_WAREHOUSE_NAME IS NOT NULL),
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+);
+
+ +
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t20
+(
+    W_WAREHOUSE_SK            INTEGER               PRIMARY KEY,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)           CHECK (W_WAREHOUSE_NAME IS NOT NULL),
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL)  
+);
+
+ +
+
+

Creating a Temporary Table

Specify the TEMP or TEMPORARY keyword to create a temporary table.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TEMPORARY TABLE warehouse_t14
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+);
+
+ +
+

Create a temporary table in a transaction and specify that data of this table is deleted when the transaction is committed.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TEMPORARY TABLE warehouse_t15
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) ON COMMIT DELETE ROWS;
+
+ +
+
+

Creating a Row-store Table

Set ORIENTATION to ROW.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t16
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = ROW);
+
+ +
+
+

Creating a Column-store Table in a Specified Version

Set COLVERSION to specify the version of the column storage format.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t18
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = COLUMN, COLVERSION=2.0);
+
+ +
+
+

Creating a Column-store Table with the Delta Table Enabled

Set enable_delta=on to enable the delta table in column-store tables.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t21
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = COLUMN, ENABLE_DELTA = ON);
+
+ +
+
+

Defining a Table with SKIP_FPI_HINT Enabled

Use the with clause to set SKIP_FPI_HINT.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t22
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (SKIP_FPI_HINT = TRUE);
+
+ +
+
+

Creating Hot and Cold Tables

Create an OBS tablespace that hot and cold tables depend on.

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE TABLESPACE obs_location WITH(
+    filesystem = obs, 
+    address = 'obs URL', 
+    access_key = 'xxxxxxxx',  
+    secret_access_key = 'xxxxxxxx', 
+    encrypt = 'on', 
+    storepath = '/obs_bucket/obs_tablespace'
+);
+
+ +
+

Create a hot or cold table. Only column-store partitioned tables are supported.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
CREATE TABLE tpcds.warehouse_t23
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+)
+WITH (ORIENTATION = COLUMN, cold_tablespace = "obs_location", storage_policy = 'LMT:30')
+DISTRIBUTE BY HASH (W_WAREHOUSE_SK)
+PARTITION BY RANGE(W_WAREHOUSE_SQ_FT)
+(
+    PARTITION P1 VALUES LESS THAN(100000),
+    PARTITION P2 VALUES LESS THAN(200000),
+    PARTITION P3 VALUES LESS THAN(300000),
+    PARTITION P4 VALUES LESS THAN(400000),
+    PARTITION P5 VALUES LESS THAN(500000),
+    PARTITION P6 VALUES LESS THAN(600000),
+    PARTITION P7 VALUES LESS THAN(700000),
+    PARTITION P8 VALUES LESS THAN(MAXVALUE)
+)ENABLE ROW MOVEMENT;
+
+ +
+
+

Creating an Auto-increment Table That Uses UUID as the Primary Key

Set W_UUID to SMALLSERIAL.
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t24
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_UUID                    SMALLSERIAL                   ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+) WITH (ORIENTATION = ROW);
+
+ +
+
+
+

Creating a Table that Uses Hash Distribution

Use DISTRIBUTE BY to specify table distribution across nodes.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
CREATE TABLE tpcds.warehouse_t25
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2),
+    CONSTRAINT W_CONSTR_KEY3 UNIQUE(W_WAREHOUSE_SK)
+)DISTRIBUTE BY HASH(W_WAREHOUSE_SK);
+
+ +
+
+

Defining a Table with Each Row Stored in All DNs

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
CREATE TABLE tpcds.warehouse_t26
+(
+    W_WAREHOUSE_SK            INTEGER               NOT NULL,
+    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
+    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
+    W_WAREHOUSE_SQ_FT         INTEGER                       ,
+    W_STREET_NUMBER           CHAR(10)                      ,
+    W_STREET_NAME             VARCHAR(60)                   ,
+    W_STREET_TYPE             CHAR(15)                      ,
+    W_SUITE_NUMBER            CHAR(10)                      ,
+    W_CITY                    VARCHAR(60)                   ,
+    W_COUNTY                  VARCHAR(30)                   ,
+    W_STATE                   CHAR(2)                       ,
+    W_ZIP                     CHAR(10)                      ,
+    W_COUNTRY                 VARCHAR(20)                   ,
+    W_GMT_OFFSET              DECIMAL(5,2)
+)DISTRIBUTE BY REPLICATION;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0178.html b/docs/dws/dev/dws_06_0178.html new file mode 100644 index 00000000..49c2d907 --- /dev/null +++ b/docs/dws/dev/dws_06_0178.html @@ -0,0 +1,101 @@ + + +

CREATE TABLE AS

+

Function

CREATE TABLE AS creates a table based on the results of a query.

+

It creates a table and fills it with data obtained using SELECT. The table columns have the names and data types associated with the output columns of the SELECT. Except that you can override the SELECT output column names by giving an explicit list of new column names.

+

CREATE TABLE AS queries once the source table and writes data in the new table. The query result view changes when the source table changes. In contrast, a view re-evaluates its defining SELECT statement whenever it is queried.

+
+

Precautions

  • This command cannot be used to create a partitioned table.
  • If an error occurs when you create a table, after the system is recovered, the system probably cannot automatically clear the created disk file whose size is not 0. This problem seldom occurs.
+
+

Syntax

1
+2
+3
+4
+5
+6
+7
+8
+9
CREATE [ UNLOGGED ] TABLE table_name
+    [ (column_name [, ...] ) ]
+    [ WITH ( {storage_parameter = value} [, ... ] ) ]
+    [ COMPRESS | NOCOMPRESS ]
+    
+    [ DISTRIBUTE BY { REPLICATION | { [HASH ] ( column_name ) } } ]
+    
+    AS query
+    [ WITH [ NO ] DATA ];
+
+ +
+
+

Parameter Description

  • UNLOGGED

    Specifies that the table is created as an unlogged table. Data written to unlogged tables is not written to the write-ahead log, which makes them considerably faster than ordinary tables. However, they are not crash-safe: an unlogged table is automatically truncated after a crash or unclean shutdown. The contents of an unlogged table are also not replicated to standby servers. Any indexes created on an unlogged table are automatically unlogged as well.

    +
    • Usage scenario: Unlogged tables do not ensure safe data. Users can back up data before using unlogged tables; for example, users should back up the data before a system upgrade.
    • Troubleshooting: If data is missing in the indexes of unlogged tables due to some unexpected operations such as an unclean shutdown, users should re-create the indexes with errors.
    +
  • table_name

    Specifies the name of the table to be created.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Specifies the name of a column to be created in the new table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • WITH ( storage_parameter [= value] [, ... ] )

    Specifies an optional storage parameter for a table or an index. See details of parameters below.

    +
    • FILLFACTOR

      The fillfactor of a table is a percentage between 10 and 100. 100 (complete packing) is the default value. When a smaller fillfactor is specified, INSERT operations pack table pages only to the indicated percentage. The remaining space on each page is reserved for updating rows on that page. This gives UPDATE a chance to place the updated copy of a row on the same page, which is more efficient than placing it on a different page. For a table whose records are never updated, setting the fillfactor to 100 (complete packing) is the appropriate choice, but in heavily updated tables smaller fillfactors are appropriate. The parameter is only valid for row–store table.

      +

      Value range: 10–100

      +
    • ORIENTATION

      Valid value:

      +

      COLUMN: The data will be stored in columns.

      +

      ROW (default value): The data will be stored in rows.

      +
    • COMPRESSION

      Specifies the compression level of the table data. It determines the compression ratio and time. Generally, the higher the level of compression, the higher the ratio, the longer the time, and the lower the level of compression, the lower the ratio, the shorter the time. The actual compression ratio depends on the distribution characteristics of loading table data.

      +

      Valid value:

      +

      The valid values for column-store tables are YES/NO and LOW/MIDDLE/HIGH, and the default is LOW.

      +

      The valid values for row-store tables are YES and NO, and the default is NO.

      +

      The row-store table compression function is not put into commercial use. To use this function, contact technical support engineers.

      +
      +
    • MAX_BATCHROW

      Specifies the maximum of a storage unit during data loading process. The parameter is only valid for column-store table.

      +

      Value range: 10000 to 60000

      +

      Default value: 60000

      +
    • PARTIAL_CLUSTER_ROWS

      Specifies the number of records to be partial cluster stored during data loading process. The parameter is only valid for column-store table.

      +

      Value range: 600000 to 2147483647

      +
    • enable_delta

      Specifies whether to enable delta tables in column-store tables. The parameter is only valid for column-store tables.

      +

      Default value: off

      +
    • COLVERSION

      Specifies the version of the column-store format. You can switch between different storage formats.

      +

      Valid value:

      +

      1.0: Each column in a column-store table is stored in a separate file. The file name is relfilenode.C1.0, relfilenode.C2.0, relfilenode.C3.0, or similar.

      +

      2.0: All columns of a column-store table are combined and stored in a file. The file is named relfilenode.C1.0.

      +

      Default value: 2.0

      +

      When creating a column-store table, set COLVERSION to 2.0. Compared with the 1.0 storage format, the performance is significantly improved:

      +
      1. The time required for creating a column-store wide table is significantly reduced.
      2. In the Roach data backup scenario, the backup time is significantly reduced.
      3. The build and catch up time is greatly reduced.
      4. The occupied disk space decreases significantly.
      +
      +
    • SKIP_FPI_HINT

      Indicates whether to skip the hint bits operation when the full-page writes (FPW) log needs to be written during sequential scanning.

      +
      Default value: false

      If SKIP_FPI_HINT is set to true and the checkpoint operation is performed on a table, no Xlog will be generated when the table is sequentially scanned. This applies to intermediate tables that are queried less frequently, reducing the size of Xlogs and improving query performance.

      +
      +
      +
    +
  • COMPRESS / NOCOMPRESS

    Specifies the keyword COMPRESS during the creation of a table, so that the compression feature is triggered in the case of a bulk INSERT operation. If this feature is enabled, a scan is performed for all tuple data within the page to generate a dictionary and then the tuple data is compressed and stored. If NOCOMPRESS is specified, the table is not compressed.

    +

    Default value: NOCOMPRESS, tuple data is not compressed before storage.

    +
  • DISTRIBUTE BY

    Specifies how the table is distributed or replicated between DNs.

    +
    • REPLICATION: Each row in the table exists on all DNs, that is, each DN has complete table data.
    • HASH (column_name): Each row of the table will be placed into all the DNs based on the hash value of the specified column.
    +
    • When DISTRIBUTE BY HASH (column_name) is specified, the primary key and its unique index must contain the column_name column.
    • When DISTRIBUTE BY HASH (column_name) in a referenced table is specified, the foreign key of the reference table must contain the column_name column.
    +
    +

    Default value: HASH(column_name), the key column of column_name (if any) or the column of distribution column supported by first data type.

    +

    column_name supports the following data types:

    +
    • Integer types: TINYINT, SMALLINT, INT, BIGINT, and NUMERIC/DECIMAL
    • Character types: CHAR, BPCHAR, VARCHAR, VARCHAR2, NVARCHAR2, and TEXT
    • Date/time types: DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, INTERVAL, and SMALLDATETIME
    +
  • AS query

    Indicates a SELECT or VALUES command, or an EXECUTE command that runs a prepared SELECT, or VALUES query.

    +
  • [ WITH [ NO ] DATA ]

    Specifies whether the data produced by the query should be copied into the new table. By default, the data is copied. If the NO parameter is used, the data is not copied.

    +
+
+

Examples

Create the store_returns_t1 table and insert numbers that are greater than 4795 in the sr_item_sk column of the store_returns table.

+
1
CREATE TABLE store_returns_t1 AS SELECT * FROM store_returns WHERE sr_item_sk > '4795';
+
+ +
+

-- Copy store_returns to create the store_returns_t2 table.

+
1
CREATE TABLE store_returns_t2 AS table store_returns;
+
+ +
+
+

Helpful Links

CREATE TABLE, SELECT

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0179.html b/docs/dws/dev/dws_06_0179.html new file mode 100644 index 00000000..5c182f66 --- /dev/null +++ b/docs/dws/dev/dws_06_0179.html @@ -0,0 +1,646 @@ + + +

CREATE TABLE PARTITION

+

Function

CREATE TABLE PARTITION creates a partitioned table. Partitioning refers to splitting what is logically one large table into smaller physical pieces based on specific schemes. The table based on the logic is called a partition cable, and a physical piece is called a partition. Data is stored on these smaller physical pieces, namely, partitions, instead of the larger logical partitioned table.

+

The common forms of partitioning include range partitioning, hash partitioning, list partitioning, and value partitioning. Currently, row-store and column-store tables support only range partitioning.

+

In range partitioning, the table is partitioned into ranges defined by a key column or set of columns, with no overlap between the ranges of values assigned to different partitions. Each range has a dedicated partition for data storage.

+

The partitioning policy for Range Partitioning refers to how data is inserted into partitions. Currently, range partitioning only allows the use of the range partitioning policy.

+

Range partitioning policy: Data is mapped to a created partition based on the partition key value. If the data can be mapped to, it is inserted into the specific partition; if it cannot be mapped to, error messages are returned. This is the most commonly used partitioning policy.

+

Partitioning can provide several benefits:

+
  • Query performance can be improved dramatically in certain situations, particularly when most of the heavily accessed rows of the table are in a single partition or a small number of partitions. Partitioning narrows the range of data search and improves data access efficiency.
  • When queries or updates access a large percentage of a single partition, performance can be improved by taking advantage of sequential scan of that partition instead of reads scattered across the whole table.
  • Bulk loads and deletion can be performed by adding or removing partitions, if that requirement is planned into the partitioning design. It also entirely avoids the VACUUM overhead caused by a bulk DELETE (only for range partitioning).
+
+

Precautions

A partitioned table supports unique and primary key constraints. The constraint keys of these constraints contain all partition keys.

+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
CREATE TABLE [ IF NOT EXISTS ] partition_table_name
+( [ 
+    { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
+    | table_constraint
+    | LIKE source_table [ like_option [...] ] }[, ... ]
+] )
+    [ WITH ( {storage_parameter = value} [, ... ] ) ]
+    [ COMPRESS | NOCOMPRESS ]
+    [ TABLESPACE tablespace_name ]
+    [ DISTRIBUTE BY { REPLICATION | { [ HASH ] ( column_name ) } } ]
+    [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ]
+    PARTITION BY { 
+        {VALUES (partition_key)} |
+        {RANGE (partition_key) ( partition_less_than_item [, ... ] )} |
+        {RANGE (partition_key) ( partition_start_end_item [, ... ] )}
+    } [ { ENABLE | DISABLE } ROW MOVEMENT ]; 
+
+ +
+
  • column_constraint is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    [ CONSTRAINT constraint_name ]
    +{ NOT NULL |
    +  NULL | 
    +  CHECK ( expression ) | 
    +  DEFAULT default_expr | 
    +  UNIQUE index_parameters | 
    +  PRIMARY KEY index_parameters }
    +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    +
    + +
    +
  • table_constraint is as follows:
    [ CONSTRAINT constraint_name ]
    +{ CHECK ( expression ) | 
    +  UNIQUE ( column_name [, ... ] ) index_parameters | 
    +  PRIMARY KEY ( column_name [, ... ] ) index_parameters}
    +[ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    +
+
  • like_option is as follows:
    1
    { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | RELOPTIONS | DISTRIBUTION | ALL }
    +
    + +
    +
+
  • index_parameters is as follows:
    1
    +2
    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    +[ USING INDEX TABLESPACE tablespace_name ]
    +
    + +
    +
+
+
  • partition_less_than_item is as follows:
    1
    PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } ) [TABLESPACE tablespace_name]
    +
    + +
    +
  • partition_start_end_item is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    PARTITION partition_name {
    +        {START(partition_value) END (partition_value) EVERY (interval_value)} |
    +        {START(partition_value) END ({partition_value | MAXVALUE})} |
    +        {START(partition_value)} |
    +        {END({partition_value | MAXVALUE})}
    +} [TABLESPACE tablespace_name]
    +
    + +
    +
+

Parameter Description

  • IF NOT EXISTS

    Does not throw an error if a table with the same name exists. A notice is issued in this case.

    +
  • partition_table_name

    Name of the partitioned table

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Specifies the name of a column to be created in the new table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • data_type

    Specifies the data type of the column.

    +
  • COLLATE collation

    Assigns a collation to the column (which must be of a collatable data type). If no collation is specified, the default collation is used.

    +

    The collatable types are char, varchar, text, nchar, and nvarchar.

    +
  • CONSTRAINT constraint_name

    Specifies a name for a column or table constraint. The optional constraint clauses specify constraints that new or updated rows must satisfy for an insert or update operation to succeed.

    +

    There are two ways to define constraints:

    +
    • A column constraint is defined as part of a column definition, and it is bound to a particular column.
    • A table constraint is not bound to any particular columns but can apply to more than one column.
    +
  • LIKE source_table [ like_option ... ]

    Specifies a table from which the new table automatically copies all column names, their data types, and their not-null constraints.

    +

    Unlike INHERITS, the new table and original table are decoupled after creation is complete. Changes to the original table will not be applied to the new table, and it is not possible to include data of the new table in scans of the original table.

    +

    Default expressions for the copied column definitions will only be copied if INCLUDING DEFAULTS is specified. The default behavior is to exclude default expressions, resulting in the copied columns in the new table having default values NULL.

    +

    NOT NULL constraints are always copied to the new table. CHECK constraints will only be copied if INCLUDING CONSTRAINTS is specified; other types of constraints will never be copied. These rules also apply to column constraints and table constraints.

    +

    Unlike INHERITS, columns and constraints copied by LIKE are not merged with similarly named columns and constraints. If the same name is specified explicitly or in another LIKE clause, an error is reported.

    +
    • Any indexes on the source table will not be created on the new table, unless the INCLUDING INDEXES clause is specified.
    • STORAGE settings for the copied column definitions will only be copied if INCLUDING STORAGE is specified. The default behavior is to exclude STORAGE settings.
    • Comments for the copied columns, constraints, and indexes will only be copied if INCLUDING COMMENTS is specified. The default behavior is to exclude comments.
    • If INCLUDING RELOPTIONS is specified, the new table will copy the storage parameter (WITH clause of the source table) of the source table. The default behavior is to exclude partition definition of the storage parameter of the source table.
    • If INCLUDING DISTRIBUTION is specified, the new table will copy the distribution information of the source table, including distribution type and column, and the new table cannot use DISTRIBUTE BY clause. The default behavior is to exclude distribution information of the source table.
    • INCLUDING ALL is an abbreviated form of INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS INCLUDING RELOPTIONS INCLUDING DISTRIBUTION.
    +
  • WITH ( storage_parameter [= value] [, ... ] )

    Specifies an optional storage parameter for a table or an index. Optional parameters are as follows:

    +
    • FILLFACTOR

      The fillfactor of a table is a percentage between 10 and 100. 100 (complete packing) is the default value. When a smaller fillfactor is specified, INSERT operations pack table pages only to the indicated percentage. The remaining space on each page is reserved for updating rows on that page. This gives UPDATE a chance to place the updated copy of a row on the same page, which is more efficient than placing it on a different page. For a table whose records are never updated, setting the fillfactor to 100 (complete packing) is the appropriate choice, but in heavily updated tables smaller fillfactors are appropriate. The parameter has no meaning for column-store tables.

      +

      Value range: 10–100

      +
    • ORIENTATION

      Determines the storage mode of the data in the table.

      +

      Valid value:

      +
      • COLUMN: The data will be stored in columns.
      • ROW (default value): The data will be stored in rows.
      • ORC: The data of the table will be stored in ORC format (only HDFS table).

        orientation cannot be modified.

        +
        +
      +
    • COMPRESSION
      • The valid values for column-store tables are YES/NO and LOW/MIDDLE/HIGH, and the default is LOW.
      • The valid values for row-store tables are YES and NO, and the default is NO.

        The row-store table compression function is not put into commercial use. To use this function, contact technical support engineers.

        +
        +
      +
    • MAX_BATCHROW

      Specifies the maximum of a storage unit during data loading process. The parameter is only valid for column-store table.

      +

      Value range: 10000 to 60000

      +

      Default value: 60000

      +
    • PARTIAL_CLUSTER_ROWS

      Specifies the number of records to be partial cluster stored during data loading process. The parameter is only valid for column-store table.

      +

      Value range: The valid value is no less than 100000. The value is the multiple of MAX_BATCHROW.

      +
    • enable_delta

      Specifies whether to enable delta tables in column-store tables. The parameter is only valid for column-store tables.

      +

      Default value: off

      +
    • DELTAROW_THRESHOLD

      A reserved parameter. The parameter is only valid for column-store table.

      +

      The value ranges from 0 to 60000. The default value is 6000.

      +
    • COLD_TABLECPACE

      Specifies the OBS tablespace for the cold partitions in a hot or cold table. This parameter is available only to partitioned column-store tables and cannot be modified. It must be used together with storage_policy.

      +

      Valid value: a valid OBS tablespace name

      +
    • STORAGE_POLICY

      Specifies the rule for switching between hot and cold partitions. This parameter is used only for multi-temperature tables. It must be used together with cold_tablespace.

      +

      Value range: Cold and hot switchover policy name:Cold and hot switchover threshold. Currently, only LMT and HPN policies are supported. LMT indicates that the switchover is performed based on the last update time of partitions. HPN indicates the switchover is performed based on a fixed number of reserved hot partitions.

      +
      • LMT:[day]: Switch the hot partition data that is not updated in the last [day] days to the OBS tablespace as cold partition data. [day] is an integer ranging from 0 to 36500, in days.
      • HPN:[hot_partition_num]: [hot_partition_num] indicates the number of hot partitions (with data) to be retained. The rule is to find the maximum sequence ID of the partitions with data. The partitions without data whose sequence ID is greater than the maximum sequence ID are hot partitions, and [hot_partition_num] partitions are retained as hot partitions in descending order according to the sequence ID. A partition whose sequence ID is smaller than the minimum sequence ID of the retained hot partition is a cold partition. During hot and cold partition switchover, data needs to be migrated to the OBS tablespace. [hot_partition_num] is an integer ranging from 0 to 1600.
      +
    • COLVERSION

      Specifies the version of the column-store format. Switching between different storage formats is supported. However, the storage format of a partitioned table cannot be switched.

      +

      Valid value:

      +

      1.0: Each column in a column-store table is stored in a separate file. The file name is relfilenode.C1.0, relfilenode.C2.0, relfilenode.C3.0, or similar.

      +

      2.0: All columns of a column-store table are combined and stored in a file. The file is named relfilenode.C1.0.

      +

      Default value: 2.0

      +

      The value of COLVERSION can only be set to 2.0 for OBS hot and cold tables.

      +

      When creating a column-store table, set COLVERSION to 2.0. Compared with the 1.0 storage format, the performance is significantly improved:

      +
      1. The time required for creating a column-store wide table is significantly reduced.
      2. In the Roach data backup scenario, the backup time is significantly reduced.
      3. The build and catch up time is greatly reduced.
      4. The occupied disk space decreases significantly.
      +
      +
    • SKIP_FPI_HINT

      Indicates whether to skip the hint bits operation when the full-page writes (FPW) log needs to be written during sequential scanning.

      +
      Default value: false

      If SKIP_FPI_HINT is set to true and the checkpoint operation is performed on a table, no Xlog will be generated when the table is sequentially scanned. This applies to intermediate tables that are queried less frequently, reducing the size of Xlogs and improving query performance.

      +
      +
      +
    +
  • COMPRESS / NOCOMPRESS

    Specifies the keyword COMPRESS during the creation of a table, so that the compression feature is triggered in the case of a bulk INSERT operation. If this feature is enabled, a scan is performed for all tuple data within the page to generate a dictionary and then the tuple data is compressed and stored. If NOCOMPRESS is specified, the table is not compressed.

    +

    Default value: NOCOMPRESS, tuple data is not compressed before storage.

    +
  • TABLESPACE tablespace_name

    Specifies the new table will be created in tablespace_name tablespace. If not specified, default tablespace is used. The OBS tablespace is not supported.

    +
  • DISTRIBUTE BY

    Specifies how the table is distributed or replicated between DNs.

    +

    Valid value:

    +
    • REPLICATION: Each row in the table exists on all DNs, that is, each DN has complete table data.
    • HASH (column_name): Each row of the table will be placed into all the DNs based on the hash value of the specified column.
    +
    • When DISTRIBUTE BY HASH (column_name) is specified, the primary key and its unique index must contain the column_name column.
    • When DISTRIBUTE BY HASH (column_name) in a referenced table is specified, the foreign key of the reference table must contain the column_name column.
    +
    +

    Default value: HASH(column_name), the key column of column_name (if any) or the column of distribution column supported by first data type.

    +

    column_name supports the following data types:

    +
    • INTEGER TYPES: TINYINT, SMALLINT, INT, BIGINT, NUMERIC/DECIMAL
    • CHARACTER TYPES: CHAR, BPCHAR, VARCHAR, VARCHAR2, NVARCHAR2
    • DATA/TIME TYPES: DATE, TIME, TIMETZ, TIMESTAMP, TIMESTAMPTZ, INTERVAL, SMALLDATETIME
    +
  • TO { GROUP groupname | NODE ( nodename [, ... ] ) }

    TO GROUP specifies the Node Group in which the table is created. Currently, it cannot be used for HDFS tables. TO NODE is used for internal scale-out tools.

    +
  • PARTITION BY RANGE(partition_key)

    Creates a range partition. partition_key is the name of the partition key.

    +

    (1) Assume that the VALUES LESS THAN syntax is used.

    +

    In this case, a maximum of four partition keys are supported.

    +
    +

    Data types supported by the partition keys are as follows: SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC, REAL, DOUBLE PRECISION, CHARACTER VARYING(n), VARCHAR(n), CHARACTER(n), CHAR(n), CHARACTER, CHAR, TEXT, NVARCHAR2, NAME, TIMESTAMP[(p)] [WITHOUT TIME ZONE], TIMESTAMP[(p)] [WITH TIME ZONE], and DATE.

    +

    (2) Assume that the START END syntax is used.

    +

    In this case, only one partition key is supported.

    +
    +

    Data types supported by the partition key are as follows: SMALLINT, INTEGER, BIGINT, DECIMAL, NUMERIC, REAL, DOUBLE PRECISION, TIMESTAMP[(p)] [WITHOUT TIME ZONE], TIMESTAMP[(p)] [WITH TIME ZONE], and DATE.

    +
  • PARTITION partition_name VALUES LESS THAN ( { partition_value | MAXVALUE } )

    Specifies the information of partitions. partition_name is the name of a range partition. partition_value is the upper limit of range partition, and the value depends on the type of partition_key. MAXVALUE can specify the upper boundary of a range partition, and it is commonly used to specify the upper boundary of the last range partition.

    +
    • Upper boundaries must be specified for each partition.
    • The types of upper boundaries must be the same as those of partition keys.
    • In a partition list, partitions are arranged in ascending order of upper boundary values. Therefore, a partition with a certain upper boundary value is placed before another partition with a larger upper boundary value.
    • If a partition key consists of multiple columns, the columns are used for partitioning in sequence. The first column is preferred to be used for partitioning. If the values of the first columns are the same, the second column is used. The subsequent columns are used in the same manner.
    +
    +
  • PARTITION partition_name {START (partition_value) END (partition_value) EVERY (interval_value)} | {START (partition_value) END (partition_value|MAXVALUE)} | {START(partition_value)} | {END (partition_value | MAXVALUE)}

    Specifies partition definitions.

    +
    • partition_name: name or name prefix of a range partition. It is the name prefix only in the following cases (assuming that partition_name is p1):
      • If START+END+EVERY is used, the names of partitions will be defined as p1_1, p1_2, and the like. For example, if PARTITION p1 START(1) END(4) EVERY(1) is defined, the generated partitions are [1, 2), [2, 3), and [3, 4), and their names are p1_1, p1_2, and p1_3. In this case, p1 is a name prefix.
      • If the defined statement is in the first place and has START specified, the range (MINVALUE, START) will be automatically used as the first actual partition, and its name will be p1_0. The other partitions are then named p1_1, p1_2, and the like. For example, if PARTITION p1 START(1), PARTITION p2 START(2) is defined, generated partitions are (MINVALUE, 1), [1, 2), and [2, MAXVALUE), and their names will be p1_0, p1_1, and p2. In this case, p1 is a name prefix and p2 is a partition name. MINVALUE means the minimum value.
      +
    • partition_value: start point value or end point value of a range partition. The value depends on partition_key and cannot be MAXVALUE.
    • interval_value: width of each partition for dividing the [START, END) range. It cannot be MAXVALUE. If the value of (ENDSTART) divided by EVERY has a remainder, the width of only the last partition is less than the value of EVERY.
    • MAXVALUE: maximum value. It is usually used to set the upper boundary for the last range partition.
    +
    1. If the defined statement is in the first place and has START specified, the range (MINVALUE, START) will be automatically used as the first actual partition.
    2. The START END syntax must comply with the following rules:
      • The value of START (if any, same for the following situations) in each partition_start_end_item must be smaller than that of END.
      • In two adjacent partition_start_end_item statements, the value of the first END must be equal to that of the second START.
      • The value of EVERY in each partition_start_end_item must be a positive number (in ascending order) and must be smaller than END minus START.
      • Each partition includes the start value (unless it is MINVALUE) and excludes the end value. The format is as follows: [Start value, end value).
      • Partitions created by the same partition_start_end_item belong to the same tablespace.
      • If partition_name is a name prefix of a partition, the length must not exceed 57 bytes. If there are more than 57 bytes, the prefix will be automatically truncated.
      • When creating or modifying a partitioned table, ensure that the total number of partitions in the table does not exceed the maximum value (32767).
      +
    3. In statements for creating partitioned tables, START END and LESS THAN cannot be used together.
    4. The START END syntax in a partitioned table creation SQL statement will be replaced with the VALUES LESS THAN syntax when gs_dump is executed.
    +
    +
  • { ENABLE | DISABLE } ROW MOVEMENT

    Specifies the row movement switch.

    +

    If the tuple value is updated on the partition key during the UPDATE action, the partition where the tuple is located is altered. Setting of this parameter enables error messages to be reported or movement of the tuple between partitions.

    +

    Valid value:

    +
    • ENABLE: Row movement is enabled.
    • DISABLE (default value): Disable row movement.
    +
+
+
  • NOT NULL

    Indicates that the column is not allowed to contain NULL values. ENABLE can be omitted.

    +
  • NULL

    Indicates that the column is allowed to contain NULL values. This is the default setting.

    +

    This clause is only provided for compatibility with non-standard SQL databases. You are advised not to use this clause.

    +
  • CHECK (condition) [ NO INHERIT ]

    Specifies an expression producing a Boolean result which new or updated rows must satisfy for an insert or update operation to succeed. Expressions evaluating to TRUE or UNKNOWN succeed. If any row of an insert or update operation produces a FALSE result, an error exception is raised and the insert or update does not alter the database.

    +

    A check constraint specified as a column constraint should reference only the column's values, while an expression appearing in a table constraint can reference multiple columns.

    +

    A constraint marked with NO INHERIT will not propagate to child tables.

    +

    ENABLE can be omitted.

    +
  • DEFAULT default_expr

    Assigns a default data value for a column. The value can be any variable-free expressions (Subqueries and cross-references to other columns in the current table are not allowed). The data type of the default expression must match the data type of the column.

    +

    The default expression will be used in any insert operation that does not specify a value for the column. If there is no default value for a column, then the default value is NULL.

    +
  • UNIQUE index_parameters

    UNIQUE ( column_name [, ... ] ) index_parameters

    +

    Specifies that a group of one or more columns of a table can contain only unique values.

    +

    For the purpose of a unique constraint, NULL is not considered equal.

    +

    If DISTRIBUTE BY REPLICATION is not specified, the column table that contains only unique values must contain distribution columns.

    +
    +
  • PRIMARY KEY index_parameters

    PRIMARY KEY ( column_name [, ... ] ) index_parameters

    +

    Specifies the primary key constraint specifies that a column or columns of a table can contain only unique (non-duplicate) and non-null values.

    +

    Only one primary key can be specified for a table.

    +

    If DISTRIBUTE BY REPLICATION is not specified, the column set with a primary key constraint must contain distributed columns.

    +
    +
  • DEFERRABLE | NOT DEFERRABLE

    Controls whether the constraint can be deferred. A constraint that is not deferrable will be checked immediately after every command. Checking of constraints that are deferrable can be postponed until the end of the transaction using the SET CONSTRAINTS command. NOT DEFERRABLE is the default value. Currently, only UNIQUE and PRIMARY KEY constraints of row-store tables accept this clause. All the other constraints are not deferrable.

    +
  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    If a constraint is deferrable, this clause specifies the default time to check the constraint.

    +
    • If the constraint is INITIALLY IMMEDIATE (default value), it is checked after each statement.
    • If the constraint is INITIALLY DEFERRED, it is checked only at the end of the transaction.
    +

    The constraint check time can be altered using the SET CONSTRAINTS command.

    +
  • USING INDEX TABLESPACE tablespace_name

    Allows selection of the tablespace in which the index associated with a UNIQUE or PRIMARY KEY constraint will be created. If not specified, default_tablespace is consulted, or the default tablespace in the database if default_tablespace is empty. The OBS tablespace is not supported.

    +
+

Examples

  • Example 1: Create a range-partitioned table tpcds.web_returns_p1. The table has eight partitions and the data type of their partition key is integer. The ranges of the partitions are: wr_returned_date_sk < 2450815, 2450815 ≤ wr_returned_date_sk < 2451179, 2451179 ≤ wr_returned_date_sk < 2451544, 2451544 ≤ wr_returned_date_sk < 2451910, 2451910 ≤ wr_returned_date_sk < 2452275, 2452275 ≤ wr_returned_date_sk < 2452640, 2452640 ≤ wr_returned_date_sk < 2453005, and wr_returned_date_sk ≥ 2453005.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    CREATE TABLE tpcds.web_returns_p1
    +(
    +    WR_RETURNED_DATE_SK       INTEGER                       ,
    +    WR_RETURNED_TIME_SK       INTEGER                       ,
    +    WR_ITEM_SK                INTEGER               NOT NULL,
    +    WR_REFUNDED_CUSTOMER_SK   INTEGER                       ,
    +    WR_REFUNDED_CDEMO_SK      INTEGER                       ,
    +    WR_REFUNDED_HDEMO_SK      INTEGER                       ,
    +    WR_REFUNDED_ADDR_SK       INTEGER                       ,
    +    WR_RETURNING_CUSTOMER_SK  INTEGER                       ,
    +    WR_RETURNING_CDEMO_SK     INTEGER                       ,
    +    WR_RETURNING_HDEMO_SK     INTEGER                       ,
    +    WR_RETURNING_ADDR_SK      INTEGER                       ,
    +    WR_WEB_PAGE_SK            INTEGER                       ,
    +    WR_REASON_SK              INTEGER                       ,
    +    WR_ORDER_NUMBER           BIGINT                NOT NULL,
    +    WR_RETURN_QUANTITY        INTEGER                       ,
    +    WR_RETURN_AMT             DECIMAL(7,2)                  ,
    +    WR_RETURN_TAX             DECIMAL(7,2)                  ,
    +    WR_RETURN_AMT_INC_TAX     DECIMAL(7,2)                  ,
    +    WR_FEE                    DECIMAL(7,2)                  ,
    +    WR_RETURN_SHIP_COST       DECIMAL(7,2)                  ,
    +    WR_REFUNDED_CASH          DECIMAL(7,2)                  ,
    +    WR_REVERSED_CHARGE        DECIMAL(7,2)                  ,
    +    WR_ACCOUNT_CREDIT         DECIMAL(7,2)                  ,
    +    WR_NET_LOSS               DECIMAL(7,2)
    +)
    +WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
    +DISTRIBUTE BY HASH (WR_ITEM_SK)
    +PARTITION BY RANGE(WR_RETURNED_DATE_SK)
    +(
    +        PARTITION P1 VALUES LESS THAN(2450815),
    +        PARTITION P2 VALUES LESS THAN(2451179),
    +        PARTITION P3 VALUES LESS THAN(2451544),
    +        PARTITION P4 VALUES LESS THAN(2451910),
    +        PARTITION P5 VALUES LESS THAN(2452275),
    +        PARTITION P6 VALUES LESS THAN(2452640),
    +        PARTITION P7 VALUES LESS THAN(2453005),
    +        PARTITION P8 VALUES LESS THAN(MAXVALUE)
    +);
    +
    + +
    +
  • Example 2: Create a range partitioned table tpcds.web_returns_p2. The table has eight partitions and the data type of their partition key is integer. The upper limit of the eighth partition is MAXVALUE.

    The ranges of the partitions are: wr_returned_date_sk < 2450815, 2450815 ≤ wr_returned_date_sk < 2451179, 2451179 ≤ wr_returned_date_sk < 2451544, 2451544 ≤ wr_returned_date_sk < 2451910, 2451910 ≤ wr_returned_date_sk < 2452275, 2452275 ≤ wr_returned_date_sk < 2452640, 2452640 ≤ wr_returned_date_sk < 2453005, and wr_returned_date_sk ≥ 2453005.

    +

    Assume that CN and DN data directory/pg_location/mount1/path1, CN and DN data directory/pg_location/mount2/path2, CN and DN data directory/pg_location/mount3/path3, and CN and DN data directory/pg_location/mount4/path4 are empty directories for which user dwsadmin has read and write permissions.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    CREATE TABLE tpcds.web_returns_p2
    +(
    +    WR_RETURNED_DATE_SK       INTEGER                       ,
    +    WR_RETURNED_TIME_SK       INTEGER                       ,
    +    WR_ITEM_SK                INTEGER               NOT NULL,
    +    WR_REFUNDED_CUSTOMER_SK   INTEGER                       ,
    +    WR_REFUNDED_CDEMO_SK      INTEGER                       ,
    +    WR_REFUNDED_HDEMO_SK      INTEGER                       ,
    +    WR_REFUNDED_ADDR_SK       INTEGER                       ,
    +    WR_RETURNING_CUSTOMER_SK  INTEGER                       ,
    +    WR_RETURNING_CDEMO_SK     INTEGER                       ,
    +    WR_RETURNING_HDEMO_SK     INTEGER                       ,
    +    WR_RETURNING_ADDR_SK      INTEGER                       ,
    +    WR_WEB_PAGE_SK            INTEGER                       ,
    +    WR_REASON_SK              INTEGER                       ,
    +    WR_ORDER_NUMBER           BIGINT                NOT NULL,
    +    WR_RETURN_QUANTITY        INTEGER                       ,
    +    WR_RETURN_AMT             DECIMAL(7,2)                  ,
    +    WR_RETURN_TAX             DECIMAL(7,2)                  ,
    +    WR_RETURN_AMT_INC_TAX     DECIMAL(7,2)                  ,
    +    WR_FEE                    DECIMAL(7,2)                  ,
    +    WR_RETURN_SHIP_COST       DECIMAL(7,2)                  ,
    +    WR_REFUNDED_CASH          DECIMAL(7,2)                  ,
    +    WR_REVERSED_CHARGE        DECIMAL(7,2)                  ,
    +    WR_ACCOUNT_CREDIT         DECIMAL(7,2)                  ,
    +    WR_NET_LOSS               DECIMAL(7,2)
    +)
    +DISTRIBUTE BY HASH (WR_ITEM_SK)
    +PARTITION BY RANGE(WR_RETURNED_DATE_SK)
    +(
    +        PARTITION P1 VALUES LESS THAN(2450815),
    +        PARTITION P2 VALUES LESS THAN(2451179),
    +        PARTITION P3 VALUES LESS THAN(2451544),
    +        PARTITION P4 VALUES LESS THAN(2451910),
    +        PARTITION P5 VALUES LESS THAN(2452275),
    +        PARTITION P6 VALUES LESS THAN(2452640),
    +        PARTITION P7 VALUES LESS THAN(2453005),
    +        PARTITION P8 VALUES LESS THAN(MAXVALUE) 
    +)
    +ENABLE ROW MOVEMENT;
    +
    + +
    +
+
+
  • Example 3: Use START END to create and modify a range partitioned table.

    Assume that /home/dbadmin/startend_tbs1, /home/dbadmin/startend_tbs2, /home/dbadmin/startend_tbs3, and /home/dbadmin/startend_tbs4 are empty directories that user dbadmin has read and write permissions for.

    +
    +

    Create a partitioned table with the partition key of type integer.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    CREATE TABLE tpcds.startend_pt (c1 INT, c2 INT) 
    + 
    +DISTRIBUTE BY HASH (c1) 
    +PARTITION BY RANGE (c2) (
    +    PARTITION p1 START(1) END(1000) EVERY(200) ,
    +    PARTITION p2 END(2000),
    +    PARTITION p3 START(2000) END(2500) ,
    +    PARTITION p4 START(2500),
    +    PARTITION p5 START(3000) END(5000) EVERY(1000) 
    +)
    +ENABLE ROW MOVEMENT;
    +
    + +
    +

    View the information of the partitioned table.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    SELECT relname, boundaries FROM pg_partition p where p.parentid='tpcds.startend_pt'::regclass ORDER BY 1;
    +   relname   | boundaries
    +-------------+------------
    + p1_0        | {1}
    + p1_1        | {201}
    + p1_2        | {401}
    + p1_3        | {601}
    + p1_4        | {801}
    + p1_5        | {1000}
    + p2          | {2000}
    + p3          | {2500}
    + p4          | {3000}
    + p5_1        | {4000}
    + p5_2        | {5000}
    + tpcds.startend_pt |
    +(12 rows)
    +
    + +
    +
    +

    Import data and check the data volume in the partition.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    INSERT INTO tpcds.startend_pt VALUES (GENERATE_SERIES(0, 4999), GENERATE_SERIES(0, 4999));
    +SELECT COUNT(*) FROM tpcds.startend_pt PARTITION FOR (0);
    +count
    +-------
    +1
    +(1 row)
    +
    +SELECT COUNT(*) FROM tpcds.startend_pt PARTITION (p3);
    +count
    +-------
    +500
    +(1 row)
    +
    + +
    +

    View the information of the partitioned table.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    SELECT relname, boundaries FROM pg_partition p where p.parentid='tpcds.startend_pt'::regclass ORDER BY 1;
    +   relname   | boundaries
    +-------------+------------
    + p1_0        | {1}
    + p1_1        | {201}
    + p1_2        | {401}
    + p1_3        | {601}
    + p1_4        | {801}
    + p1_5        | {1000}
    + p2          | {2000}
    + p3          | {2500}
    + p4          | {3000}
    + p5_1        | {4000}
    + p6_1        | {5300}
    + p6_2        | {5600}
    + p6_3        | {5900}
    + p71         | {6000}
    + q1_1        | {4250}
    + q1_2        | {4500}
    + q1_3        | {4750}
    + q1_4        | {5000}
    + tpcds.startend_pt |
    +(19 rows)
    +
    + +
    +
  • Example 4: Create a partitioned table customer_address partitioned by month. The table has 13 partitions and the partition keys are dates.
    Create a partitioned table customer_address.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    CREATE TABLE customer_address
    +(
    +    ca_address_sk       integer           NOT NULL,
    +    ca_address_date       date            NOT NULL
    +)
    +DISTRIBUTE BY HASH (ca_address_sk)
    +PARTITION BY RANGE (ca_address_date)
    +(
    +        PARTITION p202001 VALUES LESS THAN('20200101'),
    +        PARTITION p202002 VALUES LESS THAN('20200201'),
    +        PARTITION p202003 VALUES LESS THAN('20200301'),
    +        PARTITION p202004 VALUES LESS THAN('20200401'),
    +        PARTITION p202005 VALUES LESS THAN('20200501'),
    +        PARTITION p202006 VALUES LESS THAN('20200601'),
    +        PARTITION p202007 VALUES LESS THAN('20200701'),
    +        PARTITION p202008 VALUES LESS THAN('20200801'),
    +        PARTITION p202009 VALUES LESS THAN('20200901'),
    +        PARTITION p202010 VALUES LESS THAN('20201001'),
    +        PARTITION p202011 VALUES LESS THAN('20201101'),
    +        PARTITION p202012 VALUES LESS THAN('20201201'),
    +        PARTITION p202013 VALUES LESS THAN(MAXVALUE)
    +);
    +
    + +
    +
    +

    Insert data:

    +
    1
    +2
    +3
    +4
    INSERT INTO customer_address values('1','20200215');
    +INSERT INTO customer_address values('7','20200805');
    +INSERT INTO customer_address values('9','20201111');
    +INSERT INTO customer_address values('4','20201231');
    +
    + +
    +

    Query a partition:

    +
    1
    +2
    +3
    +4
    +5
    SELECT * FROM customer_address PARTITION(p202009);
    + ca_address_sk |   ca_address_date
    +---------------+---------------------
    +             7 | 2020-08-05 00:00:00
    +(1 row)
    +
    + +
    +
  • Example 5: Create multiple partition syntax at a time using the START END syntax.
    • Create a partitioned table day_part. Each day is a partition, and the partition key is a date.
      1
      +2
      +3
      +4
      +5
      CREATE table day_part(id int,d_time date)  
      +DISTRIBUTE BY HASH (id)
      +PARTITION BY RANGE (d_time)
      +(PARTITION p1 START('2022-01-01') END('2022-01-31') EVERY(interval '1 day'));
      +ALTER TABLE  day_part ADD PARTITION pmax VALUES LESS THAN (maxvalue);
      +
      + +
      +
    • Create a partitioned table week_part, seven days as a partition, and the partition key is a date.
      1
      +2
      +3
      +4
      +5
      CREATE table week_part(id int,w_time date)
      +DISTRIBUTE BY HASH (id)
      +PARTITION BY RANGE (w_time) 
      +(PARTITION p1 START('2021-01-01') END('2022-01-01') EVERY(interval '7 day'));
      +ALTER TABLE  week_part ADD PARTITION pmax VALUES LESS THAN (maxvalue);
      +
      + +
      +
    • Create the partition table month_part, each month as a partition, and the partition key is a date.
      1
      +2
      +3
      +4
      +5
      CREATE table month_part(id int,m_time date)
      +DISTRIBUTE BY HASH (id)
      +PARTITION BY RANGE (m_time)
      +(PARTITION p1 START('2021-01-01') END('2022-01-01') EVERY(interval '1 month'));
      +ALTER TABLE  month_part ADD PARTITION pmax VALUES LESS THAN (maxvalue);
      +
      + +
      +
    +

    +
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0182.html b/docs/dws/dev/dws_06_0182.html new file mode 100644 index 00000000..6447064c --- /dev/null +++ b/docs/dws/dev/dws_06_0182.html @@ -0,0 +1,130 @@ + + +

CREATE TEXT SEARCH CONFIGURATION

+

Function

CREATE TEXT SEARCH CONFIGURATION creates a text search configuration. A text search configuration specifies a text search parser that can divide a string into tokens, plus dictionaries that can be used to determine which tokens are of interest for searching.

+
+

Important Notes

  • If only the parser is specified, then the new text search configuration initially has no mappings from token types to dictionaries, and therefore will ignore all words. Subsequent ALTER TEXT SEARCH CONFIGURATION commands must be used to create mappings to make the configuration useful. If COPY option is specified, the parser, mapping and configuration option of text search configuration is copied automatically.
  • If a schema name is specified, the text search configuration will be created in the specified schema. Otherwise, the configuration will be created in the current schema.
  • The user who defines a text search configuration becomes its owner.
  • PARSER and COPY options are mutually exclusive, because when an existing configuration is copied, its parser selection is copied too.
+
+

Syntax

1
+2
+3
CREATE TEXT SEARCH CONFIGURATION name 
+    ( PARSER = parser_name | COPY = source_config )
+    [ WITH ( {configuration_option = value} [, ...] )];
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of the text search configuration to be created. Specifies the name can be schema-qualified.

    +
  • parser_name

    Specifies the name of the text search parser to use for this configuration.

    +
  • source_config

    Specifies the name of an existing text search configuration to copy.

    +
  • configuration_option

    Specifies the configuration parameter of text search configuration is mainly for the parser executed by parser_name or contained by source_config.

    +
    Value range: The default, ngram, and zhparser parsers are supported. The parser of default type has no corresponding configuration_option. Table 1 lists configuration_option for ngram and zhparser parsers. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Configuration parameters for ngram and zhparser parsers

    Parser

    +

    Parameters for adding an account

    +

    Description

    +

    Value Range

    +

    ngram

    +

    gram_size

    +

    Length of word segmentation

    +

    Integer, 1 to 4

    +

    Default value: 2

    +

    punctuation_ignore

    +

    Whether to ignore punctuations

    +
    • true (default value): Ignore punctuations.
    • false: Do not ignore punctuations.
    +

    grapsymbol_ignore

    +

    Whether to ignore graphical characters

    +
    • true: Ignore graphical characters.
    • false (default value): Do not ignore graphical characters.
    +

    zhparser

    +

    punctuation_ignore

    +

    Whether to ignore special characters including punctuations (\r and \n will not be ignored) in the word segmentation result

    +
    • true (default value): Ignore all the special characters including punctuations.
    • false: Do not ignore all the special characters including punctuations.
    +

    seg_with_duality

    +

    Whether to aggregate segments with duality

    +
    • true: Aggregate segments with duality.
    • false (default value): Do not aggregate segments with duality.
    +

    multi_short

    +

    Whether to execute long words composite divide

    +
    • true (default value): Execute long words composite divide.
    • false: Do not execute long words composite divide.
    +

    multi_duality

    +

    Whether to aggregate segments in long words with duality

    +
    • true: Aggregate segments in long words with duality.
    • false (default value): Do not aggregate segments in long words with duality.
    +

    multi_zmain

    +

    Whether to display key single words individually

    +
    • true: Display key single words individually.
    • false (default value): Do not display key single words individually.
    +

    multi_zall

    +

    Whether to display all single words individually.

    +
    • true: Display all single words individually.
    • false (default value): Do not display all single words individually.
    +
    +
    +
    +
+
+

Examples

Create a text search configuration.

+
1
CREATE TEXT SEARCH CONFIGURATION ngram1 (parser=ngram) WITH (gram_size = 2, grapsymbol_ignore = false);
+
+ +
+

Create a text search configuration.

+
1
CREATE TEXT SEARCH CONFIGURATION ngram2 (copy=ngram1) WITH (gram_size = 2, grapsymbol_ignore = false);
+
+ +
+

Create a text search configuration.

+
1
CREATE TEXT SEARCH CONFIGURATION english_1 (parser=default);
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0183.html b/docs/dws/dev/dws_06_0183.html new file mode 100644 index 00000000..b736988d --- /dev/null +++ b/docs/dws/dev/dws_06_0183.html @@ -0,0 +1,96 @@ + + +

CREATE TEXT SEARCH DICTIONARY

+

Function

CREATE TEXT SEARCH DICTIONARY creates a full-text search dictionary. A dictionary is used to identify and process specified words during full-text search.

+

Dictionaries are created by using predefined templates (defined in the PG_TS_TEMPLATE system catalog). Five types of dictionaries can be created, Simple, Ispell, Synonym, Thesaurus, and Snowball. Each type of dictionaries is used to handle different tasks.

+
+

Precautions

  • A user with the SYSADMIN permission can create a dictionary. Then, the user automatically becomes the owner of the dictionary.
  • A dictionary cannot be created in pg_temp mode.
  • After a dictionary is created or modified, any modification to the user-defined dictionary definition file will not affect the dictionary in the database. To make such modifications take effect in the dictionary in the database, run the ALTER statement to update the definition file of the dictionary.
+
+

Syntax

1
+2
+3
+4
CREATE TEXT SEARCH DICTIONARY name (
+    TEMPLATE = template
+    [, option = value [, ... ]]
+);
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of a dictionary to be created. (If you do not specify a schema name, the dictionary will be created in the current schema.)

    +

    Value range: a string, which complies with the identifier naming convention. A value can contain a maximum of 63 characters.

    +
  • template

    Specifies a template name.

    +

    Value range: templates (Simple, Synonym, Thesaurus, Ispell, and Snowball) defined in the PG_TS_TEMPLATE system catalog

    +
  • option

    Specifies a parameter name. Each type of dictionaries has a template containing their custom parameters. Parameters function in a way irrelevant to their setting sequence.

    +
    • Parameters for a Simple dictionary
      • STOPWORDS

        Specifies the name of a file listing stop words. The default file name extension is .stop. For example, if the value of STOPWORDS is french, the actual file name is french.stop. In the file, each line defines a stop word. Dictionaries will ignore blank lines and spaces in the file and convert stop-word phrases into lowercase.

        +
      • ACCEPT

        Specifies whether to accept a non-stop word as recognized. The default value is true.

        +

        If ACCEPT=true is set for a Simple dictionary, no token will be passed to subsequent dictionaries. In this case, you are advised to place the Simple dictionary at the end of the dictionary list. If ACCEPT=false is set, you are advised to place the Simple dictionary before at least one dictionary in the list.

        +
      • FILEPATH

        Specifies the directory for storing the stop word file. The stop word file can be stored locally or on the OBS server. If the file is stored locally, the directory format is 'file://absolute_path'. If the file is stored on the OBS server, the directory format is 'obs://bucket/path accesskey=ak secretkey=sk region=region_name'. The directory must be enclosed in single quotation marks ('). The default value is the directory where predefined dictionary files are located. Both the FILEPATH and STOPWORDS parameters need to be specified.

        +

        To create a dictionary using the stop word file on the OBS server, perform the following steps:

        +
        1. Upload the stop word file to the OBS server. For example, upload the french.stop file to the gaussdb bucket on the OBS server obsv3.sa-fb-1.externaldemo.com. The URL is https://gaussdb.obsv3.sa-fb-1.externaldemo.com/french.stop. For details about how to upload the file and query the URL, see the OBS User Manual.
        2. Add "region_name": "obs domain" to the $GAUSSHOME/etc/region_map file. region_name can be a string consisting of uppercase letters, lowercase letters, digits, slashes (/), or underscores (_). obs domain indicates the domain name of the OBS server.

          For example, if region_name is set to rg, region_map is as follows: "rg": "obsv3.sa-fb-1.externaldemo.com".

          +

          region_name and obs domain are enclosed in double quotation marks. There is no space on the left of the colon and one space on the right of the colon.

          +
          +
        3. Run the CREATE TEXT SEARCH DICTIONARY command to create a dictionary. The command is as follows:
        +
           CREATE TEXT SEARCH DICTIONARY french_dict ( TEMPLATE = pg_catalog.simple, STOPWORDS = french, FILEPATH = 'obs://gaussdb accesskey=xxx secretkey=yyy region=rg' );
        +

        The french.stop file is stored in the root directory of the gaussdb bucket. Therefore, the path is empty.

        +
      +
    • Parameters for a Synonym dictionary
      • SYNONYM

        Specifies the name of the definition file for a Synonym dictionary. The default file name extension is .syn.

        +

        The file is a list of synonyms. Each line is in the format of token synonym, that is, token and its synonym separated by a space.

        +
      • CASESENSITIVE

        Specifies whether tokens and their synonyms are case sensitive. The default value is false, indicating that tokens and synonyms in dictionary files will be converted into lowercase. If this parameter is set to true, they will not be converted into lowercase.

        +
      • FILEPATH

        Specifies the directory for storing Synonym dictionary files. The directory can be a local directory or an OBS directory. The default value is the directory where predefined dictionary files are located. The directory format and the process of creating a Synonym dictionary using a file on the OBS server are the same as those of the FILEPATH of the Simple dictionary.

        +
      +
    • Parameters for a Thesaurus dictionary
      • DICTFILE

        Specifies the name of a dictionary definition file. The default file name extension is .ths.

        +

        The file is a list of synonyms. Each line is in the format of sample words : indexed words. The colon (:) is used as a separator between a phrase and its substitute word. If multiple sample words are matched, the TZ selects the longest one.

        +
      +
      • DICTIONARY

        Specifies the name of a subdictionary used for word normalization. This parameter is mandatory and only one subdictionary name can be specified. The specified subdictionary must exist. It is used to identify and normalize input text before phrase matching.

        +

        If an input word cannot be recognized by the subdictionary, an error will be reported. In this case, remove the word or update the subdictionary to make the word recognizable. In addition, an asterisk (*) can be placed at the beginning of an indexed word to skip the application of a subdictionary on it, but all sample words must be recognizable by the subdictionary.

        +
        If the sample words defined in the dictionary file contain stop words defined in the subdictionary, use question marks (?) to replace them. Assume that a and the are stop words defined in the subdictionary.
        ? one ? two : swsw
        +
        +

        a one the two and the one a two will be matched and output as swsw.

        +
      • FILEPATH

        Specifies the directory for storing dictionary definition files. The directory can be a local directory or an OBS directory. The default value is the directory where predefined dictionary files are located. The directory format and the process of creating a Synonym dictionary using a file on the OBS server are the same as those of the FILEPATH of the Simple dictionary.

        +
      +
    • Parameters for an Ispell dictionary
      • DICTFILE

        Specifies the name of a dictionary definition file. The default file name extension is .dict.

        +
      • AFFFILE

        Specifies the name of an affix file. The default file name extension is .affix.

        +
      • STOPWORDS

        Specifies the name of a file listing stop words. The default file name extension is .stop. The file content format is the same as that of the file for a Simple dictionary.

        +
      • FILEPATH

        Specifies the directory for storing dictionary files. The directory can be a local directory or an OBS directory. The default value is the directory where predefined dictionary files are located. The directory format and the process of creating a Synonym dictionary using a file on the OBS server are the same as those of the FILEPATH of the Simple dictionary.

        +
      +
    • Parameters for a Snowball dictionary
      • LANGUAGE

        Specifies the name of a language whose stemming algorithm will be used. According to spelling rules in the language, the algorithm normalizes the variants of an input word into a basic word or a stem.

        +
      • STOPWORDS

        Specifies the name of a file listing stop words. The default file name extension is .stop. The file content format is the same as that of the file for a Simple dictionary.

        +
      +
      • FILEPATH

        Specifies the directory for storing dictionary definition files. The directory can be a local directory or an OBS directory. The default value is the directory where predefined dictionary files are located. Both the FILEPATH and STOPWORDS parameters need to be specified. The directory format and the process of creating a Snowball dictionary using a file on the OBS server are the same as those of the Simple dictionary.

        +
      +
    +
    • The predefined dictionary file is stored in the $GAUSSHOME/share/postgresql/tsearch_data directory.
    +
    • The name of a dictionary definition file can contain only lowercase letters, numbers, and underscores (_).
    +
    +
  • value

    Specifies a parameter value. If the value is not an identifier or a number, enclose it with single quotation marks (''). You can also enclose identifiers and numbers with single quotation marks.

    +
+
+

Examples

Create an Ispell dictionary english_ispell (the dictionary definition file is from the open source dictionary).
1
+2
+3
+4
+5
+6
+7
CREATE TEXT SEARCH DICTIONARY english_ispell (
+    TEMPLATE = ispell,
+    DictFile = english,
+    AffFile = english,
+    StopWords = english,
+    FilePath = 'obs://bucket_name/path accesskey=ak secretkey=sk region=rg' 
+);
+
+ +
+
+

See examples in Configuration Examples.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0184.html b/docs/dws/dev/dws_06_0184.html new file mode 100644 index 00000000..4d9b829b --- /dev/null +++ b/docs/dws/dev/dws_06_0184.html @@ -0,0 +1,313 @@ + + +

CREATE TRIGGER

+

Function

CREATE TRIGGER creates a trigger. The trigger will be associated with a specified table or view, and will execute a specified function when certain events occur.

+
+

Precautions

  • Currently, triggers can be created only on ordinary row-store tables, instead of on column-store tables, temporary tables, or unlogged tables.
  • If multiple triggers of the same kind are defined for the same event, they will be fired in alphabetical order by name.
  • A trigger works only on one table. There is no limit on the number of triggers that can be created. However, more triggers on a table consume more performance.
  • Triggers are usually used for data association and synchronization between multiple tables. SQL execution performance is greatly affected. Therefore, you are advised not to use this statement when a large amount of data needs to be synchronized and performance requirements are high.
  • When a trigger meets the following conditions, the trigger statement and trigger itself can be pushed together down to a DN for execution, improving the trigger execution performance:
    • enable_trigger_shipping and enable_fast_query_shipping are both enabled. (This is the default configuration.)
    • The trigger function used by the source table is a PL/pgSQL function (recommended).
    • The source and target tables have the same type and number of distribution keys, are both row-store tables, and belong to the same Node Group.
    • The INSERT, UPDATE, or DELETE statement on the source table contains an expression about equality comparison between all the distribution keys and the NEW or OLD variable.
    • The INSERT, UPDATE, or DELETE statement on the source table can be pushed down without a trigger.
    • There are only six types of triggers, specified by INSERT/UPDATE/DELETE, AFTER/BEFORE, and FOR EACH ROW, on the source table, and all the triggers can be pushed down.
    +
+
+

Syntax

1
+2
+3
+4
+5
+6
+7
CREATE [ CONSTRAINT ] TRIGGER trigger_name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
+    ON table_name
+    [ FROM referenced_table_name ]
+    { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }
+    [ FOR [ EACH ] { ROW | STATEMENT } ]
+    [ WHEN ( condition ) ]
+    EXECUTE PROCEDURE function_name ( arguments );
+
+ +
+

Events include:

+
1
+2
+3
+4
    INSERT
+    UPDATE [ OF column_name [, ... ] ]
+    DELETE
+    TRUNCATE
+
+ +
+
+

Parameter Description

  • CONSTRAINT

    (Optional) Creates a constraint trigger, that is, a trigger is used as a constraint. Such a trigger is similar to a regular trigger except that the timing of the trigger firing can be adjusted using SET CONSTRAINTS. Constraint triggers must be AFTER ROW triggers.

    +
  • trigger_name

    Specifies the name of a new trigger. The name cannot be schema-qualified because the trigger inherits the schema of its table. In addition, triggers on the same table cannot be named the same. For a constraint trigger, this is also the name to use when you modify the trigger's behavior using SET CONSTRAINTS.

    +

    Value range: a string that complies with the identifier naming convention. A value can contain a maximum of 63 characters.

    +
  • BEFORE

    Specifies that a trigger function is called before the trigger event.

    +
  • AFTER

    Specifies that a trigger function is called after the trigger event. A constraint trigger can only be specified as AFTER.

    +
  • INSTEAD OF

    Specifies that a trigger function directly replaces the trigger event.

    +
  • event

    Specifies the event that will fire a trigger. Values are INSERT, UPDATE, DELETE, and TRUNCATE. You can also specify multiple trigger events through OR.

    +

    For UPDATE events, use the following syntax to specify a list of columns:

    +
    1
    UPDATE OF column_name1 [, column_name2 ... ]
    +
    + +
    +

    The trigger will only fire if at least one of the listed columns is mentioned as a target of the UPDATE statement. INSTEAD OF UPDATE events do not support lists of columns.

    +
  • table_name

    Specifies the name of the table where a trigger needs to be created.

    +

    Value range: name of an existing table in the database

    +
  • referenced_table_name

    Specifies the name of another table referenced by a constraint. This parameter can be specified only for constraint triggers. It does not support foreign key constraints and is not recommended for general use.

    +

    Value range: name of an existing table in the database

    +
  • DEFERRABLE | NOT DEFERRABLE

    Controls whether a constraint can be deferred. The two parameters determine the timing for firing a constraint trigger, and can be specified only for constraint triggers.

    +

    For details, see CREATE TABLE.

    +
  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    If a constraint is deferrable, the two clauses specify the default time to check the constraint, and can be specified only for constraint triggers.

    +

    For details, see CREATE TABLE.

    +
  • FOR EACH ROW | FOR EACH STATEMENT

    Specifies the frequency of firing a trigger.

    +
    • FOR EACH ROW indicates that the trigger should be fired once for every row affected by the trigger event.
    • FOR EACH STATEMENT indicates that the trigger should be fired just once per SQL statement.
    +

    If this parameter is not specified, the default value FOR EACH STATEMENT will be used. Constraint triggers can only be specified as FOR EACH ROW.

    +
  • condition

    Specifies a Boolean expression that determines whether a trigger function will actually be executed. If WHEN is specified, the function will be called only when condition returns true.

    +

    In FOR EACH ROW triggers, the WHEN condition can reference the columns of old or new row values by writing OLD.column_name or NEW.column_name, respectively. In addition, INSERT triggers cannot reference OLD and DELETE triggers cannot reference NEW.

    +

    INSTEAD OF triggers do not support WHEN conditions.

    +

    WHEN expressions cannot contain subqueries.

    +

    For constraint triggers, evaluation of the WHEN condition is not deferred, but occurs immediately after the update operation is performed. If the condition does not return true, the trigger will not be queued for deferred execution.

    +
  • function_name

    Specifies a user-defined function, which must be declared as taking no parameters and returning data of the trigger type. This function is executed when a trigger fires.

    +
  • arguments

    Specifies an optional, comma-separated list of parameters to be provided to a function when a trigger is executed. Parameters are literal string constants. Simple names and numeric constants can also be included, but they will all be converted to strings. Check descriptions of the implementation language of a trigger function to find out how these parameters are accessed within the function.

    +

    The following details trigger types:

    +
    • INSTEAD OF triggers must be marked as FOR EACH ROW and can be defined only on views.
    • BEFORE and AFTER triggers on a view must be marked as FOR EACH STATEMENT.
    • TRUNCATE triggers must be marked as FOR EACH STATEMENT.
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1 Types of triggers supported on tables and views

    Trigger Timing

    +

    Trigger Event

    +

    Row-level

    +

    Statement-level

    +

    BEFORE

    +

    INSERT/UPDATE/DELETE

    +

    Tables

    +

    Tables and views

    +

    TRUNCATE

    +

    Not supported

    +

    Tables

    +

    AFTER

    +

    INSERT/UPDATE/DELETE

    +

    Tables

    +

    Tables and views

    +

    TRUNCATE

    +

    Not supported

    +

    Tables

    +

    INSTEAD OF

    +

    INSERT/UPDATE/DELETE

    +

    Views

    +

    Not supported

    +

    TRUNCATE

    +

    Not supported

    +

    Not supported

    +
    +
    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2 Special variables in the functions PL/pgSQL triggers

    Variable

    +

    Description

    +

    NEW

    +

    New tuple for INSERT/UPDATE operations. This variable is NULL for DELETE operations.

    +

    OLD

    +

    Old tuple for UPDATE/DELETE operations. This variable is NULL for INSERT operations.

    +

    TG_NAME

    +

    Trigger name

    +

    TG_WHEN

    +

    Trigger timing (BEFORE/AFTER/INSTEAD OF)

    +

    TG_LEVEL

    +

    Trigger frequency (ROW/STATEMENT)

    +

    TG_OP

    +

    Trigger event (INSERT/UPDATE/DELETE/TRUNCATE)

    +

    TG_RELID

    +

    OID of the table where a trigger is located

    +

    TG_RELNAME

    +

    Name of the table where a trigger is located. (This variable is now discarded and is replaced by TG_TABLE_NAME.)

    +

    TG_TABLE_NAME

    +

    Name of the table where a trigger is located.

    +

    TG_TABLE_SCHEMA

    +

    Schema information of the table where a trigger is located

    +

    TG_NARGS

    +

    Number of parameters for a trigger function

    +

    TG_ARGV[]

    +

    List of parameters for a trigger function

    +
    +
    +
+
+

Examples

Create a source table and a target table.

+
1
CREATE TABLE test_trigger_src_tbl(id1 INT, id2 INT, id3 INT);
+
+ +
+
1
CREATE TABLE test_trigger_des_tbl(id1 INT, id2 INT, id3 INT);
+
+ +
+

Create the trigger function tri_insert_func().

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE OR REPLACE FUNCTION tri_insert_func() RETURNS TRIGGER AS
+           $$
+           DECLARE
+           BEGIN
+                   INSERT INTO test_trigger_des_tbl VALUES(NEW.id1, NEW.id2, NEW.id3);
+                   RETURN NEW;
+           END
+           $$ LANGUAGE PLPGSQL;
+
+ +
+

Create the trigger function tri_update_func().

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE OR REPLACE FUNCTION tri_update_func() RETURNS TRIGGER AS
+           $$
+           DECLARE
+           BEGIN
+                   UPDATE test_trigger_des_tbl SET id3 = NEW.id3 WHERE id1=OLD.id1;
+                   RETURN OLD;
+           END
+           $$ LANGUAGE PLPGSQL;
+
+ +
+

Create the trigger function tri_delete_func().

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE OR REPLACE FUNCTION tri_delete_func() RETURNS TRIGGER AS
+           $$
+           DECLARE
+           BEGIN
+                   DELETE FROM test_trigger_des_tbl WHERE id1=OLD.id1;
+                   RETURN OLD;
+           END
+           $$ LANGUAGE PLPGSQL;
+
+ +
+

Create an INSERT trigger.

+
1
+2
+3
+4
CREATE TRIGGER insert_trigger
+           BEFORE INSERT ON test_trigger_src_tbl
+           FOR EACH ROW
+           EXECUTE PROCEDURE tri_insert_func();
+
+ +
+

Create an UPDATE trigger.

+
1
+2
+3
+4
CREATE TRIGGER update_trigger
+           AFTER UPDATE ON test_trigger_src_tbl  
+           FOR EACH ROW
+           EXECUTE PROCEDURE tri_update_func();
+
+ +
+

Create a DELETE trigger.

+
1
+2
+3
+4
CREATE TRIGGER delete_trigger
+           BEFORE DELETE ON test_trigger_src_tbl
+           FOR EACH ROW
+           EXECUTE PROCEDURE tri_delete_func();
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0185.html b/docs/dws/dev/dws_06_0185.html new file mode 100644 index 00000000..01787695 --- /dev/null +++ b/docs/dws/dev/dws_06_0185.html @@ -0,0 +1,394 @@ + + +

CREATE TYPE

+

Function

CREATE TYPE defines a new data type in the current database. The user who defines a new data type becomes its owner. Types are designed only for row-store tables.

+

Four types of data can be created by using CREATE TYPE: composite data, base data, a shell data, and enumerated data.

+
  • Composite types

    A composite type is specified by a list of attribute names and data types. If the data type of an attribute is collatable, the attribute's collation rule can also be specified. A composite type is essentially the same as the row type of a table. However, using CREATE TYPE avoids the need to create an actual table when only a type needs to be defined. In addition, a standalone composite type is useful, for example, as the parameter or return type of a function.

    +

    To create a composite type, you must have the USAGE permission for all its attribute types.

    +
  • Base types

    You can customize a new base type (scalar type). Generally, functions required for base types must be coded in C or another low-level language.

    +
  • Shell types

    A shell type is simply a placeholder for a type to be defined later. It can be created by delivering CREATE TYPE with no parameters except for a type name. Shell types are needed as forward references when base types are created.

    +
  • Enumerated types

    An enumerated type is a list of enumerated values. Each value is a non-empty string with the maximum length of 64 bytes.

    +
+
+

Precautions

If a schema name is given, the type will be created in the specified schema. Otherwise, it will be created in the current schema. A type name must be different from the name of any existing type or domain in the same schema. (Since tables have associated data types, a type name must also be different from the name of any existing table in the same schema.)

+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
CREATE TYPE name AS
+    ( [ attribute_name data_type [ COLLATE collation ] [, ... ] ] )
+
+CREATE TYPE name (
+    INPUT = input_function,
+    OUTPUT = output_function
+    [ , RECEIVE = receive_function ]
+    [ , SEND = send_function ]
+    [ , TYPMOD_IN =
+type_modifier_input_function ]
+    [ , TYPMOD_OUT =
+type_modifier_output_function ]
+    [ , ANALYZE = analyze_function ]
+    [ , INTERNALLENGTH = { internallength |
+VARIABLE } ]
+    [ , PASSEDBYVALUE ]
+    [ , ALIGNMENT = alignment ]
+    [ , STORAGE = storage ]
+    [ , LIKE = like_type ]
+    [ , CATEGORY = category ]
+    [ , PREFERRED = preferred ]
+    [ , DEFAULT = default ]
+    [ , ELEMENT = element ]
+    [ , DELIMITER = delimiter ]
+    [ , COLLATABLE = collatable ]
+)
+
+CREATE TYPE name
+
+CREATE TYPE name AS ENUM
+    ( [ 'label' [, ... ] ] )
+
+ +
+
+

Parameter Description

Composite types

+
  • name

    Specifies the name of the type to be created. It can be schema-qualified.

    +
  • attribute_name

    Specifies the name of an attribute (column) for the composite type.

    +
  • data_type

    Specifies the name of an existing data type to become a column of the composite type.

    +
  • collation

    Specifies the name of an existing collation rule to be associated with a column of the composite type.

    +
+

Base types

+

When creating a base type, you can place parameters in any order. The input_function and output_function parameters are mandatory, and other parameters are optional.

+
  • input_function

    Specifies the name of a function that converts data from the external text format of a type to its internal format.

    +

    An input function can be declared as taking one parameter of the cstring type or taking three parameters of the cstring, oid, and integer types.

    +
    • The cstring-type parameter is the input text as a C string.
    • The oid-type parameter is the OID of the type (except for array types, where the parameter is the element type OID of an array type).
    • The integer-type parameter is typmod of the destination column, if known (-1 will be passed if not known).
    +

    An input function must return a value of the data type itself. Generally, an input function must be declared as STRICT. If it is not, it will be called with a NULL parameter coming first when the system reads a NULL input value. In this case, the function must still return NULL unless an error raises. (This mechanism is designed for supporting domain input functions, which may need to reject NULL input values.)

    +

    Input and output functions can be declared to have the results or parameters of a new type because they have to be created before the new type is created. The new type should first be defined as a shell type, which is a placeholder type that has no attributes except a name and an owner. This can be done by delivering the CREATE TYPE name statement, with no additional parameters. Then, the C I/O functions can be defined as referencing the shell type. Finally, CREATE TYPE with a full definition replaces the shell type with a complete, valid type definition. After that, the new type can be used normally.

    +
    +
  • output_function

    Specifies the name of a function that converts data from the internal format of a type to its external text format.

    +

    An output function must be declared as taking one parameter of a new data type. It must return data of the cstring type. Output functions are not invoked for NULL values.

    +
  • receive_function

    (Optional) Specifies the name of a function that converts data from the external binary format of a type to its internal format.

    +

    If this function is not used, the type cannot participate in binary input. It costs lower to convert the binary format to the internal format, more portable. (For example, the standard integer data types use the network byte order as an external binary representation, whereas the internal representation is in the machine's native byte order.) This function should perform adequate checks to ensure a valid value.

    +

    Also, this function can be declared as taking one parameter of the internal type or taking three parameters of the internal, oid, and integer types.

    +
    • The internal-type parameter is a pointer to a StringInfo buffer holding received byte strings.
    • The oid- and integer-type parameters are the same as those of the text input function.
    +

    A receive function must return a value of the data type itself. Generally, a receive function must be declared as STRICT. If it is not, it will be called with a NULL parameter coming first when the system reads a NULL input value. In this case, the function must still return NULL unless an error raises. (This mechanism is designed for supporting domain receive functions, which may need to reject NULL input values.)

    +
  • send_function

    (Optional) Specifies the name of a function that converts data from the internal format of a type to its external binary format.

    +

    If this function is not used, the type cannot participate in binary output. A send function must be declared as taking one parameter of a new data type. It must return data of the bytea type. Send functions are not invoked for NULL values.

    +
  • type_modifier_input_function

    (Optional) Specifies the name of a function that converts an array of modifiers for a type to its internal format.

    +
  • type_modifier_output_function

    (Optional) Specifies the name of a function that converts the internal format of modifiers for a type to its external text format.

    +

    type_modifier_input_function and type_modifier_output_function are needed if a type supports modifiers, that is, optional constraints attached to a type declaration, such as char(5) or numeric(30,2). GaussDB(DWS) allows user-defined types to take one or more simple constants or identifiers as modifiers. However, this information must be capable of being packed into a single non-negative integer value for storage in system catalogs. Declared modifiers are passed to type_modifier_input_function in the cstring array format. The parameter must check values for validity, throwing an error if they are wrong. If they are correct, the parameter will return a single non-negative integer value, which will be stored as typmod in a column. If the type does not have type_modifier_input_function, type modifiers will be rejected. type_modifier_output_function converts the internal integer typmod value back to a correct format for user display. It must return a cstring value, which is the exact string appending to the type name. For example, a numeric function may return (30,2). If the default display format is enclosing a stored typmod integer value in parentheses, you can omit type_modifier_output_function.

    +
    +
  • analyze_function

    (Optional) Specifies the name of a function that performs statistical analysis for a data type.

    +

    By default, if there is a default B-tree operator class for a type, ANALYZE will attempt to gather statistics by using the "equals" and "less-than" operators of the type. This behavior is inappropriate for non-scalar types, and can be overridden by specifying a custom analysis function. The analysis function must be declared to take one parameter of the internal type and return a boolean result.

    +
  • internallength

    (Optional) Specifies a numeric constant for specifying the length in bytes of the internal representation of a new type. By default, it is variable-length.

    +

    Although the details of the new type's internal representation are only known to I/O functions and other functions that you create to work with the type, there are still some attributes of the internal representation that must be declared to GaussDB(DWS). The most important one is internallength. Base data types can be fixed-length (when internallength is a positive integer) or variable-length (when internallength is set to VARIABLE; internally, this is represented by setting typlen to -1). The internal representation of all variable-length types must start with a 4-byte integer. internallength defines the total length.

    +
  • PASSEDBYVALUE

    (Optional) Specifies that values of a data type are passed by value, rather than by reference. Types passed by value must be fixed-length, and their internal representation cannot be larger than the size of the Datum type (4 bytes on some machines, and 8 bytes on others).

    +
  • alignment

    (Optional) Specifies the storage alignment required for a data type. It supports values char, int2, int4, and double. The default value is int4.

    +

    The allowed values equate to alignment on 1-, 2-, 4-, or 8-byte boundaries. Note that variable-length types must have an alignment of at least 4 since they must contain an int4 value as their first component.

    +
  • storage

    (Optional) Specifies the storage strategy for a data type.

    +

    It supports values plain, external, extended, and main. The default value is plain.

    +
    • plain specifies that data of a type will always be stored in-line and not compressed. (Only plain is allowed for fixed-length types.)
    • extended specifies that the system will first try to compress a long data value and will then move the value out of the main table row if it is still too long.
    • external allows a value to be moved out of the main table, but the system will not try to compress it.
    • main allows for compression, but discourages moving a value out of the main table. (Data items with this storage strategy might still be moved out of the main table if there is no other way to make a row fit. However, they will be kept in the main table preferentially over extended and external items.)

      All storage values except plain imply that the functions of the data type can handle values that have been toasted. A given value merely determines the default TOAST storage strategy for columns of a toastable data type. Users can choose other strategies for individual columns by using ALTER TABLE SET STORAGE.

      +
    +
  • like_type

    (Optional) Specifies the name of an existing data type that has the same representation as a new type. The values of internallength, passedbyvalue, alignment, and storage are copied from this type, unless they are overridden by explicit specifications elsewhere in the CREATE TYPE command.

    +

    Specifying representation in this way is especially useful when the low-level implementation of a new type references an existing type.

    +
  • category

    (Optional) Specifies the category code (a single ASCII character) for a type. The default value is U for a user-defined type. You can also choose other ASCII characters to create custom categories.

    +
  • preferred

    (Optional) Specifies whether a type is preferred within its type category. If it is, the value will be TRUE, else FALSE. The default value is FALSE. Be cautious when creating a new preferred type within an existing type category because this could cause great changes in behavior.

    +

    The category and preferred parameters can be used to help determine which implicit cast excels in ambiguous situations. Each data type belongs to a category named by a single ASCII character, and each type is either preferred or not within its category. If this rule is helpful in resolving overloaded functions or operators, the parser will prefer casting to preferred types (but only from other types within the same category). For types that have no implicit casts to or from any other types, it is sufficient to leave these parameters at their default values. However, for a group of types that have implicit casts, mark them all as belonging to a category and select one or two of the most general types as being preferred within the category. The category parameter is helpful in adding a user-defined type to an existing built-in category, such as the numeric or string type. However, you can also create new entirely-user-defined type categories. Select any ASCII character other than an uppercase letter to name such a category.

    +
    +
  • default

    (Optional) Specifies the default value for a data type. If this parameter is omitted, the default value will be NULL.

    +

    A default value can be specified if you expect the columns of a data type to default to something other than the NULL value. You can also specify a default value using the DEFAULT keyword. (Such a default value can be overridden by an explicit DEFAULT clause attached to a particular column.)

    +
  • element

    (Optional) Specifies the type of an array element when an array type is created. For example, to define an array of 4-byte integers (int4), set ELEMENT to int4.

    +
  • delimiter

    (Optional) Specifies the delimiter character to be used between values in arrays made of a type.

    +

    delimiter can be set to a specific character. The default delimiter is a comma (,). Note that a delimiter is associated with the array element type, instead of the array type itself.

    +
  • collatable

    (Optional) Specifies whether a type's operations can use collation information. If they can, the value will be TRUE, else FALSE (default).

    +

    If collatable is TRUE, column definitions and expressions of a type may carry collation information by using the COLLATE clause. It is the implementations of functions operating on the type that actually use the collation information. This use cannot be achieved merely by marking the type collatable.

    +
  • lable

    (Optional) Specifies a text label associated with an enumerated value. It is a non-empty string of up to 64 characters.

    +
+

Whenever a user-defined type is created, GaussDB(DWS) automatically creates an associated array type whose name consists of the element type name prepended with an underscore (_).

+
+
+

Example

Example 1: Create a composite type, create a table, insert data, and make a query.

+
1
+2
+3
+4
+5
+6
+7
CREATE TYPE compfoo AS (f1 int, f2 text);
+CREATE TABLE t1_compfoo(a int, b compfoo);
+CREATE TABLE t2_compfoo(a int, b compfoo);
+INSERT INTO t1_compfoo values(1,(1,'demo'));
+INSERT INTO t2_compfoo select * from t1_compfoo;
+SELECT (b).f1 FROM t1_compfoo;
+SELECT * FROM t1_compfoo t1 join t2_compfoo t2 on (t1.b).f1=(t1.b).f1;
+
+ +
+

Example 2: Create an enumeration type and use it in the table definition.

+
1
+2
+3
+4
CREATE TYPE bugstatus AS ENUM ('create', 'modify', 'closed');
+CREATE TABLE customer (name text,current_bugstatus bugstatus);
+INSERT INTO customer VALUES ('type','create');
+SELECT * FROM customer WHERE current_bugstatus = 'create';
+
+ +
+

Example 3: Compile a .so file and create the shell type.

+
1
CREATE TYPE complex;
+
+ +
+

This statement creates a placeholder for the type to be created, which can then be referenced when defining its I/O function. Now you can define an I/O function. Note that the function must be declared in NOT FENCED mode when it is created.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
CREATE FUNCTION
+complex_in(cstring)
+    RETURNS complex
+    AS 'filename'
+    LANGUAGE C IMMUTABLE STRICT not fenced;
+
+CREATE FUNCTION
+complex_out(complex)
+    RETURNS cstring
+    AS 'filename'
+    LANGUAGE C IMMUTABLE STRICT not fenced;
+
+CREATE FUNCTION
+complex_recv(internal)
+    RETURNS complex
+    AS 'filename'
+    LANGUAGE C IMMUTABLE STRICT not fenced;
+
+CREATE FUNCTION
+complex_send(complex)
+    RETURNS bytea
+    AS 'filename'
+    LANGUAGE C IMMUTABLE STRICT not fenced;
+
+ +
+

Finally, provide a complete definition of the data type.

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE TYPE complex (
+internallength = 16,
+input = complex_in,
+output = complex_out,
+receive = complex_recv,
+send = complex_send,
+alignment = double
+);
+
+ +
+

+

The C functions corresponding to the input, output, receive, and send functions are defined as follows:

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
-- Define a structure body Complex:
+typedef struct Complex {
+    double      x;
+    double      y;
+} Complex;
+
+-- Define an input function:
+PG_FUNCTION_INFO_V1(complex_in);
+
+Datum
+complex_in(PG_FUNCTION_ARGS)
+{
+    char       *str = PG_GETARG_CSTRING(0);
+    double      x,
+                y;
+    Complex    *result;
+
+    if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2)
+        ereport(ERROR,
+                (errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
+                 errmsg("invalid input syntax for complex: \"%s\"",
+                        str)));
+
+    result = (Complex *) palloc(sizeof(Complex));
+    result->x = x;
+    result->y = y;
+    PG_RETURN_POINTER(result);
+}
+
+-- Define an output function:
+PG_FUNCTION_INFO_V1(complex_out);
+
+Datum
+complex_out(PG_FUNCTION_ARGS)
+{
+        Complex    *complex = (Complex *) PG_GETARG_POINTER(0);
+        char       *result;
+
+        result = (char *) palloc(100);
+        snprintf(result, 100, "(%g,%g)", complex->x, complex->y);
+        PG_RETURN_CSTRING(result);
+}
+
+-- Define a receive function:
+PG_FUNCTION_INFO_V1(complex_recv);
+
+Datum
+complex_recv(PG_FUNCTION_ARGS)
+{
+    StringInfo  buf = (StringInfo) PG_GETARG_POINTER(0);
+    Complex    *result;
+
+    result = (Complex *) palloc(sizeof(Complex));
+    result->x = pq_getmsgfloat8(buf);
+    result->y = pq_getmsgfloat8(buf);
+    PG_RETURN_POINTER(result);
+}
+
+-- Define a send function:
+PG_FUNCTION_INFO_V1(complex_send);
+
+Datum
+complex_send(PG_FUNCTION_ARGS)
+{
+    Complex    *complex = (Complex *) PG_GETARG_POINTER(0);
+    StringInfoData buf;
+
+    pq_begintypsend(&buf);
+    pq_sendfloat8(&buf, complex->x);
+    pq_sendfloat8(&buf, complex->y);
+    PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
+}
+
+ +
+
+

Helpful Links

ALTER TYPE, DROP TYPE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0186.html b/docs/dws/dev/dws_06_0186.html new file mode 100644 index 00000000..0c220186 --- /dev/null +++ b/docs/dws/dev/dws_06_0186.html @@ -0,0 +1,111 @@ + + +

CREATE USER

+

Function

CREATE USER creates a user.

+
+

Important Notes

  • A user created using the CREATE USER statement has the LOGIN permission by default.
  • A schema named after the user is automatically created in the database where the statement is executed, but not in other databases. You can run the CREATE SCHEMA statement to create such a schema for the user in other databases.
  • The owner of an object created by a system administrator in a schema with the same name as a common user is the common user, not the system administrator.
  • Users other than system administrators cannot create objects in a schema named after a user, unless the users are granted with the role permissions of that schema. For details, see After the all Permission Is Granted to the Schema of a User, the Error Message "ERROR: current user does not have privilege to role tom" Persists During Table Creation in Troubleshooting.
+
+

Syntax

1
CREATE USER user_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' | DISABLE };
+
+ +
+

The option clause is used for setting information including permissions and attributes.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
{SYSADMIN | NOSYSADMIN}
+    | {AUDITADMIN | NOAUDITADMIN}
+    | {CREATEDB | NOCREATEDB}
+    | {USEFT | NOUSEFT}
+    | {CREATEROLE | NOCREATEROLE}
+    | {INHERIT | NOINHERIT}
+    | {LOGIN | NOLOGIN}
+    | {REPLICATION | NOREPLICATION}
+    | {INDEPENDENT | NOINDEPENDENT}
+    | {VCADMIN | NOVCADMIN}
+    | CONNECTION LIMIT connlimit
+    | VALID BEGIN 'timestamp'
+    | VALID UNTIL 'timestamp'
+    | RESOURCE POOL 'respool'
+    | USER GROUP 'groupuser'
+    | PERM SPACE 'spacelimit'
+    | TEMP SPACE 'tmpspacelimit'
+    | SPILL SPACE 'spillspacelimit'
+    | NODE GROUP logic_cluster_name
+    | IN ROLE role_name [, ...]
+    | IN GROUP role_name [, ...]
+    | ROLE role_name [, ...]
+    | ADMIN role_name [, ...]
+    | USER role_name [, ...]
+    | SYSID uid
+    | DEFAULT TABLESPACE tablespace_name
+    | PROFILE DEFAULT
+    | PROFILE profile_name
+    | PGUSER
+    | AUTHINFO 'authinfo'
+    | PASSWORD EXPIRATOIN period
+
+ +
+
+

Parameters

  • user_name

    Specifies the user name.

    +

    Value range: a string. It must comply with the naming convention. A value can contain a maximum of 63 characters.

    +
  • password

    Specifies the login password.

    +

    A password must:

    +
    • Contain at least eight characters. This is the default length.
    • Differ from the user name or the user name spelled backwards.
    • Contains at least three of the following four character types: uppercase letters, lowercase letters, digits, and special characters, including: ~!@#$%^&*()-_=+\|[{}];:,<.>/?. If you use characters other than the four types, a warning is displayed, but you can still create the password.
    • Be enclosed by single or double quotation marks.
    +

    Value range: a string

    +
+

For details on other parameters, see CREATE ROLE Parameter Description.

+
+

Example

Create user jim.

+
1
CREATE USER jim PASSWORD '{password}';
+
+ +
+

The following statements are equivalent to the above.

+
1
CREATE USER kim IDENTIFIED BY '{password}';
+
+ +
+

For a user having the Create Database permission, add the CREATEDB keyword.

+
1
CREATE USER dim CREATEDB PASSWORD '{password}';
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0187.html b/docs/dws/dev/dws_06_0187.html new file mode 100644 index 00000000..a784d6d6 --- /dev/null +++ b/docs/dws/dev/dws_06_0187.html @@ -0,0 +1,77 @@ + + +

CREATE VIEW

+

Function

CREATE VIEW creates a view. A view is a virtual table, not a base table. A database only stores the definition of a view and does not store its data. The data is still stored in the original base table. If data in the base table changes, the data in the view changes accordingly. In this sense, a view is like a window through which users can know their interested data and data changes in the database.

+
+

Precautions

None

+
+

Syntax

1
+2
+3
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ]
+    [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]
+    AS query;
+
+ +
+
  • You can use WITH (security_barriers) to create a relatively secure view. This prevents attackers from printing hidden base table data by using the RAISE statement of low-cost functions.
  • When the view_independent GUC parameter is enabled, columns can be deleted from common views. Note that if a column-level constraint exists, the corresponding column cannot be deleted.
+
+
+

Parameter Description

  • OR REPLACE

    Redefines a view if there is already a view.

    +
  • TEMP | TEMPORARY

    Creates a temporary view.

    +
  • view_name

    Specifies the name of a view to be created. It is optionally schema-qualified.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • column_name

    Specifies an optional list of names to be used for columns of the view. If not given, the column names are deduced from the query.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • view_option_name [= view_option_value]

    This clause specifies optional parameters for a view.

    +

    Currently, the only parameter supported by view_option_name is security_barrier, which should be enabled when a view is intended to provide row-level security.

    +

    Value range: boolean type. It can be TRUE or FALSE.

    +
  • query

    A SELECT or VALUES statement which will provide the columns and rows of the view.

    +

    CTE names cannot be duplicate when the view decoupling function is enabled. The following shows an example.

    +
    1
    +2
    +3
    CREATE TABLE t1(a1 INT, b1 INT);
    +CREATE TABLE t2(a2 INT, b2 INT, c2 INT);
    +CREATE OR REPLACE VIEW v1 AS WITH tmp AS (SELECT * FROM t2) ,tmp1 AS (SELECT b2,c2 FROM tmp WHERE b2 = (WITH RECURSIVE tmp(aa, bb) AS (SELECT a1,b1 FROM t1) SELECT bb FROM tmp WHERE aa = c2)) SELECT c2 FROM tmp1;
    +
    + +
    +
    +
+
+

Examples

Create a view consisting of columns whose spcname is pg_default.

+
1
+2
CREATE VIEW myView AS
+    SELECT * FROM pg_tablespace WHERE spcname = 'pg_default';
+
+ +
+

Run the following command to redefine the existing view myView and create a view consisting of columns whose spcname is pg_global:

+
1
+2
CREATE OR REPLACE VIEW myView AS
+    SELECT * FROM pg_tablespace WHERE spcname = 'pg_global';
+
+ +
+

Create a view consisting of rows with c_customer_sk smaller than 150.

+
1
+2
+3
CREATE VIEW tpcds.customer_details_view_v1 AS
+    SELECT * FROM tpcds.customer
+    WHERE c_customer_sk < 150;
+
+ +
+
+

Updatable Views

After the enable_view_update parameter is enabled, simple views that meet all the following conditions can be updated using the INSERT, UPDATE, and DELETE statements:

+
  • The FROM clause in the view definition contains only one common table, which cannot be a system table, foreign table, DFS table, delta table, TOAST table, or error table.
  • The view contains updatable columns, which are simple references to the updatable columns of the base table.
  • The view definition does not contain the WITH, DISTINCT, GROUP BY, ORDER BY, FOR UPDATE, FOR SHARE, HAVING, TABLESAMPLE, LIMIT or OFFSET clause.
  • The view definition does not contain the UNION, INTERSECT, or EXCEPT operation.
  • The selection list of the view definition does not contain aggregate functions, window functions, or functions that return collections.
  • The view does not contain the trigger whose trigger occasion is INSTEAD OF.
  • The view definition does not contain sublinks.
  • The view definition does not contain functions whose attribute is VOLATILE. The values of such functions can be changed during a table scan.
  • The view definition does not set an alias for the column where the distribution key of the table resides, or name a common column as the distribution key column.
  • When the RETURNING clause is used in the view update operation, columns in the view definition only come from the base table.
+

If the definition of the updatable view contains a WHERE condition, the condition restricts the UPDATE and DELETE statements from modifying rows on the base table. If the WHERE condition is not met after the UPDATE statement is executed, the updated rows cannot be queried in the view. Similarly, If the WHERE condition is not met after the INSERT statement is executed, the inserted data cannot be queried in the view. To insert, update, or delete data in a view, you must have the corresponding permission on the view and tables.

+
+

Helpful Links

ALTER VIEW and DROP VIEW

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0188.html b/docs/dws/dev/dws_06_0188.html new file mode 100644 index 00000000..ab1e609b --- /dev/null +++ b/docs/dws/dev/dws_06_0188.html @@ -0,0 +1,97 @@ + + +

CURSOR

+

Function

CURSOR defines a cursor. This command retrieves few rows of data in a query.

+

To process SQL statements, the stored procedure process assigns a memory segment to store context association. Cursors are handles or pointers to context regions. With cursors, stored procedures can control alterations in context regions.

+
+

Precautions

  • CURSOR is used only in transaction blocks.
  • Generally, CURSOR and SELECT both have text returns. Since data is stored in binary format in the system, the system needs to convert the data from the binary format to the text format. If data is returned in text format, the client-end application needs to convert the data back to a binary format for processing. FETCH implements conversion between binary data and text data.
  • Use a binary cursor unless necessary, since a text cursor occupies larger storage space than a binary cursor. A binary cursor returns internal binary data, which is easier to operate. To return data in text format, it is advisable to retrieve data in text format, therefore reducing workload at the client end. For example, the value 1 in an integer column of a query is returned as a character string 1 if a default cursor is used, but is returned as a 4-byte binary value (big-endian) if a binary cursor is used.
+
+

Syntax

1
+2
+3
CURSOR cursor_name
+    [ BINARY ]  [ NO SCROLL ]  [ { WITH | WITHOUT } HOLD ]
+    FOR query;
+
+ +
+
+

Parameter Description

  • cursor_name

    Specifies the name of a cursor to be created.

    +

    Value range: Its value must comply with the database naming convention.

    +
  • BINARY

    Specifies that data retrieved by the cursor will be returned in binary format, not in text format.

    +
  • NO SCROLL

    Specifies the mode of data retrieval by the cursor.

    +
    • NO SCROLL: If NO SCROLL is specified, backward fetches will be rejected.
    • Not stated: The system automatically determines whether the cursor can be used for backward fetches based on the execution plan.
    +
  • WITH HOLD | WITHOUT HOLD

    Specifies whether the cursor can still be used after the cursor creation event.

    +
    • WITH HOLD indicates that the cursor can still be used.
    • WITHOUT HOLD indicates that the cursor cannot be used.
    • If neither WITH HOLD nor WITHOUT HOLD is specified, the default value is WITHOUT HOLD.
    +
  • query

    The SELECT or VALUES clause specifies the row to return the cursor value.

    +

    Value range: SELECT or VALUES clause

    +
+
+

Examples

Set up the cursor1 cursor.

+
1
CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1;
+
+ +
+

Set up the cursor cursor2.

+
1
CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;
+
+ +
+

An example of using the WITH HOLD cursor is as follows:

+

Start a transaction.

+
1
START TRANSACTION;
+
+ +
+

Set up a WITH HOLD cursor.

+
1
DECLARE cursor3 CURSOR WITH HOLD FOR SELECT * FROM tpcds.customer_address ORDER BY 1;
+
+ +
+
+

Fetch the first two rows from cursor3.

+
1
+2
+3
+4
+5
+6
FETCH FORWARD 2 FROM cursor3;
+ ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name   | ca_street_type  | ca_suite_number |     ca_city     |    ca_county    | ca_state |   ca_zip   |  ca_country   | ca_gmt_offset |   ca_location_type   
+---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+----------------------
+             1 | AAAAAAAABAAAAAAA | 18               | Jackson            | Parkway         | Suite 280       | Fairfield       | Maricopa County | AZ       | 86192      | United States |         -7.00 | condo               
+             2 | AAAAAAAACAAAAAAA | 362              | Washington 6th     | RD              | Suite 80        | Fairview        | Taos County     | NM       | 85709      | United States |         -7.00 | condo               
+(2 rows)
+
+ +
+

End the transaction.

+
1
END;
+
+ +
+

Fetch the next row from cursor3.

+
1
+2
+3
+4
+5
FETCH FORWARD 1 FROM cursor3;
+ ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name   | ca_street_type  | ca_suite_number |     ca_city     |    ca_county    | ca_state |   ca_zip   |  ca_country   | ca_gmt_offset |   ca_location_type   
+---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+----------------------
+             3 | AAAAAAAADAAAAAAA | 585              | Dogwood Washington | Circle          | Suite Q         | Pleasant Valley | York County     | PA       | 12477      | United States |         -5.00 | single family       
+(1 row)
+
+ +
+

Close a cursor.

+
1
CLOSE cursor3;
+
+ +
+

Helpful Links

FETCH

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0189.html b/docs/dws/dev/dws_06_0189.html new file mode 100644 index 00000000..557327c1 --- /dev/null +++ b/docs/dws/dev/dws_06_0189.html @@ -0,0 +1,32 @@ + + +

DROP DATABASE

+

Function

DROP DATABASE deletes a database.

+
+

Precautions

  • Only the owner of a database or a system administrator has the permission to run the DROP DATABASE command.
  • DROP DATABASE does not take effect for the three preinstalled system databases (gaussdb, TEMPLATE0, and TEMPLATE1) because they are protected. To check databases in the current service, run the \l command of gsql.
  • This command cannot be run while the database to be deleted is associated with a user. You can check the current database connections in the v$session view.
  • DROP DATABASE cannot be run inside a transaction block.
  • If DROP DATABASE fails to be run and is rolled back, run DROP DATABASE IF EXISTS.
  • DROP DATABASE cannot be undone.
  • If a "database is being accessed by other users" error is displayed when you run DROP DATABASE, it might be that threads cannot respond to signals in a timely manner during the CLEAN CONNECTION process. As a result, connections are not completely cleared. In this case, you need to run CLEAN CONNECTION again.
+
+

Syntax

1
DROP DATABASE [ IF EXISTS ] database_name;
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified database does not exist.

    +
  • database_name

    Specifies the name of the database to be deleted.

    +

    Value range: A string indicating an existing database name.

    +
+
+

Examples

Delete the database named music.

+
1
DROP DATABASE music;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0192.html b/docs/dws/dev/dws_06_0192.html new file mode 100644 index 00000000..4b168ebb --- /dev/null +++ b/docs/dws/dev/dws_06_0192.html @@ -0,0 +1,35 @@ + + +

DROP FOREIGN TABLE

+

Function

DROP FOREIGN TABLE deletes a specified foreign table.

+
+

Precautions

DROP FOREIGN TABLE forcibly deletes a specified table. After a table is deleted, any indexes that exist for the table will be deleted. The functions and stored procedures used in this table cannot be run.

+
+

Syntax

1
+2
DROP FOREIGN TABLE [ IF EXISTS ] 
+    table_name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified table does not exist.

    +
  • table_name

    Specifies the name of the table.

    +

    Value range: An existing table name.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes all objects (such as views) that depend on the table to be deleted.
    • RESTRICT: refuses to delete the table if any objects depend on it. This is the default.
    +
+
+

Examples

Delete the foreign table named customer_ft.

+
1
DROP FOREIGN TABLE customer_ft;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0193.html b/docs/dws/dev/dws_06_0193.html new file mode 100644 index 00000000..cd865cac --- /dev/null +++ b/docs/dws/dev/dws_06_0193.html @@ -0,0 +1,38 @@ + + +

DROP FUNCTION

+

Function

DROP FUNCTION deletes an existing function.

+
+

Precautions

If a function involves operations on temporary tables, the function cannot be deleted by running DROP FUNCTION.

+
+

Syntax

1
+2
DROP FUNCTION [ IF EXISTS ] function_name 
+[ ( [ {[ argmode ] [ argname ] argtype} [, ...] ] ) [ CASCADE | RESTRICT ] ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the function does not exist.

    +
  • function_name

    Specifies the name of the function to be deleted.

    +

    Value range: An existing function name.

    +
  • argmode

    Specifies the mode of a function parameter.

    +
  • argname

    Specifies the name of a function parameter.

    +
  • argtype

    Specifies the data types of a function parameter.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes all objects that depend on the function to be deleted (such as operators).
    • RESTRICT: refuses to delete the function if any objects depend on it. This is the default.
    +
+
+

Examples

Delete a function named add_two_number.

+
1
DROP FUNCTION add_two_number;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0194.html b/docs/dws/dev/dws_06_0194.html new file mode 100644 index 00000000..3591f2c6 --- /dev/null +++ b/docs/dws/dev/dws_06_0194.html @@ -0,0 +1,24 @@ + + +

DROP GROUP

+

Function

DROP GROUP deletes a user group.

+

DROP GROUP is the alias for DROP ROLE.

+
+

Precautions

DROP GROUP is the internal interface encapsulated in the gs_om tool. You are not advised to use this interface, because doing so affects the cluster.

+
+

Syntax

1
DROP GROUP [ IF EXISTS ] group_name [, ...];
+
+ +
+
+

Parameter Description

See Examples in DROP ROLE.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0195.html b/docs/dws/dev/dws_06_0195.html new file mode 100644 index 00000000..66a3bf1e --- /dev/null +++ b/docs/dws/dev/dws_06_0195.html @@ -0,0 +1,35 @@ + + +

DROP INDEX

+

Function

DROP INDEX deletes an index.

+
+

Precautions

Only the owner of an index or a system administrator can run DROP INDEX command.

+
+

Syntax

1
+2
DROP INDEX [ IF EXISTS ] 
+    index_name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified index does not exist.

    +
  • index_name

    Specifies the name of the index to be deleted.

    +

    Value range: An existing index.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes all objects that depend on the index to be deleted.
    • RESTRICT (default): refuses to delete the index if any objects depend on it.
    +
+
+

Examples

Delete the ds_ship_mode_t1_index2 index.

+
1
DROP INDEX tpcds.ds_ship_mode_t1_index2;
+
+ +
+
+

Helpful Links

ALTER INDEX, CREATE INDEX

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0198.html b/docs/dws/dev/dws_06_0198.html new file mode 100644 index 00000000..87a6905e --- /dev/null +++ b/docs/dws/dev/dws_06_0198.html @@ -0,0 +1,23 @@ + + +

DROP OWNED

+

Function

DROP OWNED deletes the database objects of a database role.

+
+

Important Notes

The role's permissions on all the database objects in the current database and shared objects (databases and tablespaces) are revoked.

+
+

Syntax

1
DROP OWNED BY name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • name

    Name of the role whose objects are to be deleted and whose permissions are to be revoked.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes objects that depend on the affected objects.
    • RESTRICT (default): refuses to delete the objects if any other database objects depend on one of the affected objects.
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0199.html b/docs/dws/dev/dws_06_0199.html new file mode 100644 index 00000000..227c44c4 --- /dev/null +++ b/docs/dws/dev/dws_06_0199.html @@ -0,0 +1,32 @@ + + +

DROP REDACTION POLICY

+

Function

DROP REDACTION POLICY deletes a data redaction policy applied to a specified table.

+
+

Precautions

Only the table owner has the permission to delete a data redaction policy.

+
+

Syntax

1
DROP REDACTION POLICY [ IF EXISTS ] policy_name ON table_name;
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of throwing an error if the redaction policy to be deleted does not exist.

    +
  • policy_name

    Specifies the name of a redaction policy.

    +
  • table_name

    Specifies the name of the table to which the redaction policy is applied.

    +
+
+

Examples

Delete a data masking policy.

+
1
DROP REDACTION POLICY mask_emp ON emp;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0200.html b/docs/dws/dev/dws_06_0200.html new file mode 100644 index 00000000..1fa1f41d --- /dev/null +++ b/docs/dws/dev/dws_06_0200.html @@ -0,0 +1,31 @@ + + +

DROP ROW LEVEL SECURITY POLICY

+

Function

DROP ROW LEVEL SECURITY POLICY deletes a row-level access control policy from a table.

+
+

Precautions

Only the table owner or administrators can delete a row-level access control policy from the table.

+
+

Syntax

1
DROP [ ROW LEVEL SECURITY ] POLICY [ IF EXISTS ] policy_name ON table_name [ CASCADE | RESTRICT ]
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Reports a notice instead of an error if the specified row-level access control policy does not exist.

    +
  • policy_name
    Specifies the name of a row-level access control policy to be deleted.
    • table_name

      Specifies the name of a table to which a row-level access control policy is applied.

      +
    • CASCADE/RESTRICT

      The two parameters are used only for syntax compatibility. No objects depend on access control policies and thereby CASCADE is equivalent to RESTRICT.

      +
    +
    +
+
+

Examples

Delete the row-level access control policy.

+
DROP ROW LEVEL SECURITY POLICY all_data_rls ON all_data;
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0201.html b/docs/dws/dev/dws_06_0201.html new file mode 100644 index 00000000..af5f630f --- /dev/null +++ b/docs/dws/dev/dws_06_0201.html @@ -0,0 +1,32 @@ + + +

DROP PROCEDURE

+

Function

DROP PROCEDURE deletes an existing stored procedure.

+
+

Precautions

None.

+
+

Syntax

1
DROP PROCEDURE [ IF EXISTS  ] procedure_name ;
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the stored procedure does not exist.

    +
  • procedure_name

    Specifies the name of the stored procedure to be deleted.

    +

    Value range: An existing stored procedure name.

    +
+
+

Examples

Delete a stored procedure.

+
1
DROP PROCEDURE prc_add;
+
+ +
+
+

Helpful Links

CREATE PROCEDURE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0202.html b/docs/dws/dev/dws_06_0202.html new file mode 100644 index 00000000..73c0381b --- /dev/null +++ b/docs/dws/dev/dws_06_0202.html @@ -0,0 +1,34 @@ + + +

DROP RESOURCE POOL

+

Function

DROP RESOURCE POOL deletes a resource pool.

+

The resource pool cannot be deleted if it is associated with a role.

+
+
+

Precautions

The user must have the DROP permission in order to delete a resource pool.

+
+

Syntax

1
DROP RESOURCE POOL [ IF EXISTS ] pool_name;
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the stored procedure does not exist.

    +
+
+
  • pool_name

    Specifies the name of a created resource pool.

    +

    Value range: a string. It must comply with the naming convention.

    +
+

A resource pool can be independently deleted only when it is not associated with any users.

+
+

Example

Delete a resource pool.

+
DROP RESOURCE POOL pool1;
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0203.html b/docs/dws/dev/dws_06_0203.html new file mode 100644 index 00000000..fb0205ec --- /dev/null +++ b/docs/dws/dev/dws_06_0203.html @@ -0,0 +1,32 @@ + + +

DROP ROLE

+

Function

DROP ROLE deletes a specified role.

+
+

Precautions

If a "role is being used by other users" error is displayed when you run DROP ROLE, it might be that threads cannot respond to signals in a timely manner during the CLEAN CONNECTION process. As a result, connections are not completely cleared. In this case, you need to run CLEAN CONNECTION again.

+
+

Syntax

1
DROP ROLE [ IF EXISTS ] role_name [, ...];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified role does not exist.

    +
  • role_name

    Specifies the name of the role to be deleted.

    +

    Value range: An existing role.

    +
+
+

Examples

Delete the manager role.

+
1
DROP ROLE manager;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0204.html b/docs/dws/dev/dws_06_0204.html new file mode 100644 index 00000000..5f424412 --- /dev/null +++ b/docs/dws/dev/dws_06_0204.html @@ -0,0 +1,36 @@ + + +

DROP SCHEMA

+

Function

DROP SCHEMA deletes a schema in a database.

+
+

Precautions

Only a schema owner or a system administrator can run the DROP SCHEMA command.

+ +
+

Syntax

1
DROP SCHEMA [ IF EXISTS ] schema_name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified schema does not exist.

    +
  • schema_name

    Specifies the name of a schema.

    +

    Value range: An existing schema name.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes all objects that are contained in the schema to be deleted.
    • RESTRICT: refuses to delete the schema that contains any objects. This is the default.
    +
+

Do not delete the schemas with the beginning of pg_temp or pg_toast_temp. They are internal system schemas, and deleting them may cause unexpected errors.

+
+

A user cannot delete the schema in use. To delete the schema in use, switch to another schema.

+
+
+

Example

Delete the ds_new schema.

+
DROP SCHEMA ds_new;
+

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0205.html b/docs/dws/dev/dws_06_0205.html new file mode 100644 index 00000000..0771ae52 --- /dev/null +++ b/docs/dws/dev/dws_06_0205.html @@ -0,0 +1,33 @@ + + +

DROP SEQUENCE

+

Function

DROP SEQUENCE deletes a sequence from the current database.

+
+

Precautions

Only a sequence owner or a system administrator can delete a sequence.

+
+

Syntax

1
DROP SEQUENCE [ IF EXISTS ] {[schema.]sequence_name} [ , ... ] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified sequence does not exist.

    +
  • name

    Specifies the name of the sequence.

    +
  • CASCADE

    Automatically deletes objects that depend on the sequence to be deleted.

    +
  • RESTRICT

    Refuses to delete the sequence if any objects depend on it. This is the default.

    +
+
+

Examples

Delete the sequence.

+
1
DROP SEQUENCE serial;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0206.html b/docs/dws/dev/dws_06_0206.html new file mode 100644 index 00000000..26db102d --- /dev/null +++ b/docs/dws/dev/dws_06_0206.html @@ -0,0 +1,32 @@ + + +

DROP SERVER

+

Function

DROP SERVER deletes an existing data server.

+
+

Precautions

Only the server owner can delete a server.

+
+

Syntax

1
DROP SERVER [ IF EXISTS ] server_name [ {CASCADE | RESTRICT} ] ;
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified table does not exist.

    +
  • server_name

    Specifies the name of a server.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically drops objects that depend on the server to be deleted.
    • RESTRICT (default): refuses to delete the server if any objects depend on it.
    +
+
+

Examples

Delete the hdfs_server server.

+
1
DROP SERVER hdfs_server;
+
+ +
+
+

Helpful Links

CREATE SERVER, ALTER SERVER

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0207.html b/docs/dws/dev/dws_06_0207.html new file mode 100644 index 00000000..9f41da07 --- /dev/null +++ b/docs/dws/dev/dws_06_0207.html @@ -0,0 +1,34 @@ + + +

DROP SYNONYM

+

Function

DROP SYNONYM is used to delete a synonym object.

+
+

Precautions

Only a synonym owner or a system administrator can run the DROP SYNONYM command.

+
+

Syntax

1
DROP SYNONYM [ IF EXISTS ] synonym_name [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Send a notice instead of reporting an error if the specified synonym does not exist.

    +
  • synonym_name

    Name of a synonym (optionally with schema names)

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes objects (such as views) that depend on the synonym to be deleted.
    • RESTRICT: refuses to delete the synonym if any objects depend on it. This is the default.
    +
+
+

Examples

Delete a synonym.

+
1
+2
DROP SYNONYM t1;
+DROP SCHEMA ot CASCADE;
+
+ +
+
+

Helpful Links

ALTER SYNONYM and CREATE SYNONYM

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0208.html b/docs/dws/dev/dws_06_0208.html new file mode 100644 index 00000000..d9c81c40 --- /dev/null +++ b/docs/dws/dev/dws_06_0208.html @@ -0,0 +1,35 @@ + + +

DROP TABLE

+

Function

DROP TABLE deletes a specified table.

+
+

Precautions

  • Only the table owner, schema owner, and system administrator have the permission to delete a table. To delete all the rows in a table but retain the table definition, use TRUNCATE or DELETE.
  • DROP TABLE forcibly deletes a specified table. After a table is deleted, any indexes that exist for the table will be deleted; any functions or stored procedures that use this table cannot be run. Deleting a partitioned table also deletes all partitions in the table.
+
+

Syntax

1
+2
DROP TABLE [ IF EXISTS ] 
+    { [schema.]table_name } [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified table does not exist.

    +
  • schema

    Specifies the schema name.

    +
  • table_name

    Specifies the name of the table.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes objects (such as views) that depend on the table to be deleted.
    • RESTRICT (default): refuses to delete the table if any objects depend on it. This is the default.
    +
+
+

Example

Delete the warehouse_t1 table.

+
1
DROP TABLE tpcds.warehouse_t1;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0210.html b/docs/dws/dev/dws_06_0210.html new file mode 100644 index 00000000..dea27d04 --- /dev/null +++ b/docs/dws/dev/dws_06_0210.html @@ -0,0 +1,33 @@ + + +

DROP TEXT SEARCH CONFIGURATION

+

Function

DROP TEXT SEARCH CONFIGURATION deletes an existing text search configuration.

+
+

Precautions

To run the DROP TEXT SEARCH CONFIGURATION command, you must be the owner of the text search configuration.

+
+

Syntax

1
DROP TEXT SEARCH CONFIGURATION [ IF EXISTS ] name [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified text search configuration does not exist.

    +
  • name

    Specifies the name (optionally schema-qualified) of a text search configuration to be deleted.

    +
  • CASCADE

    Automatically deletes objects that depend on the text search configuration to be deleted.

    +
  • RESTRICT

    Refuses to delete the text search configuration if any objects depend on it. This is the default.

    +
+
+

Examples

Delete the text search configuration ngram1.

+
1
DROP TEXT SEARCH CONFIGURATION ngram1;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0211.html b/docs/dws/dev/dws_06_0211.html new file mode 100644 index 00000000..b1a2d219 --- /dev/null +++ b/docs/dws/dev/dws_06_0211.html @@ -0,0 +1,35 @@ + + +

DROP TEXT SEARCH DICTIONARY

+

Function

DROP TEXT SEARCH DICTIONARY deletes a full-text retrieval dictionary.

+
+

Precautions

  • DROP is not supported by predefined dictionaries.
  • Only the owner of a dictionary can do DROP to the dictionary. System administrators have this permission by default.
  • Execute DROP...CASCADE only when necessary because this operation will delete the text search configuration that uses this dictionary.
+
+

Syntax

1
DROP TEXT SEARCH DICTIONARY [ IF EXISTS ] name [ CASCADE | RESTRICT ]
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Reports a notice instead of throwing an error if the specified full-text retrieval dictionary does not exist.

    +
  • name

    Specifies the name of a dictionary to be deleted. (If you do not specify a schema name, the dictionary in the current schema will be deleted by default.)

    +

    Value range: name of an existing dictionary

    +
  • CASCADE

    Automatically deletes dependent objects of a dictionary and then deletes all dependent objects of these objects in sequence.

    +

    If any text search configuration that uses the dictionary exists, DROP execution will fail. You can add CASCADE to delete all text search configurations and dictionaries that use the dictionary.

    +
  • RESTRICT

    Rejects the deletion of a dictionary if any object depends on the dictionary. This is the default.

    +
+
+

Examples

Delete the english dictionary.

+
1
DROP TEXT SEARCH DICTIONARY english;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0212.html b/docs/dws/dev/dws_06_0212.html new file mode 100644 index 00000000..f96e6160 --- /dev/null +++ b/docs/dws/dev/dws_06_0212.html @@ -0,0 +1,35 @@ + + +

DROP TRIGGER

+

Function

DROP TRIGGER deletes a trigger.

+
+

Precautions

Only the owner of a trigger and system administrators can run the DROP TRIGGER statement.

+
+

Syntax

1
DROP TRIGGER [ IF EXISTS ] trigger_name ON table_name [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified trigger does not exist.

    +
  • trigger_name

    Specifies the name of the trigger to be deleted.

    +

    Value range: an existing trigger

    +
  • table_name

    Specifies the name of the table where the trigger to be deleted is located.

    +

    Value range: an existing table having a trigger

    +
  • CASCADE | RESTRICT
    • CASCADE: Deletes objects that depend on the trigger.
    • RESTRICT: Refuses to delete the trigger if any objects depend on it. This is the default.
    +
+
+

Examples

Delete the trigger insert_trigger.

+
1
DROP TRIGGER insert_trigger ON test_trigger_src_tbl;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0213.html b/docs/dws/dev/dws_06_0213.html new file mode 100644 index 00000000..dfd5a02e --- /dev/null +++ b/docs/dws/dev/dws_06_0213.html @@ -0,0 +1,32 @@ + + +

DROP TYPE

+

Function

DROP TYPE deletes a user-defined data type. Only the type owner has permission to run this statement.

+
+

Syntax

1
DROP TYPE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified type does not exist.

    +
  • name

    Specifies the name of the type to be deleted (schema-qualified).

    +
  • CASCADE

    Deletes objects (such as columns, functions, and operators) that depend on the type.

    +

    RESTRICT

    +

    Refuses to delete the type if any objects depend on it. This is the default.

    +
+
+

Examples

Delete the compfoo type.

+
1
DROP TYPE compfoo cascade;
+
+ +
+
+

Helpful Links

ALTER TYPE, CREATE TYPE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0214.html b/docs/dws/dev/dws_06_0214.html new file mode 100644 index 00000000..56b03cef --- /dev/null +++ b/docs/dws/dev/dws_06_0214.html @@ -0,0 +1,36 @@ + + +

DROP USER

+

Function

Deleting a user will also delete the schema having the same name as the user.

+
+

Precautions

  • CASCADE is used to delete objects (excluding databases) that depend on the user. CASCADE cannot delete locked objects unless the locked objects are unlocked or the processes that lock the objects are killed.
  • When deleting a user in the database, if the object that the user depends on is in another database or the object of the dependent user is another database, you need to manually delete the dependent objects in other databases or delete the dependent database. Then, delete the user. Cross-database cascading deletion cannot be performed.
  • In a multi-tenant scenario, the service user will also be deleted when you delete a user group. If the specified CASCADE concatenation is deleted, CASCADE will be specified upon the deletion of the service user. If you fail to delete a user, an error is reported, and you cannot delete other users either.
  • If the user has an error table specified when the GDS foreign table is created, the user cannot be deleted by specifying the CASCADE keyword in the DROP USER command.
  • If a "role is being used by other users" error is displayed when you run DROP USER, it might be that threads cannot respond to signals in a timely manner during the CLEAN CONNECTION process. As a result, connections are not completely cleared. In this case, you need to run CLEAN CONNECTION again.
+
+

Syntax

1
DROP USER [ IF EXISTS ] user_name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified user does not exist.

    +
  • user_name

    Specifies the name of a user to be deleted.

    +

    Value range: An existing user name.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically deletes all objects (such as tables) that depend on the user to be deleted. When a user is deleted in CASCADE mode, objects owner by the user and the user's permissions for objects will be deleted.
    • RESTRICT: refuses to delete the user if any objects depend on it. This is the default.
    +
    In GaussDB(DWS), the postgresql.conf file contains the enable_kill_query parameter. This parameter affects the action of deleting user objects using CASCADE.
    • If enable_kill_query is on and CASCADE is used to delete user objects, the processes will be automatically killed and the user will be deleted at the same time.
    • If enable_kill_query is off and CASCADE is used to delete user objects, the user will be deleted after the processes are automatically killed.
    +
    +
    +
+
+

Example

Delete user jim.

+
1
DROP USER jim CASCADE;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0215.html b/docs/dws/dev/dws_06_0215.html new file mode 100644 index 00000000..7ab8319b --- /dev/null +++ b/docs/dws/dev/dws_06_0215.html @@ -0,0 +1,38 @@ + + +

DROP VIEW

+

Function

DROP VIEW forcibly deletes an existing view in a database.

+
+

Precautions

Only a view owner or a system administrator can run DROP VIEW command.

+
+

Syntax

1
DROP VIEW [ IF EXISTS ] view_name [, ...] [ CASCADE | RESTRICT ];
+
+ +
+
+

Parameter Description

  • IF EXISTS

    Sends a notice instead of an error if the specified view does not exist.

    +
  • view_name

    Specifies the name of the view to be deleted.

    +

    Value range: An existing view.

    +
  • CASCADE | RESTRICT
    • CASCADE: deletes objects (such as other views) that depend on a view to be deleted.
    • RESTRICT: refuses to delete the view if any objects depend on it. This is the default.
    +
+
+

Examples

Delete the myView view.

+
1
DROP VIEW myView;
+
+ +
+

Delete the customer_details_view_v2 view.

+
1
DROP VIEW public.customer_details_view_v2;
+
+ +
+
+

Helpful Links

ALTER VIEW, CREATE VIEW

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0216.html b/docs/dws/dev/dws_06_0216.html new file mode 100644 index 00000000..4fd5a3d0 --- /dev/null +++ b/docs/dws/dev/dws_06_0216.html @@ -0,0 +1,127 @@ + + +

FETCH

+

Function

FETCH retrieves data using a previously-created cursor.

+

A cursor has an associated position, which is used by FETCH. The cursor position can be before the first row of the query result, on any particular row of the result, or after the last row of the result.

+
  • When created, a cursor is positioned before the first row.
  • After fetching some rows, the cursor is positioned on the row most recently retrieved.
  • If FETCH runs off the end of the available rows then the cursor is left positioned after the last row, or before the first row if fetching backward.
  • FETCH ALL or FETCH BACKWARD ALL will always leave the cursor positioned after the last row or before the first row.
+
+

Precautions

  • If NO SCROLL is defined for the cursor, a backward fetch like FETCH BACKWARD is not allowed.
  • The forms NEXT, PRIOR, FIRST, LAST, ABSOLUTE, and RELATIVE appropriately fetch a record after moving the cursor. If the cursor is already after the last row before being moved, an empty result is returned, and the cursor is left positioned before the first row (backward fetch) or after the last row (forward fetch) as appropriate.
  • The forms using FORWARD and BACKWARD retrieve the indicated number of rows moving in the forward or backward direction, leaving the cursor positioned on the last-returned row (or after (backward fetch)/before (forward fetch) all rows, if the count exceeds the number of rows available).
  • RELATIVE 0, FORWARD 0, and BACKWARD 0 all request fetching the current row without moving the cursor, that is, re-fetching the most recently fetched row. This will succeed unless the cursor is positioned before the first row or after the last row, in which case, no row is returned.
  • If the cursor of FETCH involves a column-store table, backward fetches like BACKWARD, PRIOR, and FIRST are not supported.
+
+

Syntax

1
FETCH [ direction { FROM | IN } ] cursor_name;
+
+ +
+

The direction clause specifies optional parameters.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
NEXT
+   | PRIOR
+   | FIRST
+   | LAST
+   | ABSOLUTE count
+   | RELATIVE count
+   | count
+   | ALL
+   | FORWARD
+   | FORWARD count
+   | FORWARD ALL
+   | BACKWARD
+   | BACKWARD count
+   | BACKWARD ALL
+
+ +
+
+

Parameter Description

  • direction_clause

    Defines the fetch direction.

    +

    Valid value:

    +
    • NEXT (default value)

      Fetches the next row.

      +
    • PRIOR

      Fetches the prior row.

      +
    • FIRST

      Fetches the first row of the query (same as ABSOLUTE 1).

      +
    • LAST

      Fetches the last row of the query (same as ABSOLUTE -1).

      +
    • ABSOLUTE count

      Fetches the (count)'th row of the query.

      +

      ABSOLUTE fetches are not any faster than navigating to the desired row with a relative move: the underlying implementation must traverse all the intermediate rows anyway.

      +

      count is a possibly-signed integer constant:

      +
      • If count is a positive integer, fetches the (count)'th row of the query, starting from the first row. If count is less than the current cursor position, a rewind operation is required, which is currently not supported.
      • If count is a negative value or 0, a backward scanning is required, which is currently not supported.
      +
    • RELATIVE count

      Fetches the (count)'th succeeding row, or the abs(count)'th prior row if count is negative.

      +

      count is a possibly-signed integer constant:

      +
      • If count is a positive integer, fetches the (count)'th succeeding row.
      • If count is a negative value, a backward scanning is required, which is currently not supported.
      • RELATIVE 0 fetches the current row.
      +
    • count

      Fetches the next count rows (same as FORWARD count).

      +
    • ALL

      Fetches all remaining rows (same as FORWARD ALL).

      +
    • FORWARD

      Fetches the next row (same as NEXT).

      +
    • FORWARD count

      Fetches the next count rows (same as RELATIVE count). FORWARD 0 re-fetches the current row.

      +
    • FORWARD ALL

      Fetches all remaining rows.

      +
    • BACKWARD

      Fetches the prior row (same as PRIOR).

      +
    • BACKWARD count

      Fetches the prior count rows (scanning backwards).

      +

      count is a possibly-signed integer constant:

      +
      • If count is a positive integer, fetches the (count)'th prior row.
      • If count is a negative integer, fetches the abs(count)'th succeeding row.
      • BACKWARD 0 re-fetches the current row.
      +
    • BACKWARD ALL

      Fetches all prior rows (scanning backwards).

      +
    +
  • { FROM | IN } cursor_name

    Specifies the cursor name using the keyword FROM or IN.

    +

    Value range: an existing cursor name.

    +
+
+

Examples

Example 1: Run the SELECT statement to read a table using a cursor.

+

Set up the cursor1 cursor.

+
1
CURSOR cursor1 FOR SELECT * FROM tpcds.customer_address ORDER BY 1;
+
+ +
+

Fetch the first three rows from cursor1.

+
1
+2
+3
+4
+5
+6
+7
FETCH FORWARD 3 FROM cursor1;
+ ca_address_sk |  ca_address_id   | ca_street_number |   ca_street_name   | ca_street_type  | ca_suite_number |     ca_city     |    ca_county    | ca_state |   ca_zip   |  ca_country   | ca_gmt_offset |   ca_location_type   
+---------------+------------------+------------------+--------------------+-----------------+-----------------+-----------------+-----------------+----------+------------+---------------+---------------+----------------------
+             1 | AAAAAAAABAAAAAAA | 18               | Jackson            | Parkway         | Suite 280       | Fairfield       | Maricopa County | AZ       | 86192      | United States |         -7.00 | condo               
+             2 | AAAAAAAACAAAAAAA | 362              | Washington 6th     | RD              | Suite 80        | Fairview        | Taos County     | NM       | 85709      | United States |         -7.00 | condo               
+             3 | AAAAAAAADAAAAAAA | 585              | Dogwood Washington | Circle          | Suite Q         | Pleasant Valley | York County     | PA       | 12477      | United States |         -5.00 | single family       
+(3 rows)
+
+ +
+

Example 2: Use a cursor to read the content in the VALUES clause.

+

Set up the cursor cursor2.

+
1
CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1;
+
+ +
+

Fetch the first two rows from cursor2.

+
1
+2
+3
+4
+5
+6
FETCH FORWARD 2 FROM cursor2;
+column1 | column2
+---------+---------
+0 |       3
+1 |       2
+(2 rows)
+
+ +
+
+

Helpful Links

CLOSE, MOVE, CURSOR

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0217.html b/docs/dws/dev/dws_06_0217.html new file mode 100644 index 00000000..02d8d692 --- /dev/null +++ b/docs/dws/dev/dws_06_0217.html @@ -0,0 +1,62 @@ + + +

MOVE

+

Function

MOVE repositions a cursor without retrieving any data. MOVE works exactly like the FETCH command, except it only repositions the cursor and does not return rows.

+
+

Precautions

None

+
+

Syntax

1
MOVE [ direction [ FROM | IN ] ] cursor_name;
+
+ +
+

The direction clause specifies optional parameters.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
NEXT
+   | PRIOR
+   | FIRST
+   | LAST
+   | ABSOLUTE count
+   | RELATIVE count
+   | count
+   | ALL
+   | FORWARD
+   | FORWARD count
+   | FORWARD ALL
+   | BACKWARD
+   | BACKWARD count
+   | BACKWARD ALL
+
+ +
+
+

Parameter Description

MOVE command parameters are the same as FETCH command parameters. For details, see Parameter Description in FETCH.

+

On successful completion, a MOVE command returns a command tag of the form MOVE count. The count is the number of rows that a FETCH command with the same parameters would have returned (possibly zero).

+
+
+

Examples

Skip the first three rows of cursor1.

+
1
MOVE FORWARD 3 FROM cursor1;
+
+ +
+
+

Helpful Links

CLOSE, FETCH, CURSOR

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0218.html b/docs/dws/dev/dws_06_0218.html new file mode 100644 index 00000000..a151453e --- /dev/null +++ b/docs/dws/dev/dws_06_0218.html @@ -0,0 +1,56 @@ + + +

REINDEX

+

Function

REINDEX rebuilds an index using the data stored in the index's table, replacing the old copy of the index.

+

There are several scenarios in which REINDEX can be used:

+
  • An index has become corrupted, and no longer contains valid data.
  • An index has become "bloated", that is, it contains many empty or nearly-empty pages.
  • You have altered a storage parameter (such as fillfactor) for an index, and wish to ensure that the change has taken full effect.

    An index build with the CONCURRENTLY option failed, leaving an "invalid" index.

    +
+
+

Precautions

Index reconstruction of the REINDEX DATABASE or SYSTEM type cannot be performed in transaction blocks.

+
+

Syntax

  • Rebuild a general index.
    1
    REINDEX { INDEX |  TABLE | DATABASE | SYSTEM } name [ FORCE ];
    +
    + +
    +
+
  • Rebuild an index partition.
    1
    +2
    REINDEX  { TABLE } name
    +    PARTITION partition_name [ FORCE  ];
    +
    + +
    +
+
+

Parameter Description

  • INDEX

    Recreates the specified index.

    +
  • TABLE

    Recreates all indexes of the specified table. If the table has a secondary TOAST table, that is reindexed as well.

    +
  • DATABASE

    Recreates all indexes within the current database. Indexes on the shared system directory will also be processed. This form of REINDEX cannot be executed within a transaction block.

    +
  • SYSTEM

    Recreates all indexes on system catalogs within the current database. Indexes on user tables are not processed.

    +
  • name

    Name of the specific index, table, or database to be reindexed. Index and table names can be schema-qualified.

    +

    REINDEX DATABASE and SYSTEM can create indexes for only the current database. Therefore, name must be the same as the current database name.

    +
    +
  • FORCE

    This is an obsolete option. It is ignored if specified.

    +
  • partition_name

    Specifies the name of the partition or index partition to be reindexed.

    +

    Value range:

    +
    • If it is REINDEX INDEX, specify the name of an index partition.
    • If it is REINDEX TABLE, specify the name of a partition.
    +
+

Index reconstruction of the REINDEX DATABASE or SYSTEM type cannot be performed in transaction blocks.

+
+
+

Examples

Rebuild a single index.

+
1
REINDEX INDEX tpcds.tpcds_customer_index1;
+
+ +
+

Rebuild all indexes on the tpcds.customer_t1 table.

+
1
REINDEX TABLE tpcds.customer_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0219.html b/docs/dws/dev/dws_06_0219.html new file mode 100644 index 00000000..56562dbd --- /dev/null +++ b/docs/dws/dev/dws_06_0219.html @@ -0,0 +1,42 @@ + + +

RESET

+

Function

RESET restores run-time parameters to their default values. The default values are parameter default values complied in the postgresql.conf configuration file.

+

RESET is an alternative spelling for:

+

SET configuration_parameter TO DEFAULT

+
+

Precautions

RESET and SET have the same transaction behavior. Their impact will be rolled back.

+
+

Syntax

RESET {configuration_parameter | CURRENT_SCHEMA | TIME ZONE | TRANSACTION ISOLATION LEVEL | SESSION AUTHORIZATION | ALL };
+
+

Parameter Description

  • configuration_parameter

    Specifies the name of a settable run-time parameter.

    +

    Value range: Run-time parameters. You can view them by running the SHOW ALL command.

    +

    Some parameters that viewed by SHOW ALL cannot be set by SET. For example, max_datanodes.

    +
    +
  • CURRENT_SCHEMA

    Specifies the current schema.

    +
  • TIME ZONE

    Specifies the time zone.

    +
  • TRANSACTION ISOLATION LEVEL

    Specifies the transaction isolation level.

    +
  • SESSION AUTHORIZATION

    Specifies the session authorization.

    +
  • ALL

    Resets all settable run-time parameters to default values.

    +
+
+

Examples

Reset timezone to the default value.

+
1
RESET timezone;
+
+ +
+

Set all parameters to their default values.

+
1
RESET ALL;
+
+ +
+
+

Helpful Links

SET, SHOW

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0220.html b/docs/dws/dev/dws_06_0220.html new file mode 100644 index 00000000..dea2cd72 --- /dev/null +++ b/docs/dws/dev/dws_06_0220.html @@ -0,0 +1,78 @@ + + +

SET

+

Function

SET modifies a run-time parameter.

+
+

Precautions

Most run-time parameters can be modified by executing SET. Some parameters cannot be modified after a server or session starts.

+
+

Syntax

  • Set the system time zone.
    1
    SET [ SESSION | LOCAL ] TIME ZONE { timezone | LOCAL | DEFAULT };
    +
    + +
    +
  • Set the schema of the table.
    1
    +2
    +3
    SET [ SESSION | LOCAL ] 
    +    {CURRENT_SCHEMA { TO | = } { schema | DEFAULT }
    +    | SCHEMA 'schema'};
    +
    + +
    +
  • Set client encoding.
    1
    SET [ SESSION | LOCAL ] NAMES encoding_name;
    +
    + +
    +
  • Set XML parsing mode.
    1
    SET [ SESSION | LOCAL ] XML OPTION { DOCUMENT | CONTENT };
    +
    + +
    +
  • Set other running parameters.
    1
    +2
    +3
    SET [ LOCAL | SESSION ]
    +    { {config_parameter { { TO | = } { value | DEFAULT } 
    +                        | FROM CURRENT }}};
    +
    + +
    +
+
+

Parameter Description

  • SESSION

    Indicates that the specified parameters take effect for the current session. This is the default value if neither SESSION nor LOCAL appears.

    +

    If SET or SET SESSION is executed within a transaction that is later aborted, the effects of the SET command disappear when the transaction is rolled back. Once the surrounding transaction is committed, the effects will persist until the end of the session, unless overridden by another SET.

    +
  • LOCAL

    Indicates that the specified parameters take effect for the current transaction. After COMMIT or ROLLBACK, the session-level setting takes effect again.

    +

    The effects of SET LOCAL last only till the end of the current transaction, whether committed or not. A special case is SET followed by SET LOCAL within a single transaction: the SET LOCAL value will be seen until the end of the transaction, but afterwards (if the transaction is committed) the SET value will take effect.

    +
  • TIME ZONE timezone

    Indicates the local time zone for the current session.

    +

    Value range: A valid local time zone. The corresponding run-time parameter is TimeZone. The default value is PRC.

    +
  • CURRENT_SCHEMA

    schema

    +

    Indicates the current schema.

    +

    Value range: An existing schema name.

    +
  • SCHEMA schema

    Indicates the current schema. Here the schema is a string.

    +

    Example: set schema 'public';

    +
  • NAMES encoding_name

    Indicates the client character encoding name. This command is equivalent to set client_encoding to encoding_name.

    +

    Value range: A valid character encoding name. The run-time parameter corresponding to this option is client_encoding. The default encoding is UTF8.

    +
  • XML OPTION option

    Indicates the XML resolution mode.

    +

    Value range: CONTENT (default), DOCUMENT

    +
  • config_parameter

    Indicates the configurable run-time parameters. You can use SHOW ALL to view available run-time parameters.

    +

    Some parameters that viewed by SHOW ALL cannot be set by SET. For example, max_datanodes.

    +
    +
  • value

    Indicates the new value of the config_parameter parameter. This parameter can be specified as string constants, identifiers, numbers, or comma-separated lists of these. DEFAULT can be written to indicate resetting the parameter to its default value.

    +
+
+

Examples

Configure the search path of the tpcds schema.

+
1
SET search_path TO tpcds, public;
+
+ +
+

Set the date style to the traditional POSTGRES style (date placed before month).

+
1
SET datestyle TO postgres;
+
+ +
+
+

Helpful Links

RESET, SHOW

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0221.html b/docs/dws/dev/dws_06_0221.html new file mode 100644 index 00000000..638ce4b1 --- /dev/null +++ b/docs/dws/dev/dws_06_0221.html @@ -0,0 +1,37 @@ + + +

SET CONSTRAINTS

+

Function

SET CONSTRAINTS sets the behavior of constraint checking within the current transaction.

+

IMMEDIATE constraints are checked at the end of each statement. DEFERRED constraints are not checked until transaction commit. Each constraint has its own IMMEDIATE or DEFERRED mode.

+

Upon creation, a constraint is given one of three characteristics DEFERRABLE INITIALLY DEFERRED, DEFERRABLE INITIALLY IMMEDIATE, or NOT DEFERRABLE. The third class is always IMMEDIATE and is not affected by the SET CONSTRAINTS command. The first two classes start every transaction in specified modes, but its behaviors can be changed within a transaction by SET CONSTRAINTS.

+

SET CONSTRAINTS with a list of constraint names changes the mode of just those constraints (which must all be deferrable). If multiple constraints match a name, the name is affected by all of these constraints. SET CONSTRAINTS ALL changes the modes of all deferrable constraints.

+

When SET CONSTRAINTS changes the mode of a constraint from DEFERRED to IMMEDIATE, the new mode takes effect retroactively: any outstanding data modifications that would have been checked at the end of the transaction are instead checked during the execution of the SET CONSTRAINTS command. If any such constraint is violated, the SET CONSTRAINTS fails (and does not change the constraint mode). Therefore, SET CONSTRAINTS can be used to force checking of constraints to occur at a specific point in a transaction.

+

Only foreign key constraints are affected by this setting. Check and unique constraints are always checked immediately when a row is inserted or modified.

+
+

Precautions

SET CONSTRAINTS sets the behavior of constraint checking only within the current transaction. Therefore, if you execute this command outside of a transaction block (START TRANSACTION/COMMIT pair), it will not appear to have any effect.

+
+

Syntax

1
SET CONSTRAINTS  { ALL  |  { name  }  [, ...]  }  { DEFERRED  | IMMEDIATE  } ;
+
+ +
+
+

Parameter Description

  • name

    Specifies the constraint name.

    +

    Value range: an existing constraint name, which can be found in the system catalog pg_constraint.

    +
  • ALL

    Indicates all constraints.

    +
  • DEFERRED

    Indicates that constraints are not checked until transaction commit.

    +
  • IMMEDIATE

    Indicates that constraints are checked at the end of each statement.

    +
+
+

Examples

Set that constraints are checked when a transaction is committed.

+
1
SET CONSTRAINTS ALL DEFERRED;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0222.html b/docs/dws/dev/dws_06_0222.html new file mode 100644 index 00000000..c234a489 --- /dev/null +++ b/docs/dws/dev/dws_06_0222.html @@ -0,0 +1,49 @@ + + +

SET ROLE

+

Function

SET ROLE sets the current user identifier of the current session.

+
+

Precautions

  • Users of the current session must be members of specified rolename, but the system administrator can choose any roles.
  • Executing this command may add rights of a user or restrict rights of a user. If the role of a session user has the INHERITS attribute, it automatically has all rights of roles that SET ROLE enables the role to be. In this case, SET ROLE physically deletes all rights directly granted to session users and rights of its belonging roles and only leaves rights of the specified roles. If the role of the session user has the NOINHERITS attribute, SET ROLE deletes rights directly granted to the session user and obtains rights of the specified role.
+
+

Syntax

  • SET ROLE sets the current user identifier of the current session.
    1
    SET [ SESSION | LOCAL ] ROLE role_name PASSWORD 'password';
    +
    + +
    +
  • Reset the current user identifier to that of the current session.
    1
    RESET ROLE;
    +
    + +
    +
+
+

Parameter Description

  • SESSION

    Specifies that the command takes effect only for the current session. This parameter is used by default.

    +

    Value range: A string. It must comply with the naming convention rule.

    +
  • LOCALE

    Indicates that the specified command takes effect only for the current transaction.

    +
  • role_name

    Specifies the role name.

    +

    Value range: A string. It must comply with the naming convention rule.

    +
  • password

    Specifies the password of a role. It must comply with the password convention.

    +
  • RESET ROLE

    Resets the current user identifier.

    +
+
+

Examples

Set the current user to paul.

+
1
SET ROLE paul PASSWORD '{password}';
+
+ +
+

View the current session user and the current user.

+
1
SELECT SESSION_USER, CURRENT_USER;
+
+ +
+

Reset the current user.

+
1
RESET role;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0223.html b/docs/dws/dev/dws_06_0223.html new file mode 100644 index 00000000..ce48e097 --- /dev/null +++ b/docs/dws/dev/dws_06_0223.html @@ -0,0 +1,53 @@ + + +

SET SESSION AUTHORIZATION

+

Function

SET SESSION AUTHORIZATION sets the session user identifier and the current user identifier of the current SQL session to a specified user.

+
+

Precautions

The session identifier can be changed only when the initial session user has the system administrator rights. Otherwise, the system supports the command only when the authenticated user name is specified.

+
+

Syntax

  • SET SESSION AUTHORIZATION sets the session user identifier and the current user identifier of the current session.
    1
    SET [ SESSION | LOCAL ] SESSION AUTHORIZATION role_name PASSWORD 'password';
    +
    + +
    +
  • Reset the identifiers of the session and current users to the initially authenticated user names.
    1
    +2
    {SET [ SESSION | LOCAL ] SESSION AUTHORIZATION DEFAULT
    +    | RESET SESSION AUTHORIZATION};
    +
    + +
    +
+
+

Parameter Description

  • SESSION

    Indicates that the specified parameters take effect for the current session.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • LOCALE

    Indicates that the specified command takes effect only for the current transaction.

    +
  • role_name

    User name.

    +

    Value range: A string. It must comply with the naming convention.

    +
  • password

    Specifies the password of a role. It must comply with the password convention.

    +
  • DEFAULT

    Reset the identifiers of the session and current users to the initially authenticated user names.

    +
+
+

Examples

Set the current user to paul.

+
1
SET SESSION AUTHORIZATION paul password '{password}';
+
+ +
+

View the current session user and the current user.

+
1
SELECT SESSION_USER, CURRENT_USER;
+
+ +
+

Reset the current user.

+
1
RESET SESSION AUTHORIZATION;
+
+ +
+
+

Helpful Links

SET ROLE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0224.html b/docs/dws/dev/dws_06_0224.html new file mode 100644 index 00000000..c6580ad6 --- /dev/null +++ b/docs/dws/dev/dws_06_0224.html @@ -0,0 +1,55 @@ + + +

SHOW

+

Function

SHOW shows the current value of a run-time parameter. You can use the SET statement to set these parameters.

+
+

Precautions

Some parameters that can be viewed by SHOW are read-only. You can view but cannot modify their values.

+
+

Syntax

1
+2
+3
+4
+5
+6
+7
+8
+9
SHOW 
+  { 
+    configuration_parameter | 
+    CURRENT_SCHEMA | 
+    TIME ZONE | 
+    TRANSACTION ISOLATION LEVEL | 
+    SESSION AUTHORIZATION | 
+    ALL 
+  };
+
+ +
+
+

Parameter Description

See Parameter Description in RESET.

+
+

Examples

Show the value of timezone.

+
1
SHOW timezone;
+
+ +
+

Show the current setting of the DateStyle parameter.

+
1
SHOW DateStyle;
+
+ +
+

Show the current setting of all parameters.

+
1
SHOW ALL;
+
+ +
+
+

Helpful Links

SET, RESET

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0225.html b/docs/dws/dev/dws_06_0225.html new file mode 100644 index 00000000..820267ca --- /dev/null +++ b/docs/dws/dev/dws_06_0225.html @@ -0,0 +1,66 @@ + + +

TRUNCATE

+

Function

TRUNCATE quickly removes all rows from a database table.

+

It has the same effect as an unqualified DELETE on each table, but it is faster since it does not actually scan the tables. This is most useful on large tables.

+

TRUNCATE obtains an ACCESS EXCLUSIVE lock on each table it operates on, which blocks all other concurrent operations on that table. If concurrent access to the table is required, use the DELETE command instead.

+
+

Precautions

  • TRUNCATE TABLE has the same function as a DELETE statement with no WHERE clause, emptying a table.
  • TRUNCATE TABLE uses less system and transaction log resources as compared with DELETE.
    • DELETE deletes a row each time, and records the deletion of each row in the transaction log.
    • TRUNCATE TABLE deletes all rows in a table by releasing the data page storing the table data, and records the releasing of the data page only in the transaction log.
    +
  • The differences between TRUNCATE, DELETE, and DROP are as follows:
    • TRUNCATE TABLE deletes content, releases space, but does not delete definitions.
    • DELETE TABLE deletes content, but does not delete definitions nor release space.
    • DROP TABLE deletes content and definitions, and releases space.
    +
+
+

Syntax

  • TRUNCATE empties a table or set of tables.
+
1
+2
TRUNCATE [ TABLE ] [ ONLY ] {[[database_name.]schema_name.]table_name [ * ]} [, ... ]
+    [ CONTINUE IDENTITY ] [ CASCADE | RESTRICT ];
+
+ +
+
  • Truncate the data in a partition.
+
1
+2
+3
+4
+5
ALTER TABLE [ IF EXISTS  ] { [ ONLY  ] [[database_name.]schema_name.]table_name  
+                           | table_name *  
+                           | ONLY ( table_name )  } 
+    TRUNCATE PARTITION { partition_name  
+                       | FOR (  partition_value  [, ...] )  } ;
+
+ +
+
+

Parameter Description

  • ONLY

    If ONLY is specified, only the specified table is cleared. Otherwise, the table and all its subtables (if any) are cleared.

    +
  • database_name

    Database name of the target table

    +
  • schema_name

    Schema name of the target table

    +
  • table_name

    Specifies the name (optionally schema-qualified) of a target table.

    +

    Value range: an existing table name

    +
  • CONTINUE IDENTITY

    Does not change the values of sequences. This is the default.

    +
  • CASCADE | RESTRICT
    • CASCADE: automatically truncates all tables that have foreign-key references to any of the named tables, or to any tables added to the group due to CASCADE.
    • RESTRICT (default): refuses to truncate if any of the tables have foreign-key references from tables that are not listed in the command.
    +
  • partition_name

    Indicates the partition in the target partition table.

    +

    Value range: An existing partition name.

    +
  • partition_value

    Specifies the value of the specified partition key.

    +

    The value specified by PARTITION FOR can uniquely identify a partition.

    +

    Value range: The partition key of the partition to be deleted.

    +

    When the PARTITION FOR clause is used, the entire partition where partition_value is located is cleared.

    +
    +
+
+

Examples

Clear the p1 partition of the customer_address table.

+
1
ALTER TABLE tpcds.customer_address TRUNCATE PARTITION p1;
+
+ +
+

Clear a partitioned table.

+
1
TRUNCATE TABLE tpcds.customer_address;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0226.html b/docs/dws/dev/dws_06_0226.html new file mode 100644 index 00000000..f5cc121e --- /dev/null +++ b/docs/dws/dev/dws_06_0226.html @@ -0,0 +1,88 @@ + + +

VACUUM

+

Function

VACUUM reclaims storage space occupied by tables or B-tree indexes. In normal database operation, rows that have been deleted or obsoleted by an update are not physically removed from their table; they remain present until a VACUUM is done. Therefore, it is necessary to execute VACUUM periodically, especially on frequently-updated tables.

+

+
+

Precautions

  • With no table specified, VACUUM processes all the tables that the current user has permission to vacuum in the current database. With a table specified, VACUUM processes only that table.
  • To vacuum a table, you must ordinarily be the table's owner or the system administrator. However, database owners are allowed to VACUUM all tables in their databases, except shared catalogs. (The restriction for shared catalogs means that a true database-wide VACUUM can only be executed by the system administrator). VACUUM skips over any tables that the calling user does not have the permission to vacuum.
  • VACUUM cannot be executed inside a transaction block.
  • It is recommended that active production databases be vacuumed frequently (at least nightly), in order to remove dead rows. After adding or deleting a large number of rows, it might be a good idea to execute the VACUUM ANALYZE command for the affected table. This will update the system catalogs with the results of all recent changes, and allow the database query optimizer to make better choices in planning user queries.
  • FULL is recommended only in special scenarios. An example is when you have deleted or updated most of the rows in a table and would like the table to physically shrink to occupy less disk space. VACUUM FULL will usually shrink the table more than a plain VACUUM would. If the physical space usage does not decrease after you run the command, check whether there are other active transactions (that have started before you delete data transactions and not ended before you run VACUUM FULL). If there are such transactions, run this command again when the transactions quit.
  • VACUUM causes a substantial increase in I/O traffic, which might cause poor performance for other active sessions. Therefore, you are advised to do VACUUM to the database when services are not busy.
  • When VERBOSE is specified, VACUUM prints progress messages to indicate which table is currently being processed. Various statistics about the tables are printed as well. However, if the VERBOSE option is specified in VACUUM executed for column-store tables, no output will be displayed.
  • When the option list is surrounded by parentheses, the options can be written in any order. If there are no brackets, the options must be given in the order displayed in the syntax.
  • VACUUM and VACUUM FULL clear deleted tuples after the delay specified by vacuum_defer_cleanup_age.
  • VACUUM ANALYZE performs a VACUUM and then an ANALYZE for each selected table. This is a handy combination form for routine maintenance scripts.
  • Plain VACUUM (without FULL) recycles space and makes it available for reuse. This form of the command can operate in parallel with normal reading and writing of the table, as an exclusive lock is not obtained. VACUUM FULL executes wider processing, including moving rows across blocks to compress tables so they occupy minimum number of disk blocks. This form is much slower and requires an exclusive lock on each table while it is being processed.
  • When you do VACUUM to a column-store table, the following operations are internally performed: data in the delta table is migrated to the primary table, and the delta and desc tables of the primary table are vacuumed. VACUUM does not reclaim the storage space of the delta table. To reclaim it, do VACUUM DELTAMERGE to the column-store table.
  • If you perform VACUUM FULL when a long-running query accesses a system table, the long-running query may prevent VACUUM FULL from accessing the system table. As a result, the connection times out and an error is reported.
+
+

Syntax

  • Reclaim space and update statistics information, with no requirements for the order of keywords.
    1
    +2
    VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]
    +    [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
    +
    + +
    +
  • Reclaim space, without updating statistics information.
    1
    VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ];
    +
    + +
    +
  • Reclaim space and update statistics information, with a specific order of keywords required.
    1
    +2
    VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] 
    +    [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
    +
    + +
    +
  • For HDFS and column-store tables, migrate data from the delta table to the primary table.
    1
    VACUUM DELTAMERGE [ table_name ];
    +
    + +
    +
  • For HDFS tables, delete the empty value partition directory of HDFS table in HDFS storage.
    1
    VACUUM HDFSDIRECTORY [ table_name ];
    +
    + +
    +
+
+

Parameter Description

  • FULL

    Selects "FULL" vacuum, which can reclaim more space, but takes much longer and exclusively locks the table. This method also requires additional disk space, because it writes a new copy of the table and does not free the old copy until the operation is complete. Generally, this option is used only when a large amount of space needs to be reclaimed from a table.

    +

    FULL options can also contain the COMPACT parameter, which is only used for the HDFS table. Specifying the COMPACT parameter improves VACUUM FULL operation performance.

    +

    COMPACT and PARTITION cannot be used at the same time.

    +

    Using FULL will cause statistics missing. To collect statistics, add the keyword ANALYZE to VACUUM FULL.

    +
    +
  • FREEZE

    Is equivalent to executing VACUUM with the vacuum_freeze_min_age parameter set to zero.

    +
  • VERBOSE

    Prints a detailed vacuum activity report for each table.

    +
  • ANALYZE | ANALYSE

    Updates statistics used by the planner to determine the most efficient way to execute a query.

    +
  • table_name

    Indicates the name (optionally schema-qualified) of a specific table to vacuum.

    +

    Value range: The name of a specific table to vacuum. Defaults are all tables in the current database.

    +
  • column_name

    Indicates the name of a specific field to analyze.

    +

    Value range: Indicates the name of a specific field to analyze. Defaults are all columns.

    +
  • PARTITION

    HDFS table does not support PARTITION. COMPACT and PARTITION cannot be used at the same time.

    +
  • partition_name

    Indicates the partition name of a specific table to vacuum. Defaults are all partitions.

    +
  • DELTAMERGE

    (For HDFS and column-store tables) Migrates data from the delta table to primary tables. If the data volume of the delta table is less than 60,000 rows, the data will not be migrated. Otherwise, the data will be migrated to HDFS, and the delta table will be cleared by TRUNCATE. For a column-store table, this operation always transfers all data in the delta table to the CU.

    +

    The following DFX functions are provided to return the data storage in the delta table of a column-store table (for an HDFS table, it can be returned by EXPLAIN ANALYZE):

    +
    • pgxc_get_delta_info(TEXT): The input parameter is a column-store table name. The delta table information on each node is collected and displayed, including the number of active tuples, table size, and maximum block ID.
    • get_delta_info(TEXT): The input parameter is a column-store table name. The system summarizes the results returned from pgxc_get_delta_info and returns the total number of active tuples, total table size, and maximum block ID in the delta table. When querying delta information about a temporary table, you need to specify the schema of the temporary table. Otherwise, an error is reported, indicating that the table cannot be found.
    +
    +
  • HDFSDIRECTORY

    Deletes the empty value partition directory of HDFS table in HDFS storage for HDFS table.

    +
+
+

Examples

Delete all tables in the current database.

+
1
VACUUM;
+
+ +
+

Reclaim the space of partition P2 of the tpcds.web_returns_p1 table without updating statistics.

+
1
VACUUM FULL tpcds.web_returns_p1 PARTITION(P2);
+
+ +
+

Reclaim the tpcds.web_returns_p1 table and update statistics.

+
1
VACUUM FULL ANALYZE tpcds.web_returns_p1;
+
+ +
+

Delete all tables in the current database and collect statistics about the query optimizer.

+
1
VACUUM ANALYZE;
+
+ +
+

Delete only the reason table.

+
1
VACUUM (VERBOSE, ANALYZE) reason;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0227.html b/docs/dws/dev/dws_06_0227.html new file mode 100644 index 00000000..8084be19 --- /dev/null +++ b/docs/dws/dev/dws_06_0227.html @@ -0,0 +1,39 @@ + + + +

DML Syntax

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0228.html b/docs/dws/dev/dws_06_0228.html new file mode 100644 index 00000000..6cb7e316 --- /dev/null +++ b/docs/dws/dev/dws_06_0228.html @@ -0,0 +1,25 @@ + + +

DML Syntax Overview

+

Data Manipulation Language (DML) is used to perform operations on data in database tables, such as inserting, updating, querying, or deleting data.

+

Insert Data

Inserting data refers to adding one or multiple records to a database table. For details, see INSERT.

+
+

Updating Data

Modifying data refers to modifying one or multiple records in a database table. For details, see UPDATE.

+
+

Querying Data

The database query statement SELECT is used to search required information in a database. For details, see SELECT.

+
+

Deleting Data

For details about how to delete data that meets specified conditions from a table, see DELETE.

+
+

Copying Data

GaussDB(DWS) provides a statement for copying data between tables and files. For details, see COPY.

+
+

Locking a Table

GaussDB(DWS) provides multiple lock modes to control concurrent accesses to table data. For details, see LOCK.

+
+

Run the following statement to invoke the function:

GaussDB(DWS) provides three statements for invoking functions. These statements are the same in the syntax structure. For details, see CALL.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0229.html b/docs/dws/dev/dws_06_0229.html new file mode 100644 index 00000000..c6008449 --- /dev/null +++ b/docs/dws/dev/dws_06_0229.html @@ -0,0 +1,153 @@ + + +

CALL

+

Function

CALL calls defined functions or stored procedures.

+
+

Precautions

None

+
+

Syntax

1
CALL [schema.] {func_name| procedure_name} ( param_expr );
+
+ +
+
+

Parameter Description

  • schema

    Specifies the name of the schema where a function or stored procedure is located.

    +
  • func_name

    Specifies the name of the function or stored procedure to be called.

    +

    Value range: an existing function name

    +
  • param_expr

    Specifies a list of parameters in the function. Use := or => to separate a parameter name and its value. This method allows parameters to be placed in any order. If only parameter values are in the list, the value order must be the same as that defined in the function or stored procedure.

    +

    Value range: names of existing function or stored procedure parameters

    +

    The parameters include input parameters (whose name and type are separated by IN) and output parameters (whose name and type are separated by OUT). When you run the CALL statement to call a function or stored procedure, the parameter list must contain an output parameter for non-overloaded functions. You can set the output parameter to a variable or any constant. For details, see Examples. For an overloaded package function, the parameter list can have no output parameter, but the function may not be found. If an output parameter is contained, it must be a constant.

    +
    +
+
+

Examples

Create the func_add_sql function to compute the sum of two integers and return the result.
1
+2
+3
+4
+5
+6
CREATE FUNCTION func_add_sql(num1 integer, num2 integer) RETURN integer
+AS
+BEGIN
+RETURN num1 + num2;
+END;
+/
+
+ +
+
+
Transfer based on parameter values.
1
CALL func_add_sql(1, 3);
+
+ +
+
+
Transfer based on the naming flags.
1
+2
CALL func_add_sql(num1 => 1,num2 => 3);
+CALL func_add_sql(num2 := 2, num1 := 3);
+
+ +
+
+
Delete the function.
1
DROP FUNCTION func_add_sql;
+
+ +
+
+
Create a function with output parameters.
1
+2
+3
+4
+5
+6
+7
CREATE FUNCTION func_increment_sql(num1 IN integer, num2 IN integer, res OUT integer)
+RETURN integer
+AS
+BEGIN
+res := num1 + num2;
+END;
+/
+
+ +
+
+
Set output parameters to constants.
1
CALL func_increment_sql(1,2,1);
+
+ +
+
+
Set output parameters to variables.
1
+2
+3
+4
+5
+6
+7
DECLARE
+res int;
+BEGIN
+func_increment_sql(1, 2, res);
+dbms_output.put_line(res);
+END;
+/
+
+ +
+
+
Create overloaded functions.
1
+2
+3
+4
+5
+6
+7
+8
+9
create or replace procedure package_func_overload(col int, col2 out int) package
+as
+declare
+    col_type text;
+begin
+     col := 122;
+         dbms_output.put_line('two out parameters ' || col2);
+end;
+/
+
+ +
+
1
+2
+3
+4
+5
+6
+7
+8
+9
create or replace procedure package_func_overload(col int, col2 out varchar) package
+as
+declare
+    col_type text;
+begin
+     col2 := '122';
+         dbms_output.put_line('two varchar parameters ' || col2);
+end;
+/
+
+ +
+
+
Call a function.
1
+2
call package_func_overload(1, 'test'); 
+call package_func_overload(1, 1); 
+
+ +
+
+
Delete a function.
1
DROP FUNCTION func_increment_sql;
+
+ +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0230.html b/docs/dws/dev/dws_06_0230.html new file mode 100644 index 00000000..3b7be03d --- /dev/null +++ b/docs/dws/dev/dws_06_0230.html @@ -0,0 +1,409 @@ + + +

COPY

+

Function

COPY copies data between tables and files.

+

COPY FROM copies data from a file to a table. COPY TO copies data from a table to a file.

+
+

Important Notes

  • If CNs and DNs are enabled in security mode, the COPY FROM FILENAME or COPY TO FILENAME cannot be used. Use \copy to avoid this problem, for details, see "FAQs > Data Import and Export > How Do I Use \copy to Import and Export Data?" in the Data Warehouse Service User Guide.
  • COPY applies to only tables and does not apply to views.
  • To insert data to a table, you must have the permission to insert data.
  • If a list of columns are specified, COPY will only copy the data in the specified columns to or from the file. If there are any columns in the table that are not in the column list, COPY FROM will insert the default values for those columns.
  • If a source data file is specified, the file must be accessible from the server. If STDIN is specified, data is transmitted between the client and server. Separate columns by pressing Tab. Enter \. in a new line to indicate the end of input.
  • If the number of columns in a row of the data file is smaller or larger than the expected number, COPY FROM displays an error message.
  • A backslash and a period (\.) indicate the end of data. The end identifier is not required for reading data from a file and is required for copying data between client applications.
  • In COPY FROM, "\N" indicates an empty character string, and "\\N" indicates the actual data "\N".
+
+
  • COPY FROM does not support pre-processing of data during data import, for example, expression calculation and default value filling. If you need to perform pre-processing during data import, you need to import the data to a temporary table, and then run SQL statements to insert data to the table using expression or function operations. However, this method may cause I/O expansion, deteriorating data import performance.
  • Transactions will be rolled back when data format errors occur during COPY FROM execution. In this case, error information is insufficient so you cannot easily locate the incorrect data from a large amount of raw data.
  • COPY FROM and COPY TO apply to low concurrency and local data import and export in small amount.
+

Syntax

  • Copy the data from a file to a table.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    COPY table_name [ ( column_name [, ...] ) ] 
    +    FROM { 'filename' | STDIN }
    +    [ [ USING ] DELIMITERS 'delimiters' ]
    +    [ WITHOUT ESCAPING ]
    +    [ LOG ERRORS ]
    +    [ LOG ERRORS data ]
    +    [ REJECT LIMIT 'limit' ]
    +    [ [ WITH ] ( option [, ...] ) ]
    +    | copy_option
    +    | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [  ...] ] ];
    +
    + +
    +

    In the SQL syntax, FIXED, FORMATTER ( { column_name( offset, length ) } [, ...] ), and [ ( option [, ...] ) | copy_option [ ...] ] can be in any sequence.

    +
    +
  • Copy the data from a table to a file.
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    COPY table_name [ ( column_name [, ...] ) ]
    +    TO { 'filename' | STDOUT }
    +    [ [ USING ] DELIMITERS 'delimiters' ]
    +    [ WITHOUT ESCAPING ]
    +    [ [ WITH ] ( option [, ...] ) ]
    +    | copy_option
    +    | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [  ...] ] ];
    +
    +COPY query
    +    TO { 'filename' | STDOUT }
    +    [ WITHOUT ESCAPING ]
    +    [ [ WITH ] ( option [, ...] ) ]
    +    | copy_option
    +    | FIXED FORMATTER ( { column_name( offset, length ) } [, ...] ) [ ( option [, ...] ) | copy_option [  ...] ] ];
    +
    + +
    +
    1. The syntax constraints of COPY TO are as follows:

      (query) is incompatible with [USING] DELIMITER. If the data of COPY TO comes from a query result, COPY TO cannot specify [USING] DELIMITERS.

      +
    2. Use spaces to separate copy_option following FIXED FORMATTER.
    3. copy_option is the native parameter, while option is the parameter imported by a compatible foreign table.
    4. In the SQL syntax, FIXED, FORMATTER ( { column_name( offset, length ) } [, ...] ), and [ ( option [, ...] ) | copy_option [ ...] ] can be in any sequence.
    +
    +
    The syntax of the optional parameter option is as follows:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    FORMAT 'format_name'
    +| OIDS [ boolean ]
    +| DELIMITER 'delimiter_character'
    +| NULL 'null_string'
    +| HEADER [ boolean ]
    +| FILEHEADER 'header_file_string'
    +| FREEZE [ boolean ]
    +| QUOTE 'quote_character'
    +| ESCAPE 'escape_character'
    +| EOL 'newline_character'
    +| NOESCAPING [ boolean ]
    +| FORCE_QUOTE { ( column_name [, ...] ) | * }
    +| FORCE_NOT_NULL ( column_name [, ...] )
    +| ENCODING 'encoding_name'
    +| IGNORE_EXTRA_DATA [ boolean ]
    +| FILL_MISSING_FIELDS [ boolean ]
    +| COMPATIBLE_ILLEGAL_CHARS [ boolean ]
    +| DATE_FORMAT 'date_format_string'
    +| TIME_FORMAT 'time_format_string'
    +| TIMESTAMP_FORMAT 'timestamp_format_string'
    +| SMALLDATETIME_FORMAT 'smalldatetime_format_string'
    +
    + +
    +
    +
    The syntax of optional parameter in the copy_option is as follows:
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    OIDS 
    +| NULL 'null_string' 
    +| HEADER 
    +| FILEHEADER 'header_file_string' 
    +| FREEZE 
    +| FORCE_NOT_NULL column_name [, ...]
    +| FORCE_QUOTE { column_name [, ...] | * }
    +| BINARY 
    +| CSV 
    +| QUOTE [ AS ] 'quote_character' 
    +| ESCAPE [ AS ] 'escape_character' 
    +| EOL 'newline_character'
    +| ENCODING 'encoding_name' 
    +| IGNORE_EXTRA_DATA 
    +| FILL_MISSING_FIELDS
    +| COMPATIBLE_ILLEGAL_CHARS 
    +| DATE_FORMAT 'date_format_string' 
    +| TIME_FORMAT 'time_format_string' 
    +| TIMESTAMP_FORMAT 'timestamp_format_string' 
    +| SMALLDATETIME_FORMAT 'smalldatetime_format_string'
    +
    + +
    +
    +
+
+

Parameter Description

  • query

    Indicates that the results are to be copied.

    +

    Value range: a SELECT or VALUES command in parentheses

    +
  • table_name

    Specifies the name (optionally schema-qualified) of an existing table.

    +

    Value range: an existing table name

    +
  • column_name

    Indicates an optional list of columns to be copied.

    +

    Value range: If no column list is specified, all columns of the table will be copied.

    +
  • STDIN

    Indicates that the input comes from the client application.

    +
  • STDOUT

    Indicates that output goes to the client application.

    +
  • FIXED

    Fixes column length. When the column length is fixed, DELIMITER, NULL, and CSV cannot be specified. When FIXED is specified, BINARY, CSV, and TEXT cannot be specified by option or copy_option.

    +

    The definition of fixed length:

    +
    1. The column length of each record is the same.
    2. Spaces are added to short columns. Digit type columns must be left-aligned, and character columns must be right-aligned.
    3. No delimiters are used between columns.
    +
    +
  • [USING] DELIMITER 'delimiters'

    The string that separates columns within each row (line) of the file, and it cannot be larger than 10 bytes.

    +

    Value range: The delimiter cannot include any of the following characters: \.abcdefghijklmnopqrstuvwxyz0123456789

    +

    Value range: The default value is a tab character in text format and a comma in CSV format.

    +
  • WITHOUT ESCAPING

    In TEXT, do not escape a backslash (\) and the characters that follow it.

    +

    Value range: text only.

    +
  • LOG ERRORS

    If this parameter is specified, the error tolerance mechanism for data type errors in the COPY FROM statement is enabled. Row errors are recorded in the public.pgxc_copy_error_log table in the database for future reference.

    +

    Value range: A value set while data is imported using COPY FROM.

    +

    The restrictions of this error tolerance parameter are as follows:

    +
    • This error tolerance mechanism captures only the data type errors (DATA_EXCEPTION) that occur during data parsing of COPY FROM on a CN. Other errors, such as network errors between CNs and DNs or expression conversion errors on DNs, are not captured.
    • Before enabling error tolerance for COPY FROM for the first time in a database, check whether the public.pgxc_copy_error_log table exists. If it does not, call the copy_error_log_create() function to create it. If it does, copy its data elsewhere and call the copy_error_log_create() function to create the table. For details about columns in the public.pgxc_copy_error_log table, see Table 1.
    • While a COPY FROM statement with specified LOG ERRORS is being executed, if public.pgxc_copy_error_log does not exist or does not have the table definitions compliant with the predefined in copy_error_log_create(), an error will be reported. Ensure that the error table is created using the copy_error_log_create() function. Otherwise, COPY FROM statements with error tolerance may fail to be run.
    • If existing error tolerance parameters (for example, IGNORE_EXTRA_DATA) of the COPY statement are enabled, the error of the corresponding type will be processed as specified by the parameters and no error will be reported. Therefore, the error table does not contain such error data.
    • The coverage scope of this error tolerance mechanism is the same as that of a GDS foreign table. You are advised to filter query results based on table names or the timestamp of marking the start of COPY FROM statement execution. For details about how to process error data, see the section about handling error tables.
    +
    +
  • LOG ERRORS DATA

    The differences between LOG ERRORS DATA and LOG ERRORS are as follows:

    +
    1. LOG ERRORS DATA fills the rawrecord field in the error tolerance table.
    2. Only users with the super permission can use the LOG ERRORS DATA parameter.

      If error content is too complex, it may fail to be written to the error tolerance table by using LOG ERRORS DATA, causing the task failure.

      +
      +
    +
  • REJECT LIMIT 'limit'

    Used with the LOG ERROR parameter to set the upper limit of the tolerated errors in the COPY FROM statement. If the number of errors exceeds the limit, later errors will be reported based on the original mechanism.

    +

    Value range: a positive integer (1 to INTMAX) or unlimited

    +

    Default value: If LOG ERRORS is not specified, an error will be reported. If LOG ERRORS is specified, the default value is 0.

    +

    Different from the GDS error tolerance mechanism, in the error tolerance mechanism described in the description of LOG ERRORS, the count of REJECT LIMIT is calculated based on the number of data parsing errors on the CN where the COPY FROM statement is run, not based on the number of errors on each DN.

    +
    +
  • FORMATTER

    Defining the location of each column in the data file in fixed length mode. Defining the place of each column in the data file based on column (offset, length) format.

    +

    Value range:

    +
    • The value of offset must be larger than 0. The unit is byte.
    • The value of length must be larger than 0. The unit is byte.
    +

    The total length of all columns must be less than 1 GB.

    +

    Replace columns that are not in the file with NULL.

    +
  • OPTION { option_name ' value ' }

    Specifies all types of parameters of a compatible foreign table.

    +
    • FORMAT

      Specifies the format of the source data file in the foreign table.

      +

      Value range: CSV, TEXT, FIXED, and BINARY.

      +
      • The CSV file can process newline characters efficiently, but cannot process certain special characters well.
      • The TEXT file can process special characters efficiently, but cannot process newline character well.
      • The FIXED file can process newline characters in data columns efficiently, but cannot process special characters well.
      • All data in the BINARY file is stored/read as binary format rather than as text. It is faster than the text and CSV formats, but a binary-format file is less portable.
      +

      Default value: TEXT

      +
    • OIDS

      Copies the OID for each row.

      +

      An error is raised if OIDs are specified for a table that does not have OIDs, or in the case of copying a query.

      +
      +

      Value range: true, on, false, and off

      +

      Default value: false

      +
    • DELIMITER
      Specifies the character that separates columns within each row (line) of the file.
      • A delimiter cannot be \r or \n.
      • A delimiter cannot be the same as null. The delimiter for CSV cannot be same as quote.
      • The delimiter for the TEXT format data cannot contain lowercase letters, digits, or dot (.).
      • The data length of a single row should be less than 1 GB. If the delimiters are too long and there are too many rows, the length of valid data will be affected.
      • You are advised to use multi-characters and invisible characters for delimiters. For example, you can use multi-characters (such as $^&) and invisible characters (such as 0x07, 0x08, and 0x1b).
      • For a multi-character delimiter, do not use the same characters, for example, ---.
      +
      +
      +

      Value range: multi-character delimiter within 10 bytes.

      +

      Default value:

      +
      • A tab character in TEXT format
      • A comma (,) in CSV format
      • No delimiter in FIXED format
      +
    • NULL

      Specifies the string that represents a null value.

      +

      Value range:

      +
      • The null value cannot be \r or \n. The maximum length is 100 characters.
      • The null value cannot be the same as the delimiter or quote parameter.
      +

      Default value:

      +
      • An empty string without quotation marks in CSV format
      • \N in TEXT format
      +
    • HEADER

      Specifies whether a file contains a header with the names of each column in the file. header is available only for CSV and FIXED files.

      +

      When data is imported, if header is on, the first row of the data file will be identified as title row and ignored. If header is off, the first row is identified as data.

      +

      When data is exported, if header is on, fileheader must be specified. If header is off, the exported file does not include a title row.

      +

      Value range: true, on, false, and off

      +

      Default value: false

      +
    • QUOTE

      Specifies the quote character for a CSV file.

      +

      Default value: double quotation mark ("")

      +
      • The quote parameter cannot be the same as the delimiter or null parameter.
      • The quote parameter must be a single one-byte character.
      • Invisible characters are recommended as quote values, such as 0x07, 0x08, and 0x1b.
      +
      +
    • ESCAPE

      This option is allowed only when using CSV format. This must be a single one-byte character.

      +

      Default value: the same as the value of QUOTE

      +
    • EOL 'newline_character'

      Specifies the newline character style of the imported or exported data file.

      +

      Value range: multi-character newline characters within 10 bytes. Common newline characters include \r (0x0D), \n (0x0A), and \r\n (0x0D0A). Special newline characters include $ and #.

      +
      • The EOL parameter supports only the TEXT format for data import and export and does not support the CSV or FIXED format for data import. For forward compatibility, the EOL parameter can be set to 0x0D or 0x0D0A for data export in the CSV and FIXED formats.
      • The value of the EOL parameter cannot be the same as that of DELIMITER or NULL.
      • The EOL parameter value cannot contain lowercase letters, digits, or dots (.).
      +
      +
    • FORCE_QUOTE { ( column_name [, ...] ) | * }

      Forces quoting to be used for all non-null values in each specified column. This option is allowed only in COPY TO, and only when using the CSV format. NULL values are not quoted.

      +

      Value range: an existing column

      +
    • FORCE_NOT_NULL ( column_name [, ...] )

      Does not match the specified columns' values against the null string. This option is allowed only in COPY FROM, and only when using the CSV format.

      +

      Value range: an existing column

      +
    • ENCODING

      Specifies that the file is encoded in the encoding_name. If this option is omitted, the current encoding format is used by default.

      +
    • IGNORE_EXTRA_DATA

      When the number of data source files exceeds the number of foreign table columns, whether ignoring excessive columns at the end of the row. This parameter is available only during data importing.

      +

      Value range: true/on, false/off.

      +
      • When this parameter is true or on and the number of data source files exceeds the number of foreign table columns, excessive columns will be ignored.
      • If the parameter is set to false or off, and the number of data source files exceeds the number of foreign table columns, the following error information will be displayed:
        1
        extra data after last expected column
        +
        + +
        +
      +

      Default value: false

      +

      If the newline character at the end of the row is lost, setting the parameter to true will ignore data in the next row.

      +
      +
    • COMPATIBLE_ILLEGAL_CHARS

      Enables or disables fault tolerance on invalid characters during importing. This parameter is available only for COPY FROM.

      +

      Value range: true, on, false, and off

      +
      • When the parameter is true or on, invalid characters are tolerated and imported to the database after conversion.
      • If the parameter is false or off, and an error occurs when there are invalid characters, the import will be interrupted.
      +

      Default value: false or off

      +

      The rule of error tolerance when you import invalid characters is as follows:

      +

      (1) \0 is converted to a space.

      +

      (2) Other invalid characters are converted to question marks.

      +

      (3) If compatible_illegal_chars is set to true or on, invalid characters are tolerated. If NULL, DELIMITER, QUOTE, and ESCAPE are set to a spaces or question marks. Errors like "illegal chars conversion may confuse COPY escape 0x20" will be displayed to prompt user to modify parameter values that cause confusion, preventing import errors.

      +
      +
    • FILL_MISSING_FIELD

      Specifies whether to generate an error message when the last column in a row in the source file is lost during data loading.

      +

      Value range: true, on, false, and off

      +

      Default value: false or off

      +
    • DATE_FORMAT

      Imports data of the DATE type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid DATE value. For details, see Date and Time Processing Functions and Operators.

      +

      If ORACLE is specified as the compatible database, the DATE format is TIMESTAMP. For details, see timestamp_format below.

      +
      +
    • TIME_FORMAT

      Imports data of the TIME type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: Valid TIME. Time zones cannot be used. For details, see Date and Time Processing Functions and Operators.

      +
    • TIMESTAMP_FORMAT

      Imports data of the TIMESTAMP type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid TIMESTAMP value. Time zones are not supported. For details, see Date and Time Processing Functions and Operators.

      +
    • SMALLDATETIME_FORMAT

      Imports data of the SMALLDATETIME type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid SMALLDATETIME value. For details, see Date and Time Processing Functions and Operators.

      +
    +
  • COPY_OPTION { option_name ' value ' }

    Specifies all types of native parameters of COPY.

    +
    • OIDS
      Copies the OID for each row.

      An error is raised if OIDs are specified for a table that does not have OIDs, or in the case of copying a query.

      +
      +
      +
    • NULL null_string
      Specifies the string that represents a null value.

      When using COPY FROM, any data item that matches this string will be stored as a NULL value, so you should make sure that you use the same string as you used with COPY TO.

      +
      +
      +

      Value range:

      +
      • The null value cannot be \r or \n. The maximum length is 100 characters.
      • The null value cannot be the same as the delimiter or quote parameter.
      +

      Default value:

      +
      • \N in TEXT format
      • An empty string without quotation marks in CSV format
      +
    • HEADER

      Specifies whether a file contains a header with the names of each column in the file. header is available only for CSV and FIXED files.

      +

      When data is imported, if header is on, the first row of the data file will be identified as title row and ignored. If header is off, the first row is identified as data.

      +

      When data is exported, if header is on, fileheader must be specified. If header is off, the exported file does not include a title row.

      +
    • FILEHEADER

      Specifies a file that defines the content in the header for exported data. The file contains data description of each column.

      +
      • This parameter is available only when header is on or true.
      • fileheader specifies an absolute path.
      • The file can contain only one row of header information, and ends with a linefeed. Excess rows will be discarded. (Header information cannot contain linefeeds.)
      • The length of the file including the linefeed cannot exceed 1 MB.
      +
      +
    • FREEZE

      Sets the COPY loaded data row as frozen, like these data have executed VACUUM FREEZE.

      +

      This is a performance option of initial data loading. The data will be frozen only when the following three requirements are met:

      +
      • The table being loaded has been created or truncated in the current subtransaction before copying.
      • There are no cursors open in the current transaction.
      • There are no original snapshots in the current transaction.
      +

      When COPY is completed, all the other sessions will see the data immediately. This violates the normal rules of MVCC visibility and users should be aware of the potential problems this might cause.

      +
      +
    • FORCE NOT NULL column_name [, ...]

      Does not match the specified columns' values against the null string. This option is allowed only in COPY FROM, and only when using the CSV format.

      +

      Value range: an existing column

      +
    • FORCE QUOTE { column_name [, ...] | * }

      Forces quoting to be used for all non-NULL values in each specified column. This option is allowed only in COPY TO, and only when using the CSV format. NULL values are not quoted.

      +

      Value range: an existing column

      +
    • BINARY

      The binary format option causes all data to be stored/read as binary format rather than as text. In binary mode, you cannot declare DELIMITER, NULL, or CSV. After specifying BINARY, CSV, FIXED and TEXT cannot be specified through option or copy_option.

      +
    • CSV

      Enables the CSV mode. After CSV is specified, BINARY, FIXED and TEXT cannot be specified through option or copy_option.

      +
    • QUOTE [AS] 'quote_character'

      Specifies the quote character for a CSV file.

      +

      Default value: double quotation mark ("")

      +
      • The quote parameter cannot be the same as the delimiter or null parameter.
      • The quote parameter must be a single one-byte character.
      • Invisible characters are recommended as quote values, such as 0x07, 0x08, and 0x1b.
      +
      +
    • ESCAPE [AS] 'escape_character'

      This option is allowed only when using CSV format. This must be a single one-byte character.

      +

      The default value is a double quotation mark ("). If it is the same as the value of quote, it will be replaced with \0.

      +
    • EOL 'newline_character'

      Specifies the newline character style of the imported or exported data file.

      +

      Value range: multi-character newline characters within 10 bytes. Common newline characters include \r (0x0D), \n (0x0A), and \r\n (0x0D0A). Special newline characters include $ and #.

      +
      • The EOL parameter supports only the TEXT format for data import and export. For forward compatibility, the EOL parameter can be set to 0x0D or 0x0D0A for data export in the CSV and FIXED formats.
      • The value of the EOL parameter cannot be the same as that of DELIMITER or NULL.
      • The EOL parameter value cannot contain lowercase letters, digits, or dots (.).
      +
      +
    • ENCODING 'encoding_name'

      Specifies that the file is encoded in the encoding_name.

      +

      Value range: a valid encoding format

      +

      Default value: current encoding format of the database

      +
    • IGNORE_EXTRA_DATA

      When the number of data source files exceeds the number of foreign table columns, excess columns at the end of the row are ignored. This parameter is available only during data importing.

      +
      If you do not use this parameter, and the number of data source files exceeds the number of foreign table columns, the following error information will be displayed:
      1
      extra data after last expected column
      +
      + +
      +
      +
    • COMPATIBLE_ILLEGAL_CHARS

      Specifies error tolerance for invalid characters during importing. Invalid characters are converted before importing. No error message is displayed. The import is not interrupted. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      If you do not use this parameter, an error occurs when there is an invalid character, and the import stops.

      +

      The rule of error tolerance when you import invalid characters is as follows:

      +

      (1) \0 is converted to a space.

      +

      (2) Other invalid characters are converted to question marks.

      +

      (3) Setting compatible_illegal_chars to true/on enables toleration of invalid characters. If NULL, DELIMITER, QUOTE, and ESCAPE are set to spaces or question marks, errors like "illegal chars conversion may confuse COPY escape 0x20" will be displayed to prompt the user to modify parameters that may cause confusion, preventing importing errors.

      +
      +
    • FILL_MISSING_FIELD

      Specifies whether to generate an error message when the last column in a row in the source file is lost during data loading.

      +

      Value range: true, on, false, and off

      +

      Default value: false or off

      +

      Do not specify this option. Currently, it does not enable error tolerance, but will make the parser ignore the said errors during data parsing on the CN. Such errors will not be recorded in the COPY error table (enabled using LOG ERRORS REJECT LIMIT) but will be reported later by DNs.

      +
      +
    • DATE_FORMAT 'date_format_string'

      Imports data of the DATE type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid DATE value. For details, see Date and Time Processing Functions and Operators.

      +

      If ORACLE is specified as the compatible database, the DATE format is TIMESTAMP. For details, see timestamp_format below.

      +
      +
    • TIME_FORMAT 'time_format_string'

      Imports data of the TIME type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: Valid TIME. Time zones cannot be used. For details, see Date and Time Processing Functions and Operators.

      +
    • TIMESTAMP_FORMAT 'timestamp_format_string'

      Specifies the TIMESTAMP format for data import. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid TIMESTAMP value. Time zones are not supported. For details, see Date and Time Processing Functions and Operators.

      +
    • SMALLDATETIME_FORMAT 'smalldatetime_format_string'

      Imports data of the SMALLDATETIME type. The BINARY format is not supported. When data of such format is imported, error "cannot specify bulkload compatibility options in BINARY mode" will occur. The parameter is valid only for data importing using the COPY FROM option.

      +

      Value range: any valid SMALLDATETIME value. For details, see Date and Time Processing Functions and Operators.

      +
    +

    +
    The following special backslash sequences are recognized by COPY FROM:
    • \b: Backspace (ASCII 8)
    • \f: Form feed (ASCII 12)
    • \n: Newline character (ASCII 10)
    • \r: Carriage return character (ASCII 13)
    • \t: Tab (ASCII 9)
    • \v: Vertical tab (ASCII 11)
    • \digits: Backslash followed by one to three octal digits specifies the ASCII value is the character with that numeric code.
    • \xdigits: Backslash followed by an x and one or two hex digits specifies the character with that numeric code.
    +
    +
+
+

Examples

Copy data from the tpcds.ship_mode file to the /home/omm/ds_ship_mode.dat file.
1
COPY tpcds.ship_mode TO '/home/omm/ds_ship_mode.dat';
+
+ +
+
+
Write tpcds.ship_mode as output to stdout.
1
COPY tpcds.ship_mode TO stdout;
+
+ +
+
+
Create the tpcds.ship_mode_t1 table.
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE TABLE tpcds.ship_mode_t1
+(
+    SM_SHIP_MODE_SK           INTEGER               NOT NULL,
+    SM_SHIP_MODE_ID           CHAR(16)              NOT NULL,
+    SM_TYPE                   CHAR(30)                      ,
+    SM_CODE                   CHAR(10)                      ,
+    SM_CARRIER                CHAR(20)                      ,
+    SM_CONTRACT               CHAR(20)
+)
+WITH (ORIENTATION = COLUMN,COMPRESSION=MIDDLE)
+DISTRIBUTE BY HASH(SM_SHIP_MODE_SK );
+
+ +
+
+
Copy data from stdin to the tpcds.ship_mode_t1 table.
1
COPY tpcds.ship_mode_t1 FROM stdin;
+
+ +
+
+

Copy data from the /home/omm/ds_ship_mode.dat file to the tpcds.ship_mode_t1 table.

+
1
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat';
+
+ +
+

Copy data from the /home/omm/ds_ship_mode.dat file to the tpcds.ship_mode_t1 table, with the import format set to TEXT (format 'text'), the delimiter set to \t' (delimiter E'\t'), excessive columns ignored (ignore_extra_data 'true'), and characters not escaped (noescaping 'true').

+
1
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' WITH(format 'text', delimiter E'\t', ignore_extra_data 'true', noescaping 'true');
+
+ +
+

Copy data from the /home/omm/ds_ship_mode.dat file to the tpcds.ship_mode_t1 table, with the import format set to FIXED, fixed-length format specified (FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20))), excessive columns ignored (ignore_extra_data), and headers included (header).

+
1
COPY tpcds.ship_mode_t1 FROM '/home/omm/ds_ship_mode.dat' FIXED FORMATTER(SM_SHIP_MODE_SK(0, 2), SM_SHIP_MODE_ID(2,16), SM_TYPE(18,30), SM_CODE(50,10), SM_CARRIER(61,20), SM_CONTRACT(82,20)) header ignore_extra_data;
+
+ +
+

Delete the tpcds.ship_mode_t1 table.

+
1
DROP TABLE tpcds.ship_mode_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0231.html b/docs/dws/dev/dws_06_0231.html new file mode 100644 index 00000000..fa82fa22 --- /dev/null +++ b/docs/dws/dev/dws_06_0231.html @@ -0,0 +1,75 @@ + + +

DELETE

+

Function

DELETE deletes rows that satisfy the WHERE clause from the specified table. If the WHERE clause does not exist, all rows in the table will be deleted. The result is a valid, but an empty table.

+
+

Precautions

  • You must have the DELETE permission on the table to delete from it, as well as the SELECT permission for any table in the USING clause or whose values are read in the condition.
  • DELETE can be used for row-store tables if they have primary key constraints or if the execution plan can be pushed down.
  • DELETE can be used for column-store tables only if the execution plan can be pushed down.
  • For column-store tables, the RETURNING clause is currently not supported.
+
+

Syntax

1
+2
+3
+4
+5
[ WITH [ RECURSIVE ] with_query [, ...] ]
+DELETE FROM [ ONLY ] table_name [ * ] [ [ AS ] alias ]
+    [ USING using_list ]
+    [ WHERE condition | WHERE CURRENT OF cursor_name ]
+    [ RETURNING { * | { output_expr [ [ AS ] output_name ] } [, ...] } ];
+
+ +
+
+

Parameter Description

  • WITH [ RECURSIVE ] with_query [, ...]

    The WITH clause allows you to specify one or more subqueries that can be referenced by name in the primary query, equal to temporary table.

    +

    If RECURSIVE is specified, it allows a SELECT subquery to reference itself by name.

    +

    The with_query detailed format is as follows:

    +

    with_query_name [ ( column_name [, ...] ) ] AS

    +

    ( {select | values | insert | update | delete} )

    +

    -- with_query_name specifies the name of the result set generated by a subquery. Such names can be used to access the result sets of

    +

    subqueries in a query.

    +

    column_name specifies the column name displayed in the subquery result set.

    +

    Each subquery can be a SELECT, VALUES, INSERT, UPDATE or DELETE statement.

    +
  • ONLY

    If ONLY is specified, only that table is deleted. If ONLY is not specified, this table and all its sub-tables are deleted.

    +
  • table_name

    Specifies the name (optionally schema-qualified) of a target table.

    +

    Value range: an existing table name

    +
  • alias

    Specifies the alias for the target table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • using_list

    Specifies the USING clause.

    +
  • condition

    Specifies an expression that returns a value of type boolean. Only rows for which this expression returns true will be deleted.

    +
  • WHERE CURRENT OF cursor_name

    Not supported currently. Only syntax interface is provided.

    +
  • output_expr

    Specifies an expression to be computed and returned by the DELETE command after each row is deleted. The expression can use any column names of the table. Write * to return all columns.

    +
  • output_name

    Specifies a name to use for a returned column.

    +

    Value range: a string. It must comply with the naming convention.

    +
+
+

Examples

Create the tpcds.customer_address_bak table.

+
1
CREATE TABLE tpcds.customer_address_bak AS TABLE tpcds.customer_address;
+
+ +
+

Delete employees whose ca_address_sk is less than 14888 in the tpcds.customer_address_bak table.

+
1
DELETE FROM tpcds.customer_address_bak WHERE ca_address_sk < 14888;
+
+ +
+

Delete the employees whose ca_address_sk is 14891, 14893, and 14895 from tpcds.customer_address_bak.

+
1
DELETE FROM tpcds.customer_address_bak WHERE ca_address_sk in (14891,14893,14895);
+
+ +
+

Delete all data in the tpcds.customer_address_bak table.

+
1
DELETE FROM tpcds.customer_address_bak;
+
+ +
+

Use a subquery (to delete the row-store table tpcds.warehouse_t30) to obtain a temporary table temp_t, and then query all data in the temporary table temp_t.

+
1
WITH temp_t AS (DELETE FROM tpcds.warehouse_t30 RETURNING *) SELECT * FROM temp_t ORDER BY 1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0232.html b/docs/dws/dev/dws_06_0232.html new file mode 100644 index 00000000..b255fa38 --- /dev/null +++ b/docs/dws/dev/dws_06_0232.html @@ -0,0 +1,260 @@ + + +

EXPLAIN

+

Function

EXPLAIN shows the execution plan of an SQL statement.

+

The execution plan shows how the tables referenced by the SQL statement will be scanned, for example, by plain sequential scan or index scan. If multiple tables are referenced, the execution plan also shows what join algorithms will be used to bring together the required rows from each input table.

+

The most critical part of the display is the estimated statement execution cost, which is the planner's guess at how long it will take to run the statement.

+

The ANALYZE option causes the statement to be executed, not only planned. Then actual runtime statistics are added to the display, including the total elapsed time expended within each plan node (in milliseconds) and the total number of rows it actually returned. This is useful to check whether the planner's estimates are close to reality.

+
+

Precautions

The statement is executed when the ANALYZE option is used. To use EXPLAIN ANALYZE on an INSERT, UPDATE, DELETE, CREATE TABLE AS, or EXECUTE statement without letting the command affect your data, use this approach:

+
1
+2
+3
START TRANSACTION;
+EXPLAIN ANALYZE ...;
+ROLLBACK;
+
+ +
+
+

Syntax

  • Display the execution plan of an SQL statement, which supports multiple options and has no requirements for the order of options.
    1
    EXPLAIN [ (  option  [, ...] )  ] statement;
    +
    + +
    +

    The syntax of the option clause is as follows:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    ANALYZE [ boolean ] |
    +    ANALYSE [ boolean ] |
    +    VERBOSE [ boolean ] |
    +    COSTS [ boolean ] |
    +    CPU [ boolean ] |
    +    DETAIL [ boolean ] |
    +    NODES [ boolean ] |
    +    NUM_NODES [ boolean ] |
    +    BUFFERS [ boolean ] |
    +    TIMING [ boolean ] |
    +    PLAN [ boolean ] |
    +    FORMAT { TEXT | XML | JSON | YAML }
    +
    + +
    +
  • Display the execution plan of an SQL statement, where options are in order.
    1
    EXPLAIN  { [  { ANALYZE  | ANALYSE  }  ] [ VERBOSE  ]  | PERFORMANCE  } statement;
    +
    + +
    +
  • Display information required for reproducing the execution plan of an SQL statement. The information is usually used for fault locating. The STATS option must be used independently.
    1
    EXPLAIN ( STATS [ boolean ] ) statement;
    +
    + +
    +
+
+

Parameter Description

  • statement

    Specifies the SQL statement to explain.

    +
  • ANALYZE boolean | ANALYSE boolean

    Displays the actual run times and other statistics.

    +

    Valid value:

    +
    • TRUE (default value): Displays the actual run times and other statistics.
    • FALSE: No display.
    +
  • VERBOSE boolean

    Displays additional information regarding the plan.

    +

    Valid value:

    +
    • TRUE (default value): Displays additional information.
    • FALSE: No display.
    +
  • COSTS boolean

    Includes information on the estimated total cost of each plan node, as well as the estimated number of rows and the estimated width of each row.

    +

    Valid value:

    +
    • TRUE (default): Displays information on the estimated total cost of each plan node and the estimated width of each row.
    • FALSE: No display.
    +
  • CPU boolean

    Prints information on CPU usage.

    +

    Valid value:

    +
    • TRUE (default value): Displays CPU usage information.
    • FALSE: No display.
    +
  • DETAIL boolean

    Prints DN information.

    +

    Valid value:

    +
    • TRUE (default value): Prints DN information.
    • FALSE: No display.
    +
  • NODES boolean

    Prints information about the nodes executed by query.

    +

    Valid value:

    +
    • TRUE (default): Prints information about executed nodes.
    • FALSE: No display.
    +
  • NUM_NODES boolean

    Prints the quantity of executing nodes.

    +

    Valid value:

    +
    • TRUE (default value): Prints the number of DNs.
    • FALSE: No display.
    +
  • BUFFERS boolean

    Includes information on buffer usage.

    +

    Valid value:

    +
    • TRUE: Displays information on buffer usage.
    • FALSE (default): No display.
    +
  • TIMING boolean

    Includes the startup time and the time spent on the output node.

    +

    Valid value:

    +
    • TRUE (Default): Displays the startup time and the time spent on the output node.
    • FALSE: No display.
    +
  • PLAN

    Specifies whether to store the execution plan in PLAN_TABLE. If this parameter is set to on, the execution plan is stored in PLAN_TABLE and is not displayed on the screen. Therefore, this parameter cannot be used together with other parameters when it is set to on.

    +

    Valid value:

    +
    • on: The execution plan is stored in PLAN_TABLE and is not printed on the screen. It is the default value. If the plan is stored successfully, EXPLAIN SUCCESS is returned.
    • off: The execution plan is not stored in PLAN_TABLE and is printed on the screen.
    +
  • FORMAT

    Specifies the output format.

    +

    Value range: TEXT, XML, JSON, and YAML.

    +

    Default value: TEXT

    +
  • PERFORMANCE

    This option prints all relevant information in execution.

    +
  • STATS boolean

    Specifies whether to display information required for reproducing the execution plan of an SQL statement, including the object definition, statistics, and configuration parameters. The information is usually used for fault locating.

    +

    Valid value:

    +
    • TRUE (default value): Display information required for reproducing the execution plan of an SQL statement.
    • FALSE: No display.
    +
+
+

Examples

Create the tpcds.customer_address_p1 table.

+
1
CREATE TABLE tpcds.customer_address_p1 AS TABLE tpcds.customer_address;
+
+ +
+

Change the value of explain_perf_mode to normal.

+
1
SET explain_perf_mode=normal;
+
+ +
+

Display an execution plan for simple queries in the table.

+
1
+2
+3
+4
+5
+6
EXPLAIN SELECT * FROM tpcds.customer_address_p1;
+			       QUERY PLAN
+----------------------------------------------------------------------------
+ Data Node Scan on "__REMOTE_FQS_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
+   Node/s: All datanodes
+(2 rows)
+
+ +
+

Generate an execution plan in JSON format (assume explain_perf_mode is set to normal).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
EXPLAIN(FORMAT JSON) SELECT * FROM tpcds.customer_address_p1;
+                    QUERY PLAN
+---------------------------------------------------
+ [                                                +
+   {                                              +
+     "Plan": {                                    +
+       "Node Type": "Data Node Scan",             +
+       "RemoteQuery name": "__REMOTE_FQS_QUERY__",+
+       "Alias": "__REMOTE_FQS_QUERY__",           +
+       "Startup Cost": 0.00,                      +
+       "Total Cost": 0.00,                        +
+       "Plan Rows": 0,                            +
+       "Plan Width": 0,                           +
+       "Nodes": "All datanodes"                   +
+     }                                            +
+   }                                              +
+ ]
+(1 row)
+
+ +
+

If there is an index and we use a query with an indexable WHERE condition, EXPLAIN might show a different pla.

+
1
+2
+3
+4
+5
+6
EXPLAIN SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000;
+                                  QUERY PLAN
+------------------------------------------------------------------------------
+ Data Node Scan on "__REMOTE_LIGHT_QUERY__"  (cost=0.00..0.00 rows=0 width=0)
+   Node/s: datanode2
+(2 rows)
+
+ +
+

Generate an execution plan in YAML format (assume explain_perf_mode is set to normal).

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
EXPLAIN(FORMAT YAML) SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000;
+                   QUERY PLAN
+------------------------------------------------
+ - Plan:                                       +
+     Node Type: "Data Node Scan"               +
+     RemoteQuery name: "__REMOTE_LIGHT_QUERY__"+
+     Alias: "__REMOTE_LIGHT_QUERY__"           +
+     Startup Cost: 0.00                        +
+     Total Cost: 0.00                          +
+     Plan Rows: 0                              +
+     Plan Width: 0                             +
+     Nodes: "datanode2"
+(1 row)
+
+ +
+

Here is an example of an execution plan with cost estimates suppressed.

+
1
+2
+3
+4
+5
+6
EXPLAIN(COSTS FALSE)SELECT * FROM tpcds.customer_address_p1 WHERE ca_address_sk=10000;
+                 QUERY PLAN
+--------------------------------------------
+ Data Node Scan on "__REMOTE_LIGHT_QUERY__"
+   Node/s: datanode2
+(2 rows)
+
+ +
+

Here is an example of an execution plan for a query that uses an aggregate function.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
EXPLAIN SELECT SUM(ca_address_sk) FROM tpcds.customer_address_p1 WHERE ca_address_sk<10000;
+                                      QUERY PLAN                                       
+---------------------------------------------------------------------------------------
+ Aggregate  (cost=18.19..14.32 rows=1 width=4)
+   ->  Streaming (type: GATHER)  (cost=18.19..14.32 rows=3 width=4)
+         Node/s: All datanodes
+         ->  Aggregate  (cost=14.19..14.20 rows=3 width=4)
+               ->  Seq Scan on customer_address_p1  (cost=0.00..14.18 rows=10 width=4)
+                     Filter: (ca_address_sk < 10000)
+(6 rows)
+
+ +
+

-- Delete the tpcds.customer_address_p1 table.

+
1
DROP TABLE tpcds.customer_address_p1;
+
+ +
+
+

Helpful Links

ANALYZE | ANALYSE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0233.html b/docs/dws/dev/dws_06_0233.html new file mode 100644 index 00000000..b433773a --- /dev/null +++ b/docs/dws/dev/dws_06_0233.html @@ -0,0 +1,111 @@ + + +

EXPLAIN PLAN

+

Function

You can run the EXPLAIN PLAN statement to save the information about an execution plan to the PLAN_TABLE table. Different from the EXPLAIN statement, EXPLAIN PLAN only stores plan information and does not print it on the screen.

+
+

Syntax

1
+2
+3
EXPLAIN PLAN
+[ SET STATEMENT_ID = string ]
+FOR statement ;
+
+ +
+
+

Parameter Description

  • PLAN

    Stores plan information in PLAN_TABLE. If the storing is successful, EXPLAIN SUCCESS is returned.

    +
  • STATEMENT_ID
    Tags a query. The tag information will be stored in PLAN_TABLE.

    If the EXPLAIN PLAN statement does not contain SET STATEMENT_ID, the value of STATEMENT_ID is empty by default. In addition, the value of STATEMENT_ID cannot exceed 30 bytes. Otherwise, an error will be reported.

    +
    +
    +
+
+

Precautions

  • EXPLAIN PLAN cannot be executed on DNs.
  • Plan information cannot be collected for SQL statements that failed to be executed.
  • Data in PLAN_TABLE is in a session-level life cycle. Sessions are isolated from users and thereby users can view data of only the current session and current user.
  • PLAN_TABLE cannot be joined with GDS foreign tables.
  • For a query that cannot be pushed down, object information cannot be collected and only such information as REMOTE_QUERY and CTE can be collected. For details, see Example 2.
+
+

Example 1

You can perform the following steps to collect execution plans of SQL statements by running EXPLAIN PLAN:

+
  1. Import TPC-H sample data. For details, see .
  2. Run the EXPLAN PLAN statement.

    After the EXPLAIN PLAN statement is executed, plan information is automatically stored in PLAN_TABLE. INSERT, UPDATE, and ANALYZE cannot be performed on PLAN_TABLE.

    +

    For details about PLAN_TABLE, see the PLAN_TABLE system view.

    +
    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    explain plan set statement_id='TPCH-Q4' for
    +select
    +o_orderpriority,
    +count(*) as order_count
    +from
    +orders
    +where
    +o_orderdate >= '1993-07-01'::date
    +and o_orderdate < '1993-07-01'::date + interval '3 month'
    +and exists (
    +select
    +*
    +from
    +lineitem
    +where
    +l_orderkey = o_orderkey
    +and l_commitdate < l_receiptdate
    +)
    +group by
    +o_orderpriority
    +order by
    +o_orderpriority;
    +
    + +
    +

  3. Query PLAN_TABLE.

    1
    SELECT * FROM PLAN_TABLE;
    +
    + +
    +

    +

  4. Delete data from PLAN_TABLE.

    1
    DELETE FROM PLAN_TABLE WHERE xxx;
    +
    + +
    +

+
+

Example 2

For a query that cannot be pushed down, only such information as REMOTE_QUERY and CTE can be collected from PLAN_TABLE after EXPLAIN PLAN is executed.

+
The optimizer generates a plan for pushing down statements. In this case, only REMOTE_QUERY can be collected.
1
+2
+3
+4
+5
  explain plan set statement_id = 'test remote query' for
+  select
+  current_user
+  from 
+  customer;
+
+ +
+
+
Query PLAN_TABLE.
1
SELECT * FROM PLAN_TABLE;
+
+ +
+
+

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0234.html b/docs/dws/dev/dws_06_0234.html new file mode 100644 index 00000000..b2a4b066 --- /dev/null +++ b/docs/dws/dev/dws_06_0234.html @@ -0,0 +1,281 @@ + + +

LOCK

+

Function

LOCK TABLE obtains a table-level lock.

+

GaussDB(DWS) always tries to select the lock mode with minimum constraints when automatically requesting a lock for a command referenced by a table. Use LOCK if users need a more strict lock mode. For example, suppose an application runs a transaction at the Read Committed isolation level and needs to ensure that data in a table remains stable in the duration of the transaction. To achieve this, you could obtain SHARE lock mode over the table before the query. This will prevent concurrent data changes and ensure subsequent reads of the table see a stable view of committed data. It is because the SHARE lock mode conflicts with the ROW EXCLUSIVE lock acquired by writers, and your LOCK TABLE name IN SHARE MODE statement will wait until any concurrent holders of ROW EXCLUSIVE mode locks commit or roll back. Therefore, once you obtain the lock, there are no uncommitted writes outstanding; furthermore none can begin until you release the lock.

+
+

Precautions

  • LOCK TABLE is useless outside a transaction block: the lock would remain held only to the completion of the statement. If LOCK TABLE is out of any transaction block, an error is reported.
  • If no lock mode is specified, then ACCESS EXCLUSIVE, the most restrictive mode, is used.
  • LOCK TABLE ... IN ACCESS SHARE MODE requires the SELECT permission on the target table. All other forms of LOCK require table-level UPDATE and/or the DELETE permission.
  • There is no UNLOCK TABLE command. Locks are always released at transaction end.
  • LOCK TABLE only deals with table-level locks, and so the mode names involving ROW are all misnomers. These mode names should generally be read as indicating the intention of the user to acquire row-level locks within the locked table. Also, ROW EXCLUSIVE mode is a shareable table lock. Keep in mind that all the lock modes have identical semantics so far as LOCK TABLE is concerned, differing only in the rules about which modes conflict with which. For details about the rules, see Table 1.
+
+

Syntax

1
+2
+3
LOCK [ TABLE ] {[ ONLY ] name [, ...]| {name [ * ]} [, ...]}
+    [ IN {ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE} MODE ]
+    [ NOWAIT ];
+
+ +
+
+

Parameter Description

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Table 1 Lock mode conflicts

Requested Lock Mode/Current Lock Mode

+

ACCESS SHARE

+

ROW SHARE

+

ROW EXCLUSIVE

+

SHARE UPDATE EXCLUSIVE

+

SHARE

+

SHARE ROW EXCLUSIVE

+

EXCLUSIVE

+

ACCESS EXCLUSIVE

+

ACCESS SHARE

+

-

+

-

+

-

+

-

+

-

+

-

+

-

+

X

+

ROW SHARE

+

-

+

-

+

-

+

-

+

-

+

-

+

X

+

X

+

ROW EXCLUSIVE

+

-

+

-

+

-

+

-

+

X

+

X

+

X

+

X

+

SHARE UPDATE EXCLUSIVE

+

-

+

-

+

-

+

X

+

X

+

X

+

X

+

X

+

SHARE

+

-

+

-

+

X

+

X

+

-

+

X

+

X

+

X

+

SHARE ROW EXCLUSIVE

+

-

+

-

+

X

+

X

+

X

+

X

+

X

+

X

+

EXCLUSIVE

+

-

+

X

+

X

+

X

+

X

+

X

+

X

+

X

+

ACCESS EXCLUSIVE

+

X

+

X

+

X

+

X

+

X

+

X

+

X

+

X

+
+
+

LOCK parameters are as follows:

+
  • name

    The name (optionally schema-qualified) of an existing table to lock.

    +

    The tables are locked one-by-one in the order specified in the LOCK TABLE command.

    +

    Value range: an existing table name

    +
  • ONLY

    Only locks only this table. If Only is not specified, this table and all its sub-tables are locked.

    +
  • ACCESS SHARE

    ACCESS SHARE allows only read operations on a table. In general, any SQL statements that only read a table and do not modify it will acquire this lock mode. The SELECT command acquires a lock of this mode on referenced tables.

    +
  • ROW SHARE

    ROW SHARE allows concurrent read of a table but does not allow any other operations on the table.

    +

    SELECT FOR UPDATE and SELECT FOR SHARE automatically acquire the ROW SHARE lock on the target table and add the ACCESS SHARE lock to other referenced tables except FOR SHARE and FOR UPDATE.

    +
  • ROW EXCLUSIVE

    Like ROW SHARE, ROW EXCLUSIVE allows concurrent read of a table but does not allow modification of data in the table. UPDATE, DELETE, and INSERT automatically acquire the ROW SHARE lock on the target table and add the ACCESS SHARE lock to other referenced tables. Generally, all commands that modify table data acquire the ROW EXCLUSIVE lock for tables.

    +
  • SHARE UPDATE EXCLUSIVE

    This mode protects a table against concurrent schema changes and VACUUM runs.

    +

    Acquired by VACUUM (without FULL), ANALYZE, CREATE INDEX CONCURRENTLY, and some forms of ALTER TABLE.

    +
  • SHARE

    SHARE allows concurrent queries of a table but does not allow modification of the table.

    +

    Acquired by CREATE INDEX (without CONCURRENTLY).

    +
  • SHARE ROW EXCLUSIVE

    SHARE ROW EXCLUSIVE protects a table against concurrent data changes, and is self-exclusive so that only one session can hold it at a time.

    +

    No SQL statements automatically acquire this lock mode.

    +
  • EXCLUSIVE

    EXCLUSIVE allows concurrent queries of the target table but does not allow any other operations.

    +

    This mode allows only concurrent ACCESS SHARE locks; that is, only reads from the table can proceed in parallel with a transaction holding this lock mode.

    +

    No SQL statements automatically acquire this lock mode on user tables. However, it will be acquired on some system tables in case of some operations.

    +
  • ACCESS EXCLUSIVE

    This mode guarantees that the holder is the only transaction accessing the table in any way.

    +

    Acquired by the ALTER TABLE, DROP TABLE, TRUNCATE, REINDEX, CLUSTER, and VACUUM FULL commands.

    +

    This is also the default lock mode for LOCK TABLE statements that do not specify a mode explicitly.

    +
  • NOWAIT

    Specifies that LOCK TABLE should not wait for any conflicting locks to be released: if the specified lock(s) cannot be acquired immediately without waiting, the transaction is aborted.

    +

    If NOWAIT is not specified, LOCK TABLE obtains a table-level lock, waiting if necessary for any conflicting locks to be released.

    +
+
+

Examples

Obtain a SHARE lock on a primary key table when going to perform inserts into a foreign key table.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
START TRANSACTION;
+
+LOCK TABLE tpcds.reason IN SHARE MODE;
+
+SELECT r_reason_desc FROM tpcds.reason WHERE r_reason_sk=5;
+r_reason_desc
+-----------
+ Parts missing
+(1 row)
+
+COMMIT;
+
+ +
+

Obtain a SHARE ROW EXCLUSIVE lock on a primary key table when going to perform a delete operation.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
CREATE TABLE tpcds.reason_t1 AS TABLE tpcds.reason;
+
+START TRANSACTION;
+
+LOCK TABLE tpcds.reason_t1 IN SHARE ROW EXCLUSIVE MODE;
+
+DELETE FROM tpcds.reason_t1 WHERE r_reason_desc IN(SELECT r_reason_desc FROM tpcds.reason_t1 WHERE r_reason_sk < 6 );
+
+DELETE FROM tpcds.reason_t1 WHERE r_reason_sk = 7;
+
+COMMIT;
+
+ +
+

Delete the tpcds.reason_t1 table.

+
1
DROP TABLE tpcds.reason_t1;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0235.html b/docs/dws/dev/dws_06_0235.html new file mode 100644 index 00000000..6a4c2f5c --- /dev/null +++ b/docs/dws/dev/dws_06_0235.html @@ -0,0 +1,163 @@ + + +

MERGE INTO

+

Function

The MERGE INTO statement is used to conditionally match data in a target table with that in a source table. If data matches, UPDATE is executed on the target table; if data does not match, INSERT is executed. You can use this syntax to run UPDATE and INSERT at a time for convenience.

+
+

Precautions

  • To run MERGE INTO, you must have the UPDATE and INSERT permissions for the target table, as well as the SELECT permission for the source table.
  • PREPARE is not supported.
  • MERGE INTO cannot be executed during redistribution.
  • MERGE INTO cannot be executed for target tables that contain triggers.
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
MERGE INTO table_name [ [ AS ] alias ]
+USING { { table_name | view_name } | subquery } [ [ AS ] alias ]
+ON ( condition )
+[
+  WHEN MATCHED THEN
+  UPDATE SET { column_name = { expression | DEFAULT } |
+          ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...]
+  [ WHERE condition ]
+]
+[
+  WHEN NOT MATCHED THEN
+  INSERT { DEFAULT VALUES |
+  [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] }
+];
+
+ +
+
+

Parameter Description

  • INTO clause

    Specifies the target table that is being updated or has data being inserted. It cannot be a replication table.

    +
    • talbe_name

      Specifies the name of the target table.

      +
    • alias

      Specifies the alias of the target table.

      +

      Value range: a string. It must comply with the naming convention.

      +
    +
  • USING clause

    Specifies the source table, which can be a table, view, or subquery.

    +
  • ON clause

    Specifies the condition used to match data between the source and target tables. Columns in the condition cannot be updated.

    +
  • WHEN MATCHED clause

    Performs the UPDATE operation if data in the source table matches that in the target table based on the condition.

    +

    Distribution keys cannot be updated. System catalogs and system columns cannot be updated.

    +
  • WHEN NOT MATCHED clause

    Specifies that the INSERT operation is performed if data in the source table does not match that in the target table based on the condition.

    +

    The INSERT clause is not allowed to contain multiple VALUES.

    +

    The order of WHEN MATCHED and WHEN NOT MATCHED clauses can be reversed. One of them can be used by default, but they cannot be both used at one time. Two WHEN MATCHED or WHEN NOT MATCHED clauses cannot be specified at the same time.

    +
  • DEFAULT

    Specifies the default value of a column.

    +

    It will be NULL if no specific default value has been assigned to it.

    +
  • WHERE condition

    Specifies the conditions for the UPDATE and INSERT clauses. The two clauses will be executed only when the conditions are met. The default value can be used. System columns cannot be referenced in WHERE condition.

    +
+
+

Examples

Create the target table products and source table newproducts, and insert data to them.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
CREATE TABLE products
+(
+product_id INTEGER,
+product_name VARCHAR2(60),
+category VARCHAR2(60)
+);
+
+INSERT INTO products VALUES (1501, 'vivitar 35mm', 'electrncs');
+INSERT INTO products VALUES (1502, 'olympus is50', 'electrncs');
+INSERT INTO products VALUES (1600, 'play gym', 'toys');
+INSERT INTO products VALUES (1601, 'lamaze', 'toys');
+INSERT INTO products VALUES (1666, 'harry potter', 'dvd');
+
+CREATE TABLE newproducts
+(
+product_id INTEGER,
+product_name VARCHAR2(60),
+category VARCHAR2(60)
+);
+
+INSERT INTO newproducts VALUES (1502, 'olympus camera', 'electrncs');
+INSERT INTO newproducts VALUES (1601, 'lamaze', 'toys');
+INSERT INTO newproducts VALUES (1666, 'harry potter', 'toys');
+INSERT INTO newproducts VALUES (1700, 'wait interface', 'books');
+
+ +
+

Run MERGE INTO.

+
1
+2
+3
+4
+5
+6
+7
+8
MERGE INTO products p   
+USING newproducts np   
+ON (p.product_id = np.product_id)   
+WHEN MATCHED THEN  
+  UPDATE SET p.product_name = np.product_name, p.category = np.category WHERE p.product_name != 'play gym'  
+WHEN NOT MATCHED THEN  
+  INSERT VALUES (np.product_id, np.product_name, np.category) WHERE np.category = 'books';
+MERGE 4
+
+ +
+

Query updates.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
SELECT * FROM products ORDER BY product_id;
+ product_id |  product_name  | category  
+------------+----------------+-----------
+       1501 | vivitar 35mm   | electrncs
+       1502 | olympus camera | electrncs
+       1600 | play gym       | toys
+       1601 | lamaze         | toys
+       1666 | harry potter   | toys
+       1700 | wait interface | books
+(6 rows)
+
+ +
+

Delete a table.

+
1
+2
DROP TABLE products;
+DROP TABLE newproducts;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0236.html b/docs/dws/dev/dws_06_0236.html new file mode 100644 index 00000000..ea179c50 --- /dev/null +++ b/docs/dws/dev/dws_06_0236.html @@ -0,0 +1,228 @@ + + +

INSERT

+

Function

INSERT inserts new rows into a table.

+
+

Precautions

  • You must have the INSERT permission on a table in order to insert into it.
  • Use of the RETURNING clause requires the SELECT permission on all columns mentioned in RETURNING.
  • If you use the query clause to insert rows from a query, you of course need to have the SELECT permission on any table or column used in the query.
  • If you use the OVERWRITE clause to insert, you must have the SELECT and TRUNCATE permissions on the table.
  • When you connect to a database compatible to Teradata and td_compatible_truncation is on, a long character string will be automatically truncated. If later INSERT statements (not involving foreign tables) insert long strings to columns of char- and varchar-typed columns in the target table, the system will truncate the long strings to ensure no strings exceed the maximum length defined in the target table.

    If inserting multi-byte character data (such as Chinese characters) to database with the character set byte encoding (SQL_ASCII, LATIN1), and the character data crosses the truncation position, the string is truncated based on its bytes instead of characters. Unexpected result will occur in tail after the truncation. If you want correct truncation result, you are advised to adopt encoding set such as UTF8, which has no character data crossing the truncation position.

    +
    +
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
[ WITH [ RECURSIVE ] with_query [, ...] ]
+INSERT [ IGNORE | OVERWRITE ] INTO table_name [ AS alias ] [ ( column_name [, ...] ) ]
+    { DEFAULT VALUES
+    | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] 
+    | query }
+    [ ON DUPLICATE KEY duplicate_action | ON CONFLICT [ conflict_target ] conflict_action ]
+    [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ];
+
+where duplicate_action can be:
+
+    UPDATE { column_name = { expression | DEFAULT } |
+             ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] )
+           } [, ...]
+
+and conflict_target can be one of:
+
+    ( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ opclass ] [, ...] ) [ WHERE index_predicate ]
+    ON CONSTRAINT constraint_name
+
+and conflict_action is one of:
+
+    DO NOTHING
+    DO UPDATE SET { column_name = { expression | DEFAULT } |
+                    ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] )
+                  } [, ...]
+              [ WHERE condition ]
+
+ +
+
+

Parameter Description

  • WITH [ RECURSIVE ] with_query [, ...]

    The WITH clause allows you to specify one or more subqueries that can be referenced by name in the primary query, equal to temporary table.

    +

    If RECURSIVE is specified, it allows a SELECT subquery to reference itself by name.

    +

    The detailed format of with_query is as follows: with_query_name [ (column_name [,...]) ] AS

    +

    ( {select | values | insert | update | delete} )

    +

    -- with_query_name specifies the name of the result set generated by a subquery. Such names can be used to access the result sets of

    +

    subqueries in a query.

    +

    column_name specifies the column name displayed in the subquery result set.

    +

    Each subquery can be a SELECT, VALUES, INSERT, UPDATE or DELETE statement.

    +
  • IGNORE

    Specifies that the data that duplicates an existing primary key or unique key value will be ignored.

    +

    For details, see UPSERT.

    +
  • OVERWRITE

    Specifies the overwrite mode. After this mode is used, the original data is cleared and only the newly inserted data exists.

    +

    You can specify the columns on which OVERWRITE takes effect, and the other columns will keep their original data. If a column has no original data, its value is NULL.

    +
    • Do not perform OVERWRITE and INSERT INTO operations at the same time. Otherwise, data written in real time may be unexpectedly cleared.
    • OVERWRITE applies to the scenario where a large amount of data is imported. You are not advised to use OVERWRITE to insert a small amount of data.
    • Do not concurrently perform insert overwrite operations on the same table. Otherwise, an error similar to "tuple concurrently updated." will be reported.
    • If the cluster is being scaled out and data redistribution is required for the table where INSERT OVERWRITE is performed, INSERT OVERWRITE clears the current data and automatically distributes the inserted data to the new nodes after scale-out. If INSERT OVERWRITE and the data redistribution of the table are performed at the same time, INSERT OVERWRITE will interrupt the data redistribution of the table.
    +
    +
  • table_name

    Specifies the name of the target table.

    +

    Value range: an existing table name

    +
  • AS

    Specifies an alias for the target table table_name. alias indicates the alias name.

    +
  • column_name

    Specifies the name of a column in a table.

    +
    • The column name can be qualified with a subfield name or array subscript, if needed.
    • Each column not present in the explicit or implicit column list will be filled with a default value, either its declared default value or NULL if there is none. (Inserting into only some fields of a composite column leaves the other fields NULL.)
    • The target column names column_name can be listed in any order. If no list of column names is given at all, the default is all the columns of the table in their declared order.
    • The target columns are the first N column names, if there are only N columns supplied by the value clause or query.
    • The values supplied by the value clause or query are associated with the explicit or implicit column list left-to-right.
    +

    Value range: an existing column name

    +
  • expression

    Specifies an expression or a value to assign to the corresponding column.

    +
    • If single-quotation marks are inserted in a column, the single-quotation marks need to be used for escape.
    • If the expression for any column is not of the correct data type, automatic type conversion will be attempted. If the attempt fails, data insertion fails and the system returns an error message.
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    create table tt01 (id int,content varchar(50));
    +NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.
    +HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    +CREATE TABLE
    +insert into tt01 values (1,'Jack say ''hello''');
    +INSERT 0 1
    +insert into tt01 values (2,'Rose do 50%');
    +INSERT 0 1
    +insert into tt01 values (3,'Lilei say ''world''');
    +INSERT 0 1
    +insert into tt01 values (4,'Hanmei do 100%');
    +INSERT 0 1
    +select * from tt01;
    + id |      content
    +----+-------------------
    +  3 | Lilei say 'world'
    +  4 | Hanmei do 100%
    +  1 | Jack say 'hello'
    +  2 | Rose do 50%
    +(4 rows)
    +drop table tt01;
    +DROP TABLE
    +
    + +
    +
  • DEFAULT

    All columns will be filled with their default values. The value is NULL if no specified default value has been assigned to it.

    +
  • query

    Specifies a query statement (SELECT statement) that uses the query result as the inserted data.

    +
  • ON DUPLICATE KEY

    Specifies that the data that duplicates an existing primary key or unique key value will be updated.

    +

    duplicate_action specifies the columns and data to be updated.

    +

    For details, see UPSERT.

    +
  • ON CONFLICT

    Specifies that the data that duplicates an existing primary key or unique key value will be ignored or updated.

    +

    conflict_target specifies the column name index_column_name, expression index_expression that contains multiple column names, or constraint name constraint_name. It is used to infer whether there is a unique index from the column name, the expression that contains multiple column names, or the constraint name. index_column_name and index_expression must comply with the index column format of CREATE INDEX.

    +

    conflict_action specifies the policy to be executed upon a primary key or unique constraint conflict. There are two available actions:

    +
    • DO NOTHING: Ignore the conflict.
    • DO UPDATE SET: Update data upon a conflict. The columns and data to be updated must be specified.
    +

    For details, see UPSERT.

    +
  • RETURNING

    Returns the inserted rows. The syntax of the RETURNING list is identical to that of the output list of SELECT.

    +
  • output_expression

    An expression used to calculate the output of the INSERT command after each row is inserted.

    +

    Value range: The expression can use any field in the table. Write * to return all columns of the inserted row(s).

    +
  • output_name

    A name to use for a returned column.

    +

    Value range: a string. It must comply with the naming convention.

    +
+
+

Examples

Create the reason_t1 table.

+
1
+2
+3
+4
+5
+6
CREATE TABLE reason_t1
+(
+    TABLE_SK          INTEGER               ,
+    TABLE_ID          VARCHAR(20)           ,
+    TABLE_NA          VARCHAR(20)
+);
+
+ +
+

Insert a record into a table.

+
1
INSERT INTO reason_t1(TABLE_SK, TABLE_ID, TABLE_NA) VALUES (1, 'S01', 'StudentA');
+
+ +
+

Insert a record into a table. This command is equivalent to the last one.

+
1
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA');
+
+ +
+

Insert records whose TABLE_SK is less than 1 into the table.

+
1
INSERT INTO reason_t1 SELECT * FROM reason_t1 WHERE TABLE_SK < 1;
+
+ +
+

Insert records into the table.

+
1
+2
+3
+4
+5
+6
+7
+8
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB');
+SELECT * FROM reason_t1 ORDER BY 1;
+ TABLE_SK | TABLE_ID | TABLE_NAME
+----------+----------+------------
+        1 |      S01 |   StudentA
+        2 |      T01 |   TeacherA
+        3 |      T02 |   TeacherB
+(3 rows)
+
+ +
+

Clear existing data in the table and insert data to the table.

+
1
+2
+3
+4
+5
+6
INSERT OVERWRITE INTO reason_t1 values (4, 'S02', 'StudentB');
+SELECT * FROM reason_t1 ORDER BY 1;
+ TABLE_SK | TABLE_ID | TABLE_NAME
+----------+----------+------------
+        4 |      S02 |   StudentB
+(1 rows)
+
+ +
+

Insert data back into the reason_t1 table.

+
INSERT INTO reason_t1 SELECT * FROM reason_t1;
+

Specify default values for independent columns.

+
INSERT INTO reason_t1 VALUES (5, 'S03', DEFAULT);
+

Insert some data in a table to another table: Use the WITH subquery to obtain a temporary table temp_t, and then insert all data in temp_t to another table reason_t1.

+
WITH temp_t AS (SELECT * FROM reason_t1) INSERT INTO reason_t1 SELECT * FROM temp_t ORDER BY 1;
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0237.html b/docs/dws/dev/dws_06_0237.html new file mode 100644 index 00000000..b329fb25 --- /dev/null +++ b/docs/dws/dev/dws_06_0237.html @@ -0,0 +1,282 @@ + + +

UPSERT

+

Function

UPSERT inserts rows into a table. When a row duplicates an existing primary key or unique key value, the row will be ignored or updated.

+

The UPSERT syntax is supported only in 8.1.1 and later.

+
+
+

Syntax

For details, see Syntax of INSERT. The following table describes the syntax of UPSERT.

+ +
+ + + + + + + + + + + + + +
Table 1 UPSERT syntax

Syntax

+

Update Data Upon Conflict

+

Ignore Data Upon Conflict

+

Syntax 1: No index is specified.

+
INSERT INTO ON DUPLICATE KEY UPDATE
+
INSERT IGNORE
+INSERT INTO ON CONFLICT DO NOTHING
+

Syntax 2: The unique key constraint can be inferred from the specified column name or constraint name.

+
INSERT INTO ON CONFLICT(...) DO UPDATE SET
+INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO UPDATE SET
+
INSERT INTO ON CONFLICT(...) DO NOTHING
+INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO NOTHING
+
+
+
+

In syntax 1, no index is specified. The system checks for conflicts on all primary keys or unique indexes. If a conflict exists, the system ignores or updates the corresponding data.

+

In syntax 2, a specified index is used for conflict check. The primary key or unique index is inferred from the column name, the expression that contains column names, or the constraint name specified in the ON CONFLICT clause.

+
  • Unique index inference

    Syntax 2 infers the primary key or unique index by specifying the column name or constraint name. You can specify a single column name or multiple column names by using an expression, for example, (column1, column2, column3).

    +

    collation and opclass can be specified when you create an index. Therefore, you can also specify them after the column name for index inference.

    +

    COLLATE collation specifies the collation of a column, and opclass specifies the name of the operator class. For details, see CREATE INDEX.

    +
    When inferring the unique index from an expression that includes multiple column names, the system checks whether there is a unique index that exactly contains all the column names specified by conflict_target.
    • If collation and opclass are not specified, a match is considered found as long as a column has the same name as the specified single column or multiple columns have the same names as those specified by the column expression (regardless of the values of collation and opclass specified for the index column).
    • If collation and opclass are specified, their values must also match the collation and opclass of the index.
    +
    +
  • UPDATE clause
+

The UPDATE clause can use VALUES(colname) or EXCLUDED.colname to reference inserted data. EXCLUDED indicates the rows that should be excluded due to conflicts. An example is as follows:

+
1
+2
+3
+4
+5
+6
+7
CREATE TABLE t1(id int PRIMARY KEY, a int, b int);
+INSERT INTO t1 VALUES(1,1,1);
+-- Upon a conflicting row, change the value in column a to the value in column a of the target table plus 1, which, in this example, is (1,2,1).
+INSERT INTO t1 VALUES(1,10,20) ON CONFLICT(id) DO UPDATE SET a = a + 1;
+-- EXCLUDED.a is used to reference the value of column a that is originally proposed for insertion. In this example, the value is 10.
+-- Upon a conflicting row, change the value of column a to that of the referenced column plus 1. In this example, the value is updated to (1,11,1).
+INSERT INTO t1 VALUES(1,10,20) ON CONFLICT(id) DO UPDATE SET a = EXCLUDED.a + 1;
+
+ +
+
  • WHERE clause
    • The WHERE clause is used to determine whether a specified condition is met when data conflict occurs. If yes, update the conflict data. Otherwise, ignore it.
    • Only syntax 2 of Update Data Upon Conflict can specify the WHERE clause, that is, INSERT INTO ON CONFLICT(...) DO UPDATE SET WHERE.
    +
+
Note the following when using the syntax:
  • Syntax 1 and syntax 2 described in Table 1 cannot be used together in the same statement.
  • The WITH clause cannot be used at the same time.
  • INSERT OVERWRITE cannot be used at the same time.
  • The UPDATE clause and its WHERE clause do not support subqueries.
  • VALUES(colname) in the UPDATE clause does not support outer nested functions. That is, the usage similar to sqrt(VALUES(colname)) is not supported. To support this function, use the EXCLUDED.colname syntax.
  • INSERT INTO ON CONFLICT(...) DO UPDATE must contain conflict_target. That is, a column or constraint name must be specified.
+
+

Precautions

  • When running UPSERT on a column-store table, you are advised to enable the DELTA table. If the DELTA table is disabled, concurrency will be affected and the space will be incurred.
  • Only users with the INSERT or UPDATE permission on a table can run the UPSERT statement to insert data to or update data in the table.
  • The UPSERT statement of updating data upon conflict can be executed only when the target table contains a primary key or unique index.
  • The UPSERT statement of updating data upon conflict cannot be executed if no unique indexes are available. You can execute the statement only after the indexes are rebuilt.
  • A distributed deadlock may occur, resulting in query hanging.

    For example, multiple UPSERT statements are executed in batches in a transaction or through JDBC (setAutoCommit(false)). Multiple similar tasks are executed at the same time.

    +

    Possible result: The update sequences of different threads may vary depending on nodes. As a result, a deadlock may occur when the same row is concurrently updated.

    +

    Solution:

    +
    1. Decrease the value of the GUC parameter lockwait_timeout. The default value is 20 minutes. A distributed deadlock error will be reported after waiting for the value of lockwait_timeout. You can decrease the value of this parameter to reduce the service waiting time caused by a deadlock.
    2. Ensure that data with the same primary key is imported from only one database to the database. UPSERT statements can be executed concurrently.
    3. Only one UPSERT statement is executed in each transaction. UPSERT statements can be executed concurrently.
    4. Multiple UPSERT statements can be executed in a single thread. UPSERT statements cannot be executed concurrently.
    +

    In the preceding solution, method 1 can only reduce the waiting time but cannot solve the deadlock problem. If there are UPSERT statements in the service, you are advised to decrease the value of this parameter. Methods 2, 3, and 4 can solve the deadlock problem, but method 2 is recommended because its performance is better than another two methods.

    +
    +
  • The distribution column cannot be updated. (Exception: Update is allowed if the distribution key is the same as the updated value.)
    1
    +2
    +3
    CREATE TABLE t1(dist_key int PRIMARY KEY, a int, b int);
    +INSERT INTO t1 VALUES(1,2,3) ON CONFLICT(dist_key) DO UPDATE SET dist_key = EXCLUDED.dist_key, a = EXCLUDED.a + 1;
    +INSERT INTO t1 VALUES(1,2,3) ON CONFLICT(dist_key) DO UPDATE SET dist_key = dist_key, a = EXCLUDED.a + 1;
    +
    + +
    +
  • The UPSERT statement cannot be executed on the target table that contains a trigger (with the INSERT or UPDATE trigger event).
  • The UPSERT statement is not supported for updatable views.
  • The UPDATE clause, the WHERE clause of UPDATE, and the index condition expression should not contain functions that cannot be pushed down.
  • Unique indexes cannot be deferred.
  • The update data upon conflict statement of UPSERT cannot be executed on column-store replication tables.
  • When performing the update operation of UPSERT using INSERT INTO SELECT, pay attention to the query result sequence of SELECT. In a distributed environment, if the ORDER BY statement is not used, the sequence of returned results may be different each time the same SELECT statement is executed. As a result, the execution result of the UPSERT statement does not meet the expectation.
  • Multiple updates are not supported. An error will be reported if the inserted multiple groups of data conflict with each other. (Exception: No error will be reported if the query plan is a PGXC plan.)
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    CREATE TABLE t1(id int PRIMARY KEY, a int, b int);
    +-- Use the stream query plan:
    +EXPLAIN (COSTS OFF) INSERT INTO t1 VALUES(1,2,3),(1,5,6) ON CONFLICT(id) DO UPDATE SET a = EXCLUDED.a + 1;
    +                   QUERY PLAN
    +------------------------------------------------
    +  id |                operation
    + ----+-----------------------------------------
    +   1 | ->  Streaming (type: GATHER)
    +   2 |    ->  Insert on t1
    +   3 |       ->  Streaming(type: REDISTRIBUTE)
    +   4 |          ->  Values Scan on "*VALUES*"
    + Predicate Information (identified by plan id)
    + ---------------------------------------------
    +   2 --Insert on t1
    +         Conflict Resolution: UPDATE
    +         Conflict Arbiter Indexes: t1_pkey
    +   ====== Query Summary =====
    + ------------------------------
    + System available mem: 819200KB
    + Query Max mem: 819200KB
    + Query estimated mem: 3104KB
    +(18 rows)
    +INSERT INTO t1 VALUES(1,2,3),(1,5,6) ON CONFLICT(id) DO UPDATE SET a = EXCLUDED.a + 1;
    +ERROR:  INSERT ON CONFLICT DO UPDATE command cannot affect row a second time
    +HINT:  Ensure that no rows proposed for insertion within the same command have duplicate constrained values.
    +-- Disable the stream plan and generate a PGXC plan:
    +set enable_stream_operator = off;
    +EXPLAIN (COSTS OFF) INSERT INTO t1 VALUES(1,2,3),(1,5,6) ON CONFLICT(id) DO UPDATE SET a = EXCLUDED.a + 1;
    +                  QUERY PLAN
    +-----------------------------------------------
    +  id |            operation
    + ----+----------------------------------
    +   1 | ->  Insert on t1
    +   2 |    ->  Values Scan on "*VALUES*"
    + Predicate Information (identified by plan id)
    + ---------------------------------------------
    +   1 --Insert on t1
    +         Conflict Resolution: UPDATE
    +         Conflict Arbiter Indexes: t1_pkey
    +         Node expr: id
    +(11 rows)
    +INSERT INTO t1 VALUES(1,2,3),(1,5,6) ON CONFLICT(id) DO UPDATE SET a = EXCLUDED.a + 1;
    +INSERT 0 2
    +
    + +
    +
+
+

Examples

Create table reason_t2 and insert data into it.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
CREATE TABLE reason_t2
+(
+  a    int primary key,
+  b    int,
+  c    int
+);
+
+INSERT INTO reason_t2 VALUES (1, 2, 3);
+SELECT * FROM reason_t2 ORDER BY 1;
+ a | b | c
+---+---+---
+ 1 | 2 | 3
+ (1 rows)
+
+ +
+

Insert two data records into the table reason_t2. One data record conflicts and the other does not. Conflicting data is ignored, and non-conflicting data is inserted.

+
1
+2
+3
+4
+5
+6
+7
INSERT INTO reason_t2 VALUES (1, 4, 5),(2, 6, 7) ON CONFLICT(a) DO NOTHING;
+SELECT * FROM reason_t2 ORDER BY 1;
+ a | b | c
+---+---+----
+ 1 | 2 | 3
+ 2 | 6 | 7
+(2 rows)
+
+ +
+

Insert two data records into the table reason_t2. One data record conflicts and the other does not. Conflicting data is updated, and non-conflicting data is inserted.

+
1
+2
+3
+4
+5
+6
+7
+8
INSERT INTO reason_t2 VALUES (1, 4, 5),(3, 8, 9) ON CONFLICT(a) DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;
+SELECT * FROM reason_t2 ORDER BY 1;
+ a | b | c
+---+---+----
+ 1 | 4 | 5
+ 2 | 6 | 7
+ 3 | 8 | 9
+ (3 rows)
+
+ +
+

Filter the updated rows.

+
1
+2
+3
+4
+5
+6
+7
+8
INSERT INTO reason_t2 VALUES (2, 7, 8) ON CONFLICT (a) DO UPDATE SET b = excluded.b, c = excluded.c  WHERE reason_t2.c = 7;
+SELECT * FROM reason_t2 ORDER BY 1;
+ a | b | c
+---+---+---
+ 1 | 4 | 5
+ 2 | 7 | 8
+ 3 | 8 | 9
+(3 rows)
+
+ +
+

Insert data into the table reason_t. Update the conflicting data and adjust the mapping. That is, update column c to column b and column b to column c.

+
1
+2
+3
+4
+5
+6
+7
+8
INSERT INTO reason_t2 VALUES (1, 2, 3) ON CONFLICT (a) DO UPDATE SET b = excluded.c, c = excluded.b;
+SELECT * FROM reason_t2 ORDER BY 1;
+ a | b | c
+---+---+---
+ 1 | 3 | 2
+ 2 | 7 | 8
+ 3 | 8 | 9
+(3 rows)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0238.html b/docs/dws/dev/dws_06_0238.html new file mode 100644 index 00000000..56b2c333 --- /dev/null +++ b/docs/dws/dev/dws_06_0238.html @@ -0,0 +1,597 @@ + + +

SELECT

+

Function

SELECT retrieves data from a table or view.

+

Serving as an overlaid filter for a database table, SELECT using SQL keywords retrieves required data from data tables.

+
+

Precautions

  • Using SELECT can join HDFS and ordinary tables, but cannot join ordinary and GDS foreign tables. That is, a SELECT statement cannot contain both ordinary and GDS foreign tables.
  • The user must have the SELECT permission on every column used in the SELECT command.
+
+
  • UPDATE permission is required when using FOR UPDATE or FOR SHARE.
+

Syntax

  • Querying data
+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
[ WITH [ RECURSIVE ] with_query [, ...] ]
+SELECT [/*+ plan_hint */] [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
+{ * | {expression [ [ AS ] output_name ]} [, ...] }
+[ FROM from_item [, ...] ]
+[ WHERE condition ]
+[ GROUP BY grouping_element [, ...] ]
+[ HAVING condition [, ...] ]
+[ WINDOW {window_name AS ( window_definition )} [, ...] ]
+[ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ]
+[ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ]
+[ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ]
+[ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
+[ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ]} [...] ];
+
+ +
+

In condition and expression, you can use the aliases of expressions in targetlist in compliance with the following rules:

+
  • Reference only in the same level.
  • Only reference aliases in targetlist.
  • Reference a prior expression in a subsequent expression.
  • The volatile function cannot be used.
  • The Window function cannot be used.
  • Do not reference an alias in the join on condition.
  • An error is reported if targetlist contains multiple referenced aliases.
+
+
  • The subquery with_query is as follows:
    1
    +2
    with_query_name [ ( column_name [, ...] ) ]
    +    AS ( {select | values | insert | update | delete} )
    +
    + +
    +
  • The specified query source from_item is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    {[ ONLY ] table_name [ * ] [ partition_clause ] [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    +|( select ) [ AS ] alias [ ( column_alias [, ...] ) ]
    +|with_query_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
    +|function_name ( [ argument [, ...] ] ) [ AS ] alias [ ( column_alias [, ...] | column_definition [, ...] ) ]
    +|function_name ( [ argument [, ...] ] ) AS ( column_definition [, ...] )
    +|from_item [ NATURAL ] join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]}
    +
    + +
    +
  • The group clause is as follows:
    1
    +2
    +3
    +4
    +5
    +6
    ( )
    +| expression
    +| ( expression [, ...] )
    +| ROLLUP ( { expression | ( expression [, ...] ) } [, ...] )
    +| CUBE ( { expression | ( expression [, ...] ) } [, ...] )
    +| GROUPING SETS ( grouping_element [, ...] )
    +
    + +
    +
  • The specified partition partition_clause is as follows:
    1
    +2
    PARTITION { ( partition_name ) | 
    +        FOR (  partition_value [, ...] ) }
    +
    + +
    +

    Partitions can be specified only for ordinary tables.

    +
    +
  • The sorting order nlssort_expression_clause is as follows:
    1
    NLSSORT ( column_name, ' NLS_SORT = { SCHINESE_PINYIN_M | generic_m_ci } ' )
    +
    + +
    +
  • Simplified query syntax, equivalent to select * from table_name.
    1
    TABLE { ONLY {(table_name)| table_name} | table_name [ * ]};
    +
    + +
    +
+
+

Parameter Description

  • WITH [ RECURSIVE ] with_query [, ...]

    The WITH clause allows you to specify one or more subqueries that can be referenced by name in the primary query, equal to temporary table.

    +

    If RECURSIVE is specified, it allows a SELECT subquery to reference itself by name.

    +

    The detailed format of with_query is as follows: with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} )

    +
    • with_query_name specifies the name of the result set generated by a subquery. Such names can be used to access the result sets of subqueries in a query.
    • column_name specifies a column name displayed in the subquery result set.
    • Each subquery can be a SELECT, VALUES, INSERT, UPDATE or DELETE statement.
    +
  • plan_hint clause

    Follows the SELECT keyword in the /*+<Plan hint> */ format. It is used to optimize the plan of a SELECT statement block. For details, see section "Hint-based Tuning."

    +
  • ALL

    Specifies that all rows meeting the requirements are returned. This is the default behavior, so you can omit this keyword.

    +
  • DISTINCT [ ON ( expression [, ...] ) ]

    Removes all duplicate rows from the SELECT result set.

    +

    ON ( expression [, ...] ) is only reserved for the first row among all the rows with the same result calculated using given expressions.

    +

    DISTINCT ON expression is explained with the same rule of ORDER BY. Unless you use ORDER BY to guarantee that the required row appears first, you cannot know what the first row is.

    +
    +
  • SELECT list

    Indicates columns to be queried. Some or all columns (using wildcard character *) can be queried.

    +

    You may use the AS output_name clause to give an alias for an output column. The alias is used for the displaying of the output column.

    +

    Column names may be either of:

    +
    • Manually input column names which are spaced using commas (,).
    • Fields computed in the FROM clause.
    +
  • FROM clause

    Indicates one or more source tables for SELECT.

    +

    The FROM clause can contain the following elements:

    +
    • table_name

      Indicates the name (optionally schema-qualified) of an existing table or view, for example, schema_name.table_name.

      +
    • alias

      Gives a temporary alias to a table to facilitate the quotation by other queries.

      +

      An alias is used for brevity or to eliminate ambiguity for self-joins. When an alias is provided, it completely hides the actual name of the table or function.

      +
    • column_alias

      Specifies the column alias.

      +
    • PARTITION

      Queries data in the specified partition of a partitioned table.

      +
    • partition_name

      Specifies the name of a partition.

      +
    • partition_value

      Specifies the value of the specified partition key. If there are many partition keys, use the PARTITION FOR clause to specify the value of the only partition key you want to use.

      +
    • subquery

      Performs a subquery in the FROM clause. A temporary table is created to save subquery results.

      +
    • with_query_name

      WITH clause can also be the source of FROM clause and can be referenced with the name queried by executing WITH.

      +
    • function_name

      Function name. Function calls can appear in the FROM clause.

      +
    • join_type

      There are five types below:

      +
      • [ INNER ] JOIN

        A JOIN clause combines two FROM items. Use parentheses if necessary to determine the order of nesting. In the absence of parentheses, JOIN nests left-to-right.

        +

        In any case, JOIN binds more tightly than the commas separating FROM items.

        +
      • LEFT [ OUTER ] JOIN

        Returns all rows in the qualified Cartesian product (all combined rows that pass its join condition), and pluses one copy of each row in the left-hand table for which there was no right-hand row that passed the join condition. This left-hand row is extended to the full width of the joined table by inserting NULL values for the right-hand columns. Note that only the JOIN clause's own condition is considered while deciding which rows have matches. Outer conditions are applied afterwards.

        +
      • RIGHT [ OUTER ] JOIN

        Returns all the joined rows, plus one row for each unmatched right-hand row (extended with NULL on the left).

        +

        This is just a notational convenience, since you could convert it to a LEFT OUTER JOIN by switching the left and right inputs.

        +
      • FULL [ OUTER ] JOIN

        Returns all the joined rows, pluses one row for each unmatched left-hand row (extended with NULL on the right), and pluses one row for each unmatched right-hand row (extended with NULL on the left).

        +
      • CROSS JOIN

        CROSS JOIN is equivalent to INNER JOIN ON (TRUE), which means no rows are removed by qualification. These join types are just a notational convenience, since they do nothing you could not do with plain FROM and WHERE.

        +

        For the INNER and OUTER join types, a join condition must be specified, namely exactly one of NATURAL ON, join_condition, or USING (join_column [, ...]). For CROSS JOIN, none of these clauses can appear.

        +
        +
      +

      CROSS JOIN and INNER JOIN produce a simple Cartesian product, the same result as you get from listing the two items at the top level of FROM.

      +
    • ON join_condition

      A join condition to define which rows have matches in joins. Example: ON left_table.a = right_table.a

      +
    • USING(join_column[, ...])

      Abbreviation of ON left_table.a = right_table.a AND left_table.b = right_table.b .... Corresponding columns must have the same name.

      +
    • NATURAL

      NATURAL is a shorthand for a USING list that mentions all columns in the two tables that have the same names.

      +
    • from item

      Specifies the name of the query source object connected.

      +
    +
  • WHERE clause

    The WHERE clause forms an expression for row selection to narrow down the query range of SELECT. The condition is any expression that evaluates to a result of Boolean type. Rows that do not satisfy this condition will be eliminated from the output.

    +

    In the WHERE clause, you can use the operator (+) to convert a table join to an outer join. However, this method is not recommended because it is not the standard SQL syntax and may raise syntax compatibility issues during platform migration. There are many restrictions on using the operator (+):

    +
    1. It can appear only in the WHERE clause.
    2. If a table join has been specified in the FROM clause, the operator (+) cannot be used in the WHERE clause.
    3. The operator (+) can work only on columns of tables or views, instead of on expressions.
    4. If table A and table B have multiple join conditions, the operator (+) must be specified in all the conditions. Otherwise, the operator (+) will not take effect, and the table join will be converted into an inner join without any prompt information.
    5. Tables specified in a join condition where the operator (+) works cannot cross queries or subqueries. If tables where the operator (+) works are not in the FROM clause of the current query or subquery, an error will be reported. If a peer table for the operator (+) does not exist, no error will be reported and the table join will be converted into an inner join.
    6. Expressions where the operator (+) is used cannot be directly connected through OR.
    7. If a column where the operator (+) works is compared with a constant, the expression becomes a part of the join condition.
    8. A table cannot have multiple foreign tables.
    9. The operator (+) can appear only in the following expressions: comparison, NOT, ANY, ALL, IN, NULLIF, IS DISTINCT FROM, and IS OF expressions. It is not allowed in other types of expressions. In addition, these expressions cannot be connected through AND or OR.
    10. The operator (+) can be used to convert a table join only to a left or right outer join, instead of a full join. That is, the operator (+) cannot be specified on both tables of an expression.
    +

    For the WHERE clause, if a special character % _ or \ is queried in LIKE, add the slash (\) before each character.

    +
    +

    Example:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    create table tt01 (id int,content varchar(50));
    +NOTICE:  The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.
    +HINT:  Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
    +CREATE TABLE
    +insert into tt01 values (1,'Jack say ''hello''');
    +INSERT 0 1
    +insert into tt01 values (2,'Rose do 50%');
    +INSERT 0 1
    +insert into tt01 values (3,'Lilei say ''world''');
    +INSERT 0 1
    +insert into tt01 values (4,'Hanmei do 100%');
    +INSERT 0 1
    +select * from tt01;
    + id |      content
    +----+-------------------
    +  3 | Lilei say 'world'
    +  4 | Hanmei do 100%
    +  1 | Jack say 'hello'
    +  2 | Rose do 50%
    +(4 rows)
    +
    +select * from tt01 where content like '%''he%';
    + id |     content
    +----+------------------
    +  1 | Jack say 'hello'
    +(1 row)
    +
    +select * from tt01 where content like '%50\%%';
    + id |   content
    +----+-------------
    +  2 | Rose do 50%
    +(1 row)
    +
    +drop table tt01;
    +DROP TABLE
    +
    + +
    +
  • GROUP BY clause

    Condenses query results into a single row or selected rows that share the same values for the grouped expressions.

    +
    • CUBE ( { expression | ( expression [, ...] ) } [, ...] )

      A CUBE grouping is an extension to the GROUP BY clause that creates subtotals for all of the possible combinations of the given list of grouping columns (or expressions). In terms of multidimensional analysis, CUBE generates all the subtotals that could be calculated for a data cube with the specified dimensions. For example, given three expressions (n=3) in the CUBE clause, the operation results in 2n = 23 = 8 groupings. Rows grouped on the values of n expressions are called regular rows, and the rest are called superaggregate rows.

      +
    • GROUPING SETS ( grouping_element [, ...] )

      GROUPING SETS is another extension to the GROUP BY clause. It allows users to specify multiple GROUP BY clauses. This improves efficiency by trimming away unnecessary data. After you specify the set of groups that you want to create using a GROUPING SETS expression within a GROUP BY clause, the database does not need to compute a whole ROLLUP or CUBE.

      +
    +

    If the SELECT list expression quotes some ungrouped fields and no aggregate function is used, an error is displayed. This is because multiple values may be returned for ungrouped fields.

    +
    +
  • HAVING clause

    Selects special groups by working with the GROUP BY clause. The HAVING clause compares some attributes of groups with a constant. Only groups that matching the logical expression in the HAVING clause are extracted.

    +
  • WINDOW clause

    The general format is WINDOW window_name AS ( window_definition ) [, ...]. window_name is a name can be referenced by window_definition. window_definition can be expressed in the following forms:

    +

    [ existing_window_name ]

    +

    [ PARTITION BY expression [, ...] ]

    +

    [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]

    +

    [ frame_clause ]

    +

    frame_clause defines a window frame for the window function. The window function (not all window functions) depends on window frame and window frame is a set of relevant rows of the current query row. frame_clause can be expressed in the following forms:

    +

    [ RANGE | ROWS ] frame_start

    +

    [ RANGE | ROWS ] BETWEEN frame_start AND frame_end

    +

    frame_start and frame_end can be expressed in the following forms:

    +

    UNBOUNDED PRECEDING

    +

    value PRECEDING (not supported for RANGE)

    +

    CURRENT ROW

    +

    value FOLLOWING (not supported for RANGE)

    +

    UNBOUNDED FOLLOWING

    +

    For the query of column storage table, only row_number window function is supported, frame_clause is not supported.

    +
    +
  • UNION clause

    Computes the set union of the rows returned by the involved SELECT statements.

    +

    The UNION clause has the following constraints:

    +
    • By default, the result of UNION does not contain any duplicate rows unless the ALL option is specified.
    • Multiple UNION operators in the same SELECT statement are evaluated left to right, unless otherwise specified by parentheses.
    • FOR UPDATE cannot be specified either for a UNION result or for any input of a UNION.
    +

    General expression:

    +

    select_statement UNION [ALL] select_statement

    +
    • select_statement can be any SELECT statement without an ORDER BY, LIMIT, FOR UPDATE, or FOR SHARE statement.
    • ORDER BY and LIMIT in parentheses can be attached in a sub-expression.
    +
  • INTERSECT clause

    Computes the set intersection of rows returned by the involved SELECT statements. The result of INTERSECT does not contain any duplicate rows.

    +

    The INTERSECT clause has the following constraints:

    +
    • Multiple INTERSECT operators in the same SELECT statement are evaluated left to right, unless otherwise specified by parentheses.
    • Processing INTERSECT preferentially when UNION and INTERSECT operations are executed for results of multiple SELECT statements.
    +

    General format:

    +

    select_statement INTERSECT select_statement

    +

    select_statement can be any SELECT statement without a FOR UPDATE clause.

    +
  • EXCEPT clause

    EXCEPT clause has the following common form:

    +

    select_statement EXCEPT [ ALL ] select_statement

    +

    select_statement can be any SELECT statement without a FOR UPDATE clause.

    +

    The EXCEPT operator computes the set of rows that are in the result of the left SELECT statement but not in the result of the right one.

    +

    The result of EXCEPT does not contain any duplicate rows unless the ALL option is specified. To execute ALL, a row that has m duplicates in the left table and n duplicates in the right table will appear MAX(mn, 0) times in the result set.

    +

    Multiple EXCEPT operators in the same SELECT statement are evaluated left to right, unless parentheses dictate otherwise. EXCEPT binds at the same level as UNION.

    +

    Currently, FOR UPDATE and FOR SHARE cannot be specified either for an EXCEPT result or for any input of an EXCEPT.

    +
  • MINUS clause

    Has the same function and syntax as EXCEPT clause.

    +
  • ORDER BY clause

    Sorts data retrieved by SELECT in descending or ascending order. If the ORDER BY expression contains multiple columns:

    +
    • If two columns are equal according to the leftmost expression, they are compared according to the next expression and so on.
    • If they are equal according to all specified expressions, they are returned in an implementation-dependent order.
    • Columns sorted by ORDER BY must be contained in the result set retrieved by SELECT.
    +
    • If ORDER BY is not specified, the query results are returned following the generation sequence in the database system.
    • You can add the keyword ASC (in ascending order) or DESC (in descending order) next to any expression in the ORDER BY clause. If the keyword is not specified, ASC is used by default.
    • To sort query results by case-insensitive Chinese pinyin, specify the UTF-8 or GBK encoding mode during database initialization. Run either of the following commands:

      initdb –E UTF8 –D ../data –locale=zh_CN.UTF-8 or initdb –E GBK –D ../data –locale=zh_CN.GBK

      +
    +
    +
  • [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ]

    The LIMIT clause consists of two independent LIMIT clauses, an OFFSET clause, and a LIMIT clause with multiple parameters.

    +

    LIMIT { count | ALL }

    +

    OFFSET start [ ROW | ROWS ]

    +

    LIMIT start, { count | ALL }

    +

    count in the clauses specifies the maximum number of rows to return, while start specifies the number of rows to skip before starting to return rows. When both are specified, start rows are skipped before starting to count the count rows to be returned. A multi-parameter LIMIT clause cannot be used together with a single-parameter LIMIT or OFFSET clause.

    +
  • FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY

    If count is omitted in a FETCH clause, it defaults to 1.

    +
  • FOR UPDATE clause

    Locks rows retrieved by SELECT. This ensures that the rows cannot be modified or deleted by other transactions until the current transaction ends. That is, other transactions that attempt UPDATE, DELETE, or SELECT FOR UPDATE of these rows will be blocked until the current transaction ends.

    +

    To avoid waiting for the committing of other transactions, you can apply NOWAIT. Rows to which NOWAIT applies cannot be immediately locked. After SELECT FOR UPDATE NOWAIT is executed, an error is reported.

    +

    FOR SHARE behaves similarly, except that it acquires a shared rather than exclusive lock on each retrieved row. A share lock blocks other transaction from performing UPDATE, DELETE, or SELECT FOR UPDATE on these rows, but it does not prevent them from performing SELECT FOR SHARE.

    +

    If specified tables are named in FOR UPDATE or FOR SHARE, then only rows coming from those tables are locked; any other tables used in SELECT are simply read as usual. Otherwise, locking all tables in the command.

    +

    If FOR UPDATE or FOR SHARE is applied to a view or sub-query, it affects all tables used in the view or sub-query.

    +

    Multiple FOR UPDATE and FOR SHARE clauses can be written if it is necessary to specify different locking behaviors for different tables.

    +

    If the same table is mentioned (or implicitly affected) by both FOR UPDATE and FOR SHARE clauses, it is processed as FOR UPDATE. Similarly, a table is processed as NOWAIT if that is specified in any of the clauses affecting it.

    +
    • For SQL statements containing FOR UPDATE or FOR SHARE, their execution plans will be pushed down to DNs. If the pushdown fails, an error will be reported.
    • The query of column storage table does not support for update/share.
    +
    +
  • NLS_SORT

    Indicates a field to be ordered in a special mode. Currently, only the Chinese Pinyin order and case insensitive order are supported.

    +

    Valid value:

    +
    • SCHINESE_PINYIN_M, sorted by Pinyin order. To use this sort method, specify GBK as the encoding format when you create the database. If you do not do so, this value is invalid.
    • generic_m_ci, case-insensitive order.
    +
  • PARTITION clause

    Queries data in the specified partition of a partitioned table.

    +
+
+

Examples

Obtain the temp_t temporary table by a subquery and query all records in this table.

+
1
WITH temp_t(name,isdba) AS (SELECT usename,usesuper FROM pg_user) SELECT * FROM temp_t;
+
+ +
+

Query all the r_reason_sk records in the tpcds.reason table and de-duplicate them.

+
1
SELECT DISTINCT(r_reason_sk) FROM tpcds.reason;
+
+ +
+

Example of a LIMIT clause: Obtain a record from the table.

+
1
SELECT * FROM tpcds.reason LIMIT 1;
+
+ +
+

Example of a LIMIT clause: Obtain the third record from the table.

+
1
SELECT * FROM tpcds.reason LIMIT 1 OFFSET 2;
+
+ +
+

Example of a LIMIT clause: Obtain the first two records from a table.

+
1
SELECT * FROM tpcds.reason LIMIT 2;
+
+ +
+

Query all records and sort them in alphabetic order.

+
1
SELECT r_reason_desc FROM tpcds.reason ORDER BY r_reason_desc;
+
+ +
+

Use table aliases to obtain data from the pg_user and pg_user_status tables.

+
1
SELECT a.usename,b.locktime FROM pg_user a,pg_user_status b WHERE a.usesysid=b.roloid;
+
+ +
+

Example of the FULL JOIN clause: Join data in the pg_user and pg_user_status tables.

+
1
SELECT a.usename,b.locktime,a.usesuper FROM pg_user a FULL JOIN pg_user_status b on a.usesysid=b.roloid;
+
+ +
+

Example of the GROUP BY clause: Filter data based on query conditions, and group the results.

+
1
SELECT r_reason_id, AVG(r_reason_sk) FROM tpcds.reason GROUP BY r_reason_id HAVING AVG(r_reason_sk) > 25;
+
+ +
+

Example of the GROUP BY clause: Group the results by alias.

+
1
SELECT r_reason_id AS id FROM tpcds.reason GROUP BY id;
+
+ +
+

Example of the GROUP BY CUBE clause: Filter data based on query conditions, and group the results.

+
1
SELECT r_reason_id,AVG(r_reason_sk) FROM tpcds.reason GROUP BY CUBE(r_reason_id,r_reason_sk);
+
+ +
+

Example of the GROUP BY GROUPING SETS clause: Filter data based on query conditions, and group the results.

+
1
SELECT r_reason_id,AVG(r_reason_sk) FROM tpcds.reason GROUP BY GROUPING SETS((r_reason_id,r_reason_sk),r_reason_sk);
+
+ +
+

Example of the UNION clause: Merge the names started with W and N in the r_reason_desc column in the tpcds.reason table.

+
1
+2
+3
+4
+5
+6
+7
SELECT r_reason_sk, tpcds.reason.r_reason_desc
+    FROM tpcds.reason
+    WHERE tpcds.reason.r_reason_desc LIKE 'W%'
+UNION
+SELECT r_reason_sk, tpcds.reason.r_reason_desc
+    FROM tpcds.reason
+    WHERE tpcds.reason.r_reason_desc LIKE 'N%';
+
+ +
+
1
SELECT * FROM stu_pinyin_info ORDER BY NLSSORT (name, 'NLS_SORT = SCHINESE_PINYIN_M' );
+
+ +
+

Case-insensitive order:

+
1
+2
+3
+4
+5
+6
+7
+8
CREATE TABLE stu_icase_info (id bigint, name text) DISTRIBUTE BY REPLICATION;
+INSERT INTO stu_icase_info VALUES (1, 'aaaa'),(2, 'AAAA');
+SELECT * FROM stu_icase_info ORDER BY NLSSORT (name, 'NLS_SORT = generic_m_ci');
+ id | name
+----+------
+  1 | aaaa
+  2 | AAAA
+(2 rows)
+
+ +
+

Create the table tpcds.reason_p.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
CREATE TABLE tpcds.reason_p
+(
+  r_reason_sk integer,
+  r_reason_id character(16),
+  r_reason_desc character(100)
+)
+PARTITION BY RANGE (r_reason_sk)
+(
+  partition P_05_BEFORE values less than (05),
+  partition P_15 values less than (15),
+  partition P_25 values less than (25),
+  partition P_35 values less than (35),
+  partition P_45_AFTER values less than (MAXVALUE)
+);
+
+ +
+

Insert data.

+
1
INSERT INTO tpcds.reason_p values(3,'AAAAAAAABAAAAAAA','reason 1'),(10,'AAAAAAAABAAAAAAA','reason 2'),(4,'AAAAAAAABAAAAAAA','reason 3'),(10,'AAAAAAAABAAAAAAA','reason 4'),(10,'AAAAAAAABAAAAAAA','reason 5'),(20,'AAAAAAAACAAAAAAA','reason 6'),(30,'AAAAAAAACAAAAAAA','reason 7');
+
+ +
+

Example of the PARTITION clause: Obtain data from the P_05_BEFORE partition in the tpcds.reason_p table.

+
1
+2
+3
+4
+5
+6
SELECT * FROM tpcds.reason_p PARTITION (P_05_BEFORE);
+ r_reason_sk |   r_reason_id    |   r_reason_desc                   
+-------------+------------------+------------------------------------
+           4 | AAAAAAAABAAAAAAA | reason 3                          
+           3 | AAAAAAAABAAAAAAA | reason 1                          
+(2 rows)
+
+ +
+

Example of the GROUP BY clause: Group records in the tpcds.reason_p table by r_reason_id, and count the number of records in each group.

+
1
+2
+3
+4
+5
+6
SELECT COUNT(*),r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id;
+ count |   r_reason_id    
+-------+------------------
+     2 | AAAAAAAACAAAAAAA
+     5 | AAAAAAAABAAAAAAA
+(2 rows)
+
+ +
+

Example of the GROUP BY CUBE clause: Filter data based on query conditions, and group the results.

+
1
SELECT * FROM tpcds.reason GROUP BY  CUBE (r_reason_id,r_reason_sk,r_reason_desc);
+
+ +
+

Example of the GROUP BY GROUPING SETS clause: Filter data based on query conditions, and group the results.

+
1
SELECT * FROM tpcds.reason GROUP BY  GROUPING SETS ((r_reason_id,r_reason_sk),r_reason_desc);
+
+ +
+

Example of the HAVING clause: Group records in the tpcds.reason_p table by r_reason_id, count the number of records in each group, and display only values whose number of r_reason_id is greater than 2.

+
1
+2
+3
+4
+5
SELECT COUNT(*) c,r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id HAVING c>2;
+ c |   r_reason_id    
+---+------------------
+ 5 | AAAAAAAABAAAAAAA
+(1 row)
+
+ +
+

Example of the IN clause: Group records in the tpcds.reason_p table by r_reason_id, count the number of records in each group, and display only the numbers of records whose r_reason_id is AAAAAAAABAAAAAAA or AAAAAAAADAAAAAAA.

+
1
+2
+3
+4
+5
SELECT COUNT(*),r_reason_id FROM tpcds.reason_p GROUP BY r_reason_id HAVING r_reason_id IN('AAAAAAAABAAAAAAA','AAAAAAAADAAAAAAA'); 
+count |   r_reason_id    
+-------+------------------
+     5 | AAAAAAAABAAAAAAA
+(1 row)
+
+ +
+

Example of the INTERSECT clause: Query records whose r_reason_id is AAAAAAAABAAAAAAA and whose r_reason_sk is smaller than 5.

+
1
+2
+3
+4
+5
+6
SELECT * FROM tpcds.reason_p WHERE r_reason_id='AAAAAAAABAAAAAAA' INTERSECT SELECT * FROM tpcds.reason_p WHERE r_reason_sk<5;
+ r_reason_sk |   r_reason_id    |     r_reason_desc                 
+-------------+------------------+------------------------------------
+           4 | AAAAAAAABAAAAAAA | reason 3                           
+           3 | AAAAAAAABAAAAAAA | reason 1                           
+(2 rows)
+
+ +
+

Example of the EXCEPT clause: Query records whose r_reason_id is AAAAAAAABAAAAAAA and whose r_reason_sk is greater than or equal to 4.

+
1
+2
+3
+4
+5
+6
+7
+8
SELECT * FROM tpcds.reason_p WHERE r_reason_id='AAAAAAAABAAAAAAA' EXCEPT SELECT * FROM tpcds.reason_p WHERE r_reason_sk<4;
+r_reason_sk |   r_reason_id    |      r_reason_desc                  
+-------------+------------------+------------------------------------
+          10 | AAAAAAAABAAAAAAA | reason 2                          
+          10 | AAAAAAAABAAAAAAA | reason 5                          
+          10 | AAAAAAAABAAAAAAA | reason 4                          
+           4 | AAAAAAAABAAAAAAA | reason 3                          
+(4 rows)
+
+ +
+

Specify the operator (+) in the WHERE clause to indicate a left join.

+
1
+2
+3
+4
+5
+6
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk  = t2.c_customer_sk(+) 
+order by 1 desc limit 1;
+ sr_item_sk | c_customer_id
+------------+---------------
+      18000 |
+(1 row)
+
+ +
+

Specify the operator (+) in the WHERE clause to indicate a right join.

+
1
+2
+3
+4
+5
+6
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk(+)  = t2.c_customer_sk 
+order by 1 desc limit 1;
+ sr_item_sk |  c_customer_id
+------------+------------------
+            | AAAAAAAAJNGEBAAA
+(1 row)
+
+ +
+

Specify the operator (+) in the WHERE clause to indicate a left join and add a join condition.

+
1
+2
+3
+4
+5
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk  = t2.c_customer_sk(+) and t2.c_customer_sk(+) < 1 order by 1  limit 1;
+ sr_item_sk | c_customer_id
+------------+---------------
+          1 |
+(1 row)
+
+ +
+

If the operator (+) is specified in the WHERE clause, do not use expressions connected through AND/OR.

+
1
+2
+3
+4
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where not(t1.sr_customer_sk  = t2.c_customer_sk(+) and t2.c_customer_sk(+) < 1);
+ERROR:  Operator "(+)" can not be used in nesting expression.
+LINE 1: ...tomer_id from store_returns t1, customer t2 where not(t1.sr_...
+                                                             ^
+
+ +
+

If the operator (+) is specified in the WHERE clause which does not support expression macros, an error will be reported.

+
1
+2
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where (t1.sr_customer_sk  = t2.c_customer_sk(+))::bool;
+ERROR:  Operator "(+)" can only be used in common expression.
+
+ +
+

If the operator (+) is specified on both sides of an expression in the WHERE clause, an error will be reported.

+
1
+2
+3
select t1.sr_item_sk ,t2.c_customer_id from store_returns t1, customer t2 where t1.sr_customer_sk(+)  = t2.c_customer_sk(+);
+ERROR:  Operator "(+)" can't be specified on more than one relation in one join condition
+HINT:  "t1", "t2"...are specified Operator "(+)" in one condition.
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0239.html b/docs/dws/dev/dws_06_0239.html new file mode 100644 index 00000000..7c8a36db --- /dev/null +++ b/docs/dws/dev/dws_06_0239.html @@ -0,0 +1,67 @@ + + +

SELECT INTO

+

Function

SELECT INTO defines a new table based on a query result and insert data obtained by query to the new table.

+

Different from SELECT, data found by SELECT INTO is not returned to the client. The table columns have the same names and data types as the output columns of the SELECT.

+
+

Precautions

CREATE TABLE AS provides functions similar to SELECT INTO in functions and provides a superset of functions provided by SELECT INTO. You are advised to use CREATE TABLE AS, because SELECT INTO cannot be used in a stored procedure.

+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
[ WITH [ RECURSIVE ] with_query [, ...] ]
+SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
+    { * | {expression [ [ AS ] output_name ]} [, ...] }
+    INTO [ UNLOGGED ] [ TABLE ] new_table
+    [ FROM from_item [, ...] ]
+    [ WHERE condition ]
+    [ GROUP BY expression [, ...] ]
+    [ HAVING condition [, ...] ]
+    [ WINDOW {window_name AS ( window_definition )} [, ...] ]
+    [ { UNION | INTERSECT | EXCEPT | MINUS } [ ALL | DISTINCT ] select ]
+    [ ORDER BY {expression [ [ ASC | DESC | USING operator ] | nlssort_expression_clause ] [ NULLS { FIRST | LAST } ]} [, ...] ]
+    [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ]
+    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]
+    [ {FOR { UPDATE | SHARE } [ OF table_name [, ...] ] [ NOWAIT ]} [...] ];
+
+ +
+
+

Parameter Description

INTO [ UNLOGGED ] [ TABLE ] new_table

+

UNLOGGED indicates that the table is created as an unlogged table. Data written to unlogged tables is not written to the write-ahead log, which makes them considerably faster than ordinary tables. However, they are not crash-safe: an unlogged table is automatically truncated after a crash or unclean shutdown. The contents of an unlogged table are also not replicated to standby servers. Any indexes created on an unlogged table are automatically unlogged as well.

+

new_table specifies the name of a new table, which can be schema-qualified.

+

For details about other SELECT INTO parameters, see Parameter Description in SELECT.

+
+
+

Example

Add values that are less than 5 in the r_reason_sk column in the tpcds.reason table to the new table.

+
1
+2
SELECT * INTO tpcds.reason_t1 FROM tpcds.reason WHERE r_reason_sk < 5;
+INSERT 0 6
+
+ +
+

Delete the tpcds.reason_t1 table.

+
1
DROP TABLE tpcds.reason_t1;
+
+ +
+
+

Helpful Links

SELECT

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0240.html b/docs/dws/dev/dws_06_0240.html new file mode 100644 index 00000000..27ac302d --- /dev/null +++ b/docs/dws/dev/dws_06_0240.html @@ -0,0 +1,106 @@ + + +

UPDATE

+

Function

UPDATE updates data in a table. UPDATE changes the values of the specified columns in all rows that satisfy the condition. The WHERE clause clarifies conditions. The columns to be modified need be mentioned in the SET clause; columns not explicitly modified retain their previous values.

+
+

Precautions

  • You must have the UPDATE permission on a table to be updated.
  • You must have the SELECT permission on all tables involved in the expressions or conditions.
  • The distribution column of a table cannot be modified.
  • For column-store tables, the RETURNING clause is currently not supported.
  • Column-store tables do not support non-deterministic update. If you update data in one row with multiple rows of data in a column-store table, an error is reported.
  • Memory space that records update operations in column-store tables is not reclaimed. You need to clean it by executing VACUUM FULL table_name.
  • Currently, UPDATE cannot be used in column-store replication tables.
  • You are not advised to create a table that needs to be frequently updated as a replication table.
  • Column-store tables support lightweight UPDATE operations. Lightweight UPDATE operations only rewrite the updated columns to reduce space usage. Lightweight UPDATE for column-store tables is controlled by GUC parameter enable_light_colupdate.
  • Column-store lightweight UPDATE is unavailable and automatically changes to the regular UPDATE operation in the following scenarios: updating an index column, updating a primary key column, updating a partition column, updating a PCK column, and online scaling.
+
+

Syntax

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
UPDATE [ ONLY ] table_name [ * ] [ [ AS ] alias ]
+SET {column_name = { expression | DEFAULT } 
+    |( column_name [, ...] ) = {( { expression | DEFAULT } [, ...] ) |sub_query }}[, ...]
+    [ FROM from_list] [ WHERE condition ]
+    [ RETURNING {* 
+                | {output_expression [ [ AS ] output_name ]} [, ...] }];
+
+where sub_query can be:
+SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ]
+{ * | {expression [ [ AS ] output_name ]} [, ...] }
+[ FROM from_item [, ...] ]
+[ WHERE condition ]
+[ GROUP BY grouping_element [, ...] ]
+[ HAVING condition [, ...] ]
+
+ +
+
+

Parameter Description

  • table_name

    Name (optionally schema-qualified) of the table to be updated.

    +

    Value range: an existing table name

    +
  • alias

    Specifies the alias for the target table.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • column_name

    Renames a column.

    +

    You can refer to this column by specifying the table name and column name of the target table. Example:

    +
    1
    UPDATE foo SET foo.col_name = 'GaussDB';
    +
    + +
    +

    You can refer to this column by specifying the target table alias and the column name. For example:

    +
    1
    UPDATE foo AS f SET f.col_name = 'GaussDB';
    +
    + +
    +

    Value range: an existing column name

    +
  • expression

    An expression or value to assign to the column.

    +
  • DEFAULT

    Sets the column to its default value.

    +

    The value is NULL if no specified default value has been assigned to it.

    +
  • sub_query

    Specifies a subquery.

    +

    This command can be executed to update a table with information for other tables in the same database. For details about clauses in the SELECT statement, see SELECT.

    +
  • from_list

    A list of table expressions, allowing columns from other tables to appear in the WHERE condition and the update expressions. This is similar to the list of tables that can be specified in the FROM clause of a SELECT statement.

    +

    Note that the target table must not appear in the from_list, unless you intend a self-join (in which case it must appear with an alias in the from_list).

    +
    +
  • condition

    An expression that returns a value of type boolean. Only rows for which this expression returns true are updated.

    +
  • output_expression

    An expression to be computed and returned by the UPDATE command after each row is updated.

    +

    Value range: The expression can use any column names of the table named by table_name or table(s) listed in FROM. Write * to return all columns.

    +
  • output_name

    A name to use for a returned column.

    +
+
+

Examples

Update the values of all records.

+
1
UPDATE reason SET r_reason_sk = r_reason_sk * 2;
+
+ +
+

If the WHERE clause is not included, all r_reason_sk values are updated.

+
1
UPDATE reason SET r_reason_sk = r_reason_sk + 100;
+
+ +
+

Redefine r_reason_sk whose r_reason_desc is reason2 in the reason table.

+
1
UPDATE reason SET r_reason_sk = 5 WHERE r_reason_desc = 'reason2';
+
+ +
+

Redefine r_reason_sk whose value is 2 in the reason table.

+
1
UPDATE reason SET r_reason_sk = r_reason_sk + 100 WHERE r_reason_sk = 2;
+
+ +
+

Redefine the course IDs whose r_reason_sk is greater than 2 in the reason table.

+
1
UPDATE reason SET r_reason_sk = 201 WHERE r_reason_sk > 2;
+
+ +
+

You can run an UPDATE statement to update multiple columns by specifying multiple values in the SET clause. For example:

+
1
UPDATE reason SET r_reason_sk = 5, r_reason_desc = 'reason5' WHERE r_reason_id = 'fourth'; 
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0241.html b/docs/dws/dev/dws_06_0241.html new file mode 100644 index 00000000..ac7a477b --- /dev/null +++ b/docs/dws/dev/dws_06_0241.html @@ -0,0 +1,107 @@ + + +

VALUES

+

Function

VALUES computes a row or a set of rows based on given values. It is most commonly used to generate a constant table within a large command.

+
+

Precautions

  • VALUES lists with large numbers of rows should be avoided, as you might encounter out-of-memory failures or poor performance. VALUES appearing within INSERT is a special case, because the desired column types are known from the INSERT's target table, and need not be inferred by scanning the VALUES list. In this case, VALUE can handle larger lists than are practical in other contexts.
  • If more than one row is specified, all the rows must have the same number of elements.
+
+

Syntax

1
+2
+3
+4
VALUES {( expression [, ...] )} [, ...]
+    [ ORDER BY { sort_expression [ ASC | DESC | USING operator ] } [, ...] ]
+    [ { [ LIMIT { count | ALL } ] [ OFFSET start [ ROW | ROWS ] ] } | { LIMIT start, { count | ALL } } ]
+    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ];
+
+ +
+
+

Parameter Description

  • expression

    Specifies a constant or expression to compute and insert at the indicated place in the resulting table or set of rows.

    +

    In a VALUES list appearing at the top level of an INSERT, an expression can be replaced by DEFAULT to indicate that the destination column's default value should be inserted. DEFAULT cannot be used when VALUES appears in other contexts.

    +
  • sort_expression

    Specifies an expression or integer constant indicating how to sort the result rows.

    +
  • ASC

    Indicates ascending sort order.

    +
  • DESC

    Indicates descending sort order.

    +
  • operator

    Specifies a sorting operator.

    +
  • count

    Specifies the maximum number of rows to return.

    +
  • start

    Specifies the number of rows to skip before starting to return rows.

    +
  • FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY

    The FETCH clause restricts the total number of rows starting from the first row of the return query result, and the default value of count is 1.

    +
+
+

Examples

Create the reason_t1 table.

+
1
+2
+3
+4
+5
+6
CREATE TABLE reason_t1
+(
+    TABLE_SK          INTEGER               ,
+    TABLE_ID          VARCHAR(20)           ,
+    TABLE_NA          VARCHAR(20)
+);
+
+ +
+

Insert a record into a table.

+
1
INSERT INTO reason_t1(TABLE_SK, TABLE_ID, TABLE_NA) VALUES (1, 'S01', 'StudentA');
+
+ +
+

Insert a record into a table. This command is equivalent to the last one.

+
1
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA');
+
+ +
+

Insert records whose TABLE_SK is less than 1 into the table.

+
1
INSERT INTO reason_t1 SELECT * FROM reason_t1 WHERE TABLE_SK < 1;
+
+ +
+

Insert records into the table.

+
1
+2
+3
+4
+5
+6
+7
+8
INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB');
+SELECT * FROM reason_t1 ORDER BY 1;
+ TABLE_SK | TABLE_ID | TABLE_NAME
+----------+----------+------------
+        1 |      S01 |   StudentA
+        2 |      T01 |   TeacherA
+        3 |      T02 |   TeacherB
+(3 rows)
+
+ +
+

Clear existing data in the table and insert data to the table.

+
1
+2
+3
+4
+5
+6
INSERT OVERWRITE INTO reason_t1 values (4, 'S02', 'StudentB');
+SELECT * FROM reason_t1 ORDER BY 1;
+ TABLE_SK | TABLE_ID | TABLE_NAME
+----------+----------+------------
+        4 |      S02 |   StudentB
+(1 rows)
+
+ +
+

Insert data back into the reason_t1 table.

+
INSERT INTO reason_t1 SELECT * FROM reason_t1;
+

Specify default values for independent columns.

+
INSERT INTO reason_t1 VALUES (5, 'S03', DEFAULT);
+

Insert some data in a table to another table: Use the WITH subquery to obtain a temporary table temp_t, and then insert all data in temp_t to another table reason_t1.

+
WITH temp_t AS (SELECT * FROM reason_t1) INSERT INTO reason_t1 SELECT * FROM temp_t ORDER BY 1;
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0242.html b/docs/dws/dev/dws_06_0242.html new file mode 100644 index 00000000..7fd1ba5d --- /dev/null +++ b/docs/dws/dev/dws_06_0242.html @@ -0,0 +1,39 @@ + + + +

DCL Syntax

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0243.html b/docs/dws/dev/dws_06_0243.html new file mode 100644 index 00000000..2b56f3d7 --- /dev/null +++ b/docs/dws/dev/dws_06_0243.html @@ -0,0 +1,17 @@ + + +

DCL Syntax Overview

+

Data control language (DCL) is used to set or modify database users or role rights.

+

Authorization

GaussDB(DWS) provides a statement for granting rights to data objects and roles. For details, see GRANT.

+
+

Revoking Rights

GaussDB(DWS) provides a statement for revoking rights. For details, see REVOKE.

+
+

Setting Default Rights

GaussDB(DWS) allows users to set rights for objects that will be created. For details, see ALTER DEFAULT PRIVILEGES.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0244.html b/docs/dws/dev/dws_06_0244.html new file mode 100644 index 00000000..d6fd99c6 --- /dev/null +++ b/docs/dws/dev/dws_06_0244.html @@ -0,0 +1,205 @@ + + +

ALTER DEFAULT PRIVILEGES

+

Function

ALTER DEFAULT PRIVILEGES allows you to set the permissions that will be used for objects to be created. It does not affect permissions assigned to existing objects.

+

To isolate permissions, the WITH GRANT OPTION syntax is disabled in the current GaussDB(DWS) version.

+

A user can modify only the default permissions of the objects created by the user or the role to which the user belongs. These permissions can be set globally (that is, all objects created in the database) or for objects in a specified schema.

+

To view information about the default permissions of database users, query the system catalog .

+
+

Precautions

Only the permissions for tables (including views), sequences, functions, and types (including domains) can be altered.

+
+

Syntax

1
+2
+3
+4
ALTER DEFAULT PRIVILEGES
+    [ FOR { ROLE | USER } target_role [, ...] ]
+    [ IN SCHEMA schema_name [, ...] ]
+    abbreviated_grant_or_revoke;
+
+ +
+
  • abbreviated_grant_or_revoke grants or revokes permissions on certain objects.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    grant_on_tables_clause
    +  | grant_on_functions_clause
    +  | grant_on_types_clause
    +  | grant_on_sequences_clause
    +  | revoke_on_tables_clause
    +  | revoke_on_functions_clause
    +  | revoke_on_types_clause
    +  | revoke_on_sequences_clause
    +
    + +
    +
+
  • grant_on_tables_clause grants permissions on tables.
    1
    +2
    +3
    +4
    +5
    GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE } 
    +    [, ...] | ALL [ PRIVILEGES ] }
    +    ON TABLES 
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ]
    +
    + +
    +
  • grant_on_functions_clause grants permissions on functions.
    1
    +2
    +3
    +4
    GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    +    ON FUNCTIONS 
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ]
    +
    + +
    +
  • grant_on_types_clause grants permissions on types.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON TYPES 
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ]
    +
    + +
    +
  • grant_on_sequences_clause grants permissions on sequences.
    1
    +2
    +3
    +4
    +5
    GRANT { { USAGE | SELECT | UPDATE }
    +    [, ...] | ALL [ PRIVILEGES ] }
    +    ON SEQUENCES 
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ]
    +
    + +
    +
  • revoke_on_tables_clause revokes permissions on tables.
    1
    +2
    +3
    +4
    +5
    +6
    REVOKE [ GRANT OPTION FOR ]
    +    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE } 
    +    [, ...] | ALL [ PRIVILEGES ] }
    +    ON TABLES 
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
    +
    + +
    +
  • revoke_on_functions_clause revokes permissions on functions.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { EXECUTE | ALL [ PRIVILEGES ] }
    +    ON FUNCTIONS 
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
    +
    + +
    +
  • revoke_on_types_clause revokes permissions on types.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { USAGE | ALL [ PRIVILEGES ] }
    +    ON TYPES 
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
    +
    + +
    +
  • revoke_on_sequences_clause revokes permissions on sequences.
    1
    +2
    +3
    +4
    +5
    +6
    REVOKE [ GRANT OPTION FOR ]
    +    { { USAGE | SELECT | UPDATE }
    +    [, ...] | ALL [ PRIVILEGES ] }
    +    ON SEQUENCES 
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
    +
    + +
    +
+
+

Parameter Description

  • target_role

    Specifies the name of an existing role. If FOR ROLE/USER is omitted, the current role or user is assumed.

    +

    target_role must have the CREATE permissions for schema_name. You can use the has_schema_privilege function to check whether a role or user has the CREATE permission on a schema.

    +
    1
    select a.rolname, n.nspname from pg_authid as a, pg_namespace as n where has_schema_privilege(a.oid, n.oid, 'CREATE');
    +
    + +
    +

    Value range: An existing role name.

    +
  • schema_name

    Specifies the name of an existing schema.

    +

    If a schema name is specified, the default permissions of all objects created in the schema will be modified. If IN SCHEMA is omitted, global permissions will be modified.

    +

    Value range: An existing schema name.

    +
  • role_name

    Specifies the name of an existing role whose permissions are to be granted or revoked.

    +

    Value range: An existing role name.

    +
+

If you want to delete a role that has been assigned default permissions, you must revoke the changes to the default permissions or use DROP OWNED BY to get rid of the default permission entry for the role.

+
+
+

Examples

  • Grant the SELECT permission on all the tables (and views) in tpcds to every user.
    1
    ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT SELECT ON TABLES TO PUBLIC;
    +
    + +
    +
  • Grant the INSERT permission on all the tables in tpcds to the user jack.
    1
    ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT INSERT ON TABLES TO jack;
    +
    + +
    +
  • Revoke the preceding permissions.
    1
    +2
    ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE SELECT ON TABLES FROM PUBLIC; 
    +ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE INSERT ON TABLES FROM jack;
    +
    + +
    +
  • Assume that there are two users test1 and test2. If you require that user test2 can query tables created by user test1, execute the following statements.
    • Grant user test2 the schema permission of user test1.
      1
      grant usage, create on schema test1 to test2;
      +
      + +
      +
    • Grant user test2 the table query permission of user test1.
      1
      ALTER DEFAULT PRIVILEGES FOR USER test1 IN SCHEMA test1 GRANT SELECT ON tables TO test2;
      +
      + +
      +
    • Create a table as user test1.
      1
      +2
      set role test1 password '{password1}';
      +create table test3( a int, b int);
      +
      + +
      +
    • Run the following statement as user test2.
      1
      +2
      +3
      +4
      +5
      set role test2 password '{password2}';
      +select * from test1.test3;
      + a | b
      +---+---
      +(0 rows)
      +
      + +
      +
    +
+
+

Helpful Links

GRANT, REVOKE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0245.html b/docs/dws/dev/dws_06_0245.html new file mode 100644 index 00000000..24788312 --- /dev/null +++ b/docs/dws/dev/dws_06_0245.html @@ -0,0 +1,107 @@ + + +

ANALYZE | ANALYSE

+

Function

ANALYZE collects statistics about ordinary tables in a database, and stores the results in the PG_STATISTIC system catalog. The execution plan generator uses these statistics to determine which one is the most effective execution plan.

+

If no parameters are specified, ANALYZE analyzes each table and partitioned table in the current database. You can also specify table_name, column, and partition_name to limit the analysis to a specified table, column, or partitioned table.

+

Users who can execute ANALYZE on a specific table include the owner of the table, the owner of the database where the table resides, users who are granted the ANALYZE permission on the table through GRANT, and users who have the SYSADMIN attribute.

+

To collect statistics using percentage sampling, you must have the ANALYZE and SELECT permissions.

+

ANALYZE and ANALYSE VERIFY are used to check whether data files of common tables (row-store and column-store tables) in a database are damaged. Currently, this function does not support HDFS tables.

+
+

Precautions

  • Performs the ANALYZE operation on an unsharded table in an anonymous block, transaction block, function, or stored procedure. This function is supported only by 8.1.1 and later versions.
  • However, for analyzing an entire database, the ANALYZE operation of each table is in different transactions. Therefore, the current version does not support the ANALYZE execution for the entire database in anonymous blocks, transaction blocks, functions, or stored procedures.
  • Statistics updates of PG_CLASS related columns cannot be rolled back.
  • Most ANALYZE VERIFY operations are used for abnormal scenario detection, and require a release version. Remote read is not triggered in the ANALYZE VERIFY scenario. Therefore, the remote read parameter does not take effect. If the system detects that the page is damaged due to an error in the key system table, the system reports an error and stops the detection.
+
+

Syntax

  • Collect statistics information about a table.
    1
    +2
    { ANALYZE | ANALYSE } [ VERBOSE ]
    +    [ table_name [ ( column_name [, ...] ) ] ];
    +
    + +
    +
+
  • Collect statistics about a partitioned table.
    1
    +2
    +3
    { ANALYZE | ANALYSE } [ VERBOSE ]
    +    [ table_name [ ( column_name [, ...] ) ] ]
    +    PARTITION ( patrition_name ) ;
    +
    + +
    +

    An ordinary partitioned table supports the syntax but not the function of collecting statistics about specified partitions. Run the ANALYZE command on a specified partition. A warning message is displayed.

    +
    +
  • Collect statistics about a foreign table.
    1
    +2
    { ANALYZE | ANALYSE } [ VERBOSE ]
    +    { foreign_table_name | FOREIGN TABLES };
    +
    + +
    +
+
+
  • Collect statistics about multiple columns.
    1
    +2
    {ANALYZE | ANALYSE} [ VERBOSE ]
    +    table_name (( column_1_name, column_2_name [, ...] ));
    +
    + +
    +
    • To sample data in percentage, set default_statistics_target to a negative number.
    • The statistics about a maximum of 32 columns can be collected at a time.
    • You are not allowed to collect statistics about multiple columns in system catalogs or HDFS foreign tables.
    +
    +
  • Check the data files in the current database.
    1
    {ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE};
    +
    + +
    +
    • All operations on the database are supported. Because many tables are involved, you are advised to save the result in redirection mode: gsql -d database -p port -f "verify.sql"> verify_warning.txt 2>&1.
    • HDFS tables (internal and foreign tables), temporary tables, and unlog tables are not supported.
    • Note: Only visible tables are checked. Internal table check involves foreign tables on which the internal tables depend and are not displayed or presented externally.
    • This command can be used to process tolerant errors. The assert operation in a debug version may cause the core to fail to execute commands. Therefore, you are advised to perform this operation in a release version.
    • If a key system table is damaged during a full database operation, an error is reported and the operation stops.
    +
    +
  • Check the data files of tables and indexes.
    1
    {ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name|index_name [CASCADE];
    +
    + +
    +
    • You can perform operations on common tables and index tables, but cannot perform CASCADE operations on index tables. The reason is that CASCADE is used to process all index tables of the primary table. When the index table is checked separately, CASCADE is not required.
    • HDFS tables (internal and foreign tables), temporary tables, and unlog tables are not supported.
    • When the primary table is checked, the internal tables of the primary table, such as the toast table and cudesc table, are also checked.
    • When the system displays a message indicating that the index table is damaged, you are advised to run the reindex command to recreate the index.
    +
    +
  • Check the data file of the table partition.
+
1
{ANALYZE | ANALYSE} VERIFY {FAST|COMPLETE} table_name PARTITION {(partition_name)}[CASCADE];
+
+ +
+
  • You can detect a single partition of a table, but cannot perform the CASCADE operation on index tables.
  • HDFS tables (internal and foreign tables), temporary tables, and unlog tables are not supported.
+
+

Parameter Description

  • VERBOSE

    Enables the display of progress messages.

    +

    If this parameter is specified, progress information is displayed by ANALYZE to indicate the table that is being processed, and statistics about the table are printed.

    +
    +
  • table_name

    Specifies the name (possibly schema-qualified) of a specific table to analyze. If omitted, all regular tables (but not foreign tables) in the current database are analyzed.

    +

    Currently, you can use ANALYZE to collect statistics about row-store tables, column-store tables, HDFS tables, ORC- or CARBONDATA-formatted OBS foreign tables, and foreign tables for collaborative analysis.

    +

    Value range: an existing table name

    +
  • column_name, column_1_name, column_2_name

    Specifies the name of a specific column to analyze. All columns are analyzed by default.

    +

    Value range: an existing column name

    +
  • partition_name

    Assumes the table is a partitioned table. You can specify partition_name following the keyword PARTITION to analyze the statistics of this table. Currently the partitioned table supports the syntax of analyzing a partitioned table, but does not execute this syntax.

    +

    Value range: a partition name in a table

    +
  • foreign_table_name

    Specifies the name (possibly schema-qualified) of a specific table to analyze. The data of the table is stored in HDFS.

    +

    Value range: an existing table name

    +
  • FOREIGN TABLES

    Analyzes HDFS foreign tables stored in HDFS and accessible to the current user.

    +
  • index_name

    Name of the index table to be analyzed. The name may contain the schema name.

    +

    Value range: an existing table name

    +
  • FAST|COMPLETE

    For row-store tables, the CRC and page header of row-store tables are verified in FAST mode. If the verification fails, an alarm is reported. In COMPLETE mode, parse and verify the pointers and tuples of row-store tables. For column-store tables, the CRC and magic of column-store tables are verified in FAST mode. If the verification fails, an alarm is reported. In COMPLETE mode, parse and verify CU of column-store tables.

    +
  • CASCADE

    In CASCADE mode, all indexes of the current table are checked.

    +
+
+

Examples

  • Do ANALYZE to update statistics in the customer_info table.
    1
    ANALYZE customer_info;
    +
    + +
    +
  • Do ANALYZE VERBOSE to update statistics and display table information in the customer_info table.
    1
    +2
    +3
    +4
    +5
    ANALYZE VERBOSE customer_info;
    +INFO:  analyzing "cstore.pg_delta_3394584009"(cn_5002 pid=53078)
    +INFO:  analyzing "public.customer_info"(cn_5002 pid=53078)
    +INFO:  analyzing "public.customer_info" inheritance tree(cn_5002 pid=53078)
    +ANALYZE
    +
    + +
    +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0246.html b/docs/dws/dev/dws_06_0246.html new file mode 100644 index 00000000..8e021134 --- /dev/null +++ b/docs/dws/dev/dws_06_0246.html @@ -0,0 +1,26 @@ + + +

DEALLOCATE

+

Function

DEALLOCATE deallocates a previously prepared statement. If you do not explicitly deallocate a prepared statement, it is deallocated when the session ends.

+

The PREPARE key word is always ignored.

+
+

Precautions

None

+
+

Syntax

1
DEALLOCATE [ PREPARE ] { name | ALL };
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of the prepared statement to deallocate.

    +
  • ALL

    Deallocates all prepared statements.

    +
+
+

Examples

None

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0247.html b/docs/dws/dev/dws_06_0247.html new file mode 100644 index 00000000..3440217a --- /dev/null +++ b/docs/dws/dev/dws_06_0247.html @@ -0,0 +1,44 @@ + + +

DO

+

Function

DO executes an anonymous code block.

+

A code block is a function body without parameters that returns void. It is analyzed and executed at the same time.

+
+

Precautions

  • Before using a programming language, install it in the current database using CREATE LANGUAGE. If no language is specified, plpgsql is installed by default.
  • To use an untrusted language, you must be a system administrator or have the USAGE permission for programming languages.
+
+

Syntax

1
DO [ LANGUAGE lang_name ] code;
+
+ +
+
+

Parameter Description

  • lang_name

    Parses the programming language used by the code. If not specified, the default value plpgsql is used.

    +
  • code

    Specifies executable programming language code. The language is specified as a string.

    +
+
+

Examples

Grant user webuser all the operation permissions on views in the tpcds schema.
1
+2
+3
+4
+5
+6
+7
+8
DO $$DECLARE r record;
+BEGIN
+    FOR r IN SELECT c.relname,n.nspname FROM pg_class c,pg_namespace n 
+             WHERE c.relnamespace = n.oid AND n.nspname = 'tpcds' AND relkind IN ('r','v')
+    LOOP
+        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
+    END LOOP;
+END$$;
+
+ +
+
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0248.html b/docs/dws/dev/dws_06_0248.html new file mode 100644 index 00000000..6153fa3c --- /dev/null +++ b/docs/dws/dev/dws_06_0248.html @@ -0,0 +1,33 @@ + + +

EXECUTE

+

Function

EXECUTE executes a prepared statement. A prepared statement only exists in the lifecycle of a session. Therefore, only prepared statements created using PREPARE earlier in the session can be executed.

+
+

Precautions

If the PREPARE statement creating the prepared statement declares certain parameters, the parameter set transferred to the EXECUTE statement must be compatible. Otherwise, an error occurs.

+
+

Syntax

1
EXECUTE name [ ( parameter [, ...] ) ];
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of the statement to be executed.

    +
  • parameter

    Specifies a parameter of the prepared statement. It must be an expression that generates a value compatible with the data type specified when the prepared statement is created.

    +
+
+

Examples

Create and run a prepared statement for the INSERT statement.
1
+2
PREPARE insert_reason(integer,character(16),character(100)) AS INSERT INTO tpcds.reason_t1 VALUES($1,$2,$3);
+EXECUTE insert_reason(52, 'AAAAAAAADDAAAAAA', 'reason 52'); 
+
+ +
+
+
+

Helpful Links

PREPARE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0249.html b/docs/dws/dev/dws_06_0249.html new file mode 100644 index 00000000..4fbba8d1 --- /dev/null +++ b/docs/dws/dev/dws_06_0249.html @@ -0,0 +1,38 @@ + + +

EXECUTE DIRECT

+

Function

EXECUTE DIRECT executes an SQL statement on a specified node. Generally, the cluster automatically allocates an SQL statement to proper nodes. EXECUTE DIRECT is mainly used for database maintenance and testing.

+
+

Precautions

  • Only a system administrator can run the EXECUTE DIRECT statement.
  • To ensure data consistency across nodes, only the SELECT statement can be used. Transaction statements, DDL, and DML cannot be used.
  • When the AVG aggregation calculation is performed on the specified DN using such statements, the result set is returned in array, for example, {4,2}. The result of sum is 4, and that of count is 2.
  • Do not run the SELECT statement on nodes where CNs reside because user table data is not stored there.
  • EXECUTE DIRECT cannot be nested. If the inner SQL statement to be executed is also EXECUTE DIRECT, run only the bottom-layer EXECUTE DIRECT statement.
+
+

Syntax

1
EXECUTE DIRECT ON ( nodename [, ... ] ) query ;
+
+ +
+
+

Parameter Description

  • nodename

    Specifies the node name.

    +

    Value range: An existing node.

    +
  • query

    Specifies the query SQL statement that you want to execute.

    +
+
+

Examples

Query records in table tpcds.customer_address on the dn_6001_6002 node.

+
1
+2
+3
+4
+5
EXECUTE DIRECT ON(dn_6001_6002) 'select count(*) from tpcds.customer_address';
+ count 
+-------
+ 16922
+(1 row)
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0250.html b/docs/dws/dev/dws_06_0250.html new file mode 100644 index 00000000..04e2d312 --- /dev/null +++ b/docs/dws/dev/dws_06_0250.html @@ -0,0 +1,291 @@ + + +

GRANT

+

Function

GRANT grants permissions to roles and users.

+

GRANT is used in the following scenarios:

+
  • Granting system permissions to roles or users

    System permissions are also called user attributes, including SYSADMIN, CREATEDB, CREATEROLE, AUDITADMIN, and LOGIN.

    +

    They can be specified only by the CREATE ROLE or ALTER ROLE syntax. The SYSADMIN permission can be granted and revoked using GRANT ALL PRIVILEGE and REVOKE ALL PRIVILEGE, respectively. System permissions cannot be inherited by a user from a role, and cannot be granted using PUBLIC.

    +
  • Granting database object permissions to roles or users

    Grant permissions related to database objects (tables, views, specified columns, databases, functions, and schemas) to specified roles or users.

    +

    GRANT grants specified database object permissions to one or more roles. These permissions are appended to those already granted, if any.

    +

    GaussDB(DWS) grants the permissions for objects of certain types to PUBLIC. By default, permissions for tables, table columns, sequences, external data sources, external servers, schemas, and tablespace are not granted to PUBLIC. However, permissions for the following objects are granted to PUBLIC: CONNECT and CREATE TEMP TABLE permissions for databases, EXECUTE permission for functions, and USAGE permission for languages and data types (including domains). An object owner can revoke the default permissions granted to PUBLIC and grant permissions to other users as needed. For security purposes, you are advised to create an object and set permissions for it in the same transaction so that other users do not have time windows to use the object. In addition, you can run the ALTER DEFAULT PRIVILEGES statement to modify the initial default permissions.

    +
  • Granting a role's or user's permissions to other roles or users

    Grant a role's or user's permissions to one or more roles or users. In this case, every role or user can be regarded as a set of one or more database permissions.

    +

    If WITH ADMIN OPTION is specified, the member can in turn grant permissions in the role to others, and revoke permissions in the role as well. If a role or user granted with certain permissions is changed or revoked, the permissions inherited from the role or user also change.

    +

    A database administrator can grant permissions to and revoke them from any role or user. Roles having CREATEROLE permission can grant or revoke membership in any role that is not an administrator.

    +
+
+

Precautions

To isolate permissions, GaussDB(DWS) disables WITH GRANT OPTION and TO PUBLIC.

+
+

Syntax

  • Grant the table or view access permission to a specified role or user. Do not perform GRANT on a table partition. Otherwise, an alarm will be generated.
    1
    +2
    +3
    +4
    +5
    +6
    GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE } [, ...] 
    +      | ALL [ PRIVILEGES ] }
    +    ON { [ TABLE ] table_name [, ...]
    +       | ALL TABLES IN SCHEMA schema_name [, ...] }
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the column access permission to a specified role or user.
    1
    +2
    +3
    +4
    +5
    GRANT { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )} [, ...] 
    +      | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    +    ON [ TABLE ] table_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the database access permission to a specified role or user.
    1
    +2
    +3
    +4
    +5
    GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...]
    +      | ALL [ PRIVILEGES ] }
    +    ON DATABASE database_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the domain access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON DOMAIN domain_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +

    The current version does not support granting the domain access permission.

    +
    +
  • Grant the external data source access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON FOREIGN DATA WRAPPER fdw_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the external server access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON FOREIGN SERVER server_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the function access permission to a specified role or user.
    1
    +2
    +3
    +4
    +5
    GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    +    ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
    +       | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the procedural language access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON LANGUAGE lang_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +

    The current version does not support granting the procedural language access permission.

    +
    +
  • Grant the large object access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON LARGE OBJECT loid [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +

    The current version does not support granting the large object access permission.

    +
    +
  • Grant the sequence access permission to a specified role or user.
    1
    +2
    +3
    +4
    +5
    GRANT { { SELECT | UPDATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON { SEQUENCE sequence_name [, ...] 
    +         | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the sub-cluster access permission to a specified role or user. Common users cannot perform GRANT or REVOKE operations on node groups.
    1
    +2
    +3
    +4
    GRANT { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] }
    +    ON NODE GROUP group_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +
  • Grant the schema access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON SCHEMA schema_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +

    When you grant table or view rights to other users, you also need to grant the USAGE permission for the schema that the tables and views belong to. Without this permission, the users granted with the table or view rights can only see the object names, but cannot access them.

    +
    +
  • Grant the type access permission to a specified role or user.
    1
    +2
    +3
    +4
    GRANT { USAGE | ALL [ PRIVILEGES ] }
    +    ON TYPE type_name [, ...]
    +    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ WITH GRANT OPTION ];
    +
    + +
    +

    The current version does not support granting the type access permission.

    +
    +
  • Grant a role's rights to other users or roles.
    1
    +2
    +3
    GRANT role_name [, ...]
    +   TO role_name [, ...]
    +   [ WITH ADMIN OPTION ];
    +
    + +
    +
  • Grant the SYSADMIN permission to a specified role.
    1
    +2
    GRANT ALL { PRIVILEGES | PRIVILEGE }
    +   TO role_name;
    +
    + +
    +
+
+

Parameter Description

GRANT grants the following permissions:

+
  • SELECT

    Allows SELECT from any column, or the specific columns listed, of the specified table, view, or sequence.

    +
  • INSERT

    Allows INSERT of a new row into the specified table.

    +
  • UPDATE

    Allows UPDATE of any column, or the specific columns listed, of the specified table. SELECT ... FOR UPDATE and SELECT ... FOR SHARE also require this permission on at least one column, in addition to the SELECT permission.

    +
  • DELETE

    Allows DELETE of a row from the specified table.

    +
  • TRUNCATE

    Allows TRUNCATE on the specified table.

    +
  • REFERENCES

    To create a foreign key constraint, it is necessary to have this permission on both the referencing and referenced columns.

    +
  • TRIGGER

    To create a trigger, you must have the TRIGGER permission on the table or view.

    +
  • ANALYZE | ANALYSE

    To perform the ANALYZE | ANALYSE operation on a table to collect statistics data, you must have the ANALYZE | ANALYSE permission on the table.

    +
  • CREATE
    • For databases, allows new schemas to be created within the database.
    • For schemas, allows new objects to be created within the schema. To rename an existing object, you must own the object and have this permission for the schema where the object is located.
    • For sub-clusters, allows tables to be created.
    +
  • CONNECT

    Allows the user to connect to the specified database.

    +
  • EXECUTE

    Allows the use of the specified function and the use of any operators that are implemented on top of the function.

    +
  • USAGE
    • For procedural languages, allows the use of the specified language for the creation of functions in that language.
    • For schemas, allows access to objects contained in the specified schema. Without this permission, it is still possible to see the object names.
    • For sequences, allows the use of the nextval function.
    • For sub-clusters, allows users who can access objects contained in the specified schema to access tables in a specified sub-cluster.
    +
  • COMPUTE

    Allows users to perform elastic computing in a computing sub-cluster that they have the compute permission on.

    +
  • ALL PRIVILEGES

    Grants all of the available permissions at once. Only system administrators have permission to run GRANT ALL PRIVILEGES.

    +
+

GRANT parameters are as follows:

+
  • role_name

    Specifies an existing user name.

    +
  • table_name

    Specifies an existing table name.

    +
  • column_name

    Specifies an existing column name.

    +
  • schema_name

    Specifies an existing schema name.

    +
  • database_name

    Specifies an existing database name.

    +
  • function_name

    Specifies an existing function name.

    +
  • sequence_name

    Specifies an existing sequence name.

    +
  • domain_name

    Specifies an existing domain type.

    +
  • fdw_name

    Specifies an existing foreign data wrapper name.

    +
  • lang_name

    Specifies an existing language name.

    +
  • type_name

    Specifies an existing type name.

    +
  • group_name

    Specifies an existing sub-cluster name.

    +
  • argmode

    Specifies the parameter mode.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • arg_name

    Indicates the parameter name.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • arg_type

    Specifies the parameter type.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • loid

    Identifier of the large object that includes this page

    +

    Value range: a string. It must comply with the naming convention.

    +
  • directory_name

    Specifies a directory name.

    +

    Value range: a string. It must comply with the naming convention.

    +
+
+

Examples

  • Grant system permissions to a user or role.
    • Grant all available permissions of user sysadmin to user joe.
      1
      GRANT ALL PRIVILEGES TO joe;
      +
      + +
      +

      Afterward, user joe has the sysadmin permissions.

      +
    +
  • Grant object permissions to a user or role.
    • Grant the SELECT permission on the tpcds.reason table to user joe:
      1
      GRANT SELECT ON TABLE tpcds.reason TO joe;
      +
      + +
      +
    • Grant all permissions of the tpcds.reason table to user kim.
      1
      GRANT ALL PRIVILEGES ON tpcds.reason TO kim;
      +
      + +
      +
    • Grant the usage permission of the schema tpcds to user joe:
      1
      GRANT USAGE ON SCHEMA tpcds TO joe;
      +
      + +
      +

      After the granting succeeds, user joe has all the permissions of the tpcds.reason table, including the add, delete, modify, and query permissions.

      +
    • Grant the query permission for the r_reason_sk, r_reason_id, and r_reason_desc columns and the update permission for the r_reason_desc column in the tpcds.reason table to user joe.
      1
      GRANT select (r_reason_sk,r_reason_id,r_reason_desc),update (r_reason_desc) ON tpcds.reason TO joe;
      +
      + +
      +

      After the granting succeeds, user joe immediately has the query permission of the r_reason_sk and r_reason_id columns in the tpcds.reason table.

      +
      1
      GRANT select (r_reason_sk, r_reason_id) ON tpcds.reason TO joe ;
      +
      + +
      +
    • Grant the EXECUTE permission of the func_add_sql function to user joe.
      1
      GRANT EXECUTE ON FUNCTION func_add_sql TO joe;
      +
      + +
      +
    • Grant the UPDATE permission of the sequence serial to user joe.
      1
      GRANT UPDATE ON SEQUENCE serial TO joe;
      +
      + +
      +
    • Grant the gaussdb database connection permission and schema creation permission to user joe.
      1
      GRANT create,connect on database gaussdb TO joe ;
      +
      + +
      +
    • Grant the tpcds schema access permission and object creation permission to this role, but do not enable it to grant these permissions to others.
      1
      GRANT USAGE,CREATE ON SCHEMA tpcds TO tpcds_manager;
      +
      + +
      +
    +
  • Grant the permissions of a user or role to other users or roles.
    • Grant the permissions of user joe to user manager, and allow manager to grant these permissions to others.
      1
      GRANT joe TO manager WITH ADMIN OPTION;
      +
      + +
      +
    • Grant the permissions of user manager to user senior_manager.
      1
      GRANT manager TO senior_manager;
      +
      + +
      +
    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0251.html b/docs/dws/dev/dws_06_0251.html new file mode 100644 index 00000000..29333225 --- /dev/null +++ b/docs/dws/dev/dws_06_0251.html @@ -0,0 +1,35 @@ + + +

PREPARE

+

Function

PREPARE creates a prepared statement.

+

A prepared statement is a performance optimizing object on the server. When the PREPARE statement is executed, the specified query is parsed, analyzed, and rewritten. When the EXECUTE is executed, the prepared statement is planned and executed. This avoids repetitive parsing and analysis. After the PREPARE statement is created, it exists throughout the database session. Once it is created (even if in a transaction block), it will not be deleted when a transaction is rolled back. It can only be deleted by explicitly invoking DEALLOCATE or automatically deleted when the session ends.

+
+

Precautions

None

+
+

Syntax

1
PREPARE name [ ( data_type [, ...] ) ] AS statement;
+
+ +
+
+

Parameter Description

  • name

    Specifies the name of a prepared statement. It must be unique in the current session.

    +
  • data_type

    Specifies the type of a parameter.

    +
  • statement

    Specifies a SELECT, INSERT, UPDATE, DELETE, or VALUES statement.

    +
+
+

Examples

Create and run a prepared statement for the INSERT statement.
1
+2
PREPARE insert_reason(integer,character(16),character(100)) AS INSERT INTO tpcds.reason_t1 VALUES($1,$2,$3); 
+EXECUTE insert_reason(52, 'AAAAAAAADDAAAAAA', 'reason 52'); 
+
+ +
+
+
+

Helpful Links

DEALLOCATE, EXECUTE

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0252.html b/docs/dws/dev/dws_06_0252.html new file mode 100644 index 00000000..e14d57bb --- /dev/null +++ b/docs/dws/dev/dws_06_0252.html @@ -0,0 +1,30 @@ + + +

REASSIGN OWNED

+

Function

REASSIGN OWNED changes the owner of a database.

+

REASSIGN OWNED requires that the system change owners of all the database objects owned by old_roles to new_role.

+
+

Precautions

  • REASSIGN OWNED is often executed before deleting a rule.
  • You must have the permissions on the original and target roles to execute it.
  • The resource management module does not monitor the data switch of the syntax. You need to call select gs_wlm_readjust_user_space(0) to manually calibrate the monitoring data.
+
+

Syntax

1
REASSIGN OWNED BY old_role [, ...] TO new_role;
+
+ +
+
+

Parameter Description

  • old_role

    Specifies the role name of the old owner.

    +
  • new_role

    Specifies the role name of the new owner.

    +
+
+

Examples

Reassign all database objects owned by the joe and jack roles to admin.

+
1
REASSIGN OWNED BY joe, jack TO admin;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0253.html b/docs/dws/dev/dws_06_0253.html new file mode 100644 index 00000000..ad6699a0 --- /dev/null +++ b/docs/dws/dev/dws_06_0253.html @@ -0,0 +1,186 @@ + + +

REVOKE

+

Function

REVOKE revokes rights from one or more roles.

+
+

Precautions

If a non-owner user of an object attempts to REVOKE rights on the object, the command is executed based on the following rules:

+
  • If the user has no right whatsoever on the object, the command will fail outright.
  • If some permissions are available, the command proceeds, but it revokes only those rights for which the user has grant options.
  • The REVOKE ALL PRIVILEGES forms will issue an error message if no grant options are held, while the other forms will issue a warning if grant options for any of the rights named in the command are not held.
  • Do not perform REVOKE to a table partition. Performing REVOKE to a partitioned table incurs an alarm.
+
+

Syntax

  • Revoke the permission of specified table and view.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    REVOKE [ GRANT OPTION FOR ]
    +    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE }[, ...] 
    +    | ALL [ PRIVILEGES ] }
    +    ON { [ TABLE ] table_name [, ...]
    +       | ALL TABLES IN SCHEMA schema_name [, ...] }
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of specified fields on the table.
    1
    +2
    +3
    +4
    +5
    +6
    REVOKE [ GRANT OPTION FOR ]
    +    { {{ SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )}[, ...] 
    +    | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
    +    ON [ TABLE ] table_name [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of a specified database.
    1
    +2
    +3
    +4
    +5
    +6
    REVOKE [ GRANT OPTION FOR ]
    +    { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] 
    +    | ALL [ PRIVILEGES ] }
    +    ON DATABASE database_name [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of a specified function.
    1
    +2
    +3
    +4
    +5
    +6
    REVOKE [ GRANT OPTION FOR ]
    +    { EXECUTE | ALL [ PRIVILEGES ] }
    +    ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
    +       | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of a specified large object.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON LARGE OBJECT loid [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission on a specified sequence.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { { SELECT | UPDATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON SEQUENCE sequence_name [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of a specified schema.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
    +    ON SCHEMA schema_name [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of a specified sub-cluster.
    1
    +2
    +3
    +4
    +5
    REVOKE [ GRANT OPTION FOR ]
    +    { CREATE | USAGE | COMPUTE | ALL [ PRIVILEGES ] }
    +    ON NODE GROUP group_name [, ...]
    +    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the permission of roles based on roles.
    1
    +2
    +3
    REVOKE [ ADMIN OPTION FOR ]
    +    role_name [, ...] FROM role_name [, ...]
    +    [ CASCADE | RESTRICT ];
    +
    + +
    +
  • Revoke the sysadmin permission of roles.
    1
    REVOKE ALL { PRIVILEGES | PRIVILEGE } FROM role_name;
    +
    + +
    +
+
+

Parameter Description

The keyword PUBLIC indicates an implicitly defined group that contains all roles.

+

See Parameter Description of the GRANT command for the meaning of the privileges and related parameters.

+

Permissions of a role include the permissions directly granted to the role, permissions inherited from the parent role, and permissions granted to PUBLIC. Therefore, revoking the SELECT permission on an object from PUBLIC does not necessarily mean that such permission has been revoked from all roles, because the SELECT permission directly granted to roles or inherited from parent roles remains. Similarly, if the SELECT permission is revoked from a user but is not revoked from PUBLIC, the user can still run the SELECT statement.

+

If GRANT OPTION FOR is specified, only the grant option for the right is revoked, not the right itself.

+

If user A holds the UPDATE rights on a table and the WITH GRANT OPTION and has granted them to user B, the rights that user B holds are called dependent rights. If the rights or the grant option held by user A is revoked, the dependent rights still exist. Those dependent rights are also revoked if CASCADE is specified.

+

A user can only revoke rights that were granted directly by that user. If, for example, user A has granted a right with grant option (WITH ADMIN OPTION) to user B, and user B has in turned granted it to user C, then user A cannot revoke the right directly from C. However, user A can revoke the grant option held by user B and use CASCADE. In this manner, the rights held by user C are automatically revoked. For another example, if both user A and user B have granted the same right to C, A can revoke his own grant but not B's grant, so C will still effectively have the right.

+

If the role executing REVOKE holds rights indirectly via more than one role membership path, it is unspecified which containing role will be used to execute the command. In such cases, it is best practice to use SET ROLE to become the specific role you want to do the REVOKE as, and then execute REVOKE. Failure to do so may lead to deleting rights not intended to delete, or not deleting any rights at all.

+
+

Examples

Revoke all permissions of user joe.
1
REVOKE ALL PRIVILEGES FROM joe;
+
+ +
+
+
Revoke the permissions granted in a specified schema.
1
REVOKE USAGE,CREATE ON SCHEMA tpcds FROM tpcds_manager;
+
+ +
+
+

Revoke the CONNECT privilege from user joe.

+
1
REVOKE CONNECT FROM joe;
+
+ +
+

Revoke the membership of role admins from user joe.

+
1
REVOKE admins FROM joe;
+
+ +
+

Revoke all the privileges of user joe for the myView view.

+
1
REVOKE ALL PRIVILEGES ON myView FROM joe;
+
+ +
+

Revoke the public insert permission on the customer_t1 table.

+
1
REVOKE INSERT ON customer_t1 FROM PUBLIC;
+
+ +
+

Revoke user joe's permission for the tpcds schema.

+
1
REVOKE USAGE ON SCHEMA tpcds FROM joe;
+
+ +
+

Revoke the query permissions for r_reason_sk and r_reason_id in the tpcds.reason table from user joe.

+
1
REVOKE select (r_reason_sk, r_reason_id) ON tpcds.reason FROM joe;
+
+ +
+
+

Links

GRANT

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0254.html b/docs/dws/dev/dws_06_0254.html new file mode 100644 index 00000000..39836edb --- /dev/null +++ b/docs/dws/dev/dws_06_0254.html @@ -0,0 +1,42 @@ + + +

TCL Syntax

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0255.html b/docs/dws/dev/dws_06_0255.html new file mode 100644 index 00000000..dfcfc0e4 --- /dev/null +++ b/docs/dws/dev/dws_06_0255.html @@ -0,0 +1,17 @@ + + +

TCL Syntax Overview

+

Transaction Control Language (TCL) controls the time and effect of database transactions and monitors the database.

+

Commit

GaussDB(DWS) uses the COMMIT or END statement to commit transactions. For details, see COMMIT | END.

+
+

Setting a Savepoint

GaussDB(DWS) creates a new savepoint in the current transaction. For details, see SAVEPOINT.

+
+

Rollback

GaussDB(DWS) rolls back the current transaction to the last committed state. For details, see ROLLBACK.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0256.html b/docs/dws/dev/dws_06_0256.html new file mode 100644 index 00000000..fd6f9ea1 --- /dev/null +++ b/docs/dws/dev/dws_06_0256.html @@ -0,0 +1,31 @@ + + +

ABORT

+

Function

ABORT rolls back the current transaction and cancels the changes in the transaction.

+

This command is equivalent to ROLLBACK, and is present only for historical reasons. Now ROLLBACK is recommended.

+
+

Precautions

ABORT has no impact outside a transaction, but will provoke a warning.

+
+

Syntax

1
ABORT [ WORK | TRANSACTION ] ;
+
+ +
+
+

Parameter Description

WORK | TRANSACTION

+

Optional keyword has no effect except increasing readability.

+
+

Examples

Abort a transaction. Performed update operations will be undone.

+
1
ABORT; 
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0257.html b/docs/dws/dev/dws_06_0257.html new file mode 100644 index 00000000..74506a1a --- /dev/null +++ b/docs/dws/dev/dws_06_0257.html @@ -0,0 +1,70 @@ + + +

BEGIN

+

Function

BEGIN may be used to initiate an anonymous block or a single transaction. This section describes the syntax of BEGIN used to initiate an anonymous block. For details about the BEGIN syntax that initiates transactions, see START TRANSACTION.

+

An anonymous block is a structure that can dynamically create and execute stored procedure code instead of permanently storing code as a database object in the database.

+
+

Precautions

None

+
+

Syntax

  • Enable an anonymous block:
    1
    +2
    +3
    +4
    +5
    [DECLARE [declare_statements]] 
    +BEGIN
    +execution_statements  
    +END;
    +/
    +
    + +
    +
  • -- Start a transaction:
    1
    +2
    +3
    +4
    +5
    +6
    +7
    BEGIN [ WORK | TRANSACTION ]
    +  [ 
    +    { 
    +       ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
    +       | { READ WRITE | READ ONLY }
    +      } [, ...] 
    +  ];
    +
    + +
    +
+
+

Parameter Description

  • declare_statements

    Declares a variable, including its name and type, for example, sales_cnt int.

    +
  • execution_statements

    Specifies the statement to be executed in an anonymous block.

    +

    Value range: an existing function name

    +
+
+

Examples

  • Start a transaction block.
    1
    BEGIN;
    +
    + +
    +
  • Start a transaction block at the REPEATABLE READ isolation level.
    1
    BEGIN TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    +
    + +
    +
  • Generate a string using an anonymous block.
    1
    +2
    +3
    BEGIN
    +dbms_output.put_line('Hello');
    +END;
    +
    + +
    +
+
+

Helpful Links

START TRANSACTION

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0258.html b/docs/dws/dev/dws_06_0258.html new file mode 100644 index 00000000..c2131e6f --- /dev/null +++ b/docs/dws/dev/dws_06_0258.html @@ -0,0 +1,28 @@ + + +

CHECKPOINT

+

Function

A checkpoint is a point in the transaction log sequence at which all data files have been updated to reflect the information in the log. All data files will be flushed to a disk.

+

CHECKPOINT forces a transaction log checkpoint. By default, WALs periodically specify checkpoints in a transaction log. You may use gs_guc to specify run-time parameters checkpoint_segments and checkpoint_timeout to adjust the atomized checkpoint intervals.

+
+

Precautions

  • Only a system administrator has the permission to call CHECKPOINT.
  • CHECKPOINT forces an immediate checkpoint when the related command is issued, without waiting for a regular checkpoint scheduled by the system.
+
+

Syntax

1
CHECKPOINT;
+
+ +
+
+

Parameter Description

None

+
+

Examples

Set a checkpoint.

+
1
CHECKPOINT;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0259.html b/docs/dws/dev/dws_06_0259.html new file mode 100644 index 00000000..e77418de --- /dev/null +++ b/docs/dws/dev/dws_06_0259.html @@ -0,0 +1,31 @@ + + +

COMMIT | END

+

Function

COMMIT or END commits all operations of a transaction.

+
+

Precautions

Only the transaction creators or system administrators can run the COMMIT command. The creation and commit operations must be in different sessions.

+
+

Syntax

1
{ COMMIT | END } [ WORK | TRANSACTION ] ;
+
+ +
+
+

Parameter Description

  • COMMIT | END

    Commits the current transaction and makes all changes made by the transaction become visible to others.

    +
  • WORK | TRANSACTION

    Optional keyword has no effect except increasing readability.

    +
+
+

Examples

Commit the transaction to make all changes permanent.

+
1
COMMIT;
+
+ +
+
+

Helpful Links

ROLLBACK

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0260.html b/docs/dws/dev/dws_06_0260.html new file mode 100644 index 00000000..9a41fee5 --- /dev/null +++ b/docs/dws/dev/dws_06_0260.html @@ -0,0 +1,28 @@ + + +

COMMIT PREPARED

+

Function

COMMIT PREPARED commits a prepared two-phase transaction.

+
+

Precautions

  • The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). Exercise caution when enabling the mode. It is used by maintenance engineers for troubleshooting. Common users should not use the mode.
  • Only the transaction creators or system administrators can run the COMMIT command. The creation and commit operations must be in different sessions.
  • The transaction function is maintained automatically by the database, and should be not visible to users.
+
+

Syntax

1
+2
COMMIT PREPARED transaction_id ;
+COMMIT PREPARED transaction_id WITH CSN;
+
+ +
+
+

Parameter Description

  • transaction_id

    Specifies the identifier of the transaction to be submitted. The identifier must be different from those for current prepared transactions.

    +
+
  • CSN(commit sequence number)

    Specifies the sequence number of the transaction to be committed. It is a 64-bit, incremental, unsigned number.

    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0262.html b/docs/dws/dev/dws_06_0262.html new file mode 100644 index 00000000..349a5df2 --- /dev/null +++ b/docs/dws/dev/dws_06_0262.html @@ -0,0 +1,26 @@ + + +

PREPARE TRANSACTION

+

Function

PREPARE TRANSACTION prepares the current transaction for two-phase commit.

+

After this command, the transaction is no longer associated with the current session; instead, its state is fully stored on disk, and there is a high probability that it can be committed successfully, even if a database crash occurs before the commit is requested.

+

Once prepared, a transaction can later be committed or rolled back with COMMIT PREPARED or ROLLBACK PREPARED, respectively. Those commands can be issued from any session, not only the one that executed the original transaction.

+

From the point of view of the issuing session, PREPARE TRANSACTION is not unlike a ROLLBACK command: after executing it, there is no active current transaction, and the effects of the prepared transaction are no longer visible. (The effects will become visible again if the transaction is committed.)

+

If the PREPARE TRANSACTION command fails for any reason, it becomes a ROLLBACK and the current transaction is canceled.

+
+

Precautions

  • The transaction function is maintained automatically by the database, and should be not visible to users.
  • When running the PREPARE TRANSACTION command, increasing the value of max_prepared_transactions in configuration file postgresql.conf. You are advised to set max_prepared_transactions to a value not less than that of max_connections so that one pending prepared transaction is available for each session.
+
+

Syntax

PREPARE TRANSACTION transaction_id;
+
+

Parameter Description

transaction_id

+

An arbitrary identifier that later identifies this transaction for COMMIT PREPARED or ROLLBACK PREPARED. The identifier must be different from those for current prepared transactions.

+

Value range: The identifier must be written as a string literal, and must be less than 200 bytes long.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0263.html b/docs/dws/dev/dws_06_0263.html new file mode 100644 index 00000000..e426a0fa --- /dev/null +++ b/docs/dws/dev/dws_06_0263.html @@ -0,0 +1,56 @@ + + +

SAVEPOINT

+

Function

SAVEPOINT establishes a new savepoint within the current transaction.

+

A savepoint is a special mark inside a transaction that rolls back all commands that are executed after the savepoint was established, restoring the transaction state to what it was at the time of the savepoint.

+
+

Precautions

  • Use ROLLBACK TO SAVEPOINT to roll back to a savepoint. Use RELEASE SAVEPOINT to destroy a savepoint but keep the effects of the commands executed after the savepoint was established.
  • Savepoints can only be established when inside a transaction block. There can be multiple savepoints defined within a transaction.
  • SAVEPOINT cannot be used for functions, anonymous blocks, or stored procedures.
  • In the case of an unexpected termination of a distributed thread or process caused by a node or connection failure, or of an error caused by the inconsistency between source and destination table structures in a COPY FROM operation, the transaction cannot be rolled back to the established savepoint. Instead, the entire transaction will be rolled back.
  • According to the SQL standard, a savepoint is destroyed automatically when another savepoint with the same name is established. In GaussDB(DWS), old savepoints are kept, though only the most recent one will be used for rollback or release. Releasing the newer savepoint with RELEASE SAVEPOINT will cause the older one to again become accessible to ROLLBACK TO SAVEPOINT and RELEASE SAVEPOINT. Except for this, SAVEPOINT is fully SQL conforming.
+
+

Syntax

SAVEPOINT savepoint_name;
+
+

Parameter Description

savepoint_name

+

Specifies the name of a new savepoint.

+
+

Examples

  • Create a savepoint and undo all commands executed after the savepoint is created.
    1
    +2
    +3
    +4
    +5
    +6
    +7
    START TRANSACTION;
    +INSERT INTO table1 VALUES (1);
    +SAVEPOINT my_savepoint;
    +INSERT INTO table1 VALUES (2);
    +ROLLBACK TO SAVEPOINT my_savepoint;
    +INSERT INTO table1 VALUES (3);
    +COMMIT;
    +
    + +
    +

    Query the table content, which should contain 1 and 3 but not 2, because 2 has been rolled back.

    +
  • Create and then destroy a savepoint.
    1
    +2
    +3
    +4
    +5
    +6
    START TRANSACTION;
    +INSERT INTO table1 VALUES (3);
    +SAVEPOINT my_savepoint;
    +INSERT INTO table1 VALUES (4);
    +RELEASE SAVEPOINT my_savepoint;
    +COMMIT;
    +
    + +
    +

    Query the table content, which should contain both 3 and 4.

    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0264.html b/docs/dws/dev/dws_06_0264.html new file mode 100644 index 00000000..8d7faf90 --- /dev/null +++ b/docs/dws/dev/dws_06_0264.html @@ -0,0 +1,45 @@ + + +

SET TRANSACTION

+

Function

SET TRANSACTION sets the characteristics of the current transaction. It has no effect on any subsequent transactions. Available transaction characteristics include the transaction separation level and transaction access mode (read/write or read only).

+
+

Precautions

None

+
+

Syntax

Set the isolation level and access mode of the transaction.
1
+2
+3
{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION }
+  { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
+  | { READ WRITE | READ ONLY } } [, ...]
+
+ +
+
+
+

Parameter Description

  • LOCAL

    Indicates that the specified command takes effect only for the current transaction.

    +
  • SESSION

    Indicates that the specified parameters take effect for the current session.

    +

    Value range: a string. It must comply with the naming convention.

    +
  • ISOLATION_LEVEL_CLAUSE
    Specifies the transaction isolation level that determines the data that a transaction can view if other concurrent transactions exist.
    • The isolation level of a transaction cannot be reset after the first clause (INSERT, DELETE, UPDATE, FETCH, COPY) for modifying data is executed in the transaction.
    +
    +
    +

    Valid value:

    +
    • READ COMMITTED: Only committed data is read. This is the default.
    • READ UNCOMMITTED: GaussDB(DWS) does not support READ UNCOMMITTED. If READ UNCOMMITTED is set, READ COMMITTED is executed instead.
    • REPEATABLE READ: Only the data committed before transaction start is read. Uncommitted data or data committed in other concurrent transactions cannot be read.
    • SERIALIZABLE: GaussDB(DWS) does not support SERIALIZABLE. If SERIALIZABLE is set, REPEATABLE READ is executed instead.
    +
  • READ WRITE | READ ONLY

    Specifies the transaction access mode (read/write or read only).

    +
+
+

Examples

Set the isolation level of the current transaction to READ COMMITTED and the access mode to READ ONLY.

+
1
+2
+3
START TRANSACTION;
+SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;
+COMMIT;
+
+ +
+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0265.html b/docs/dws/dev/dws_06_0265.html new file mode 100644 index 00000000..1c464275 --- /dev/null +++ b/docs/dws/dev/dws_06_0265.html @@ -0,0 +1,78 @@ + + +

START TRANSACTION

+

Function

START TRANSACTION starts a transaction. If the isolation level, read/write mode, or deferrable mode is specified, a new transaction will have those characteristics. You can also specify them using SET TRANSACTION.

+
+

Precautions

None

+
+

Syntax

Format 1: START TRANSACTION

+
1
+2
+3
+4
+5
+6
+7
START TRANSACTION
+  [ 
+    { 
+       ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
+       | { READ WRITE | READ ONLY }
+     } [, ...] 
+  ];
+
+ +
+

Format 2: BEGIN

+
1
+2
+3
+4
+5
+6
+7
BEGIN [ WORK | TRANSACTION ]
+  [ 
+    { 
+       ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ }
+       | { READ WRITE | READ ONLY }
+      } [, ...] 
+  ];
+
+ +
+
+

Parameter Description

  • WORK | TRANSACTION

    Optional keyword in BEGIN format without functions.

    +
  • ISOLATION LEVEL

    Specifies the transaction isolation level that determines the data that a transaction can view if other concurrent transactions exist.

    +

    The isolation level of a transaction cannot be reset after the first clause (INSERT, DELETE, UPDATE, FETCH, COPY) for modifying data is executed in the transaction.

    +
    +

    Valid value:

    +
    • READ COMMITTED: Only committed data is read. This is the default.
    • READ UNCOMMITTED: GaussDB(DWS) does not support READ UNCOMMITTED. If READ UNCOMMITTED is set, READ COMMITTED is executed instead.
    • REPEATABLE READ: Only the data committed before transaction start is read. Uncommitted data or data committed in other concurrent transactions cannot be read.
    • SERIALIZABLE: GaussDB(DWS) does not support SERIALIZABLE. If SERIALIZABLE is set, REPEATABLE READ is executed instead.
    +
  • READ WRITE | READ ONLY

    Specifies the transaction access mode (read/write or read only).

    +
+
+

Examples

  • Start a transaction in default mode.
    1
    +2
    +3
    START TRANSACTION;
    +SELECT * FROM tpcds.reason;
    +END;
    +
    + +
    +
  • Start a transaction with the isolation level being READ COMMITTED and the access mode being READ WRITE.
    1
    +2
    +3
    START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
    +SELECT * FROM tpcds.reason;
    +COMMIT;
    +
    + +
    +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0266.html b/docs/dws/dev/dws_06_0266.html new file mode 100644 index 00000000..d856d621 --- /dev/null +++ b/docs/dws/dev/dws_06_0266.html @@ -0,0 +1,31 @@ + + +

ROLLBACK

+

Function

Rolls back the current transaction and backs out all updates in the transaction.

+

ROLLBACK backs out of all changes that a transaction makes to a database if the transaction fails to be executed due to a fault.

+
+

Precautions

If a ROLLBACK statement is executed out of a transaction, no error occurs, but a warning information is displayed.

+
+

Syntax

1
ROLLBACK [ WORK | TRANSACTION ];
+
+ +
+
+

Parameter Description

WORK | TRANSACTION

+

Optional keyword that more clearly illustrates the syntax.

+
+

Examples

Undo all changes in the current transaction.

+
1
ROLLBACK;
+
+ +
+
+

Helpful Links

COMMIT | END

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0267.html b/docs/dws/dev/dws_06_0267.html new file mode 100644 index 00000000..e812b82b --- /dev/null +++ b/docs/dws/dev/dws_06_0267.html @@ -0,0 +1,42 @@ + + +

RELEASE SAVEPOINT

+

Function

RELEASE SAVEPOINT destroys a savepoint previously defined in the current transaction.

+

Destroying a savepoint makes it unavailable as a rollback point, but it has no other user visible behavior. It does not undo the effects of commands executed after the savepoint was established. To do that, use ROLLBACK TO SAVEPOINT. Destroying a savepoint when it is no longer needed allows the system to reclaim some resources earlier than transaction end.

+

RELEASE SAVEPOINT also destroys all savepoints that were established after the named savepoint was established.

+
+

Precautions

  • Specifying a savepoint name that was not previously defined causes an error.
  • It is not possible to release a savepoint when the transaction is in an aborted state.
  • If multiple savepoints have the same name, only the one that was most recently defined is released.
+
+

Syntax

1
RELEASE [ SAVEPOINT ] savepoint_name;
+
+ +
+
+

Parameter Description

savepoint_name

+

Specifies the name of the savepoint you want to destroy.

+
+

Examples

Create and then destroy a savepoint.

+
1
+2
+3
+4
+5
+6
BEGIN;
+    INSERT INTO tpcds.table1 VALUES (3);
+    SAVEPOINT my_savepoint;
+    INSERT INTO tpcds.table1 VALUES (4);
+    RELEASE SAVEPOINT my_savepoint;
+COMMIT;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0268.html b/docs/dws/dev/dws_06_0268.html new file mode 100644 index 00000000..8fafbb5b --- /dev/null +++ b/docs/dws/dev/dws_06_0268.html @@ -0,0 +1,24 @@ + + +

ROLLBACK PREPARED

+

Function

ROLLBACK PREPARED cancels a transaction ready for two-phase committing.

+
+

Precautions

  • The function is only available in maintenance mode (when GUC parameter xc_maintenance_mode is on). Exercise caution when enabling the mode. It is used by maintenance engineers for troubleshooting. Common users should not use the mode.
  • Only the user that initiates a transaction or the system administrator can roll back the transaction.
  • The transaction function is maintained automatically by the database, and should be not visible to users.
+
+

Syntax

1
ROLLBACK PREPARED transaction_id ;
+
+ +
+
+

Parameter Description

transaction_id

+

Specifies the identifier of the transaction to be submitted. The identifier must be different from those for current prepared transactions.

+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0269.html b/docs/dws/dev/dws_06_0269.html new file mode 100644 index 00000000..a7936adf --- /dev/null +++ b/docs/dws/dev/dws_06_0269.html @@ -0,0 +1,60 @@ + + +

ROLLBACK TO SAVEPOINT

+

Function

ROLLBACK TO SAVEPOINT rolls back to a savepoint. It implicitly destroys all savepoints that were established after the named savepoint.

+

Rolls back all commands that were executed after the savepoint was established. The savepoint remains valid and can be rolled back to again later, if needed.

+
+

Precautions

  • Specifying a savepoint name that has not been established is an error.
  • Cursors have somewhat non-transactional behavior with respect to savepoints. Any cursor that is opened inside a savepoint will be closed when the savepoint is rolled back. If a previously opened cursor is affected by a FETCH or MOVE command inside a savepoint that is later rolled back, the cursor remains at the position that FETCH left it pointing to (that is, the cursor motion caused by FETCH is not rolled back). Closing a cursor is not undone by rolling back, either. A cursor whose execution causes a transaction to abort is put in a cannot-execute state, so while the transaction can be restored using ROLLBACK TO SAVEPOINT, the cursor can no longer be used.
  • Use ROLLBACK TO SAVEPOINT to roll back to a savepoint. Use RELEASE SAVEPOINT to destroy a savepoint but keep the effects of the commands executed after the savepoint was established.
+
+

Syntax

1
ROLLBACK [ WORK | TRANSACTION ] TO [ SAVEPOINT ] savepoint_name;
+
+ +
+
+

Parameter Description

savepoint_name

+

Rolls back to a savepoint.

+
+

Examples

Undo the effects of the commands executed after my_savepoint was established.

+
1
ROLLBACK TO SAVEPOINT my_savepoint;
+
+ +
+

Cursor positions are not affected by savepoint rollback.

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
BEGIN;
+DECLARE foo CURSOR FOR SELECT 1 UNION SELECT 2;
+SAVEPOINT foo;
+FETCH 1 FROM foo;
+ ?column? 
+----------
+        1
+ROLLBACK TO SAVEPOINT foo;
+FETCH 1 FROM foo;
+ ?column? 
+----------
+        2
+COMMIT;
+
+ +
+
+ +
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0270.html b/docs/dws/dev/dws_06_0270.html new file mode 100644 index 00000000..e8ea7deb --- /dev/null +++ b/docs/dws/dev/dws_06_0270.html @@ -0,0 +1,22 @@ + + +

GIN Indexes

+

+
+
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0271.html b/docs/dws/dev/dws_06_0271.html new file mode 100644 index 00000000..8aa18a3e --- /dev/null +++ b/docs/dws/dev/dws_06_0271.html @@ -0,0 +1,14 @@ + + +

Introduction

+

Generalized Inverted Index (GIN) is designed for handling cases where the items to be indexed are composite values, and the queries to be handled by the index need to search for element values in the composite items. For example, the items could be documents, and the queries could be searches for documents containing specific words.

+

We use the word "item" to refer to a composite value that is to be indexed, and the word "key" to refer to an element value. GIN stores and searches for keys, not item values.

+

A GIN index stores a set of (key, posting list) key-value pairs, where a posting list is a set of row IDs in which the key occurs. The same row ID can appear in multiple posting lists, since an item can contain more than one key. Each key value is stored only once, so a GIN index is very compact for cases where the same key appears many times.

+

GIN is generalized in the sense that the GIN access method code does not need to know the specific operations that it accelerates. Instead, it uses custom strategies defined for particular data types. The strategy defines how keys are extracted from indexed items and query conditions, and how to determine whether a row that contains some of the key values in a query actually satisfies the query.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0272.html b/docs/dws/dev/dws_06_0272.html new file mode 100644 index 00000000..436b738d --- /dev/null +++ b/docs/dws/dev/dws_06_0272.html @@ -0,0 +1,31 @@ + + +

Scalability

+

The GIN interface has a high level of abstraction, requiring the access method implementer only to implement the semantics of the data type being accessed. The GIN layer itself takes care of concurrency, logging and searching the tree structure.

+

All it takes to get a GIN access method working is to implement multiple user-defined methods, which define the behavior of keys in the tree and the relationships between keys, indexed items, and indexable queries. In short, GIN combines extensibility with generality, code reuse, and a clean interface.

+

There are four methods that an operator class for GIN must provide:

+
  • int compare(Datum a, Datum b)

    Compares two keys (not indexed items) and returns an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second. Null keys are never passed to this function.

    +
+
  • Datum *extractValue(Datum itemValue, int32 *nkeys, bool **nullFlags)

    Returns a palloc'd array of keys given an item to be indexed. The number of returned keys must be stored into *nkeys. If any of the keys can be null, also palloc an array of *nkeys bool fields, store its address at *nullFlags, and set these null flags as needed. *nullFlags can be left NULL (its initial value) if all keys are non-null. The returned value can be NULL if the item contains no keys.

    +
+
  • Datum *extractQuery(Datum query, int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer **extra_data, bool **nullFlags, int32 *searchMode)

    Returns a palloc'd array of keys given a value to be queried; that is, query is the value on the right-hand side of an indexable operator whose left-hand side is the indexed column. n is the strategy number of the operator within the operator class. Often, extractQuery will need to consult n to determine the data type of query and the method it should use to extract key values. The number of returned keys must be stored into *nkeys. If any of the keys can be null, also palloc an array of *nkeys bool fields, store its address at *nullFlags, and set these null flags as needed. *nullFlags can be left NULL (its initial value) if all keys are non-null. The returned value can be NULL if the query contains no keys.

    +

    searchMode is an output argument that allows extractQuery to specify details about how the search will be done. If *searchMode is set to GIN_SEARCH_MODE_DEFAULT (which is the value it is initialized to before call), only items that match at least one of the returned keys are considered candidate matches. If *searchMode is set to GIN_SEARCH_MODE_INCLUDE_EMPTY, then in addition to items containing at least one matching key, items that contain no keys at all are considered candidate matches. (This mode is useful for implementing is-subset-of operators, for example.) If *searchMode is set to GIN_SEARCH_MODE_ALL, then all non-null items in the index are considered candidate matches, whether they match any of the returned keys or not.

    +

    pmatch is an output argument for use when partial match is supported. To use it, extractQuery must allocate an array of *nkeys Booleans and store its address at *pmatch. Each element of the array should be set to TRUE if the corresponding key requires partial match, FALSE if not. If *pmatch is set to NULL then GIN assumes partial match is not required. The variable is initialized to NULL before call, so this argument can simply be ignored by operator classes that do not support partial match.

    +

    extra_data is an output argument that allows extractQuery to pass additional data to the consistent and comparePartial methods. To use it, extractQuery must allocate an array of *nkeys pointers and store its address at *extra_data, then store whatever it wants to into the individual pointers. The variable is initialized to NULL before call, so this argument can simply be ignored by operator classes that do not require extra data. If *extra_data is set, the whole array is passed to the consistent method, and the appropriate element to the comparePartial method.

    +
+
  • bool consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])

    Returns TRUE if an indexed item satisfies the query operator with StrategyNumber n (or might satisfy it, if the recheck indication is returned). This function does not have direct access to the indexed item's value, since GIN does not store items explicitly. Rather, what is available is knowledge about which key values extracted from the query appear in a given indexed item. The check array has length nkeys, which is the same as the number of keys previously returned by extractQuery for this query datum. Each element of the check array is TRUE if the indexed item contains the corresponding query key, for example, if (check[i] == TRUE), the i-th key of the extractQuery result array is present in the indexed item. The original query datum is passed in case the consistent method needs to consult it, and so are the queryKeys[] and nullFlags[] arrays previously returned by extractQuery. extra_data is the extra-data array returned by extractQuery, or NULL if none.

    +

    When extractQuery returns a null key in queryKeys[], the corresponding check[] element is TRUE if the indexed item contains a null key; that is, the semantics of check[] are like IS NOT DISTINCT FROM. The consistent function can examine the corresponding nullFlags[] element if it needs to tell the difference between a regular value match and a null match.

    +

    On success, *recheck should be set to TRUE if the heap tuple needs to be rechecked against the query operator, or FALSE if the index test is exact. That is, a FALSE return value guarantees that the heap tuple does not match the query; a TRUE return value with *recheck set to FALSE guarantees that the heap tuple does match the query; and a TRUE return value with *recheck set to TRUE means that the heap tuple might match the query, so it needs to be fetched and rechecked by evaluating the query operator directly against the originally indexed item.

    +
+

Optionally, an operator class for GIN can supply the following method:

+
  • int comparePartial(Datum partial_key, Datum key, StrategyNumber n, Pointer extra_data)

    Compares a partial-match query key to an index key. Returns an integer whose sign indicates the result: less than zero means the index key does not match the query, but the index scan should continue; zero means that the index key matches the query; greater than zero indicates that the index scan should stop because no more matches are possible. The strategy number n of the operator that generated the partial match query is provided, in case its semantics are needed to determine when to end the scan. Also, extra_data is the corresponding element of the extra-data array made by extractQuery, or NULL if none. Null keys are never passed to this function.

    +
+

To support "partial match" queries, an operator class must provide the comparePartial method, and its extractQuery method must set the pmatch parameter when a partial-match query is encountered. For details, see Partial Match Algorithm.

+

The actual data types of the various Datum values mentioned in this section vary depending on the operator class. The item values passed to extractValue are always of the operator class's input type, and all key values must be of the class's STORAGE type. The type of the query argument passed to extractQuery, consistent and triConsistent is whatever is specified as the right-hand input type of the class member operator identified by the strategy number. This need not be the same as the item type, so long as key values of the correct type can be extracted from it.

+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0273.html b/docs/dws/dev/dws_06_0273.html new file mode 100644 index 00000000..ac292b5f --- /dev/null +++ b/docs/dws/dev/dws_06_0273.html @@ -0,0 +1,18 @@ + + +

Implementation

+

Internally, a GIN index contains a B-tree index constructed over keys, where each key is an element of one or more indexed items (a member of an array, for example) and where each tuple in a leaf page contains either a pointer to a B-tree of heap pointers (a "posting tree"), or a simple list of heap pointers (a "posting list") when the list is small enough to fit into a single index tuple along with the key value.

+

Multi-column GIN indexes are implemented by building a single B-tree over composite values (column number, key value). The key values for different columns can be of different types.

+

GIN Fast Update Technique

Updating a GIN index tends to be slow because of the intrinsic nature of inverted indexes: inserting or updating one heap row can cause many inserts into the index. After the table is vacuumed or if the pending list becomes larger than work_mem, the entries are moved to the main GIN data structure using the same bulk insert techniques used during initial index creation. This greatly increases the GIN index update speed, even counting the additional vacuum overhead. Moreover the overhead work can be done by a background process instead of in foreground query processing.

+

The main disadvantage of this approach is that searches must scan the list of pending entries in addition to searching the regular index, and so a large list of pending entries will slow searches significantly. Another disadvantage is that, while most updates are fast, an update that causes the pending list to become "too large" will incur an immediate cleanup cycle and be much slower than other updates. Proper use of autovacuum can minimize both of these problems.

+

If consistent response time (of entity cleanup and of update) is more important than update speed, use of pending entries can be disabled by turning off the fastupdate storage parameter for a GIN index. For details, see the CREATE INDEX.

+
+

Partial Match Algorithm

GIN can support "partial match" queries, in which the query does not determine an exact match for one or more keys, but the possible matches fall within a narrow range of key values (within the key sorting order determined by the compare support method). The extractQuery method, instead of returning a key value to be matched exactly, returns a key value that is the lower bound of the range to be searched, and sets the pmatch flag true. The key range is then scanned using the comparePartial method. comparePartial must return zero for a matching index key, less than zero for a non-match that is still within the range to be searched, or greater than zero if the index key is past the range that could match.

+
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0274.html b/docs/dws/dev/dws_06_0274.html new file mode 100644 index 00000000..aab31388 --- /dev/null +++ b/docs/dws/dev/dws_06_0274.html @@ -0,0 +1,17 @@ + + +

GIN Tips and Tricks

+

Create vs. Insert

+

Insertion into a GIN index can be slow due to the likelihood of many keys being inserted for each item. So, for bulk insertions into a table, it is advisable to drop the GIN index and recreate it after finishing the bulk insertions. GUC parameters related to GIN index creation and query performance as follows:

+
  • maintenance_work_mem

    Build time for a GIN index is very sensitive to the maintenance_work_mem setting.

    +
  • work_mem

    During a series of insertions into an existing GIN index that has fastupdate enabled, the system will clean up the pending-entry list whenever the list grows larger than work_mem. To avoid fluctuations in observed response time, it is desirable to have pending-list cleanup occur in the background (that is, via autovacuum). Foreground cleanup operations can be avoided by increasing work_mem or making autovacuum more aggressive. However, if work_mem is increased, a foreground cleanup (if any) will take a longer time.

    +
  • gin_fuzzy_search_limit

    The primary goal of developing GIN indexes is to create support for highly scalable full-text search in GaussDB(DWS). However, a very large set of results may be returned by a full-text query for words that frequently occur. In addition, reading many tuples from the disk and sorting them will consume large numbers of resources, which is unacceptable for production.

    +

    To facilitate controlled execution of such queries, GIN has a configurable soft upper limit on the number of rows returned: the gin_fuzzy_search_limit configuration parameter. It is set to 0 (meaning no limit) by default. If a non-zero limit is set, then the returned set is a subset of the whole result set, chosen at random.

    +
+
+
+ +
+ diff --git a/docs/dws/dev/dws_06_0275.html b/docs/dws/dev/dws_06_0275.html new file mode 100644 index 00000000..9a744e88 --- /dev/null +++ b/docs/dws/dev/dws_06_0275.html @@ -0,0 +1,21 @@ + + + +

INSERT and UPSERT

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0276.html b/docs/dws/dev/dws_06_0276.html new file mode 100644 index 00000000..83a3c873 --- /dev/null +++ b/docs/dws/dev/dws_06_0276.html @@ -0,0 +1,23 @@ + + + +

DQL Syntax

+ +

+
+ +
+ + + +
+ diff --git a/docs/dws/dev/dws_06_0277.html b/docs/dws/dev/dws_06_0277.html new file mode 100644 index 00000000..23b98f9e --- /dev/null +++ b/docs/dws/dev/dws_06_0277.html @@ -0,0 +1,15 @@ + + +

DQL Syntax Overview

+

Data Query Language (DQL) can obtain data from tables or views.

+

Query

GaussDB(DWS) provides statements for obtaining data from tables or views. For details, see SELECT.

+
+

Defining a New Table Based on Query Results

GaussDB(DWS) provides a statement for creating a table based on query results and inserting the queried data into the table. For details, see SELECT INTO.

+
+
+
+ +
+ diff --git a/docs/dws/dev/figure/en-us_image_0000001098655278.png b/docs/dws/dev/figure/en-us_image_0000001098655278.png new file mode 100644 index 0000000000000000000000000000000000000000..f7de9ca1c5467ba12df26abb1006a55625421f19 GIT binary patch literal 25863 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

sPGq!8aZGCKV3+W2k^gs8lO`<4J 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 E0Xsd!T>t<8 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655300.png b/docs/dws/dev/figure/en-us_image_0000001098655300.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9d3c19e90890ca0f889a13db0393c708e1e614 GIT binary patch literal 4553 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655330.png b/docs/dws/dev/figure/en-us_image_0000001098655330.png new file mode 100644 index 0000000000000000000000000000000000000000..86309d5bd4defe4073f1ad3c9ed5db564ee63f99 GIT binary patch literal 10493 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 SDeu25LP?0qic|>c2mBu*UH!NK literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655346.png b/docs/dws/dev/figure/en-us_image_0000001098655346.png new file mode 100644 index 0000000000000000000000000000000000000000..a10937813faf2f4f8f5e34f61dd91fbfc5f0623b GIT binary patch literal 3745 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 hp=`ka>e3g~FNzCW1RSA`lEL-qgw literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655366.png b/docs/dws/dev/figure/en-us_image_0000001098655366.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5d4fab4c678adbf56d4e078c8e912bfd2069eb GIT binary patch literal 27393 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 z%0A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 Eg4du@2><{9 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655372.png b/docs/dws/dev/figure/en-us_image_0000001098655372.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9b05c5ebe1ba85523da29552ec3a9992705945 GIT binary patch literal 47024 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655374.png b/docs/dws/dev/figure/en-us_image_0000001098655374.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8a0d6a03fc71be58a68f85c79f950c82e7ddbc GIT binary patch literal 14683 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655392.png b/docs/dws/dev/figure/en-us_image_0000001098655392.png new file mode 100644 index 0000000000000000000000000000000000000000..c39ef8511c72528c33032ff6a87ef54d82f506ff GIT binary patch literal 50217 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

gAy24WD9vaWXMZ3$_~c*S2|E3t9d;!}{Vf&L3i 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655398.jpg b/docs/dws/dev/figure/en-us_image_0000001098655398.jpg new file mode 100644 index 0000000000000000000000000000000000000000..960c3e33f01aac87df80d9b55f1d9990a40803bb GIT binary patch literal 102630 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 z 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 O0%$AzpBEIw%zpq!u{0I{ literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098655436.png b/docs/dws/dev/figure/en-us_image_0000001098655436.png new file mode 100644 index 0000000000000000000000000000000000000000..95fd0c9fc8230f3db6f343a3213d7623b9f4fc77 GIT binary patch literal 2437 zcmd5;`#;nBAOBcO9I3fZ?w1a!hDxL)!VTdu5$ewqw z^8f&e8PVNN3L@Gkp8UHiIwayf&YcBnx#|m|02*%NYy$xFJejSaouXJe&f#J_0PJZM zFNx0Bry(Lt^}L;pS5n|&Sv2{D_HJZ&^2;itCn*a)VFv5WsdH}qFcZ?+DoV@Q;lxc; zHduK*RU43yvYuRqrW;l2NS_5Dup2FB+Q>Fyv}y+gpRmhb*IvpRfZ&e@iyy6bK}Ya> zR|BoN4AX}L!CdE)CZpHceH$W1l`}( zpBx>VUp>!?E@Vo&-{FZfJ|&0LEb2VBKB^LH|M}a(t4IzLW4p$+$ZN|S)a&}|>D}p5t%whU zpQRT2C%<76@V5)qV3!TSg8MGyrbp|8A3`HJZDvK$M;0*#!AdIiG4XMS26bcNM)a4> zJ|A1dA(Pg&Twk3D2vNoJT|8wwmS)K(8qvi(6Y1Bm%LuS8;DQZ6bg|-eou}nWpJtEaX-=JzGO;-`_E*VPVh{q(Q2D#Sk`5WKCqe?)%uz009nL zdLt(R>3c3W!aZe?WOo(Oe(i+!a_QE$*N@=5v2^<#JPiwTC0<)7tFNS*^|dU3V)Z6J z0dW&T-{aS}tEYLI#Ahs&jns7A<$y{bjVt=WrGlf3Qk>w(LWnbk5LyonWW%h-{oBd35wjAM|l5`a5;n5x}y=Y&E*~z_Y6wJQx?;2m2 zHZy7OuCTeI+R}7l*h->feYulFmqd{Uz2XvOGl7lPnzfXvgmLN2WpaaZ=RTJIt>37< zdBZ;)wWxu%o2}IO&I8p`#8vg^@_|3FSKuS3&lYnBtPBNex1!FC?4fny`uUa#3l`|`HOV|rve{;}$+MdPkL-~Zw*qmiKrxf9rxZvP)n88=!P+)&1AyO#FR z3S`}By@x@r+BdovC}GP3g7(Ls`0g-@HSE+0<3pLpY99B-qre*ZBGp1eLaL^pa$jkd zDZ|s~k;3VXBR%9)f!=mm;2m^UOSfTh;oG;Q`g_m7JT?84hds%9pi_-vH;Wymg)2iJ zpF@GI_y?L}#WY1j`{D~hl>tFXIrUe&h7L%vv!K4-52>ph#RU_-#;uS#&^3h;{x;IE z`DD58#n_6L(Ro@^n(3?`0=(87sM8(Lx~8S1RYQM<=4AzRcof;zo;lvFg0X#{p^~ql z&s&=&FlNe|hq5=_!p(8FX9d4lobNH;`A4?G53K{0nvLH$y)VLqQ>A)wy}qyDyvqwK z4J^uxLGFK_QP(#vcp5h#RLbOiN@f$I)Xke}9o&D<&Mk0S9!V!1Ug<43Gumq>U1a-r z=T=(se%nI-Khly^?YvG|I2VCP-aDrxarBd6Ofq)d?~xUKPp^RU!e;62_I>34zN=%HCX z&9IMzdr)mY-m}J{a0GYNs$IX~mmIUs zNeD}Dbn!kj7KOsTES3SB?vdq^=2I@;`)Bw|=t2|si6bRN{YWNcgY|8&$3VhXaZDwL z${bZ$aj{P-6VB_Ig)!=`TSQK`tw`ot85yj-c7HFq=bH3U)0nsjJKeDhR5UNBd_*>M z+DuRpI7&=H{@w2J_Lt-_wHA*$k4<7%aU!*g-L;X?4O&xd>l!wOkxU%xY6Me(Gj$)}({$63;IpL~&(qhT}Ymt7K?>ZnVCa&uAGb%}rvuJgsJ%5< zxVUclWDDnQwR-1{K<8!Nsz64g%@@OKU#5K(N*2XTzBjm;OX>Om+$K_m;~#rvWG3nv z?2R~UigBR!z^xXt^;rsBLs$k^j!ZwSjL0ITfW;bdcz&ppEf(gWFnn@5fsC z#Gv*O@Okfky}_mfQxw&!IdX)8fr^t<4NC0**yYv$51^|tM!ftlgS9Ma zNwEqNpfj(u%82O>Nwke9nZFUM3`=Q)W-&=(y13tOpc|+3Rm3W4qKpn%V=-N=sHFer cqL;KHHtQej&}-X8Unk(ay^CG#*-IJ!12s2^4FCWD literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098671216.png b/docs/dws/dev/figure/en-us_image_0000001098671216.png new file mode 100644 index 0000000000000000000000000000000000000000..b42a2f1f9c45e37dcbf7a2634f8d9e0404d13cc9 GIT binary patch literal 1983 zcmchY`#%#3AIIm~40W7nCLMPgs>57Pk4qSH$=z7aa?52>a;c7)gD4%BNp7K)k&MU4 zHPW$k!jNTbO^33u6+0_48|K>4>-GE%&kx_v_w#;zfB1fW`{en0yDEb;KmY(h+1<_A z9{`Y2+4liJ>3y|UdHnq#b=BY13GifGleZ7D7)LKh0HD1{aVJ7F(@^#D;zi;in!oQxahzBOENawZzN+Bl3nONU>Cn9k=aS#ZH_b= z-0t-(1?^!UFeNwqqL~tUm-0g08eCK~NDRb3zC+3`$Qw`8C0xNc{35m=DWBUq+3gpOZ=}`aD{cfw7^#*D*%jeXV~eVE&MLJfA! zFJ_j!*sobZfj=$G?rCUsNKrULH9WGOaCdj*>^3?6<-SJ{Lw2h<^>V`PV{Y))I(leC%!8fzwSFzw|XaE zSEpn0I_#gS#96<^RJQd8yun9TLj+sOc^x8P{B(xcQcAMYtitGjd9`&qU~!oqnSka6PdP@WS(zU1c{A|(3hac&DI>#Q~%}!XB&cG(K{J;id{g*8hFr}wE)FguxBVgHs zso4_Dt*M!a`FUf6Rq)NF>E=9iIQ>>9bqJL6TUgR9p9Z2SdQbS!rXthcCiQqwpksYb zG@A)rF%$r}!O_LV(J_BolWaNSkERJC8 zT@GuZULTmfWgojoGKY^k%ynUs&)&NLa?`>g^if-?GoMp16XtbT755WBFOo*sGp|QN zKeiZ;Yd~{=A{C2qb1BeACm6&e9z|bxUus5qD2gO6xH-$>^-K1UW$W3m5WC{cmxDUqG~I=-Wtyb zXyT}D=S-WgA64KeMyOja!^&|-+iVKfSYc;o&*Q zr-W+ITKEzKX=c(F0&^_ZX>(HKOY+Mmbi_(cl{)N3Volo*>a155zud=b_|O~cVUXC# zKwnRAUmxMhP-jGA5R|uI5#VfX=b8iR`uf)A_r_rGN(r3o`Rh=xd(Q;S8ajAdx#tqU zzoN96XoA-!QWW*=m@ZXKB|BU80p+{9@=VwU*`1G9tq%5A|KiE=K;cN`B^!lx>$G%e zx+M(vnYe<{+q-30+{d{SSD?B%9eFfngI(b`>*ln zOW0nf8E5$R!Q{Y;*KI1RdEM9C7MzTL5hFC23%n|+0*!j47_PF?e>`x(onEG@v6Q+e zdYzR!<6n!pycR7Ms@7nrWGH0X*n$4{KVwTAr~@633NY^oyiwiGs+b%OxKRyhB}GM% z0d|q(Q*}iR06SQy*XT%)6pk7chS2hn!o~F6FDY)37UNr9;O(oW#Wbv?fgW0J34%_C zq}$3ZRSDxf5Z(J_)V*cCh27sARvG@XTFw7Ez>dr__RCc7({A7E8Q|{X?fk?kJo{hM C_0v@V literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098671232.png b/docs/dws/dev/figure/en-us_image_0000001098671232.png new file mode 100644 index 0000000000000000000000000000000000000000..af96d21e4a00c7147f1f30e9b76e51f72fe32b6b GIT binary patch literal 32019 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 Rz-8y>WFE*%=G@oy`akTNWMu#V literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098671234.png b/docs/dws/dev/figure/en-us_image_0000001098671234.png new file mode 100644 index 0000000000000000000000000000000000000000..aae9b91f28d5474e0a279007afd8934378e78c41 GIT binary patch literal 6086 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 II_ebhzr|j?ng9R* literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098671238.png b/docs/dws/dev/figure/en-us_image_0000001098671238.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c566b94615d884c92cb7a6aa4212548c5446ee GIT binary patch literal 3304 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 Uhb@oLrxSpwp}D~uJ^Pq{13sG|g#Z8m literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098815108.png b/docs/dws/dev/figure/en-us_image_0000001098815108.png new file mode 100644 index 0000000000000000000000000000000000000000..1b90ff98d6b8611356625c586e995a3d96b79e72 GIT binary patch literal 34735 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

81uTf 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

RXcwb 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 MSlU|DoB1UD2NRhe{Qv*} literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098815188.png b/docs/dws/dev/figure/en-us_image_0000001098815188.png new file mode 100644 index 0000000000000000000000000000000000000000..e0b7ff19368c0a09525d16b7e01c97fe313abc2f GIT binary patch literal 215637 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

MRd4SAi8E>?EdnN8wb@@<%jas;y|N2iEl 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 Cx-$*{ literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098815204.png b/docs/dws/dev/figure/en-us_image_0000001098815204.png new file mode 100644 index 0000000000000000000000000000000000000000..3381656fa01cf4e292617ec667ff2ae79cae0fa0 GIT binary patch literal 71605 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


N9@v&+VW=b6ibbQ}n$w8r=?8OxlSEu-*Ln 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

j{7#}mQ#k*MVWE0ru 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 S{+gEFR)5 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

0nzyJ8(@x}G~7@C+Bg(8t`DPYLvd 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 z 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
%7BDTKq6n|23kK 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

fFg=Nl^>y4v6G)T( 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 KQ!Q7v3He`k6~5L0 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098815232.png b/docs/dws/dev/figure/en-us_image_0000001098815232.png new file mode 100644 index 0000000000000000000000000000000000000000..cc33139552fe08c0814f78ec0fd7b60d3f32a581 GIT binary patch literal 5805 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 bC-V|--i!Nrx=}Mb7=Xaj)z4*}Q$iB}cVjlx literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098815256.png b/docs/dws/dev/figure/en-us_image_0000001098815256.png new file mode 100644 index 0000000000000000000000000000000000000000..3210b21a485aea2e1950c5d9cd0325aa9547aeec GIT binary patch literal 1908 zcmV-)2aEWLP)lOwYPBP1k3larVwcnc;bGC7Ia0Fu#J0D^#w1eRbVa%3bz5)%{o>KpO< z7IoS)-7`L1u-($AU-jy$>gwtlLt{FfPP27cYhVdA@Xr#iX}zSi267Gjs-uVd`}^$h z@URYvZ-skzcb9cKok}vjy}e}*4-XkSd47J*+tkZg&{4bH&RVTjUejK5L3dV{w8f7a z8Om(csFRk+xp9i0Uf85no%{OwIy*W#%5ZQB#@2%&mZ@NKHZhOZ+wFF<;c%EWo6UtR z_3Z2{Cj z>pQ}Z$K&Z>Fqk%*&HTB#x~e56^w1-=K(F-Y6>QaNwQ|^gzaIpv<(aGO+@sNGW>gHk z%EdZmuh*-j3TUKm5`qhktnCF4 z+~_v7h_4SaYv=yZWQubWoq#8Lughl*C{0VzjhwSiTBFTjQ<*PyZWgSZipVz{4nJ#V zI?eM|%= zI>M%?Q$lpgtx&)*CFh2@bvSTQfZeSj7;qT3C1m7STuaBcp{b2z$9)@l$_y8h&(n#4 zSp<%!@fCdq0G}p=cndZq(ue3UM!;cXsU$l$1e6!0I5&7c+OaSjc{%Pq41Iq|2{}eA zt`_d=kaMGOt8_LHaCSp_I`l*GdAJyuMc{ZEU)3i7c)P*d>lFJ|(M4z-+9(Q!NzM(D zjvO33#koTf*b5kfK^ctO5>iGiuBBt!(Dad8yyf6tc^2Qct$d_j=#0mvVZbQWqE^6w z4h9Dv7#u`%magSz+rY?SEYBi2-~k>w6mN@LB$MTB+t3W1aFRnhW$iY=SsJz-vvwbR zlAIf62*tt?{O0B+de_AWHxI^-`#y4o#)`(R;socNn{n&lGQ7w2eJcyPf(8z1jR=hR zL03^uZQywrXN+R$dYWel06 zuLh0a*PVjF*VotV^71m<+}zA)$NcuH(P+%zPEJnpFHmA3d<&yFYCrD#AsFF@U^QoJ z;Lgv_vz?tCJDj(lo}RMP)6;BYV7#jYhMtea!9e?`Pxj_zyi8ma`_jp`)*bUKTHhg|}@83K!Yt$uwi^8v1%YPp7xH zx7qLCzq7r)z3kxNAR7z@jzYCAdgY5H^nURSc^e{Di%g#$QSbo zyAG~+;lwX5FY3y0n0amJYR=i|!{@r|4E`gmCNBmR@qsje%J-j_RGWNGKUlhN6!kQXse< z23U;FxGfe(x+qKIB$d$T*3Mpnx2;&O|V+8hts@j$)}4GeL1k^s9C#e3`3DaGtPtIHAla! zco_O+a)@RKw@fDC`kJ+Q+XCZtie7YTc^bCwWwUc?d;64YOPC+E6irve9LSICqP#Mv zWnsW!pmmwA0emD@Pi#D3tzU&G$LJgwXsIOsB~IwVvCvDvHz(Hb_wzSBRWIUom&c_x z^wg!hNPON3;U~RbuavBQi>-@yDMA4NHW9rXOkQ54Ud6~wgy9$^S1gM*Rdo8(adeSX z-W#(XQZLe7f47Rk6^!mf@K^aShHE6DUPb3dJz96nQJJ959}miA$4NuEcG2Rh;)$m2 zg8pKYOdPvv1Xjf7f|+t6@{)p66uusB?c5ce8#InW z8Ppz!tK{4`6dRo2K*X+-S}0(U_QeDm3y+igvUctdjig3yDH3C1RPc!)L>`M#iyNw>Ec5j$O1~MPl^HrhyN-WD_yR+ZD#x0Km}p5nJ>Z;@mJo0Y;66U4-=OfD75#3djLpBuAwW_0V@N6h0000khNz=+!GCxyzjK z7PFzl5vdq*hF64!nR@m98Sf9z`FVbSlI`(WX(|znUBe^|;MPx#7plM)qS=d`}<U3c%LZjWpPw9_Q{CW4!A zRi0G!DkyMbDG_@vB_Ib1Tj#5=+=~^2HKyl7qhRf`3qh-H)sd6@$km$B*Lk9ajXTp? zPny%*SiE6_A-N@!cAr|PG>6QZBe`;EN++=S@nD0Cn%~^=zfCrtU>?55MfM;p3;Tl8f_LFt-ogcCN~isndm|THxT*@st3TZQ ztl6ZRFv6X-4&5qP!X@~auqPHi7O(z`^TZ4`*F`o`amei4$@S2kz*|I}3{FF>gyQmi zors~6>Fmf^OmcQhPEfy5>LSGWm_=iI-VL~L#K-K@Wp%2xX`D(p>@FU%j z%saje=m|5+&GXd`Yl)}+fiPl77B=t)Q)16Im~OBSx%6*en}^LCeCguPxsvo3{_WRK zHf3CnfPMw9;>UBXBJy+4pWTyh%7#t@>!WG`ZaG`&~8<9d()Z{tc zjds2o$jki~_-*peia(;82IKP9FU_@3BFuv;KTeD?KJ(44u-x%~8vfolW@}u@+r@a# z$GTIQrUvCxwkh;1*nz0f&<|x5f7G%We?L`BTnteXrp6Pu${y&+GZ^cf$@u_!MP$3aIXs(}bCzFZA|7Qmv!4!XXZL6mJM4BI_guGsznS@t!1m{YYu z$+&AwBd-X5G9*K0SMZt1vIGcTUu%$EGGaK4|8C*U^|0L-KQU{TBo!a%o1&Pl=KUfk zO;G)iC>ULMX>l>B%_gqPb)30vQdC-B^Ck;y$$va;XDR51Qa4pp%dIi}#GSC2eDL(9 z>%g(fk}m@|XMf1((XQbLReEhuU|~V%KZD$U*#as&YIM0D%PuW`S$95 zr*s|-l^fteI>M~Mc&&TH;J-T!k~aB|BkXIMlyO@1`(EwR1mGyH%qbdnT={nE3_1S2 zw}z?uxt+S6>+^7?{xP}D@bRHy4Rz-`;vLTu*uw|e?08e@FzgzQqPIk+w$WcnHkkOg ztBjb=hg^^zE;-JzQ9r(>{a1Bp8t$=?N$7OA5DJcY8AILdtI`-Lblp+ojiLN_UzN3$ zvrlbh9uyZRXbqcsOtI%n#d|VsFjO^rM1R&HhqYlXvMs zI2P{`-jyHzZaz|`X=JoTA)nY!4Fhq#U_}SGO!|QBbSpS%$WsjDC;154sbd6{*>gzv zs~qLzxSR0+^o*sng{o%`0PPH3$U;cqB#?0E(4_GHek2gufkk*?Xik}XmjYN@;nCHW Hp11x5ajgKv literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098831058.png b/docs/dws/dev/figure/en-us_image_0000001098831058.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba0afb4a1431d9bbaded4fd7ecc7ace5f312acc GIT binary patch literal 7310 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 K!pSzjKm8Y|@)D&0 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975108.png b/docs/dws/dev/figure/en-us_image_0000001098975108.png new file mode 100644 index 0000000000000000000000000000000000000000..4a70247275278cfdf87482aff4a46a41114a15d2 GIT binary patch literal 18045 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%0Ay;j$>=p}A6?)}LNGn{82YIHUBLvvWGH2A_4625 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

27&h`!9C;S{3C=i+uzg&ocxYD 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
  • +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
    Fnf~)_1qGv%ja=nOQyc@|w<{J+H@4 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

    }@~FM6V{)MkBSm!K} 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̒{y$V&XkPRY} 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�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

    EbowQt13@Wm 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

    4u*dRq#j@ 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%0Am)P^Q!aw>H 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 z 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

    9vTK8uqAHG*MpDt(g zKMqUK<`5(b2}rEba{Yshqj08&<0BQpHbIT$CFtvVD{@Ao{lNP3c{5--%uKTP$TV7Q zn};s`Y^(9wb#566(5iCS=p^~Yj9$Zkw6H~1{~WfyJunu&*x}9AX)KCM{^vR1MBluI z!|FW_L-AHmuzX&DhQ{+lKDbofIk&14-q`n&AH-=Ca3omOdt}~ap;l;&Rzt#-9r>4! zC&5CM!u@zL5ctfLZTjjDRXUvSYrV*s{$lXY$Bk90z@f9!O){&EqFo=2cVKR}1_hvGtAi`Qr?!##l$ zLfV4BcB^T8-+1iPEC@Qdq428t^1u@}`yX@Z-Ljh-)PY^x@Pj7bIJ?4-9-ZKA{(z=g z9>)z|A7yU$mk>`LdLd=P@7~hTSHLqU6zMGD^zM@NEH2U<-_S-!FaDOWklHvy8%zs+ zM;utj<6uQVn3PXS^(JiIHff8O16RzxDIS@j%*M@zg{|4DHoH+d>>~6OQV0eopR3!P z2=bt>)L?6kaigGe)GWzuy0?YSnL5P|yw^)@F<1?kk6dpUu3xb`^AeM8J^vQtd)eeB zt-$P$#VgNS(=8w%9;XzTxg+cE--T!MM9B#_0+3zor?y1m%onW)#{|Y|i2E8%mwsT- z`2BNl;enBoWOVa9mOP=Lv+gb8VP-WA?SgibDddC@`0t z=0z$j(5$Q`Gd3N4Z|rB^jUqz6YN8Ny|7n#nETV|fUWKa75VOlm1nchd{2G4mLY z#ichVbrgdA@M*-OGsT{EBoa7+?qp))>T`?OlC;aq4;4H|@JC>i!Q>bUSbLKkss@0zLF4n2MSfvvi#Dzyjn5uHZCM+rsK z?Vi(CL$&C|Fz&gH(A=IT(mI^n4S_(TazxN0nt?qk9V{SvI%f(q?hAmha>vqr04C_* z7Yb0vk(^tk&pe1j-ci$ivM*U~j^3{2VPhIRsf%7j$qi}GdzX7cMyzJ=P8A>gW57(x z_>~42F^v8o6q-YGZq2d*C3%dCFZ$$T+%!M?_|smIRO`txT8H}##u4_gVeaax6L~2k zK+aB|Px`HO_fJp>Xpm?mARZxQmQkRfF#%tQX^`hHY2V@w62+vV$CLPo2!?zbf61+( z3YaDeD>H8YGi1)Dtf4ZHZ{dL=C#hGiHv9Bacx6FI@P=!f!cwfz%z1{^g?8oa`4N}2 z4y#Xq7h~wIU`Gd^{svudW%_0I=-S-O?BiZd=epnFihT-d4-IiTL;kgBnGHjvx_VFl z0qOc}d*}c!TDUpUb`lOPzrs$!)0Wd&a}YeW0U@Dd^dgUdS<1Z(cJ0)WEW_Q z@*fyH7S6S)hb!sLIZw1&w7J;~vMTlwM9Y>aQV@#IHWWtOU{&~BuyC4m&sY(Pj}fw& z=GbT2WWMcnuEe8A-;?;YFF_TlkHp*-Q;?98N15xPWZQ@n0Rlcl?gU=c0*i zIx}t`ml+LMR;Fs|0!?&?94N|Di4*WzvFevL7D7AM)kdfnm)4mWvg7??gI(o9kD~_Z z^N_YPojVvZLxQ0@NYTn3s;ph4L5W@Rg7yaZU}6_efKG;{d)Z!y{2Yw9r0&mfSDJ|t z`tW=0n!=6?2t#$Civ^!}%x{ERuNivGub^_lX!}H+?J3mQfz?*c)6}#?0_sQ;rXW-` z$cYz!Q-jS=H1p<<7)$Oq;S}$-NBk%~f|um}>P2)Je31%sg$rYX*~v*xS6A0S+b(qm zghYRan6%62o6N-c42Fd_N-1|G@g-ipEwM4(>JqJOMzo}4lE%h@t!>S**m+%X{SAzs z_XHX-mNP-}+!P-#E9()l$d!_^b22zZaSU=6$(jDP@8#n$o*eGZ75{SW#C7 z+}N`}i+@&{Z*YKAH;oA%HySAt76Jv;$B<> z6nB>Z!6{PQ-Q7u%;tqvEa4A;Y-t2dbGsgbQ+2`_mlZ%YC=9==%&!f->@`l>cjvN_a zxwt&~Y~7YzZnzs@)D?o>8_v|pz}}PFbwb{gPXgbxp405@yIGQ(;6E8bR&I3 zMkoJ;jZ-WcI;{(ck=BBch!tkII?meE0Dj|RPJR8Yz`*Omw)X@37e#Z}$xo+>bt@sy zoVSvKSgf#c=DX@S5sCD|nf%uU1iDUc-Sx_jDI0Az)|Pi#ih3ZX5!+wMFLsT z+!OfMIBC&v;o-|p$iqF^vg~d)21oMMoF3ijwz8d z0ua*ls-x6==kjQSc1+JFXbCcLt&Bo)2w9Y8Yfg?(6r{SVE?u7nq7L}BV+*CqA$;Y| z@GEI(Cbe%Euhh9VsWv@p;cNyG@WM#E6*^e*q*=8PQ}5EptxA|gOFUfuwfp7n&)dJV zD$;jaI|@?g7&u-o4TF)VmKja*yDXTWWJ)NPl_tD`;l5gNaBWB`A^VCFSie*Ko z|9Cdc*#Y=f?!x)kR4Dccc6gma(R?OUnKsevnc9Xumo#K=xX5W7WWkM0H6R7Gw*2$4 zIpwpn(iz4tnn378IuL$TvhH&_%{RVk|<_(Jbrcp{ZEx zX*vB(Zo=k4tqXi_#yTJ7;(h?sqSzs6>ceuHT?FghM5*T`08N>N%?^35++3)Z6~dP+ z(l(gWx@tzFJQF18Iy@bgSk&3*EHiYRJ3Mw< zuW)7ZSwWdSw^xno(f7&#YRcr5d)Tw&OBZI52?zB@xC0xI-)bphsQnUASsUfgOWOv4Oz?r3+g(FakEBf<{bOJlp5@ZR0 zQL6~`tj})#8+X?%%!k3OZ0RgtwFf|Q&T$rXfiS%PE$otw3>cH{SKFq6#pbzlXDMJ0 z9K85DJG#>3G&-zsMlq==yGk!uxMqUYcCriJ*qsZ2x!aWib=Inp;?KL&;r21t%8$O( ztVx6tafM_U<8mxaejh#x4_nQ4FMF&A4WNVLR@&VwI%D&O^?#x~>6@c-=(3Gd{+9^x z-vfptvOmY`SO|?E?g3!l=^ShfkoUjk+kH0@xHtd)N|@dj)r&wsY!Tn7vxeojm!DXd zdZy<0%QR&cX$EnCnp^Zsz!S~M&Ud>QZ92VrTbMxr2le_p}R@3Od z!aeXwJt#rll*%$zu2MCzU^ROpvc0USh=^U!*d$WGF-Jt&@RwsOxe%)Puy0s?ei6U_ zBZIeh``}vxK1NJp!J@K#-1@{TJo7qc9MHtHBI-GieDheyf?(XTQ=ob@b;&PI$5C-f zM{tj51O`7OGe$`^U8i5E(L?&1rL~B@Sdo)KD<#mgj4swjJOY4nM>CIzrrspsejmt~ z&9Xo}F<8#F1#=xxkzoIRe)3srv?&NBuvn4|zqhxyCzQ_h_;loAG15I{lS5}if24sq zzC>3+xJbHEhCAQSGeS~!72%OLM=yaLO+JG!uz?@Q{|Cgu#3h#~5#382Zu>^_Y453# z2>*R(@TDI5zSL_GkuLtP&z+$<71hfurnDJIH69AAwzhV4elX<`o92KGqqR0ft;|xm z5MLO=1A4U~z;2<7irbx(ki@X1C$5DZ#o*w>MPr$Y*(ZbO3cmt18U$P}SgyEb!mDe4 z{B)Y9k88@o0x0}BQVQ4;R)rTVynFU2J=eOrSQci#siTy@Jlyz4I@qQOkPCWGm61P! zEuC2oKTgtH-{|L( zUuKhhLb(b&O1LNA5*+-fkyt5V$MiZjx@1ge!rT&sC;D)#f#K8Pe)NvYiKJTFf9!FC zvwEPBdxEkM@@@juU&FtVEFuHJiaE zSeNRX$X1&j5^GZ(YF13t;^^;ASU9XoGD~c+G5+b0l2DT4g^(`3S>ZGePVgG^-##{M zVq~?$0~?73JR8gzH`+nOPPC6d{V>y#TnKz318>Z?X7>EIc<|poYiQ0w@J+C-WJ+j7 z^xVovzAcMlq+UxtM%@QN*mKvm+*g*%Fd8;tw}t`3*KTWAR0V(h{L(j0zPUy-1zQ&i4U&Sa z%qh+bs^Q%8Bu6fVV2+;dweBsxTam9d>y!s&r~Zmf5|)djA}Uu_w>NlpmMAn1qBbA5 zL^`E^H57ds$wRWh5^l;XMMw?ygSspWkOC&B)gM4| zYVyC@pON9OoynP8SPDy<6Cc3>T%YiE4a{bKsN%uZUKKCkQ|;R1O4ygG6S9C*!r}?~ z^;UaVN7vGKCPTh%>@6`smC_7ucmzI}r!LAUeL^Rt0wz)udS*X<+D^R9(!W^Uj1O4& z<2o#SVbtxndm36kVtz^;BzgoUw)qv*>C-&5hw-xulDqpixQlZ$|E`u+%fg{Fg@JGf`MiNRNagCdlU5sdh zut!*R9Gt^scJ0k#A|pv!LX*br;P3ak9i7&jHjIQHG30$VSIUj@O*@wOq`m6{a4r94 z3$>`}>$A4CrB~Rwm{K7mg68X;ZHSgI+n1j?K>`g{Ad2yaucuUm=#g6*=&n?rejK{i z6GoA8SJ+-twPFJfq5%$j-i3sX@?GQL&UN4akzfCp>(MRtT8!jXs!C)eH!EoG?Ervr zk0g68${w9V+8Sd7&K%^4Q!_nb54GydWh%%@(iaFL5C3yHz&_3R8~`2rag$y4QDNXJ zaq&TXC@6FwsbxS5^8V+!P07j)UkD(o;D~JGT*erX9qBf1Q)2cfLq4&Wa~zMRt-)!1 z?CR#{V&^L9f>cSpD~nx3bzo-IryF)3lUsGhGqd@-y(`fX2KJ$|P@p4t zvmRQOoWSK4>Iya>qKi>hBi~9?4pc*k`1hRj|A}r|O=$NYZG0hB=9KYClGTgSX zTxdP5_d55Odwg}oMogIWgqgIGFO)((<)xCF@I*>VZ`JS0{(f$FlJ}CU-&}v{;P<*m zhI|AJmub*DZw+z+L|sWDAc#-y5|_XGYFUErm^c(`vMgk&Yt9gI;`dXNCf1)Y9_X3g zEAgx670+Uoy2+{A{HwS=fFYi z;%!HNn;?E+wUzB%nEq`~HI zP@zw`!m^&*{4&xSsfW^Y+uGG&^mV0N?OJBm3p~9;rutGVqS4ZfwWr4>1xF#N-M~(c z2|U4}Ld3^JAb|Qf^+j`E{z`~-RHeM*FWo)6G#x?MS~{c_;#-k>?=1pbn%JcDdlNue zhOYIZGxf0sapsuna86DfT7B>G$KOvN(nndB?H_oE!7nk|+v9<5KcCvKrxZK@foNjZ zDtt_SPzvx82>BE^a!Rw9-+~Q&elu0nENKS&=mPI<){Q$k%gH?bFQ@%~+=bKdUL5&A zMu`~H8^Swjd<6lB-1k!WR$;1%`2C4{kI4t6=)`{jkY-3KxPqYX4N+v>xZM(jR4&Hb&?ebdOIVtyfYL_-G{edJH13F7& zS>)eWM`STLypEL-H@FJB7-RIkOEOdg^~j%%kXj$A;-paLMS$;JztO!RyepBgDK`+u zHZNIG>JEeVxy)?7z01br2rFoZ?16Zk0Rp?t=2T=@Q~-<*WN&CF;;9KSsSy^i#&U`Y z`!O)H8RD^Mg$b6hu*3Lza%l^!YT@IE1&zsT3^IW%Jg%r~hL0nv@u3oeP>oj8bb02M zFY!{^zAd!Adqmw`HuyovTq9`GoMi^qS+cqvv*z?qf9L(PB!Q8BVcT|o0b}=f*$zGt zSnF5112qqS%IBTv9N76#YfdXRRHdO^2w|PDzN?`c%5eJ}7GrcW(S_>8FUBU`)$|6& zE0&^v3NXhv>Q~r*btjJUT`6Pp#A{NH6#wP5uNd8dxr--y%jXTRh19bZ&ql(`(UDOt zClUaAdc9C8a?sx)GrWU@EA@I z|0C(0`+x3&paz}F{6?eg-4CU^lip&^eazQ@z{-|XC(Nb4g7%rH2KKGAA(kgUcHJ{? zN53APlVm@-nRxpi<;r7h^gaIi^>Sm(xfaAbbHg_;IMcL3|Ip6t5K6Xxd_~@(9(}2^ zLr%q5bX2Tic-o^dLce1y3tN|)=;AXhshPhyIK6W}e8Tg-nuu^CKUMDr7kLqPml^p* ziB3LG+l;XG)ZDi}s&8<27Iw*dHY@5yqNr7J6zU7oT98C>2wt+T`m+L4Js^jBmmPG& zniD+bbf8pK4C$*7ZCtg3Z345?4~cUh%a$kvGiB?QDJB{DG%1@{ZJ^PUd&P2*oBRy@ zu{Zm19^*c32j=Z_dyO=?9_0g>W&V3Lcm{lp)UlWXOalP?xVI^Vj@mYPbqHeK64P2E zShVJpj3iZ*rBI(_P6^MC#eHA0N|Q>wP~x;qSXv$>RlZ(KUaf4zZsje8Lmce`>=ZaC zm*CR5EEE2cloiO>6kcDW38^)HJoCR67n(Vkv+7yac^aX_qA>3QjflVk(+@jF9d>)7 z6GqU*nWb1)sm%Wh-d$0G0!Of3K?%ktV~R$YHuONjoNhFG+RZi3_l%~v7~SzH319A? zzq0J?ie0EQ8=l@O`aOLW(_UuV3weGTXK(1q)$O45s_ZwKd27Aa87|NZ;6q)F`jV1@ z&0D@mJfg5iaB^3eU`rnmX-z3em_IsFw16$r5}xJ-b{JH?=rjV$w5P&8(?n1jHPswQfjM6G2uIknw zPaGymo)s^D{omSg|9=4e{S*E16C(adx^2(YNy0iXrIXz&@A5|Xli$swf{#_pBFz=zcqFrOaRh%p z`}hX7ue1@daihF($>FEb_iXur7(hQnDIAqqmee{)O%x(hmwN8tF3&?qBe*;uo(w@&q)cYos z5+)VNep0B-zg?{k`65_IWGY=rsC?K#SMGKv*j;Xzxi&*vGcsTDV{LO!(=QrX-OsG& z*6>%w_x*E5wJITMhVYUKBN$E zC5k~O^$*6Y4+lk?OBD8Yz+fnHTEE)PE1CmotB!h+W~C;>D!=2jG*z#z)`^QO3b0xJ zv6R4#7yHp1r33N3P)*5`GrU`PtVInUbWC)T^l{8Nq%+);8A_wG8!zrCc4P3=Db~Dw zFDqS%sZ%zrx{|F9j&Mjm3m*@H-NBviDZ-O!QFXa8!QY<##vioRxR4n=yPPb7gB*Tr z{5@|;+jz3KEUnZhFlNH}u!skh%uHXvRFV#yHcEafO;eh&!LMviFaahGt&@D2!I_n% zCE_b8pZS=#l2av%@Wn9k=bvH;D$2>DgXY+6{Ay@1p7d|17QV=MX*pXIUlB7#{yr09 zhg4G(H?sh8uG{7(K*RR~qO?`l_S_2}C*m^P8{|=MI1j$ zF^X`XyCj$O4ONfkXCY~CS^^4u2-adTL6%eTY?RDvRYppqijA*Jac;3EKC>=4v$>lO zow7nF7Z@3d*H`X$w5ODipEplzCU=Jrd*h{=PG{?5P&J>|8Y+%D5$(+$I#Jb>x;*jD z+`Qj{pGAP1Smf-tm0X7;vA4jU{Bx46W?CSz7O$o+XGG$92?EV3{U%j8%J67!R&DI# zKIf(jML~gfi@34Ew<%=I_yeE6t-EPt1@?>+URA$m;6u>&@w29tS%a1OA`#b82AXm* zTDw`pAlpJ@=OVBwMisn=*Cv|{bdCK!vqQ;3vEa2@J+Zero&n@*|9b(An%}Sy; zNp-H(p5HVOncle$7ZRF8%l!sS{E|lN(eA0$oGeBXrD(y68y>`)blF~-W~7Xhu~e=* z1$O`ST{JJRF_)7Z+j?@*MdBfyxNe|qSAoJ~qPa3#Yf?3es9}vywyX0Fn=T8M%c%_b zHfi3XwVLKtM4|#0cCD`!YixrNvG@-D=mC|zxl<~l>z$J*I}VZJ3}6Qqma2Hrts%F1 zIleaFCY8{Z7`ZP*dZ>)Do)Gw@@(ae7Li6+6qq)IFy4LIup`=wGeWx)Dw|7a;|)I9 zuEg)_cBa9r`+oop5W2{5R-cY1d;t!U&p=$2tqaY zIf=p*1su&K45G{xgTr6>Qm+2AFrgKea(K_Vif=`yg(e@Dmu*=-CzX!4skolmr|)K+ zE?&xHlb%RN)Ocs=eCg8=tqDOF{$ddz>2R#mx7oX&oksZgv0goMGFNHpA*Bh%Zd)^D zc0*ex6S<$)f=_@6XX+Bg*08|_sM-@U~vyOZKbxhmTEbmwWa z_8Br~q?XN*mUM)UCsRZ`Qtiw`jZAWqcJi)CNnT+8pm)K6Mj(&KSXd^@JyOy}i0Df- zb2*BUEVXpDj(M^eWEn(bp#tf~GoyzGO`K}#F^*}z5RDWBg{ zSuXUh!|cKr-y{ejQLK$jdK*zHqp*s90y!kSR+v91n=0+Dvgs&%J-P!Zl+a8%wAmHa zpjy8buCm=ED4fh<_fig6$)dBgiD?8$m)so%#mjbMDkhP$G$5xZe4&YJqPRTO*{$f| zcPyWj*Bx<5_2+aefRE~dE)@PykusRlrr>KB)jMaiERSzMv)%;w7%x`I$e5G)#>N&dO)Hj%S&ZJz_byj&#tQxS11)vZ#0CfKFzr72mAFE{GD+v(>A_pGCr zKOf``IXn(c00G;F)}>fe5`=Xd$-_St-YYO8hDA0pFFuJ*SmpjonYPj-FgYq%&p-=H z!X16+Z}l6CN#;Voix_uXSB1@=SMf(t!63%YLI->%wL~K_9mA66>W2aN+9b@#aIASB zMPlP=7wZ1#)6BPMG4a2Q3;*pQ=)`(0#_&pp9-sV-sn1stFy$sOE3O2i%wEtW9R#3x zFrmCB{X7E9htL4iPiPZ>(@;}ueylua+)d}HuM=et(r<=UO@QdWH!S4ontvY4#8wbL zw)E9u!=1HmQwEj~6SgTsHW19xz~+{*a>NIzIJm7Hsz$i2bwJ_@k3LA2@XWhH-mKOQ zZL)5U)^d2QU{1c=V6i65pAh0j4u}`=VJatY)eNa#j{n5QnQ@^8I?}=jd5Bxo2LS zohAIy7i>VB=ZuUb`DzI*mXi;< zd$W3@w|ar59+^a^v6-+StrfltW zU~m+%nD$uP*;YGuGt7LDCD~VX0`|&9g5iQmZxRog2a@r%mYXREwu)B24WS37Z4TE4 z02R1?Ott0ax6ALm+iHp~)s#}fWE?4#+EUzGTqLpi}l0Bm96to&y)*nk0FhAXS<#BQ>au)sx{EzHSO~nOnV!;M$?zJI(MtCwBsbf!1!8o zb&pcNzDK^P?0(#TEIq;ga>Q$EXd_3CfrTB@69W=ursv7(vdf!=h}sKamDSL<*`*2; zR;y38M$DHbDeH?;#R)wII<)pxnDB~4|LT`DsiGnGm~V8;Pg8Ne{?{bue@|3y5Junu z7@xvM=8uBg5#~s2!V`Ohi};RgGmHTQL&TgGKg47S!yWsfUVmso9tU@Y_ql%647}ja z_$pl=%K)y83QZVl$v?4VwxX`980K5HG6H5=#NwQ)x1}>9)em{4o0HD8kV%}hj*6&% zg7iwHhwj_o;8|6R-1R86<8&H39WLKZ{%qP+^0_xM>^=|#ulR81%SoqlT)KcO=z-VfeXWtENKB@zKj>?>M$N>>_U<(tiKy(r9$FS6a%CST5kPYKZKDZS$$Dt)UhsSj z4zaWZk3;#F$oQTp^OaK-(J%J`WD$?`2Ow^blWN#>INWo7;qAB0mYK3ja=QrO>^04% z&zg+qWTFJ5b#Hh}$>M9|4;1%L1%K48(>X%K4$?Pk5KUY8-rCb@ViE?^! zp3O@o!`jQtdjLruy)z4=+3D&irjtr~o8l<$97O+xu#a1qC)Yy{%)a6ltU2U_Cb$8h?k-g1OO7jotCE$v>Sgl?E)HUi z+Qh`<6GZLjaNJ#w-0Oog|8asJF7NbBIS`wYQwS<`HAES~g~r4fCdL5fQiH6-j*CiHBenFdQh=ZReYR1M zyJNqD$^wXA6}$4O_kE)-qh{w-&48`>XBn@Rioz8Dz@97L5fPR66o3DP>&7?tK;3)Z zdc~R}@3$8jSz^En@FBZW;Q37kI0hU>3)+?nhRt2wcjn}J{~9sgyZttFR^2GJlA|Y0 zSXI5d_5+inix3A)cW>}EUe`Z+9Fc7 z1@)y-MG);;r5@j3cb55xBD(cQNhijO)5-bs)c50z|7nghi-kPjz- z{H@-v{U!KqwIIQQ;NmT-s&G+nv71DcID(?QDZl7&nlnP8S7cGxqy^Q1l@_0t8_L}GX zfqCY?KjzW%6NROKX5v}f*s5v|${l7ou;+oj(O49_%SpMMH zb6BvsM=jwd_aCU)#;wy9;SaH0J+iQo9N>&4<0Zp-$2L4~$A^m@Hgq>}4!`_-k>UN0(>D*U zN}G?)u{%ifs^2-kT?AMJ;G;Wydu1>EY467e{2J_vlJ+W?oQPCh2E+En+JZ!&7os4y zO&X&_% z*NS+?Sz^(`W*@Y=P|Kii{R9WJ%67B=2*JYP#ro4))*u1o5LGK;}L!fegv$ZgM-Sv6!d9di9c*+%6;3SLoOGq*(t1v+`Q^j#XZR; zZ+$rvoyZbEtiIAA2TPho0Jm9p-zz3)YG^YyKUX6!p_`X22A=BA{IS_%De8ItdcEkn zwSV~M_2MXko3*8TsX^5z5%m4{VB3U`MJGAYeZmdKrm*4_BRB_h?NlK!G5to)zbH|$ zw(9UE;rh_q*Cq%&f~uu0?@)$*v}t$o)vpAfU)ptvKI+O~BqbAl7FbW+$Mfo4yxP^? zkH<}e5j>-;0{aGaOxHJG^dl)1R)U^?WPMQ9q$$s=ufTxG@9t7o{WGibzU*(VIOfJn z*KaL@uXC64r|EhX^O>LeGdAWk%Z{U>$9(%^KNc?#Sw7T=3EYe?#>YP@iOHtX7+XTf z{-?z3-*U#sGTd8#WD-BoEv&6v19hL>F3{Mpb10J{p=5`&86I+oD(>imwWKz zQ3R#Q^VU$S=T#(3h&@oS#6$pV>*?Coo!gEt+lvg#Oy=I2i$e}tt9l5IYBA4iPRto zD9pojnT-TlKI_;mx}9RnWtYY^(c}kRJVMrRUWx+SszXL#bZTATGMz8a59vHM_>OC> z=b1>*lS1yvdb#kazN09xu@H+F1Q|6udqp?%_qUg00#Gq__9zhJ(GNlmPEs?JK~e7? z+nvh0klI_wBMX_>&delZF>EJ9(0^f-x(&`3e;L=>!S5Z&PjrK2(HX@QN&QN;a4aJQ z!u<+qHYNw8xMBpp%#;BWToXW?^l>q*-$E6NzT44IV1d#FsJhhyVfS35h-5Z0G{j_M zi4q2}didd=#19WyR!O7cr%`M5{fHsEi*W(Ic4pyMcDqmV%@4`)*x`Cn5~eHv9_m0v zfzjtq!WN4xE-$AhI0xb{t@U9tD1l9xog7_@)~u_20dZzp4V!3VWEaDo`rQ2X81 z4mL?!u2ACa{?TdWz3L^!weU2Pjg%7w@E&qL%853F2O%CYD`LfpVl2znSsKC}0o9N+WZ5+*T9zzxeb6r`#W~bs#9A z9hEsx554PD<%o3GvO9O8^b4)&c_t$#Ctvn==?4G&pjNy(?4G*K@E|@D>}Nirv}}gi zXQEn7PXVwB$FS&dTJH=J0Dsx4d4U<{d5p=pxpgL=xdV|5=rI;I4dnZqNPIJy7 zKmV@_jZs#7bw#a~L!Ms(@?=?bYt691GRdmEqFiq+s{tjx=1iNxSFT9?kNM+^a_Z!u z!AcJMZ?@eGmDXYtd>?<`&C1G6QAA3kLRS+p5yR5)%O871T|8^8A z(S28PrLe>xX881!Gf5RIyX7PQi%sP*B`nHLPEgY9n_b~(w(L9=k=tl>sW1d{Q~sO$ zY;_Xb>pZHLA}pf(l%8uBKE#@ZcNt-5rHuiSK-v=V)uy7_c4I&<;lBl{|E=^5qQnk5 zRSC4r{+#(w0RjIx*(;e60U~vX9SuGPbw*>NGlJK)k9ydmV`@0`S~Hn#u-v_(_Qj0` zRpS%S8>#)?ElJ<8f6jm zVN>X%!&neG`1djeSB^SP;T@_Fh-8w0=(D>L??Po&f6-W4(XVBX`=^4CXfpA)9y#uWyYB>FkAP4wgn(hzy=K=_+< zQ9r@miR>7JYk>L1_Q>sq*aKtn&vb}}m2yl-F4eHQW?>=Jxzw3@da#*JxN!f&b?M*y zu7uw2+^ObL+A+#!99uxdZCtYH#phx~UVJl91QtdCdNM|#yP!A3%O}dL5eAu2kzp|M zX5@xIMlqP*5r?5=U%5Fq7_RN769)%{0=3KE8Y!oR5$oE3Y*MN>OVA zDC(5UoUI0D-IJ3tfJ+EJnEQKF6J2b-j9_Nd_I;ib=;S*h5*VjxNkVOsa~073+tY8) z6}b|S-si|wO}{$7kLm~LT%-ze^3p6b{-AP{P=5TGV5;+UNj8v{I$I?%EXdCs)>Z>T zQ~PyynU4HjeUnj3Zbjj@?yULoau=3XO2yRbd>l3`7C9XrWt%uiE$IpUu|4eaJ&sd0 zZTrJ$f?HwIFL91f9SWfRb{bi-TKfY`x34#&01F>bRv9NXRepb)u7?z%7{+ykL&-#P zIYc-tnk?Wt<+^YV(CFSQo+NFr1H{MA&v73Eqs}tIn%ySUj8gfzE5iY%}ljyG%=sXu2);q{gzp~ z@{@{6JT8H^(iUKIO`D1ngbV#ZO)9TX6-9ss7FhOAm%h#&Os4z!83%)LMURK9Z@z+< z)9D#|Zr({+L7~Cm+uxbmEd%z}YFF}6^aWePB3rFE+7UuNytIUL-?vdr)qGh(z)UGE zdiiofXcVxY3SX=ds|Z`Oxe8rZtwDW$+x+L5H^!otJd0YQYc)erq8{9)0T>rDg9?kv zD=9(Ro5<-e#2|2n-@nndqDf4ze8}23jyKm38RLipek+}F#f`dXiM|Y(RF&tv68bJ7 z$5lvS%r>=6vD)W<=uvxGUnEjkc2Q3q86jzF1hW3ggAa({0clQ1V?oHJbXEyin6u&< zO5&*w+RH_|f#R>BQcbxraYyX@#mPahH`1{J7xSJ1=JrY|}%471tsNDieLI0A!$L^Z38!it!+ ze_Ox>fKu55XIjzw!9SwYzlKdHNPF76Rut;@GB_o$%GoO>WD}T2uYt?#kt+zA93&L0 z2No(&CxxfDaS~$XcXc4)P^|a$`CWakv%sK>%MG2in%EQva|@z+f2VF|9&=f`|578x}cYwmh!#$3wO0a8?YQtFd&0F+{;$ZK=nx)R)I;Bo|+JbjrC=S z)u6+bsOR~r2B8^?LD1wPxlRy*?{pq7u6HbY4DuXIU*rPA;G70+F61e83nq6LL=1XH zp-Og(<}ZJ|c>uzZy;BL>iC*h7(JL#g4D8I(Bcl?Usq6#IC-Vp^0(?mqg^PhVZ$03* z=SU0{24UG(4^z$;*z%*yYMu4S@A({u5mY9;xS@tTM79QHIQPT`#mi$7Jx615K#PvY zVit(4`BwtxE41PEaNWOGICA8~Y(~SwO5bW7jmM!5hA@!3$leVosFMG>qA z%pv9&H3PliXx@rx=L_T&!4)9v{YdIAJx-mUK5MiN%TOk7N~;T8FnAL^KQ%^`ht0xV z!H)a-qyjel=BO@U!~b~I2mSrWx$pUAtj!J;lCrWb3>#1oKDmpUPL8l2{t=&Me!dxF z^FlRjd3H~=!G?K3t7@Pq#tKnfBb-z@qCxn0)e}U;Khy-vh+fIy$C@AIH#MOMc}(R* ztEshNN;5~-+AXrJwSiZ4z;rIp$D}N*2BGm{_agpxm&PW~#{!@0D$%tnDxC8-5f#@f zHH?+iu<8j9`;}G-A|gu$M#fZ!f$%2J^$SgO02Ex89>$!;UQlR3>wnX+fnb^Kp4M4! z;u8|r3?9y>@Vo5?ZV%>b&yNYK_ZUW2AJ{DcClzM6t0rgbzPO!&KK7gg1F=M z5U8%8lp)%GVL^TllLFV0(KQ zpeQqe9UIq*O8DuVmUE0#6FEygM(>;h(emhRWYnnjqS^c7LHLes=we5j-@EZuRTaDG zDnKl>LlB{`A+uU;6m5|jiT#G2h+L}K)HPtFo z21(A7^Y2v)d@U^LvjIQO%Wb?^f10sx7;Q{ift#g3v`+Ho?oWO6@bFOIF$)sg2DB0t za#;B&CLuBL*y)e!lU0|a1=h10>Dr<$`r8gb@5n5@YF#-%A&p(!1;jbZq-}cojAZS1 zCojhlvq|xkP*UG*L1gkG{?fo1&-uSCb^Ti+`_HX7Ms4~Ku7leG6N<7rdMyW3`JaqI z+!Ks))6=7crix*^Cx+PbdAth(x!l;?j0s^k?jCHr+zWg3zP(K>btPFpnQ5wE z(ASEpgTo5Go4lrr%?-pbhnYSunsXF=|EI>Nn=t?Q;Bt?Fm31KYK!ejk{?(TWlK8Ng z-S6e?s9$r1iNfZ4KM@}uwQN4&i1tSGypRwSPxS9|!a2UIdHOynz0yuig{x_B+Y45K zyfM!+q<~~Z-wNa8KJ!8?uxE*5;0H-x?5lnSZ#>`gmFj8GK1B_&@*wOzFbL?(eEU3) zmkrVQ-bvDB44N3Tld0tN4q~7n{vga^#q8)h6!_WsUaskSepstFJd+_=E)W5mC$KD% zCgDBAxjk-(|Ma@_O6z?v9#)XEVn3;w@Z!RY z;>JVV_a<1W#&*ZELv+Dk%!ey8NW@%Tk1~zAoUHJMN>J${wZ3Jb?^G9n3eOg%X^Y?! zK-7F5n5kBZl`}#yP*BnZEz8GgR}T3$Vh0d#Q)yB;OMERWQ29#fTs}3AxS3Lz5Bxq+ z9C2rxn@jjtYSEHP-u>PXy<>gHk`tq#!-o0l9YhwdiFGLoIXDkjIoomYBA+^zQj8+& zXtr3nuP_SE*=+)N$Ep|F-29QhdXxxuH|XzTI7V-jt`I%S4=w9BYKAANi1nv)8k_Bo zAEfg+L1LLDOWzSy_12lg@UX)liC;rKpN}!LwJN0s5}#VVcc^VED$X}+{6k#K>CMJc z$vtoPF}9kq((LT%;wSR2Wm!wBhcOR?fH-_8Ce7q{>9rz5dStK@ zCWph8=J8590jtvF)Z%DUXgo!rN+w?a!~a=<<1HPRDWLbYU;VrT7-4hJXi8_B@jLygimR4#3gV&&_vS zd`B32NB9Eoc|!5OdYFY`~DcZ?;re0y_^0u8$KX=ZFbzse!lVYV7xhC?8k7Wlr5~WJ6EKjgNy#QzrL*U z&F`%+ZU$!7)NWVu0zcKC9hPJ7czAh7I^mt9fMZxnMH;8wgktP_v3Dp0!=?s({EyEC zVkU=;r2GNr_yBf{G$vKaz>F7*|3`~91MilAz(fF04%3>TA?|L(E?5yeaXx-IZ%{F~^92iXf=wh&3ui20;n|2(lC! za*zx+Sg|fO`=NE;A2L(*g@=a^j{KUr03^{XB{*Cbzp>``CINq$9J~##+q$(P;m3b9 z{?I>_q8S)<_!9?B7N2EkD%c;iwQmD%;6F-Z)elEFgU6^x9#RRW(A1SCd~Xby_`^1y zA%@ei_j71yEDhNCfry$O^3h~?8eIiIU$VQAOFDBTA#jSunYO9cDWPpvKmB_yZdmGL{oneFnLS8 zJ4K}{9xPFIkDqUAF3No!Hrl89A(Ch;MpeTwPBxw*rab}KZlKQmbBhP-+dpD~p1@eQ z{-GuX;yTYhU*D@8;(tvc6YOv(#3XDiQ7{oHS=bmcUR1a=qhymT15cpOO?5&07gj`| zgnaw@hl&u45KD#9i1RBG>P+PJH3rw+*1YWWm}s1Q6t;F8N_mf?YS4**&|MJyS?@+- zH_baZM~Z#Eu%nW6`qd5TRmG_`6phDOe|htKE-N+!9g_awZxl@Rr!?yvH->9Flb$J0 zQ!mjJ7*y(S7CG!}joad6IDpo3kAgtVMNU++snHsCd231NSL?UDBPVy*!nMk2(&wuw z@Sc^a{M-&;&uQt69;S6Ngdul-8TyqQRTEsNty7 z_ZMNIzYMy*y!o@yb6QbgkoyljojE^d!uJmWaVoa1toq4dlsO6aE_0=kRuC+n;={YR z{GuHcdHGQe_d~b2`4cr{0q|!|DWesFe(gEcZl=g>bRzLVz9dtUpHzSUc79@^=$-hb zuU6NN4O5{=0+?`yo4VO!BfoC-+oRZ>&<{LW{rbJFO_xv>VI(=YCeUy;`SO=S^yLvu z^@nsl@%?4iG$e&p<7#Iwp`idDl@s4GdlAvLVR;;z42afk`11SivLsTbAXrISnzmRa zHwxjvN`oIIANix?XFTFS*aKFKBe3F1oR81&)Jjm1)I5z4#xhDJcwZpAP^S!FR&rb` zc_JXbEIA|@mgNWHKj)vwww0Qmp&ri>!HK67>zn%YPj-!<%f%0u*k@0|x5w)d)jHXc z;byHaCv?vj>@V;A?_+M%8o=~|sA%W4I|9X=m9}bl_ekPi)8Z1ibftkBUUa;7X%h*^ z1rA^Xaw!_bEYA(M_jnoi{>cd}iC!fPUBAwZc4b8nI7yje*jST94?&NA@=S&e^NKAOdEmMGrHvoRDq0++(DlO@Gml;kHQMqx6RGU);E z#fAzY!^osqxI#bk2QOH$tF_nTC(%vxc69&`@+JNebR?`|&s5`hMubo2fBZy{YT+2z zZ^BJRGHDYM|_BrCwRz=`?ZTpDX^+JDl_?&)BWnmuN zGxiN123t*uO+}7cqh%Qy>)!2fDS7~*7UlJjHknT8Gl*ijOY80wZyGTWN&W5 zKbP6@qOXQ=BjullRJGh@)E&$Qzy)%&)IU5;d*A$?2_yKd)Aj1x&9Qh3oO;xN2ZPu} zuv7!We|Kz+o0uo+)@dz%)bJ&_${-5S7RYiGjwiv0<7s*~{wgK>CxE+KBOPKYxN%E` z@$PNJ(76IM{H|Oko+3`IKn4T!ciAd8DmY?LiGzfY{x_nJ!|Ajxe707S>mRLF(A`_A zR&c(fvthEnMceB6M0StlSNrS3*0f{ciD=_TLs(8b>t`dqaI0T_=q2jtpVi!M+&@@K zpKUKFB_kf@G~;+!!QKhFv;+2Al<6hUx8~jVsPU8^sqoR^{TY`eV#S~QaHKcen242h zbkagUA;4Vk_?$NI@gr;#YkKbG!|W=`p{nNCLHt&Kgne)SKf=B$sI9JTJGi^My9I4< zFYfLEN-6FIio1Jpcc(~!Kq(faNO6baR;;+opZDND{hnFJdop`6d#!t2x)mjpbHNpe zFQE&(zPqzJ&LH=HU1srlBYC6W!uhw+!y%juQfEX^#6*4AJLtD0l^YRE`-lz1mq%On z$)mfeDllmT!*xGjs`TCLBuNg{Ew{LB&naDB-&nDd_7(*AX_+?TMDu2R;NqxhU;t%W`yd)D-w)>}c4Ieq5v6^y$L%`Bd_m^acf|w6>jOT2ZRM zK3%V2sLnU8sq_^<-ximZIj}`w+t^%!E_!rFhnt{Mr8;(lo48tH-sHG1O%GSrFQOc+ zP~)3Q4IhTUYNW+@lnD#x3&r-1R4O%&EXKQ=Ta2?B^>7pmct)jwfpL>>dzG+!HZ=Wj zMhSX)4vkF}P9V30DCEw=0+uK*eHcEe z3a8>Cl|K=MR%y9Oy|LMjAK~**5)Cn!xjtuWzF#vktlwV4_=1#9VBJ*%+rBNpfJ-0$%V`(b_)Mx*fsRMujprc- z$;PA~4^eRBD_{lh#ANNJx&I-h6lF#<6u=#*sJSuJF^ZT-q=sO7_>?pDSX!9yV4tl; zwKCPZov!H_T2g2fe&5{DcyDQaL+puzgy%`{>F?S5i<cmIZi=i9*kZ$Y1%nm?0j`$~bsDkKya ze_^uOAuQOH;GCONCE_hk9_mUKI;FGqj%ayr#2AfzGRuQYZDuw_GufG*x#JG|WFvB! zf7nW&_}N zYL^Hw7Vme$eHZIVkVR=LsVl=JVk%#1{7k^CkrgpQaIk$*sy|XW?Emrk<>V+Z!l$*A(R$5Dl3E6kcPmq%(MZb+&}6yjd@X_|H)A)D zM(voCD2LKOB|Q^Ee`>5atMsn}VOltMOD!bWZCrS&da_IJe?6zEmJL;M#X8xR&!ox;2kM0qT#JR`-qf}e1;Y`w zi&N99VOdo2{c*H^k(1pXr!Vixk3P?XmF(E4y*=qSg`<6V<*dSfF>d>~9}q9-CpWSU z#5K^;Hz7tw%0N6XV#7uJFCj+mLHXj#(M=YCVQnN%`1mQ7D9b2qaUE6q2K9XjChz2{ z-_QI_OOkxQwLNIq`GJj?i+!L!B91qxPX;aby>?RZ>|yloOYtUdmdU4UlER&|q&KXH zIFjv=wBhaZ%r!wWkryYo+f+`x%T)C6uP7gMNrmy5l_m$Jf_MsqBvXJ!x@dSDHT#Ox z+-7aM?)>@ULF$AeFb_YY!t4bBOZcufI;TOzMrjVcH2e@T(d7Ee6R*vvuH9a}nx9F(Md>A@8>kpCrSe?~&I zjWsK!JaF{ck_{A7#wy9Vs>Po3bu_5_>3c;p{A$}=EImC}@d9lzwS$mBsq-Q?-Kp53 zv;g72Pnd7s)HIw3hR%B~^NpJUX>>lS4riRMPG4Wg;8N*UP8C#-e){500Rxuh?3VEb z!~-Iu_xjwGNKF)(w;@5N@Ism2_@nSwaQDviTY=h`b~Drl6J_xeKLF9hQ`Hj3RZ=A>S3P5e z`yJ8heGaG0VXa9pBpVGqlamPFYb2GaB(h99_H*jBn3%)I`?f#$H7!3{P{<E6uGpAMV|&qfTG!dl^B&kdX`dt6-5NGJsSft4UqMm?-JYSqKW@1f8Km8lI9 zT=-r$Q#zM5#B@boN-+otO~AEZJoO6^F}HCzEMdXM`X2g#K@wcHRIO9_AyD(Tk_kih zV0X)@4E*B}51pU5!9D=WIRT3cnk*C?qonPSX~k4R*bk()vlkWWpGGaYh{gpoKJk~C zi{THmb5a+QBp_KDNi*UzYE|{OxLwX^IX0LlK^1UDe#Urey9c*=ecnD#K_=ujV(xe$ zT}bXYQUvz+FURJKwvCYjJvn4)-QxzWWzO8pTQp3qmwDKC6@z(kNJj>?)5kQ;TF@9f zV&IA{smwdv_1uvb<{aT-ye3tO{!Rys=ZN4HKEE!OK=R-D2~FhLhf~>RK?zGf%P4-t z2V*aybszR7$C;b5ea*|lRniTXM-HoEw@8ScQNF&#tP%4V!Q_j<><^&JTMNRhjbnFx zxMnh>!+_O(Lk%pFpalp~cvsrdj5?nvNaggrxP+XS6B}OXmawms_n|`v6iu%6 z{5LU3zdKFh-R%4kZRfRK@iguEqUIju_6&MYA>=6MbgJLw^MKCQEtR4=dV`4sa+&bV z6Ar+92{4m!oc^d7h-V=YN1@j|kR#lrn0k@T*azz2;^0IVn2g)ri+ck3f8xmC$xmQX zLDw=ggcXKnTFH;Ful;x<-BL8vwQeAg3G&7up2&`bCF}OaLe3p0m}t|jsDCgzvV_}C z{sXHxA)%9K^pzmZYH1lq5{)UJ-yFtdX#!E&odxK~cU)}o6Dbt@6gWOkW=9eXCs{QH z0Sd-^0cblTZFe``C4rOJ{`a+a7r(Q3nwotgx~`k72GL!+ugW9SISfJvID$w@r%|Z| z#Rpby^jO)=xrKX)iMac}|K-=z`9YLKEg5m@TF+01`-b^e$e$$ef6nlvk-c{ey7K(CRT19mkK5SOZ;44q4 zR5EQ4#aZ!l{4eR zF0*#+H}mm7fNyhI4SyJvhb-Qri|eD(y+d8ZVAvUS`*%cC$6i11JUIC2IF6Q5rRZA_ zsx8H&5_TSpccK#@97@M90D5if=81a{!}4eqzbF9(7|=SE(pap|o_!&1SCQ9Y6Qg9a zwng?g$A5Pw5uUEf@QJDM?%a*gK;Lp> zdWRHK9yi*!1Tii}@gfzUFHJbtu|~Tpy6NwlI;zp!;%vlx`krA+4gA4mzO0zD(&6`` z-}8pw!F2Yu4!CH@n*-LcKw5l*2Gi6vy-M}`fhK}strjl~X8xdsT_w=G5BZiMsricR zxK(#PEwxxzV$RAuE0;wmN>VP6uo*XTCE5tj#~Bf)p+LdwL76lE9SN728ETof&-$OF zuqcWq@R{~nj|WXLOkLaIMxetyIdEZJIla7&%|eYQ;|yIPkALj~49f2*LNG0rnp1@| zO62fz{$dgZ3d3VE9*UV?c^Jp3BI#G)XhL&19teKw9+k|CVD2SdvP*14%wkDK)8Mhwu)aQINP&G#Y)_<8N z8)T8hS}Riw6cPR5x;H8a<1sA=OU4;&b?^p+Q!H5}QfCV`RYK(*M{QW=Ssg{g4ILHx zO{m4bqd3&CyKPPd4%AiQ+VQUT_fFw*n|6jr#1ZctP9p<9upNjV40p8HY8pZe-2v?I z;~{CTHtH!$yN~i#ag4aIp6_2Nh}IBAd~h7bL74C2(XqG6Y6rF^mfzzw+1E^i&8cE& z(Mmks3k-6LQ9`l?dhhGjRkOi=E@T#I3U+3Zm*S{b3DO0NbVxs zJdoRcT$-N`xjLX|atWe3TQ5cDXU!rAO3e=o%ZGU1QIb!d^oMfKa&3Z zK8lcWj-Q$vE3A+InR0p)uwq=exn8eQRd1fu5w~C3Sckb-D6nH>ivr(-3R6(7b@~!T zU>tz29tA-j+pNy!Kf_lSzgZ4_x62Z762YbsPYh2sSJJw1l{{lkW+cl{L@k#8B$!Lk9uAh8kW4qapp1^j z0-g6g1x$a&Q~bW0UU?wA@S*841h8PA44;sB0PP;(#hhrQXpc&6Y(zhwEk#(oT*~Hw zKI8xV6HtWj=(R^aBJXtx8VP5C1U$9vet5X>lkBT33_=!pu68a~b{f8=qQ$$o98}S2 z5cj*qWCYmT+Yb~kudJ}|F2dvl=XXJG-Y_~0yTR;7sKK|ajVjWAKkuwLjlWCv_u7>s zKx?M^xbJ=0cj;nyM8c{`w@Ei3Zdm*uRiPHogKrUD$2G23`(6U?-i=(u>ZLD1dj*ropG!G}f>pb-Q z(uzlCcC8;jmU_yhF!OE49q^C%20e7~%>GC}S&wPoFpP+zfzX)c=Pz{!h#G3d|6R@s zZT$C(PB$Yn7;w_Hq0#5Su`cDUk%U+orA|Fun#A2tpdp!*|1^p>*&Jz#T7)p!@A*18>IJEFN3a_sa$_8 zXxt;T~!bXZmz37G3(nf~%1ztC3Xtc~YqB^_swEcm2oo+;R+_ zn!@oG%-K9KZ1}v?!uqEL2O5TOczimT)4o19y60lGy3cj!>>}?WEAHI+Dr6cs((2homlgUyvyuI9s;9a?s#Sw*Mdl**V`F2-`lWIYe(PR|ZoB<> zO>-)6CPp~UsAtIJ=k;mEDGcg{^Ii)isbN2!TK1JXvU>Te;k}dJ zTI>2eV5vGZ#27v4@zp?gQ}dtYHP!L(^sB_zjLfaHo8!R<(h1vjNjRK8qN*0d0f*04 zHL?=>-3<-z0ZTc8F4h~}_^@uNlG0L@v%e1q76T|W{;XGV&ZL3Nh&-Otc)>=*RLaUO zGHk08R*ol(B0p|ROIyfXzM03^7W&~kEdC5@OVt1Vy;aevE52bwyz6qM7W~2|qW%Ns z9$V5(S~NF{t^L-Czi1KkbB;BB(0aSU>(E%45k713m^~`BKn)|>5`Cci73y| znyv-C1#C|_Ivgi=TGR=)!6bZcceu_2Rs>5wY)Q^Ku0EgKJM%yK;lP?wPazkNxsC3F zxt|>E2k$@NckcZ%<*R1XS$)J-UC17D6Kl#Sh{>~tP8e&CozEt{Qyg8%$Pl{ryeX=0 zLRuAa8iaapB>i0dZ0&eX$gH05KlUH;8ku`B{W!_Xmn~)bZp!x_)!gWYIistMQV{Ej zsIh_}4ZvwwSS`LtZ=QRniu(TD*5)RfF78d?0_ z$mYIYXvi>nX2qmiBg!0^Dj&!269t~O6WbDvkia|O(i0n|4CC$s|JBaQp}(synr zOVZgve%_heeNV(Yv12a%ks3XNONNw@HcF?zr<>@+9+wadTlUpp>c^6{3S^k3H`TMp zBH)H;`vR>|XbV=A3)e|AHmdA)I7LS({)G@$gz`V7#ja@7r0{~heGQC(P-$Lxcjh9s z(Ny}$-Z@nyTtoZ?b99s=U1icTNRAD6j|O-8jUMU$UV*$wf#!fA-Ed(V;y>s)%zai| zX>#(*)SQ94ft*?VSUN#L*b}+#5`m&l?1B7FBGf@=WOD*@GPAR($~E0>GPFyr2Ieq< z&qu3?lk9Eg<)5}Vo=`cFu`iaY4Euc_(D@`$CT+#3iD-#@2teJaKktW&Kq30513s#d z3qhH3nU(J{?D8Vvr1u{H;tssOzt;Tb^FLzjUV*^1Z@3Z>kLSeN%?2e|XcWe7aAig1 z{`-kl===;QWe6ZW6AeEg7LWW3lO#=qj-8)9@=U*TMK5%DM$a_=B3$trNPgCRMSTL> zgGPMNSy0qtcMfObc>2Cq>+lA>`mcFRiW@!;>_Glz*t z=Q<7epO~9bfZ}9kjdJN-kN&iR0%w>;rqbtP@W2gO6LXWmE6G;7ESm+3>e!;?C*;=v4e3u+|WZD{fNys=v6^ASoW~5%`V> zgQo|cCZH28D)E-iI!pU4ZiiXcTP;H{kCTi5kr6qB=9qPvd1ckOad(ge(dT!*C{Fvv ztAg0oH9zDy$$R@!g?sSeSW;TU7NvXXoUP%HAxS>RqM#6HfT?N`s8ds^b+(1kjdFa$X_wpFSuyRaz@@+ z;UnIeoke_gRQqjUt%IM}ZvxZw%QBPCNz)+Yuq4iHC*j>zX_5rtC#bG_XMxo0>ld-7 zla?&WH<|HVZ#d_lH^f~pw-g{jK7g976BiW$!Oph%wrQ5QH}?K`ZX5>j`0!w+c_>z) z6Ye{@VHZ&3JS9(=)b72_pE^$wHq9_shLq^7Unx+Z`z@3va34~ZkP|zM`K7x`W4n5M zN{S(1&W=}!?FZ_y9w6jfupesBLXY_ZwzT}4E(q2FhZC|yU63nO#YqnG?i}(w)?IjQ z*B#gVkGYn*(w%{3`wA*1wPjpCVJ`wBxOG+YFa6enHh%i-Zbg+56FA_vwYD=jki)y8 zZ9_81-s_(+p-dR1Cnnk9vM?(&ef(|WbJk(&1{=>do5#3erP5ct9{Y}B_nWe?c9(W3 z=Yq=4oQ6&ox9Nzh^V4@0CI1dB{jYv6g5I95+$LNm2dTW*5)xo|Z?TSbseGlHK->vymbT3_VF{dhVemNpj%@s6g8!qr64`b0#I?@&)6Skc%ga@ngkNSON z?+*#tY34Tbnopm3HF54hGSxxtG!M8DG;vwi6*@+5KIZTR58^pjyR7iezjOgm7+_FFGg@0-D_$EOXe$2mL5QLKaO0aZ}H zQ~P>Y1jaWx4-XVRky$X`ZwGRlJtm*~;wKyR$vj@HMRULUPrL#GhzkKbB9b5wE%#=w zbEowF<5xBvpvS%{Y%F;BU%hV`_CAgj=>1veank*7msg64$-Kzy7F+P`ni1sksJ3iq zXLE$Ey80sqpme8svkO~H%R|=pJIQF!k|F<83Sl z+(1(booCy-(zY7R`SkLtss$>elqVs=68}B{i(uIla>2pLi_DewO5Jq}3qow)WEIF7&+{GG=TVvG~Uo5#6t~&b9c>^I0&bk=}MHQXK_PNt!Ln~aKZWmc8DR^#i=^1CTetr}~!wS*{<|ZZ> zFainYYG7#X5=da{LT>=A`yDnH&4wmH51z$zLa4-7;xaN`@ChsUL)mtXSB-gjg{!YI z!Q^yHy(7|d^DW3G!tCs$17047n{Xi-)MiW>OioVr_NiC8Fd)9E8)j|f`eg4UZKgx; zm`EinlHQxL4yy*NSCH4^TKVxMdGwH!no3s1Pn5l;W_oIl@v#Cm$mgsV%|=uet_uG9 zOgkK*m*efXun&A8vM4wu-3{t_o}RMT)MxSrwj?>^6ihdkBH6uDn*igSI~8zN>n<#O zTytY7cp>p~d}5MxrR-Eo@|+IH6@t;4Fke-*9v539&RWYUEpH=ef1EQl3tbUUo0=&F z&HM@N4Di!z`9}EXrvmTSUqvoHgnC|BFnumbzD7PdVP%4o@S)?ejG7ITea)z*iB8Nn z7@jdH_5iY!2XmQg$)ny3JTLu$A)ZCRoS{FGyjYUoAbokkL`T zx%q`(K2B9GQdh4p+ufEcA``yDHdM`MloI3J_0no;M8?KB(m<6=(hYBM8GD4%(#ol| zW*QZ&?=i6p2$xio6+eAk^+cR@Dm#*`ezZVuB$zn=(pk_SL!dA{0tg3_Ms5@jILlghM79e--6@BqXObjn2 zXe#FMksT8&Uy3L*hwc6;b{)}6CX(Biptd|!NPSX%2 z#~Bia^5sLo&ZDl8c}&F+b9^3oir_>ORmi%R*G%M*-DP^do@ZsT^w2c=POhi7l zJddFEj_D_LEB2yi;-CI3ee4frlcNpjdIjzEl$Nl6`sm*&$Q$dKo6I!b{S6Pk&bY#;YgsZDRGz~Vw4aL}Apdw((LIQ%)!xKl@*72X{ zCmTH$n~e}@v)5?Z`C&!@N9TQV^SDd*hTrL*92|y!{i>SlV;HBVp&>YMHd>a@)lDDM zH!@@6ws?hv2ojaQX3haPKy}LomO(__*`*38@c*?WzrhE|0xF84LoI5i=>Vk|<2H@@ zfmmm~caFPa6r20Cx?k!_pp3DB$rG{8Unwbf!3e@d<8J>&tQwVk8|V8)S2$LK^jF zpuGiX<1c_qjAb}{W$AOLp6+P@C6(fwz5w?cNzw@KpAy@cmO)EnVT%No3d>#Q2@0B2 z?6e8-Rht}TB(EjOBgq9U?L_hZL?CIdi$M{OC7@Uaa^d@$G!seTmk&(dtYW3gCC5R3 zhIwvO@rJ*cToz)H2vKeXpB^=u!DG-A)M~pwb|>Z)BIjX($jWO?Zf-hs8?S?V`(MI@E% z%gm-nG^e>(z7q}1r+6~2r)enL;!hT==Fkyi$CYK3lOm!fx#hXrTC)UO3?=kxAjuu57rks;i2`vQ9msI62ll<*M0S=}U&ZVjIwsaDFaGYW}YHbYCuoy#M6ADwAdp5d>at>`Z^cpsvPduP%gh}ckGtpV0iPx{UyKq)oo4Wmz&s_ zkKRUzDS_igz+nNu%`#><|ce5g0>TX`wdI^%1JM_XGKlbRntLjRg+~G-dfgK<8(1yB;y{Qmz=rDQ_ zyL&BOBQL8;CfVd<&$-B;w68F8cNvrA7xJJvDgF|6g#XRY`40Z7Z$o3ispz(aDKfpC?s{z+!@_4|54Yynh zuQj#FZ>5P2QD>(GAU^-Bm7LbgzlQ!Ywuty;pRPsuVEFoT#4$T09ff;t$pb9R>?s>I zXly9`1qw6GRV#UKN@dP{vJPPA3_L8eN~ljv#GcX{5hyOsO$`a`9GiPE68(*DOB(iu z7{kB-O?_;6l0y0N#b@2w^YiCl53mrX>GgHGM21fKoftGwIE65Ou!X(&j>sJp5YH{R zmzAF5hfNn#W0$4M%nJks%SPdpKJ~)6IbH@D*4EXkv>r%luyl5=YU-H8BuT#FE}D7} zWud!XY!BYYdch~*C~|=k18&XWZrROb^O5xT`+mS{U)a}Lu_r2%D9 z|L5x6Pzvcm4~_^-v}!l#Bh&dLymQEYUk}6!;-W@2Ad4SEh_xb7yZ<5qFvsj61eD^a zw&mfl{EO5M>3!z8Mbai*xwK9S1Z9ySlY|A}h7%4a0f21@it55M{os9haJgDcwAcrx$%RhGkN$FH*FumM7Uh^RXy)feW9$xF(;6W?dMAW83fo$jG2S9!ig z9Ne-^nO%%bSA~XfZP{pGtk2o`op*{hxLr))f~K(c3fGve67f$kBAA;K(m`vJm#fpx zG9g1H+}NFLzDpW1*VbYxh;vBqF18Ri+AE-=ILJJ`;YTW{SH9Hc%h0`c&(`L+9%>yh z+;<(_IkDoWI+&S~aP=<=&QOcSALmm9>)f%& zJf0_r1p`Y`j6e50&i8CC_Pkd?XH+21v67q58~I5c9=1FE7zZk+;tPLrMQ-l0_-_17gP`+< zw~rj!2j3bRkWJbg``VmV8O#6dexS@KrvxK9b@8MVYYVerc&N4}+;Kyn#_ec?K+jsi z!8Aykmv@ZTQhj7zJ)_Xtz+b&I{8efXUx+~3Wl;khl!|b{=m);2(^t54s30O}<)+(3 z*Yosnm*gmQ4&x-m!u}j;0+NiqLsHbZSI-{EPrtg{z^OCZ_ht4^I#b2!$V)U;FJDZ* zVMwM!1pD60qh_FhbxmHta;7uFuT`NNlIYsCUYt|aw(!D{Nqev;Y^v z$OlvV*(T~g1>!#%Jq|vftaT9l_$^o>o`*QK=RsK?32C87U!}* zDV8o0e;gGGrucd z9N())Dk^$vb7RE|;6PM{_8MKFJb*B**f)!%2>#HrOVvChgv8N$2JxCLWCKnPG&w)z zl=Z`}622Zu^tz|UCWWXI6ck2gs`S|^b5vUnihwXbT`oR|oS4G5(PYZSuy2~qZSpg* zeTl<~+nDI_S|GXl_liYLXtC*-^p>MibwyZMf4|?qI8UYHpNJ+%45CK2j#%8E7K@~< zW>x0IX6UYvFuBJ}l6>LmTF-vk79x_sOPuAO@ED3>vME9=(`(EHjEA`kGz}3U2IHag zmVZQ+fFs4+T9=OsH0 zby35GH`+nAe;FLYe(gSEep}(!h!5D%VR=8nSGoEUhj5Q3pEu|!+avf~lZs+tnO&+~ zD)wK{=47D!3J2|I#IqDViqaOl`9~QuxF0p@Wx+1hly=bHO@T!`6lT_x1g8Cv58)s6 z&-DH%OdueI5$Trh%!Sq9kx4z%d~%a!k|+sWd+P`a`fWScfpI)y;r>&y-E7+Jzb?`# z@X8@Q_`&&1szV_C3+4j@xRKD(B9PR`@RkLsB1d3h$P#cx;jp+%IO5vWbD>Ivk9|<* zZ~<)wIkNKAd1yp$st6J-;_*2wa9eSr}dz*LTN%j>c1_kME#&0m5pa31b*0 z?fXe2c0hKu;NcxY%9Yyrc0dl`S)PZhY< z7dy4AgNNd>HE3+JuzICh9;RN>LSA$pI(9p zJjO7dce*9apb!6eh^YskzM%p>q#tfLTH_5IQ00EIz3U0WmU~kF@O+J__*r+HBJ%~JmLQ7 z904h@3%;LQOuyC-G!)CJ@$ePGZsS}JZTlNUGm)KlcPmBj6%K5|0>Aq?}?giKhx zDh{R4#EU1UP&yb~uFA|K6CRQVo4Seg>(0Y_aC6>%o5R%w#{Dj%^v(DO1GuX_!U6FU ze1SA<2H#!xX}xxqjlTuv^;2NAKB;(ONZw`ozi*|72iqPe9Jc<~X4=yVFG&MPD>BJq zuLm@uhqQ${s37q}0j3ZfOXRR-bg&}Wmvf#`SyoQ_sQrj)Q5(rbUWEG#hxW> zZCg3T)0+(PirPil4$JlSM(q~sgmU@>z6WFq=W7E)k9UzU`m> z(J!_3KD_eT@L;&}3qy(t`3e55y&2bDE)MDQ=OwF^EXedS^a(z_hpF6Bl=ZxG09$EAFTS*C-&*CQ`h4{TXs*B_z3P^c zvS)FPUZ@Q=iLsuxBE7MIEYmPe6#_L~WksY<=*h~hVVx@tY;5#o_c+FMPP)A+eJDuu zr~~K#RpD+Q9(J4ZQ0X>!rR^0u-OYQgf1=n_mXYI@pt7i^SG(F^Eis))KBvF zY&Yxi{^$dR?!mqdD3irMqYSXm(%7!WH1bT17%-rGTM*BCvKjL;CMO2zEC+grvf{sN z)z%fX*_|$4JjvHlZKu&Kzk!(5a6^8YSF+9z3U4fGPty$QLHvl+5xgn?s-Hn|*^1A^=d`yGwUoa5ob?E?-lZKO!D*c_B3Jj%9%WBH%44qZ zu#TWt*nG0G}v@3&w&?KLL&Rv)^RzUoj zGqB~5zh?k?E)i%y*+%rvbDFBAD%1F?TyDm;s7B0ZJ2iAQ7g6z9ZLvGX6s1zo^XkRlH95|yM zrT0b^F!a6ew(p}gs5Py{S(>M6La0Fp^;pz}M zAKThHMD#}W9C&a+A(pA@XnFZ#EkJSL0zcSI;b6V&QE7^X z$_Noh_^{Y5TR0x{=E*zX^Dh@-B2NuZ~fO=(ag_5TbM`w5&VQh9|G53 zU*fd88^V|OQPPlnks+a-O*OLV~vk6l_sRBqTNrfps zPK0u`_M0LVTyYEDrq%EaHB}3V#Cst9HIg0Qc?cu7suV1&VZR^zT4!pYVWIO7P?piN z{qpy2gh0D;R^9)RZo1{awoSzl3(b&1vS8kGazKp#HV2VVdJzP%GrOi5SD6bDI7u9= ziyQ7+blDhY_j`BoN;+5^^~W2hwD8aaytNcu@P%OauWKVr@|o(?@Z-YpxHMNF8U^`D z9-6_L1+#lM^1af%Gri)!iqK_tT&ldd1A^YtqA)4y^d)x9ROM>gicN?Z<|9*B3R1KI zCFa}o@Iz52pM@f);I6uSh!;`(0TsU{1+s%MHacy%wVL)i?;hzNDM}XUU?I$st9$=| zJj!8egg1Mg1N3X`;QC!k4Dbh^`q|-6DeIP;AW{}~?r|1>S)^PTSa(RyH+Yk7Z7d!| zI~0Bj14m{WJ&edWD0$i{`z{2Of)t}j{>W0YVEX(}ojlkCb15zA^}$uFXdimJ87Suq8XN_Y=@Tcakd_T0(2>HW zC=(r`0vPJh`{0hPtFI$H-Le&J@wI=%0b>ptsZfld!8RtY%lnP%sS1z^3;@Fi>lfhS z)vnJhJ!k20+5vcV*&98WH=-moOP2}IEZ-Och}Yz15$tgU2~pXIMb*F!-JXk>zC-%b zw4MzWaT&$h$7}Q<=FI$y=d0G4tQ){j_O1bE3>F=n7%Y%YP|)dJVa$p9)#~0?1SGLj ziD}O@nv`jUPQJFZ3>>k$Dm&*ge0IOs>BqB`(7sZ6;iSt8xA!MW*mt!X`Gy+NM49+f zxI$8RIxduVDts(qd~RB?B#?{(rqoGYpEBrWS5#n=GC9xWzy?CS!R}bJfSoUle`)_> zVhX|iIx&Fi#6&WQGbTy`Mm&;Fc|0-6kfawT)VNB zuIbU$qV{1!dFCTRz0i4G3Y0gdy*YAfJ&F>qB2h$?%aS=7nV&iIJz6Ah7U}YW@2_ z((~PdZxP>gxYp^z&Ky~!qr`|^%Muynw9iP_84&L6CpSC4G#v3NQuvaCF#;{Eji@`eIiz1fL3iu6{#x|kZDoEV+x?;GN{vr(o<_JRcxZs z*>NjKS<@*vT#?I6j$GV6_KYIb-l~4md~EL6GTger?24L%iWnw;EzFovJhDPs zbSH~801p#^>h1A6C<$f?g&_?nxxvv=BU|?d=Wzj>xT+mp)LR{F!G_vc=u_G^HD5hy zf!(O(V&-GsmRUwwaPjz!J2j8`h$i8Rlz!WDB~L1kb0}sOT^bea->Ir}n zOg3PZrdTHM$%vwJgm>UVp38>@nR7Pzq9IxVm=PvC*1>Ts&y6CwafZ7|wBRx6MQ2^; zkTY%}XbZyFr4DUP+~LgQupcK{pz`7p#FodH5Pv0UP=j;zqO_N*%%y8x0!jFaNlvN_ zKq40EOox=3p;U3zC>tzwOC*b1rkXg*7Ve(=B2rQneKV zmeXIgr@m_D-3{sfppoyzfvlYajUdi9pnD4rmgyJ zubp`dk|ME*1J2T)$y~8VU#QNBO%)QdmEoU>woO$eGg{(fhOf*6wdv8g=QUGx2g|kb z7`8$$m_5GUl?F~hZzS?6PaJOYYhJNRq&O!jUj9p~^E`w8tOq#BbiRH=UBrtmzVMcg%?< zU_X^0!0d(PHYT&svSrBofuCXOJKCrB$T=gPCe)m>p?1Kc8hBXWdR4V;%M?~9fu3xF zbE++j)k&VQW7DxKq z1hOia??!}}(v+67WRl2v&&k>{cW5!gBSWTDnHd`8L$^}969L?w>TE0~habxj!p?xm zI9G+?Jv!JEfgGZlwQoX6KQlJ zsuMcpbX-h+G)4T}1`QT*NELRcPLI{>qe6zN@pA;wAg2kFRK*=B2xdHxCF-2{Qoi*Q zMk8vfIcY-^F;O_3ho!|s$EVw%acefxN z+&#FvyPfr&s=w;LIA`zTsxPRn?$v9qIma09^Q_Rxh`sXOA(n9pF>I&xx;RJeBBpS# zRuJ5r6yAs!(?aYSlf(w=;zljJ3lG^kHV+7%Mf+wfXTckwTG7V967G0U;|BTzg?wI(3ce9=Q+?bPh~&?0(;5eN7Cb z;EV*bQ=_?y@N`#rgDHirRZVmQFKl=iI4?gRC1y;YfK>id9-)lI^xt$>f@$Zyj}a7z z+b&gvAcR?;@87>QphD`b%lxTNc5DT?LGLFpiZf>Vh*=(>d*Ais))BsvY=#uQ2dzr= zf$G{=BwD_b)~Y&vK?DdEq%fI{m7hP_m7f|zH-?Uwo1%PQlm}HoLBWI_ug{7xEKdTZ zP5EHpZ5thdvmYyQQd@kCyD$Ke4#~+=@ejmF0SWf|FJ?XTMeZNe!Yd|2sXMo2gpgcw zi%m1G7H^`a@rGt$J0679t2}K|&ZwUGAoGKodTXsE9LC@;k!L~(Wp;S7t2jo*^BXm1 zAPDP+BuZ1jC|464S-iwseQ8GdoWe$gHXt!U*fm@%6Zzh4M<p9a>g&f*QB&tHtI^yq@*$F~bKY5y* z{a_DWaJwr*nc?FMs_9=T9u(Eyq8QHUs^Eqk@xi7zS=7G9ZKqd8g$b$Tv-lpafiD(X z$1<%Jh%&!8f;OVYlN0;IOG|(EU*R&;001`>boBjT_qJk+BpErQ6uKF^iExK>nZg8C z?QmMeHuk{bI~(tBM+#H5rUJju5G_*_EsuEk3qYjuUyUdeEqcCT=SsHV@|$=v z!fZtLBZ8z8A<1R`Tww*8Du-%O=yQ0Tp>qP>_~t9LgR=xY_CBD&Y@#e)$BIr~cp;)M zA`J9|$NjXon7kd05q0qg=TKm5?LQFZprfMZ{Vpa_=TgU#vG~H5B>O21Oi@6ShwVDa zMxi8hRKXp7#$;!@6~cb}tN4Dw=E;naP(=h^qxd7SX%<`c zYf`W4h#V5HnLRuIZh!A~9V6xpF_zpiv~R!c=hyP-`qn&g#uk<}GKdv@(lCtHng^oF ztnXK%tHz5?Cq30_-;e6f#PsCiG-=iZTQ>RQu(hrY7;A%xNM@*O8OVur=rhi|Rp1J? z$Y^fp3He@1URIP3gVue4o6oF>f=E8R;eupU#y$0l4^?oK85-6MX@8WC1X^W|=%~CZ zUE#CGHhA}Q5ZciB?s>xz+fiolFp|d!{#t4GC(8bqK9OI`FvjAaH188G8j)^2g%x%d zp5!0A&PWDjYzRFuvu_!3z`^fyFxuFTTwI8wZyZ{t*Xm~_kq#P~jXs&@jBJj_BZ<{(&t4J(|lUsV~$C4Y9AD^S@&HceXX0kf&Et2(x999qgShFtz+L+C-HHj zi7r?AJ}o>l(wVSt6GRPF-@wUOl~UHg%b`dUt~M{qXiuKh2#d2^41X7UZWbRME4DE0 zbg*{i0&U9}Yb5)_h;U@9nCkC0W>FR=zUf{$Pw9hEF0C)ww&aAw>R)rv=6~$K)lB za>u!#67V4tu8W1`j_slg*|kVvIkpD;WGy?G3DIYaWBKh|`lLt*r^yeBQ->Z-9W8P<}A z!gFSchOi;nl*`ip+sv}bM+vAC{6qtNEj~mwZy_;sc)ddlA~G^5RZ~>q*ByOE!zNgk z?i-MS-zzSo&$VKO_c`TBMMd9*8Av0!v7g|9pWjN`1)dWhNI_}7Z4A55`kw)3+h8JXyN)4`ikWzM|zEkMsi725WB?m|J2f% z#(=r>r4MqqYhj~mwHT|*rq%hz`q}z&TSwkBndQenf8axDv$aO*;tkRc>Qc|R^5bHnJ7 z8f7AIGi?iYhVa7jsbB3Qs+$|H|4V8c%eY7)-6k(L;%`1OzI&2ZO=m2&u_9S0Sz2+= zxFq4ER;x>1ej~veupYRFc9PLTTgH?002aH(+#=3}op*jAmE51<&fUq#7A#cI}cu|)pS)gd#7?J-=d`KZnk?z-C7Py{YQK?V#5wbJ|W#l-bzidAxX5v_;6%rLakFo89 zBYYE>P!&mFt;Yl3-4!$zkrYsxLdW8U@C+~|%RvSn2gvAHnM#Kq_lh>XL)^51omm@= z16^C=gDI*%4T#U1AS>&XfK<3_z5=R7E@$`nimr6XYuIOhA8Fl7WJpb+Q);1*H-*oE z_Z|o8Ishv0(SoQ8H`o}QSKE%4<9`q5K9_8&w}8o`P{;|bR&3-38|alx*OLLBvYYSe z@-z25+||5TuESki{|BE{WkwS<4paGXk?5w??#`r?Nf0=2&YozRg~r<^M+tR@{GLeP z=KDX-S6TnJ4sr6my(v>U(cOL{P_Q`S_(P3tYARk@&ID;MH-scco%Jy_>xGwBb)zXW zdBIgz`ID^-+pr17$87++W1KPx=r&_<4n1eu$<`uE0#6O=(H6_eA2@2}?^5l5RKgwLX7L_`S$RS7_|_LHG7t&w zM6vbFKCQbWTiPYnPZ*J==5}@ptqcQ?viOm|KTA9e`0PDX7Eq=}L*j-@)$Cv+Tus^C zvW-(~`a>;xX?&+#2?Lz@kF-QaEi1WTbiRWQALtaos3r$HP*1V39W|eVz36^@hAT?7EjtN`( zlQ11Wf%fj#?bljA*reZC!>xZCZG3&z&f@8~k!)}m%}6+jvv1_#%RE5^l!*j{QIutb zxt6m-yJlz07VupKy&N+#5NXT|P@kC~*i$DFCxR$TPIOoY+A4_UgNbM*<9wz6<3-~bXG_AoPFP+}rwYAPr+Sy6nygY__z(yoq;jr+$rcR=_(@T(c0SL&xWiGZ{y z{$0*iP(+m2Zxat!`;^urVTYJ_nJ804V?^YthZRJZD*3?0$M+MU#cxDS@Z@$i5!DVk z^N}^qu`4*1PP1Td@~_$kKjxbpKtkLh%m3wi)bc8eZ~>%F!WZsMXi=CCS{@T0X1QhyfcWk75y|O! zA3kw+4}dbIS1PzzoQlV6;BGboBsPof%{c1nT)dMmUynjDE!eF1I5{Jdld09zPQ=B< zQI*iLz6i2`VT7`1>6Vzd!oAT*F*bl4YlYC@O_YLAN#@56%cQC(x^_g?13VzPt=MvZ z=2PQ7)?Qj!CF!y70SG258$923zw$5|G{}HW0|k>)fhaenmA$Q$n>yTYditrUdGKZ; z4II>tFM0uGpOyVm?C{U;D4D!r<6v$zjbC}LhDdGvx|lg2Y^`1+cGcfS-`HF|nhWyt z)z0$D%8-CiTEbf#-6oh!g!zX9{4wDLbw!@M?fF_KkU7E55+^AWFh-?_UG^7*%ZC>D z$avvwZB3WVtp5|pPt!SN*D@25c%X0}^LpQ~>gecx1(;z!f6}Wh%oa2@!oUR681vzw z2n1(~S3c~_xOraWiToGV?VD%v`Kme>l78e35^z`0!>h9FspBeCO$0ucgdfa=`j6@F zHeZAD68l&S2Qi;V0Bs9?*Ta@6qxXsNKd050#l`~I#yPjrvfsc8EB*}v#)vjbxSc_} z0g0)rH~v$Wl!R-!Tn?d_jSmPB35f^}4lXS($0l!gTo>j`rh6#mh(&6|C863Sni1jO z!pKjIyKUENs~6lQ8n&1@I2Q@}eIz$Kw~$x&nZ^8t$Ib)I)i|9+Rd6!?q0*lLzeHZ+0BG8 zIq>wE+>^Tj)=mgK`#|2dLiANt9Xx#nkYE?`+WbYl!8fL#;zLH%qPI}4H({AsZLWo& z2HV1fyOkeE*nh5NJItzU0{Gk0#oB9uSs?s*Y{Ubvghoyp8%f-h*Mv7Ae93v%aT~k% zaEMRKL?s*e#Vq zmZh<`SHw;3>VSn;UH|KTulM(soIJ?>*vd#23 z34RE^i1KDna?pSbZTnd{?A%+xwak<8eaF#lcIZ3eI^VjEF_cH;oaZKv%@VVIbol4J zQu%ODpzO3Glhb0lv~JusPy4#b@)G;|;Oc*#f&$%5u!>2KLbC=i7l%S*||Vs^zvo{EH=T9_{{xVB{_XB zaQMb&Km`A>IOB6AMHXHNd!rz1F zia5;e`$Xr^bxA#%!GT|IG1ePRSnqVddM{JS+9pomX&!gI=5zK(no0KUae}Gu zbzc}VzYB^dFetR@(1}D7WG{_&zjeEiyjjk|BWEMfhLEm%zx{~swT>^NYdMkm`P2Zw z@++Zb2im7EYS!W3zaI)KJg%O@ z-BUDdZU;R_VNjqvmHRyqLZjUc3@0(vT1|bzfTg4PIOA#!O@Kyn)C*u|w&!&ndjU@^ zz$oR+^f`NM*-4PUyjyXMydJFM(0Uy|2Dktp-(~`yXkPAk_KlBzE!DklUIF>;nVv5q zj2uk2lSD-HPOG;8J+s#P#%CQ%EqiUY&U5MuoAs!MCL8^^fqx`SK(_N0{kWQp{oOAM z0ABk6{hf5CWV~MznR#%GXDu4Hx*H5+yAL({CaIFv@+D)p0ZITQ6yJb0J=s8w9Zh#8Oa5b`Sr)Hx*LcxP*w) zGm%1Yjz2awo6)ZDx2_6Ho1tJMD1LB(m}g^6z!B21#KG!#W~WzU1ngc;DC|}` zQK@Ihb%@YNPx><$QZ_yIU*O-*0-im1&okGJ*Z#o)mp8QKEZw&Dw7n8oJ(F+pT)WiN z)s3d|A*`0;AU&sExR#SE2B%xD1>=EX9)Kg1JB!SrT`n_S!E=u)tZIbGP5KyEEl9g=%2y@31^xEWbIj%tTPma|ZFn)il1-X`|*=f;`@^4#0Q7 zQAlHl18$xK7m@2xj{g`9EvtxByl6k4HF{yYsx|?zAK=yCIBR=$|K~e`>bVs;;CYZ2 z?tCeUZ+dp()v|YFTf0+KbRhf>x%kWIa&qD1b*5}|?460@l0(O1ueVwgX@Acm?>Fy{ zZSf(+5UQko%N)Om497M+7fZ#yP~<)1H#nEezkTR=T}@~fz+D)upe@V8xVd`TybcC@ zBgXR;gx>>Bs)2h$Z(e0w)!*WJ!Ek#`;4Q+7!_ssu6M$csGCKeZ^Mhv}zRY+1YrC@7 zq->Cst~ea9Tzl(zUxv0^fGOrb`OZU%;VXkf_jT-IXEUs}J|uGcRqN$|^5M4o?c@7Iz=I`Y$A*c5 zkRuUu>xD_j&7W&4d;1XU!3|#P8_>a@6~~H!0epQhUp-&Sc%OL+Q;$3gv*`QOwi6@1 z1$WfjTA$}lFTzCz@E&j50T11*yZ>DNBS|o327Ji&xKp86>1Y9mOT->k>ww{u&ve< zmnalGnfAJro-%nFVfZ;Ulr2H9^zr3bbB@trdb6_=`wz?!$)9w6sc&O4G8;E?bBY(e{sJyUU zoZ*nbY3W+Tia7S_b6(Z=6e}XCDo#m6oB@caf+vKZ^#T>d#bHvn;+SL8kK_bjXR%vO z=QC>0Ry}ImMw+2x&sz7HecvA80YgA<1CwlPs`*d$x1+T@`QDKI`a3LJ;zL%HVsr)L zeen6k*|Nu1P1Pt@deoH$HGVcoXgrrwMKxJTSonbX^m+ge!@Aawx$};gRUdbNrc(a< z^6&}JZ2A)ZSKKcskuraFpW$iQY&&MN9aQM(J`G^pV*0 zax3nLf$mR)Gan3r=JUa~K?~OgkKFERbe;6F&!{LUAZ({b?^}Vzwp#&b_fsGyuctrz z^J^3xOBpUOD0ck+f=Oyk!$IOSi};4VKY&MsK@W^7MOa*1&A{#0%iyf-H}nY$e)jpi z`gmE$<=gYQ(NMzv#hj+$Pu1$SV!WJ+^*~$(O<9`}Enk$&enc?nu&1kY#c7*s!Dv;$ zwrEe!UYz8v`5aGg9mR6;GVzX=-lmBY$yAQu1lvaI?l%(r$HbRT;ds5ZKiM z3-W|!e1CWDv_RsqU2wkua6#};Z&A0@3RmKpyVUr@?!b5*?GC8i4lf{JtG^{t=4kb2 zA){+RnyeaK!Iy*B3oD2j=tb%qeyBuZriV_*-(#l=GBPaz7qr(S>GC-C zACDLeOcyas&dso(O}lCYAM47Lm@d}(aTxgAnpeE*lS(XV#;Q18U=X zPZ6*E&cs3b{PDcmhi0b3LkeMs9FVD%6-u{#fM?NDnU`lUF0V%t03(VrkX+6XJP554U*S9AEayDQZys=84L zbsrgZZ}HZ=-c4sYn|hr5%Rdq^c8!u5P zsg;(x*0xLOtEK()xom9jjYsxk@~5Q9e53mid^UBsv9PfZtQ-b^n^$k94Mf$xz22*6 z>c;>?7!dzt=)+FSOJL9~{C)BXrj^X<@bJja+WiSr?=x9I$gX3Bn4~?blxZUCp~>AZ zm=ilFg_I{VQoR*XYCdotwvd%|RnOp9&Soesi)mkSHKwVMP}_r+=GchwMn9AWvk$6c zr5<=Jqf5$9KP!4?_MOL?uy>bRdG&zB#nSXAX2?tW2+Z|>`(K$U8prJ z58*pquk%Q)H$ORAR`>e)`=9rh2xc-mjQ`>9qPqhc6Y5#AotMTf6IA@gtdq1j@LIqB zmg?Jb3#@}Nx=Cp_UPf~jWV+FIk`J#hVq0`%ccU&rfjKxb&!FRKy1wP^>G-q#{QJV1 z2kU}cruLa(`tQoD<#aVJE?w0|0gk4|rp(W}b!L0C78q2}@h~3}pk!IGVO_>QjHbc5 zKx0Rsd=l(%a`Ci0_I*tcu~JDWsfb@VgS2&=7o(MQpM^h-3$3S&Yl)d;@%n?d2V-Ew zAu4c#7p8!t0Rq5{Sa~_A&}O5PdJ7=2D&KVI`|-r9*u~x&Lc&txr;B{GHvyasY2rYNAKCgQU8&4IA|tDO{YtLn6DCU8D)}c4 z%{L(kMbi@yXsP&2A<1n;Ews`Y_rz)-`C@;N659ZFWB_f92#-+15{_ujn!L8f9Qe)! z_t0ejC?$tp7X>8-${8Ew!q6y_^naA~u{g3(E2IYP?cq6JC74|aBBP(J zON}It1sNJDlWnm^@kYm+M<}EW3rQmaPuw@cz40`LpZ!45UPYg+nlO?X%h%`b1QR-h zpc3$Kj3xUg;3dkvbs@fYZl*c>q&))T#mDFtW;BMLLC zzC}#vlYtp&Ubh$8CI{<5u>DF+s~2|hSSFZ`qhxcdF)G1_Y40^Jv`UkO?K!H|O2~_J zNCG~O>=T>dCsSEQL-f0!ZHI}<0WmL<$TjBj_0be7TKe@k9NnqGha6pTtO=tCQqZH$ z)|zP0^v0>-5u5uRh#J2_$6mf+x-cwZnXue^J2+k>cLT8Fhe4;*F(^_CN6V5>i=E*WkdC0H&f?3tgQhxlbqGP|90W_?}u zMw1_nOBnk_qu16x*sXUWgqoZ4&U@ogmNk?@W1?=lt&5)s)nGsFHu8FulfYObFe9~R zj;*9EczV9`gF(wNB)U8R6tvRHdM#vtsx#n`!PUcE7Oew+!q7zi8c!jUS4E7Ey(BH} zs|xwB8+*q04b%g&2M^E`ztCnO*NzIV#UQadxrT6-Ka!MrEPW1lHp@~DI?zAU>|o=ud#0( zcISbPkBA_$E_=#5`;ZSVu+%*-5$NYaqSu3`i_6o|dwX1^Wy}N8-A{-~yXq}I$IPEZ zLNaPGwD8bQmx7DK;Pv=@@JPi|+R()IEX=a|dZYskS&ovKlki!AlWcV5O0)4Zm_)1H zUkDE$e;Xq5Oqk4U2yTxhm2=?P>%qRt;D)5o67cih8B3B5Vj2AynaoAZ$CiW{pYH`MM!02;^`3Gp60Jonmh_43UZ*?_7Y`KO-?l55*Yg9Lm1~zq3r#f=`3vzqC?c?!sacszgvrH{GBZY$-a=llH{*fuy~!0% z_X7D$W3WB@dH+pU3 zA|ND{P}o%~T{~Hzn3f50b#=|HszSRRIdXbD`mEIysz6T(8*Qq~yXuVv=wAl`SH-3l zbCq6OP>^KQXWvgQldPO33*}07%Qb|=3yyzcju$@rZXcMH=zCg z)#R{BZ~R=UlUMLd;zJ~BWyoeNH9BWgfBL;mi4~~)MT*LC_P$!<$0cC`42Q)i26RPp zJ3{vMr(ctXT|4y0XWpTEfN|bPl$2U2Gum3!(rEaXwN||as>6C09jq3PF5))M*}u-{ zutEL`{bo`U68(#R7~tK=-{5{p46TD>pGfg=_uO13VZcEg2uR+x@3*NpQo5fAwrLc4 zt5$tJ-;m4FFeLU@HXSe4_>;(`{K{)?$2Z34^?-rRW`Wh(SOF-)G;eR`Z#4eTmyWDw z_uC!tmh;M(uP+OV&%2fM_rdBO(fKw6D;4o7Eg^Br_7-|H@P$l^sdhKrkL7 zLPa6eh-e~Pc(4#j)%nDUK`LDKNJ@rU3XZa=y}BAZBV%F9@NGe4OPcHjp;#&F6K_lo zE7JC$@}M+Xz^CoWw;MvnjGbEal_HzzAo<&0rxdQ@A^vy{u)HYeQVA3{nBmM@Jz|av zE+7GKMD;m0&zlAqgI|(=K_T%``xB(bk99<|^J<7wg))^g5p>H!3z%3vtE;OfBMpiU z4fbLAJG?bjfq68Pjh&uL;5kLqRCc#d{`c+5W)-r9es@cjbzM#|Wo2cUlH^FyPN|l}*OfB6#iPQ< z6M2CXE5lVZ)+20V1=!-8c6 zH=Nf_zl53Nw^bi2y(w}VmMRgQ%f42HZ*i$LWO~>Hco%)|&ma8X63I*lXRRLq)+Ygv zG5erm`p@;4j6lPHm-rpBoy9`z*B1XxoR9e9gR`>R15zbQ8Ihq;QO+H=pr>%@jR9>c zd-UY}UQ|KPUM;@>#1J430$e*9Ng_*(}<*axTQ(h8Ee zhO|!hCw5CgS6iR00xoc}cYB-ldDA#U6h6vIpvj;0Co!a7JeFXynomn8q(7vE#Jt?U zUptl>wxPt52}+$vBZBa?MS6a$wgcUkaF-I@O&vnOnx;3RaU8rI#6tdGqwY__-u}Mn zct>k0-!U@qz(LK4$q7UkexakcwV86?XAUPY9?f*ZEQQ)0!EeB1xijt-4;=UrWB2RF zKFy^2J3P^RwZur5J^{gJFs9vt^x$`Apw;-Yr`g>f+}<3LX}ZR(*mJhjjNb^%5P2P; zus6uRNre*L+_>eIStnr_>FPH1x$z;WIq+7F&)L56oOZ`{^DAWi|1HL>fRg4d9fK8i z@t%LVmbT|0V>?j0HnSO5I^kwWDlt_UWh5c*o34T4WH_V3`LAh^A-P~uPG zB~jnYC1{SU*>QcaGQ&P0_W0~n04qK2C*t1dcM^G-n*E7o$=87nZNR~dvt>Pzt#1^; zqZs&T35x zib3%;1srO|<)_i5V z=hXw>-MI*@@v+><&r9zb1pibV=##ZzTdhWKK5o0kh_fn(A?yAZn-dR1NBl7OXQ#bU zHs716Se5PyEJ!TbU{&>$*6u5+(F+rlH!{WUb;!1cSKTmGEzT zuk)k1^3V8lQw7qWJE&?Yim|9!I6jUj4JQ+j;9y1b?aKJ`xqocpqTjIz2*6)nuKM9M zQ>E7#lwQvo0uSa0xua=j^BGjgI;KogGB$HXEI2f#nhExt zd&Cj&uVG|l9Q)4O78xPv zw=%-vE^YtgxX@D36u7P;Hpvl&mJtUh!!k4wCJ|Whq8+FXL32DR*T40ZXSuM>)5_6=`^6 zWQQ;TZ;3XU>-;K)IF;WP58T`oI{hd zy$SA@t0L%6mS#$T4+lM{oE?_tf^YO5zkN|3h%f&Ahf3>yOLB+N7pz|&`4q99@@Ob5 zyugnr0@*?Xeb4t(?)8c|9#nu53va{h*g8bb_9`?|;bZvyxumKoC4Y8Th+`|F9li#A zVy0K9*Nnj7Pkc3-RW{D zuA98`<_V!^RdD|#E4=qJs~|5GA4%&QbGfD&Pe3)ZL05>t{n^%AUwF&+TYhjRZ{#yN znJMScKc91oo=;@l0X#5d{<#Lf5CxHcNZ&d@->;nK8?VZp@Hdd54arW3FMkhh*#bRJ zp})iIE9Z!@vwix>J5Ez2I;Pu{n_u^_vSh-<%8Y<&-n8Z5G$3?&*#^)EX^Z`lqA=vW zG#j5JO>I8Qh+y%1^?AMSQ**%hZ=wDF-V<+BL;YaEH1ciFAs&L`|J0Zmh9>Lp`I7T| z!Iym5btFm#1mLfpS z?K!tp>TBzKcG~zS*&yT<1`zg_X#1yN5P<43ekz+Ep2J!P%*c1D=JB7n3=-D8ai(fN z;uWmy>?E|c3GdF=SwhfU{8S`wtKXlh9|lWkT zM^BR-#hHx1%4?&IIZQGRuJLx5BCpRLv{IH}RHH3VZmtnqGL!C4>DcqgI=XS47N2(_ zn-mSBvyMlArA-DV5sDlPQ-8SVLk}f5JUTk+LcOOU8?=H+U?54S{D`#&I&30S9U?~ zD}piwod^aj63jld>C1`9oF?@37$X7Ue}Ow15w6}i&C96^M=0(N>(N02kEuK&WW>!U z{b|T47Y{>}g&asXcU@TDs!Lf7ug-z*2i}}kG3@y{Jm3KV>0OrnTVgD*5l@H04%JZl zF!(jpc!#{tscOi0XjjrCqCaS@^vMKqs`ff$U0XOwUo9zK%Y;@Uf$!xtqMl+r(;7Dv zw7^)UVyUa^eE7n5vQ$sZb?dfRV~$KJHNbXekkEv|dK7K()7Nx=2In{`H-YV$bvA2qB&EJ|wR{eFcKrkY&Z6J!^? z_Cxq&v5_R;xj7)p@bw6PvD>j4!%1y?V2Pk$NF~$3e&F9y{Zxw`p%RJ6j}d$pq)6Fa zQ)g>JFsTRy-x!7^CW3Gim*XJ5YKif6n_`RS8MID1PeDVW%pThQKwpHrJub;fv0tb=D+0=2Y`fH|++`S1^%oldu? z0W&QN1AdXEiJ8Rri%Ut=@#oIxyX}|9C|-}Vpq(xTy7IWVD&_2k`ZPY=+HZkyd~o@v z0)IW5Xty7(5Y*cv^FB0)bj4inD;v$VNsXooU`Hk6n5@V5wRqQ~X07_=Lmi);_5R$w zEv=-7+$A#sKI4uGWwpt-7yRxXbdiTId-|Hn_#lxO+T+~%V?MypK!1!0;Uq4<2&Zz= zPob*1H+-fED;py>`k$T@oro_VJ`DQu@=Ij9FUEfE`E~u)x!bw_=UIkaG2-&c@M!KYFA?s?i}8A9+OC9~45$ z=4|6P-1xg0TuRF#*_$u<%~8cTkC&tjKA$oh>`Kp^x)M!sO&}I^RFRNi^6M9#@oAfS z%aXey=*Hf@Sq13z=Dfe`Kitf$%lTJ;!70G93Og8MTH1}I)m|lwSg;un6ehdWWeAdG z*`uFZUH0X8#juR+V6I)J9w%ZX{sG-YaKQV00KT4EsWAUFmrBn$mBWp1{=hNc;A_fI zH6soZ9ui+eVT+d7Z%h}F5~$;&lP|z@SFuudG+?C2t7!N*AZbp^%$&p;LsgTiJM5-v zM9}~C0}UkNOz`*^6`!IR*Z~LkcY-C($)VYCRg9nO=eXv?)NBLD3wb}cv=k~SNuAc< zTbL|%$rjMF1-=0|UYD@p_%FW#M&;cP|9r+_1T@ERQLF)H&?>=mYUt-r(TrG?ghfzn~(-PNk4x^eFYBPxG^Kn!1hz6 zg;hCy8zsN_o-dupPV90Ei!rks5e`l=KSHnG0{3jq7W>=&Syn~@M|njdEUq~&u%#B) z*2V=&P(i?HpLmC581jnXVXTdEd6?VXOkA#6CGI7QipRt__|od7)k2P*!BYtdMrht> zljU{5+GlCV&ofTLNNs2jeS}NxCMUy9np^-<>W`oGWxxqPBtre=%uCr~hQfVI1x2 zciz6ZtQHZ|Km8`?eSx8-aOdhK|5vNYcik@bvU|MrKAaN%bTQui)zEIFMINl%=xCKbr2r3hTtL9lT^o=H|3?bmCrKT<+%r z(cz~oaSb4p&#E%*%---%H6H7vFEb*ql)~>Ps$Q~z$9aml`Z91Aw7`=%atNEoc<@)5 zm>4cTZaG(XE~2i-$)DG7HC)D$t^YF%09}re?o6<;yc?yZqaMmBJ#dwRNcg=*aXhD~;%7$((*=%4cQV_PSn z!_sfQKu6malRY}Msz@HNb5=z8csLr{j(FqX?iwFO%RY>q`v)sS{KB-a_wx($K{QHP zQXa}=2}3w%>+QkCgMh?Yhf0pSO5|icv(<&weh_7ch55_MDR*>nI4k>dEOLqxP#3?{ zYIYzY6>-1^-ivRa!Vrbr*;e>}D#4&Y2aqEALSPB#NIR|Tj?3>l_E}B~p2uD_Z__9` z>#pY8`h2OE2t<{*FhdAYVqFU=V;nbm@`{UbaOaA&mTORON0NGFY8xyFlNWflP7aX)u|1$VrO?sQ3F*kQIRZL}Sm{x}k;C$~iO+nGvqSLJNvY!9 zPnSPapv#_I*t_%7mbq>Tjrxdhl^Z{P1c|uo{m~2+jku!$W@7CH=oyAI0j8dtw~ z@Q|ceYSo(XrKhJmZSBaqx_SJ^fHc*<@YTF(rjjPq7!}*#h}BAGmXOFphA2@cDF7#H zd<3);aiH@Y=ct~f{*6=?qbYX$`|q&Q{(O_r)5337htoO@cJ_m}$0_l0G!iOef&l%O z8Exh0NbX;&3v#tVyje%c;9!!Kl~vChjL+2DO~ zrt8zzVfYRGO96*}%x5(g@(NpUi0AElRs}pRy>rp45S1@t6RsP zGZG)*2_C$>%%4U{<(|e6ZTu#4q~GQG;dr4^+DrTM@Gw14c47v|xx~akob(Cx*!lfU zsPG$Q!ov7);pEa(jF13&Zd)DNoO&a#`wp#vn_#$o>?aia76bTTaX%}2p&wykxMELi z71n^n#r=FKoOv(sTK$YAg>U5(S#lO0d*Ew~_?`>2V2ZIKWlMHcc9+A6NDXqi=3GHj zy4flg#nCXmZEb!n(la`!eII!>a!QG3;Jw zD!n(u5+oTq4zWlEm9d7MQ+5t!FHl{ye`LinstC5J;jkQ+A()seU-;{*+xQ*M#)iJe zS5gQJ5(!(Nq`WAFmZP4UcgI#lb<;A?{c)83@z>-X5s}K&VuagD^Y-@@)FEtc_Ql}( zN=VJ`c$?gBvvX<%MP9%_?{XwlMuvF|(3{7}E*BH|Ha2)sF&fX_ zUc)b1Ug7?q%FZ(y&h~5jAtZ=f7er^&Xrmjw8@(n(ZxKTDGHRmN!6?y1Z&5~=Xwexh zdJ95~GHUcX%IjJ0r}tgY|9;kUeLcTi=e5>#p8MGQw~wt)_=`$qi=M8l+@3jE9kp8Y z^g+y%oXt%wy-`vaEb5*`Y$!*%@S4I4gK37;)%D)!hqhe%?=3ab66Z0GlBsCXo}&V|g{6*Kw>Fse|msj5;{mM}^ZdH2pZ zleHtVQy|Qmf?!)?5$%fSUb^3FB{PC&LEVj@c|P-8|2-1=*6W%cW5CU^^=|jNlg0T0W`D|{pM7{_n?2>`6463W^YaZquw1!ai6g~F4Ipq^|F^PK^ zwzrDv)1amScRS?C<)1L6Qax6i&PtT;{Fm^$Gyf^}3J~jjrgw~yOd-S(XC4Etg$I@G zjy`*QsRy`nq8p3cFYTkr`zcta{Uk3RrfVa=-UZXu86kb%!-`MhU^Ge|Nf>9-YfU(Y z55Qre5Af=qlppv(#9R6kx{eh?10vlnE>_GY0xu6AEO7m_b>DhYupT?uZ}Ll(5WeY; zcl*e_CeJtD8WNc9y^Bcdw94QF;a9{Dz73l9A**siJALk zy_q`#I`~Uj_2uyFz774?Yz+M3800=~f4DH8*q<;5ai!qG=E2J#k8>%Ty8l{kPAytj zRb_B|`_8o9r4k+e3?tu1cw`?0SfRu3bC4{Gwn0@-GtOU|n^uQrlP<5l1!2A+xk%H5#n+J8cAAp6( zeXdN?19$pV1^$;4V-(PXs&}N0JHMxC#59B591_C zQYY^5q)s1w6_il_U?I}R^t>cv9eV7dRB-Z^XcFQ0?1n`3hs@Riov#HN(g^e_SXK+= zVxzv$Q=--1jf;O6Zg~0^2j3a65na@KB`dk$Up!pTr$K z?l2T}LHy%6X<|5<$qVe(a!A@U+E0BX1qgeTxBi~skDXy&lR#ZEm2_(-KXWimnj$OoT)?-L*b9dzrv9m(!`7 z&ci;J9qk!9REj4vcP$t-+8^ zb%~`>280Ofyhuu5t&mK0KkPL7;Pg|MIe^AOk0QuQ&6JkL=1+x8O5o(l=l3LoykrQ& z;^g(hpPYn7KNixXAB!=Nzua^)>=2UMQiZ)9zrbeh6t@K5=;M~o;Y4DURL;Y0KJD~9 zUeF?0fJO1eLOQZ`14YxoU1yK4_6Y;|Lb-A5L=9I;=x?fzq~>papj;j4SZotfLua1G zh(eX_;p09WLRHXKwxY9r09_~UDwHDcW7im zoVdpy441JFHgq^gmXBq#Cq}_IIJ#k%+1_-(7~J$hMZ#B_5n8Rr3u4(0FJ4Oy*v}~b zmIZyk-!{9_D3pAmr`(A-J!y*~0# zhf5|0;0DpGFb>0@5-WQZ(kT-L+(NZ+ZNK!cg#9l)IU8HYeqZS(0I$`WDnZ_|CX5Fg za1Vq5+n4T&iGms&0Mc%z=acbJCy?8eBgoZ-CInWv?WHngrzQ<^W5^v}{frEyCP}n| z_40b2C@FNt6LQEQ1F1Pt4?vY5qBqBwL`bFzxSqFG37njRKv$45MPu6m;;z)kiO>*O zB%o_+{K9?-+%S2*C#FR4>mw6k5}Y@_RHX}!$fXFBjS&FQs#IVy_i;E#{idE_cm7 zY4e2*2gx-Jvx$_f!a^yGM@bE3rpC?<F#^-_x6C+xI?px;W^B?mHc+ z3Ryg4D11QQr}FQ8%K>1zN!x8-J?@_q$bz8a;e&P0lc_SDo|W6*D{CG1i5-0nG*j-U z^VX-QUY+hj3MA|Xj?8>&k6;)>gvtd;PCo2db1%|Aj6Pc+L1v=gt);tY5Q$YO?!F6E&g;r0w}d`T3n zG3+?R=qS!q1?KiP&Tt_g7rT2pDyaRS23|WSJ(vmJfluSGKmfLdfLTlHh1rTz*ms(P z-RM^ry3SkyT`PRAgBJrwFFL8n;^w0N0j`$1#2Dj^A|4~_BgVa5h%-|odIvcF3vV1h zWP)wusE{c>w0ftQy=N`zQ3H@u)1jKNXjmvGgQ>;AiFXoUP2YV46)_k*IvKY#6b#Gk-Nvu`|#RCJdHR<{dRig{zVg*3Q6_qTX>pn;0O)n#|VLIqtS?~*rDE^}j^W9a51 z$wg%}e{L(;IiD&Fu04yyc;%e3UeD$6c?6UVsWcjo~~tich)3 zem_BkF(yQaxA4NihB+0YJLhg=q8%7gI4sEu(B^f=-^fv`>Jeisu*7Qg1b{QosQi)Z z>pTPKhF62MuuU76c9D2oUV{xMceI8jrk6{{BYM6nK|2^Kf$6NXXxC|5iM*VocB^&Q z8*|e%X7oJttK+SH!rULbUJMH#5|pWev&h_xf_}-Oh7a1J=1zT4{nt(CD>(9veYb>C zlrTm?nL-idAq6hi$L-dln>PHO%)^ew1fbi`jpa5q{Ota9fKzPlxr?gvGtAI~uVkU{ z@C*$Okmtea(z_&9-$$W@I0j5PI(eZskQ{HsEfIlBY0zK*8_hY1t+QvO=}&YiCX3%G z?OJ7ae&9*3;;3xS+e|XPSv`M%L#*VN6-M$~Ng$plaJRqM(?)ZDwvxlPws%v$o)yA!L7j~X|9uTJ&{D20 zoQH#Su<_$btSGIU7Cv1#kn(l<2_SKucFPA=?tm)Vo-v8^j* zQ&y~gY0q-FwBb88afsih#kt`uvPxQ~8?i;C*TrnyLt}euEOuumnd|%6*VFl5lIfjHhtkZ4^kh~mc{uvOtac8Z z_7ta%pcS_1RCbp~_%40phF(i?WMS%Y8O7AO=jq~yHvn7JX5B%}J&i!3J

    q+aYy2qyqzX?^5cQp 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 SYRn%!JYZ#Qr5XjR(EkJQyezl? literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975124.png b/docs/dws/dev/figure/en-us_image_0000001098975124.png new file mode 100644 index 0000000000000000000000000000000000000000..22e435764fa94b13734ae587e3d80e30d66792a0 GIT binary patch literal 11011 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975130.png b/docs/dws/dev/figure/en-us_image_0000001098975130.png new file mode 100644 index 0000000000000000000000000000000000000000..ea133acf7eb8fd0537fbdc782838546bed1f1189 GIT binary patch literal 7223 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 literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975134.png b/docs/dws/dev/figure/en-us_image_0000001098975134.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d894a3f6ca61503cce2a7d9eac808b01bce590 GIT binary patch literal 3702 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 IN*x^jKN$Py=Kufz literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975146.png b/docs/dws/dev/figure/en-us_image_0000001098975146.png new file mode 100644 index 0000000000000000000000000000000000000000..2becb07629a18d90fa24ae5450a6237d08a1df33 GIT binary patch literal 76589 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 YtZ~))H=cePM}z-qs_Lp#D_Ms9Ur>%)ZU6uP literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975154.png b/docs/dws/dev/figure/en-us_image_0000001098975154.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd19389101af810642eb3aa4d76cc7e4a2e0255 GIT binary patch literal 11506 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 Td%yjz0XDgAZcuUU{`3C^`Hto& literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975158.png b/docs/dws/dev/figure/en-us_image_0000001098975158.png new file mode 100644 index 0000000000000000000000000000000000000000..7cd19389101af810642eb3aa4d76cc7e4a2e0255 GIT binary patch literal 11506 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 Td%yjz0XDgAZcuUU{`3C^`Hto& literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975164.jpg b/docs/dws/dev/figure/en-us_image_0000001098975164.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f9cf0e0751e7199c2a15eca3988176da1b73fed GIT binary patch literal 54209 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�r_2iL2r>Icj0);t47#}J#P{(mrVoqJK=e)&H=5fKlE5iFZ z{<7YaH|vB0adsh8FW6#1Vo?_!Sn$+!yN7PCgxqAtP`jJdyvR~xajUaZ~%IT9Iv1x(eCXHXD_zpz$# zSN~SHYU1{2M@i`1nXm}+`^1uFsCDnoDTr6h4?yWrr2NDFT7mY75P&+GAkF{KQMn)c zgT6$PDUd}D1&+!+Zqmocxe@D;xgnxpvH@qmQ`xKuEzTbv*4XnJn;89(CuRDVx`qxr z>C|NU>PT_eW2`LRHP0D`ah7>M<4ugcnAww1q=K}>c`(%YnqS%ph0a{CA~9z!;M>a; zQKE1457<3;Z7X((#D;dPaEc1s_8;v#EB1cyzx{06mYY#pN9RUFl&?5d3~kO=z9IT) z&9M^F`BO-<-&U)M+nq1oYJoYF4}eHBHkZawX1*9YuzoU4mfV=SdOSR?hxGb@h;O)= z)-71=Ls?S*o;jFLY{2V&LdM3$v*?_;o7wp?ebx7}qY26b-7kuQnA)n+L8svP-x#wK z&tt)0nPyD*#+I&UpF8+tW9^XO%Dk}J2s|4*bULX+F9E-8M3I8@)Ss7Tq#%_s+LeOI z&zh~;Cg!`@hL`8Rh?1&&WCl+IO)P>r7eT)db8@70HWjE`oqpssn5VGw(rjz>rEtP6Y_ttM z=*QQ2_ z+&>OH6>fJM=9$3$TX4jw!wlIaH#B3?>PT;68mvzX#=U}oU|(EGFd+KhP<pgC0E?A=naUF&uuIlO z6J{A*jd##Ii|J2Nvv>249x^=iwUxN8)IsXawKB*yInv}QQ;T5vgnr{`pNH_8#XO6A zD=03NL9oj++Fh;03*D%uoU;txv@PfIQ><8V5(|=!2r)jk=&4JK8XXL7LFV=Kr@#1p z%KQi3dX~+iTfpS;XLynQl{$yKGL^NoRt-x)Q@(j7ZBrN=ENGj4y)ZmXhJFl{rnk%y9ZkmCakNFU&n@Ig`SH(%ygu z^alt<@Rf2!=F5??)iOL^JBc~T7<&08yLWg;L`@g(=dzEm@Eq8Jhk^PTzY-}paZG=n zvU_1bPtNCjk%zH>GEn}QP*rMHRk8KMl%y!45uKZ-jBzDk+J=`~SRvg7m14uXrS-Vs zi0(I2Xl;LS2=jJ1CB2{aBVypIyr*+`!wbI8p=%(Ik|N7qo;F_2x0Nq-COb;~?J5*f zwO4jz-dnA$gJ7iEJ0W|UbSY(aqodwkgme1W%F_K(jT|a z#Xw%;Mrk1z$Kp#&fP-UC%-X732~R0s$w|Mqt&Xh@!CM-TiFVP1CqPe5IxP(*NGPcaE3q^Erf1{@zJ;qBuHVA=`Rl_QUDmv*J! zDriw@OS6{kDvIlUIZpD245%O)*$f>pYn=wavuak(bke`R7rXv<{b1yqlQ@~Rb8_Sv zuTo+rSqu2whe>gwjSPiY?e&vx=(PTC9>?kvp;j5#vk?H%cA`ETlR&KMI7f;Nw)qbxkq<74Yvso7nV(Y!d zg7<>=2b#xF?RWYbfL^pxvmr)wXB?e2bb3~12YM;3BOH!5Knz%qn+ffzOCx$Z+4I8x z!m{achK8f+<9`{|bt;l_8*3i#OGFK@GOx|lxOF){KEbEjM}~QkDVMAB?^8ePt8DpE z&8NqEZzjRQ*SJM?l)@`VVpo;a5GSS45JIr7@_$DfwDw_GSe{LSVIr3rg^b%~|f z3On@`+z1=#uDhlv>LM&0(Yu!(9X+;8(z6d*OD?<=G?yjUll4+DlEblA)7NZhjPX{< zEpRSI|0o&V`Nh*#BP?{it6Lcd*O-`@)NO>6D~2umS==MBG`NsQy6A~zXy@yZvAgTNmH7jW&xiSG8&_KPb;6pX zr*>^_0cICVLb68oeO>!{FaSN;3I=HbjaWobyy)4g5S|k(B%8~ecEndyco;S0ZCRJ_ zyfDla?QjP-X;0KdT+k%9A*b$0Hswfq6KAfCuKfx6v4(2r?q6gk|I618-nRZXdNuH{ literal 0 HcmV?d00001 diff --git a/docs/dws/dev/figure/en-us_image_0000001098975174.jpg b/docs/dws/dev/figure/en-us_image_0000001098975174.jpg new file mode 100644 index 0000000000000000000000000000000000000000..41ee83fd8a4f819aa088be9e06cd028c5e35db6c GIT binary patch literal 2263 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

    #~@ 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

    >?* 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℘1V*1Y4 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

    w`jx$8-T*flpb)vw7;f6T^vyLI@;KJDMX zUq=ofSDNG&JqLZm8M0I!Ro|JDI&$=YPMtogYK?mV9KzF(ubc*(PX_&EorWRv#{|IW z^SauN*z`?mJCJz<{S$C*WVBx+qXV8wxdSjK0OrvTXCLvO+fmkwJHd8LpAG<+ z^8ictjErP*B~dn{D9VyB76SQUk!^a-w60kLlq4Jvw+`x6ue9iz-!8uhy01E!85@)#L00U9GE9 zE$isb5nBIQnyI=)eF1{e zmqZi*f_0<7kQt#x( z;1U01$A|%xEhRpVUO4A@wgl<~g%3fe001BWNkl(}b0d9Ik4*-p1 z8aUIhO1V-1T%^}69LbQ~X&XQ*j+V`|i1xApDAqk|3ZBsuHQXbs!ed!SLqkJ4a^#3M zY}lZ8-+kBkEV>KZi4!OE;DZn9_S@nSU z-+lI-V|U(pr(O5aM;{rFMo)oOonL<@QJAAoy-8$VRrO{`)o952C&gAmT6XBVMgH~z zU=D&g6`r!b{&@3(erBBkevRtr(IX~HLbKq@1hJTIYqERcJ!L=>W7TU1I6Hs(A=^DZ z7tGe=_88<<3vOWz_W)ocBd2ue&@LT1v|oo0AJNdzh|wDZ-jVSQ%W(S*PP91MVJ|p! z;*(~8j0om{VWm58I)f$?F@}RPWev)zl?QcT?+%TQ3@E}uH7|fI zB9O_qghN_Z*1(w~I&%0+9XPN{hmRi6(Ab!&WFILF`w9UXZBx`b{49pp2#4VriO z@L>b@`HbGdx#2p_=R3LxI?!cE2&Z&Q>8kpeS5#u z(%Tkm{uP&L#fs(n_~Vbw(;5UeiIT!Ql-KHdC6YJO)2@&*iwTH<2=v->9#_k!wR_hV zZQ8t1d-oqwY91|-GSY5X4orYD77EO!h#s@(ukM7N*pW;T2!s>kiN8&Ko9cn79{8p8 zKp@iWzly-}JA^$Lm&}k}fDteQz=0sNvJVV^J=gF%^pf8ICBEuellzcoa~=2Sy)OcH zU@qK`-*`sv7Tz!XMqByJ#^=DyxQ2Uheqe4K<9qm{4S2ZWrN%pjYq%HJavkp$-j(*j z^!U#2qy(hi5cJ+6Psr6?)LsgTv4`AatT2B+tI37OXOtzXBvp$%A)OF~s2c`?W#;`m zIB-f2K5&oz?Scz*@2ZD%vVYJ#7h|G{i&|dP8bN`=`xDPhl)I79(zrn92E)kSi+3j4 z2oNl95TfqhqJRpODh5WFJmZ`zssW-nKtXD}k)e`ae|@dCZ{MbBt)gmFaUlnA0A&%6 zBZ^EH#kAwJGA;m_AXcQBv~j>Q($Yft_%jBK30oL@K64zPAt+*@&lwMnF-DxnJBE8O zCSi=jJ;Od6=Nzu#S=^J);ePO91ivm%WDU8pj^Pr+DatY%&kXmVE!-o3b37{mVw@9> za}DS6duR{e!@FRN;2a_|@Ww^aH&7CAICB6DBM1>+;rWac0w=&DN-!S37Ikj*zao_? zWlLW}x-(KWS=vA%81Y&!)(&Hc$1r2abIm9Lz}WCeMbZuclzIdQ#dBMhN&%y;c}g2l zTBMU`cnTsS(Ex)PbJmH?Q}gb^xrlmVqzNTzBdl*cY4K791Sh3PrqR-vd3yu!maCqE zhxcX!03#yHfHDjsq)cR7inYPs(lDBF-a$1tHZ-hX>02Ue@QP;h@AQ3M%scn;Wn9f8 znz}r#hOK`*U7vpXY4eO_e8aqB&&He!pV?3S{rq~McYG#-B&_}d03#hafOE$|utr|9 zlpE#p8EySygSPG3qLclnJm);%3p}Tgzk~7|U@7)~XQFsWV++lOHaE;b^zM7_=$h-V z(1OJ`>A4r5)4@YW3`c_|504CJw$BL!8>Y6JwYtA&yntiFRyZ&mu{OW5u-9J#M znmnZofMKX~@C#7L=cR+^nGPR1pckHhR#(oyT$f(*2VHvUCA#dg%XG^v3v~be59-8; zQ^rS_|Mb<#lP7fl{rBtAOE1;cS6-!sw=B@6jT;oz%Eq^{yk=>(%9UY#vF$U>o-IN&oD#hPNYKf95X=dgC5jg#plzp?J|EWi8iyLIu!7wf_cFVxE~zpOKT zXAIQ)IsnX#0(jFqjb{(dLxEkqc(MND_ZR8%E3Vd~tDn&E(|wl4ZvWwZy6yH`b;VV) zHGS4anl|Gi&6+bqmtQeo?|<--q6p9d86(kwgFE%)(|^H>jAtFaAYBXv(-FH+wcWu?4eLF1*jOf1LsCmu^FxqTJo370Djhg&t zJE<`Kn9l5l-aS$ac@SDqID-%oW7%7XVkV_7_y@0i|x^L0J+$b;ItYlp_7n$ZR` zR9k5S^n0f#=9oHeXmb4={hw%4s{;pMfsrY#>BNx(+P3vG?LW9rrKqGFpaiGb|AYXT z^Hw+fGX}`b&{2ToH{N(n4?p}zoj7sKc=b00z?h>%?-BXf$|8yMO+^`tV<%7O?N2_| z@xcL07gZ!VG#iV9q`p>t{RBHps{krpw(T@K>eL~6q%kjP`_4^TzH+H%Y_H@mf zHBE24xn7@rzQw>e>}P3I)#%W1?cDL6?z;OXU2)|cO`kPKGv>|LWmjLLwQs$tGXwC1 zhSEw!X{n-mg52yNR*X}YImEe~?M7x~Z`XU_KggV9xgfHebhX&yFfNn&9p^FT;igTS z4CuM~>Z`S8%^Dp$e%!!ufHDK>0sv+-Fhqb60fDSc6ep2fj1Q^J=sfIwlt@XGM58)& z@`yHkx>5V~9kPhwj?g2Kd0j7XUY;vSang^wKoO;=-0pgwH<^1qPGBwU2wq#`isB#3*C0xZKfxqGXZS<{ont+{_-#XQq!kT z*ZleO^;duOSNfa3`5R4}HcfNp%+Wvp^FM3WtXamRgG?Oe!TGUw`zbP4vqKh`l7`2Q zY0ti``gG%`W*^RR5<%WGr-uMyba}BuXr2uB{OFUP+gl(5XNsa>9X`BQAAInh1_y^c zohd0QErSS-u|75~zZc+FShqisjhxwJTOkMgnt|gWe}Dr(C!qO>wr$&>`SWLL-aKT? zo3wWAdR425O696Wf0>g`0^M(^L1~Q9ineavs-;Vo>BSdc)zK5DttNd69U!W<2)=Q> zDDbfY6bnP@je~j^ph)!B>HdS-_}K^Ay=SM{8gTmXTAa|F!j=NC-wS{hHP?{maTrLl zOw|~fhE(C1YL#K_-Mv-!th`+xy!V#Q^!HihSA>(U0bp&bZF&0iVLkusYF#~lmZn{D zp%yJ(pdDZCQ8}U{Ne>AO?dRAe9RvFWIz09o=pBF-fd5T5-J~0CxIvFT`l!)E?1Quy zx)^Lan>TOP0}ni)E3UZ0XyEGAt1SW+x*GJCucCXj<;VQ{_5c`0RPzca)EN(HQa)7G zcjmYrd32R7yJD{X{epkj?=HGX&%F4uPW1IFZ?`R#RW&B{P@<8Mer??Fu@)}4SxXiz z(ya>@>gJno(xOF+^u-rnn8DRj>*S;{a)rm09fV)fTjAN^-t}}2lb(7qjjW{6p~L#{ zgSC3@g=h8t#~V~l3Fl6gHK*fDdTypL93_5Qy=QI~YIaKu_I! zst2ZepiA5#x?w}mHQ-?qhy{U$Py^_&A=GjnUTvR${<(Q{z4zXGBIO{29|pl^&gI(P z`}2%%`sWPR4aMAtjr-FU7)$t$m-q9}KW_%488c>>K)r0)GOb&;&b-wEXu-3$Y}sNC z2B%J)vU|}sj`!Z5?`*syzw<|1!g=gz2mKI!=NR8<7smqQo-ByiH0Jbo7FTTg&pZDNK-<+CQD@)yuIBpLIF@yf|Ifi?BA{R@4ThYcka?~H4?&# z)g#HF^)-*~HKjUI6jOr*g$f~wG$BpZ3F~j*?T@FXKL>CDqb|`|vmXAG=% zWlDNNYL_(BcdAcMJpQzn-nLvHn8A-U9G-FmkI4i34`}_mH&m{SnotDKtR-cY4HQJF zrH@e79bk0eA}Uhh;d$dc(4u?HbE#_trT^(?HpYhjXXCT?zmFN`g?YtqY~fhA2m5fG z@#8yNm?L~fIq&krF8GB}0Pu^x!8mZ{%xNuOe!FJOn67ElE;RvY_UzeaM8$)WHNyQc ztl}BTZy0N*PoJS_(`M+>OQ&o0>^WMrXo)`j5D&=_6S8oax%{%Znl*EVDUNgI%(m}q z)~wdy!w0Nw7!FSNozSbVy`;JGW@+ZEX__|uV%z4-nWcpbZ_#I4HfeZt$Z}_srs~wG zlX`6Rqna^ox-Pl+5?yo6b-MR~2lVRN*G(n?aC_^`by~RKM$MRhu`apjLd}?Vi7uT! zO_$7?sd-mlt%o0fLSODXs3dRdwxxII(o1J)*7P}=JM%KloHkqY=3cI6o_$t_jvO{; zAm;ec=!jlA?r@(Pi^y zYR;S)nl}9sU33w~=9yak*yGx_|DdRkcJ$bBJ@n8+!r*{{z2KIcwQ1ugdgq<>y8E6x z%~&#L?kqjN=25-<&Kr9ExhD-Mm@{XlX3U(SOQv0-OD?@c^XARb%{Skm*I$20<>3u|`0K zR`@(}`WEIS`>DU5R}b`#jb$n<6eg31Nh59^^6-&D>1>idw5l{7QvaEQdgZmJwD!%H zwR_)g^PnUGiwF@*w_*k9iPQn?n!J(f32#TDXi@r_BKqjbr=Qfn{q8rq_NJ@#!YeQ7 z$nle&jil4onSnmN`ua=y{qHZ-HP>FL#Y-3Hu6vei^_qvZVe=LZkCna=02Wdok_PLG zty^@@-7EEni~d7*EMKOTEAQ0OrAu|qHP`6Zzy6;FG(j5yuLlSF_4wnD>DF5pXyL*I zy6euBx@!KFdf>i$?LHWS$(T{CjOz8*U)HSI({$xkmubby<+k>(n17YtSpT+0X{V)w z`(^+b^ctQ7uRnV9s2+d(aa;Qs>+mqg;~Ya=Sc9y+5QPv@$#=b4F)q5tKL&3My!-a; z(VE9s+dD5@xKJzZyh{%~{Fv6i`L2eBJ?dcN=1(O!Ma>4zG^2{+A??_?Nw2;Byxx9itwxC|seAM}hVY31*rey2j{q280yXX$ zlrt#l@WGv0w&W&V{QG~??|%CmU31-4dJ99_Sjmh`b-)H>7)yx=2!{OVpjx-@0j^0C zN;G9+MlQ8t z;aQpHlnlbYdO`Cp^Zn)tZeeuN>)gn?fbt4p+ zqh1%C+K$}_S?B}nfC#W=R#P)8OU+1)ysCl0)7r3klkR-rL2dYAn}*6|DmmIXVON<5 zfCZ-)bDt0?3vqI=C_HLrSpCCPmD(A7@bP-hoj+T1u9&TRAG%+kY}ugU@}ONq-QfMZ zztm%^9y0*!?mL(3)&9jO`kSRH(qzG(eWKS zw&}qK?$Z@lT&C&MFV(DBGtDVt_MF+e`<}bCedi7Xcs%k5xg0qMT0VI@_q^%_z#K$I zX7U=BIGXhJozUyAy`)&RyH}-1E+2{EMmg&(m7$BpWi28?6WUM5{0x{pT}c<>i> z!f?>4sZu_py?eK5_2Wrj|Q;;ceoaxP$@bjQJKSV1?R|kzjr%#mDhjr-aHmzI#f*xMI zT8EFFw8)jbO__wGNM8(14jZ(>Y0+0v>K~$||2gl$gvY*A(ZIk_ZP@U>{`ki~YVV!{ z=8VNU1>h!=k7o>Vrxy=8X%x0|_JCt-fyVzhy-90rM)YKhu_FY=U{fM%O;Xd_Z@s34 z3$HN%?4Em8>e_3s)iqaNuSXwUqcdj)oJLzFnN0PBi2jxie7RpsZ(XMU^1uC8Em?fK z_Ut=oz!&KPsflO+m^sWr*Mn@*<&&nuLg&r4Mm@${aW<-*dp7B@Cm+t50EQzu0& zVsq%Wl&s8Z96u%jVARBIx=jZFjQU?umZ^VmKu*xF^H1x@ z(Zh(f2YTM4OTD{{6xW_1gON8XOrpt8~*V zPoUpG=YoBd^sVR=IM+e9&QW4fu9XzmC&p-RLR^5NUK79WJZQ1;pUVHUb>nIoksdLC1Od2SPzLS~= zqoj#dAp)!i0K|eiq{`S4z4g{}`r{+3^xFD&RLjXtk0F(CdxUaw86!NW>OgQ? z1No-J9Hk(%g+1SSZUD46291PPUUk(~mU;n? zZyX3N|Z}Cr=#J;6R_HvLbyQpov9{L=_E>4O^Wd z>Mo6r5q@5>nj)i>5%W}}T_}d6$7wWTRVzap>_4tEeaCe0_!0Guj;K zUNV(2-f_fIWQ~$^wm#*aDYclInQBqljH`n~1FBT3DwQkdAi^9A zW6KzzJTV^hJL3~J&S8A`o$+Dp8F#Md9L{IsJiaq_j3wj9F@9qVInM8A1Hb^B0O>H8 zk{Sj8tgr8smMmGM-~RUBG;`(*O98_CLqS}=e7RnI^;LTh+Vk9V&so$2-j&Ojuh1X= z_^?*4yj#~@cY|imoUIpLcuA*Doz~Fcpzd06hyMM4{l);Z2OeCdJ6GPRWlL|>9m^K! zsV7$J(BT7?Hm$G!q(1oQ9o_f9UApn6YxVn!F3^k_muUGN%e4BjN44uqys^d%;2atm z)T65(*6qud>5ki%>-MF~wD`8Anl^K$uDE;c3=#huad-V7J@jK0&cCi-Ua-*JD{gA%cx>=)RgF12I zke+r(66m3Q5xm3Q5vYp=UO&%f}pPM$hrM(Jmsc~-M$&(b9qU!+wJ z-lx5Lc53SvoAvmbM>KcdOkH^41$yrJr}fG!&uQ7xg_<_~_gcPunXZ^WU%&m`g_?Ky z<+@|Va$R=C9E-fDl!vtai_dh!wO8vuetUtgoqx6Nzx#eYwCW)(UAj#3ubQtbuf0+S z4)3>go@tgDeL^^fE|pQEK=T-cu*0K-8715>JYGghZX z?JEGVy;{BIUOn~vYJI-rbH#XkTfuW29&io-;PMO-BVzV z#piYXg6s6^8?WlXkwYp~Yr-iU6>?yBKizfM*8>kcXdwNr zUAsMnDyeu6?9oj(-C)rbTR-2T9ou(k-Ro<0`_iR)=IN)*nSr`3`}XeAqmQmKn)L3w zZ)wNQ?Rw?aSGDA}+qG!%GM(uk=rNXdWfdEPLM9382ilBGz?#A<^R2hu(skEeX9^~u z7cvSd8*zGJ?S<>c0WebBOz>*ud8DL5Cdw@RSM&oPvKrcIka*7WJq^zg%vSo#^(I>5#IAFk7V4=mID z4=&T@E$?Z^&MlT&^3>@w7C}oJIWNu1DwR%a_m>;B>Y)`{zT#G`d*fA$xN9_!+gv^~ z<7u!wn4==#7luw!+6RY?Z@ONCuJ@--9sz{0^nBDaZH%eiD%sX-lA3WupKW$BV8=DHauejX+wAJ z`a&Atm|1RCJ;x+?JzSsr;R+&(v&H=D4ZFJK!Ru><4(gU{gnp$~DY7r4tQUAaR zz5C(2y5^RJdT+yK12i1~!x%al0PE5-s5a3$mO`|it4RtfQYbb`D%DQulh5AKO^a{T zLu($^C!cTBiGfq9WfgTgsj{e~ch{}clA9On{Wss!j;&j?W%I{+^2ybjHgmeRZr`cV z5~*gPV;vD)cKX;UJ^$3Ry7w=UG)FLzt1jwhdZT>s;L{HtconxVyu7nxoKfN}M; z*XZ#l*66^&gXSzpia;WlJkkl7rvU5=$HH?_rLzHG@J!F3k!jP$kM+6~%P+sGwQsD`^cmCj5C8BhbJWL3aIse0d5`g}n{K|i7Xvd)->j^J(Z2V6A3V<yyt$s{^o}o zE=Ou~sDV@U`hTo%oO2pD$UFUTX#x7qoDP3{52^P&GK?$`=sP@@Jv!9JjTGFu0cn?=bn3vC!>?S^2#e(v0{Zet^^(( zT6KQxae8VhYi4S8$jmaLeFrz|sb?S7ZOiY_zC*{9SS`pz^;XT&3wOuJK`;lvaDC_< zv-6{O{`_x2pOTutqBH#m_0Bu5Ytf>`+V;h6jg3Xh>!k9-P5=N#zz7-Cy1bvy>Vz%G zT+sO+=gpAc!-h=ke-20ia%W_jsg?E2)2p>)$qib&_Id5vxlQl9{f_Rw>t5Y*^CBHO zM2bfoFFd*z8&G*@OfNn4f-bq>V*TC!`FC1;>r(C9z0Y)cqN+Sqv-3vRTakfq)bV)< zkEA)Y37Uaj2LLR|$FybJhr09LC3^hnH9CCqm@uX=p|M#2!sa20Yssl%kjJLUWw1Tb?XkVa%0LVZ$ zzhr{Kd3nKt1xCZ5bI?TS91*VQAJ90?#}@VCi!YiJ9#LNe3~bxB&75;_BzWhYcgAf2 z^k;W0ds}jLC%}nke7|qs8UTX^QREHOlDxV^R#AAGbWs>;&J3K^ww>Fx`iV7q`o))Z z@c0QEkd#99Me3{1H*eA(@4sIgKmJ6O5}tHz%a@O51m4RiZh&6Y*&qTej%wyz&NJKQ zE$TUkDMC$qnnWZt0JADeqvKlt=2N2@1kXMvO()rZXX;#%~ zB1BVAmqBnZorzuQ@9G{RVZlv2W9r*f4@~vI&%Xx(VW*|zjH(Cx3Ird)HW1}-4aWjV zz#c+RI*o@Pe%OR!4EwLW_L_Nl1@HjifOFaSd@dqCx#uu!1>u^{W;`m4UEG7;U_Lw( z?+b))yvc~3MVRK;%P+sA{{Ax>CBo#Dmn{R1qO#gz;lW4c=p+64UD4}7fcR?fcw#(!$U**Y|~~v`S=rh za?Rs<=IJ$h?Ufg_apT9PfRQR=@4@~0|Ji#F<~Y(TTktnb>_$w)#zyQ$yxEwY*qApv z<~_YPD~(2@mT9$@y47k+vYTvr2YM1D2oeMV5Z)UC1PBn0@P_b?00~3F5Z-%RKzVP^ z#<_{4X{n`djnp$zuo%fgRb^FWWq#lN?!D)pb1Q2qQBqcfntRo#tSCoaeGMKD^q{n= z1iAUSQpK**YT@+IhFdT;+KZCA*(fT!gUb4Q7@VGjmTWyb0ozW{+|(#)D~pkzn}z%L zo6yu!kJ~v}$j-Tq_O|<2o?nvcAG^f`r`?Ukg=O4tYsa0O926Gjqp`68b@h$N$tgrd zMJFF{C*guAj4EIsNS0!-dI;gCRlJsKp^XKFb34&=f>&VT`!G#Owkd%~&rKLrY2+PaM zlO!z}3S=;HEVH_jKr&fiWDBgWu47_i3XP4;2o4TGSy_e1jhT!_JZNjhxihDbn3RaA zxjBqYPKaZdlbMW=tCx_Qn=LXpo4R!@t<7O}ejIgml?c9m1&K*<7#wLp?nhE$0>($#?`Hy?J&)jjIRGb4pF(qMGmK^(A|pc)9T|$jzHXG=%|qz* ztH>?LK}T;l(hKw9=YI(`&8={Ffsvs}?D%juvTx>MW^4{~Q}dFHK7Z)~faNN3+jIO?Jn4KQj+&?KEO2>EaKkFaYg6;nC@L>OQbr0U=Vt{>b9w-7BoC}_ZJ@TX2B*%P zKvPQtCZ|+(iMg1#H|7ra3>zcB* zNo6t9ZUVe0zm@DoGFMz~0$^JBd^-5RUekJX^)w>wW(;z2Go;^xjdHo$eU^SZ18lnj z_}iP>zvnkmjEd)Bo1wX#3{wCwW$aKwldK{pfH=p6E$3#hp%pAIj$m$P5G~F3kd=K4 zZJnK1+SJ0t#`7$|+6KTJ?B6M@t>-JPmFqxeJ^@m<0APx}aoE<;+*F3x_;3`KmO-O8 zz)98td${@>O5Q<|PFA=)M!38jkL(rn=f(h205D4AQ3i^=qO4W}bh-_!tuIQyz4ne~ zL`B~aP|R#007ih2syYhj$a_iZNn(%r7Udu3fRCT+GQsO40H%l6Yk+2J5lwB4@H_91 zw(iH+WKn{=hegF|qEtE0Tu0Q6Np3QHc^%nX%Vl%GVKKpKU&oel77rdb;YNHo?mz0p zntl^@_A~KNYSs#?egkFsc?dXt9;5w3Se~E3(jp6=tFdF(E_6Na!=_dNz-TKRW;^OD zYY-h8fxzmeby5fOo=<`$7l=WivWmD1_VRY|`qE~?w{ z=T}X_=K(PGRaF>JO8;6Wp{uLQ5D^}Nl;k)pEzV$RX%1I{uOTcl0$F!*v9`Jnx5JK& zwFNXbmLfRhJZkEzF*!Sfg_RX42(eLJiT#f)W_X=WR1}vWC?F8g;gJ{_8ADNVG0tB& zhjZu8ptP(A3yX80J!22Z#H18_v3EZjn_4kFGmn8M!zeDPz>%ZJapz7R);Bav2P>>A zuS*o4+FBYA8gdPNy#ugV_}yIBxDIhWBT%KXNC=uT{-*q)5deF>IYgFxJLC|+-Rm_% zub)9@cLO3~5>VC90jnhh+b_rLiH{N(do+ltihBlQMsMbPe z1YhzL82@$vK5mM1wqoP|IKPnoh4`%7Of%(M=zGv#R|qo}vmR}2b*QT=#pdRcv=i9e z*hG0L3z4s3Y;*!h{JF#skK8E!@YljtQI(z@tO zQfr&7*L*I_F3ch;_YN}dNAT9eWfg$cj*wiZO)2*c>$5G*FM0BWl%tCF0H ziHQ+SU5nWwD5%5ccn$z#4S*tVL3GsVWVIrcz8x+yxr}f*7EpaJ6A5YYD64A#yMj0f ze0eS64Aa4r3uo8CJdCaT?Z)m8);NXBThek$*@WmIq z@jw6PckoaD^bh#AfBRSb@P|LZ&wu_lu3Za~W9RST@iKA7O2+Sh|NHpKPktiO4SV+N z!TayOkGI}>OPqE}*6~~rgdy#jznfKV+@H=q9eP%K@OSfbC&tH-oREZf-~I*Od*|nP z^R=Ji=WoA;6Mjd~)zyPF%@!)|RpX%S?x88mYZ@=>fKKb+mgoFfPagohKZJ3xC6-Lkh z`oH`I{^=k89vSIr&}lbii-@>^fBBd1;*}r0g21a+aPssiy!Xpr;^U7$mSBt3h-6Oj z8nHhOt8h3DIBs}7IX<{AwdP-a^;Ox9A3y$77K;f|^~SNo>YTs$i@(5M{^ef^#huJQ zUPpBts$*Yy57$G*`D75wwVliX{w5}l>+5R~8hRbKZ)XZKjB+jCq-kw+^*uaz*o~Fdb!oV++gL?fQUdPeCdurN0x z73vNrn?|#_xfzR#6ZrJgcTrncAGehlzEe^Xu`oX^ zi7+O^7MEs)rBAlk_{0cWT51sy8H9$$Dq%cUR8%1{Iu4zW9>Zj{ATuW&2}zOI+FF!8 zD+O7ZNQ#U>dqXP>n+D8G&SGL>5`9nlk#jc>(@S%(Iu)RwHjB(eGE%s)+EulKs(s@= z+|=jQarpB7KgSthT%>Nll>tVHTe}4whY>!H4jvB~!Q)6y3q@vb3VH?~!{YJ5NQNze zayP4e>5r4;<$zl@{>`3?3cJJMGD`KN(`$m$XTjL)Ff#MA5E>haq3LN@Tt1i`UO3zk z>9nQwWfYa&#YdlffS}+jNKA=E)}3^e-z&$&%$$H=1jAyRW;&uHqY-f<61Deg zr3WMfZjt}pX3P?tA%m*7uMb(bbC8gjiq$oZ1f?7Sw6&^_!u6D!nvmo3JZ3)TMo^AA z`z(Us+RVo+iWnOk6CdT-`#9%b1i*L>B*DGi%aKwtJkIRQTeuQ%2~{jesi{RlegTS# zO3>N$NP54pvYRm=tAg!zJ=|`xhK-n?n?TXsT*O32qNl41RtwoW3UE^2Sc%{ef1Emf z00~LqxRsfT(y~%Kdd$9AESlLataLDmsfXRMikjMdBqc|nxTHWTcbzV;u=yy3FUeCL zhnERdf?rnI$RJ<>!ov#XZ8^kmHmjaHC+z1S)xJ!6P*RVw#d>%=o3eSmIxr#o=y40u z(qoWUkSPfe75sWCf%p_eR@O~Pd`R+Rd!l`_1N;xzThiJBfGN^-1X}3lF(zlSl5H$} z(xQMB&Pv5N)mDsfJGbCV{ z&P67R2-ql6OziVxfXAhQ)3J({mNLX8Mxdy?3L1kE4j&n(cDUF_(CJWmz&hCrTn~pw zCw7KlCdcJh-*}z=^Thlw`d-hDn$L3$6(%nI8W;PNTHtb8;Bm9X1J9Wa>^(R*)Qgzd z2=os;5_JIu0HZIY$aFprfVnyD1*jr;!+xX=_&gT)$bNKfz~|LLZ(KopXB$rXU&5oI z5g6G+^#uTo2~wVC&L_pD@px%BJRTk&#|Q1A2VSQYHpeQ~bz`V+FUN)80JQXUVa>oX zVur!G39s7#uU&`xwbi(C_8j7GM55r%ZDik0M^sFN$o$POuZjGj!{LG5>cqnIJi>!Q z5q0ebx|%w0Gd>OJ8QJLSeIkVs`YkQob_ed>$wABF=2dcREo7|XIVhVVnD`*H*Zp9BS{Lks1(89O!gNy`R&^njPm=xdR)B#fU!^P zHk*%dXwQ*#$bj(v{H zS1uwkB^B9ug{Z8l#nQ^E_}&tydAw+;Z$x}#G~%LSP+M1z{Ra;qAu%3L2K!;PQIUf3 z>~1VAEu*-k4Ey#UM0XGS9h;%m>M=Drhx6wzB0s+no10qs?IxpMq&U}B=22BqjPvJC zp{uh8X0rl-DPvZN8)!!qB_^&tw68|Ey?Xe3>?KUbEp7bvl1yfy&j5pA3hfW85tWpJ z+O{6(DS64Hv)2fZ&mt;ME}I2zs}nwl2SOJYJ4IVXTlW0y=HT2;M3WWGzDIUN+Fy;u zsf@ye?rX2TCUG{;9e)FJ08>*_(ievcEbM7XK$L9pPd@nsjJG&OI9B*KMfajU(w;r2YEIO?a0Bq>Vr1VduuShvp`aN#;JoPDk`RH3I zKp3Tjm7*j1Uy2{8u%Z6YN6OD5(@F)vIQNvBnuBnQYMjGv5kHi&jt&P~EjXnOML}L6 z;$suBIKKpwfeJu2xU5!KHVwFR;vAxaZlEH+4C#sKNJ>b>;cLB*guTL`rPk##s55(Kj!Tl17OtCrOqZ73sz#8?M4`FdSQT((#H!w zH9Lj$tV~2EB%yC)6c)D&1{rlOo=>^b0t+oePlY+Ubl5&$#6WuHT7S*ieF6^+fXc)c*#4KUkva4_)p zdSEaaVKr~UX(Lr!{~`d!IrYLhe+hv7F$dtw&whCZzO6GrV=E5-wo&EcLL*Ki%jXGv zk@3Vn8Uzm5(3XG>jW}i7$eLoM7mYvP!{j|3R)Pq8FJ;|mzbJ#iDhD#e)P0{V*1!AL zstXX`!$pGk{2mq9;4#zT=5bPAoHB@HTCkFg&3fnNW~3Jr!3dMdAaZnxiSY;v3lVT^ zdU{g87ma2^oOga67c~NX)Gz1nc;%H>MDLuRNynWVlh|C?m{em@o8Lvo5S@Kix3L*8 zr54Hfpx!x;nL&hZQ-{U5Ma)mlU}0_&4Gk5zemxLp&-r6uXbj66>nN)(!B1ZO0Sa@o zQCV7ykl-Nv@>jn=VR0Vvb8~R{qQ6LvXmlGeJB-lkRxv$3fQEZz2#dUdJ0-;!TU><2 zRlkLSo(}x$cfW)8fAw>uXQpC$ei9SYWAMLl934bGf8gHwLz zFf+BFBp1ExKcL0N<}9XXhEQ0Tjk9O`Fg`vkeX3?>r$rh>dX3Q;vRm-zQ786(@fi*u z+6S@&nAl_gu!j#HAc*?@Nr_loUc$uGB+i^Yi;q6~NSq0tdyYMhOP>2fhYra#;q{;c z!f{JygPQZaw$yNDa+E+912kSwb&T=)Gl5FblNCMu`}x;-JvmRF-JS(0;+j4uRm6T^ z_wH5U(4hm^vEvf~!fxCMm2ty)MRpLsm!CO0I)>!rRQ&X(KNH!*Pd?d!lP6DOd3hCj zy#Xe(4GxFG2A>!lKx{-9a`W@Bq}4)CS!L@M*5`*&S5bg7XHTG|qZRAgH8?$H7|k2# z?zxZTlsJ@@7lVu|vQX@-7IQgZwVScIwT94;Aov|WhKm>crII&1Dq2`zdXo_*iwOpk z7Ik%1=z7=&i)j-Nw*jz{ieii|&7gm78h0wI@pyOw76-62zJ||#xf>@Ao8X zfq$Ss&R_ONKG~UDI@sBq-OFTv1(YhHY-D0W0*dYy$^52nzSC`j-KB%gxrNE8e*EIy zS8?FrZd?kuAaW|9VG;Or$8IDh-NgLDiu4a+LV^xwY)ll^*OsL391|z36s82i_3Ocy zoEpQ_^e~#5tE7(t8G4mfwMb68h4#)KXpIK6J!nBwOEt`<4Y+JZWT&O#)WM@Tb?^i( zp7fXAW~HSSGT-JmR^?h)D23@z>>`7Hg5(VPSrowQO`FM0wY|T~0e&{tUjFrMp8+Ld zseoX=3jp&ttZ>_P@VW^KtU;?AMN-;z+%8B(??@kPULSNeC(KS8Y;Lp6O_$duAeb9= zxCnmv7$dOi)C{}RAo}@c$0i&eJ*MV{kX?|8pokk%R7Yh8v)v1;!z0@FTShH9A3emm z3ukfq>y?Zn~Zhmf6DfQjh^*c_B-V;=08{Gt4<0I?mTolGToGz#ObtPb88j(1v$9je-?Yc*n@pv?8V+a`;eZNfw7S>iC3s* zA#6DpeFi2oJ?QG`LP%IB0s;d;SwZ$kQO>)P)aKeun@c;X`Wu`_d|rKxbBQ*c$v4W( zvJ(C9;lr|V?)CNciSMAi=eGl3lEB#R(V3o_f)huNAUYx(C;d)H&%c8Q4b!hH&ZY%Z$QRPj zki8y*uip?5%wn+$Aw_lCtKtiN=zKY~aLk}aSzO$feIHjBMu zD0QbK8U9cJ7z-x&8wh~8Jv!KJt1z1vVX>~j<=#S9cLP$=qL5dRC5#$5MmbJZ(oaq8 zJ-2Q?KgquB3I2`0@2dc?XCRUSfO(|n3nklZb{(7!t$<%ny9RcP1`i)JOYgh1%xp|A ztqK5Uc6(s)JY#~fC)hIpOp((gV~aox??ocb&1r(+rS@0TMfH3p?sHCWdhr7*_H zK0;obfL~U-6=daGom$vjTS{+1FB90mE!oWL^g=S=8=tX1GPgNLo~zj#(;^C++V)c}|W&j2vWF!5Xw1T(|!*nrJE54(K@nyp#1 zv^V0=$}KD)5&Nv}1Poyxf!+hWSb!tFn<@vklU@8~`Qis3hdxz@~8$wfD>5 z7jPE$+V5jgtAW*LgVm{r*{}k)bqfpQL%5rji32-#;?Ta`_~Hx7QJ;{u8|zzoI9xtq zi5heUB*nxbHY@@y)eTr2pU3sfA;`)uz`)p)_+TFP{k=j(!m3!QF5<*`o#` zv#zWgUp=mV69DFPF+L+84tDPR47)!6O!|GX zm#@pMD59{JGo{E2?-t|7KY0~?Cr;za)$6$6e;J1l9mm--=h51FUs!L9Z3x0r#(h(> zjQg#1;$uI4)F+8`GQc?Z$nGM;&Er;BC1mjWd=|JpdXdX>dGxT^*;asTE}z6|BEja< zLvNTsOGg>P;u28S@DM8o2eftrEG`1vEUdS~>#)J=aKq=6g- zJz6c#0buG8J}<cnl7YPnhW(qc-~7BBB1<05HX_QK`u0Ho}$w;1ML^{h}@5_F*ikUpUOUrN4Q=x9${e~b4}bw{j4v4zdCll>Us6`fA9S_2EYhB zd0Yx@kCj+fhY4o80d|)e4wqFbna3x`r6FfTd;)q$M`2_CFAg5BN2EY1OG|L(_;Eb$ z>INMYe&)*ZiX?O?;YDdJ0$?sKTna>~^nZ~6go`mx+%o`-6lak@q!znn62&D+h)#+^ zaZMeJULP!OD=ZHEwp^nJdZPgjE31As;dba0P1ENXU@y*HKH{|7rYin>&-lytzdQpk z&%l4k8KAMHG3Skjm4Bmje(Ga0!{2 z8R+eO1ihYee2P3>ets@eQn>{+0%*( z9}{jaku9WL-;aLuL!3C_Co)G75#fl7i9U9x}@X4N+R;h$}qmL2%Eb9(jUy-+3L8Q6U%{ z9S}CK!(&HeR0NU}lQ2CoEj=Lko3Pn6qMLoMx*UfN9L2H2r!YIcAZ%u`l-*v+xoDs_ETgWj3>W=R3sZoJPhLZw zQ>C%2A}6%9wTk+>N_@8KV`OEfV{>x@7PA?*GHxL`IR)+Q9Re)OEzAk<#qmX^9mfgB zF@rD$Ty!)jRmrhP@b;Z|-jV&u?4vWnam^la1khNC!$6K>pP#|sMj1?gF2P#@7<`_N z3SZ-X9LwtbQ37?Yj~uTAlew=_)#I>Js-+S~4j;s4yLKSxY9K!Ud>20c_(K^h3k&md z?ELKU@d+d)rQioY_@VT(djD4+;=qB!BCo=R+72hb-z9AEp~pQ)h>k!>c^NisR%q>J zIPE%U7DmxjeHRxlo<&=i(lDJ8Y6jCPx_jCXpAdzDqI_tLdRTexJ#IK$PLRRDL|tEB zH*RNT;(Bnf086LOokwt3m@vSWR+eG58nL)IgN^k?g#p&qfS9N-6qOfYRV8!r(Fves~ba_n$yuU=aLHpTc*(_Z?i13PtbmAdGe=Ol;K7s%N_q27?9* zv(t!+iNW2X5=_m_OJ$_ZV}!-I39CaRl3^cx^bYpz{|x^AXXX0d2#=Pe#^u0Z)YUhO z{NU2k3X+qP5FZzVjg4hVLNL+5{&SSG;TV{j9*5DW!TS0v^!hbyZfa0kR)yGvR6OkN zh2Ct&s%8Z%Yjbee_3+qC$V^Jc>4V2`?&ujD-+K(7eYzXj*}2k-iA7FYn;9m%6;2nE z;vAC(T)lb)$B!RFcXy|Zd3B7i@?IG$WRN_QG2=K=)5Op2Wyrn!?^`|t>Kep*0${&! z^ZKOEhL1hKTn6|&8hG67^EiU|vuCQ3q%F$jZEtIdG9xk>5mb^G=$)YjZXOLGhERn-UpR##ImYl_Wc6&5RPKP6)O z`W_=JJPg-EL!{@5opM=r$|Wm>20R`nTscoDzepRb9OsLbnS74Y@o&EQrr3YV=yHv& zs3=EFOf*tcQ!q6(xgF5*n3W1$xxP{fuh?%U5(xg0J;3u29~+Hdz55FsKYSQ>3kuQL z*ob@gYLRvO4sL`;Vr+Z_PAB~lt0Y?)Y%}5B)!B|q7tf)#rV4AT%OW3Xx3iMp3eDz< zfM8u+ZRqG|Mssr`a&z+$7oUvujN4e>*o4Dr6Xq^^YdM`8xZhTZ+gZs1fZ6P1^LSz7 zn!qHhn^MGf_&j#NYXzkLi(c3RB6r8WbS$O)nn1?0F|Sk=vkw)keF=WCAb~}m1m_&i zO}JcKJJ(@%ti$QrM90HgVSwcq=16}uR!(!Hbd6L|GY2b$zDi8VF{LD3zxLsM%NF3v zU-t|EQ+j|Yj7F9$E9XtI5oF+#QN+RyGO$^R?eiL8w{5^--I9Jy(J@g-PS3>b@~VL2 zHlGhxpI4-YEChThyCZ%zfdl#->;cX>s(_G`&*Nu$+#7JaR?*g0iuj}m6jxMZT}K9( z7cQ#Pc$vI&hw?`)KZ)mk zdyVG!cNpNXtiokqhQqmnjm;@E-><{*v**#-I|#j*02t>R3#C{ntrRRj8y`wSk3h0* zo83hAmyc3-4vvvUY-mSNcfSm$f&y^w;X^Fxw6Ob}O3{R43wGlwdRl9d85f17ic+*R z)S#iM7I}9Ia4jqn!{akBnC;N(P3U{viya?+fcM^f6Q>RyL&TLEc=N|^J4hLd3kw7zimi=hDHsd67Koni$1oc0B7sOB(B)Ib+VLp$%BC){FtqjlXGOv%5GLhSW6d#k_paNiwlhk;K zu@|NPSy0Hr*VCs@OFYh80b?x|sPetcFR)ORaTjw4jHUQIa|~pPQC>{VExb4`{&XMl zj1mBIc*&wM!RcWf(}Tj2EL^%4hQY}N7#$8+DXl6%%Clk$eMdN;ALK8*UhB3$whz~I0n40`&Zimz;C{#@oHi;}k4OCp8H{1?G53jnf>-HH?N z>&w(1_A>Y5ti08u(3GD<(3|$E|Cp?P7y$5 zNlS-1#iCHA+2*pq?lnun&Ex(y=>e8ql#8k51(@s>7|oQ;b|~yGQJHu?z@lLy6HEd5 zgi+>k!%8Vewr^rVg4>Rz`6r!p?3kLKL~8m?#HFNRV0;{QvL&eT?Q%*LO>=!cu3id2OGA^e1E{^fFux!R z1Cw+-IX0`(1B}T?Wl$@~s>l`yecme-HC(-<$)(E%9|17y6w1oe5R)8(;@Wxv!0e!b zB}iw1gZh*vf@=nN9Xe^~%8C+2>H0UNT+}H?0PNenIN#<#c==r~&%mGi8K9w66Zrg_ zfDa8j?`ez)R*_jnAc4*-4K_C#aJ$?I<9o=iA)|$rT?EbO;BtRfKyV)} zBK-WXdwYH{V8yEv)GC3h1gjPk=I3Y8*VijdD=see^>rvMEk;~i49=Z90|HR2-sAiE zo`QlrBqb%Fv-82zeod6ABS^+18s34OqQ1<0_D^;=tIGoUGH__NwkMDfv zzhU3LFQmuQ#fxO4Tt!gO6`VSC0+%melEBGe(4nWh2TAcMIO}%-ffp_#IOrTso!o;R zJAaA&`;TLEYzjIf0k9hE-uo-e&5dGmY!G*{ZsFpkOBkP=z{3Zvh>i@#sndtCW!i+r z$>81yn|>WLBmGE9PDEi@8K#z&!9qXwC-HKvv6wJBHjF)=eS(_W3YcsLam3wlAvG-( z*|)Q?Ft-Sg%ZH#VVaT|72XoU)aIs$uS;OWnl$Dm@7w_yqQ+*FK8%7C=><$y0tRi-4 zCCTS^>@>cNLRArhC!G*j(P1Uqrr+)22!ld zVO8PlufHwQ;@&WoCCRmUzLbMA0#s`H5Vs>7ll z2j9=nhT58HBqhcRi!UZ7N)oc%ho3(^J%d}fvhe=IRG^3(OWfY&IvXCJV-&^gji_*z?Um0M}{2!gw#r3o~&oBnW+@Loirb1!{uD zx`Dp_hlo##k!1LmUMIb`T%7+NH}pm=#>R#*Gd+&}{$7!WtgmlCe&JnQynGo~gRkL! z$9-6BZ0v1=$7O-puz{|&M#M&ip{%+Lt0paUJ~wn;FLYKnbOr~OpRC}-&J&2gk${S- zYTU}p#``;eh2Y3gbUf~X(cy;4=7QBh`9mYjrcKOEjUzfT5{1R3m{?eZ$>W5{t%udM z1&2$Ex%px2+Vwu7W5R^V)zs98mezJ;-Ok08t05wxX11^|-3n4tk`Wslg_Y%bxLxd{ zV8_Jd2=3guE$r5*sd4GQ;qj0GXc9YBQCWkS_*8WE^lwYXvEPanPP-9ay9L=PX$ZM^ z6*;N5QJ7VTw4`*jwzflSFhXmwKx;9>XtPR{8tn${PGDew0OAC|_*f}kQY!gX+ok|u ztQ_R{VgRhBCe-_ve%IGsJN}USsdHWKpO4R8_?z~?4WFC-Hzg1?aJ!bUr5!22|*XEP8$q119TQ0%#{9;#I{ppO9zLa;GBN|%ByOzy1uy$fKftEsiw5p ztRi1UTf{NT&2F=ZbdyWK9X89RO|+o2xEP7?38<;QC&^8*n=YjwVsvZ(5fSWpRV#f} z+%7k^HnjqPWoPBUNnp!r7l{^~c1sFTXa}QXqft{wNvdU7+3%SB$}HCHA_+39%orMa zg4)^|+`D&AiV|pxX*apiX7e#w*QyNe;^KnLBNkCKH8sc_q_05xt!!M&Sq!B3CHx)y z-IP7_vVg%sK*^1av{dZ+~=ip#xcJW7un1rL-_6WQdz-s^{3EdtooGv|_>`Nzo7Jj!4 z;W&S`DYocE0E`MJT&u}Q*nrEq38$02BsT;Q>v&LujLZbwEy{yVZxla-EHFwo@}A5! z6##o`=Y)0erxIH7{7{O}rL-d8d8NJH?#IEO@)RUzet>|9B&*FLW#+VPN#SWvR|jI_ zVv(A08}qAcQXp%k^d)?-vezyB5wa_JTG-oz5^!#%XP3-Tncqyjkzt~N%ejJ<)?&mZ z-4F@H6*7RR?!ZDMCc+3FlX>be!RFG51foc={)qu#&-+`?+j-Sai_9p22N!{I>(h0g zY%sFG>~<4IM+R`*?=U*M+F`M9jw!`(W~*6}Yj&p{lr~iWFgsW*MgWZ0fgq&Qu7};S z2Cs|F?$@xfHHoJCwK#p@61w|_V0a3EG2T)7!Z0bS%qxx$N?4H*N&kSddhGw?frs&j zRR@P<0h?Q+XnatGvthxg>3M`jy&hKDV5d>!G;M|z)E4I;=ITXQH&BD^{?|qC*=g#2x{(bQGJB5G~{`lcP{|Ilq^#Nj2GO@6-E(P5_ryYga zw{Z5vVU(8M#pv`5sv27nlbDLw*m#VOkHTc2o^9wkA@)T}_h9URP9g+2BoJckg zC7zl7)+bOI3}ROB<1An z9D+hak&&H^Rm~>cE)Ux3n-G2_7*QcNMD3%uzYmE?2@+2Z^!LKHE&ac`x`xuya=iEM z2gpdjjmCyn)YmnmtfT?~7XuL!6^r)!_u(Yt*J+b$qgh?RgVqLI3k(nmM5BQ{9vM4u z{jq|@5f1JzEHE3~?9=Dg!tK?Gl7^jYx{E-#4`flhTx1Vupwo}xerF{@V&hTP)P;46 zM+)LB^l51uJXQhWyzIY5d0pqP17K=tgt9t_#gXg4Yoo?RYTUzOK`O&ArlNd1U*~>Q zW?^oCAQ%(8WI2%eMWqz>{2~Cx{h2!;0LEfOt(N^G6%`q(bg+E@*LUU<`23&CjlV<% z!0698-5SiyJwkC=4gy0XF*LOZ6Z0@G%QgVUIq>35y((Y6e{rvukAA;1!1GNzt;NR1 zFdFKMapiK50APBZ0#vhIfSGHzn}tOL;kN-WVHT?ZnE6Ej?AI^j?{|1#dKaN$pk(gatY-j}+z*!(iS(kqO@J0rngKrrK`;U{*5bJQgXq zp#&m*liZR5Osy=yNC3>l!g%(nrJuup{4uHnMYl=;z-W6|Ohg8l!|izrfKh&Ob!ip} zu@T6)nT&xa1A?*WEsTY1Fxl~!C}+G?KF!&u)MN}>tW#tkBLM3!>(-=3&rnc zETJkvF&%HelC9>{TkJ``L=D}HwM7OUuV^)Q0!QNr^uH0d`zA(si(*2=m>6QWg#{x1>OAv z&{-@nSgkNw%o5P`baf&*J^=-H3NSl83!PRc5;>IHN>5K02`2%)ygt~iN&`&g1S*aJ zYd82hi_uvy>~*>%0B7*yaxS2{<~C9?Q&7>|3KRR6fCiRQLRQfiH=0c{AmB2>=TxbP zioz_%pfa`8na4*;HQ<+DQTKRx|MCpHJOlsv&j4)*4K8mqxT;}S9a+B4=jhP#UNy{o z417-lz@mqA`@W*te9+E zTU$Y4VZMM)loq37t3I0CL;8*Jd-++c=x%RslVha( zV)%`496fj(CHdue@^}E_qunSiO~jXjoXm8|re z(i7^*;2=8Mn-Cds6-STl#hP{vMwv*;r@78QXzg@qWIV&$hB4VPF(ALxey+$j5#QgjiQj(ML z>QCN9-Mvn%uj;|Xrk7R4PF8xS5)cg!mMUj!eMq_DO~A z{NfzWUpOyJLo%fqNU;KuW0628D-J2g!6K6E+qV&LDF9WKRRZkrIR<46)(FsYKjSu= zk>i_VnyfFC0Y=#lj$1lIs)NGu%yG>z&A-(#t&Vqo4imCGCNd$|2d3z5f%Hz`*u8Tn z8^OUr$j;7^K$}!}Ru5%mWsB_L#N?EKee(;8(CPIU9vR2t(i%)At5j@J0x|5`Rixj# zh1s2Wn zFCZZyP7(@_AN9!G=WphDDJm&O=#4Ps7v{laQTzm_(}azcIW*s^L`-BDiYtnR0k&c_ zLE~`3;$m_cSn6HG@sEz;UP%pfCKFbTn|L_Tg$qHK5S5gSiMdsntWMDaXa5}C)-py1 z`w$jN&>#a4aq%e#x)vrq zgbW5FZr#d2NXRwx_w_)p+knZWLs!=WL`O%8{N?n_gjCY95Xfj$dRUZK)*vc284b@;EV02mp*kaRjvS~cNZ2$}k07iBV z0WcP;+1wVGodmKqm|J*+{Ni+k#Kxh2Y8GY}V6}T-Fqoh>>#(x5jH!i5j82U~tKX6e z%Z0^RG&D8f>h(}m)iz>9`fHJ$!pd_u*4Edg|5j^jtMv3BBbSxy1i%FRa@i#D?y#Fh zN;Ety3}GRm80hPlfR9y>N)Ip%hDUl4bTt4q_bOr3>!97-!pzjH0AP7{@?o=3rrm{2 z%?3Ijc7T$^EFkIa>xIss$I99ohDXLko}KoSHkWK+7Ll-zA{p0jzx}o_b7}Kwt7(6E zeYii9XH2e<@ij9u^;G(}rKJh%Bl+aXfY@x>Z6*`9wscZ>K>vkuOct|A>BU19oXZKX z(}AYCT14ImLtJdM_&NMu%F;G9w;>?#vdE|^OrUKELZ1iSU7d)Fjls2`tC*dc5+IQP zB9rhoD|?jAV|r!`^Yb$zgQC^y(A(ROoIClToa_AjqWB_YtoXbpn2pP*yH|v?lvtFO z+?D>CHisJ)0$?rzQY@l)5ddQ!Isw4kI_aOtieM!<@w>-6$GozAH2}snz-HTo-Ab1B zD$JHu0l+%D>XDV5jN+0)7>pKJZDc_a0Q0>7fT^D^$0PyupN@&6Pb#*WeM1ENQUS1S zGMj1_B&nk$xOu)@Eb=g{L#tUrOH&|n8~DtMzezMt_~bMb`ba5TcFXbiGAT( zO^}dMSCopB{%u}@hc0+Pu#<6&OKhRrX%yuguZs!@>(FSY(A=&7U_JfAFj!Ou7{`a& z*NJmU86Qkg5&$EsQUTS-6mo#Qnh1b-9jh=JrqI$^hjZbfxYzR-^Ey3@4l4{M_Iulc z%d(D!vRs4*oW|PZFmzk1(C9R1Y;VV|eMivIGXR}Y0ZlAsBj%?kusAh=*^x1{-fO|$ z9S3m1|2i7mI$?LSPnZo>qYlM+w-Ivn5*~E4L1Qpr!(c&mT{Dgy_d|JEDV7!&K^E`C z*f{)-9Y;w~F{Y=crI3yOF5^BHKT-vRvfi}Iye>mS!?=7o5P$y<|A>>@1#0TL%4?_i zH_!4+&jVnzT?BxoxZG`n#cDu(T{W_AXP~yG61=XIMode)iS+ag;4<0mG533QX)W|873MQWJIb%Ow4PPZ0T`DG%3gt|K%`&)e8vXMjEPFqP{dVEcds#sB~y07*na zRPuIWmTM;C8WtRq>GyB{_HR$+z8DK}T_gZX)eK4yvn|2iy?Z6TVP8&4fH6j=#?7tu$O)f0Am{>*EW#z`ybJ7d#AE~sEi@z@u;4w0w^qS_ezecudfU7@c`vO z8o%M#wd+H)wlrdOWd$2+8Ueu!WQbD+k-)3TgoTM|%#TlFYH%ENWi>c?qH>A%IR+TXIMU_rS>dL~=aSfkAehCzh5jcUNWK}3yOkxFUR_iG zFe3}YxK1nJmyB<&1;YILbpVWWh&~Zn+Ey$5VlAd8hLIQ>iL{hNbai*h+H0~qU~##y zsn=s}VHRVfPp~*QE^8#gu<4meghoW+>h&ns`LP3)h8>;K%IG3713E_#hTP4 zZl_x~BA?#)J!-AU(+#+m!j-f@4v z&cKE}v1)5;g-yf0ORC-CV!`B;YS8%}^?hIeR4L#W6Akp-$&_F+nQSfEA+o;+X1(>+ z8^ZR=$+<0zD>AnzbI4v_ZEY>k>9!>4%+DdzmL71*f{#`-2y~KMaXyDzt5!N z5;D>=a3vrJd0B1Qc+QaprCX3bk}?6?CrwH_y`_#cc7{$7l{!eICkVPf`UVkTUaa&o(Y<5 zZLDE!aTXQD1^C`~{|CZugkW@XRC+)?9_Yt`LkGd$BV}b3*wE^DgR&%Mc)WVJ+&YX74u`?r59ff^+`IF_HE zE1VCi<01~+cCw1kaqM#ra1FnDfDEuAw6?XQp|M&1z7!CM+u6BNWi&f8je?xp*th3%oH=(McgreKey;`T61oo0W#6M-Jgkz-1)n<$881{f^{-0y0`jhHYTKkbLoic&PUG$Jc26Ne5T#%abMk?L4kSr!n8)#wDk7$a~a06aM{g22lGh>ecHnpE)94`AG5gWjM)&!ct( z2Kpl{VvX*KacsjIVEvHTTXz`Zo~4zyc91SJg^Uu zkr84OQ&Vr^#K|+bos*5lr8zi+*+qs4`wlr#U0IDQm#@fqT3uNZ0L(*~D+fWuMMOn~ z!T;hp0qARM>%rp)47@4KHnF4?*>@S{w+P7^qW%K0TrpSg0$V24- zvH~gP^i2RT^+$aRXZQE{3e`?4GUZg+QEZpnWfSmgc4k~8VGHl(B0M4lZ@lpu!Xv^& zB9(I4^!r4%n7xJt2(t)dPAO1eRXt-EN~PQ3bz1?q5pc72I{mB}v^}iD`OBBlKRgbz zjf^qQH5CBkwPV6kF)u3kB@8o>0Vjjs2_L0qT}HsQ0o~Rl>f5StD)c(aA9i6*tA&Xy zU-KqRrd2pB>*#1GLqxzC6x@tQL0%>@vojGK5rNMS979*{5R7J<_#ssHaaoOUTTNJ* zo<(_n8TRbhkK@PvQC8Iiqtyw@bq^2rA>jNe{PO3oBRV=9j|QHIlxFwieq6eA8D~zP zL1jgS6hBl|RN|et-j;r`cXAX4SVcvJ^iC$*hy8O|R6tOS#Z;_%-?4Ki{`znJZ`{ht zgl1E-ZQ~S>{h6Pm6k4mk5XU*=Ev^A9EGJ`@uQfE(;6_-m6kJqQmP*mZfddEOe=z{1 zWfjos*fZ9SzQH~O-?)YYhxQ^SI!bbGlxIA1{sPVfTta0-BMdeN*48w*m7IVeLr$MozBvNALA`L10e{YyE?hWZ9vycmGjUV8%>=~<|)X_OeHvA!9{j`-o+ znR6&BDFJ~;Clj@XO)Sn%qP@8uq1S@&sHYc3lO1*^)5Z?*1L#+)1yR!5&qqIi#S2GY?a-Z@hMlWjMDO?@-N!#jU^k)vxe3fAcpY<25=uD%Y63m07&c*okZ| zjsXH)a@}|Akm6V-gV|e~>ofBO{H(gVI*Hc^m{B&7KpNw$Kc^eds{mjgJIqc4++HeK z^rNIK7s1i77@l2%(ZNDMGQ#Q4JOc#O^YH7}NPXqy{lEVV@a*!u8?d=KftKcS1P29U zcxVz9Gv^Q2VjCQ8BRoDcygv3n{f`5{)ZfdaCgX^bvYaz&ZqIDCfJNNL{SM)kAAJvj zS1w3PkD7aR2n&tGf&E87(8gqBtU~{S>|;0VCJUCP=5Vj15+{!M;pmYQsHtm$&SVib zISV2zR9>J|uK-4jC7!Xso(ZawNaKdn=a9{6*P?%b09XtPDoZiLxZ6$kGx3UTX7uy! z-*W(%S8N{Tvt3UaU|PKnLqh{-X{yDYtaKbdd;lkoA4OtP5*k|D&_6sX46xayMdTOe zd!%T&p`l46%=ws7<})+1k|Q&ljUs(W#Ua{8=1RGRgoGg~DjN6i zcWkr9lG>_ z2BQkqShO%17`_02(X*oND62hmFzRPeQkIGMn~5l@Z-B<`lu9O%^6_wC^ui{=C953G zaNCs1ZsNG^=R19U>70wh|FRPKk24Bie(K9J@GYDH)tIYa#mBTqbZ`l3aii1A$Gle; zRz6lFl9Y;TCZW2zx}>L4Mn;AJ3#|U*{@k8_ud-M&aQTu!Q4iub+&`_deNGC4fe;xK z42m{3)}+4@<;4hUojrS6HcB5d;Y=w+f>|nSi@^oiUIeK49`46YWrPtZBU_6yW%2Q` zIC}K3FueBe-GkGoPYTnFz!)pbS(VP?SXh_?fj3GY@))>Xy5ujQ7};m*>#MRa<@lHg zJmq%|moE4t~9w=>gl{={L~_V3+;Lr0F`)VT||7;qVljZIiun8R@Y zV?=}oTz z-~b#xbPzxJ@tbIA>c*xU{V9d0q(hG7jhJ+;jHXd+oL6n)CatA23J$s(gpiiGRG7fsGt2y_` zSiR~hedg1j);VW?U9Y_Sx{9LFh?><^=?sTo{^nOY|H2D&{sk9UJ&4K>5c5~R`jyKc z_7_QcZ*}C*VQs(bZe4lBFZ_3cEZ#@?L%>q92O-rc2L{2*9Hw+4nFf$ikdMrDe$qVV znK_>3b6QjE*F2c}1dlkO-@fEq`s`;urLUd+6?R;d1esRUmU6K)} z=<2Jl)>&tr<>2z%^DfZ0F8Pjofn9jfH}%!C&(U?O*XqTWUe@75hxGHG{zzZ=+t2BX zU;47XdC7Nm-US!wqVvzzFMj%6-F4?S9X@eHMce4`k%PMR*6W=$_{FpTPM`bY=XKUs zzUVRg#~=MfPd@XE76yGCc>679rCok`tc!~-x^Ss(|M$N4J#D*jo8}fy7!aav_l}1j z)b}pCRNwf@m-U6ueO6!i@>#mzdzWhU&D(U~#0g~uy~-M0_v5Q|)?a>3=Y09=`pvb! z)$W&`QLi5A#eFa7+BIwSoy&ftC!gBub$ZtwH|hJAU##=~{>%FGXFjRF`N9|Ur3)_B z_pbaW-S-G{cAuVo_EBAN#Sit_&wNr}{36X{zu`dpo0nXoi@y0yUHMPH)B_LhhzyCc zaEVDWCNBNXH+9LkF4TGF{k_+~+O>ep$KBTfV4pGyG*th=55BLzJL^mOn@@jUU;D=S z`qrhF>-M|u(h;)h%7LEP^{~Ek(FOX#r$4R#_T{hX;&U(5d4GStE;#>Uee>Jj)urG6 zzMgyeMU#q@QDXgHb=5!HK46cq89cB>*fQ)`0(#Q(ED&_^@9*Arp2nQ6yz~c-Kw8s0 z<8z<(F=0<6fTo0AE=?&rcSMJdJf~m&%RlPcbysQkb5E+APSkHoMtPM`y918VBX6jxKCCzPKc<^*TdQAQbB&(ccR&TiLNgMo_Pok;h|H2*59%jZ z{8$%XaY*Jwb@1En> z{f&BK-y5RL`*_sqj@xh5g%_TyPyY2MoQZMKMdy2u1vLBl6<6xu+ixq&Y2F?CEJBvQ z{L8=4U;M>?w#Wwi3gLxM!ZQzSGC(V_6F?jLF#Go9mw#7l*RIyNVHeUpeo*3v~YZ7wTs} zyF$0!c89aS=z$j31wc@#DHgTs;rq04{dKzKmK)t~kn(o*WUO*rxu@rtjF(C67?2)d zn$TaNr*_-(BleUV4z2K-lc!J z`U-8_v`z!!)-D?u0*w88i2$?8y^~vh)Cn+O3qVEuV5xaPG!KUZ`+$_k+`sQdtyy)I zzJK|5^tG>kNuT-bXLQzA&(_)h?R;IgVUu3o_l6b*Lsj$}rG&Em@KI!MSbW-*T~zA% zQF?viXI149J+$K{{rak(Y0FJF>UghD&Qb_lmk6-hI7KsJUQo*EJ!F8Ti%J*yA$zuc z?o`|ev>@>7Dz_hs>idPgPiyVkYjyeezN2sa{n`3Y|LOk{;y3zp62DLxV19AIejw_0 zGQiq#qlR8$CVT-x8<$obw}qx{rbz?Id_u?OUeUb|-KLAa^KCux^mFQG`3wOD33fUH zj2^jU{~#uVIIp9OVLqoxbwq>3H?(W_1Nz~={6_aY{frLv`zl9`Gx#XiJZ^hBxbIor zvH3b(cEQ(l(fME3c^96iAN=&Ey8Hfzb##7FSy^kCW$O3lmG|aV_7}8w&y)J)&;CiD z|McJKth2tZwHvnS=!u?7Hb3;>z533#F3_hw`IkEP+;g;P>-Bo&^*7xog9x%R0Ma8de>5_u3G*kj^Jd|^atfA;5proZ^h|5rO6 zdDu3X45QQeJ?S-`@sWt(h`I2a_&0vh;X`i;;_LhW@LhfL;`4RhxqmPAxy@Uy*V~7V zh+dNIc&xepf_6W%N5A;hFB}(Mc>ekN_9frekAHrJZoltdy?*$xGcTWh?gjnqhd;L<_uDd*a~kHg%66pDw6uM$ zTjD8vLe_Yp$rP}iY?Fc4sk0Bs@?egW(KRIwUQ};!pLRZWw|;WvFLlfIhjo0|suZPE z@hQLwsoGNcT!@FpCYM;u0j!=%f-PGxY)n*biA?NLJ9g}FdxKAX>Qm0vV!wvOLI{ia z*;o&aMkKIA6&BYeAjhfIJSJNlBg z-*tn&d+DXxv-=tK`w(7ZS85nd5v>heqMVYe_*`W6Qw=A2fKdYRgUxJC_X69i?_K@_z48hb5-9(Rz^w+{Q18T? zo_J)J{^iPF>&svGlD_<Ce#qCQ1;g`R%emYHQ}mGN7INIz+2p}ytVj?9$@#}bC<68*+1%n zbI;LN&iY&Z?dLwLubp#_e)yB0>gGG{*4$vAK~d<{eXr=I8@K4P?_8)0&i$IsJNF!2 z{H+W1PrtcJ&%XGw76+Lt$Sf`{+V+r@x_R?v_Yww=A#*F)B$A#eeYk%8Mt$;=f1|(t z>rd(2bI;d>7hbHdf1Q%AU(sE6-R)AZ>}~8@WVcclm|pZ?Pdt9~qaW+8yS8h7e&OU^ z#P7gIm+kcL^V|P5i|;)XU}S*R4Gn=uZlFr`7j=A5K|cP(PThLj&Dywmqt>ijt1Z`W z)5gtPb?Y5>YVV6Lbxr3xsvo(zY9J6q_mv8UQ&QhO(?wSCP6*2}IZb?SMDb z>U{Uu*&LB6VZ({yqg_yMVZUy>eUpB>ewA*0@If6fN;$};dGWYWOYqw@yB^nt+9DBP zBU-(h1oQSYYjK^v&!)+XD?ckEurdN4)e%Sl$LuqkCypoJQUaI~u*Ba2kf9e=fc#{* zy!P5_ZVHdhO5_;FoPB@#9GeKQzuTWEzYqX1foB4X2?Pif$krkYj8cS@G$f;I_3Bm5 z^4hlTdc6z~Jwz!U3PONqN+<$m-G2M6E}saY_4LzEE@hSRce1?b@3nE`dIM)UVh;jz4-idx@p@@+WGLq+Pn8DJ@&+dy7{)P z+WpLKz4-Er+VS9h+PrR+Zr-w98`iDW`VE`B*AN8K3k#y~qg) zeqmm_9^K`QdF$3KE<17L*m3t>IrR2XJ@U{lU3bkYtzW-N_iVpSzxnmA^odXWwVvGb zycQS8?juO4-6M=(yv%!g;n`<(*|#s#ude)!o_yj-RYm6VJYu&BHLX<<^zyEbT_2h2ddB<&@%ajkKw*x)QUVZgtHIUCusjL`k?+efC`mI~E zdEGj#U%OVv=Ji^$<~nDBy!6rw z$}&oL0g&ZZ=kI=Er%U{-TfaeT)@{`0>u+>6<({XW*8IYpdo;Z9+RM88_FJ@h-5PCP zyH=~OzDBEl%R1SpZ8zSm+qQ4lv4weO`7ibs_2Nq}=;Ci)sNY_5m0oypuYE;SVN?xh zP@+1NbU>e}HsZ^9?f>BQMxL$wbac$WA&pP}3 z^YokR*6HEL_UP?{hgD=`iB+m5m5%q0>9IY#v}wx*ty*=hwr;&%Pdu?l{XwRJl6f_t zZp1EJ8!CMW_ylA@*Z>|w=2T_oOo}MqSGbqn-shilFRW}pxxi@X2$@m-qtO+pVdJr)Xbl!aPP4)%I2xqeK za*4Q$c#1wWJ9q9fSVzg*Y?%3a+NxGVAHO2{vSh=)4!pVF?_0fQwQj!cc9Rtl6{9g= zU8wB2HbBp}-h4~XKf6~454>$)+x>s&wM3TI6mqN3OD{dIty?y0?b>x(yLP?RpvR7# zup)FsPlvWqHtgxh+iz;;gZJoHzxauM{Ez?O5{QeCDwL_D%nX%BChSjC0HO3wsYHM= z59uif(fVEpFvgMnZI%E_Bv?zVOC0I4ix6O0JjP^(547{q?Yef=FSTXsMlJR-HBFSm z4f3laz#K(l+W@m62M8`dN}=UU2AE03ljGuaDG*@HNB1?ixYz&yAOJ~3K~(3cOU)fW ztQ`;BqnmHoqV;R9)2i!MY2B7BTD5M2?%(mS-ac~F3TuFS)@WpaMdlE_f?NX8U>m+V z{ul9nEvZqFLxA0)tFHNlw%)u=$9oGJ@fosGC$;A#elv3qQZxv#zy$#K&ivC|O}eNv zzwuA{m$1{(-w$7my}c~yxfdkZp+j%#zWeSH8DLwl-=u4mI z|KN2^))(1R5WZu`7YKw}6ZY=9(5URGX^!d8(HC{kgSYC^?|)Cb_B`c&pi3EG7AAw{ zF=u8oz*>_NE&a;ecM)=}P*W~wQXf}u?seV&(49K(^6%;&uew^d-glq&z4?Z-f+=I! zG<_AlBRcTX)4F-{8g1FQMjJP8(B1dlr^6=}H7IKpbz@t%xG<-3*i)VLwg1&ubjQuN zYUA2X+O+uw?RxA<9iJb#7wii!KCip(yhWQguF>^dH)_{okLl3SW9khuz47{fZP~O% z58QXZo_g{rJ-Tz3uDf=X)~;To_4tAKtZUY2)wPs_e^d(#^PZ!CoCglPX$AbB|M{Qk z+Uu^>{sa5f&ct;1KZ%gxdC4D|A;6fs#DP3Rgdxy)bN@cwv;9ulw_CkRyLUgSS6+F| zrB>?(p~qPDWTaj()T4VI*G)HX(}wlyv~|l??bx|XZyi0RVauLe>-7T%b?@ExYV(@) z+PHR|?!Es$9bcSNQI}%R+40a0-FnMydgke8_4s2?Xv>zZy8ikbwEDWWTC;k+Hf-3W zb!#{1zI*T2{x=W+B3?keKG42bUeaB+-=bgq{KvZZq6@Tp_fyI!{SBBrE!2$h2N4T& zqNpVTY@mr~8$bqP#2=1}#}Hs-951Th+ppbEKB!+^b(Lb&Y=X%U|mG zHx9T5SnE=iXC}ZtF5~gxyAI|$;afIjv+9=>0jx2)C1O{=we z^Cn$)-CAwhc)cEZ82h}~2{G|mDWBac8}#+^-o3i#j=QvF;}&h*a)Tawe7BAqJK++D zR330o#}V12Jfd<*^ze#|(qvl@cjQgx^6q(dLQn2~P`~+?pKI+6oAt`uZ@E_&$3P(9 zW6cm?zOYH?Mu;&cT%UcSkxE1b?a2LuZ@u|??^QQ!-k=TZ*J#~__1bpJZF=m$uGM<*vRiM|i?8exy~4_-b-NH^3E~QD5ZD><5EZS+Y-Mcu8`nCJ_a^hu8Rb0;tk=z1xeO zCBWE74DfUT5y36NPzsdz8$nS5z4;r27tcI+Jq1wdHOMO-{F~$RJMT#ZTO!Zce0Wbf z9`ECK`hf9X{>|rkE&V$kBb^gq1sS|`S*t7v%okif2&Mm^pSv^^PDpD->7tryQK(Fv z)r*Y=uyjeRfy-gl1mz=C?|@#lrqq1Ts839}nsCU_cG5JBUEPLIB|bC zH#hvYm}6wo#p3*;_PzF+_U?Vg%2~=5qI5a%=G!WA%FD!lMV41p0+oCT1s2=-G>R4yqh^!lnaauf~x9kap7&f_R3Rwde6i9!S^rK zg%_N!oe%HwK1lzss%~{+eqN71xko?z@sD)XZ?D$g7hZ6wK^&ObIhhZ$sBvv)ZQ}iN znt;8oXAE-`ptU#XI}0q4T+CG-{GHc0E)V84^PRuV{_vjknc2A?j?lnD9bWE^`uN@TWP-_!9#4McP|=a~EK-;5)HHa%eI9pr5E(O4(Q3cFZZ)EG$7rN% zGSz_5^k};_G3;+TG)&|xA$jEM)&|jiq ztiqN7K#%xth~7~+-`p$8DvcUSPEk^ZvO)mBfC^C&fYL{lucAiz@wwxA=DDZ!!yo-X z_dj@_`q+!f$OIziX8@=xF%~M^RFdZO&!@r@v-5A|_YZCaOnh}~jx}`p2Wts?3viQZ zH14UYkL&QUS9QZJn{?~lH|x1q_bMBg>Q{Z+@X;iXGAby#si|+xHW^^U$jlhCca|Cq z2(}?k272qQXSH_yul4`@)ql}vzw}jI`J1ct)RWH&VyT(5s!WDd_@~+tf|(0I_XbH53oD$yu&^P zwwApMo6jTJUdKmWCOdm_+S?(&umkLM5E6(JDBXzNP4=2+jICp$5oKXUCe0{g1tExS zr0hImi9uedpO>}~0Ns!b03u;u=$}?c-{zJ+&15-{#S;WrkQk6=j1!q?TqnUYegr-U zHlEn7QLi_rXP%`>`E!K3^lCWe;1cA%MG4Q7%AZI+q55XUT0E?3bP)?w7oZ4)-Y?8PgYeL32J*BE# zlcrQtvY%s+f9JA6MUA)3^V|aPvL&$WR;LzLWw*o%LJHq`hiVXbNau2SYA!@Hu+-MPW)bM zCnPItwBM)7!=l$?^4kHZup9hf55k8G+hHGTim-v+Ymg3%HNDnbO|hf2zo<{>=>>*U;!I#3`@g4YD^hg|PI;J1$o7#Tg z?fUZh=jyXxJzM|q)1T7;uI7_;f<1C9?VxK@X zfvu(#Ry>GHYQn%k=rreMT2vaGv`;7FFwWg8;KgVHEyq zWPk-pGM)~*USIg7L4dJV$@Db=Ht8wP4(p{?p48TDH&_sJqECO(v0C<1d&J>SF0WJ8 zb27HG&&%&fzi|!e{&P(!o@c$VR+v}(oxkzmCt}LT;Nm^JH;u)q@8@;)Z(dKwCYg_#T2ZD8$ z)>K+^EIrl>YbUM6z^f2#(EpRFBlzTGkapYA1RI5b3!4vFkFPLNjqnTKp1le?$FV7a zIv#5vj7B+w}&Ok-%55vyerc z`>F09FMtjBd=X9&+fTetSqPmC+}l%=#`_xnI`63w9kmmeKrAgHs+DJp8aH4Xj0e|C z?_9(YQ`Pw1E&NH8dBq+P2c_|3Oqa)1OMdzo@gIp$>^J`WET$F}9N4QkPC6Ff!F}NU zd=4zGGn;3a4YRg7?CTlc_^*2TJrQ7>294MnCV`zM9E_p*y*c-jsA>Y>##LP7@6w0{ zz-|OgEz!mbVVF#u4&K9t&0sP>I1G%+WHj}L%rgWSlaU|(PZ^2EffB(N6N8&dkcL`> z8{OA|gRkg?*I&}>#||q;%f|#sY5ge!Y{Y>^ngW92jM0!&kp;H2{qTk9u|k0Tt0vmY zhgU}6!!QEL*e7T8R6swSBZfa2@AMk~W`h7knssP7#;hZo{+%|H^!a!HjM0f;D1li4 zVgb@+4t^Z?j2dTp@i#Ucg0AG?6I}6LN|Et*UU$%xly+0DCCDtmGHfr;93v56>9s_1 z@qPd`9vq+db4;EI%=kWj=Wo2uv(JaXh5k@gp|YZP7NAk7#f6?)fDZzoWvEHdH(=BnT#Fm5oB`S1f%?ode%i=*$HYJ z_8RU68+q&N<@^u7eNcDYa;rZ1iBIT%{{@AUO^zM_X8-VtOC4hfD4&JjdL zJNC5a(c5nvR6|qk96*$8h&hvB1Z{Oi$t0S7Pt?@hU;4LHI(p=QZo74> z{_4N{-}(>#{@?0<{5Sud{*QnEzv=SJF4z7y4yq_xE%t`m{p3?R|DucZ@BY{SMgRT( z@Ne`V|Ih#EzF)JMT6Pebk6A7<6$s8bUw)X={GIXOhpaCMu=rP~4VA>~kj(?i6o05Ybk)z5Qf z6`)mo2J)+|$Er)_ZmYcPYrc0vgRD?dMoH7sWDuZw>!7&Bcfm%^g~vZ1peLS+uUG*xB)1yYr4gYXRi@Oq<0i*2m}VGg7tATqts27Qxm`DCOa^986M zKZNU>XbDiT!d-y(LsgTZf!%C8)nYkvMo2#BsjUh--V92*H&sn9g))F7E4Crrf{bQf zdkx~K&yd|*Bd-VO6pC&#=neEk8e459WfjL7t7#)B?=7BimP^!&=lUa9bvf(?2V52< zLBc^69z67xNw5?1$6X!*K$-hsHLtUYC^#K~!|!_zCoIjbmFGX!2)ug&3?P%t7>KQb z8`ux?qk8eR=k?lwS9Pp^T=}$AzwWCdTV|STOv!Q+V9bmf%2y3#5GOG|{kL(DCt^($ zhqeE}^SbTcJ9W<^kLcOGFS)5TTTIn78kCu`iXfaAqRTp9i8?@z5_FK$5bW3%_Ulxp z3fto#8F07jF9ZRGFoSiGo)Hn4c!%Vk${>6ymq-jmjKSw2er&u5q=|2^kKThvJ{BcK zvwYEglOty0oFYDo-bt~4vX@eJn4X)Efyqwtoa`n(2Io)k%JuL&`)+zH`vVcoGOqkE zF05T_ZnDD!_K+2vYg`9$6PfX)$E}1!YiRJzJ>$rbRaEo{n`1!CBCno_ksk-g}oG-T9yn9X_CD(kLI7$|i+M z)v76>N&HAWH)qm=h* zAWA6-H_3GD#Or$Ll|6cG-;1gn>?YR(=pSViv36nW5Rm|0hYe*IekTue`qTXry?QDE z#j(vcB3f(}Z>6mIG2Rr%`-mu!##|Z%TgK(i$Su5Fc?| zm_Tt4a0D>zSYsN~H;X!Q}_4goeh zH&4Cs>2KJDuniGASRCx~pZNBXxritT0);V#Reon$&bcSsLB zzDsxQcu2dSeMWB`ep^{xxP?XDl+k;>$ z2-#c^qmXyT&nQt^H=08jIFa&UrM867tJNDUDywr1i%exjc1P?N$!ARfW)Nb_f8%}l zreqpZW}A%aqel+ug}u*d*UpFByJmjA7o~{tHK&w99$L7TV#x`cTTqlg3XMX|lhKOUXsu}jeNDcb^Tf@|P`U%*e= zbNL&4Y>NNcJNb9|VGZ#)))VhdKk0K^OT@1cm-0Ht=5>x4`}gwa(&s;_&+K@hs^z3q z-u5gC&H9J*#{L)d*j~z;_B2HFNNMI7oYy13|2{rL@gcp13^2AD(d-EwJ+x0x?|xh- zP8|0h!5)wZF#PuDs~5zsg`(j7(?2c&#u{PGq#sC?un}pkV@KKBI5$M#WTNBO26ls3 z8ebU^Xxn1nVh=(z($K&gn@Z9S1ks3=NwK#WM`4bd3kaVFe~$m4v6kal{zZ>4e3PE$ zkL}lsFFdJN5AN4Il~>rOi6I)solk`|PuCMhJYK|vaAY!i^9o;=((lomIQ&O!53x03 zB1kaV2F5PO{t!FBh~CRZUxj_6sT%x$UrJy&*r8;j7_aaJA~xW>AiWT%Vf)Dj;|Kd6 zJ=pL&!bb90@X^@6mN8WB7j|*hRxVxdX@6l}rjhyJjKCj6fYqb1P?(rlVk4tg{uniP zG)#@mu#tg2NGt{iWn)c!Z$M;JCmq8Ixy9rq$in%uv+MvWz%7(14mttlnD{h6rpypZ z3??o?&KTki#Rw!ArHU3cmn~|Zz7rT=*RLi643cZ&2Fje5P`vIf9YKK&Q<#Ik#b-q9@qwXK`ec!wU%(B@N2&ZH6 zcaEJtOR&Z7yq=zCf9Eyc&*yni(ky*Hfmu3kdf##o7g;vBh8WC_rFjX;_`CNfZ}mOTMABtan! zTSJ5a@q{Y5Do6hA#(m!C6+k(cLUozz$icU@^Pvaz!2R2G`)xPsk%u49vE%eX!Z{j8 z23QNgNOn!(Y&9~`$Qa57nd&0W9k35oI2jR?V?vzaj2lwt$*gH01X04bqDRJo{jcbe zhqmj%`|i-a+i%x{58S6`o_bn~i-4t-v#u9=eeHSX89n&$4&C>_{d#!kBkucx!;$73 z4hZ|DK_6%6#P0-TJeZHXpLxqz(pSvDT&J$$?`fSdzxg-EP7c!SGq0yd`b_$}H%jK!8y`gGSnUiMkfB z2GI+TWgyuZ5Op23yq*1p!YiGBtR3bya~1%db8gDq<-nM01l2*HMK=4WB4co*VOcxN zypL~@6i+UX5a-n^GtHNo2CN%0r^uM6)M{5!f&1VxEmQKo2C60lWusEVcBBIFP(AWG zh_w*Fy1|#uRzZNZ&TePULqr5n5^Ec>73DJ}4q~12I&0R7fPfE{&$d0c;p`Fx-uN;RJ!rIg}<>YLYiEC&p; z!NWU$@4T^hZ$4Mv`M!+6=?O5(SIs`i)PjO@fr0i14u(Pix+r~O%A7Ssp20(Cxy(WXXuu2qLod8ev5feNJ z=*Tpt?<0UEJzI+08MufKSnKX_;~rTMMP#H!-((b-5MYQo*c+*g5vAp0pJlIRU*!RK z$@yZ#(|L35oHx(BPEe0M#a;ot^02bCQ)99(I2#)q*$EH%ED!c!?;FHf4d7h}TsSYs zd8pp&N*UQ_qlw9Wn%iSdv?} z(q80ee=0#65Lk#PIs%OAfRr)$f=xt(lc{RvHOP)?m@k+o02hr+<5XN9+s63-N&p(w zX1=`TychTIj92i-_`~T4umE8Ks#zAUutp$5O{}s{6hjkWWAK8m>Ppd8f>>ovGncCx z@P#aKvT7p!_E@7}re_fQl*xq<$BrP+5J%N>8f3@RFM0-BiR1yl#Jw^J9RwJeB>?On zMFK4ONX*Yue|RlD!Z(hxc|lI%TSfWwM0{~9#@oQ474h+JK8p>+x3+CUU^a~^Klld# zcastn4iNx?g$3pHaUJg+S57Z4uQ%oc;9g{ZaUTNA_b%4SI9-aSSA)f~R*G*{YNPB>RwSs~b)6 zH`_{8J=9=G>2K^X_C{92r6{gbihV0vaP&>zk-%A0S3y zuV!zKxy@s zF$!`1sC4`eZsoGklc}n4kXvMc<-`sJ*i)st>|19dZZx*o;pSlBoACGZ4D$lv{wuDlzF-~Hx4_^5LB?uoKoT4gne-w>xui*&H&O<6+LbtDgKgDR+}Hpr zNj-O<*{LRCbCA>LP>S0TMx8X_yN4RN2LTGbTKTwEMro8OHw+bL^Z>I8n}uyE6#{JR zKne1z7Vg;!0rm&arj-w_jKGI@1d_8FMm+*XexH3T8}LwOrGFhg8c=&EUM=7XO9wI<7f~wiS5i}$ci|3>eBhX zfvy0f;KlS^dU5={8Paier%0@)Jrl|Ik;@p;=_p9jB(va%=_#RCu?TaO)v0Gp2b zlA9mXoIC;^0@pEw*SJtU$yJRD2Uy-89Q4&1WDAkbZt$dX2{wY`7Qo5@Cm$ zD&o0PMUR;pLWMF>WTG`{ibB2l6B-T{v@m~Ey~X3Pw;8~sVK@6)qY^O3CE+;tQX@b{ z8Z9^McaU_Hwtxhq!6+mcsu&cOm4Q>#%caRGvJZ06tUMpitIQXjwoVU}e8_j;EVS;s z$(~B7IZAm!Tn$lAccnO(Ys@nOsziPPKssIDPD|Va?x8_cN=rIT9#v|Tze)3yV-bWg zpVM4U;7WQFfpG#LLA--{i!y<2)v6_xziBk&djX8G3#<`(HPG0b(nEEwMKT{J zW3_-#?r#*J2tYYbJI*VmwVLTr%`{Unu9O4d5EJr%1gja#Q2avvVOPkaOU^!E0qX|6 zB|Wyh7CA0udb+YaX?^@cb{2x6vF(RT#c*zYI9W0nA8 z^0%t;1y#if+t3jiIMX2S8&uW^8rnu=1r$x;Y@@MlHNaVCJ5BgNG|v$0Gvb$IG_6_n2kUsVVlR%J#ZY16jK@ix0 zjwSnB2sa?gA*or9tXu4M{4I!rj*;p7eBbq0cH%Ef$~X^UzGs6@x`W*+<|>`Q*(SIddzT+VOy3E zh2ODA*t62U7M}vzNbpAVEh4ih{1bc=$QAZ7?D?YH^K%0E3&@Ra4pELXjhyWQ%mFzN z1lW|^48|uk7r*1oK1_c~1X#M3j_l}UqsE84hm#G$e%O@^f`sbE%Y>H8S4Ig-#7fKo z6F1%dhz}JQDB1S-j*tfItN4fP>ro}fr?XBGBH0E7 zY3oe&GY)UMnlrxPkM;-V=F(d2{Ik=2dCcJu^rToJ?fc>91nJLyjlBSjGC9R~S~$d7 zWlhmvkhmer)w0IDrYL)qHJUKyJ@v?_Y$;cXou@PvJsyc$u#w}b%BfsNic-(?YDDCNPvp{rRAWH+X2BGG zOJr${OvV%{>Y;^F_)Xzw#%d&cKO+kcK^UbTUA7g!h`EEWPWBWfAn?g1s*BR)ZK>#h zk4;%@#CF(m#+&K`_H#Qiq2nwIpdj9u%Ydqow5*>5@+ATcTN%D9_K5q0&(1UR74i$e zi#0;OEqqvdY5~|n01<=W`_n2UL*#}~2~n5tE5bW6-=YjwK_*x`Rs(R#e%Y0UXUv^J z<+x((y%gLpgk_Pjo3bQKl7Z>5N4bRU$km>hZ!wpMIf!HNb5mv-et2%ti?d3w0qmij zm_5LDu8BPy(Fd7W0QJPgJ=Hb9E*aXfzS*~&-G-lRY%v7$#1V1b;pcm-Pa?mN({Zj* z4R#TB3ZX(f$zA@i2G6i~3DFXtiG7u_q#_H<4>D~##lr`2QDiPP;4rM`Sf8vX))85R zj={ms5Sei;7Uo4ZSNLR64t<2Eb%K2$$5klz7=$0xV>o z9r5K-@nBYv_mGNYyo2KmRa2E|5`_hcrWn>kJ+D-FMIZ1{QklHye9&T)4-si zoK71hn?0&6)YsH#cApFaEz$>Fq6jq&D!m}Ua?}#8{XJ1$0{+E-hPOL0xaeBTopOvD zk|sAB8*8g9P_qNlgfh>IbOZ^8!jf_#BP#=Gyj^yxYrvgY6s2l5O%x>ngw84pT~g$f z5%9#>c-WWj#Rq#MKDb-Fa^#f}SQ!CE00WIN4g(!y!tcp&r%{^ydwMNBr(+~%mVaaD z(=)Fpr%cm{+E#d~~qnY6ynJ_^)iYcmVjBKs#F2_l+oXdGFSv|UHxPOt3iwm z`tu^KT$G4`SVXlFy%;&hN*wrI5?AP&SCr638|2)21I|E?-ZTN2DIJ1apF zG5!&7LVy|gAqXB(qAmzOoIaG7c3_y#1ZI#PkYOkhJBNgOg41W>1Tw}-DawS9K>%PH zj%^%gnFM1V`ZJwEi20o6d|E3!ow?8au#?u8}NB)(7)~45evg3OX=#Mnw>E z0n$Q@L5xN@1g~WrHq=!FzW@y`>qQV81V95Yhcit-hz^_pXo0ZJN0o9)ExK11padXE zJWvHgHc^_5bFT?D1Q9l}D!Bp7Kp=#V)Swm%$An;-^J0u~z9S%wT&ivcws~ao^0%Tbl{LA_QK6!x{|-WcsMIh``v^pus(7TP_kghwy<`g(3#!Wb zsPf>Fci1{ItHO>T1}IxdxFCBdw`)L*ApJDJF>!-qiOwfTfit$mHqv`(M{IQ&P9|yy zidp{#J401!0No&F>}|H;kS|>@=}cw|Q2-q~f)5gJ(vdt}i9YsPgP8`;*#9D%lWZ98 z&-euR8U&U++wTa`1H_nZK_^sUEqZS^DIdU}{eaFMM|8t+VqfRGZFlV-0WO5k!S`Y( zP;f&e(NAVT1~K3%G>-R>h^w$^>@BQqzy-z^QY{1+_zH{{8L$xSL-&gYc;P-Wo&?$a zV9OXM!1r-OW_YCunbz*#RBF&~nA7wtiVSm;qvOo|1@lp^tj*O-$Xp_84F9kL%E@3x>8>0JjL8SD-_y>9 z57&##%j9##T0hgC7z8DAlf9X>ZF|s_cTMG4?bp~&L=1snX+P4o0DFK9fspTT754(e z9z%dtnp#-XS6R;)9BmLBBPespaqe-a-r?DO+B+h-0|+g2fS`m7!xpl>ofXO+g5SXY z0jO8Iue>wRrxTF@mLUWqyVn^}VQUfkfJv2Plz1<|*P_fjF$S5hA;`%A0xjGKGKUhS zCH)%f*3|*;u!QXdES+lDj8u;3AJe+TJe342YH*xM%nZ)fRaEfa$vTa7jyMXTi8Gfi@`_Tv z2-LlAA%Hk$zJt85UNus*Sc#MU7Yb1!zv zoct>){cF6$C(gdh+PmHke!O10w?JRFpJ?D)uTc=0%&YK z{;8{}bXlj}@hm*Ur|rlg<0;98bfpjR%;N!B78PmmVNEPT#MvhqDJL_lu2q$ld&Pt8 zFjVQ`IezNUb)|gC)<&4>J;CBr{NyM<4wh3BLx62ixdrUNI3fb%6yJx)j*`YQWpDQJe#Q26k~-IKwz|4}492J?;l~9L$86z?sUV zUC&%|_m$m9nqjil{$s57_eg+ossXS%P(gw9k$qOz~Jh3s;nBR z9ETIrD;pi3A9z3=jC#R@u|vTgy;1-{W8<~5#5E8!Hq=$ zEZ7A3JnxGKHaN0K0OwH)p%g;Nl2k+i5V>};*gsIN7B;(A_S6Z;4G{n?>TLpze9$Z5W}gVA4Q$H zcUh>O2+TqWPC4N8;Fvg-k^RN@4MqPK2u1>9vSBC_2T|xC0q2quDP6_^fuq4l6Pyto zah<+qoQY0#$vjB&!xI9~uPZmmGxv&X#&JbKO*T$|a#0@2fK*pPlXC%-WFIw%YLYeP z3m`BL-f!TN^CDpD_RHCM8K5kCarg_dF9%TObLmQH#ykn|>`d#-`*{KxI;el7F=ZS*MD+E9a z1+G=NWNtxnv;;XycnvMpVG`%SG$9gj8*_!ki5oAvhJ7m(h?wU9w zS|ihl0_3bgn%zTywHovn)HHpKCj-@#$8rEn`7?k@Do#Ma0G1)Lg8(lg1GdYg;&q5_ z*37aU!DdB_kZhNs_XP3*+9eVUyU^J{Ku!QJLKW5{>y@4^CNem8mv#)ngul}nFo*yE z3@T++-z1^OZwd(xNN;%3wzi^|4e^W8F=y75v#_Ga3GJ?|^ar#CkemUGSa->8dkuEB zKiPw2OBQPjJFv8N3F5m_hJKx6`Q8Cq0+2S&03&070)B&PXz-w&Q2LVlhhGxe$=Hkp z=n)hrQXCsX89R>8`er|)9BfsT-rEr^P_7vfg6%c}#%iFt>RZ4_q1b#%We-akoT(A@ z2IK9-h4xvrWx!s% zWa~W+%ij}gD+FB3Q@$IKYg-o@RrGs{wT04~PTs{745G03#JvW)jIS}JwOOBZ1vfE< z&553rr@!wX#a9_Od}K(k+@ck(f_o!~EkG!Gd;y}lylgiIS%=s(z%Jt{_~@C&E>}w? zd!Y)Sm%b|8D~>@K%Mn@k0~J-@S@@Kkb;cD+b!=vu_x5!{coTj)HY)rq2o3H7zA(L~ zO#G7_NMA6B@G)X%$|GVcLp?v=A8Jq_n85x;CKp$ZErk4X<|n15AaqLlumpir;=568 zVT4!%-v&X`SpB*+2?nW_QA*Dw1YjQTLEJ>$ppH;s9Ers!iC03SYCvg#=H=j;hGt`G%wBC1X#9zJ8YZy2we zDe*^^miI&EQlOhuLI}ZI*Gto7OhYtNPbyVpX+VBC-ixdWKI1a!o$tv#2b>>`XmLXC zNbW~GO>->|EZ zh3}ZpxC)6R2$X31&{do1MA)&;K8Wk>=EPEL7~c`=HALC?43sz?(+8Hm#G@$B#~v4c zGkXPiTKJIobM^&jhBU4;%zG}`ny?W1gPWM`V%JdkBqt}VcGyNN4I~vpgb-D0N{=!2 zF5;9?WF|wLPsYkhM9&@RlqNOL-H(5@nkd9%k%7hD8a{r)Y1lhMsD^MBA;-wsU}Wru zJz+e+=f>WXXg?79b1G3Bar)B2N<(Zrj`uuK&bcF)aJF+~Jwtw(00Xz^D!hVm`fod}W@+P*r zrle$>7)0s7MKLuJ3f8Gl`g!7k{g zbf)`{F@El`gK{lO&lq5ad<8rLN`S%&M+nI0qlI07#wc>^S&Y}81{>UCgFw%($66rPj+!0`eIE7;X zRP|)U0VRm1|u3+~ZOVkiE!MZz}g3Mw1 z!k{R1nXTAkMr3=IC)BjP5JS*Aph&Su^w1$Ac~JJ0)qRbo^x=!WDSCWiD~Nr#t{_?* z$al)p2o9scbxRp~0Bd6KrR!MU=Q($Sx0F!sGQm;x262%H7(h9~PL6Og31*wmibkY> z{Um#lb9FucZxEVlrzJopbX{S0N4Vc z0Lo*NBU_cyUI;=8@4Ia?=m;=iPx>4{)-@(TQWVW?0^=m8W_*|xSS9}Z!|e#RC&o4r zljIST-AIXLzz)jnP05sL5VJ(z!y3`2NmBOMQwgxN-^`e~kA#WiBx8?^xy0{r;vG(N z5;lZilCpojcSEprdl)9myo||`bbn?APQ1oC=t%LTu(mKOO4Ok|M@R*DM;1w=R;9+u zD492buz~a%bUnWi!ltY+1V`Wj*pHLJ=?}z|e!vG^-dl+u;{Jr+%RU`K9}`#LDaKSJ z`V&GnBp-oKA!3FA12{z76Jtl8CJ03UP{zG=#Rl7LgN%Gfx0bE?4xgNL>>hUl0EF;9 zl>kFz5X5=-!L6!>dxEIBvnv)i;Qx~83t<#lTeiQ5muv^3tR6nouq;(|{jQu*51CHs zKzhSq{}E|SS`}0JtA>9Cpl9NT-tws2-J>LI5jYa|59^2hWlv)K@GBv|rmkRt5F^Sv zBLpYYpNG}>&P2s_%&c>alQShwA;3C(-(aD?F#u`Kf%B)2D`f%3% z=q)Zd6N9}L8=ib|)_gK$>}QZ4DO1Gp4=qbvF`*36n)`o-kHPmw#&ncUC4(=3TgVf{ zFU%!+)5bYcN_niIvptKNUe|~d130yCo_ML-11O6L>B(Lfd%^5;w?NZbOC=EbJbz0MzL~!>Pt$80<74yVF-6csj94fmi0yLL^jx5`VeUq=W>>Iql7dX3a<9F6e2t31YC(E9`@l>P0F9)AueU&BR zsvcRD;{OK^=#OBGrCIZY^%-F@iR=7v_(~w#2i`r$c4U3_BkrNwG zZk9cd_#PoI*a8{5ltIMyJFb~^+|rjW4KeEu8$4D?W*N4WOD8GG?McG7;5!;uZXk1* z7$yk2UcaxLHVBgtDT50U7tk+^Qiyg(oT(O(2+|J=fPD`*PDjvnWAgsaqd3|hK!9-* zNHs2&H^AxC*A1{+%xwFd3KDi0Y=Xi2N?#1mI)OCZI_a=(w^@j01MI~ zsf%3p#DEc?5swI{*^DFo9Du!4)#fTGvqsrk0~`Qr0hCeBgbg;4U&}RxQyIv};(>T$ zPe6&2&cn(laV@txhC0SU&wfzp)nOrhRkf57nph(lOGuYt@2*mP95^x?w>U@0EXFSa zR6-VlHv&N%%XCh>mmt_+Y=e?F()H78IN9-@2qt6Bp1L}g_hrvln68l7EUblD=F8Uy##2}DO|(X2r|rbu>&*+$QaiE@&I-LvIzhH5Kxx& zRaXnDiv^9Uyi>u&+{9@HK%fCQC87a*$rvzTJSj|qH4Y@maF2`q>sI?_pcY63}~Ua23(O(%kI!(by%KX`P6m+iP9Q zud|1<0Wf_S5?icB-6`136h(}%RAYK5lK=q0IS|Y$GU()plOCp10yRrX~=^A@&WL?KT5Rp^BOo;?D5oQ~T zy@)J00ANToDtZ7SW-a}dN2`70(ODc2h|Fo^WX*uy>m z{!y-y5_yndkYTYuP);^@duM3?03ZNKL_t(nOL-dhR%h_k&Lt@jR~S%3LJA2sb}u-` zgzmc)5pLB*b!hZ zeHg@J*tYH)(^s8*0w2PEaiZZLo=Sivn||_hta;`jYm+s}8m!0`aon9U#$qSp?*Vj% zx+xLCA+BIAre#8uXmSP(w#22enV&&`5#?u;pq%g;B}XB0hMFjP4@UOaG64pu`BDFw z-DkrFhF^!D2LZ`g8^8m^Gq8`a4RRvpB6FMd9V802jWLGMX6#V^lc_@%RH)m@9-{IA zgoMi^0v1wgZwxsB=pR1ll%6n41XxF8T6Bc}5`HK?L}Z-vy;0GpMzlukV1WgGYLv~U z=M{d8ZL<~pV`pZ$KkJC>u-3}@79wa2p$1488DP$eqW4KtX+9fRV8r^Q1R&W@m3!2O zABNK2AfG`}$Zpi@onM39!LLTX?wEwVDE1!gFa#W=6AFLE6W`H-Fnl)mtp(Ui8DNMJ zSX1#6mIiB&jbZ*WzTszMBg3C(&&9p~F7_Nhxa=XBQQd>p#GGKSDj?ACXCd-zPl;g) zjS)1}m7KLVl?IfRB$LU2XAsPkYcC3HZ-A!Ur?khAtxTD9ix(il4Ctnwiz$``q@y1h zW!@2;cjOlY9wqU(_m1y~l>&5j*?0Q3c`o4#;Oo;9ZeaY5>w**{dwS|MO>do2c~dB_ z5S?{EwM%p{5)qA+_!8KhC7&|+mOP*Q!*@Vf5#R7TzBa$7a)$g)HW;s`zjFk~L)~k< z9@!VzzKD%x-=B`hYwUq!gr#Gid^R70e>nzV-IglaMdj_hstG;ZAf}_@h~o`n)Xp!n zKW4A2+Y`L8#8_}omsiclV0`}Mmw>Mi86LvM*h2z8u+S%wV_oHs(-UB<6SnUlz`{TH zAnwxgx?S?+{hjG`{FB(j$i|0w!jCWkR&h;;Oqq-9Wf1A$M2#v$((E%-k{MCHl=Tg6 zw(PsGrqg3d>El3_>pc1U5$}`%ysQ%+bBX9t6cw^7S*TA-c(NUV0eHf84&tP5dU+(=ia1vj>y-GYWDqMt+ z*`m88LHDVH^8PKD_eg+o?Wpw#sNy26_@l2EfDeEaHQph}xIwU%G}mM>CKJ(cGp9@m z3^M~o0NK?oHe2b9wgWP8*19rIp+XI?EzPqifkc22HD*bZZW?;F1R&{+8t@3<&1Ihe z909K)6*s`m6$0%2n@TH3S{Z?r5qPg7kT%rW=R|HndKqx*%0XC}-Z_7e3@9cEWRv5K zGtKYbfV?qB?Q%AM0>|Y|I&IePeD*d(FhceefIsC!sJRrFgvl?+7&`_j)5*@$Nc3U} zV1pnSk_G|{uq)JzvjiATJb8pFG0I<5F7E-bRJ+3m+bX@h=r2HxV;nP|2Lbjt0&Rj- z0tiYc1(_10oX_8iCcx1|hS3)x9zk@}7EM5ap*E+lQ9+5qQP~Bl5eRagkY&#Daq!sn z4C{J!nfU558B9L7v`&m+G+~G6p~)=A3DDDN=+>16IGf|hxNKAqbU}haz9j;z3qIKs z0W1id5R&kjRF}VV(76BZQ`H50;lwQm@V>7#0T)0?9M>QSq7nL+vG?*Fof3>Oi@A_8 z8kXlA-(}*<_h6Qo<30ot!uNCB0Iy;ma{Og-Es0RV!8~;hEw7Cz?FeayvzoVsdk>Y& zHP*@u*gzxj329ZHGt6Ir)hKb`j6nMY;RNE(1i=`Vp>B_L%6&B8HA8?grZ}Vq*G=>VzzE0~$BPWb z0H*-(g9J?qnynGf$`9>Y0D@{$!s{{_M<~R(}1!Mu7S8 zE(x&dNCSjztjl_+5gCzf-M0Rf5 z4%}M_-yIONt|+lVU`koVerL0z{CSip#Et+uq5K5wW_@9sLJ;7<`F9dv1k4>d-}Nv7 zKo0PgbAyy(T@u(~=gGW`CgSue8)ow=9Q>uSz!98QBSamPpk;r76d?d7C})oakWK^` zHZnvgtWU2|)5|9lV9rjpsx*3YCVL(0oi(5ADxd_wEB_AL9%HaffTgvT>^}D1K(ou{ zMtLh@yc|-I@+}Qn2$V+4qqiAZ8fisU6zFbe6k8%mW;6jSci0ptlc0Bmm#(H2Ad_@6VEYT z+>^*wpx<57`4tFYifmpD{qGR&w2aND1LOhz69Ja8?*M5yZv0>if4@CU@BULhb5}X{ zM1pY*thG4*Q=hpP_+|#I+W?~IU*yulsF0Z>_;1eC=#=9eqyuAS#~g75`*BfFz771L zb_wb!AeYH5lAJx=e5jMYxua_D|YllmDMG@4d!4p^Cvg zY*m9@z_xSG!cKb4V|O7?tiJA)>&~DflaAh`E>vfLkn(ttTT_>q!nY}0bh#Yiry%G_ z1X$Sm5FU3~;`YNj0gp=~;pYShN!1CCRZ_kY<^Hr*)n*opL7ZYM@csNCCNP1LGOhs6 zq9PDhjlG64gw861RHu(_+qzHL!k`}n*oaC*kUmn42+5g06O{$ANhh>(SzP=-gkq7= zgij6#XnR{h?r@!ue^HtqkP!SUL|KeSh!w%R=sk}ejuME!j{rk37DP+jTYy_Kax*pK zzUt91GOxhdD4mT8-$F02GO{npXd}yU>>kBs)>l&w-B*#4iY~24|HY})t7>KV@Lta$ za;JP@%q4u_AS&6fxNb6fxE?=D_DwzB;Cg&7j~o1Q>IT*e3n(J8^U(#+XaImL6R1tdGs_S%xr@dz{wVGMUETQ)y;?=leKzI)3`z zkHa&*82%G`V^+>7Z|2nc-c_Q9IBSdfg*e6pN{4Z-t zwP)1rw{g$FE9hNLa*6xA5?`L00ft@s(-2^RZ4hgQpN3x*;!kWc^9ftQy2VGvE{1!7 zZ_B=ea4Y$`2n_H~Qjf)SY}R<}m4Q##wxt6xH|_26%sF6f5Q0L|Q@XdWw(YxoE8|KZ z@to=|i0kZ=FP9}fznzKVMnKAW$(iw|N@IFEELaVa4*53vea&4_Zrt(?J(t!{%T1dp=70Gx*yuM@#L zt}#wU5)}Jq5P2LIr_m)8d0z4=W8PV`N7X0CpJ4^w&)GhEtoKZSQRb(uZ~!9J9i=0+ zjtSFH2o-IvLD}!hSD_M|y6+ctmI++Q4lB4>`9O6};E)AVhyy{gylcRtPAN4eea;Hd zt|S*j)y*?%OqMi0^~MHROK?22vUF54>B?XpsT)nn#-(75@9S$!8LLjw5|ev*lbRi% zmETuJU}XeWM&N@OfwZZzF`V>p@G>@`1gS(2hx6`i6yDpZzRQXLC7fm)Z5(MHY}n~| z{2osAyCJ~X=%X|VBv5RU5GS$6M>FZxwmF=JaF}o;I7gqSzdw|^s0VRAtnLG_a0XO> zaAe;)3kjsda^b-z$2QEf-QDpZ)bVe}MkuWZMI75DQ*C(`7sODOW0Qf0Yle}gPQ zHvxuV27GPDYN}RwHgHL1${<3j(pS&mPMd33_cW{)O@O(%Yz_G}QeMz}7oZPUnZw}_ zQXUcId^Dgfsjm%~1He<4?!CdBh*G36@7yQC=Q;y+&twQPo?bI3^Ao^6LxLr8Yxddm zE@j4kE|ow;6yfrR zltNm5I0Fmu)k*{z$Wxif`9{XMEnBbhb<=Fd8%RRp!!g=72f+tWQlXb9s zA3mgm{(Dc0aZ3JE_>c(a$VOtl(#s1U6h92xiQfz97({V=F3OKVaxD{JX}l;ZN#{KX zoj4}GP*gV{6U=j5qiYrTefc%drXmg)@IUVHoF#jVzm?TFA9Y zuHJA?C0QaS(ydFBHcby^a2C?14}~mFoM`YXk7(~2Jlukt%emD zxpimD$pEIkS);}Io*L$)`=sG_j@*L_Ulp6mGq4?d#9%luk-;e6-$u6--c|wT( zZ8DBQEy-)UbPkzTH5JXj*Y@B{5bQdPnwsv#7@M>K(C z(Mh9{mL>V16G2Q=kqv=JjIp2(T3IT?Ub8O8tx96Ijs!CCh%e9H+| z-T+APM{8_e+Q%r-)N0&t9Rp=$PlGnoU{Wb3d)R%R5inFz_i+5w%@JpTvG0s>m6MDa z=)DDTO4|%I9re^!Csfmmj_gpf&`pjllT++P-buMXGaz}g>#;AqbBU$(#B;K3yeq9W zp4q!n{LTCLH*L9# zPQp77B1P6O>m!6Lf2<5JY!&k>_VMu90&gPOg)-xXzpJWS8@==oW7T<6GnQ^4&UE9~FU9>pLB@jsjLJ$W2|*)3W9ys&MqkHP3v=_{qnI_E+h7o-8;4oH>jz1~Pu(RUaWAXD2)aE193kyhV?-XE z5GGZ@!3j^_Z-T0eoe=wxO-7q3Dj?AU1mQOoUl6A+!sUQbbtT-v^zvf3l<_|t482!` z2n64NF~z5gSiznpmuns_Ffsch#wP*~`5;!xdnUlx^u`V8-(jT;(sW8umnulv0~2ln zHJ2yKMk6hhg@&VAC15EkxjNGn^&XROVb`=1hBJE7pd^TL7w;gz zy2&oLEVR&DTy8Gu&1&iZjHbId-5iVKBnLdbw(Ri7 zCVl#UC(w-mCcv+7XaM#{OSS0fZv=US4X2zR*(aPE50oZ(jyf+gdhh=AGS9{??5&seALO63%pw;c1-pI9fH zL*w3~^jrfZp-Fm2g@~)GBIa!%W$5Aj%;#kH{(na;GN`3dC%X ztIWCQ5T%9kqNhPNr+zl4VX?TResg)u232mYd@!#nUr<%_R2KuaW#JMxWPj18E+5`#D-V}D746K;%*!XNfNn5hL0+gf~Gd2+$8@40@Dy}{~fB?AO zw0{x=XT!c9%xRNGOX8D}76wBNygvttN3cCuJft!|p_YDN<_-#5nzH5HoZc&@CCgWDFY=U>^w^ zVvr5epd*UX-(#(&IS_M#zq#*PSAw^ya%DLL6xB9DXaM;K&>5KAo|aNqRb+rIU0|_w@9d#7>+zv5hy3ZESXs5Fi$TScDKrLK|pD zI|z_KLK|8@`-&vczHha!U+tyeJ-_FzPZBtB$GOg2J543!l1fEYeed^v@B2K@Z+Teo z_Cxd0K_npiu`0xnVM-zZfe#k)`Cb1&02o-Z#c zd?x}fswkwNUyirB=>-S<_pk1woLRNTOHU`R_xd%(YlI}5O*=|%11^W!d+E5sKB`{! zNed}^Yp2FqfKsz7GEgM;iNv)V@4dmQR!RvL-N`~`-?eqx3xze<9VRRrS73BH1&n7i zcySyM(2Liox+~yIb%*<602t4gey#lfbA~t`zv;&3^>vHa6M;qP?G*IE?RQG7;iFZo zpJ1d0v&{{=i>!XeixC2u%xBe0O@MiEci054*kg@g6UoF>elkv92Z44gEcP`lS+%Tj>h=ZT_6M+P zvcjd2NEk%G$2=zh&83Oml#gnBw~Cc*Rx4a?emA8wWBjFgw2hv`BtY?8a4r)NBFkUg z30NPCfW=(zxwdTrU|bK>d6lb+#PTfwn6l4S*0S6u7@KPzGaT*}QPXgDU@uAm4y6wx z_nL@d%jbr8U@`F0l~Qyl#ojoemNMRhtv$qDHd` zb|=?&7Lt`+EdfFnW%(QlXuQ+ji$n?82S_-P8lNJ4kQ{IIyI~1>;D`WVa{g(l8PEV0 zR+$3|IIfh0{A@Sl{IDhfEc#M^(>%3r;K{WnMFnriz{F zKAxAz^}~m)_l+~~{ME(dwTh_vn{%M&zuDL8H^ymVlP;ErR(L%IINYmPGA_dIQ{bhLR=B3WKur2g z0NB^-=)Vr%me-mWZjTK{%NiDzm*CJeRbz29Ux7@FHC0{Ze-!}6m{qS` zF(%jRI$HrSlBsD$O`!`xSLVjN<^ui@JenVN8wqQSLlps*H5RMcEJRqUdCf-l_2%9| za7VQqV68?JWCGBrniJQ9=kF^2B`8F4t&l%L4rs1bn2d9<(G7;R89HJx_T8cY)(6J5l9D$lwBCZm!8(rn$%J9vB>#$jbetUrb*Z0OROT3BV@Q zWZ^UUVqu94XC|y>%L*Pneu%5-DHt9bgURKBGZ+$!6suo@#c5F%AubbE7p72@pN-p9 zcQCfF0DCATi6b{TURVr>!~;IUW)|6^Uok3(Ub0E1Y-}>Y*?YhOpK}4@qaEn!@4)Ev zlzg@(OdOT4a58w2x1TnW5UIah-*dz9H{F(2`fSSQL19t}Sd`=G(=13JK%J&*8{(g0@!%mo9rj`9MuFSlK~?mPjLHo zB{DKH(AwIHm6a7q2s!VVym79{XGM}mGGsZX9Dn`$t8rB}D*Ty$Nk%z%!pqVi(Qj zLBOlqAadRic(%jix5G<|!$|x=P?P77EM(*A0=$|Xp`eB!!C+pSZV!AOzZ6k~1s3pN zcw_+CIhlw(5rd)O0oa{Zu?+JDB1~twcEbqpdox*QFPz9ZV{**vn2#(nuwR4GYJx|bY3oRUXf?$5H>V+ZJJ|Rfqf&sqHycdB7TDW<+s ze*I{eG%+De-Jss!Ho<&+( z8tUrmV76Lhf0E*gp0sY}TasMK?A-!@QDwsQ++nw3b!7>~#WxTacM9juox`1~DmZyv z(#FW=fyd_*s}-kp34?uYsJvZ37}smr%edEx8kN6Cl(i8+M+d-I=+@WXfZvCe^>xh1hM8<{dnxy3FTJT7JQi5&V+X&3su&^+NzW#0ujXZ&y`!I{7 z5x`f)Q=7$`t?Q$nfBv@X@T>DY$4|v4VyU?SRH+^!1hxhEV1YLnhRdNrb5m{3A};}8 zGp1%$)88-v03ZNKL_t(XP}fw2;)){l4voO(a;x)1u=cs08(WG?8!Bazs<@|d-tx0Z zIj|9LN z%PU)Kk_~8ar&N7Gl6Cy5CnV>I=CNUH;tBE!vvB%C9MW^HqqVbJ<_hC^9|=&J1s3ZH z`k(Y5ucQdI%`I3mm_#YhTuJkDeI^0SBLF^K59}s0hB|wZdhrS#)HPyuc~!OM@T%e_ zfiJ)2N7&DCq1%8@;--Md3zx$wgfX#rjr91kIUSORG3GU!%&?j*@*2iftV_`X(M$Ch z=Qarz0;tdlg1zgu=2%=~RFRLxM;!oTuP<7VG2SCNieMG<7_ZL?vvm%AgO8D&my4>J znhgMqs%xj_f=kq=+-JjzfacZkY+wMn8JQ?6sldee4BT$^U<$+O(8L~#V4l;IGTA!8FTYDbFaluWJRms@Z6!lOUU!E*@UC-C(<+eePybxc!s(7w=J?VG;ZnxXf z-`|f14<5+RJnxLp$HvBR_3BlL4VV`(Ugy6v8jZMp`!*61669}5Nl7?$>XhvHXU?3F zpRZiGBJa1jxENX2Ui>Csc$xUh{R8G0((8@6yw?n~aSCJOeQ4=w!@Oxt@;4Gzm}lr` zf}^1B>e~3q9n>Gy7a~yXhQYLmCnNo6Xnu&9#YNb-k4BVAbT6SBiUM{bL?Z#K6#%A_ zkyY-l>M;7b{PKp1Yp9Bc^*BV;7L<~kaWivX5>-iv>F#-qbLZo5_Usv?rd~yDO&u2I zSK#%KD9bvUstmylr+S?z)Xfkfpaa2!U?tu=>ugs#LI1lG9oJDMGEY6?5fVM{+Fqv)AdV%|moU=&Y z&b^y^7ps5F%LsmPE$2GN^*lskx^oq?lY^+dU5v`ATNrpcES)}`qHOcP?Q_7XG3R1^ zP!r}MmA@^u8b$#I~BDbG#O47Yh4 zk6Uizc6B+Ld%9rpQH913j_;@>{#2lef3(;ly#Ro1Y=wWQA^-B0gO~60as*zEz}I&K zxbbik<(&zvp2W(}!kS|6PL{V40<$HFZ$VqeGi5!Sr}Yild0tESFBM{mr3GHTNA2*Q~<>>q&*SuoMTFrrhqCvxRlQ&fWpS%W)m31WM99APe1(> zr6r}9otYJ;6z4A)Q*vG+V5~|4H$gRmT{;M+Kri)K>NyrY)m+ts%B@$mevTEOLvV-6 zL$b&{qA2$eBo32xOIBtW0bd9KPY?kQt#5*$T3m_}EE3VSjEan)SFCkBUQNa&$hd+E zJ^_ws|HB>>s_%@%7jg~)a60UmpPfc`dn=4Dft9Y!Tq~ho}N$F@t~_i&yJHDB?H>SjY3nVuQ~Isyn#`aGqG~4(YMO%M2x&UBg64Gzp$N3y0 zcuu=o6Q-tmk(Zx}ci!KI=%X>nzfpjJ!G7`U7vR@z!_4$JD#}X{d+ZoukHzBj>C?E7 zkbutaE>TWPVfJ?hz|@{cK&`s^E@ESkV(;EP*ni*v&L~@3Jk}OOR z)DuNEdsBpHc@w#>v;Px&;wZ(MIzs+eKi1#nI?=BYeOxvHFoFRtD!U_uoj|||O|ziC zzY`U=%1~W8joHP3Q`Xck^ z^WO9K`7?}`}QLG$SL#=j=`ld zW+bSntfBp4KTZIQ;Eb~Slz3YD-YM0iJLrYeufgu2O`sX8i_g&7R)^HwJhTlC!(ewP zkSk(wE{YyrkCDEujazU@F=cdPQ_pU z#rJXfatemWC#5|HW8`O}&v5_lJrw2L!0n1#=bFj?={-|lFS%!2cT2M`1k7HS8+eMvB7YJTY zKCcGD;sT1Yv+>%Ge~J%xe1i6lUO1fWQ|raj!YXQO9)QP?pP!4SrUncT58>{eJGhpa zCCC2k*%)T$=FrvEjnd*0Fjh>e|0TgPuh)g%-VUUv zUBRwBALG!mC^QfBVA=11C88Xc{>gqf)=46vt=0SHh9d_ zcsB45MHPi;>gmLa%MBMT$f-gUJ1qieDo@g_c;(8Ifqs5F(4XSp`7_rTf>?Z{;_Jzi zC#bBf#Ia+?uzUAztgWrd-xx;^4h~}f{{8sdzx`XJr>6_)gx6GOXQ$*!ue|aKqNAgw z0R8H#uj2LBU&oOnN91?@yYuJIqrSdgu0!VQn|t!_w@!SO{uRek)@}A8WZyT@AX26lb(Z&Ct17TcT?~8hp|8;Ahfw}a}VDHz!Z6ywH6Z1y1E`A zIVBN0cD#$2m}o>rMd9@6v$$Dt8#b%Ty9vH%ZU-C|E7&u9W?~BIDOd5Mzxts7W}{={ zVh`(Q8v?plMB;AUrjPsXb2&u>#HD)$l~7#2-L4fp9eIq~l?AxpSc|EZCD?u3n@CP3 zNrbf?Rrg_pDfu|Zl0DVvCPR@Ad+A0<&~}>zT^*gsxt@!d!$?h+g_gQoxO({%_86V<(J;6?C*e zLRwlX4j+y}RP+Iyjz5W#vKz3o{Rppps%sfysS92vxSBmj3M%*U{@Y0)WxJh&EefNm8Om$vato^mz{P z!t|TrHjLuI-5gxYOT+DkdKi2GXc0CJSqQYPpcGpyEa=Z1K_68>riURM95pdFPKsRI zf0&c-@?Bq!z{?T%_csCzboJzwfv?Usqf$kbJuEN)qW+-e8IuYojngwTxKUh$W5;8W znRyL$bq$!9m=so;4u0{y^!FxvgYUn2(-Zm^AGrx~vsJc60$fFuR8+l)#ZcG}TKUZ{ zOd-D@8~YFJ!Ows3bNr9L|9iah>d)}*yYJ)d+4Jb^>`)ClMVaCjR^igp0%m5Wz(Uy`J84#+*i#F3N4v#!pKu>T`ce+GL@pn3dM1lb)97z_qU#>{3591dCw5;O@2 z80K&|v9@N2SZq14u&{)Q$tf637Wwz0AP}Y```)NV*93d?&(wo1`JF0mn;kXxYH%X< zII8a4#mv++EM^O=7Ax#l7DNb;DlnIGjw(2g4b@}(nLv!iV#4zBA`FIA30@V*rV>qk z&c2ucs`ISaUEwhMZz=Zg^4cO6R+q45vA{-{wl1!}9V9){F+R zaUnBU6((u@K&Gz-kIM$T)c})e8AjtGtkzYyXvgEFl2NJDTu!HefVXc|ASLM{y4xRN zd42|_)g@RAYw)-=rB0;9q|*k&>H=(siM*29g**p6TsRq3s+J%`d zSYBMh>dLar8GbIU5IB}LyB%hW4Qp#gxLmxR>{wb_#MszVv6-Y5sjhq^2&TX=Dlth; zGQeP1gP9gW0;W-op%}dqa7P&SzYX+yUgZ@j)NF}YIa@dGkzjsvt@+JAy?Bm)^Q&Gy z`-d3;eck6-`|URtD^;Hs9R%Ye!LJDTE^I;e>=s z3_gL)M|Xz^07kAa`^U*z!G2onn*bQ?ds)aO*iXB1%>d24go%kxl$Kw|>GP*i+ti4u z`8il@1Yy{lz#|3rx(D}gIQkH7mX~96WCZOU9XNO4JW|uH;_28kS?AS!|Lh!==Y>J4 z)-Mtt*awBl+o_YsaqU_rIyySg(%Oov8R5PlEBK_8kM>u@>o0xl;dV0>&8U7a1s%gaZ?#Y^bvV*%AF09a>N8{T{OO(Z8L zqN}?d{r!DNNW6&cJ3hqSdo?iGsHSD?62ha$Ex2+e5f>BAVRm*JBO}AOemxtf;?AJ8 ztsPdYLsS%++YX<{f{BR%lvNZUGbbH)AKb^X)dDw_F2aiS%6Db%Cl;6jf+>5ppqQg6 zb>ZjF^4~W9^=o8vAJ#zuT0T3y>_5bQ3*2+9@OaECAidJ1xj3Sg!cH2VRuz#lPl z*~lqnwN$YkKb^U!Djxl|@A6f7o+GI%z!-1+HUKOr2yMt4M%Wh?3%RkeA?(|~1Hbt7 zKjEDnzeHTZN!+fj!{p)$98}sw6kz)Nl)_NNQjS-v=mS`g2@tg5e#{=;ZiIt2*i5si ztG$J^jAT^SJixrkEMqU`JUTEJ0UUJTfiaCf=RbdR)iJBr{(dv*^WXn>|EnJFzW6Wn zIG^^(1i+l00GuQ^1%0qRYzjuxK>OT5nvP zL3znF?D*in(-jOl*sBRC11OTH_jfF@m_}7*e@u2b!_P_rT{^WoA zk2o8D0fSG+1u&rtLq%x?w*BfYeD5#5gV%rl8j_P!5qCNsKmN%p_}~AJ{|mqT<*#tB zrbfW8Gw09YyFd6V{N?w*hyU?E{~ka8`Oopj8*j*3d+XLMJR2VqTS7AF>1O1k)s~DU z-3fd`DAebn;<7AC($XxPN;-$mu~8uj@fTc1bV3o^4(ap2%?6clD-XlMYpZ{I=eu@l&}YagCH8;7Q` zkE91KrwvZ44KAAl5326tqxW{;&;InkASUJ*dIpBzp-n9J6am1fDpd+FJqLOo08?>_ zKg9S@^|5r=7tq^Pi_FXm$So_tumHX!-!g_#^%9PaIt$7^S6o^G>sY4}SqQ~kixd%^ z^{CX8WW4vzdwAp5Z(`4${kU_d3JZ%%qRzEB%m{|qd&`2Z-WD7=aTtlo7xB2G1=G{x z;)wA#|NVa=D=QzfGm8Q|aqPANU_3U_ev2Kwvh(Fy$Qs~KPb)5-I*4Ds@;CTo&%21f zau$^hH86P?8-(DYP)Uer8cc>Iv^6(K4zYL7E>uKE zBpzl>Ohq0f=jyxTmobZ;e~&K=fbmq3xldaIkt(x*Bom3fKI||Xm+@q<7Zo?lQB-*w zPiAIe4~OAg55wZ)=1hB(WoWipxQt`y>#Rd%)lF12x4;lshkG6HvcM+2I{I**y(jT=1ok-7O9+^?;|wd@QO+{i`W zKsQF7K0!xUJ8B-(qPx2rHk(bxd~^Kx9=va=zjQme*||x4@WK1Y$+?d4@iCaqW?}5T z{m$F?Xy?cBo=n!rx~JvI;`{;{>gthmJsbJCxwuzdg~5S7EG^E%W;Mg>aSJGR|6Ub} zZWJIl=Q@gu3eno~5GzZ|@*ea$URqd0PgfV38XNHVQ5%Mbo}i(=5oKi+sIPCr?A#&( z!F5S&nWQNqkRImqQJotdjAEdt17JL#Wc)NVG$1Q03rw^gKW-PWi(^7n*TVb~x;uMN zd;bBRJ{?0}-vFxb*P@`f1WhfiST-1yg>aZX6EsmqDQ%A`3~@Xux#yj#0aoZJy&vf7 zM`n5kifFG%U!0W!(qE${e~oTTywd6uCKB zC@Hyt#>RR)eL5_l9mjs4zYm!i>GB8hVt@!JbK&&i_HwDo6W!-qW)r2a00;W%P}=IjoSM)!nn=N$wou{11v8s z$e5FCG&MOTf$qbHEy6~nMMHUcIdXHeF*w){i^V7wh|*UmqR^b1pGMoGR+N+#qu@pX zZr{Cw&fZ=utr_5=O^Yzr7_@IHz_$L(zkK%oS@1v)kL2+s0Jdf3epP?e*L{7x`OV++ zcLl(x=wh*%zWYHxEf5V@TO7ruE9a4!pM&&N?!fxG8MCv!D66=Jge!>{d^RQ)a|FrkE+%|lJbOBXlHvkM4j1O;h0I_u8qw7J z5Q#~b&^OSp2qcji{oI^YWqo0DQW>R`QUNS3%;8@3U8E#mhS5mIw_nz^NA2zSWY1nS zwYFf@xCS?U@dHj+S7)#^^Av6E%}C77!sD^0m^7@w>;PTLCa($9qT!@ZkQvYGhx}66-+P3Uj?835Cqp zM~@!KzNg0-9Cx**szS6{ZzFRe0)P>~zjx;rN^j(2ZhAt97cAa(w728p#Y?zXb02Gl zWmv2RQ9fm6q+n!t01k&$>}7ZiQ8C9*P+W$|*?H*=!-99sgL^0`DL{8uyA(4#9!>VH z%&ctOC@O=&Xa+1u6@d!9)SbX|T02m88em1ATIu-6tA3SyqK9>uAuMJN3Dr~Mr z^bED&#?5>*JZi^+(IOy(*q)MUt~Z+(nssD;Mxr5(AjeFU`a;O^0C2%$UqoYV1yWKk z;@16IEZbG@Z`E&bi|T6&2&TXteI499GoSs5pQyi1KVzSL)gSs9UZeVT`{HM*_?d13 zjG=>47h$hFDo<&n=hD{Ta;;!taU4ypO-Q(sg^vCS7_C0Iy#Y~XN`LeS07d|2^OzOj zN%Apm1)TveY(Xzfng#x#1uILVsJ>T*-N%mM;ovZgZUWG>Z>2&{2f%#z3;;%WjfFN6 z9cZl-@Bm>C*27MiO|xidyo=cQSkymm#;nl*XCNs3Q)q3axeV~QS7Em=VtIKIMYk$Y zbf*eEBhMggecEq&+)`i*tP>P;SBP$dA1O1YZEG#VG zP;?aH&z(hcTPy7BJITB)plldfE900-k6^}}8*`EC%4UI&ajpPh(gV#WAQtySwmf>Z z001BWNklUM+yy>ROyT9gnNYDdLz>U;h9x(a|^@6^(~Y55=O^ zt$8p!Jc6{;tJt$^H(HxpU^EyoH@|@L%Dadf3}H!~mc=$qJ#9x}K`Nrp9!KZIGgz71ZmhAJN3YJsCIH6YU*5j#5s)(k zK*QqFIBr*0Ao}D9v~>5vU}Fn_07%-TAjQYF1ECibU}BH{zYYLn46cCE2mnTxAQ7=} z9S=!;#%x+eZEY2*s&Bz;Srgk>UR!k!8gS@P47$5}MWsncBlg8z4+PNH-if#)$Fc1f zZ{Wm{<48$K$CIaHV%yH%#SXTrAejDd0$}T6-|q0RZ>|>}*D`v$?jt$nBrkC?P2SX0{0~RQYocYJzKh9Tu-2MwbmXH*MD)80zc5rSoTy zo_ZOJi?h(!zd7WGm#XHF7cRDrVEYSkKT`9Wu`p|#`kKwh&E4_Kp8LQT1i)1AtC}ej ziDl45c{Z&*TnPEy2zZ>BnH)nwVIi`MO7LWAT6%k#{63hx4!HeR_`GZIyXFyc&YKhtST3QY=+z4zeEzjdtWx3cV9X?Dcx{_g^IB^oy)%T?^$75y^ z!5&kWFJHpJL;G>yz+S}09>L+5DD2v^OTen5vB%KYKL9(eP$Y3xKp%^J42o2dienoP zsAFE4!ev4LBZyh7Tm9?MgPE{B2|Qf=;`jks&FbezjAHs!%OPHNog3C=7F2Ao|t^}SN26Rl6b^AJkQ2H?v zTxoyw2&q?65Ov@XqN1X4IOYhVqhoL>>53c=L7=hGab#y^&F1us=E) zyAB+{o~S64R#sw)g<>Xmw8xS@U_mKJFaec7C?dP(_mKwQ;dMM29K!jt=kU`X{{*`~ z-G!Lw!!lMJGlGT_;}Zhp@_ascP$T}^AAPg~@4ovs4jkBrPe0v>y?b}#(xr=Hv%dexC-z>KtwqT*Il8M{(p>45E%4!FxMC!nSv}a5Dbo62D-+vHMhhvaeP>8t&0+3{yy5V%LpdddLM`QM3-`-s~ zaySNuqmN?STkm4$&QDNYUIw?@fd>!n;dpEee)am#@x5>VB|iD^W5mWB!`U!MZ$#yL>)XN z;~90}0AivJA?acQh6jgWw^+rZCpGyhUirzZ`1r$*<+agKQHVWu1cweCKy}q^*lZ?I zXR@F~Q0&_EOzbD5E_K!ZquixH=tJkh!W^q9nR;u{&n}9B^2V2(%{pWvY z3-%x7;r?y~UCxconW2NE%94W5v$uw*NXg=-RjuEFkl&1;dj)F?qexA=gq)%RbUhh{ zGq?_$Hz1Z%3IJ0{Gc8=X1~JKGvZdnm5NIPJJj8Ve!r?W{&UT=zJQMMW7tuFL=67v_l#l!O`OGun5W|R&&F$wuXwLB1G@okHNlvxSTH798NSew_)4+JCJrQ2V)Zx5k@BM-gK*2 z#smD$kVk1?O$UrXK-lP1dr|#Gl`<1+5+-`OyJRgZFDnzaxmrgfpn|B5R8d`s2a=34 z=kiORO9Ehd*E5lxav7$zWl_U%OxOb@Dd~z7@g^t7;d0qvwHh!#HwlN`EcRYziwO@~ znh|sC1a9A}#fs4ke<&nzOLle^($kVL*w-!nqDXuh9({`Z8zqQ8pNQGHd9e`oc^n7_ zX(en$eN!z`ucafWq!?y`DG_BNRY1D>i^T@%$0hzD{s;g@n3V8Cln}P+U7Q|J* zZ)FEWJ7p?qGz5HB_#BI9YrKVwj3ks--^YxBDnX@E6;}YUJ5+q)4d7u5i1+!kgR@7U z3%}n?`uz9*-T$h`Lofad7R?obj(Gx!1nY3nA%H4HKP{8lpWO_rZ2_IV?KpWZ8IO9# zVYK<-4N&Flhc`svgtpSOe&)I4`m9KKEIJavr=_AZ=z}fnhdn^jm<5KFQPkGm!k*)? zsO|2Z9bRrJT6;+6j zibY2HH9YPcfJO7bZg+}uzof7T$77D5wdo-;GO`eVJ^@*|dFUA)hS}|c#pQy7WTojD z?EK_YR94=`($bQEJ+!C4oRWZj7Cnu4J@v#3Yo;| zvcc!03&lJh)ZfR^lgCisLj{-@Hi<2QSZ6_<)|Uc)DYagZeJBF~xZTVP*ei}UTmcym zH;M5C*@JdCjnB~0RDt-UGbnGU!!pSr1i&JeW!&F+ZKzm9_0g1TN8j+bT+ZsLNHi=~ ztIB?yd!v41&tuvZ{=+}~L!^MNNIcB3Nix~7V+VHb+$olrbZ96mE5kqj<3GxC{GB-w zEy$=AJbU&mE?-tXKxvyuLL2k+7jq!}v%jv799JqKX=_bVYRGHE!bCUjROaINrE}<< z8i$#+T@pnk_S!rt>YVWG@qhX?!jX9Xx3BBid^Nr|$1;d;(1DfZaa7k<;^6UEbUqn{ znU?;609=|&z%Q;zw13`IfGJD#t*TyiZge6w-}}qFMeqk9JM+5aUZUE2aBq}-h2&GO z3r52djK(F^pWW}l`1m-=O3QIMDFt(L3)1V5@uT1ChH-fr7YY6+B%wUN7%7*MaU~@U z{UcAIg~Ae_Xxt}5{0u3DL;xDDDVyM*d&T1s5oIugt5{#`b2>|93 zMHk~G#ujSSHWW{MjtVeZAhHJ;dxrTup#3dfjVLto)7Exv4L1tQP*Hvt&z?=F*ZG}r zx>n)V*5LKq;0gL*u$fSO|2ERoF5~j$L>xI1ho+`3m`sk%ONp)?k#-j(7|EK;p3DTV zrQbOF_qh;o84z;JBcLsyqyHhUSL7r2?oC(-k_Fi2$_p*vgx$V|g6nC>Oin~uQ66e) z?jkwuGOicq;BkMqsK}`bWt~&yB_u4cje~#VIX=(h|3i`jzBm9Ty)fA1k$&s!OX3lR z4U3~;zlNa4EsT?_Yu9ll^E&#Tjf(=z6!63BbHWqk25x}gHHUzG3a#}O$jV7a{++up z1lM5=tV83bC-w?#DDR9kIi>=Ps;v-wREV+Phwg(PB%10I04(5`LUnl>QnN0jys-hR zp>=3s$m^MeiMV_{ARe3wecV)lJjFDNJ!D~*JN#0}*V zZJH7jFCs4PB+}EbqN1V<<>jSFNH~u--+BXYZhH$UsaLVIydw62?1w~uWR9l}4yo_Y z;-6PGYqH3vrp5$Fd&|8W_9fd6 z%R*)49aP@FgS3oH#GN^dq|3>eo}9tr>;i6;-o!6nc@01Ks~_TE^kH1jFF05@g>ppC7&5JvepZq}ZPjEWBA>f!ypI z9Nd2ZaVJlqv$IR)B-MvcpN>jT0V?o*@PqH;z4zWhQc@yHON&8H_o&6_t-dG{{Tv$AnAGVfQGmJsl|(e|(&X;%`F zmV61fZ5-uD^NpT^n?o^@j=3SgV zbq>dlo)E>NraAC*bPy%Q`G`Gw7;nD*D_l#@Le=dmQQ1*#M`jkU6Ti<1&1FT$qehgK z=HUE=SVSG(jgHO^QAFk;O!IMk18*RpWx zQBq!lvRf6nl$wk~$BrPkq!@E6%Mk!fMte(>CeVW3` z2Jv|SjIUxcL_lW=vomcdElWpSLIS#nC*bg@M$>^XtxQ~KYi&Zxl_X?mW@2r5MG_~6 z!y(GA0|%o}dHXI_*9;)w#`RvK?HU>85rYRw_}EJ?s2HXMf(WXmr==j_!a1=SrK*}B zTHn9`_8p2sdF36<%+G=Lqa*-^JvP`33utJr!~VFFXdW5HyweUlS&vkJ(fi+FM{7fa zD8RU0(*7^&dJc}qoyBXv-iDL$=jHvm{`-7xS^N2&NJ1d!#XG+@t>Anryh0$eQ462x~{O-Q|*h{W^p zFt1VB%-)gy4FD`YJ|1IZ&!nFxb3o>Q1fxvGRW!FW;nbPaxR#TTfsv0XNnIP65E`9@ZiGS|)NzO5mjZ z-8u`RKFK}BLTdy3BFkLel>&^=(`Etli(S3?HKHCj0I-M!D05I+>9Xez8MmR31CJg* zMCSEO6qT33;&E+QATsA9M7;H;ihAn$dp_^n`l_$u&-~7jG1&mfw*X-4N&!XyEbI*; zkL|{Op;b2&po!S!@b27F9iBy*{dF*e5J3 z>O$5X7?-l|ThMPuz`1}&O*fH|k%+SDdzdp>rEn$M8mS|w_YyEnSKdT=fU#)y`M1sE z{i^PVyoLn;6QUdob^%yD9s$670Ve`MD}rGYY>qi}_CCVCm^id{Kf{{U3#*ehM3H`~ zK}`ys1i+|R5`s`fZOJuWWACqk2ljRLY9}~hhG}gSjSuhO!09;D^$lXx;Zk#*wuS_L z*!zcI4i!zjHX{HS3x9lnvDhU@#Qv+a!3)vSat03{R^!C^Q)uk&z@pUxXMna+RC{{i zq58~gM9{Yen|TJ;3iEKapa?BJgHjV>Jk45>C*Z-FWfdi*g*bU624&fKSQ?%{{GnK6 zW#yog*1S~8x!9}DkK%$teDvOS96xdtAAkHQKHak)*9r=;VzRs`b$CA<@Zz)wLNsY-`22ONkP<6YyeRS*On~DzIfLuWIk( z<=xBVSl&(6f; z_!t=bdp+EbLYSLdL}_s;XoEl-z50 z)ZYuU(;?0fI#GctH!s~QXot$UjQBa%>D48P{+==_)#&JcXUgu5cJuzZ;&A1HqsPLC+Ebwkb5#l;BEgBGQYBvEpN| zuytjLAdPO>1B}W8vNFS}NGE=>0mWQW#B{}sBx62cL%=qHyQL{e&b)-uhI%Xo*5M>8 zC_n}!6A^O2g3xHE$o?AvzW3&4xp^V0AYYbVUehmcFGt|z2)rDD|BoZUViN;h2F|i! zMig08C9#<`T_Moq)7Y`d7@$TF2pdc?#dO3MD5Bxr# z*oEx;=wq=Bl;*2mKknB&z@exksJ{0AYX*}5V17TDE{GH<*%VYI&IB`fCzwdfz=ur@ zNV;$l6|{?5T2l{X;lZ^UAl5xtV1Q4US@Rk``b}0Xa82 zj>?;*NH}{AGn3O2oP|T{2>5uuI422!Ig~QN?}XL5h~}1ixOnLddU|Nz>5w8kS**0I zp)F`a!UYfEWTXj7Y!t&w*D$C0db0`WuUEOkN&dto@XFvTJjzk?s+rwrAJOp|* zq+Gd-E0+_|*7i^o7#!b%f;{Zqw+Cq%X=rJ0MSD*dnjW>{L30xZ$HqiS!J@PZZS+{@ z#mAR{&u7=kKZa-Y^Zfbemw(moguN69_E`XoMNIZW3WZexGpMb>FgJqCtYqXC<)dR@ zKw|p9x^OlnVb+-~#4mT2WS!j`+kR^gf+}!ykfI7^!aQ71r9) zBn7#Q)T=NXjIxeUZQ0x3kLbfkaQjXbR#w*(0Os+4c1~0+^Z2L=MBKo}1kOz^DLon3vJmT#t_qN8>?n4`!@p z*a?)7)lNHEzYh!3)3{k&f)Cz%AMd^UK0f&HV|=`OANC%KL43j``ObW;+fA|{fkhS{ zy>M%q>=jgk32DNoRKom;YI~2z`l~;`af-WL9hd zJzRV@0We+#>^&{KX=S+>CIDs^Tj&#p_V9iX(N9 z%@=%Sf7%?I&2sVc02uRia6b76fcd2+5b)Z?w#}ujpslkG7gNvUdT|k^SJ&WT19iVw zR3B8r(-xF_K4TzZB?nZ#FT__Ct{9V2ZAP$-#dFs@TI)-YcJ(~U?%l_-!y&FOjAT{3 z`|k$;WBUlJ=7Cvr!|97$A0aAVO|ZM>(9zS1_jVpYbJr+VtsWRGR=7P5s2*Shm(_Jd z%R^;Nt*#%g*G`WMRw^42gd1Ljf+m<&N6^%K7g1;9(K7rLM$IGO2Lu44qLjde|1$uX zI0_IK6EA6DUX(pl7XJ`w=TL#F}~2?824%>tj-h)`e+nqv_e zdD%#!eQZaMsvFWpDBy$5ZNuoq2;TqTZ5-OW8>QEC(Q@Yjc5nL#adGER*Y+4zuTMxE zUbluDxp{c=7q8=u*MEh$xOhY#J&uHwRCJ6y!K&K{O{}Zd1pwRi$!`4XKm99y`HNrT zg&J2(NiZ--~13R5)>o*3CRV_B|J_Sf>0u_V}p{EFBY@NEV(Tb5(B z7RyS!0f6y0=IT1g#e9T4yQtcF{q@(SFPQX=4g?~0?|mpNEX1x|y9DHFY-~hZTblr4 zRDIF@kT#jo(b3Weth%}y_4W0V?^6wymzM_;cKA7eOgDYE2uS}%4dI{#3sXI)ym=il z7fz#lW*Sx!8^rokR_u+#-#jmyr%nA)|I5ZpU;glWj{wJ#z_0^m^EB!o-b2*sQ|K6d z2D6*(hSr6s;17GD1)Z|CsNP?jDtiK8i~!V)k35fGJ^;qGKxz@9P};PSWe<6h(-@yh z%nQ`0avyND2RfG}fV4Wq+@_;kk(eDuzH$WOb5+M88~ zIS`Elhhk9M+y;~8ft&k@4uFv{Cv^%cb$M4cD7|jMaZngTSYktudmeq=caU=RILhvq z3jih-h(YBvA>f0G0wYi&1vz1{kX{dP4I zgYudXyzu+X2nB7*{@CxqvdMtn{!Ubs7vjRXGuX4|FluYtU|6w%pTSs-iZbR6%s18} zpG76EClG+$7EeEKDvyOxGEuU9Z0cZji?29o4+Gm`Pq zJ8$6qZNCx#to(KvG77SB`f?(YGBYrROC3d$wx6C8ChmownxIoI0WHP8Q`S+gT zpZ5>HFaV||x3W86VU)5~r^6ym-`O}B;UMN_W^g?_7Z;N=&^h!J_Tako0JHjCa0hJg z2TTZgR}i$%psl_FX_?8$E-wc=yJ!F$UO#LO7u-&}^wJQYPD#IMlM;fP>>fW^iz-78 zh*Z#zb+WI#hO0TrC~tm<AJYND}pEpHb z{_W)myc~fqV+16akMuau-%sB-8Ei8ErhoX*lOa4Edxo)zaZJz7V0d%{14Dz-T$xrI zWU*8I#h-bz+noYDoH}(HKmF;e$jQmW$jDP+Hu5ulzRv<~`sY9YsDc;WCWeIu5*%~@ zjQzi;ZV3dOlGJ#8PO&)b>FtpXxS+5EpMJU*2M->`lP4osU0uNkJKn>8{15*pzWbNo z!S}xNU3~Muehc6H=AYv`-}xTC_x&H>{Dq6??d?NHM+e?|>n+So&j<*>zDIgYb@Nsw zQm>|?we2x97V!u;1j$_I&PdRRfq@DT$U3AYFG(3*j}u12idd|$pAr>Z0|Nu%*G>=r z1BVWx`u;r`NA^cze=_!7VzEneJ0&3Cd&>??%N+K_@@g1tje)VhAKd6&&UR_+pfj#^2;NE>0S5^^X0X!T+VP3A>d%8PeGOkI%oW<#@ zX{q@B4}XCF`%nH8zVYAw8-DWIYdDjTfWFbEFgsns@Y2(k=huOkzx{EK!0!Wq>D=he zN0JB0-XmkrrP&b(Io;q{wE0k*i_2>qBo(CsLEI;B4G!S(m7e zGFvU^9UQ=!_;YA_*aEA~t}GClJA@VZD;C3Hg8lqmF-%q8LqA4G25~Jb9mkHwNFPA% z)l^_jPR(G)&Rw{5w@Lsohtmd^(}Mq(z4!2r>&)&1|B5|(cD?I!c6MjZ8PED0ug5;? z@vdjaZF}9*ZONTm-BNc;-D*XWVvb;@m?`FfMC3$(Ai;pd07ftYAPEvA2ogjFDp$Rn zs_@(MyI&Pau_?7=TjLHaou>i{#j5wd_ulv2dw=1kog^GHhI5xX@QXQfaJsu2Q-&dh zQ>qu(z}h3Iuj`16Par%oiH8G^FgP@V>o|)&rGjN-SmrwBJlPiS@4TRiZA})Y?!+@KK=YW0LJT8ih2QAxp4$R zQhI>x*}n$|E6NcuQm|-YCIFb4?VsHbeiQEm{y&$0KKu9I+@GJ0(X#-U^mieXTzWrc zEf6giW~*II!+yFV6N#gUXIbp$C72*K?42LR*T$??y&Xoi6}fwk#045|U# z5JF?O(01xD=B`~E0ONH{8%4(Cp8QHE{##W>M%8IBM5X*&J{h@_%8*V%#p`nP|D zKmC*cfdBj-{~Uk&fBhx?-T(A&@bCY_pJ3^_^>{cjA;fAunLuSp3Gx;$Ld%JhV4QaL zVkb85-HWxmw&V8jpx7`{5i$5^NczNV{&*9P96o~Ey}jtY*N1}@WtcH{Hu6@l!sF2q zu@)ytVrn{)(HI8q-a|4RM%s0b;!T$EH==Ny1jfb&aH6>po40Sl zg<8H1iJ`m?bxwHK(5`pcT0b-*|TROFE0;NkFhNPe?EBdpyW3siB3&TNnfz< zeeZkn8FbG0U3zd787I&K;v1Riv?Ald?uI}3sPtpcFnHYm($HbMxk~n~M z9oEB=7#@6xy?YO0`}RUyx_Cp~oK$1e1&DU*w3wxJvQ6bUZD-RkJV!tXL5k30m`z3kB2a^XBy zZP|+6`vaH=$6!hO4;4)^26>{^6|gaTtA9ne`Q^1(gSI1$%I`sR4KTZX=mWK+{cxBT>}V zHeln%tvG)Cq_F1q@86Au3+JNYP#t=@dqn9)!0YnmE2ulvfR1w)Ff=rb>({U2r$7Cv zSnQ<|Nw~Hn>Y`{kB8>A@tJmV(g-bA9Us#?j0&?Sn1wtm%>?M!`zgU!eJoo^$H5Di; zJBV91yOBu5!32X|?6tME*uG+C9!Y!7R;UXOEe!lgzjsX(S74Oy1ROC^-342 zYZ`F&%tee0k79Im5PSBn!}d>B;7aFd_#S%_C{;T`I4)nhj0X?yBOVKj{U$Aa0#}EY9LJR_r;uN`6MgsYN#BJaO*|_N z*SAnrRgOJ-cA=%ES+039ZOIT0hbD2Vy$x$ttw!gi%Wy0QW5Z+k=!01}-O`3+EUrMe zbbzwrBGgt_iYk#~OHh&al6U*=;`W_h-011Sja#=+UQ>(N3m2iVtP(@xv_O2BM*gm^ zIWIoGFBaQ!cFk>EbDrOF02rBqESx%S3TY=M09bVNJ`NV|Lq%;BuHU=`!wF>Wmf{vm znY6-Ul1EVK1pt`Kg6y;d+l?adhcPtRf!eygSigNYx*t4-&PMmsKD@L6+tJY1*Na27 zHQ2UkvznLEX|W4Fd;YxG!d|*e`%z5*EW@PwE5KAJf?KzHarsIoCZ=euYdo~(v!MA9;<-oCR3_c#lp@yS)`~4ZXc;%|7lDU4+);%7N3TX8GAABD_ z`tcjM-Fp{?No9vpfsri0dA6pyN)%v^2Oomu3$9=60k&k(Vq83b0i2^ruwZ{BK1fnv zUxe=NZajYc7`9D&V19;3U}_@LL!yKSSW(=NL=-j2&Toxjz!br{C()Wa2A0}Rc!_rE_Gu2 zo&%_9Y{FzHB=$9F-@tT6hh@gla^@6vA1p zcP43?K^z)|xFcMBU{%q#$Bt_X2q?5RQ{W1!Ri%?!ujfjze&U=ESh%DXV>6bl) zj->RFbs%~A_uu57o{o_eePmu>k(mWd)h|{YTSQHmLBLqRwv@UjL!wUN4S0OI%Y3jjWgHoVIpB8X&M45 z()N&rCx;eGes=TdK0t;$`_g8hTP9MD4RbmJgJbW85gxydmbOEfk+%eAZ}uX>zD-;; zIKMvuz&Mxt;C~WdvS=ec*aFzL0o~ML*mSet9Fssi`~V$io3L*C2AsOyiO1n7C>y3U zqA3>4Qb-30O#2}z#8uQ)qoDc_E_C04n+Cjqgo-pQS|BE-aIO0?x^8r$_u6$_IDQIC zW-h>nO`qV@c3#c;-$FO z*_l259Q>8LrxXAteVD~cDlGsQEiI{N^L-O(FDdqav;a&bCeU&DBGzo#B868Tvq|f( zX$OABLNXP>z=M0Zb)yTnI=gV?Oed<#YVqA4{un3P+7U}8!G6V-X5iYTPLvcBqN2PE zQ_(3zQ|uda4BJ21hN7ZkghEjv>CxW4q5d!y%wK?;-CfYN6g1sHG@;{Qc{M)XybU#n z8eln$^-cJ03ZbdTICriMOII$#+3PnDay;;E2VAjU^D_o)xUir=KdMfc*Kob!{Tr}1 zmdQDUwL2Dy39P0R0Cw>xHtZq*b`Bvg4U+(v$6k0!nZbFRbGo|jvTK1_0-sE>{8hb_ zI}eH&qH;0i*upp^9*<-D_U-uk*S{_~B-dWPPWP6st}a}7;o)JdTD3~r0r0c<`TUGsyLN%@C(X^OCpJIxcjdtmWqe2S0(%#w{RoC1QH@fF zye%7XZEy%-_RMA~l(2^wQ+Opn+L*uw}y9eD@uHaVZHFTV4!zb%E zV`<(hw4T2x>zSD)=Sdxn$$OTd{8<1P=O~MgI%xt)Be>ah6ub5;L*>yb=>cYvP|Kdc z4((sny{;lcLWx-g*b4wKs-#KmP6s9!AF~}sQ9&8X%j$6JcApRtNerSbbRsr}{s(t( zsp~p4hy8I$)U_}^GK_88_G074T{zX&0W(G0dKa!`!O%5CLX&uS|1KW%-$f!B6Xmhy zShD`Q?A1x94?BXuiQw|J3n-{AM@i#hB-3e_bkZPECF8?3Q#gO770VXQ#paD`Ff#ra zcG`jNyJ+s{z{lIRqiMOe4zcc{G0Q8CNVbfcsBl`CO4GDMu!eBr zNIv$J?!n;;9Rh&Sf+OIf=+aU}c`JLA-t%N-y(W3z<^p;(De%JN_7#o%%h~tk2)rDD z-hg#eBt9QS-|40GQY+&?b>gPKWkBs)(Z$I?A$%>YBUv`q0qW2!dbi`&C?A zf{Pa~iyDlqO(*MZPk(!5b)=FB2@I4P@7jlgf`jPkxg~(dg^L|Ha9}U??B0o{qepP!#Bnq= zHKD4y2Aj8Rm17uq_)t94>4m;~*G^PbR^WJ36OJ}EqPVb7Y@+7QosaVuE06a! z36i<*W^JMf){teEAv@f&(0jWZn>Mb)>py-Cn>MaTL;WF~IDQ~3>?TWMBlyp0^HudeH$eu2eEkZ zLVWbmOdL6KSQ>11c3wg#H2K8NfB+baxJ(jh2lC5b{!;w$`}+C>0OPn>mMQ&Z8tTfh zclQ<)741VKucy{F94xEGqNOXaX5D&F=|`ZJ{kMwt??A!cPjIrS5yzU2;?SXbl$TeD z{b6g{X$%jKARZ5)z5OuOf4msGcWsh__mRd%96NFhRTZ@;EiT8=#$(V@DJc+-3_TPJ z#2FvFi-W}lXgpkxgT+Nyv0}L-u%n~H^1l9icW}DxIO=N;V#9`I`1#wf(xCqShiuQRGQ1|JS$d~_VgkDkEa|Lxyn z-RiaIzJ3FSuH)X_UM!e52Xkl7l7GYFC-_xeU5RaNzxaEW3@NcVZRuz|ON)%O6+vS1AqorjpscDw z05Chqz@!ULkxO#68semlY zG#p=t=aWf2hVva~u$6W~B_+~;zM`rMyZ7%$MP)Va_YX)<5!xPdOC&Y1MVvA7BmCrN zKSOIf?Px>UImwp1BN-2)^U`_j+PNLY#f7M;sYO*y9g0fJu;)M_9uAGDoWx`As|j4_ zXhGA_T5R391^@WtA7jIwy{I~R1ed$6BOH$^5}$2id}Ih$FI~WqhI+I#H>0rVAU@u( z3Hik(7#vsNI3wEu>_OoD_1(Pf8QPLgk7f`r= z54LY5iK14#-_tukB?zrej&E+%STUNKQz;X>zJTr9sw}ZjN-(p zR_rJ`h|CUgcj10E1F2N|D`7 zNyBmWS-NrK3J#W*pz=^1B6qe96pPB=R{+e1nRcXSmt$&(O+Cid zOUH2JNCEa1Y{e_D{S>RW9zfl(HgsOUhKZ?BI39Bi5`(LP0TpP@JjHg{;NAlP zeUpW-Acn})U9_J%jG1{$(D5k%OgSbf1sK)5B(7x%R#^ay1x&{=U@_M9oNO=o6r!Pi zw6)bEZ{2d7>$-;Vcue}~@w*9t8CC+rk8k5#dmRqf9Kfu3voUjV9=7Z&M&q$&Ja{yW z1p6eXZCHT`!_}ntKK}SITI!nclkdKc+4B~o{$vX#k_qUxg}%PKShr?1e)f|$P*hli zYu9@)8A;$`S2yObUV#-`HsV-&D|&iwqqVgS-+JX+Sh;KkD$6Ty^5jX-L8AIl9TqHE zj1_BEV{~#tVqlKj^{dzL!MpF_fBRql5F6L7!-IQNzh+5^GA(fa$rg=;a7g=k_RCDe z2)G5XNgVSHn5hX2J?z1ii!IV$cFo51c;lUS(0KefPPVt zV-JUM_T*`NvUvyo{+q9&y1oGuA+C2G;^8p%?b?O+-hLbN=FLTW$0d zck4h5eBe}IT_e{`=IV06tBvJC*GN-2ki~!icz<^j8vJV)^ocx`NuVu@YiAtL) z?lo)Hi0vWOU;MYUM*R5WkEO5Jg$ozteSH0Q>A`c!9**qGlu1W1^r#bu4&@5~*7bM@ zQ9pn|vZYWUe%+DtY`v_@{<=~6;(zCO`j`&lm>9o{6K#!HvUw9a2!Lq{0COAy@Rk5z z>}#a}Fwz-l@2pIxsl{R(@Kpj}{A|`iXa&e#i6X#Z>?c;UjB9-%e~pbk#+J<+@T1qh zkGXSZg7GkWfR_}PV(;z)(j%R{a$U!ep7t(lM!t*jhl4m;Rfk#ce2BN-{Q!+Et(ejc z80icg>CK+TG!@a={#~C3fZ3dXGPENc#m(*`*tu&lN*l^>e_|9CL3|Q~1ppJeh=7NR zM5O91&nmzaF`AeM)ov#4_w}HyrAg{iAHMeyW`DE@yLRtK`{{Pv?Yjvh6+vWj1RWix zuyN-nsHm?))ofB?m)~ zAE2VV7@M|yjKY!vG#)#Os`^9NTUdm`(h7`Dgpf=zj^ovng#g*(jpvxeYtDmAGQYyx z{YwL2T&Q^gvOzNwCidnCJQrFjh7%`_V9S>Em_2(2-un5^@S`{0z>GPwv32)OoIH05 z5i^FQ6UWUvS5Z>D8_O5W!i;y`!s~DR2(Q2W3*>FugwnbO-0Zs#-68|fLz;t0Ssr_l z@S>4KM+H(u2s18$Ef$xlKQ!T{2GCfy8#@cPqxS4+Owcc%Y!b?%#rxh7DIP&IHdD?4 zX&ht)fT>hpjr!A(=QQ#1@p1%Sj=;+i_@|5j=N1Ol44R*?KDZFF!S6F06=1YCl(~)z zdlmr8{m$7b6bYlHtrZ(KZp5lpYjEaF2d1XNa9t1acoMeFo>3$vsAtt*>eDK)&pHML z)a9)2l&v5O4pQ6<2t*{%*Vltho7dsP8Si4o%nz_|@nS4kxD+#I&BcZdThZLyj#w-% zJp?8uN73AT469b=323xx)e7Y0EyaR`3oviNd{JNxK7K4Ly58PitX;DTix(}xs+G%y z(Y|QG0=)I+TcYlv0*n9{Z4hZiBH`9F?QJR5cZKER`Ie~H7;N|7zk~b(d+`2yzr>6W z-^Zc_^RYZ{IaaP%DT&G9!-o+Lhs3VK^=x!?T|@qXy;!n%KIYE(2uqhN!ji=cv0(mO z6cy&<;ll?Q8Gel8$Bv3E7XOyFYzdaRITiCk&6I{P`U6ft?PA1)|R7YioV(=1Rv2Q$#x+=5s% zDvH1lKX?ysy#6CmCeogB;K64+YBd(j1xz4Y7qPP??O>&39feER4xp( zc%@YcLH1`9VC)Y?@XH1PFeaPI5>54WVsbiyp@$tfbZ9?5-nkc-?hGR4Dm!#L+l!b4 zyoUq#QB_uoC5sk;_xh5&JZ#*$4OD-{;t8;)h*-^LrV&phQCe1kS6=-V{^~#fR~%|+ zz~tnFFb}DOO1m~Z+ra4XppYC0;FHO{Z23xT{$vNP-nfZqQj^|chLOUT61{61cN^;Oh2G>ZC*1tkT5F%Kg-A}s*csrJ?<>k`+ab!*qi zJYgE9C{;2LR8(6=7J;ugVZ$_~}5f!Y9(8MU(nvY`@=h?hG%$qk4 zt5>hZ;loX0t4uXDNg<^N3-H%}^`G$eTd!l)iY3^vVJ+s)pNH@K=yjCV)?=9Jfk0Wr zOpcGD?c_0R-LMv`mMzBeyk%Iwc?;^AP9Sa(@XWyBx?ob_s=+YAXg<@1-LybFa!gsb zQmst;G|3BH=?O!#K>}dZTXAD=296U+q`&@=yB|LL`BMromR>TdubCT|aNLM&SFT({ zamhgez@}2sXDkr20N9h;EeC+H(D{^@^y~NYH{l&T2#yo)VJa(lY@|uCe3O3Cca3YM zSo{Po%v22hcW-3-jJOCosVXrsInaQ9zH-Km4HK%DtlYvQtaEi9`!A47}fOOV+%wdR>p-%`z6PK9*<$D zzZW&-yRdfcEX-c;4*tJye;+^la6VRV+K$?Wdi3494b#$PUe2(OX@;NyK^PLDl+7*Y z4CxcgLRcn%;pzy|F+{`naQf^K%w4q{XS!}8tQ&GYh{B84fP4tT zCk51NJJp7{b7$kb-}yEcEnI|S$6N4tWD;{Q7^xnYMO`x1R!F zYA#R!Saw`ERvTh)wb~<`I(fV34G%W&Z8~Adyq%Hj zjmoWnL{P^TA|44eKI?*h9I5atyb}yE1*@*6;VX;r6Z7b)17iJ{6AXE-M7l}SSYrlbBVe&g>209&_qHS(4%!w2tuh&dn4$GyAvk%&jd)yQ)Vc~1K_davKWt_@r8{a3z? zA24=3bO?jtumE5diDLw6*f&^!Z`MncqB%pN&odT?6x=ug$yY91X9PW6hp}_lA{;za zg1e)`u(G|*e-!{zpdJaw&jVnb%Lpu4b_%E3j$zBDwfOLZck#pTy^hy^{1!f%JrAGk z_yjF2#}J(wmma>CJ1=3)mJL|2Vks6boR6go=VSTerIAdRG9p!d#AR96&W`I0%9G2;XL?5(%)v$x;H z;*~2=R9=eiTiwu%q$u=~S`1w`ucN562y+(B!;9n)tTBq)M zSqZat$U>k>(#!ns(NMhuI|{d>`phW|TOMqGnytyi z!h;DYo6nPxBz*=bwUfMupP{&Hyp>-9U|-oa_ws{Zj==BT2r#H+AwLIzDWFMNAmkWk ze2rTmp1&+9FqkKkB)g@R8Y~)*;mWnEIMLjU@$pIN?Lne58QyFnPT-5I5x%BgS1iul z=kxiq9_;tT=GRhSA|pI!FDSBP8=j{lk(feP_Z8ge>cq*G6DT@(5WDvrKw(iC&YkPT z@X$EI;iyVJ0!M(0t5+_HLZzsv00;8-p|rFF7cXBDt0a%?Qri|VgbFLFU&tNh`por@qe-;}6$HSf8KGagtR9lOp$_kX%AHs!eSA{U+IzGmS$8hap zCypFyKz(f;sHU0>P2qOmU6fW;ptQ0AC!3pb?{1&;_L72?Bp@uxsWo1)xJh^kpr=w| z<+PMP-g+*vMd<5stUqmb(7w>SMR}yXF zkx88EXh(6;0TdSOLq&Nh&YW(?;G>5Ufn~3_XFHJ=euvv$!}P4Gp#E?!F%U~I)mg@$PxqTESaF~lbZWezPYDaGaMJpzD8zhz03p8{Ykvc3oab279;qUCQ2 zfjf-R!HYP4ybK%n>_^L$J9r$Wn?%mGi;0{g%AtvoVKmk^pschUwTBvT_QFMI21yYL zG$IJb{*f%)4-Jn95Kds}!N34GKl`pLg?rc15qLIS+rZf9FzV~;P*G8Vs+wA~oH_&D z@}OBRQo14bh{HnzIC`{3?(>5c#n_%-fc<3^QanA`-h$D|F?a-R(moyy^y5f<9SZjC zMR8FPT3T8$@Muufaj|3qmTf(;7TmgZGydTpz9D@@!jYK72I^R*r5_mke{t<}99z_{ zt*y{s_Xxbohec>ESFi)7VHq|vQ!l4PA z>o_Couac5dA#6N+G^BvUAR~o@-dkNbT3>^r1G`XMxECcQg(xU0Kw0e}boD(z+;qj7 zjMoX1`^eNdu3qdwO?e5pCZB9;$KZGfh7UMiTCKBM1il+XI6R2sr&^F-U4#18QwS$C zvDl?`7YU7wPrQr^1%SEI2TTEAx#Im7xm$Dh!)HH#3IG!eL|*eO#*(lUMM@jP`SWK` zSX?Xs*jQ`|R@!?~AQDdhliN)dy;;bSJ1iUbeUUx=*L@EUAU8$?Fj&MU@TCf1WP?-X zLuNF=FW)hdrot!1zAyLDe7q4=RV64cEkr>{5e}4=;6Pa^n$MiZ!{Nu!jFhbPzU#ra zY@}^l*w)f7DyQf|MtXo)o&hhzj^R4o#C@DSUWlFBSEJ@+GajcjusiPWp9LbFBRm1W zbgG4H4OSw7$mk%>G}oe{>=P81@5YY8LhLT7!oiw)oNQ~w;NSyTHha4eI40@N&4OW^ zGgYs_T;4(e!t`CFtR#GQ3gO9Koas1%WgFI_wet$b<4K7t*bs$Qm~>-cp)g0}Q&w~& zS5a-sdxu3<4;}$7TNjHzEisHsms+uI%Q~FwXh;9Z5Ms1|C!oQ;dY+D(UFT3~DktE`piHF0(sIEVR_KvgYzI7AVZd{kO;J|?c$j{H0 zo=&V`?bx*woma2GbZh~@NcI>W9mOX*w&O4V@-L-#?#S?nsJ|HJa~>8lh+L^E?q*L{ zA)V18n>P2hgNSK}MJRI`&yHiT|2j^$)S;|oFZLGZqp-3P2M!)YMO_U#E}g?vcmj@V zh-IQf+d0p|(7*uBw6>$NtO}KN^*C|*3?xoZBrq~Oh^C{5QB_rn+WKl7Z##*}SV*jW z$Hzy+wS&$D-92}3^;#FIt82vlg8hz}#}yV8W9#-kINp2)LnD)FeWeYS9fxUz@OZEn zO~(#l<+@e4)ZLAk0AQRaxQ|Hzz(`+US0DCo%Ym*WeTum%?eVg?kHbD-90w*P)k>fBpz?VA-=XhOyyW zXgYZaOSW!C>y29&Pw4Q{Y%xL0XB+W@Oo9rqz%ej%{~pd9 zKZ%;sauk)8;!J0!tPiw6Oj#tvxtM0(ZCanEm9kXS?t&XAf)|gP02m!FXn|-Ng93o< zKd>C-jTN~4_z^UZ`=9w01sD}=vb_KRW1sYBGz3kL67Z;=Tcr$L@zK3{&--QC5wTgB2($DaFaQX7oRz`%g+- z8B(?mZucHNKy7_J@(YSkURH_j8$HtBjOKe%qkJaMl(|p-@Kiz0efX*#Um5@t#uuAL zXHOCVFk1?D9umngLXi>KqKQew6Cp%mQ-~zONLne_>;aasp*txg5)s6wLP&;Vh(=?W zj7Kq+h>F}@b8PXm^c*JCY@A5XPcoByI2qoEWIei=_FP#p=}}EdVc@3VCi>BFstPqH zYS7$s17mI)hRuFrl+rOMW03ef0G9pRO91Svy3SsH?#mJQy&r*G(j$pa&H^KAjYyW6 zDrC_Lgq95~E>PX%h#E}5Fxo9>DFKbxV?)ykimTk$rX`1P?j}$=+rHrMIKYy0R zMnJJA(d4h369vFfV$Pma>{sR~wm$nNx&~Y_KLc9xX)vu6Qd$C$SPWC47{(_eh{ts} zwl9s$9ovG(J{XQ63Sp{eCMHHOIW>lOA_~JIo0E;vmBk;EVfr^Gxi-YY!sZzp9g!q! zTWCds7_#7i9?J9tvOkDbd1hy1K*=Hb?j3XY4A{q%}c<8b8 zNusSDi+*IiD#eun+tQFsMiHYAeq;*lZ^CB=T?9ZFII-v!k3|rRhA}lYj;YBpv8yul zr2M;hETqUA@>ww{60$E7iXNMoIyoKuE58+(&|71jMA^ z=lMu#1|}m>gp)~3CgQSgMs(VVOv5luScVBbnL>DC63MvwUiOxweP%ovM=TzLrm@$W z4bV=QEG9`To&sRXZa`TXWr9Egqnl}gC*@LJ<_$BiH$J@q+G{F%?H_!7Vm3~1&!;;9kDlaq)h zV;Bv`Fd0iAu3Ipr7bwTehG`^WXfc>ZLe5n*8j<~D4B=9sA`*9gz80Jx4TMQPVnc9qfa7~;_(Boo7kC&m#8 z#}SJqk<@e;jtwS!Ec&n^FZ&O%Q8o+Hv{y;8|DU1B{muKA*GMd$lpzPEd#oil=~;jYa|?2=OU4Wo&^JZ&JAB(T=^^W%F7pi`$mAPL~eT)_{#lE z0F0mpS=;Q*WI8517Dn|bQjt+KHrAu5xdpfG55REK0)o)aELZg7{Z5;@90100ww2*F z4b8I=Nre$)G)$+bF!bmWii)@5Yv1|~zV-7Dv36%ZE?n;x`&!3kZ%Pfesll@?q>@R* zVhMz!354TGX(BD@GeKWksd0TIE1A6~2w){rGB5HT4t%m7DHT1!uDxNW=dkn^)M9+BOVSR z9*ZHB(&WBO=OArzt9GQpMe{AW}#b`XzD04tcGr*1W0d1ZH@F(cce#V{yUFZ54 zleH<8On_j5sdHT;!Nit1m0%dj23#jnng&ah#|qG3A5GeqaL(g#v4F^RVt9B64`)dK_9jgy_@=#zr1WU&U}NENfFlx1rJcQml#tc$}Z~B=mSh=G*b{ zF+}2V=&p~HlR+Y7irQ9BhH$&P19^F~@Qv@if;T?=5H%;7VbF%nv|(G0Fmg#A@~9*c z1=z0wV4vZ7_1w*<3M;t+%Zr|$2f)~q%A%sqXZ#X_rjMel>k5uEHKF-*J0??MXugrP zKvepUr$s!u8dZ_#X;AjuKK&;Cn%i%V*NXr!#$>9fl9~3h{ikeXq+o3b$s`t;LNpdZ zBp$;=EQ(3qQ^^F9>{};_p$yV~fVAr=yP-6J%(N71*s_3g4`V$Rf0+-VzTnkqR1K9zK4 z63OrY!lAneCmv%o9>Z`viIGSQQ;~?oAMC5*1-7WLL;*&JoFEW;B3cyX3iDnNh-IK| zC*hc5h)nh3>h*T)DJ?=r&rM7wQ)1>P7lIKu%(w2=XekCR8mM? zjB7R15EqU}G%9gbG!j90DkOGxT6R7)Y)c3YT{mxH)3$AR``!2OVBnGTUL;A8H7kjE zpTNfizEm8Z1HfnsN3}r0agZ?SmY^dO81Sqq=!wS&haO>MY68RI2!_KUjK`u#ne0jF zf#;KbkO@F$d>ck0hD11mL_C2=GKC1&8k_43d(jw3CKw}5B9aIpt|w*vHAwn1HF2(p z#@Or2Mm(;Gje9QtVO$-FL=g(d5K9;^EXKgD^kO!Q5Zc=gV|m_e{NRVL;=_;L$GPiQ z5%;J7WBkqhH6Z|)^oV0TkpsY(f70rVdR{pef+K0zbjRRz?ZjZlAK}*Zc2pd$LF={a z7))r0+pet5N>jjlKG!o)0kNFHUbLy%mdSDM9FS1TJes++htbhdoIQIMjg5^sdi1E+ zo!`HIUq~~|>!{}9cJJOjOifM6MuixaUZ+l-!uj*(ar*RWw6?a&Gu2@HoVK<$aRuRL zJX;s|O`QGzsr$rQgl&14X71#SV|b_&?Pu$8pt=fu6Cor5_7wD_XWyrKc0PZiWCwD2 z>TmzN{ZAdwf7yS>LG}^YQ~k~nbpQY$07*naRG1p;MaQK!Y%edx`Mv>6Bw4><%PU$C zlVoHIO#Na77#(?dPQF?IjP($o{dQ$;V{J--UmO#;e}c4-l(ke`NXQ}9npk_7nnENL zhOQaX4oPqT-vV2E*me@>z=Er#pogPK#u5m{6PRM1hI5(ZIT=iQ0U27Drt5*8+ zYGslW@qNz#V5X}<*9LI^9xZbBp}q4I`X|PabW|T(+cG7#QI|PqEao1xkEW<6Tfg%e z50L~+=LQn_l)DWr*Lhr#5b+aLgNr9(lKXqQ3D;na&VugQm`p~*-aR&{@D|&4kg_bK zNUUZ(FGKR6t!hRZYkD#0MnYUDe9qOT1;6|%UDiuL8I)y|ihD0cdcsL>JU`kI2 z>4vTxc3?pZY@`Ag3CBh(l|nQcM}j@Sk_M(7B|Q3-@K*+d^DsefWw5FI6ZnUJ`Nx+A zz<80VA{|*?)9_tiif9ZbSs=BY6l^C6n+>ruwj>CatIL3hCv#dAetfD693L5v4dDV< z?0YhuhVD6VB#BCOvrNO5@~yW<$>zl6@-E9fC} zD9AuJTm-J%$x_Jj1 ztrk%xTuKq96lS^oc+tS;_Jz-~F9LuusG%~<6aXyE;)6%)AI0AE*#MJDTj|9(jliE4 zV1xh@t(<6~C|>l!-ZTXiQ$^5>fMB|z3CN=uJ!If3OWmICF6`d51Mj~34&M05Pms4_ z1#aHyL&{|OM0H$7fDE53AYrf4^IZi;3=~8aK&xI~vHDpcB#^{jS_~)%ERp$6P)QV5 zt^&+h{FDA71lD{O0qNyz!C_A>i;{WunS7=q%rZ3rMRM<>{UX1U#YE|Wko_(e9&_hc z^`Z%6?Q>lAS5Ou+Jm(5{bd?PuEkKyi3X{>5@nVAMvN(|@2DFf{gFp&|v=U-) z6;M6If}z1?tUMMf5YhsuvRINPTLZ_0;}P&w2{*@r8_&Dy+e6igy8n6IaBkrJPeAii zW9hN!y)XMkAWU7SJQmIiw)F5I0KjR;vZ=V^)${W4FE;`zm3eWAg@0p$`0V!l`=8&F z+~1#n{mcH&&-wC?+_x*e3e($X|6>m@WogKHNSAxchiB{Xj2K)!hMt=@aHs!1CZcgz zeg-DNB3|19w5vWroLl62CXs=J4>nBad`7!hM~CCa;aX!zMDC%t_Y(G3RHE?EF|=H| zfrq2xs(%cL8J;2cC9Ml(P79buW}?f6lpNH!}QpeHIOAt4HQK zdr(;diko^$=0?s*veu?Euzg<`q3mhK`9u*T2wZ7!0|Rb`IZOsg%Z2W^QrxwvCQCao z9ZmA2>A*qS<+{Rxo-g}p+AKnI|CGHS*A*(FZ``;p_ORSnHHT3Jp^k$^RIV$uf61v- zxz6!t&e61!b1V`!xP~aDE$1r!JFW#B7j8TcoF}=?a}Hr2E?L7wo$Cm2#%Aa|UIo5! zolk=aGL>@RTV-0VT`y}Qt8SLSHayGLw4KXnW87k*Ec zC7r7R{M!Be*M388M&Q0@V*~M*aigfel>H6YMLEwIb-fC4CF8;gbQtCY0&55(1DDX%brugMr!Z;zFlgN; znLPjhRHOEUWi3Eh?wbG9$@$kFk2JlaTF2uuxWmpzNZu>1&Oj*evD zOMfZGkrHdLI2|xnR~ASmXy^`_+mE8Ep$f;^n{l)M z9+D)2xwNt~5V%qJ)&!>0aTu;4Hi2a7yXk2p4NE{en*_Lw4a?WSnvb;7u-RYEhv{b! za~w<=DI^>nCi5AOR^zJo6A2P_c7EshvR=g)&1D>#31B*w{LESyuTRdg0i7uX{K@8Q z(;1A1Lb%>@6CD>X3DLr4@zZB~mj%G2(8ueO6IG59uf~XKN*B}6eNPl%rm4ZT67Z}L z0w;vPONcch3#z(D0D(0vjxpn1<)FlSkZZD~C1Gls5FtF~m3{!5`6Kfb0-v6;megg= za$)$6kTyt8^k~JOCUJzM5d{cwjgelBlIJi!okmKt1ps4gDz!T=g?oM1(b`;(`uYl- zXlX+K$ROgL4GW9~NFGSR3(Tx?^cet*>ys!E+4n{fDQRoVyn-=%;1hry#l!oZ=)8Fq zePg4DI35zrqqwG%U@B{x0>Ib@Olp14++DfZ?8)6PFDMX@xHqf74KIAV90Ba@Nb zmveL>Kt}aAx7=&ICKz)Q5GA<9jl?$g{8GfgI6|S2yvBdS{pExIF8A{@yZT%GqX-lT zqKkr&B%1qpIMj`^*RNtMr6I-K$)}QAx!ycE*k?~r_9T%$^-=-$WQ6_&e&E2e4j+Z7 zjbdQvE{;SGmE%hZ5PMnMhZ`%Hp1tR-^@vJclP;(e#8g5@G@cI(_&;8`Q z$QqfdDG}V}YZ4#$%&k=&fpr&x`Xn=Rjp4uH{p>j&oGfvQH4L%emAS>k7%x+~^d=T7@A1m~APS2FCcNL2|SsbwWBB zv5u2*e0Zkno348nY}Vblj$1C$Hful`sS_D4*D$W-w956eEuuKTvM;Bm>U$g~t}i4u z1O&m@L)ikT>b87%I=@ThO>|*mT)@xddYbesBs>Qx*O3@si1@aLK)2!RmJrye+RN1> z|25z$7ZoW|L(1k*y_iV=jtpTpWj{v+1)5 zn+vO>sfMhyDG6LjHYJ&oU?5urq{n68OR`9IHjA2EL|vXF7ACpi`VLGkezZSivL+sp zT$mRBU{)bOGd~Tw5MV*&~-$G#=;!I8MXguVaSjrBT6wcchbIqOa#;jHV`;r zQm8(gNhN^@wXsOZf15k+1S|?(N#I8*5k*btCE@xhIE*cP4=h5vWT>SfNjQ%~DIAntA(M0#c$lQ} z-eB>R7ByV=8Bg$fVerS8M$VJ#WWhgLc5uHGcuN4x_jP!#CZHM%C1h!_fK8=ZPElc+ zDj;<&L)j#x4fyPHKzn8Zvjdp6ixfdgv2f#cK-H%!wXaCL%Gq-*AyS~6*av$>L zo}bQH>MK-&@O1v<-}&0V&O;rGDw1c5tyC9CI>eNS_Xy`T&H>zbjq&>8>$&$myYKuw zmFTN`fPZ^_ygu(ppMP(*xc1~T)W3cHU7!9vyBdfxR3#$0Ce7-Za|!!4(CQ-%Bdb(q z!bu<`Hc37d_XeJNTJ{0h?S5yCj%hHtYtOT}&g+flu2SjeTqmH-$NF3WbrN{`7P zk6Y$bNjeFj8}Nh?slzmM0mpfd%fFq56xiar3By%@5XlAXTg4tNR3Ce3M{GuurVZV8 zVH0@geq~%3HZ2YlNV7QYvdHW~GhJvV^BV;M2oXUVK~vSGdVIK-gHKeC8e`( z57+vPd^XoSWIXuH%|uD!AZ4V)s@NiNfxLOc)b!#VGV%&*9^~AV}sxlIsR3AyDh$1P;HEC<>!}ili*fv6}5wX<<`x}cDI*Y5SD98RJjJFs+ zG9G1&#h8(6m__20#< z5;4-!PmN>5nA;^O!_#0oDG&g&d|T!%uF1LH(_Ax29APn*_crq#AxSX5ql!D2Mj~mz zFbJlpn14D$wQdwzDg?ubAr=oIZYH1w7VK#%wMa1I+M;q3hHrEw5aI%33&!45CvZ(= z?T&ron4|IE__QvYKxpb7#$w}$QmvLDSjZx+ig8sOt*${{hmzMkcZ=s{vroS~Ed_Jl z7u;A_&*kd;ooiuk4ORD!s)s(g53?Xv?svXl73Y~3^By80_33BiK8yRn@8M_uPCZ!T z;JiS~Q)dd6J&L3`fsybOQmzNx^I^~yPDu}*9(wNN*WBe*`#=J~BR4 zPzh*O6ay1u0wxQ2$??P?z$Otit&8ojD8RS|vj!l<;~Y?t1#l$a;oAD^9=Q|y;^*9b zp`O*8NQD%0a^?>TXj1|jm+`)k7nob|XXR2PWMuZ<j z|BN~Q+Pkxt8Dnzk>8Wxrj*Wo*0<^iX99=e58=>Qk51suLJp!U65tC@k z-i!e}(}QceYD^jL1Anlyb);rT(po@;u4xNE$Gn6980Whuce7jyDz;Q( zlZ(-wyyMqhRA1`vUmgJC1WnM0Nf-;AE*C?ptN4OySZN!y+KI#QRUl>y%F0D#TH#h= zpTR@jlgnw9JW{I9K#A81KZC_4HyubJ(=uH+x`%0xiaoBcN_|MR z7XusycTX5N*;B&r77Jk(^V3ve`_iah3RK{CsN$ErPe4SK?Bx=>r{lw7uPTIRShOUw zEJHBTl47U!dNRyL-5pX8AYvv}Nceel{~F;MmGP|fQJ`YPqTfDs;x z1xgXZ`-S@^1)6LE{^Yw~^h54u-$}+2 ziz2zUR7@*zt&EYnKSZ%0N!GJ-Xzn{d>-pLDvaG;;V4R$LJ^Sx+^WF=e)fylGxZI~I zQRFe@EKma46G4GhmdipFuXTdPY75c?c~vq+m7`0mKp~)!@oWKUG6`wH%7ltVFc!rE z0l(NUi(}}xRO6;FoiQZwC4=6g>Wb^H>pY&e)ihodEh)q1r?KK)8rh=^-=YHV!?*Q12zel9EiP;38wp;!#Eb~Rq4a^GYTvs znZ;v4nU;!4cyHP2^0a=*)5pC#Ai{*Aoh z1^>(4;<-QZ{keOJbA>2J?JTK*YO^2^Fq2lh1O%D;iESj4dak)yaKa=I%Az(m#xs)4 zlQhZRP&_}nFmy>C;cK~v0{SzeKBjWPHsVUzCw+tnc-peLX#!rf&s6KAfQE7nsp5#5 zKe<+C7uDwvH1~y{`J7$wKz4!c*>paeV|Ca0J59faHy60$F$+E2AKv}YmW!aJ}*&;=e z6q6`sfH?rn8Kg*pB1q&&vMuUeh=M0TT>`TVW{v{RQo+o?jKMbHO?vVD71DR)b?KB=CuNP8T8c_?6G)*Pn~ z_wj@dMMi6sWEL_Gd<>CgoVPlCtYiQu=w)PevKA$J7q$%Zm$spF2JJ@n8|!=$yuta| z0KlkAX!>(9p@Td{=L~X{&-%Ywgp+;6e=c*l7yMxKr>)}z8UVUi@(H+0KoyJ@u6Lpn zq3;vy$ARIcV}0SnR~6ED~vrYkpOEOMD3#e@P3 z{nmofx!1a}kDv<&JCr$(4hlUmez|-E6)?20k&1O3rCzhw^>)KZoPp5fA!{vQBS5Z? zJr6qo++xo6su&}4&nc?qMRlT>deC(_MScL18kB}1yY9-?gXWy_^^moY{u`)wavZje z1sEo4F2@CXhxh!J02=zJzs>0F7RCbS3S%UE_W9p4mIBA1Du0RaC7h6PGMdGYb`XDWg&q zx;$w3ykteNJ1u~1^}J{N#CyY3a&UkL4bxpDmaeSdWT7~`3SX3!X@ z?^IWC!Gk!~OE}Ybj{;IqsTM1)zE z?ZW5wa|WQv_r6$Ocx-Us^1VA}U6Ht$g3#P7HZ7uoFOwr*8QU2SKH}ou|LGv5?8 z)<<(nCsa^4-r?>p#a3%A7w0X*+Uuv)RVmd~&ev4T0w&-j_AEkzN{s%nUPje2=Kw>o zUS&KH`9)-Hq;uC>GF#ECa~EJI`)Mk+jtRR$*WRpg9+~hlXdZDO>VSX9R~(X6seo*y4T)|y z;QaD3j`7aeXI}8W_5K@uoUA|L?}7U;2Eyl@BN)@16Neug&(5$0*->fPu>=9CDtqQnbvGy2!Q# z7!R4ZN%pPj7mPojGhsb4i$6S^jfj4K3^GQpjgOl1p65wqe}jf9&E|CiHhb}1DGR- zIU^~pT0Lz59e`e*tTdB14yM*h(EmYe=rWS=Xq(Mj!1Jmd5BP;11t18;6HE#8JkjYy z&YO&~nllNwPEb?LH`_mZI#){lWQ`qCqZA2)R*bZ6Qq0O){l0Lkdd zjDOdc>3jF1A)kC4xC7Z7uC|`JeoNMN$%3YET0&EwR;iX#p_)@f_8?iCfL?%rv{~b3 ztyNqW6XZg$O8~*>b<3*{Ml>t<(4L#G&L_bXyHWM4H)qrHI z@y^o07^Ph-0|aM1!9?}63NIWOV;MYXNHl z%n4mq$z_T-t(PVr!Lx9{;8cm|jUSh{}eGTv=t+6Y-xhLy*H zmubhr?7yZThHNkkil}%Zk%3dzCiEkI1<$-Ec+JkA$Ud&qzi+&My#IX7@jkos`=l{H z)7{kpU`!RFoIy&>(Ma^UN7LBCKzcZloMR#Zi&We4oU;R5`_)UWvD+~0YSMUGSnjjt&RW&s0}7Morv|Ur+SufKA=FL zU^9V&!^|fWJ;E3boBe$q0Q*b_>h+6XZ-M{L7C;8EA;^&rt*@rM2y)}f_O0i*)O$C~ zT@eV2t1ot~pZPuUKSl}wK~T0acyK})l}D1PWWYh<{tM?ExHpiDj1qzu5=R_#hdBJ5 znhx4SvT}psak1y7&04qq?RVj`^ZkX&&?P^^&_{kJ)P<}+M)AkmVw}yMt_@{Iv;SJJ zjjgc`TQz;_Y1jZVUtTp>&e<5vXsV6$piLQNA7A!)bz(&g*z_B^!LAxnaSkAr|MJOg*p`q}S$SO2x&`7?!VKe9le>x8z)>sJtcPegml z9d@;}(fL6UjzQLNjuGUu4vG)}96(M^U0k+d}x$~8qLXspW0#yEex?<-_u)QT!{F6zx-z~YF-v6y5o zH+yODclKNj!`Cwam)#5M!mYetD0?UmK1p(r`_q=WNZi|gZvfL_<@xh1tU$<|;_Aw!Aw zHGs`!g9U_On6o8o2u3{D^@q8{bnznw{2%6!?@d-E>lbqq;E#w|?x$QOv#(d>a@sN* z4FDs!q{R4fyVSthmS|s#5>7~;2FmvVH*$^r8AeRdg^=Sdjuzf0ng2MT0g|b|K`Dcf z8A?5-B6Hj1ojbYeIH`j!k@TOf2MH@d0Klk4WcrX`%QNqE+4tP2L*PI!)BH~2alKww{I(c3IDImxhh&?K1~$y`V7 zm~%790CNzGAPp!_$wH#uAE0zeHEN-lUPnDus9qzR^9Fb)I-rBr0R#ik@E`*Gh}bNa zF=YL?UP8wpu*n0)$n+w>z-p=_nYfGx zb7Y$X6Cj#^3BpyVm4@ts?h$Y)t0FaOYmo}fO=|}nuK3fu{+>HD6PpVg0J(>b!+lsS zH^3mzaI%a}f+dW>iSMb|1rSO35^}X*s0dD0)@Ec$qUSaOy_oT2qeakd14PNGQZEAOnj6`OsLUSr%mmNKa{$qTj0R5eW~29e7y6BTm|wxZ<}+TQU)i_% z3;3ROES!Vy!#VgYY@CD7`JUsAMdC`B8T#Gnwf+b4oh)(2YF6cHN~LPb<}tPp%QG4D z7Et&n_w3ht--P=^E+f+@A3;qhbWjf#BZCLMJ_aPOW;_GTGG58_VZ8u2OE#O+%d~7#Ye?1N!mEQ_hW*gZ_c9 zj6rDjI&wdmk6v@zYkv`_V^rz=WJk~sSwq9dXRJS5m-?jVEnAs@4RjFm2UzJS)*qJ{ z=uS=BjNfx-O&iSX-EmHTe)@^$be}_$^#qxM402i1dT*`g5AXf^I=X3z^-7kl51s