# Intro to DBMS 2019 HW2 > :::danger Please don't ask something TA can find on the first page of Google Search results. If you really have no idea about what the keywords should be typed in search bar, please list the keywords you have tried 請不要在討論區詢問可以在Google Search結果第一頁找到答案的問題,如果你真的不知道要下什麼關鍵字,請列出你嘗試過的關鍵字 ::: :::info Template: Q: `What kind of problem you met?` * `What you have tried` A: `Solution` > `who anser the question (student id)` ::: ### We will use your participation here as a reference of bonus ### 我們將會參考在討論區的活動(回答)來當作加分參考 > (Except for LMGTFY related topics) > (但是 LMGTFY 的不會納入參考) Q0: How to search `something` using Google Search A0: http://bfy.tw/1yH > TA (0756000) Q1: 助教我想請問一下,在simpleDBMS installation那份ppt當中,第3頁的第2點,Google test超連結點進去被要求存取權是正常的嗎?還有在test資料夾裡面,好像沒看到gtest資料夾,因為test資料夾裡面的.c檔都有include gtest/gtest.h,那請問要怎麼辦呢?謝謝助教~ ![](https://i.imgur.com/SA6BN3K.png) A1: Google test權限好像只開給@nctu.edu.tw的帳號 >0510008 A1: 抱歉助教忘記開好權限了>< 現在已經可以了 > TA A1: 不好意思漏掉了你的問題,它是include你安裝在/usr/local/include/gtest裡的library,所以不需要在test裡存在 > TA --- Q2:請問googletest ppt p.6中的sample_test.c是在哪裡呢?是要另外下載嗎?謝謝! A2: 呃…是自己寫的。 > TA --- Q3:請問如果insert一筆資料他的primary key已經存在在table裡的話我們需要把那筆資料存進table嗎?因為在unit check裡的Table_test.c重複insert (1,user1,user1@example.com,20)他的要求是table->len會持續增加並且table->cache_map[]會設成1 A3:是unit test沒設計好,晚點我會發patch 或者你直接insert進去沒差 > TA A3:助教已經新增了一個patch-0.0.001的branch 更新的方式為`git pull --rebase origin patch-0.0.001` > TA --- Q4:按照googletest的那份PTT做,到第六頁的時候我還是出現Q1的error耶QQ想問如何解決~ ![](https://i.imgur.com/rzXUYgu.png) A4:你用`ls /usr/local/include/gtest/`先看看有沒有安裝成功,正常應該是這樣的 ![](https://i.imgur.com/NyWZA0f.png) > TA --- Q5:請問 {field} from table 是optional的嗎?spec上面寫說 ``` support the below query format select { field } from table [ offset <offset_num> ] [ limit <limit_num> ] [ ] means optional argument ``` 但是offset和limit的範例都沒有這一段直接`select offset 2`? A5: 因為那個是分別的測試,隱藏測資就會有綜合的 > TA --- Q6:請問Requirements裡面寫的意思是至少要push 5次不同的修改檔到gitlab上的意思嗎?還是至少要上傳到gitlab? 謝謝! ![](https://i.imgur.com/vJbHFv1.png) A6:不太懂你的意思 簡單的說就是commit總共要新增至少5個 然後push到Gitlab上 > TA --- Q7: 1. 延續Q5,TA的意思是from table有或沒有都可以嗎? 2. 大小寫有沒有差,例如:SELECT, FROM, TABLE, ID, NAME, EMAIL, AGE, LIMIT, OFFSET, SeLeCt, FrOm, TaBlE, Id, NaMe, EmAiL, AgE, LiMiT等等... 3. 順序有沒有差,例如:先offset再limit,或先limit再offset。或是select在limit或offset後面 4. 如果關鍵字打錯的處理辦法為何,例如:select linit 1,直接return嗎,還是要提示錯誤訊息 5. 如果關鍵字後的參數打錯的處理辦法為何,例如:select limit 1a1 6. 如果關鍵字打對,但是重複打可以嗎,例如:select limit 1 limit 1,如果不行,處理辦法為何? 7. table 的欄位名稱可以重複打嗎,例如 select id, id,如果可以,欄位要重複出現嗎,如果不行處理辦法為何 8. table 的欄位名稱有可能和逗號連載一起嗎,例如 select id,id 9. 欄位順序會影響結果的出現嗎,例如: select id, email 和 select email, id,結果完全相同嗎 * 辛苦了,謝謝 A7: 1. 在隱藏測資會有from table,我的意思是你看到的測資沒有是因為那是測試不同小功能的 2. 請用跟測試spec上一樣的 不會刻意刁難要處理大小寫 3. 先用offset再limit (i.e. offset 3 limit 2這樣) 4. 不須處理錯誤狀況(除非助教測試寫錯,那也是助教的問題XD),但以一個好的應用程式的話是顯示錯誤訊息會比較好,但是不會當作評分依據 5. 同上 6. 同上 7. 不會特別測試重複出現的 8. 不會 (測資不會有這種狀況) 但有處理更好 9. 對 結果要相同 續Q7: 9. 如果有做順序的話,會影響嗎?還是一定要照著id name email age 的順序印出? 不好意思打擾了。 A: 不太懂你指的順序?如果是select age, email, id from table就依照age, email, id三個順序 因為在Q7-9 的問題是說先select id, email 和 select email, id 回答是說結果要相同,這邊說 select age, email, id from table要依照 age, email, id 的順序,這樣好像牴觸了。 不好意思打擾了 A: 我懂你的意思了XD select id, email的結果要長這樣 | id | email | | -- | --| | 1 | aa@example.com| | 2 | bb@example.com | select email, id結果要長這樣 | email | id | | -- | --| | aa@example.com| 1 | | bb@example.com | 2 | 我的相同是指row的順序要相同,column順序還是要按照select的順序來看 > TA --- Q8: Mac OS 沒有 <stdio_ext.h> 所以無法使用 __fpurge,如果用 fpurge 可以嗎?(目前自己在Mac測試是沒有什麼差別,不知道助教當初用 __fpurge 是有考慮到什麼因素嗎?) A8: 因為做了file descriptor redirection,所以需要清空stdou的buffer,但是助教測試環境會是linux,請在自己開發時註解掉那行,但是繳交檔案時要還原,不然可能測試會全部沒過(更簡單的方法是直接用VM開發) > TA --- Q9: Q5補充提問,我的意思是spec上寫說要支援`select { field } from table [ offset <offset_num> ] [ limit <limit_num> ]`,但是測資卻出現`select offset 2`,明顯不符合spec上說的語法,因為spec上只說`offset`和`limit`是optional,`from table`並不是optinal。是要將spec的語法更正成`select [ { field } from table ] [ offset <offset_num> ] [ limit <limit_num> ]` 嗎? A9:最後的隱藏測資可能會長成這樣`select * from table offset 2`,所以from table不是optional的,只是助教當時在設計測資的時候沒有加上`from table`,抱歉造成誤會,如果同學有需求的話助教可以加上patch > TA --- Q10:關於上面Q9的問題,那這樣我們在實作時是要做成一定有`from table`的寫法嗎? 但目前我們可看到的個別test.txt都是沒有`from table`的,這樣我們是否要手動補上from table?否則就等於要寫成`from table`是optional的? A10:助教補上patch好了 想要的人就加上patch吧 之所以不補patch是怕有些人沒有先寫projection,補上patch之後得先寫好projection才能夠測試limit offset的正確性了 請用`git pull --rebase origin patch-0.0.002`來補上patch > TA reA10:不好意思助教我用`git pull --rebase origin patch-0.0.002`之後,他一直顯示 fatal:Couldn't find remote ref patch-0.0.002 大概是你的origin已經不是助教的repo,如果你是照助教的簡報操作的話,要把origin改成old-origin > 0410740 Re:雖然不是問問題的人,但我這邊嘗試換成old-origin之後依然顯示同樣問題,patch-0.0.001也一樣無法補上去 後來自己手動改了XD --- Q11: 請問id一定是從1開始的連續數字嗎? A11: 整數 不用連續(1 3 5 8都可以) 因為沒有auto increase的功能 > TA --- Q12: 所以field順序會影響輸出順序嗎?這個討論版的第108行說不會,可是第113行又說會@@ 第108行: >Q7.9. 欄位順序會影響結果的出現嗎,例如: select id, email 和 select email, id,結果完全相同嗎 >A:結果完全相同 > 第113行: >A: 如果是select age, email, id from table就依照age, email, id三個順序(續Q7.9) > A12: (自己補充) 助教在上面的問題解答了 >0516206 A12: 我發個公告好了XD > TA --- Q13: unit test裡面測select有個arg只有select,假如說我直接讀args[1]導致test fail會有影響嗎,因為結果裡面的args理論上應該最少會有2個以上 A13: 你的args裡面長怎樣為什麼會有2個以上?XD > TA reQ13: select * from table就有4個了不是嗎? 照spec來看的話最後指令應該沒有單一個select吧? 如果不行的話我就做判斷就好 A13: 如果你不改動unit test應該是不會有問題,還是你寫完之後unit test會過不了呢? > TA reQ13: 寫完之後才過不了的,因為我直接在select那裡直接讀args[1],所以就爆炸了 我看我還是乖乖寫特判好了 --- Q14:想請問commit次數有沒有五次很重要嗎QQ 我因為gitlab的專案有重開過(initial commit已經是快完成的版本),導致我現在commit次數只有2...如果要符合"commit次數至少要5"的要求,我是不是應該開一個新的專案從頭開始做呢@@,或是可不可以加幾行註解就commit一次XDDD A14:就算gitlab重開過本地的git commit應該還是會在,可以詳細描述你怎麼把commit弄消失的嗎?還是只是不想做5次commits?XD 會要求5次commit是因為好的版本控制每次的commit都只會專注於一個目標,所以才會要求同學這樣練習 請參考 [How to write a git commit message](https://chris.beams.io/posts/git-commit/) ([中文版](https://blog.louie.lu/2017/03/21/%E5%A6%82%E4%BD%95%E5%AF%AB%E4%B8%80%E5%80%8B-git-commit-message/)) > TA Re A14:不想做5次commit的成分應該居多XD因為一開始沒有注意到有這個規定,所以一口氣把primary、limit、offset做完了 然後commit消失的原因可能是我重開專案後有git init把repository初始化?雖然有沒有消失的commit次數都不夠 這樣如果要滿足要求應該只能砍掉重練了QQ A14: 給你幾個關鍵字可以不用完全砍掉XD git rebase , git stash, git commit --amend, git reset HEAD^ 也可以參考 [把一個 Commit 拆解成多個 Commit](https://gitbook.tw/chapters/rewrite-history/split-one-commit-to-many-commits.html) 更簡單的方法是複製一個資料夾XDDD然後剪下貼上做commit (下下策才這樣做) Re: 好的我試試看XD感謝 --- Q15:請問offset & limit會給超過table的長度嗎?如果會是要print error message嗎? A15:如果table size 15, limit 20顯示15筆 不需要錯誤訊息 > TA --- Q16:請問e3繳交作業的部分是交所有.c, .h檔還有makefile嗎?謝謝 A16:交原本git clone下來的 跟你加上的程式碼 >TA --- Q17:請問在make check時出現在ignore的錯誤是可以的嗎? ![](https://i.imgur.com/WufVuZQ.png) A17:代表有程式碼寫壞了XD 不可以忽略阿 > TA --- Q18:請問make check時出現的這個Error是指有誤刪到東西嗎?但我記得沒有動到test裡的檔案? ![](https://imgur.com/SA3W6uK.png) > A18:它要跑testUtil.testHandleSelectCmd時出錯(有RUN但沒有OK),所以是你的那個function有問題 > TA --- 續Q16: 想確認一下自己的理解有沒有錯誤(不好意思打擾了QQ):也就是把最終版本的整個專案資料夾壓縮起來上傳對嗎? (也就是把最後push過的gitlab專案整個下載成zip檔) A: 對 > TA --- Q19:請問gitlab專案如果在線上build的時候失敗,是否會影響繳交? 剛剛收到這封email![](https://i.imgur.com/BsYqDy7.png) 然後到gitlab裡面再跑一次build,failed在這個訊息之下: Step 4/10 : RUN /bin/herokuish buildpack build ---> Running in 80c841703428 -----> Unable to select a buildpack The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1 The push refers to repository [registry.gitlab.com/dbms_2019/(我的專案)/master] An image does not exist locally with the tag: registry.gitlab.com/dbms_2019/(我的專案) 然而我在VM裡面make、make check都過的了,也確認了git status。google搜尋只有找到一年前的解法(官方給的連結已失效),所以想問這樣會不會影響繳交,不會的話我應該就放置了XDD A18:這是你專案的Auto DevOps被開啟了,不想再看到可以到Settings->CI/CD->Auto DevOps取消勾選,這不影響繳交 > TA --- Q20:(跟Q3相關) 因為沒有更動到Table.c,所以Unit tests都有過,並且由於一些原因所以後來是git clone自己的gitlab,所以想請問助教如果沒有改到Table.c的話還需要更改Table_test.c嗎?或是接受直接複製貼上嗎XD (另外,如果加不加from table不影響結果可以不pull patch2嗎?)謝謝助教 A20: 如果沒改到table.c就可以 第二個問題答案也是可以 > TA --- Q21:想請問一下這個作業只能在VM裡做嗎?因為如果沒開VM 我直接執行`sudo apt install make cmake git gcc g++ python3.6`會跑出下面的錯誤QQ 可是不知道要怎麼辦 ![](https://i.imgur.com/WWMSxDE.png) A21:你可能要跟助教描述一下你的系統跟環境喔...不然助教得通靈跟觀落陰才能知道問題在哪(汗) > TA A21:看來你的系統是MacOS,裡面沒有apt這個管理工具的喔,在MacOS要裝套件可以用Homebrew,要怎麼裝怎麼用請自己google,我們是推薦在vm裡做,至少出現甚麼問題我們可以協助你,如果只是單純不喜歡VirtualBox,可以試試App Store裡的Parallel Desktop Lite,個人蠻推薦的 > TA --- Q22:助教您好!請問在system tests裏面出現failed的情況,然後對比answer和output兩個文件夾裏的文件,發現是多出了一些空行(可是要求輸出的部分是相同的),請問這個問題要怎麽解決?還是要重寫程式QQ 謝謝啦~ ![](https://i.imgur.com/nG3tbiD.png) A22:作業的最低要求是通過兩項test,你這個情況我猜是insert時多輸出了東西,可能你要回去看看你insert的部分有沒有多寫了沒用的newline > TA --- Q23:請問助教`select`沒加`from table`應該要判斷為錯誤還是正確執行,因為根據以上的討論`from table`並不是optional,但是在Unit test中`testHandleSelectCmd`有出現沒加`from table`的測資,而且要求這個測資的return value需等於table len > 0410766 A23:你想怎麼寫?助教其實蠻好奇為什麼大家會堅持在這個地方XD unit test我們不會用新的測試,如果要符合spec的話 請加上patch 002 > TA 續Q23:目前我的寫法是如果`select`的command沒有出現`from table`就當作command error,回傳值為零 A23: 那你就加上patch 002吧,我晚點再上一個unit test的patch,原本寫得鬆是因為讓大家慢慢feature增加上去,我等等加patch 已上patch: patch-0.0.004 --- Q24: 助教請問一下,你們把test/system/output寫在.gitignore,這樣的話大家從github clone下來之後,如果再push到自己的gitlab repo時,這個資料夾因為被版控忽略了而不會被上傳上去。這樣你們之後改作業的時候如果再把我們的gitlab repo clone下來,不就少了這個資料夾了嗎? 缺少這個資料夾的話,跑system test的時候會報錯,所以是不是把他從.gitignore裡移除比較好? >0511080 A24: 我剛剛測試clone下來push到gitlab上也是有這個資料夾的(因為我事先已經加了.keep檔) --- Q25: 請問Table_test.c或其他test的code可以修改嗎? 因為我遇到的問題是: clone下來都沒改過code就跑不過table相關的unit test (testCacheMapWithArchiveFile(含)以後的test都無法remove test.db) ![](https://i.imgur.com/zLAX5Cd.png) error是顯示有其他程序在使用檔案所以無法移除,所以推測是testCacheMap佔用了test.db,若在testCacheMap的section最後加上 ``` c if (table->fp) fclose(table->fp); ``` 就可通過unit test了>< A25: 感謝你幫忙找到bug 等等會上patch 已上patch: patch-0.0.003 --- Q26: 算是和Q14的問題有關 請問: 1. commit次數沒有到達五次,會影響作業分數嗎? 2. 會依照每次commit的內容來評分嗎? 個人認為,用commit次數來當作標準,非常的奇怪。我能夠理解「好的版本控制要一次專注於一個目標」。但這也不代表,如果沒有「嚴格遵守」這樣的規定,就是一個壞的project開發過程。也不代表,沒有超過某個commit數量的project,就是壞的project。 所以我才會問這兩個問題。如果只以commit次數來評分,不以commit的內容來評分,那每次commit都只加幾行註解,就不應該因此而被扣分。 但如果助教會依照commit的內容來評分,那應該要寫在Requirements裡面,因為如果純粹照著規定走,Requirements裡面沒有提到的,照理來說不會因此被扣分。 另外,我認為這堂課的學習主軸應該是Database相關的知識,而不是考驗學生對於版本控制工具的熟練度,甚至以對工具的掌握度拿來當作作業的評分標準。 可能助教是想讓同學們學多一點東西,這樣的想法我能理解。但我覺得用commit次數來當作規定,並不會讓同學開發project的品質上升,只會為了達到「五次」這個數字,多幾次無意義的commit。 A26: 可以 我會發公告不會根據commit次數扣分 以後助教會明確在spec的requirement寫清楚的 > TA RE A26: 感謝,辛苦了 --- Q27: 為什麼一定要5次commit? A27: 此次作業不會根據commit次數扣分 > TA --- Q28: 在`make`的時候,有時候會跑出類似這樣的error ``` src/Util.o: file not recognized: File truncated collect2: error: ld returned 1 exit status Makefile:26: recipe for target 'shell' failed make: *** [shell] Error 1 ``` 因為這個error,`shell`這個檔案不會被產生 但我只要再執行一次`make`,就可以順利產生`shell`了 奇怪的是,重複`make clean`和`make` 有時候會error,有時候不會 而且每一次找不到的檔案可能不一樣(不一定是`src/Util.o`),但都是`src/`裡面的某一個.o檔 google後看到[這個](https://stackoverflow.com/questions/5713894/file-not-recognized-file-truncated-gcc-error) 但我每次`make clean`都有確定.o檔都被刪除了 猜測是Makefile哪裡寫壞了嗎? 雖然是小事但有點煩躁 不知道有沒有其他人遇到相同的問題? A28:可以提供你的系統 gcc make版本嗎?因為助教這裡沒遇到這個問題 > TA RE A28: 我發現似乎是vscode的問題,把他關掉就沒這個問題了 感謝 --- Q29: 想請問 先insert 2 XX XX XX 再insert 1 XX XX XX 然後select 出來的時候應該是照著primary key排序好的嗎? 例如: 1 XX XX XX 2 XX XX XX 還是 2 XX XX XX 1 XX XX XX A29:後者 > TA --- Q30: 想請問 projection的select from table,這個table代表什麼意思? 我目前的做法是: from 後面接"table"代表當前在使用的table,會顯示當前使用的table的資料 若填入已存在的file_name,ex: select from test.txt 則會顯示test.txt中的資料 我的理解正確嗎? 然後想順便問說隱藏測資是單純的limit offset projection排列組合嗎? 還是會有奇奇怪怪的輸入? 像是:select id,email ,name age, from test.txt limit abc offset limit limit A30:問題一不需要處理filename的狀況 table只是寫死的字串 問題二不會有其怪的輸入 Q30(cont.) 所以~總而言之 不管有沒有 from table 都沒有差囉? 那我想問說測資放上from table的用意是什麼? 是不是要留給下次作業用的? 可能下次作業會處理到file_name? A30:因為這樣語意上比較正確,而後面的patch是為了符合spec上的規定 --- Q31: ![](https://i.imgur.com/e6N82j3.png) 想請問這個TODO(in InputBuffer.c)是學生要改的部分嗎?因為我功能做完惹但是沒動到這裡,有點驚慌~ A31: 不用慌,4個功能都有做就沒問題了,不過記得測試各功能的組合使用喔 > TA --- Q32:抱歉助教,patch-0.0.004中Command_t->args_len是否應該為4? > 0410766 A32:對 已經更新patch-0.0.004了 > TA --- Q33:助教您好,我想要請問offset以及limit兩個option的指令同時出現時,出現的順序是否和spec上一樣一定是offset在前,limit在後,或是無論順序皆為有效指令? A33:請看Q7-3 > TA --- Q34:請問select是否需要field呢?/test/system/testcases裡面除了projection之外測資的select都沒有寫field,但spec裡面卻是要求一定要寫field,所以沒寫field也要像*輸出全部嗎? A34:請加上patch 002 & 004 > TA ___ Q35:助教好,我有另外做判斷offset 跟 limit 順序的function,想問如果發現他們順序不對只需要print出error message就好了嗎? A35: 對 因為我們不會特別測試這個 > TA RE35:助教好,我想另外問個問題,按照Q16的回答,應該是直接把simpleDBMS那份資料夾直接壓縮成zip繳交就行了吧 A35: 對 > TA ___ Q36:我自己跑的時候output是對的,可是用python test/system/system_test.py ./shell測不所有的output的最前面(第一行)都會多db >,我有把#include<stdio_ext.h>駐解掉,不知道有沒有關係?然後想問可以更改或增加函式的參數嗎?![](https://i.imgur.com/YSDYm2Q.png) A36: 應該是Mac的關係,註解的東西請在繳交時取消,不然我們評分時你的會fail掉,如果不放心可以用虛擬機或其它方式開linux測,我們的測試環境都是linux。更改function是沒問題,只要不是改unit test跟system test就好,但要注意你改的function有沒有跟unit test裡的有衝突。 > TA --- Q37:想請問一下助教,我們是不是也要修改Table_test.c? A37:你想要修改什麼?或為什麼需要修改?請描述的清楚一點 助教不是很理解你的問題 > TA Re37: 抱歉,沒有把問題說清楚。 ![](https://i.imgur.com/KUyoooR.png) 因為我的理解是這個 test 是要重複 add { 1, "user", "user@example.com", 20 } 這個 user 50次,可是因為我們要 implement primary key,所以就算經過 50 次的 add_user,因為都是 add 同一個 user ,所以我們的 table 裡還是只會有一個 user,也就是說 table->len 應該會保持是 1 。 所以 for 迴圈裡的第三行 “ ASSERT_EQ(table->len, idx+1); ” 應該是不會成立的。 因為在這個 test 裡 table->len 一直都是 1,但是 idx+1 卻會一直變。 所以想問助教我們是不是要自己把那一行改成 “ ASSERT_EQ(table->len, 1); “ 呢? 謝謝助教! A:因為你有動add_user這個函式吧,可考慮改Util.c底下的handle_insert_cmd,我覺得比較合理,這樣test也可過,助教這個應該是要測試table的運作正常,所以基礎的函式功能應該不能變? >0410779 A:補上`patch-0.0.002`試看看,有多一行`setup_sample_user`,這樣add_user就不會是同一個user了 >0410766 --- Q38:不好意思想請問,想push上去的時候出現了"Updates were rejected because the tip of your current branch is behind its remote counterpart. Integrate the remote changes (e.g. 'git pull ...') before pushing again.",導致push不上去。有試過用網路上說的先pull再push,但它把我打好的code覆蓋掉了QQ,使用git push -f也不行 reQ38:自己回答,後來修好了XD ___ Q39:I want to ask that why I get this error message: https://imgur.com/a/BdibFFo my operating system is Ubuntu please answer me in Chinese because of my poor English. The reason why I ask in English is that I can't find Chinese input method on Ubuntu QAQ A39: 要這樣使用`python test/system/system_test.py -h`,那個中括號是指可以用的選項 > TA > --- Q40:我想請問一下我才剛開始做,我照著PPT上面打,從GIT上下載SIMPLE_DBMS,但是打MAKE的時候他沒有反應,也沒有一個叫SHELL的檔案,請問這該怎麼辦? A:試看看 `cd simple_DBMS`之後再`make` >0410766 reQ40:喔喔有了!感謝感謝~ --- Q41:想在請問一下,用make check失敗怎麼辦?出現以下的錯誤 ![](https://i.imgur.com/0g05FSJ.png) A:應該是google test的部分沒裝好,可以參考助教給的[tutorial](https://docs.google.com/presentation/d/1bRyt1JYZEJ1KFzn0mLbDDDYpRnjyasABDJU6sMfT7AE/edit#slide=id.p)第四頁 >0410766 --- Q42:抱歉問個蠢問題,我看了很久還是不太清楚這次作業要從哪裡下手,只知道要做出SELECT的部分,可以問是要從那些檔案還是設定入手嗎?還是要自己添加檔案?我在既有的檔案找不到跟SELECT有關的部分 A:先把每個檔案看懂在幹嘛吧,有select的部分,可以先從shell開始看,然後去找他呼叫的函式在幹嘛 >0410779 > A42:同上面同學所說,請先看一下程式碼的內容,如果有問題再提出討論。 > TA A:我個人是先從makefile的架構開始看起,給你做個參考。 >0516321 --- Q43:助教您好,想請問gitLab上面有要求要是哪一個branch是最終版本嗎?因為我是clone下來後直接checkout patch-0.0.004,所以後來都是push在004的branch。 A43:請push到master > TA --- Q44:因為我改了很多次結果都沒變,想問一些問題 1.請問檔案修改後只要直接進行test就可以了嗎?如果make check沒過那修改的東西是不是就不會顯示出來? > 修改玩請用make重新編譯shell 2.請問那些如all_test.c檔案的用途是甚麼? > all_test是unit test的執行檔 3.請問./shell是必須的動作嗎?也就是進入到db>的畫面 > 最好是測試一下 正常是要先過unit test跟system test A44:沒有很理解你的問題...斷句一下 > TA --- Q45:請問是用python還是python3來做test/system/system_test.py ./shell?我看HW2和SIMPLE_DBMS的PDF說的不同? 都可以嗎?我用python不能跑只能用python3啊? > 先確認你的python版本是多少 `python -V` 如果顯示是2.7.x就不行 A45: python3 (可以用python -V確認你目前的python版本) 因為system test是用python3開發的 我不保證python 2可以正確執行 Q45:不好意思可以再問在終端機上是只能輸入python3 ...來做吧?我看上面和pdf在打指令怎麼打python? A45: 因為助教當時的環境裝的python 是python3 --- Q46:請問為什麼我跑不到mkdir mybuild這行code?他會顯示Permission denied。求解。 A46:請給我`ls -al`的結果 不然我可能要請媽祖託夢了 ReQ46:![](https://i.imgur.com/Myk55k4.jpg) A46:你是不是在docker裡面git clone google test的?如果是請用下面指令刪掉google test資料夾 ``` cd .. sudo rm -rf googltest ``` 之後再vm裡面重新操作一次 如果還是不行 請給錯誤訊息 REQ46:還是不行。 ![](https://i.imgur.com/oNdAQlo.jpg) A46:一樣給我`ls -al`的結果(在googletest資料夾裡面下指令) ![](https://i.imgur.com/2M7tYoy.jpg) A46:那你用`chown zhenwei42:zhenwei428 -R .`之後再試看看 如果不行一樣給我`ls -al`的結果 REQ46:還是不行。 ![](https://i.imgur.com/gOReKR6.jpg) A46:剛剛的指令前面加上sudo 我忘記了`sudo chown zhenwei42:zhenwei428 -R .`這樣 REQ46: 沒事發生 A46:明天考完試來找助教吧...現在這樣很難教你怎麼操作 ReQ46:那請問助教,這步完了之後還有很多步驟嗎?還是可以接下去做了 A46:你可以先讀程式碼的架構跟內容,如同上面Q42的內容,googletest主要是unit test的部分,你還是可以先寫作業弄好system test --- Q47:請問助教 我用手動(複製貼上)的方式更新patch4的Table_test.c 發現patch1加上的setup_sample_user不見了 這是因為我手動更新的關係嗎?應該是要有的吧..? A47:手動複製的會沒有喔 因為git的commit只會記住有修改的部分 --- Q48:請問我加上SELECT部分的PATCH後,原本在還未加PATCH的時候OFFSET和LIMITD可以全對,但加上PATCH後就全錯了,想請問依定要用PATCH嗎?如果一定要用,LIMIT和OFFSET指令的LEN是6嗎? SYSTEM錯了 cmd->args_len ![](https://i.imgur.com/bmzlCz5.png) 可以先問一定要用補釘嗎?可是我看上面怎麼說隱藏測資有table?可是我看原來的testcase 沒有 from table?是要自己去加上嗎? > 其中有一個patch就是加上from table的內容 A48:哪一個測試錯了 unit ? system ? 哪裡的len?附上個截圖吧 如果你不加上patch測試可以全過那就可以不用加patch,本來就會有阿...所以如果你不加上patch就是自己要特別判斷,但是根據spec最後的規定要有from table --- Q49:請問一下git pull --rebase 這個功能是要怎樣用?我嘗試了 git pull --rebase origin patch-0.0.002 ,可是跑出了error: cannot pull with rebase: You have unstaged changes. error: please commit or stash them. A49: 先`git stash` 做完`git pull --rebase`再輸入 `git stash pop` --- Q50:請問我unit test跑成這樣,是出現了什麼問題QQQ![](https://i.imgur.com/7cGsrpy.png) A50:可以在test/Util_test.c裡面看到`testHandleQueryCmdInsert`對應到的測資Command是`insert`(args_len=1),可以測看看直接執行`insert`會不會Segmentation fault >0410766 --- Q52: 請問有人發生這個問題 我在執行了 git remote rename origin old-origin git remote add origin https://gitlab.com/dbms_2019/0411306/0411306_hw2.git git push -u origin --all 之後出現: remote :HTTP Basic:Acess denied > (0411306) A52: 試試看git config --system --unset credential.helper > (0612241) Re A52: 還是一樣QQ 解決了 感謝回答 --- Q53:請問在PROJECTION的部分,有逗號的arg(如id,)在cmd中是一個arg包含id和,嗎? A:53 你可以去看看讀取指令的檔案的寫法 Q54: 請問一下我沒有動到這個檔案 怎麼會出現這個呢 ![](https://i.imgur.com/gXKHpXG.png) A54: 這是新給的patch變動的檔案 Re A54: 但是我沒有去下載新patch的檔案 Q55: 為何在util.c裡使用args[1]無法使用? ` if(!strncmp(cmd->args[1], "limit", 5)) ` 會產生"程式記憶體區段錯誤 (核心已傾印)" 這樣判斷有沒有limit該怎麼判斷呢? A55:用遞迴for(size_t i;i<cmd->len;i++) 檢查cmd->args[i] 是不是 'limit',避免存取超出邊界的區塊 > (0616316) A55:同上面同學所述 > TA --- Q56:請問繳交的壓縮檔和GITLAB是要自己把多的檔案刪除只剩下LAYOUT上的檔案嗎?還是直接把整個資料夾裡的檔案上傳就好?因為裡面還有SHELL等之類的檔案好像是不可少的? Project Layout ├─ include/ Header files ├─ src/ Source files │ ├─ shell.c Entry point, which contains main() │ └─ Util.c Some utility functions ├─ test/ Unit tests & system tests │ ├─ include/ Test header files │ ├─ system/ System tests │ └─ *.c Unit tests source file └─ Makefile Makefile for make A56: 多的檔案指哪些?主要就是程式碼阿 *.c, *.h --- Q57:我想請問一個蠢問題,請問我們這次的作業是要把那些功能寫在甚麼檔案裏面?是要改哪些從git上下載下來的檔案嗎? A57:沒有蠢問題只有你有沒有先做事前準備,沒錯要修改的是git clone下來的檔案 --- Q58:在unit test中有一個測試比對的數值,是沒有被動過也不需要修改的部分,可是一直過不了測試,請問這會不會和編譯平台有關係呢?以下是測試訊息 ``` test/Table_test.c:260: Failure Expected equality of these values: st.st_size Which is: 4680 sizeof(User_t)*(insert_count+2) Which is: 3640 [ FAILED ] testTable.testArchiveOldTable (273 ms) ``` A58:看起來不是編譯平台的問題 你可能要加上patch 003試看看 > TA Q58RE:已經裝過001到005的patch了,可是還是會這樣 A: 你要現在來工三446a嗎? 不然我也沒辦法遠端幫你處理 助教會待到6點左右 如果要來請先跟我說一下 好的,那現在過去可以 A: OK --- Q59:我想問一下關於作業的第5個條件Makefile, 是什麽意思? 是只要我原本的檔案裏能夠執行make 這個指令就行了嗎? 然後我把檔案push 上去gitlab 的時候 shell 這個檔案不見了是正常的嗎? A59:`shell還是`shell.c`?`shell`的檔案是make指令產生的執行檔,你要確保的是助教輸入make之後會確實生成shell這個檔案 但是push上去的時候不需要有shell這個檔案 > TA --- Q60:請問我可以直接把整個資料夾壓縮成ZIP檔嗎?還是要像Project Layout挑檔案出來在裝成ZIP檔? 外面要不要像作業1包個學號的資料夾? A60:可以直接壓縮 不需要多學號的資料夾 檔名正確就好 > TA RE:抱歉可以確認一下所以是解壓縮ZIP檔後時就直接是程式檔案了嗎?還是有1個資料夾? A:不用那麼常抱歉XD --- Q61:請問git commit時 message時要輸入甚麼? A61:輸入有意義的描述XD 描述這一次修改你做了哪些事情 --- Q62:請問select指令應該是全部都是小寫,不會出現大寫吧? A62:不會 ___ Q63:請問我們加上limit和offset之類的是要在cmd_list加上新的command還是在handle_select_cmd的後面加上一些判斷?我目前是用後者,但是在跑make check的時候到testUtil.testHandleQueryCmdSelect的時候就會有segmentation fault,這是跟原本那些test的格式有關嗎?應該不能改test的檔案吧? 還有,有一定要裝新的patch嗎?因為我覺得我應該寫不完了,所以希望先搞定primary key和limit和offset就好,所以可能就是像原本那些testcase一樣select沒有from table。 --- Q64:請問push到gitlab時,如果出現的都是未修改的原檔以及助教的readme之類的,該如何修改才能把自己的code push上去呢? (如下圖所示 ![](https://i.imgur.com/6Ilr6PC.jpg) A64: 請用git commit 詳情翻閱我們給的講義們 --- Q65:請問這個是什麼問題? ![](https://i.imgur.com/8BAl4Yc.jpg) A65:因為有conflict 如果你確定你電腦的東西是最新的 那就git push -u origin -f --- Q66:如果push到gitlab的檔案只有.c檔(在/src裡)是可以的嗎? ![](https://i.imgur.com/k8yoQda.jpg) A66:請push整個專案 補充問題一下,因為我遇到everthnig to update的情況,查詢網路後用merge做,是push整個專案上去,但是發現只缺少了/src/*.o檔, A:.o檔不需要傳 因為那個是被生成的檔案 --- Q67:如果input只有一個select是要把全部東西印出來還是全部都不要印呢? >0317014 A67:請加上patch 會有完整的select格式 --- Q68:請問助教可不可以清楚地把要